🌏 中文版
Release Info
| Item | Value |
|---|---|
| Framework | Pydantic AI |
| Version | v2.61.0 |
| Previous | v2.60.0 |
| Released | 2026-10-23 |
| Release Notes | v2.61.0 |
| GitHub | pydantic/pydantic-ai |
| Stars | 20.8k |
Why this version matters
This release turns citations from decorative text in the output into structured data that actually flows through the system: TextPart can now carry citations, which get normalized into a consistent shape across providers and then replayed, unchanged, back to whichever provider originally produced them. For any RAG or search-backed agent that needs to keep track of "which source backed this sentence" across turns, that's a format-compatibility problem being solved, not a UI problem. The other headline change is opening up the durable execution engine's internals: operation types, ParameterTransports, DurableRunContext, and run identity hooks are all public API now — an acknowledgment that people want to wire in their own durable backend, instead of being limited to whatever the framework ships out of the box.
Key changes
- Structured citations:
TextPartnow supports citations, with citations from Bedrock, OpenRouter, and xAI normalized into a shared shape; across turns, citations are replayed back to the provider that originally produced them, and the Vercel AI adapter keeps citations too → building a RAG or search agent no longer means hand-rolling your own citation format conversion - Durable engine extension surface made public: operation types,
ParameterTransports,DurableRunContext, and run identity hooks are all now public API → third parties can plug in their own durable execution backend instead of depending on whichever ones the framework currently supports - New model names: added
kimi-k3.1-proandkimi-k3.1-pro-highspeed - Azure realtime improvements:
RealtimeClientSecret.webrtc_urlnow carrieswebrtcfilter=onon Azure OpenAI; the newRealtimeModelProfile.supports_audio_outputmakes text-only realtime models — like Gemini's robotics streaming models — default back to text output instead of being mistaken for voice-output models - Async auth for hosted MCP: the
authfunction for hosted MCP capabilities can now be async
Breaking Changes
No API-level breaking changes, but several behavior adjustments (compatibility notes):
thinking=Falsenow sends whichever minimal thinking level a model will accept, instead of trying to fully disable it — relevant for models that can't turn thinking off at all- A warning is now raised when a broader-scope, provider-specific thinking setting overrides the
thinkingparameter CohereModelnow raisesNotImplementedErrorwhen a tool return contains a file, instead of silently dropping itGoogleRealtimeModel.google_multi_speakeris now deprecated — no current Gemini Live model supports it- Affected: projects using
CohereModelwith tools that return files need to add error handling after upgrading; projects relying on provider-specific thinking overrides see no behavior change, but will now get a new warning
Migration guide
pip install --upgrade pydantic-ai==2.61.0
No major code changes required. If a tool has ever returned a file to CohereModel and you never handled the case where it got silently dropped, add error handling after upgrading.
Comparison with other frameworks
This week several frameworks are converging on the same theme — observability and extensibility. Pydantic AI opened up its durable engine's internals for third parties to plug into; crewAI's 1.15.29 (2026-10-23) promoted AgentExecutor out of experimental status and added trace export plus an offline evaluation runner. Different mechanics, same direction: frameworks are no longer just responsible for making an agent run — they also need to let you see and take over what happens during the run.
Takeaway
I used to think citations were just extra metadata tacked onto the output text. Seeing Pydantic AI turn them into structured data — normalized, and replayable back to the provider that produced them — made it clear what's actually hard about citations across multi-turn conversations: it isn't displaying them, it's making sure that when the next turn sends them back to the provider, the provider still recognizes them as its own. That's a format-compatibility problem, not a UI one.