Skip to content
01 / INŽENÝRSKÁ CASE STUDYMulti-Tenant · Self-Healing · Platform

CHATBOT

Jeden codebase, libovolný počet klientů napříč 4 chat platformami + embedded widget — s RAG, eskalací na operátora a samoopravnou znalostní pipeline.

POSTAVIL DAVID RAJNOHA  ·  LEDEN–DUBEN 2026
Scroll
02
Projektový index
Role
Solo builder & platform architekt
Odvětví
Customer support SaaS
Rok
2026
Trvání
<45 aktivních dní12 týdnů · 257 commitů
0
Chat adaptérů
0
AI Assistant nástrojů
0
Prošlých testů
0×
Jazyků
03
Problém
Kontext
Automatizace zákaznické podpory
Rozsah
4 platformy · 9 intentů · 5 nástrojů
Cena alternativ
Předplatné + infra pro každého klienta

Restaurace potřebovaly automatizovat chat support napříč messaging kanály. Běžně dostupná řešení měla tři limity — každý nový klient znamenal novou instalaci, nové předplatné a novou znalostní bázi, o kterou se musel někdo starat.

Buď předdefinované FAQ, nebo halucinace jazykových modelů. Binární eskalace — bot odpovídá na cokoliv, nebo konverzaci okamžitě a bez kontextu přepojí na člověka. Chyběla platforma, která se učí z vlastních chyb.

„Chatbot, který zapomíná vlastní chyby, je šablona. Ten, který se z nich učí, je platforma.“
Zadání

Platforma se musí chovat jako infrastruktura, ne jako chatbot.

Nový klient = 1 záznam v DB. Nová chat platforma = 1 adaptér. Nový use case = 1 tool třída. Nulová duplikace, žádné zásahy do kódu kvůli novým tenantům.

Single-tenant SaaS se rozpadne při 10 klientech. Šablonové FAQ nezvládnou 6 jazyků a 9 intentů. Binární handoff zabije důvěru. A všechno musí být multi-tenant safe — jediná chyba v RLS = únik dat napříč všemi klienty.

Řešení

Systém drží pohromadě díky třem architektonickým pilířům — Adapter, LEGO Orchestrator, Self-Healing.

Platformy jsou izolované v adaptérech. Nástroje jsou směrovány přes priority-based orchestrátor podle detekovaného intentu. Každý low-confidence turn živí uzavřenou smyčku, která navrhne úpravu znalostní báze — schvalovanou human-in-the-loop.

Výsledek: přidání nové platformy (Smartsupp, Discord) = jeden adapter soubor. Přidání capability (Ordermage API, news feed) = jedna tool třída + feature flag v clients.features JSONB. Bot, který včera nevěděl, jak odpovědět, má zítra ráno připravený návrh KB entry ke schválení.

04
Architektura systému

Tři návrhové vzory, jedna uzavřená zpětnovazební smyčka.

FIG. 01 — TOPOLOGIE PLATFORMY
Platforma & Tool Graph
zpráva → adapter → orchestrator → nástroje → odpověď · fan-out: 5 + 42
Diagram architektury multi-tenant chatbot platformyZpráva vstupuje jedním z pěti platform adaptérů (HelpCrunch, Telegram, WhatsApp, Chatwoot, Widget), prochází LEGO Orchestrátorem, který ji nasměruje k nejvyšší-priority backend nástroji (z pěti) podle detekovaného intentu. Low-confidence outputy živí Self-Healing pipeline, která navrhuje úpravy KB pro lidské schválení.CustomerMESSAGE5 ADAPTERS · PlatformAdapter interfaceHelpCrunch302 LOCTelegram372 LOCWhatsApp366 LOCChatwoot320 LOCWidget163 LOChandler-orchestrator.tsIntent → Router → ComposerINTENTROUTERCOMPOSER1,073 LOC · 9 intent types · LRU cache 5 min5 BACKEND TOOLS · priority-sortedAdminBotp=300admin_commandsHandoffBotp=200handoffOrdermageBotp=150ordermageNewsFeedBotp=100news_feedRAGBotp=50rag_v2Responsevia SAME adapterSELF-HEALING · closed feedback loopLOW CONFIDENCEgap-detector < 0.5POSTGRES TABLEknowledge_gapsGPT-4O-MINIsuggestion-generatorDASHBOARD · HUMANapprove → KBDASHBOARDAI Assistant · 42 tools23 read · 18 write · 1 destructiveOpenAI Model Registry · 10 models · 11 slotsgpt-4o-mini (chat) · gpt-4.1-nano (translation) · text-embedding-3-small (RAG)webhookconfidence<0.5pick highest-priority
L1 · Adapter Pattern

