Přeskočit na obsah
Nástroje 3 min čtení

Pydantic AI 2.37 už váže volání nástroje k oznámené zprávě

Pydantic AI při odpovědi tvořené jen voláním nástroje posílala odkaz na zprávu, kterou proud AG-UI nikdy nezahájil. Verze 2.37.0 přidává prázdný pár začátku a konce zprávy; assistant-ui 0.0.56 z něj ovšem udělala prázdný textový díl.

Technik sleduje komunikační zařízení
Technik sleduje komunikační zařízení. Foto: Senior Airman Kevin Dunkleberger / U.S. Air Force, Wikimedia Commons (Public domain)

Balíček Pydantic AI 2.37.0 se na PyPI objevil 1. září 2026 krátce po 02:07 UTC. Mezi opravami je nenápadná změna proudu událostí AG-UI: volání nástroje už neodkazuje na zprávu asistenta, o které klient předtím nedostal žádnou zprávu.

AG-UI je protokol pro průběžné předávání dění mezi agentem a uživatelským rozhraním. Odpověď v něm není jeden hotový blok. Klient dostává sled událostí: začátek zprávy, kusy textu, volání nástroje, jeho argumenty a výsledek. Identifikátory drží tyto části pohromadě i po uložení a opětovném načtení konverzace.

Volání nástroje ukazovalo na zprávu, která v proudu nebyla

Chybu popsal 17. srpna uživatel smartly-petrihlášení číslo 7527. Reprodukce nepotřebovala žádný model ani přístup k poskytovateli. Stačil umělý proud, v němž první odpověď obsahovala jen volání nástroje a další odpověď text.

Pydantic AI si pro první odpověď vytvořila interní identifikátor X. Událost TOOL_CALL_START ho poslala jako parentMessageId, jenže předtím nepřišel TEXT_MESSAGE_START se stejným X. Až konečný text začal novou zprávu s jiným identifikátorem Y.

[
  {"type": "TOOL_CALL_START", "parentMessageId": "X"},
  {"type": "TOOL_CALL_RESULT"},
  {"type": "TEXT_MESSAGE_START", "messageId": "Y"}
]

Klient si proto musel rodičovskou zprávu pro volání nástroje domyslet. Při přehrání historie pak syntetický identifikátor neseděl na identifikátor, který znal server. Podle reprodukce mohl server staré volání nástroje a jeho výsledek znovu poslat modelu, protože je nerozeznal od nové části rozhovoru. Chování bylo doložené v Pydantic AI 2.31.0 a v době hlášení zůstávalo i v tehdejším hlavním stromu.

Oprava přidává prázdný začátek a konec zprávy

Oprava číslo 7699 byla sloučená 30. srpna a projekt ji zařadil do vydání 2.37.0. Před prvním voláním nástroje teď odešle dvě události navíc. Zprávu s identifikátorem X otevře a hned zavře, aniž mezi ně vloží text. Následující TOOL_CALL_START tak odkazuje na identifikátor, který klient skutečně viděl.

[
  {"type": "TEXT_MESSAGE_START", "messageId": "X"},
  {"type": "TEXT_MESSAGE_END", "messageId": "X"},
  {"type": "TOOL_CALL_START", "parentMessageId": "X"}
]

Tvar odpovídá definicím událostí AG-UI. TEXT_MESSAGE_START nese jedinečný identifikátor zprávy a roli asistenta. TOOL_CALL_START má samostatný identifikátor volání a volitelný parentMessageId. Samotný protokol tedy rodiče nevyžaduje; Pydantic AI ho používá, a proto musí klientovi oznámit, co tento identifikátor znamená.

Prázdná zpráva se zavře okamžitě. Oprava vysvětluje proč: ověřovač událostí v typescriptovém klientu AG-UI odmítá RUN_FINISHED, pokud zůstane textová zpráva otevřená. Vlastní načítání historie v Pydantic AI prázdný obsah zahodí, takže se do zpráv posílaných modelu nepřidá prázdná textová část. Nový regresní test kontroluje jak shodu obou identifikátorů, tak toto opětovné načtení.

Prázdný obal odhalil rozdíl mezi klienty

Oprava identifikátorů má vedlejší účinek, pokud klient bere každou otevřenou textovou zprávu jako skutečný text. Samostatné hlášení projektu assistant-ui ukázalo na zveřejněné verzi @assistant-ui/react-ag-ui 0.0.56, že z prázdného páru vznikne díl {"type": "text", "text": ""}.

Při kopírování zprávy se všechny textové díly spojovaly dvěma konci řádků. Prázdný díl proto přidal na začátek kopírovaného textu, exportu do Markdownu i vstupu pro převod textu na řeč prázdný řádek. Samotné volání nástroje se přitom přiřadilo správně; problém byl jen v tom, že klient prázdný obal zachoval jako obsah.

Oba projekty tím popisují dvě různé povinnosti klienta. Identitu zprávy musí zachovat, aby šla historie beze změny přehrát. Prázdný text ale nemá vydávat za obsah. Pydantic AI 2.37.0 řeší první část a vlastní adaptér má ošetřenou i druhou. Cizí klient, který AG-UI zpracovává po svém, potřebuje stejný případ zahrnout do testů.

Zdroje

Diskuse

Zatím tu nikdo nediskutuje. Můžete být první.

Napsat příspěvek

Diskutovat můžete i bez účtu. S registrací se ale příspěvek zveřejní hned a nemusíte pokaždé vyplňovat jméno. Účet už máte? Přihlaste se.

Nezveřejňujeme ho, slouží jen redakci.

Podporuje zápis Texy: **tučně**, *kurzíva*, odrážky, odkazy.

Dál k tématu

  1. Nástroje

    Dohled v PILOTu umí přesměrovat běžícího agenta

    Preprint týmu AllSpark z 27. srpna popisuje agenta, jehož práci za běhu sleduje a směruje druhý agent. PILOT v Terminal-Bench 2.0 překonal nejlepší srovnávaný nástroj o…

  2. Nástroje

    Codex 0.151.0 dovoluje rozšířením přepsat výsledek nástroje MCP

    Rozšíření Codexu mohou od verze 0.151.0 prohlédnout odpověď serveru MCP a před modelem ji nahradit. Dostanou i konečné argumenty a kontext volání; změna platí pro…

  3. Nástroje

    Modul mcp.server.fastmcp se do SDK vrátil jen proto, aby spadl s odkazem na návod

    Přejmenování třídy FastMCP na MCPServer nechalo ve druhé verzi knihovny mcp starý import padat na holé hlášce, ze které se nedalo poznat, že je nainstalovaná jiná hlavní…

  4. Nástroje

    Ollama 0.33.1 začala v MLX skutečně vynucovat JSON Schema

    Ollama uměla přijmout JSON Schema i u modelů v MLX, její runner se jím však neřídil. Verze 0.33.1 to mění: XGrammar před každým krokem zakáže tokeny, které by porušily…