Skip to content

v0.20.0

Latest

Choose a tag to compare

@seratch seratch released this 11 Aug 03:12
· 4 commits to main since this release
d2bda3f

Key Changes

Version 0.20.0 is a minor release because it changes the implicit default model and includes a potentially breaking MCP dependency migration for applications with customized local HTTP transports. MCP v1 remains supported, and affected applications can migrate to httpx2 or pin mcp<2.

Highlights:

  • The default model is now gpt-5.6-luna; explicit models, run-level overrides, and OPENAI_DEFAULT_MODEL continue to take precedence.
  • Local MCP connections support MCP Python SDK v1 and v2 across stdio, SSE, and Streamable HTTP transports.
  • Applications using custom MCP HTTP authentication or client factories must use the HTTP types owned by the installed MCP major version, or pin mcp<2.
  • RunState.add_input() can stage durable user input before a resumed model call, with guardrail, persistence, and serialization support.
  • Sandbox mount validation adds explicit credential-exposure acknowledgements and preserves redacted error contracts without serializing credential authority.
  • Realtime input transcription supports the GA transcription settings for gpt-live-transcribe, gpt-transcribe, and gpt-realtime-whisper.

What's Changed

  • feat: use GPT-5.6 Luna as the default model by @seratch in #4282
  • feat: add durable pending input to RunState by @seratch in #4325
  • feat(mcp): support MCP Python SDK v1 and v2 by @seratch in #4106
  • feat(sessions): pass run context to custom sessions by @seratch in #4209
  • feat(realtime): support GA transcription options by @seratch in #4351
  • feat: preserve raw usage payloads by @seratch in #4279
  • feat: allow applications to approve unsafe replays by @seratch in #4319
  • fix: falsy optional reference handling by @seratch in #4305
  • fix: prevent queue consumer deadlocks by @seratch in #4201
  • fix: publish completed streamed guardrail results on failure paths by @adityasingh2400 in #4223
  • fix: annotate the bare tool guardrail decorator overloads by @adityasingh2400 in #4238
  • fix: tool approval is not honored on resume when Runner.run is given a context by @ojassharma7 in #4245
  • fix: redact JSON validation errors by @seratch in #4211
  • fix: copy raw_responses when building a RunState by @adityasingh2400 in #4237
  • fix: keep empty turns in the nested conversation history by @abhay-codes07 in #4230
  • fix: keep tool guardrail results when a resumed run interrupts again by @adityasingh2400 in #4239
  • fix: work on copies of the lists a resumed run adopts from RunState by @hsusul in #4251
  • fix: strip placeholder item IDs without provider_data on the Responses path by @LeSingh1 in #4266
  • fix: bind tool approvals to concrete invocations by @seratch in #4257
  • fix: normalize optional fields in tool invocation identity by @seratch in #4289
  • fix: count requests when providers omit usage by @seratch in #4290
  • fix: suppress pydantic serializer warnings by @seratch in #4291
  • fix: keep FunctionTool subclasses copyable by @seratch in #4311
  • fix: preserve streamed guardrail session state by @seratch in #4312
  • fix: keep acknowledged safety checks serializable after restore by @ribhavjain in #4316
  • fix: preserve default-valued fields in serialized tool output by @hsusul in #4307
  • fix: strip output-only created_by when replaying model output as input by @hsusul in #4308
  • fix: preserve local shell outputs across RunState resume by @seratch in #4320
  • fix: serialize containers of models and dataclasses as structured data by @ribhavjain in #4339
  • fix: reject schemas that exceed safe recursion depth by @seratch in #4358
  • fix: reject unsafe strict-schema ref siblings by @seratch in #4356
  • fix(sandbox): reject unsafe mount credential configurations by @seratch in #4255
    • fix(extensions): settle snapshot directory mount transitions for Modal by @seratch in #4315
    • fix(sandbox): preserve sandbox error contracts during mount redaction by @seratch in #4344
    • feat(sandbox): add explicit mount credential exposure acknowledgements by @seratch in #4321
  • fix(sandbox): cancel sibling env resolvers when one fails by @PranavMishra28 in #4195
  • fix(sandbox): encode Blaxel terminal WebSocket URL query values by @abhay-codes07 in #4217
  • fix(sandbox): stop splitting Cloudflare SSE events at chunk boundaries by @abhay-codes07 in #4215
  • fix(sandbox): keep move_to when coercing apply_patch operation mappings by @hsusul in #4242
  • fix(sandbox): retain program items in memory rollouts by @seratch in #4276
  • fix(sandbox): restore archived file modes when extracting a workspace tar by @hsusul in #4287
  • fix(sandbox): keep source entry metadata when lazily loading a skill by @hsusul in #4294
  • fix(mcp): hosted MCP approval identity by @seratch in #4256
  • fix(mcp): keep MCP error content when structured output is enabled by @adityasingh2400 in #4224
  • fix(mcp): build the active server list without re-consuming the iterable by @adityasingh2400 in #4235
  • fix(mcp): preserve free-form MCP object schemas by @seratch in #4310
  • fix(mcp): serialize non-text content blocks as JSON instead of Python repr by @ribhavjain in #4338
  • fix(mcp): serialize manager lifecycle operations by @seratch in #4340
  • fix(mcp): bound lifecycle and CI waits by @seratch in #4342
  • fix(chat-completions): keep url citations when converting chat completions output by @adityasingh2400 in #4222
  • fix(chat-completions): assemble chat completions content parts in content index order by @adityasingh2400 in #4236
  • fix(chat-completions): propagate the OpenAI request ID on the Chat Completions path by @hsusul in #4243
  • fix(chat-completions): keep url citations on the streamed chat completions path by @Luccacvb in #4252
  • fix(chat-completions): announce the chat completions assistant message once by @hsusul in #4275
  • fix(chat-completions): convert input_file items that reference a file_id on the Chat Completions path by @hsusul in #4295
  • fix(chat-completions): raise on audio output in the streamed chat completions path by @Luccacvb in #4309
  • fix(chat-completions): omit parallel_tool_calls without tools on the Chat Completions path by @Luccacvb in #4359
  • fix(sessions): release SQLite engine config entries when engines are collected by @adityasingh2400 in #4210
  • fix(sessions): enforce closed state on SQLite session empty add_items by @adityasingh2400 in #4231
  • fix(sessions): make session mutations atomic by @seratch in #4212
  • fix(sessions): preserve required program item ids for OpenAI conversations by @hsusul in #4253
  • fix(sessions): apply the reasoning item id policy to stored session history by @LeSingh1 in #4278
  • fix(sessions): preserve DaprSession created_at across writes by @adityasingh2400 in #4213
  • fix(sessions): strip placeholder item IDs before Conversations persistence by @hsusul in #4288
  • fix(sessions): preserve falsey compaction decision hooks by @hsusul in #4299
  • fix(sessions): restore session history when compaction replacement is cancelled by @nothariharan in #4298
  • fix(sessions): prune orphaned tool outputs from limited sessions by @seratch in #4324
  • fix(realtime): apply tool call item updates to session history by @hsusul in #4284
  • fix(realtime): preserve falsey custom models by @hsusul in #4286
  • fix(realtime): compute G.711 audio length for typed and mapping format spellings by @abhay-codes07 in #4292
  • fix(voice): forward TTSModelSettings.speed to the OpenAI speech API by @adityasingh2400 in #4220
  • fix(voice): keep the word separator when flushing streamed sentences by @abhay-codes07 in #4227
  • fix(voice): start the dispatcher when a session ends with no turns by @adityasingh2400 in #4259
  • fix(voice): report transcription session close failures to the consumer by @Luccacvb in #4343
  • fix(tracing): release the trace scope when a generator is closed by @adityasingh2400 in #4221
  • fix(tracing): release the span scope when a generator is closed by @adityasingh2400 in #4233
  • fix(tracing): catch only the context reset on generator close by @adityasingh2400 in #4232
  • fix(extensions): harden tool output trimming contracts by @seratch in #4204
  • fix(extensions): forward prompt_cache_retention on the any-llm Responses path by @hsusul in #4248
  • fix(extensions): resolve the any-llm default model at call time by @adityasingh2400 in #4219
  • fix(extensions): surface content filter refusals on the any_llm chat path by @adityasingh2400 in #4234
  • fix(extensions): omit litellm's parallel_tool_calls without tools by @seratch in #4330

Documentation & Other Changes

New Contributors

Full Changelog: v0.19.4...v0.20.0