Platformové adaptéry

5 adaptérů — 4 externí chat platformy (HelpCrunch, Telegram, WhatsApp, Chatwoot) plus embedded web widget. Každý implementuje PlatformAdapter interface ve 150–400 LOC; Edge Function wrappery zůstávají tenké (40–72 LOC pro chat platformy; widget nese session + auth na ~240) — všechna smysluplná logika žije ve sdíleném handler factory.

L2 · LEGO Orchestrator

Priority-based tool routing

5 backendových nástrojů (AdminBot, Handoff, Ordermage, News, RAG) — rozsah 89–635 LOC podle hloubky doménové logiky, každý deklaruje capability + required feature. Tool router vybere match s nejvyšší prioritou. Přepneš feature flag → chování se mění, bez zásahu do kódu na klienta.

L3 · Self-Healing Pipeline

KB se učí z vlastních selhání

Low confidence (<0.5) → gap-detector zapíše knowledge_gaps → suggestion-generator zavolá GPT → admin v dashboardu schválí → pattern-analyzer aktualizuje intent patterns → weekly-digest vypíše health score. Human-in-the-loop jako default.

/supabase/functions/_shared/handler-orchestrator.ts
// Jednořádková Edge Function per platformexport const handler = createHandler({  platform: "chatwoot",  adapter: chatwootAdapter,  verify: verifyHmacSha256WithTimestamp,});// 1 073-řádkový orchestrator pod tenkým platformovým wrapperemexport async function createHandler<TEvent>(config: PlatformConfig<TEvent>) {  /* intent → tool router → response composer */}
/dashboard/src/app/api/assistant/chat/route.ts
// AI Assistant: multi-step agent nad 42 nástrojiconst result = streamText({  model: openai(resolveModel("assistant")),  tools: scopedTools,  stopWhen: stepCountIs(3),  onStepFinish: (s) => logToolCall(s),  messages: [smartContext, ...turn.messages],});
08
Stack
PLATFORMA · 01
Supabase
+ Edge Functions
Postgres + pgvector, 89 migrací, 87 RPC funkcí, 121 indexů. RLS per client_id. Deno runtime pro Edge webhook handlery. Jedna databáze, žádné další služby.
APLIKACE · 02
Next.js 16 + TypeScript
App Router, Server Actions, dashboard s AI Assistantem. Strict TS, tenká edge vrstva.
MODELY · 03
OpenAI Model Registry
10 modelů napříč 11 sloty: gpt-4o-mini (chat), gpt-4.1-nano (translation/news), dall-e-3 (image), text-embedding-3-small (RAG). Per-klient override v DB.
SDK · 04
Vercel AI SDK v6
Streaming, tool calls, stopWhen stepCountIs(3).
UI · 05
Tailwind 4 + tokeny
COLOR_CONCEPTS — statická metrika vs dynamický threshold.
QA · 06
Promptfoo eval suite
40 cases · 40/40 PASS vs live.
06
12týdenní build

Pod 45 aktivních dní, 257 commitů, od základů po post-incident evals.

Upřímné zarámování — žádný 5denní sprint, ani full-time tříměsíční projekt. Part-time vývoj od 23. 1. do 15. 4. 2026 — pod 45 aktivních dev dní napříč 12 týdny. Samotný březen vyprodukoval 173 z 257 commitů — hlavní sprint fáze.

01
LEDEN · FOUNDATION
Base schema + první HelpCrunch handler
17 commitůbase schema1 platforma

Setup Supabase, pgvector, první adapter interface, prvotní HelpCrunch handler. Navrhl jsem multi-tenant kontrakt na papír: nový klient = 1 záznam v DB, ne deploy.

02
ÚNOR · V2 MIGRACE
Intent patterns, OrdermageBot, Analytics V2, i18n
41 commitůOrdermage live6 jazyků

V2 migrace, napojení dashboardu, per-client intent patterns (9 typů, LRU cache), OrdermageBot (dvoustupňový HMAC-SHA256 flow), Analytics V2 se sledováním nákladů a confidence, Design System, automatická detekce 6 jazyků (CS/EN/DE/SK/PL/HU).

03
BŘEZEN · CORE SPRINT
API Layer, AI Assistant, WhatsApp, Chatwoot, Self-Healing
173 commitů42 AI nástrojů4 externí platformy live

API Layer (68 routes, 3-step auth pipeline) · MCP Server (tools auto-generované z OpenAPI) · AI Assistant (42 nástrojů, 3-tier approval, SSE streaming) · produkční hardening · Notification Center · tenant izolace · WhatsApp + Chatwoot adaptéry · Self-Healing 1–3 · cost protection.

