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-petri v hláš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

    Claude Duet čerpá při práci na pozadí stejný limit jako běžný Claude

    Anthropic otevřel čekací listinu na Claude Duet pro předplatitele Pro a Max v USA. Agent pracuje i po vypnutí počítače, ale jeho kontroly účtů a úkoly na pozadí ubírají…

  2. Nástroje

    ElevenLabs uvedlo Eleven Realtime pro hlasové rozhovory

    Varianta Max dosáhla v nezávislém testu mluvených logických úloh 98,8 procenta a první zvuk vydala za 0,57 sekundy. Menší Mini získalo lepší známku za průběh rozhovoru,…

  3. Nástroje

    ChatGPT v Chromu umí číst otevřené panely a pracovat v nich

    ChatGPT v Chromu umí číst otevřené panely a pracovat v nich. Rozšíření od OpenAI dostalo postranní chat s historií konverzací. Při odkazování na historii prohlížení a…

  4. Nástroje

    Claude Code dostal strop čekání na obnovení limitu u sezení bez dohledu

    Claude Code v režimu pro sezení bez dohledu opakuje odmítnuté požadavky tak dlouho, dokud neprojdou – a u vyčerpaného limitu předplatného to znamená čekat až do jeho…