This release adds realtime voice calls, per-user OAuth for MCP servers, and first-class system reminders. It also changes the default model, corrects usage-cost accounting, and fixes a token-isolation bug found by driving the OAuth flow end to end.
Voice agents
Run an existing agency as a realtime voice service. Use run_realtime(agency=...) for a dedicated server, add /{agency}/realtime to an existing app with run_fastapi(enable_realtime=True), or call Agency.to_realtime() to build your own. Ships with OpenAI and xAI support, a packaged browser client, and a Twilio phone bridge (#735).
Limit worth knowing: a call keeps one voice from start to finish. The realtime API refuses to change voices once the model has spoken, so the voice is chosen when the call starts and stays fixed even across handoffs. Set voice= on your entry agent, or pass it to run_realtime().
OAuth for MCP servers
Connect OAuth-protected MCP servers with MCPServerOAuth. Sign-in is deferred until the agent calls authenticate_mcp_server, and tokens are stored in per-user buckets. FastAPI streams oauth_redirect and oauth_status events so a web client can drive the browser flow (#734).
Two follow-up fixes: explicitly configured scopes are no longer silently replaced by the ones a resource server advertises, and a storage failure now surfaces its real cause instead of a generic cancellation (#758).
Upgrade note: if you used per-user OAuth before this release, tokens were written to a shared default bucket rather than per-user buckets, because the user identity did not survive into the tool driver. That is fixed (#763). Affected users authorize once more, after which each user's tokens are stored separately.
System reminders
Agent(system_reminders=...) injects transient guidance before model calls without writing it to thread history. Pass a plain string for the common case, a callable for dynamic text, or use AfterEveryUserMessage and EveryNToolCalls. Tool-count reminders cover both local and hosted tools (#732, #746).
Creating the first agent with reminders installs a process-wide boundary around SDK Runner calls and RunState serialization; that is what keeps reminders out of persisted history on direct Runner runs. Processes that never create a reminder-enabled agent leave the SDK untouched.
Default model
The framework default is now gpt-5.6-luna, with reasoning effort pinned to none. Passing model=None explicitly resolves to that default rather than falling through to the SDK's. openai-agents moves from 0.14.8 to 0.18.1 (#741).
To keep a different model, pass it explicitly: Agent(..., model="your-model").
Cost accounting
Tiered prices are applied per request rather than to a summed total, so several small calls are no longer priced as one large one. Cache-write tokens are charged at the cache-creation rate when the provider reports them, and an ambiguous tiered aggregate raises rather than returning a guess (#759).
Bundled prices for gpt-5.6-luna and gpt-5.6-terra were corrected after OpenAI's July 30, 2026 cut, and builds no longer overwrite those corrections with stale upstream data (#760, #761).
Tools
Files named test_*.py, *_test.py, and conftest.py in a tools_folder are skipped instead of being imported as tools, so pytest files can live beside the tools they cover (#730).
Documentation
The OAuth and voice guides now open with a working example instead of a configuration matrix, and the agent overview no longer describes the old default-model behavior (#757, #764).
Maintenance
MCP OAuth and manager modules were split into focused files with no public import changes (#756). Dependency updates: coverage, FastAPI, MCP, datamodel-code-generator, griffe, langchain-core, websockets, and Ruff.
Full change range: v1.10.5...v1.11.0