Když náš poskytovatel AI vyřadil model
Výměna modelu, prázdné odpovědi bez chyby a účet, který najednou vyskočil na několikanásobek. Co se rozbilo a proč bylo tak těžké příčinu vidět.

V červenci 2026 přestalo najednou fungovat několik funkcí: AI chat, AI odpovědi v tiketech, shrnutí tiketů, tvůrce serveru a k tomu moderace a překlad nápadů a hlášení chyb.
Příčinou nebyl náš kód. Náš poskytovatel AI vyřadil model, který jsme používali.
Část první: model je pryč
To je ta zjevná část a byla rychle opravená. Poskytovatel ukončí model, zadáš nástupce, hotovo.
Skutečný incident začal až potom.
Část druhá: prázdné odpovědi, bez chyb
Po výměně se odpovědi vracely. Jen někdy byly prázdné. Ne zkrácené, ne poškozené, ale úplně prázdná odpověď bez jakékoli chyby.
Příčina leží v rozdílu, který název modelu neprozradí: nástupce je model s uvažováním. Před samotnou odpovědí nejdřív zapíše vnitřní myšlenkový postup do samostatného pole. Obojí čerpá ze stejného rozpočtu tokenů.
Pokud rozpočet spotřebuje přemýšlení, vrátí se odpověď, která je formálně v pořádku: poskytovatel hlásí „dosažena délka“ a pole s obsahem je prázdné. Žádná chyba, žádný náznak, nic, co by try/catch zachytil.
Reprodukovali jsme to skutečným testem: rozpočet pěti tokenů stačí k tomu, aby každý požadavek vrátil prázdnou odpověď.
Část třetí: účet
Na nejdražším místě volání, v AI tvůrci serveru, jsme nastavili velkorysý rozpočet, protože tam vznikají dlouhé odpovědi. Přemýšlení tak nenarazilo na limit, prostě běželo.
Důsledky přišly ze dvou stran najednou. Požadavky trvaly tak dlouho, že narážely na časové limity. A stály několikanásobně víc, protože se pokaždé platil celý neviditelný myšlenkový postup. Na konci přišla chybová hláška, se kterou jsme nepočítali: nedostatečný zůstatek.
Oprava je jeden řádek. Přemýšlení se dá v těle požadavku vypnout a model se pak zase chová jako ten starý. Od té doby ten řádek patří ke každému místu volání, a těch je v repozitáři víc než hrstka.
Část čtvrtá: co jsme našli při úklidu
Když už saháš na každé místo volání AI, podíváš se na ně. Tak vyplulo druhé téma, které s incidentem nesouvisí, ale je podobně drahé.
Poskytovatelé účtují za prompt, jehož začátek zůstává beze změny a dá se obsloužit z cache, podstatně méně. Rozdíl mezi zásahem a minutím je zhruba třicetinásobný.
Tuhle slevu nedostaneš přes příznak. Cíleně jsme to otestovali: pole v těle požadavku, které k tomu mělo sloužit, mělo nulový účinek, cache se uplatní automaticky tak jako tak. Jedinou pákou je pořadí uvnitř promptu, od stabilního k proměnlivému.
Čtyři místa, kde jsme udělali přesný opak:
Proměnlivá hodnota uvnitř pevného bloku instrukcí. Kontrola duplicit u hlášení chyb měla v textu instrukcí název modulu. Tím dostal jinak identický blok vlastní řádek cache pro každý modul. Hodnota patří do proměnlivé části, kde se stejně mění.
To nové před tím stabilním. Stejná kontrola posílala nové hlášení chyby před až padesáti kandidáty na porovnání. Tím se z největšího promptu API stalo trvalé úplné minutí.
Data jednotlivých uživatelů v pevné části. Veřejný AI chat měl poznámky o konkrétním uživateli v bloku instrukcí, tedy před sdílenou historií kanálu. Tím dostal každý uživatel ve stejném kanálu vlastní začátek a sdílená historie se platila zvlášť pro každého uživatele.
Posuvné okno přes historii. Posílat s každou zprávou posledních N zpráv posune začátek u každé zprávy. Celá historie je pak trvalým minutím. Správný přístup je zkracovat po blocích, tedy zřídka a zásadně.
K tomu jeden detail, který vypadá jako puntičkářství, a není: seznam uvnitř promptu řazený jen podle jednoho kritéria může při shodě změnit pořadí. Jediný prohozený řádek uprostřed bloku instrukcí stojí zásah pro všechno za ním. Řazení uvnitř promptů potřebuje jednoznačné rozhodovací kritérium.
Co jsme si z toho vzali
Výměna modelu není změna konfigurace. Název vypadá jako hodnota v proměnné. Za ním se skrývalo jiné chování a to chování rozbilo náš kód, ne rozhraní.
Nebezpečné selhání bylo to tiché. Odchod starého modelu byl hned vidět a opravený během minut. Prázdné odpovědi se vracely jako formálně platné odpovědi a mohly tak zůstat neomezeně dlouho.
Měřitelnost patří k místu volání. Míru zásahů cache teď logujeme u každého z nich. Správně postavené místo se po prvním požadavku ustálí na vysoké míře, špatně postavené zůstane na nule. To uvidíš v řádku logu a nikde jinde, protože obě fungují.
A ten nepříjemný závěr: používat cizí model znamená, že část tvého produktu závisí na rozhodnutí, které padne jinde. Proto může od srpna každý server nasměrovat funkce AI na vlastní endpoint, místo aby spoléhal na ten náš.
Další články
Dohled nad 4 000 Discord servery: Grafana, PostHog a co nám ukázaly
Smyčka, která potichu způsobovala polovinu našeho provozu, tři miliony zbytečných požadavků denně a útok, který skončil po jedné minutě. Co náš monitoring vidí a co záměrně nevidí.
Ze zákulisíCo nás naučil bot na více než 2 000 Discord serverech
Čtyři věci, které ve velkém fungují jinak, než předpokládáš, když píšeš kód.
Ze zákulisíProč v AlphaCloud zůstává skoro všechno zdarma
Většina Discord botů zamyká své nejužitečnější funkce za předplatné. My to záměrně neděláme, a souvisí to méně se štědrostí, než by se mohlo zdát.