13. července 2026

Inline markup místo tool callů: Odpověď jako jeden průtok

Tool calling je základní stavební kámen agentů - a zároveň jedna z nejdražších věcí, které na cestě odpovědi děláte. Každé volání nástroje je round-trip: model se zastaví, požádá o výsledek, systém nástroj vykoná, výsledek se vrátí, model pokračuje. Pro věci, které model opravdu neví - kolik řádků má tabulka, jaká je dnes hodnota - je to nezbytné. Pro spoustu věcí, které agent na konci odpovědi stejně renderuje, je to čistá ztráta času.

Tady je trik, který se vyplatí znát: věci, které by normálně volaly renderovací nástroj, nechte model emitovat přímo ve streamované odpovědi jako inline markup a nechte frontend, ať je vyrenderuje nativně. Člověk nepozná rozdíl. Model píše text i označené kousky v jednom průchodu. Žádný extra round-trip.

Ztráta, kterou ušetříte

Vezměte návrhy na pokračování konverzace - malé pills pod odpovědí, které uživateli naznačují, kam dál. Instinkt je implementovat je jako tool call: model zavolá suggest_followups, dostane zpět seznam, a pak teprv začne psát odpověď. Zní to čistě. Jenže si všimněte, co se stalo: abyste mohli zobrazit cokoliv, musíte nejdřív vymyslet návrhy. To znamená jeden celý extra model-call, než se první token dostane na obrazovku. Latence na první token se prodloužila o celý krok, který uživatel vůbec nechce vidět dřív než text.

Kompromis: nechte model vygenerovat návrhy jako text v inline značkách - blok na konci odpovědi, který frontend parsuje a vyrenderuje jako pills. Model píše odpověď i návrhy v jednom průchodu. Text začne streamovat hned. Pills přijdou na konci, přirozeně, protože tam je model stejně napíše. Ušetříte round-trip přesně na té části, kde by stál nejvíc - na začátku.

Odkazy na entity v textu

Stejný princip platí pro odkazy na entity uvnitř odpovědi. Když model píše „informatika" a chcete, aby to bylo klikatelné místo, které otevře detail oboru, instinkt je zavolat nástroj, který entitu resolvenne a vrátí renderovací payload. Lepší cesta: nechte model napsat inline značku rovnou v textu - tady je entita typu obor s tímto id - a validujte ji až na backendu. Frontend značku vyrenderuje jako klikatelný odkaz. Detail entity přijede paralelně, ve vlastním framu, ještě než uživatel na odkaz klikne - takže popover, který se otevře, má data rovnou, žádný načítací spinner.

Tady je ovšem ceník a stojí za to ho říct narovinu. Vzdáváte se typové bezpečnosti výstupu. Tool call by vám vrátil strukturovaná data; inline značka je text, který model mohl pokazit - zapsat neexistující id, špatný typ, rozbitnou syntaxi. Proto ten backendový validátor není volitelný: každá inline značka se překontroluje proti databázi, než se propustí. Neplatné odkazy se tiše zahodí, aby uživateli nikdy nevznikl mrtvý link. Striktní whitelist tagů plus validace jsou cenou za to, že jste ušetřili round-trip.

Self-heal u diagramů

Tady se objevuje jeden zábavný detail: model občas vygeneruje inline diagram, který je rozbitý - nevalidní syntaxi, chybný JSON. Naivní systém by zobrazil „broken diagram" a uživatel by zahlédl, že něco nesedí. Lepší cesta je repair loop: pošlete rozbitý blok zpět modelu s instrukcí opravit a renderujte až opravný výsledek. Stojí to jeden extra krok, ale jen na té úzké třídě případů, kdy se něco rozbilo - ne na každé odpovědi. Běžná odpověď je pořád jeden průtok.

Kdy tool call vyhrává

Tohle není evangelizace „tool calling je špatný". Pro věci, které model neví a musí se doptat - počty řádků, živá data, drahé výpočty - zůstává tool call tím, čím má být: nezbytným dotazem do světa. Trik je rozlišovat. Renderovací kroky - věci, jejichž jediným účelem je zobrazit něco, co už model v hlavě má - patří do inline markupu. Dotazovací kroky - věci, které se musí doptat - patří do tool callu. Týmy, které tohle smíchají, vidí agenta, který na konci odpovědi ztrácí turny na renderovacích voláních, která nic nezjišťují.

Co si vzít s sebou

Každý tool call stojí round-trip. Pokud je ten round-trip tam, aby se něco zjistilo, je to správná cena. Pokud je tam, aby se něco zobrazilo, je to cena zbytečná - odpověď se měla narodit v jednom průchodu. Posuňte renderovací kroky do inline markupu, validujte je na backendu a nechte frontend, ať je vyrenderuje nativně. Time-to-first-token klesne, protože už nic nepočítáte dopředu, co přijít má až na konci. A model, který píše v jednom průchodu, je paradoxně i přesnější - nežene se přes strukturované handshaky, které ho odvádějí od toho, co chtěl říct.


Váš agent tráví poslední turny voláním nástrojů, které nic nezjišťují? Většina těch kroků jde přesunout do inline markupu a odpověď se smrskne na jeden průtok. Pojďme se podívat, co váš bot renderuje přes tool call, když nemá.