What's Changed
- feat(core): support image results in web search tools by @seratch in #4898
- feat(core): customize output guardrail blocked messages by @seratch in #4594
- feat(mcp): add server-wide guardrails to MCP tools by @seratch in #4632
- feat(sandbox): add configurable Unix-local environment isolation by @seratch in #4640
- feat(sandbox): allow labels on Docker sandbox containers by @seanxuu in #4564
- feat(voice): expose streamed transcription options by @seratch in #4645
- fix(core): detach aggregated request usage entries by @green3sf in #4519
- fix(core): fail closed on empty tool arguments by @hsusul in #4545
- fix(core): strip created_by when replaying RunItems as input by @hsusul in #4568
- fix(core): strict_schema error message, REPL whitespace input, debug docstrings by @simpleqt in #4600
- fix(core): max_turns no longer clobbers a tripped input guardrail exception in streaming by @shoemoney in #4606
- fix(core): preserve serialized approval resume ownership by @seratch in #4613
- fix(core): read tool args without Pydantic property shadowing by @hsusul in #4627
- fix(core): accept JSON Schema type arrays of object for tool outputs by @hsusul in #4647
- fix(core): honor End of File hunks when the file ends in a newline by @lllakshit in #4661
- fix(core): preserve tuple annotations for variadic tool arguments by @Excelius-Wang in #4655
- fix(core): fix streamed response span losing response/input when consumer stops at completed event by @XuQuanxin04 in #4692
- fix(core): apply **kwargs value annotation to each keyword value by @abhay-codes07 in #4714
- fix(core): reject **kwargs keys that collide with named tool parameters by @rajarshidattapy in #4674
- fix(core): reject fixed-length tuple annotations for variadic tool arguments by @subhashpolisetti in #4735
- fix(core): preserve Field constraints on variadic tool parameters by @rioyu123 in #4739
- fix(core): close model providers created by Runner by @Excelius-Wang in #4785
- fix(core/voice): honor OpenAI provider options over default clients by @green3sf in #4530
- fix(chat-completions): merge a streamed turn's message into its pending tool-call message by @mmjerge in #4728
- fix(chat-completions): raise ModelBehaviorError on truncated empty completions by @weike-zhang in #4513
- fix(chat-completions) reject unpaired function outputs in Chat Completions by @apcha-oai in #4699
- fix(extensions): skip AdvancedSQLiteSession usage store when the branch has no turn by @rioyu123 in #4822
- fix(extensions): nest extra_body on the any-llm chat path by @hsusul in #4544
- fix(mcp): deep-copy cached tools before returning them by @hsusul in #4525
- fix(mcp): clear active MCP servers after cleanup by @sylvesterkaczmarek in #4586
- fix(mcp): deduplicate managed servers by @hsusul in #4591
- fix(realtime): advance crossed guardrail thresholds by @hsusul in #4590
- fix(realtime): preserve item status on retrieved conversation items by @shoutoutuoadi325 in #4598
- fix(sandbox): finish dependency cleanup on cancellation by @hsusul in #4607
- fix(sandbox): keep unbounded UnixLocal workspace I/O off the event loop by @ayaangazali in #4700
- fix(sandbox): preserve UTF-8 boundaries in Cloudflare SSE by @Hughhhhcoder in #4707
- fix(sandbox): clean up PTY startup cancellation by @Hughhhhcoder in #4750
- fix(sandbox): settle PTY output before cleanup by @seratch in #4738
- fix(sandbox): preserve workdir for shell command lists by @hsusul in #4915
- fix(sessions): recover failed resumed Session writes before model calls by @seratch in #4630
- fix(sessions): recover failed resumed Session writes on a renewed interruption by @ayaangazali in #4650
- fix(sessions): persist resumed tool guardrail results by @FU-max-boop in #4654
- fix(sessions): recover resumed handoffs after session append failures by @seratch in #4725
- fix(sessions): settle conversation deletion before propagating cancellation by @Excelius-Wang in #4790
- fix(sessions): preserve concurrent writes during compaction by @seratch in #4736
- fix(sessions): reject resuming a run whose accepted terminal output was not persisted by @Ayushraj06-bit in #4698
- fix(sessions): preserve Session transformations during generation tracking by @seratch in #4917
- fix(tracing): flush buffered data after tracing is disabled by @sylvesterkaczmarek in #4528
- fix(tracing): preserve response IDs in redacted traces by @seratch in #4641
- fix(tracing): record the tool output on approval-gated function spans by @dfedoryshchev in #4866
- fix(voice): support custom OpenAI TTS voice IDs by @sylvesterkaczmarek in #4541
- fix(voice): forward streamed STT language and prompt by @seratch in #4574
- fix(voice): honor client config for streamed STT by @seratch in #4575
- fix(voice) reject ignored explicit-client options by @sylvesterkaczmarek in #4527
- fix(voice): include current OpenAI TTS voices by @sylvesterkaczmarek in #4535
- fix(voice): use monotonic STT event deadlines by @seratch in #4593
- fix(voice): support context in single-agent workflow by @sylvesterkaczmarek in #4636
- fix(voice): enforce public Voice class state coverage by @seratch in #4644
- fix(voice): redact STT prompts from traces by @hsusul in #4663
- fix(voice): redact TTS instructions from speech spans by @ayaangazali in #4676
- fix(voice): accept every NumPy spelling of a supported TTS dtype by @Nikhils-G in #4778
- fix(voice): wake stream when producer is cancelled by @Hughhhhcoder in #4825
- fix(visualization): preserve nodes with duplicate names by @tandede in #4512
- refactor: extract RunState agent graph identity by @seratch in #4876
- refactor: share provider generation-span population by @seratch in #4877
Documentation & Other Changes
- docs: document v0.22.0 behavior changes by @seratch in #4522
- docs: fix wording in handoff example prompts by @Chair403 in #4520
- docs: preserve English heading anchors in translated pages by @saime428 in #4580
- docs: refresh tracing integration links by @seratch in #4634
- docs: clarify capability visibility and authorization by @seratch in #4642
- docs: clarify database driver installation for SQLAlchemy sessions by @rioyu123 in #4743
- docs: skip reference pages on Windows by @sylvesterkaczmarek in #4761
- docs: clarify requested state consistency guarantees by @rksharma-owg in #4903
- docs: make the encrypted session quick start self-contained by @rioyu123 in #4909
- fix: freeze the public voice API contract by @seratch in #4578
- fix: enforce public type alias contract coverage by @seratch in #4595
- fix: route verification changes and require confirmed docs-only pushes by @seratch in #4880
- fix: propagate the serial test runner's exit code on Windows by @MohammedAlkindi in #4771
- fix: harden PyPI publishing and require manual release tags by @seratch in #4726
- fix: require complete policy for new public TypedDicts by @seratch in #4900
- fix: simplify verification and stabilize sandbox tests by @seratch in #4916
- fix: consolidate Docker-backed integration tests by @seratch in #4667
- chore(deps): bump actions/download-artifact from 4.3.0 to 8.0.1 by @dependabot[bot] in #4802
- chore(deps): bump actions/upload-artifact from 4.6.2 to 7.0.1 by @dependabot[bot] in #4803
- chore: run repository skill tests in dedicated CI by @seratch in #4881
- refactor: separate release contract verification responsibilities by @seratch in #4878
- perf: reduce async stability command startup overhead by @seratch in #4874
- test: make async progress and trace-worker tests deterministic by @seratch in #4875
- test: organize Realtime session tests by responsibility by @seratch in #4879
- test(sandbox): skip unavailable Windows symlinks by @sylvesterkaczmarek in #4853
- release: 0.22.1 by @seratch in #4576
New Contributors
- @Chair403 made their first contribution in #4520
- @green3sf made their first contribution in #4519
- @tandede made their first contribution in #4512
- @seanxuu made their first contribution in #4564
- @simpleqt made their first contribution in #4600
- @shoemoney made their first contribution in #4606
- @shoutoutuoadi325 made their first contribution in #4598
- @ayaangazali made their first contribution in #4650
- @lllakshit made their first contribution in #4661
- @Excelius-Wang made their first contribution in #4655
- @XuQuanxin04 made their first contribution in #4692
- @Hughhhhcoder made their first contribution in #4707
- @rajarshidattapy made their first contribution in #4674
- @mmjerge made their first contribution in #4728
- @subhashpolisetti made their first contribution in #4735
- @rioyu123 made their first contribution in #4822
- @Nikhils-G made their first contribution in #4778
- @MohammedAlkindi made their first contribution in #4771
- @Ayushraj06-bit made their first contribution in #4698
- @rksharma-owg made their first contribution in #4903
Full Changelog: v0.22.0...v0.22.1