CHATBOT
Jeden codebase, libovolný počet klientů napříč 4 chat platformami + embedded widget — s RAG, eskalací na operátora a samoopravnou znalostní pipeline.
- 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.“
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.
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í.
Tři návrhové vzory, jedna uzavřená zpětnovazební smyčka.
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.
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.
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.
// 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 */}// 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],});+ Edge Functions
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.
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.
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).
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.
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).
AI Assistant protřiďuje ranní dashboard.
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/01Pravidlo #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/02security_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/03Halucinace 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/04God 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.