{"url":"https://api.github.com/repos/pydantic/pydantic-ai/releases/402301411","assets_url":"https://api.github.com/repos/pydantic/pydantic-ai/releases/402301411/assets","upload_url":"https://uploads.github.com/repos/pydantic/pydantic-ai/releases/402301411/assets{?name,label}","html_url":"https://github.com/pydantic/pydantic-ai/releases/tag/v2.54.0","id":402301411,"author":{"login":"dsfaccini","id":64162682,"node_id":"MDQ6VXNlcjY0MTYyNjgy","avatar_url":"https://avatars.githubusercontent.com/u/64162682?v=4","gravatar_id":"","url":"https://api.github.com/users/dsfaccini","html_url":"https://github.com/dsfaccini","followers_url":"https://api.github.com/users/dsfaccini/followers","following_url":"https://api.github.com/users/dsfaccini/following{/other_user}","gists_url":"https://api.github.com/users/dsfaccini/gists{/gist_id}","starred_url":"https://api.github.com/users/dsfaccini/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/dsfaccini/subscriptions","organizations_url":"https://api.github.com/users/dsfaccini/orgs","repos_url":"https://api.github.com/users/dsfaccini/repos","events_url":"https://api.github.com/users/dsfaccini/events{/privacy}","received_events_url":"https://api.github.com/users/dsfaccini/received_events","type":"User","user_view_type":"public","site_admin":false},"node_id":"RE_kwDOMMa-Ps4X-qHj","tag_name":"v2.54.0","target_commitish":"66951321b89587235f432281eba909a30a585ffd","name":"v2.54.0 (2026-10-02)","draft":false,"immutable":false,"prerelease":false,"created_at":"2026-10-03T03:06:41Z","updated_at":"2026-10-09T20:12:18Z","published_at":"2026-10-03T03:21:28Z","assets":[],"tarball_url":"https://api.github.com/repos/pydantic/pydantic-ai/tarball/v2.54.0","zipball_url":"https://api.github.com/repos/pydantic/pydantic-ai/zipball/v2.54.0","body":"<!-- Release notes generated using configuration in .github/release.yml at main -->\n\n## What's Changed\n### ⚠️ Compatibility Notes\n* Handle draft-7 list-form `items` in `JsonSchemaTransformer`, `TestModel` and Mistral streamed output, and make `TestModel` accept boolean subschemas and cap `prefixItems` at `maxItems` by @dsfaccini in https://github.com/pydantic/pydantic-ai/pull/9560\n* Fix `ImageGeneration` under `FallbackModel` and `dataclasses.replace`, and compare `Embedder` by identity by @dsfaccini in https://github.com/pydantic/pydantic-ai/pull/9477\n* Refuse a second durable execution engine on an agent before either binds by @DouweM in https://github.com/pydantic/pydantic-ai/pull/9391\n* Make `wrap_*` hooks enclose complete stage lifecycles by @adtyavrdhn in https://github.com/pydantic/pydantic-ai/pull/7053\n* Re-raise model errors from Temporal model activities with their original type in workflow code by @DouweM in https://github.com/pydantic/pydantic-ai/pull/9580\n* End the run when a `BackgroundTools` tool raises an unexpected exception, as a sequential tool does by @DouweM in https://github.com/pydantic/pydantic-ai/pull/9434\n* Drop the `SubAgents` `agent_folders` default-change warning: since v2.52.0 (#9023) the `agents` folder is not loaded by default, so pass `agent_folders='agents'` to keep loading it by @DouweM in https://github.com/pydantic/pydantic-ai/pull/9424\n### 🚀 Features\n* Disable `RepoContext` inventory by default by @DouweM in https://github.com/pydantic/pydantic-ai/pull/9382\n* Give the `CodeMode` missing-return-schema warning its own `CodeModeReturnSchemaWarning` category by @DouweM in https://github.com/pydantic/pydantic-ai/pull/9423\n* Add `cancel_and_resume` example: cancel and resume a streaming run by @DouweM in https://github.com/pydantic/pydantic-ai/pull/7012\n* Reconnect dropped `OpenAILiveModel` sessions by forking a stored session or replaying the history by @DouweM in https://github.com/pydantic/pydantic-ai/pull/9401\n* Default Pydantic AI-created HTTP clients to the OpenAI SDK's connection pool limits, and make `create_async_httpx2_client()` public by @DouweM in https://github.com/pydantic/pydantic-ai/pull/9600\n* Use `gpt-live-transcribe` for OpenAI realtime's default `input_transcription_model='auto'` and list `gpt-transcribe` by @DouweM in https://github.com/pydantic/pydantic-ai/pull/9402\n* Support `WebSearchTool` on OpenAI GPT-Live through its delegated backend by @DouweM in https://github.com/pydantic/pydantic-ai/pull/9049\n* Add `native` to `ExaSearch` and `YouSearch` to prefer the model's native web search, and `web_search_tool()` for `WebSearch(local=...)` by @DouweM in https://github.com/pydantic/pydantic-ai/pull/9386\n### 🐛 Bug Fixes\n* Fail closed in the shell `realpath` fallback when `readlink` cannot read a symlink by @dsfaccini in https://github.com/pydantic/pydantic-ai/pull/9613\n* Stop importing the undeclared `sniffio` package in `pydantic-evals` and `pydantic-ai-harness` by [@pydanty](https://github.com/apps/pydanty) in https://github.com/pydantic/pydantic-ai/pull/9620\n* Fall back from `ImageGenerationTool` to the local tool on Gemini text models, and keep tool output when a native tool falls back locally on Gemini 2.5 by @dsfaccini in https://github.com/pydantic/pydantic-ai/pull/9551\n* Treat a `null` `finish_reason` on a `SnowflakeModel` response like an empty one by @DouweM in https://github.com/pydantic/pydantic-ai/pull/9590\n* Refuse a `LocalFileStore` root another user owns, and log `ToolOutputLimits` spill and summarize fallbacks by @DouweM in https://github.com/pydantic/pydantic-ai/pull/9020\n* State when the `ConversationSearch` default-scope warning will be removed by @DouweM in https://github.com/pydantic/pydantic-ai/pull/9383\n* Warn when `read_only=True` removes every hosted MCP tool by @DouweM in https://github.com/pydantic/pydantic-ai/pull/9387\n* Pin the request that started the current run, not the first prompt of the conversation, in the `TrajectoryJudge` window by @DouweM in https://github.com/pydantic/pydantic-ai/pull/9425\n* Identify the `search_tools` tool by its `tool_kind` instead of its name by @DouweM in https://github.com/pydantic/pydantic-ai/pull/9603\n* Find the tool search tool in `CodeMode` by its `tool_kind`, so a prefixed search tool still gets its notes by @DouweM in https://github.com/pydantic/pydantic-ai/pull/9604\n* Log `LLMReminder` generation failures instead of silently falling back to `GoalReanchor` text by @DouweM in https://github.com/pydantic/pydantic-ai/pull/9024\n* Include function tools run after the final result in `run_stream()` usage by @DouweM in https://github.com/pydantic/pydantic-ai/pull/9694\n* Build the same `ModelResponse` from streamed and complete `GoogleModel` responses, and add Gemini 3 web search sources by @DouweM in https://github.com/pydantic/pydantic-ai/pull/9594\n* Recover run state with `RunCancelled.from_cancellation()` when a DBOS workflow is cancelled by @DouweM in https://github.com/pydantic/pydantic-ai/pull/9394\n* Make custom `setup_logfire` callbacks replay-safe and add `replay_safe` to `LogfirePlugin` by @DouweM in https://github.com/pydantic/pydantic-ai/pull/9698\n* Raise `ModelAPIError` for undecodable 200 response bodies from Anthropic, Bedrock, Groq, Hugging Face, Google, and OpenAI embeddings and images by @DouweM in https://github.com/pydantic/pydantic-ai/pull/9350\n* Keep the run state recoverable when Ctrl-C interrupts `run_sync()` by @DouweM in https://github.com/pydantic/pydantic-ai/pull/9605\n* Clamp OpenAI realtime barge-in truncation at the profile's `audio_output_sample_rate` by @DouweM in https://github.com/pydantic/pydantic-ai/pull/9399\n* Load a capability once when `load_capability` is called twice for it in one response by @DouweM in https://github.com/pydantic/pydantic-ai/pull/9397\n* Keep a first-position `ToolAvailabilityDeltaPart` announcement out of the standing system prompt by @DouweM in https://github.com/pydantic/pydantic-ai/pull/9413\n* Commit an ACP turn up to its usage limit instead of rolling it back by @DouweM in https://github.com/pydantic/pydantic-ai/pull/9426\n* Preserve text and reasoning part boundaries in `OpenAIChatModel` streams by [@pydanty](https://github.com/apps/pydanty) in https://github.com/pydantic/pydantic-ai/pull/8729\n* Propagate a native cancel that lands during a command timeout's stop by @dsfaccini in https://github.com/pydantic/pydantic-ai/pull/9675\n* Keep `BubblewrapWorkspace` commands from running code on the SSH host through shell startup files or the `SSHWorkspaceBackend` stop script's `PATH` (VERIA-212) by @mpfaffenberger in https://github.com/pydantic/pydantic-ai/pull/9673\n\n\n**Full Changelog**: https://github.com/pydantic/pydantic-ai/compare/v2.53.0...v2.54.0\n","reactions":{"url":"https://api.github.com/repos/pydantic/pydantic-ai/releases/402301411/reactions","total_count":1,"+1":1,"-1":0,"laugh":0,"hooray":0,"confused":0,"heart":0,"rocket":0,"eyes":0},"mentions_count":4}