04
DUBEN · HARDENING
Multilingual patterns, security fix, LLM eval suite
26 commitůeval suitezero rollbacků

Multilingual hardening (DE/PL/SK/HU patterns). Migrace s security_invoker=true u views, která fixla RLS bypass. Semantic handoff detector. Amici 'podsedník' incident (halucinace v KB) → Promptfoo LLM eval suite (40 cases, 40/40 PASS proti live).

07
Živé demo

AI Assistant protřiďuje ranní dashboard.

Dashboard AI Assistant — multi-step KB gap triage demoTerminal UI mockup showing an admin asking the AI Assistant to surface unresolved knowledge-base gaps for Amici. Two auto-executed read tools (get_kb_gaps, get_conversations) and one write tool (create_kb_suggestion) with an amber approval banner demonstrate the 3-tier approval system and stopWhen stepCountIs(3) multi-step agent loop.dashboard · ai assistant · amici● CONNECTEDCLIENTSAmicihelpcrunch · liveObjednamechatwoot · liveai_news_cz_bottelegram · channelmaster-barberwidget · demoTOOL TIERS 23 READ auto 18 WRITE approve 1 DESTRUCT. confirmKB HEALTHentries 9,714 · gaps 3confidence 0.72ADMIN · 09:14Show me unresolved KB gaps for Amici anddraft a suggestion for the top one.AI ASSISTANT · 09:14 · gpt-4o-miniget_kb_gapsREADclientId="amici"OK · 3 rows · 47msget_conversationsREADintent="menu_query" confidence<0.5OK · 12 rows · 61mscreate_kb_suggestionWRITEgap_id="gluten-free-menu"⚠ requires approval — [approve] [edit] [reject]GAP ANALYSIS3 KB gaps · all from Amici conversations with confidence < 0.5.Top gap: 5 turns asking about gluten-free menu options (last 7 days).DRAFT · KB ENTRY (pending approval)Title: "Gluten-free menu options"Body: "Amici offers gluten-free pizza (GF dough +30 Kč), salads, andseveral antipasti. The kitchen uses a dedicated prep area to avoid…"APPROVE ⏎EDITREJECT↳ stopWhen: stepCountIs(3) · SSE stream · logged to notificationsAsk the AI Assistant…⌘ + ⏎
↳ Náhled AI Assistanta v dashboardu · read/write/destructive tool tiery · SSE streaming.
08
Výsledky & Lekce

Výsledky

  • R/01Dva produkční klienti nasazení paralelně — Amici (rozvoz jídla, HelpCrunch) a Objednáme (Chatwoot). Přidání druhého klienta = 1 záznam v DB + 0 řádků kódu. Multi-tenant architektura splnila svůj slib.
  • R/0242 AI Assistant nástrojů se 3-tier schvalováním (23 čtecích se spouští samy, 18 zapisovacích vyžaduje amber banner, 1 destruktivní červené + confirm) a scopingem rolí podle typu uživatele.
  • R/035 400+ testů + 40/40 LLM eval case PASS proti live produkci — Vitest unit + integration + E2E + Promptfoo LLM eval suite (4 platformové datasety + 1 Amici regression).
  • R/0489 migrací · 12 CI workflows · nula rollbacků napříč 257 commity. Multi-tenant už na úrovni návrhu — 87 RPC funkcí, 11 views (security_invoker=true), 121 indexů.

Lekce

  • L/01
    Pravidlo #1 má větší páku než jakýkoli framework.

    „Než to nasadím: jak se tohle opakuje pro dalšího klienta?“ filtroval každý PR napříč 257 commity. Sprint 15 review našel 7 CRITICAL bugů — IDOR, chybějící auth, špatný RPC — než se dotkly produkce.

  • L/02
    security_invoker = true není volitelný.

    Postgres default `security_invoker = false` znamená, že views běží pod ownerem tabulky — obcházejí RLS. Migrace 20260310000002 přepla 8 views. V multi-tenant setupu vždy explicitně.

  • L/03
    Halucinace si vynutily eval-driven vývoj.

    Amici 'podsedník' incident (2026-04-12): scraper zapsal nesmysl do KB, bot ho reprodukoval. Náprava: Promptfoo suite s platform + regression vrstvami. Každý budoucí bug → jeden YAML case.

  • L/04
    God moduly splituj pravidelně, ne až když hoří.

    handler-orchestrator.ts narostl na 1 146 LOC, než Sprint 23 extrahoval analytics-merger, auto-handoff, ab-manager — dolů na 932 LOC. Další features ho posunuly zpět na 1 073, ale s čistými zodpovědnostmi. Kadence refactoru > hrdinský refactor v nouzi.