What's Changed
⚠️ Compatibility Notes
- Raise model error categories like
ModelRateLimitErrorfrom embedding models by @DouweM in #10804 - Add
usage_limits,deadline,run_idandconversation_idtoModelSelectionContextby @DouweM in #10856 - Default
BedrockConverseModel'smaxTokensto Claude's maximum output, streaming such requests behind the scenes by @DouweM in #10845 - Deprecate
RetryPromptPartin favor ofToolReturnPart(outcome='retried')andRetryFeedbackPartby @dsfaccini in #8094 - Summarize harness-added user-channel content as
<harness_data>instead of user messages inSummarizingCompactionby @DouweM in #10833 - Give
AskUser,ConversationSearch,Macroscope,ManagedPrompt,PlaywrightBrowserandPydanticAIDocsa stable defaultid, and appendManagedPromptversion changes by @DouweM in #10904 - Derive the
MCPcapability's defaultidfrom the server URL's hostname only, and reject two servers on one host without explicit ids by @DouweM in #10807 - Record who wrote a memory file with an opt-in
MetadataMemoryStoreandMemory(write_metadata=...)by @mpfaffenberger in #10892 - Let a named
InstructionPartpassed to a run'sinstructionsopt intoon_change='append', keyedrun:<name>by @DouweM in #10789 - Keep
SummarizingCompaction(keep_user_messages=True)copies recognized after their request is merged by @DouweM in #10914 - Strip request-level
instructionsfrom untrusted history insanitize_messagesand server-managed UI adapters by @DouweM in #10897 - Send tool returns whose JSON form is a string, like
datetimeandUUID, to the model unquoted so restored histories match the first run by @dsfaccini in #10488 - Keep the ids of instructions a wrapper toolset passes on from the toolsets it wraps by @DouweM in #10909
- Include
settingsandprofilein model equality andModelreprby @dsfaccini in #9474 - Deprecate
OpenAIDecisionsProviderand letOpenAIDecisionsModeltakeOpenAIProviderby @DouweM in #10951 - Record every mid-run tool population change as a
ToolAvailabilityDeltaPartby @DouweM in #9405 - Send typed text to the GPT-Live backend as a user turn, so
send(text)runs the agent's tools by @DouweM in #10960 - Keep tool returns shaped like media markers from breaking
StepPersistencesnapshots, and fixSqliteMediaStore,DiskMediaStore,MongoMediaStoreandS3MediaStoreedge cases by @mpfaffenberger in #10834 - Send settings stated by either of two merged
Advisorcapabilities by @mpfaffenberger in #10726 - Drop client-supplied
TextContent.metadatafrom user prompts insanitize_messagesby @DouweM in #10943 - Raise
ModelConnectionErrorandModelTimeoutErrorfor xAI gRPC connection failures and client timeouts by @DouweM in #11080 - Send the agent's
system_promptand seeded history's system prompts to realtime sessions by @DouweM in #11055 - Deliver
SubAgentsbackground task output as framed<task_output>data instead of in aSystemPromptPartby @DouweM in #10550 - Keep
BrowserUsesecrets on allowlisted sites and out of tool results, and fix allowlist andfile://gaps by @mpfaffenberger in #10771 - Match
FileSystemdenied and read-only patterns case-insensitively, protect.gitfiles, and bound reads and Python regex searches by @mpfaffenberger in #10825 - Filter
GitHubtools onreadOnlyHintunderread_only=True, reject'oauth', and deprecate plainhttp://URLs by @mpfaffenberger in #10815 - Add
'max'to unifiedthinkingeffort levels by @dsfaccini in #10920
🚀 Features
- Add
DockerSandboxharness capability that runs the workspace in a local Docker or Podman container by @mpfaffenberger in #9341 - Add BoxLiteSandbox: a local BoxLite micro-VM workspace by @adtyavrdhn in #10740
- Let
SmolSandboxBackenduse a VM the application already has by @adtyavrdhn in #10882 - Attribute ElevenLabs Agents replies to the text turns they answer by
in_response_to_idsby @DouweM in #10792 - Add the run's output retry count and budget to
ModelSelectionContextby @DouweM in #10836 - Add
ToolDefinition.unless_tool_kindandRunContext.tool_name_for_kind, and give instructions the current step's tools by @DouweM in #10673 - Send a file a tool returns as a note when the model can't read it, with
supports_audio_file_inputandsupported_document_media_typesprofile flags by @DouweM in #10476 - Run
gh-awcopilot/models on thegithub-copilot:model and declaredetection-engine: copilotby @mpfaffenberger in #9318 - Add
base_urlandMOONSHOTAI_BASE_URLsupport toMoonshotAIProviderby @yanlinf in #10177 - Drop capability reader tools duplicated by
FileSystemby @DouweM in #9410 - Add Bedrock model profile for xAI Grok 4.6 and 4.7 by @ahmed-moubtahij in #8639
- Add
RelevanceCompaction, which keeps, reduces or drops each older history step by a judge model's ranking by @mpfaffenberger in #11026 - Add
SmartSearchharness capability for plain-English code search with a pluggable judge model by @mpfaffenberger in #8977 - Keep streamed model deltas out of durable execution histories by replaying the final response by @DouweM in #10958
- Send
OpenAIDecisionsModelmessage history as native Responses input items by @DouweM in #11028 - Add the
FileUnderstandingcapability by @DouweM in #8453 - Let
MCPToolsettakeauthandheadersas functions of the run context, so each run connects as its own user by @DouweM in #10846 - Support Temporal continue-as-new in
TemporalDurabilityviacontinue_as_newby @YHallouard in #7312 - Add
lockdowntoGitHubto ask GitHub's server to withhold public content from users without push access by @mpfaffenberger in #10822
🐛 Bug Fixes
- Fix
SetToolMetadata(background=...)having no effect onBackgroundToolsby @adtyavrdhn in #10613 - Stop a GPT-Live session hanging when a tool in a delegated round raises by @DouweM in #10794
- Raise
ContentFilterErrorwhen Azure blocks a Responses API prompt withoutcontent_filter_resultby @DouweM in #10805 - Record what a Gemini Live model says during an asynchronous tool call before the tool's result by @DouweM in #10802
- Send a raised tool's failure to the GPT-Live backend so the delegated round continues by @DouweM in #10868
- Keep an xAI spoken turn going when its server VAD takes back a stop, and end the reply it drops by @DouweM in #10798
- Keep a GPT-Live reply that called tools open until its delegated backend answers, so what Live says meanwhile stays with it by @DouweM in #10847
- Use only the agent's instructions for realtime sessions, never
instructionsrecorded in seededmessage_historyby @dsfaccini in #10896 - Close the Bedrock event stream when a
BedrockConverseModel.request_stream()context exits, including on cancellation by @DouweM in #10900 - Keep
BedrockConverseModelmessage caching readable after a Claude message ending in a document by @DouweM in #10907 - Use explicit
output_typeoverloads forAgent.from_specandAgent.from_fileby @tjkuson in #10886 - Use native structured output on Bedrock for Claude Haiku 5.5, Sonnet 5 and later, and Opus 4.7 and later by @DouweM in #10901
- Tell
CodeModemodels toimport asynciobefore callingasyncio.gatherby @adtyavrdhn in #10913 - Keep continuing an OpenAI response with
openai_previous_response_idafter a call to a tool with atool_kindby @DouweM in #10931 - Leave out a request-scoped
SystemPromptPartthat no user message clears, as after ano_outputretry on Anthropic by @DouweM in #10938 - Stop recording an empty system message in traces for requests with an
InstructionBaselinePartby @DouweM in #10911 - Leave retried tool returns out of
ClearToolResultsandDeduplicateFileReadsby @DouweM in #10932 - Keep a retried tool return's validation errors structured through a
VercelAIAdapterround-trip by @DouweM in #10933 - Record
pydantic_ai.tool.retry.*attributes on argument-validation failure spans by @DouweM in #10934 - Hold eager and speculative
CodeModetool calls, and a first model request that raises, until a parallelInputGuardraildecides by @dsfaccini in #10365 - Fix cancelled steps, tool metadata key validation, and handler typing in
AWSLambdaDurabilityby @mpfaffenberger in #10730 - Describe
Grain's write tools and treatGrain(id=None)as the defaultgrainid by @mpfaffenberger in #10801 - Emit
AskUserAnsweredEventwithfailed=Truewhen theAskUseranswerer raises by @mpfaffenberger in #10725 - Raise the realtime connection failure from
played_audio_bytesandwait_for_playback()instead of aUserErroronce it ended the audio stream by @DouweM in #10940 - Route every core framework tag through
_framing.wrap, so a</system>in an instruction or tool name can't end its block by @DouweM in #10547 - Report
ModelRetryandToolFailedfrom execute hooks onBackgroundToolscalls to the model by @mpfaffenberger in #10830 - Accept Unicode spaces in
AskUserquestions and document its timeout, concurrency and tracing behavior by @mpfaffenberger in #10755 - Surface an invalid AG-UI resume payload as a
RunErrorinstead of denying silently by @dsfaccini in #7038 - Allow
ToolSearch(strategy='bm25')on the legacy BedrockAsyncAnthropicBedrockclient by @dsfaccini in #10340 - Send an empty
reasoning_contentonDeepSeekProvidertool calls whenever the request thinks by @dsfaccini in #10350 - Reject
TemplateVariableand fall back to the code default on invalid templates inManagedPrompt, and correct its docs by @mpfaffenberger in #10821 - Refuse non-regular file reads in
ModalSandboxBackendand log a sandbox created after every caller was cancelled by @mpfaffenberger in #10816 - Keep Eleven Realtime turn tracking intact when the model makes parallel tool calls by @DouweM in #10944
- Report Azure Voice Live
session_output_overflowas non-recoverable without a reconnect policy by @DouweM in #10947 - Read the context size of an Anthropic server-side tool loop from its last
usage.iterationspass by @dsfaccini in #10363 - Wait for GPT-Live's answer to a raised tool's failure before ending the turn by @DouweM in #10941
- Record an xAI realtime reply the user barged in on after it finished generating as interrupted by @DouweM in #10948
- Emit
RealtimeTurnCompleteEventonce for a realtime turn that ends because a tool raised by @DouweM in #10965 - Honor
retry-after-msinwait_retry_afterby @DouweM in #11065 - Send a failure result to Gemini Live when a realtime tool raises, so the session keeps answering by @DouweM in #10942
- Stop OpenAI GPT-Live
answer_webrtc_offerfrom rejecting the profile's audio sample rates by @DouweM in #11049 - Keep an in-flight Anthropic
tool_searchcall so the model gets its result instead of searching again by @DouweM in #11058 - Accept an explicit
input_transcription_model='auto'on OpenAI GPT-Live by @DouweM in #11047 - Make
Macroscopework under durable execution and return the findings of a review the CLI stopped early by @mpfaffenberger in #10817 - Treat
LogfireMCP(id=None)as the default id, acceptclientwithauth='', and flag untrusted telemetry in its docs by @mpfaffenberger in #10818 - Support
anthropic2.x: build message params as dicts and keep Bedrock'santhropic_versionby @DouweM in #11077 - Require
prefect>=3.9.0so theprefectextra imports on current FastAPI by @DouweM in #11071 - Keep
ModelRequestfields whenWarnNearLimitsstrips legacy warnings by @mpfaffenberger in #10776 - Show
ApprovalReviewerandToolCallJudgethe arguments as written, and correct the approval reviewer docs by @mpfaffenberger in #10727 - Fix command cleanup and first-use races in
BubblewrapWorkspaceby @mpfaffenberger in #10746 - Apply
FallbackModelresponse handlers when continuing a suspended response by @DouweM in #11085 - Let a Temporal worker register an agent listed on several workflows or also passed to
AgentPluginby @DouweM in #11082 - Map unified
thinkingtoreasoning.effortfor OpenAI GPT-5.6 and GPT-6 on Bedrock Converse by @rscholz98 in #10993 - Accept unrounded float probabilities and scores from
SystemOneModelbackends like vLLM by @mpfaffenberger in #11092 - Keep
SlidingWindowCompactionandSummarizingCompactionhistories sendable after tool retries andkeep_messages=0, and warn on an invalidsummary_promptby @mpfaffenberger in #10759 - Stop timed-out
E2BSandboxcommands on templates withoutpsby @mpfaffenberger in #10809 - Reject
auth='oauth'and describe only the selected products inGoogleWorkspaceby @mpfaffenberger in #10800 - Handle
prefixItemsand string length bounds in OpenAI strict mode by @adtyavrdhn in #7333 - Make
E2BSandboxraise a clearUserErroron Trio before any E2B request by @mpfaffenberger in #10810 - Stop
CodeModespeculation adopting reads that predate a write, scan eager streams that split\n, and reject out-of-rangeresource_limitsby @mpfaffenberger in #10764
New Contributors
- @tjkuson made their first contribution in #10886
- @yanlinf made their first contribution in #10177
- @ahmed-moubtahij made their first contribution in #8639
- @GitamShimoni made their first contribution in #10625
Full Changelog: v2.59.0...v2.60.0