Vienna, AT
Projects

AI-Powered Funding Advisory

image
March 20, 2026
Austrian funding consultants spend hours cross-referencing dozens of programs, checking eligibility rules, stacking limits, and deadlines — mostly in spreadsheets and PDFs. The domain knowledge is deep but the tooling is shallow. Cemit, a funding advisory firm, wanted something better: an AI assistant that actually understands the domain, not just a chatbot with a search bar. This is a single-page AI chat application where consultants describe a client project in natural language and get back scored, ranked funding matches with full transparency into why each program fits or doesn't. A LangGraph StateGraph with 17 tools that runs a cyclic reasoning loop — the agent calls tools, syncs state, and decides what to do next until it has a complete answer. It progressively accumulates project context across the conversation: company details, budget, KMU status, TRL level, region, and topics. Matching combines two approaches:
  • Deterministic scoring across 9 dimensions (eligibility, budget fit, deadline proximity, stacking headroom, TRL overlap, and more) — normalized to 0-100
  • Semantic scoring via a single batched LLM call that evaluates all candidate programs against the project description
Final score: 70% deterministic + 30% semantic. This means the system is explainable — consultants can see exactly which dimension pulled a score down and why. Every tool output is automatically rendered as a rich interactive card via json-render: match result lists with score badges, score breakdowns with dimension bars, side-by-side program comparisons, stacking analysis, and action plans. The LLM never generates UI specs directly — server-side spec builders handle the translation. An extensible skill directory that teaches the agent new capabilities: structured funding application workflows, KMU status checks, cumulation analysis, and DOCX generation via isolated Vercel Sandbox microVMs.
  • Frontend: Next.js 15, React 19, Tailwind CSS v4, shadcn/ui, Vercel AI SDK v6
  • Agent: LangGraph with 17 tools, cyclic StateGraph, 25-iteration recursion limit
  • LLMs: Claude Sonnet 4 (reasoning), Claude Haiku 4.5 (quick tasks), Nova Micro (titles) — all via Vercel AI Gateway
  • Search: Multi-tier semantic + full-text with pgvector, synonym expansion, and confidence scoring
  • Database: Neon PostgreSQL (serverless) with pgvector embeddings
  • Validation: Zod v4 for all API input validation
  • Auth: NextAuth v5 + Microsoft Entra ID with RBAC
  • Security: PostgreSQL-backed rate limiting (request + token budgets), HSTS, CSP, per-user daily caps
The scoring pipeline went through several iterations. Pure semantic scoring was too unpredictable — consultants need to trust the results. Pure rules were too rigid — they missed nuance. The hybrid approach with transparent dimension breakdowns was the sweet spot. Batch semantic scoring was a key optimization: evaluating 15 programs individually took 40-60 seconds. A single batched call brings it down to 3-5 seconds. The generative UI system required careful separation — letting the LLM generate UI specs directly led to inconsistent rendering. Moving spec building server-side with a strict component catalog made everything reliable.