Ollama vrací Codexu shrnutí konverzace jako prostý JSON v poli encrypted_content
Testovací verze Ollamy 0.34.0 přidává do rozhraní kompatibilního s OpenAI koncový bod /v1/responses/compact a rozumí spouštěči kompakce, který Codex posílá na konci vstupu. Shrnutí dělá tentýž model, který obsluhuje konverzaci; když se mu zadání nevejde do kontextu, Ollama ubere pětinu nejstarších záznamů a zkusí to znovu.

Rozhraní Responses od OpenAI umí zkrátit dlouhou konverzaci na shrnutí. Klient buď pošle v požadavku klíč context_management s prahem compact_threshold a server shrne historii sám, jakmile práh překročí, nebo zavolá samostatný koncový bod /responses/compact a dostane zpět nové, kratší okno. V obou případech se v odpovědi objeví položka typu compaction s polem encrypted_content, o kterém průvodce OpenAI píše, že je neprůhledné a není určené k lidskému čtení. Codex na tom staví: práh si nastavuje klíčem model_auto_compact_token_limit a o jeho experimentální správě kontextu jsme už psali.
Kdo Codex provozuje nad vlastním modelem přes Ollamu, narážel na to, že její server takový požadavek neznal. Mění to testovací verze Ollama 0.34.0. V poznámkách k vydání je to půl věty o „kompakci odpovědí“, v kódu jsou to tři sloučené návrhy změn ze 4., 5. a 8. září. Vydání je na GitHubu dál označené jako předběžné: značka v0.34.0 ukazuje na tentýž commit jako pátý kandidát v0.34.0-rc5 z 9. září a stránka dokumentace o kompatibilitě s OpenAI o kompakci k 10. září mlčí.
Dva vstupy, jeden shrnovací dotaz
Návrh #18224 přidal cestu POST /v1/responses/compact a k běžné cestě /v1/responses mezivrstvu, která hlídá poslední položku vstupu. Když je to compaction_trigger, tedy spouštěč, který podle dokumentace OpenAI musí stát na konci vstupu a který podle komentáře v kódu posílají dnešní verze Codexu, požadavek se do modelu nedostane a místo něj běží kompakce. Obyčejný požadavek projde beze změny.
Shrnutí nedělá žádný zvláštní model, ale ten, který klient v požadavku uvedl. Ollama mu pošle systémový pokyn, ať konverzaci shrne „pro jiného programovacího agenta“ a zachová cíl, rozhodnutí, omezení, stav repozitáře, změněné soubory, výsledky testů, selhání, rozdělanou práci a další kroky. Odpověď si vynutí voláním nástroje create_summary se dvěma parametry: textem shrnutí a seznamem retain_item_ids, tedy položek, které mají zůstat doslova, protože se nedají bezpečně přeformulovat. Volání nástrojů a jejich výsledky model přepisovat nesmí; pokyn je označuje za stav běhu.
Pole encrypted_content nese prostý JSON
Výsledek se vrátí ve stejném tvaru, jaký by poslal server OpenAI: položka compaction s polem encrypted_content. Zatímco u OpenAI je obsah šifrovaný, Ollama do něj vloží čitelný JSON s typem ollama_compaction, číslem verze 1, textem shrnutí a seznamem zachovaných zpráv. Komentář v kódu to říká natvrdo: obsah není šifrovaný a Ollama ho musí zpracovat dřív, než jde další požadavek do modelu. Když se taková položka objeví v dalším vstupu, mezivrstva ji rozbalí na falešné volání nástroje ollama_compaction_summary, jehož výstupem je shrnutí, a za něj připojí zachované zprávy. Položku od jiného serveru odmítne s chybou, že obsah není její.
Pro spojení s lokálním serverem na tom nezáleží: touž cestou chodí v otevřené podobě i celá konverzace. Rozdíl je jinde. U OpenAI umí položku rozbalit jen server, který ji vydal, u Ollamy si ji přečte kdokoli, komu ji klient pošle.
Když se nevejde ani shrnutí
Shrnovací dotaz nese celý přepis, takže se do kontextu modelu vejde hůř než původní konverzace. První verze na to odpověď neměla a klient podle popisu návrhu opakoval pořád touž příliš dlouhou historii. Návrh #18324 z 8. září přidal jeden pokus navíc: když model vrátí chybu context_length_exceeded nebo hlášku „The prompt is too long“, Ollama vyřadí nejstarší odstranitelné položky v objemu zhruba pětiny přepisu a dotaz zopakuje. Odstranitelné jsou zprávy asistenta a dvojice dokončeného volání nástroje s jeho výsledkem; zprávy uživatele, pokyny, starší shrnutí, poslední položka a rozdělaná volání nástrojů zůstávají. Kolik položek vypadlo, se model dozví z varování v promptu a totéž varování pak stojí na začátku shrnutí.
Pětina se počítá z délky serializovaného textu, ne z tokenů; komentář v kódu to sám označuje za náhradní odhad. Vedle toho zůstává poznámka, že cíl zachovat 40 % kontextu se má vynucovat až tehdy, kdy bude po ruce rozpočet tokenů zvoleného modelu. Dohromady jsou pokusy nejvýš tři: první dotaz, jeden po přetečení a jeden na opravu nevalidního shrnutí. Když ani pak model nevrátí použitelné volání create_summary, Ollama odpoví chybou compaction_failed a původní konverzaci nechá, jak byla.
Obrázky projdou, odkazy na soubory ne
Třetí návrh, #18245, se týká obrázků. Původní kód zachované položky s obrázkem odmítal větou, že nejsou podporované. Teď je posílá shrnovacímu modelu jako bloky input_image vložené přímo do dat ve formátech JPEG, PNG a WebP a stejně je vrací v zachovaných zprávách. Obrázek zadaný jen odkazem file_id kompakce v Ollamě nepřijme.
Co zůstává jen na serveru OpenAI
Serverovou kompakci podle prahu Ollama nezavedla: řetězce context_management ani compact_threshold se ve zdrojích značky v0.34.0 nevyskytují. Funguje jen spouštěč na konci vstupu a samostatný koncový bod, tedy to, co používá Codex. V témže vydání přibylo i vyhledávání nástrojů na straně klienta; obojí stojí v poznámkách k vydání až za hlavní novinkou, za modely Ollamy v ChatGPT Desktopu.
Zdroje
- Ollama v0.34.0, poznámky k vydání na GitHubu
- Návrhy změn #18224, #18245 a #18324 v repozitáři ollama/ollama
- openai/responses_compact.go na značce v0.34.0
- Compaction, průvodce OpenAI
- Compact a response, referenční dokumentace OpenAI
- Codex configuration reference, dokumentace OpenAI
- OpenAI compatibility, dokumentace Ollamy