This comment was posted by codex-tui using gpt-6.1-sol on behalf of David.
What's Changed
🛡️ Security
- Medium — MCP request telemetry: GHSA-xv4x-g8mx-ch56. Provider-native MCP configuration could expose server URLs, authorization tokens and custom header values in OpenTelemetry request traces, even with
include_content=False. URL-basedMCPcapabilities could also expose a credential embedded in the URL-derived identifier. Fixed in v2.58.0 and v1.107.8. Restrict access to historical traces and rotate exposed credentials.
Temporal mitigation: URL-basedMCPactivity names remain unchanged to preserve in-flight workflows. With Temporal tracing enabled, also pass an explicitid=toMCPonce in-flight workflows complete; changing it renames the activities. - Medium — UI adapter history: GHSA-5pfm-2g3g-gh85. With non-empty server-side
message_historyandmanage_system_prompt='server'(the default), Vercel AI and AG-UI adapters could execute an available tool with client-chosen arguments without a model request. Approval-required tools are not executed by this path. Fixed in v2.58.0; v1 is unaffected.
⚠️ Compatibility Notes
- Count a resumed
'suspended'response's usage only in the run that produced it, inRunUsage,UsageLimitsandSpendLimitsby @DouweM in #10078 - Make
RealtimeConnectionyield lifecycle events through a publicpydantic_ai.realtime.lifecyclemodule by @DouweM in #10353 - Let
read_filereturn images and PDFs, and describe other binary files by @DouweM in #9596 - Record a realtime reply the user cut off after it finished generating as interrupted, and mark interrupted speech when seeding by @DouweM in #10466
- Treat a native tool as unsupported when the model can't apply its
allowed_domains,blocked_domains,max_usesorexternal_web_accesssetting by @DouweM in #10451 - Add request-scoped
SystemPromptPart(scope='request')sent natively as Anthropicclear_atsystem messages by @DouweM in #9711 - Send Harness
WarnNearLimitswarnings as request-scoped system prompts by @DouweM in #10561 - Escape
RepoContext<context-file>blocks and send the nested-directory pointer as aSystemPromptPartby @DouweM in #10558 - Make the profile's
supports_auto_cachedecideanthropic_cache, and use automatic caching on legacyAsyncAnthropicBedrockfor Claude Opus 4.7 and later by @DouweM in #10551 - Let any module define a
ToolKindwith typed tool parts, and keep unknown kinds loadable by @DouweM in #9710 - Emit
Planningstatus-tool events after their store reads, so DBOS recovery with anevent_stream_handlerreplays in order by @dsfaccini in #10343
Existing DBOS workflows usingPlanningwith anevent_stream_handlermay not recover after upgrading; let in-flight workflows finish first or deploy a new DBOS application version. - Align
RealtimeTurnCompleteEventwith the exchange boundary thatwait_for_reply()waits for by @DouweM in #10517
To react when a particular response ends, use itsPartEndEvents. Caption UIs should keep user parts open until theirPartEndEvent, which can arrive after the reply completes.
🚀 Features
- Steer a running delegated task with
DelegationTasks.steerby @mpfaffenberger in #10359 - Store each message once in
SqliteStepStoreinstead of repeating the history in every snapshot by @aweis89 in #9982 - Add
ModelSettings['max_retries']to set how many times the provider SDK retries a request by @DouweM in #10068 - Bound a whole agent run with
timeout=andRunContext.deadlineby @DouweM in #10070 - Stream
ctx.enqueuemessages to Vercel AI and AG-UI frontends as history they send back but don't render by @DouweM in #10405 - Add
ModelSettings['request_timeout']covering all attempts and stream consumption of one model request by @DouweM in #10072 - Store each message once in
PostgresStepStoreandMongoStepStoreinstead of repeating the history in every snapshot by @DouweM in #10452 - Let harness
Skillsignoreincludeandexcludenames no library has withunknown_names='skip'by @mpfaffenberger in #10506 - Add the
openai-chatgptprovider so app users can sign in with ChatGPT and use their plan by @mpfaffenberger in #10539 - Accept
timeout=on UI adapterrun_stream(),run_stream_native()anddispatch_request()by @DouweM in #10553 - Add
reasoning_summarytoOpenAILiveResponsesDelegationto request the GPT-Live backend's reasoning summaries by @DouweM in #10514 - Warn with
UnsupportedSettingWarningwhen a model ignores a setting liketimeout,max_retriesorstop_sequencesby @DouweM in #10508 - Add
openai_prune_tool_itemsto delete answered tool rounds from the OpenAI Realtime conversation by @DouweM in #10556 - Add
ElevenLabsAgentsRealtimeModelto run realtime sessions on ElevenLabs Agents by @rscholz98 in #7964
🐛 Bug Fixes
- Stop
wait_for_reply()waiting forever when a realtime tool batch receives no reply after a call is cancelled by @DouweM in #10503 - Label a symlinked
RepoContextinstruction file with its target's name, soCLAUDE.md -> AGENTS.mdreadsAGENTS.mdby @mpfaffenberger in #10438 - Keep mid-run system prompts when
ReinjectSystemPrompt(replace_existing=True)replaces the client's by @DouweM in #10389 - Keep parallel tool calls in one
ModelResponsewhenVercelAIAdapterloads messages by @DouweM in #10404 - Stream the returns of tool calls skipped after a final result to AG-UI and Vercel AI frontends by @DouweM in #10409
- Fix
tool_choice='none'onBedrockConverseModelfailing after a tool call by @DouweM in #10395 - Resolve the default output mode once per run so toggling
thinkingper step keepstoolsstable by @DouweM in #10398 - Clear tool results in batches under
ClearToolResults(max_messages=...)instead of on every request past the threshold by @DouweM in #10390 - Force a single tool natively on
MistralModelinstead of filteringtoolsby @DouweM in #10394 - Don't crash on a
CachePointafter a replayed Anthropic MCP tool result by @DouweM in #10369 - Fall back on stream errors raised before the first event in
FallbackModelby @DouweM in #10386 - Raise in
run_stream()instead of returning a response that a model request hook rejected withModelRetryby @DouweM in #10400 - Give a model's provider a new HTTP client on a new event loop, and keep
Modelinstances a selector returns open insideasync with agent:by @DouweM in #10377 - Carry non-native
ThinkingParts in a user turn for models that imitate assistant formatting by @dsfaccini in #6692 - Send tool-call args as compact JSON from
ToolCallPart.args_as_json_str()so UI round trips keep the prompt cache by @DouweM in #10410 - Send tool results in call order from
Model.prepare_messagesso UI round trips keep the prompt cache by @DouweM in #10411 - Close the
AsyncInferenceClientthatHuggingFaceProviderbuilds when the provider or agent exits by @DouweM in #10393 - Keep
ToolReturn(tools=...)reveals when a Vercel AI frontend rebuilds history from the event stream by @DouweM in #10401 - Skip the gh-aw
pydantic-aiengine when an earlier step wrote anooptoGH_AW_SAFE_OUTPUTSby @dsfaccini in #10450 - Restore the files #10457 accidentally reverted, including
request_timeoutby @DouweM in #10483 - Update
RealtimeSession.context_window_usedtogether with the usage it reports by @DouweM in #10467 - Don't load the tokenizer to replay an empty GPT-Live history on a redial by @DouweM in #10474
- End an OpenAI realtime response created without an id when a malformed
response.donecloses it by @DouweM in #10511 - Call
OpenAIResponsesModel._process_provider_detailson streamed responses too by @DouweM in #10515 - Let shielded model-stream cleanup finish when an outer
anyiocancel ends a debouncedstream_text(),stream_output()orstream_response()by @dsfaccini in #10448 - Add
ModelProfile.tool_call_id_lengthand rewrite tool call IDs that Mistral models reject by @DouweM in #10519 - Use automatic prompt caching (
anthropic_cache) onAsyncAnthropicVertexby @DouweM in #10513 - Inline GLM-5.3 tool schemas on Z.AI, Mistral, and OpenRouter by @2Zest in #10607
- Walk
propertyNamesandcontainswhen inlining JSON Schema definitions by @jukebox in #10588 - Keep an unsaved
openai-codexoropenai-chatgpttoken refresh instead of reverting to the stored credentials it spent by @mpfaffenberger in #10615 - Keep a request's separate
UserPromptParts through aVercelAIAdapterround trip by @DouweM in #10532 - Escape tool names in
CodeModediscovery announcements and stop recognizing announcements by their text by @DouweM in #10559 - Keep every usage counter in
RunUsage.__sub__, so durable runs keep one-hour cache writes and reasoning tokens, and declarecache_write_1h_tokensandoutput_reasoning_tokensby @DouweM in #10516 - Don't ask again for a realtime tool batch's reply when the caller's
send()of its last result failed by @DouweM in #10512 - Keep a request's separate
UserPromptParts through anAGUIAdapterround trip by @DouweM in #10563 - Stop continuing an OpenAI response with
openai_previous_response_idonce the history before it has changed by @DouweM in #10509 - Stop harness sub-agents from returning
DeferredToolRequeststo a parent that cannot resolve them by @DouweM in #10497 - Stop continuing an OpenAI response with
openai_previous_response_idonce the response itself has changed by @DouweM in #10656 - Raise
RealtimeErrorinstead of a rawwebsocketsexception when a GPT-Live connection drops without a reconnect policy by @DouweM in #10645 - Ignore deeply nested
ReasoningMessage.encrypted_valueJSON inAGUIAdapter.load_messagesby @DouweM in #10650 - Write
format_as_xmlmapping keys that aren't valid XML names to akeyattribute by @DouweM in #10651 - Fix
UseEnumMemberDocstringsenums,ChoicesandBoolCriteriafailing in Anthropic strict schemas by @DouweM in #10659 - Rewrite nested
$refs when merging JSON schema definitions by @limadog9 in #10601
New Contributors
- @2Zest made their first contribution in #10607
- @jukebox made their first contribution in #10588
- @limadog9 made their first contribution in #10601
Full Changelog: v2.57.0...v2.58.0