What's Changed
⚠️ Compatibility Notes
- Support
SubAgents(dynamic_agents=...)under durable execution by @mpfaffenberger in #12418 - Strip every default-ignorable character before
ArtifactScannerphrase matching and flag hidden variation selectors by @mpfaffenberger in #11475 - Load one instruction file per directory and nested files by default in
RepoContext, addwalk_up, and haveCoderbuild on them by @DouweM in #11691 - Cap inlined nested instructions at 32,000 characters per conversation by default with
RepoContext(nested_max_chars=...)by @DouweM in #11699 - Send documents of any media type
mimetypesknows, with the format taken from it by @arjun-krishna1 in #12365 - Move provider-specific native-tool fields to
provider_settingsby @adtyavrdhn in #7807 - Add
framing_announcementsetting and only announce the<system>voice tag once a conversation needs it by @DouweM in #12661 - Surface nested
RepoContextinstruction files when the model writes or edits in a directory by @DouweM in #11701 - Record
InputGuardrail,OutputGuardrailandToolGuardrailverdicts as durable operations by @mpfaffenberger in #12428 - Refuse a
CapabilityCreationrun whendirectoryis below'operator'authority by @DouweM in #12558 - Stop continuing an OpenAI response without a
history_digestthroughopenai_previous_response_idby @DouweM in #12575 - Replay Prefect tasks on flow retry when the message history holds binary content by @sangkyoonnam in #12188
- Reject
CodeModetools named after Python builtins, which the sandbox called instead of the tool by @adtyavrdhn in #12698 - Break chat-template special tokens in content on open-model routes, and restore them in model output, with
ModelProfile.may_tokenize_special_tokens_in_contentby @DouweM in #12556 - Use the engine's codec and
serialization_failurefor durable capability results by @maksimzayats in #11057 - Send
FileSearchTool.max_num_resultsto OpenAI Responses by @adtyavrdhn in #12728 - Raise
UserErrorwhen validation requests approval for an external tool, keep single-model tool arguments through durable re-validation, and document concurrent DBOS runs and shared MCPhttp_clients by @dsfaccini in #12958 - Record a
StepPersistencetool call that ends inModelRetryorToolFailedasfailedinstead of leaving itstartedby @dsfaccini in #12638 - Raise
UserErrorfromStreamedRunResult.resultwhen arun_stream()run stops while finishing by @dsfaccini in #13087 - Run
CodeModeremote sandboxes over gRPC with pydantic-monty 1.5.0 by @dmontagu in #12673 - Replace
httpxwithhttpx2inpydantic-ai-harnessby @Kludex in #13026 - Curate
KnownModelNameand the provider model-name literals to the models a user would pick by @dsfaccini in #12817
🚀 Features
- Add
dequeueandset_enqueue_priorityto change a message queued withenqueuebefore delivery by @adtyavrdhn in #12345 - Support
SubAgents(dynamic_agents=...)under durable execution by @mpfaffenberger in #12418 - Run tool calls as DBOS child workflows via
child_workflowtool metadata inDBOSDurabilityby @mpfaffenberger in #12445 - Checkpoint
TrajectoryJudgeevaluations as a durable operation when the judge has anidby @mpfaffenberger in #12414 - Identify Azure Durable Task workers with
pydantic-aiin their gRPC user agent by @tamirdresher in #12493 - Add
clienttoModalSandboxandModalSandboxBackendby @adtyavrdhn in #12501 - Strip every default-ignorable character before
ArtifactScannerphrase matching and flag hidden variation selectors by @mpfaffenberger in #11475 - Add
clienttoE2BSandboxandE2BSandboxBackendby @adtyavrdhn in #12500 - Add per-path workspace authority with
Workspace.authority_ofby @DouweM in #12473 - Add
openai_include_unmapped_response_datato keep Chat Completions response data Pydantic AI doesn't map by @DouweM in #12034 - Load one instruction file per directory and nested files by default in
RepoContext, addwalk_up, and haveCoderbuild on them by @DouweM in #11691 - Cap inlined nested instructions at 32,000 characters per conversation by default with
RepoContext(nested_max_chars=...)by @DouweM in #11699 - Support OpenAI
fastandultrafastservice tiers inopenai_service_tierby @adtyavrdhn in #12527 - Send documents of any media type
mimetypesknows, with the format taken from it by @arjun-krishna1 in #12365 - Run DBOS child-workflow tools in parallel when a workspace is attached by @mpfaffenberger in #12522
- Add the
KeenableSearchcapability for keyless web research by @ilya-bogin-keenable in #9079 - Add
gateway/bedrock:global.moonshotai.kimi-k3andgateway/bedrock:global.moonshotai.kimi-k3.1toKnownModelNameby @dsfaccini in #12869 - Add provider-specific settings to native tools by @adtyavrdhn in #7633
- Support Anthropic
web_search_20260318andweb_fetch_20260318viaprovider_settingsby @adtyavrdhn in #12610 - Move provider-specific native-tool fields to
provider_settingsby @adtyavrdhn in #7807 - Support
SubAgents(task_control=...)under Temporal and DBOS durability by @mpfaffenberger in #12521 - Support OpenAI's
gpt-image-2.6-flareandgpt-image-2.6-sunburstimage models by @dsfaccini in #12820 - Add Claude Fable 5.2 (
claude-fable-5-2) and Claude Mythos 5.2 (claude-mythos-5-2) support by @dsfaccini in #12970 - List Claude Fable 5.2 on Bedrock (
global.anthropic.claude-fable-5-2) and send per-message effort to it on OpenRouter by @dsfaccini in #13037 - Support Gemini 4 Carbon (
gemini-4-carbon) onGoogleModelby @dsfaccini in #13057 - Add
framing_announcementsetting and only announce the<system>voice tag once a conversation needs it by @DouweM in #12661 - Surface nested
RepoContextinstruction files when the model writes or edits in a directory by @DouweM in #11701
🐛 Bug Fixes
- Record
InputGuardrail,OutputGuardrailandToolGuardrailverdicts as durable operations by @mpfaffenberger in #12428 - Stop commands under
crun1.14.1 inDockerSandboxand buildAsyncDaytonaoff the event loop by @adtyavrdhn in #12509 - Record
Advisor,SmartSearchandConversationSearchtool I/O as durable operations by @mpfaffenberger in #12415 - Include rejected
FallbackModelattempts in the usageBrowserUsereports to browser-use by @mpfaffenberger in #11879 - Publish
BoxdSandboxfields in the agent spec schema by @adtyavrdhn in #12518 - Publish
DaytonaSandboxfields in the agent spec schema by @adtyavrdhn in #12517 - Publish
RenderSandboxfields in the agent spec schema by @adtyavrdhn in #12520 - Publish
SpritesSandboxfields in the agent spec schema by @adtyavrdhn in #12519 - State a loaded capability's instructions where the load is when a UI client sends its history back by @DouweM in #11775
- Send Gemini tool returns that contain a
$refkey as JSON text, which Gemini otherwise rejects by @DouweM in #12429 - Make Temporal wait a model error's
retry_afterbefore retrying the model request activity by @DouweM in #12106 - Raise right away when the token limit cuts off
NativeOutputorPromptedOutputtext that fails validation, instead of retrying by @DouweM in #12406 - Raise
ModelQuotaExceededErrorfor the Gemini API's daily quota and disabled billing, and Moonshot's exhausted balance by @DouweM in #12422 - Attribute tool-result instructions to their source in the default summary prompt by @pydanty in #12506
- Keep tool search discoveries across
SummarizingCompaction,SlidingWindowCompactionandRelevanceCompactionby recording them again as aToolAvailabilityDeltaPartby @DouweM in #11773 - Record an exception raised in a UI adapter's
on_completeon the current OpenTelemetry span by @DouweM in #12541 - Stop sync runs warning
There is no current event loopon Python 3.12 and 3.13 by @DouweM in #12540 - Accumulate Mistral streamed tool-call deltas into one tool call by @pydanty in #11958
- Send the
max_tokenssetting to DeepSeek asmax_tokensinstead ofmax_completion_tokensby @dsfaccini in #12385 - Drop
WebSearchToolfrom non-compoundGroqModelprofiles so web search fallbacks run by @dsfaccini in #12386 - Raise
UserErrorfromJsonSchemaTransformeron nodes that are not JSON Schemas by @adtyavrdhn in #8620 - Keep a
Shelljob's log withinmax_log_byteswhen the job ends as its log watcher starts by @dsfaccini in #12578 - Walk up to a
RepoContext.home_dirspelled through a symlink by @dsfaccini in #12614 - Give every
FunctionSignaturetype one name and one definition in rendered tool catalogs by @adtyavrdhn in #12513 - Send
ClampOversizedMessagesandClearToolResultsedits without the item ID that makes OpenAI Responses ignore them by @DouweM in #12561 - Fix diff rendering pointing the wrong way for negative baselines by @arthi-arumugam-git in #7497
- Refuse a
CapabilityCreationrun whendirectoryis below'operator'authority by @DouweM in #12558 - Stop continuing an OpenAI response without a
history_digestthroughopenai_previous_response_idby @DouweM in #12575 - Replay Prefect tasks on flow retry when the message history holds binary content by @sangkyoonnam in #12188
- Render keyword and non-identifier tool parameter and field names as valid Python in
CodeModeandIPythonCodeModeby @dmontagu in #12669 - Reject
CodeModetools named after Python builtins, which the sandbox called instead of the tool by @adtyavrdhn in #12698 - Stop
max_retriesraising aTypeErroronAsyncAnthropicBedrockclients with anthropic 2.6 by @dsfaccini in #12707 - Cap
google-genai<3so fresh installs keepGoogleModelon thev1betaGemini API by @dsfaccini in #12700 - Emit results of tool calls that finish together in call order, so Temporal replays hand
event_stream_handlerthe recorded events by @dsfaccini in #12675 - Retry
FileSystemsearch_filespatterns whose repeat count overflowsre, such asa{99999999999}, instead of aborting the run by @dsfaccini in #12726 - Stop a
Shelljob's supervisor and log watcher outliving a command that removes its job directory by @dsfaccini in #12730 - Break chat-template special tokens in content on open-model routes, and restore them in model output, with
ModelProfile.may_tokenize_special_tokens_in_contentby @DouweM in #12556 - Record dropped Anthropic cache points in model-request telemetry by @pydanty in #12510
- Update
CerebrasProviderreasoning flags for Qwen 3.8, Kimi K3 and GLM-5.3 by @DouweM in #12746 - Raise
CodeModesetup errors to callers, correct timeout advice, and reset local and remote sessions after memory/output limits by @dmontagu in #12689 - Stop
SpritesSandboxBackend.runraising aTypeErrorfor a non-numbertimeoutby @dsfaccini in #12729 - Fix the
Shelljob supervisor hang when a command removes its job directory or makes it read-only by @dsfaccini in #12814 - Send one
User-Agentheader on Google requests by @dsfaccini in #12583 - Report the exit code of a
Shelljob whose command makes its job directory read-only, and stop it without a retry by @dsfaccini in #12830 - Fix
Shellfailing to stop a macOS job whose process group holds only zombies, and keep a failed call's own error when its stop fails too by @dsfaccini in #12858 - Stop the
gh-awengine putting the checkout onsys.pathahead of installed packages by @dsfaccini in #12818 - Use the engine's codec and
serialization_failurefor durable capability results by @maksimzayats in #11057 - Send
FileSearchTool.max_num_resultsto OpenAI Responses by @adtyavrdhn in #12728 - Send an
extra_headersuser-agent in any spelling in place of ours on OpenAI, Anthropic and Groq requests by @dsfaccini in #12871 - Merge an
anthropic-betaheader fromextra_headerswith the other Anthropic betas however its name is capitalized by @dsfaccini in #12875 - Send a user-agent from
extra_headersas one header line on Google requests by @dsfaccini in #12877 - Send the Anthropic client's
default_headersbetas with ours, and accept a user-agent in batchextra_headersin any spelling by @dsfaccini in #12878 - Raise
UserErrorwhen validation requests approval for an external tool, keep single-model tool arguments through durable re-validation, and document concurrent DBOS runs and shared MCPhttp_clients by @dsfaccini in #12958 - Send the lowest accepted effort for
thinking=Falseon more OpenRouter mandatory-reasoning routes by @DouweM in #12744 - Inline
$defsin gpt-oss tool schemas by @DouweM in #12759 - Fix
ToolOutputfor gpt-oss onBedrockMantleProviderby not forcingtool_choiceby @DouweM in #12761 - Treat the IPv6 prefixes
::ffff:0:0:0/96,100:0:0:1::/64,2001:2::/48,3fff::/20and5f00::/16as private addresses by @dsfaccini in #12953 - Make the harness
shellforeground wait replay the same workspace calls under durable execution by @mpfaffenberger in #12978 - Announce
task_backgroundedfor a background task that settles beforedelegate_taskresumes, as on durable replay by @dsfaccini in #13008 - Keep
tool_call_idon the tool call arguments the special-token restorer sends when a stream ends by @dsfaccini in #13062 - Populate
ModelAPIError.retry_afterfrom Gemini'sRetryInfo.retryDelayby @dsfaccini in #13077 - Limit the total size of the file URLs one model request downloads by @dsfaccini in #12959
- Record a
StepPersistencetool call that ends inModelRetryorToolFailedasfailedinstead of leaving itstartedby @dsfaccini in #12638 - Keep replayed durable work out of traces and token and cost metrics on AWS Lambda and Temporal by @DouweM in #12756
- Price Anthropic fast mode responses at fast mode rates by recording
provider_details['speed']by @dsfaccini in #13083 - Raise
UserErrorfromStreamedRunResult.resultwhen arun_stream()run stops while finishing by @dsfaccini in #13087
📦 Dependencies
- Move
uv.locktodbos3.4.0 and launchDBOSfrom a FastAPI lifespan in the production example by @dsfaccini in #12568 - Run
CodeModeremote sandboxes over gRPC with pydantic-monty 1.5.0 by @dmontagu in #12673 - Allow AWS durable execution SDK 2 and 3 in
pydantic-ai-harness[aws-lambda], and correct the Lambda quota and replay docs by @DouweM in #12739 - Replace
httpxwithhttpx2inpydantic-ai-harnessby @Kludex in #13026
New Contributors
- @tamirdresher made their first contribution in #12493
- @arjun-krishna1 made their first contribution in #12365
- @arthi-arumugam-git made their first contribution in #7497
- @sangkyoonnam made their first contribution in #12188
- @ilya-bogin-keenable made their first contribution in #9079
- @Mike-Animal-Counseling made their first contribution in #12681
- @maksimzayats made their first contribution in #11057
Full Changelog: v2.66.0...v2.67.0