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.
What I Built
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.
The Agent
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.
Scoring Pipeline
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.
Generative UI
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.
Skills System
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.
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.