openai-agents 0.4.1__tar.gz → 0.4.2__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {openai_agents-0.4.1 → openai_agents-0.4.2}/.github/workflows/tests.yml +2 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/PKG-INFO +2 -2
- {openai_agents-0.4.1 → openai_agents-0.4.2}/README.md +1 -1
- {openai_agents-0.4.1 → openai_agents-0.4.2}/examples/realtime/app/agent.py +12 -4
- {openai_agents-0.4.1 → openai_agents-0.4.2}/examples/realtime/app/server.py +3 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/pyproject.toml +1 -1
- {openai_agents-0.4.1 → openai_agents-0.4.2}/src/agents/extensions/models/litellm_model.py +45 -11
- {openai_agents-0.4.1 → openai_agents-0.4.2}/src/agents/models/chatcmpl_stream_handler.py +7 -1
- {openai_agents-0.4.1 → openai_agents-0.4.2}/src/agents/realtime/config.py +3 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/src/agents/realtime/session.py +59 -8
- {openai_agents-0.4.1 → openai_agents-0.4.2}/tests/models/test_kwargs_functionality.py +38 -0
- openai_agents-0.4.2/tests/models/test_litellm_extra_body.py +157 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/tests/realtime/test_openai_realtime.py +2 -6
- {openai_agents-0.4.1 → openai_agents-0.4.2}/tests/realtime/test_session.py +40 -3
- {openai_agents-0.4.1 → openai_agents-0.4.2}/uv.lock +1 -1
- openai_agents-0.4.1/tests/models/test_litellm_extra_body.py +0 -44
- {openai_agents-0.4.1 → openai_agents-0.4.2}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/.github/ISSUE_TEMPLATE/model_provider.md +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/.github/ISSUE_TEMPLATE/question.md +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/.github/PULL_REQUEST_TEMPLATE/pull_request_template.md +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/.github/workflows/docs.yml +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/.github/workflows/issues.yml +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/.github/workflows/publish.yml +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/.github/workflows/update-docs.yml +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/.gitignore +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/.prettierrc +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/.vscode/launch.json +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/.vscode/settings.json +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/AGENTS.md +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/CLAUDE.md +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/LICENSE +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/Makefile +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/docs/agents.md +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/docs/assets/images/favicon-platform.svg +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/docs/assets/images/graph.png +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/docs/assets/images/mcp-tracing.jpg +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/docs/assets/images/orchestration.png +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/docs/assets/logo.svg +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/docs/config.md +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/docs/context.md +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/docs/examples.md +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/docs/guardrails.md +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/docs/handoffs.md +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/docs/index.md +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/docs/ja/agents.md +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/docs/ja/config.md +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/docs/ja/context.md +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/docs/ja/examples.md +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/docs/ja/guardrails.md +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/docs/ja/handoffs.md +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/docs/ja/index.md +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/docs/ja/mcp.md +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/docs/ja/models/index.md +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/docs/ja/models/litellm.md +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/docs/ja/multi_agent.md +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/docs/ja/quickstart.md +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/docs/ja/realtime/guide.md +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/docs/ja/realtime/quickstart.md +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/docs/ja/release.md +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/docs/ja/repl.md +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/docs/ja/results.md +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/docs/ja/running_agents.md +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/docs/ja/sessions/advanced_sqlite_session.md +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/docs/ja/sessions/encrypted_session.md +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/docs/ja/sessions/index.md +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/docs/ja/sessions/sqlalchemy_session.md +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/docs/ja/sessions.md +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/docs/ja/streaming.md +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/docs/ja/tools.md +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/docs/ja/tracing.md +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/docs/ja/usage.md +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/docs/ja/visualization.md +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/docs/ja/voice/pipeline.md +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/docs/ja/voice/quickstart.md +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/docs/ja/voice/tracing.md +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/docs/ko/agents.md +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/docs/ko/config.md +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/docs/ko/context.md +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/docs/ko/examples.md +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/docs/ko/guardrails.md +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/docs/ko/handoffs.md +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/docs/ko/index.md +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/docs/ko/mcp.md +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/docs/ko/models/index.md +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/docs/ko/models/litellm.md +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/docs/ko/multi_agent.md +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/docs/ko/quickstart.md +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/docs/ko/realtime/guide.md +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/docs/ko/realtime/quickstart.md +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/docs/ko/release.md +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/docs/ko/repl.md +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/docs/ko/results.md +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/docs/ko/running_agents.md +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/docs/ko/sessions/advanced_sqlite_session.md +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/docs/ko/sessions/encrypted_session.md +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/docs/ko/sessions/index.md +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/docs/ko/sessions/sqlalchemy_session.md +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/docs/ko/sessions.md +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/docs/ko/streaming.md +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/docs/ko/tools.md +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/docs/ko/tracing.md +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/docs/ko/usage.md +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/docs/ko/visualization.md +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/docs/ko/voice/pipeline.md +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/docs/ko/voice/quickstart.md +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/docs/ko/voice/tracing.md +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/docs/llms-full.txt +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/docs/llms.txt +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/docs/mcp.md +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/docs/models/index.md +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/docs/models/litellm.md +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/docs/multi_agent.md +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/docs/quickstart.md +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/docs/realtime/guide.md +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/docs/realtime/quickstart.md +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/docs/ref/agent.md +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/docs/ref/agent_output.md +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/docs/ref/computer.md +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/docs/ref/exceptions.md +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/docs/ref/extensions/handoff_filters.md +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/docs/ref/extensions/handoff_prompt.md +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/docs/ref/extensions/litellm.md +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/docs/ref/extensions/memory/advanced_sqlite_session.md +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/docs/ref/extensions/memory/encrypt_session.md +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/docs/ref/extensions/memory/redis_session.md +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/docs/ref/extensions/memory/sqlalchemy_session.md +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/docs/ref/extensions/models/litellm_model.md +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/docs/ref/extensions/models/litellm_provider.md +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/docs/ref/extensions/visualization.md +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/docs/ref/function_schema.md +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/docs/ref/guardrail.md +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/docs/ref/handoffs.md +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/docs/ref/index.md +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/docs/ref/items.md +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/docs/ref/lifecycle.md +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/docs/ref/logger.md +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/docs/ref/mcp/server.md +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/docs/ref/mcp/util.md +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/docs/ref/memory/openai_conversations_session.md +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/docs/ref/memory/session.md +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/docs/ref/memory/sqlite_session.md +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/docs/ref/memory/util.md +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/docs/ref/memory.md +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/docs/ref/model_settings.md +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/docs/ref/models/chatcmpl_converter.md +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/docs/ref/models/chatcmpl_helpers.md +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/docs/ref/models/chatcmpl_stream_handler.md +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/docs/ref/models/default_models.md +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/docs/ref/models/fake_id.md +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/docs/ref/models/interface.md +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/docs/ref/models/multi_provider.md +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/docs/ref/models/openai_chatcompletions.md +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/docs/ref/models/openai_provider.md +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/docs/ref/models/openai_responses.md +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/docs/ref/prompts.md +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/docs/ref/realtime/agent.md +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/docs/ref/realtime/audio_formats.md +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/docs/ref/realtime/config.md +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/docs/ref/realtime/events.md +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/docs/ref/realtime/handoffs.md +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/docs/ref/realtime/items.md +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/docs/ref/realtime/model.md +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/docs/ref/realtime/model_events.md +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/docs/ref/realtime/model_inputs.md +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/docs/ref/realtime/openai_realtime.md +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/docs/ref/realtime/runner.md +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/docs/ref/realtime/session.md +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/docs/ref/repl.md +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/docs/ref/result.md +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/docs/ref/run.md +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/docs/ref/run_context.md +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/docs/ref/stream_events.md +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/docs/ref/strict_schema.md +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/docs/ref/tool.md +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/docs/ref/tool_context.md +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/docs/ref/tool_guardrails.md +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/docs/ref/tracing/create.md +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/docs/ref/tracing/index.md +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/docs/ref/tracing/logger.md +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/docs/ref/tracing/processor_interface.md +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/docs/ref/tracing/processors.md +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/docs/ref/tracing/provider.md +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/docs/ref/tracing/scope.md +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/docs/ref/tracing/setup.md +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/docs/ref/tracing/span_data.md +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/docs/ref/tracing/spans.md +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/docs/ref/tracing/traces.md +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/docs/ref/tracing/util.md +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/docs/ref/usage.md +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/docs/ref/version.md +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/docs/ref/voice/events.md +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/docs/ref/voice/exceptions.md +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/docs/ref/voice/imports.md +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/docs/ref/voice/input.md +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/docs/ref/voice/model.md +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/docs/ref/voice/models/openai_model_provider.md +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/docs/ref/voice/models/openai_provider.md +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/docs/ref/voice/models/openai_stt.md +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/docs/ref/voice/models/openai_tts.md +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/docs/ref/voice/pipeline.md +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/docs/ref/voice/pipeline_config.md +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/docs/ref/voice/result.md +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/docs/ref/voice/utils.md +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/docs/ref/voice/workflow.md +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/docs/release.md +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/docs/repl.md +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/docs/results.md +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/docs/running_agents.md +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/docs/scripts/generate_ref_files.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/docs/scripts/translate_docs.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/docs/sessions/advanced_sqlite_session.md +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/docs/sessions/encrypted_session.md +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/docs/sessions/index.md +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/docs/sessions/sqlalchemy_session.md +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/docs/streaming.md +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/docs/stylesheets/extra.css +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/docs/tools.md +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/docs/tracing.md +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/docs/usage.md +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/docs/visualization.md +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/docs/voice/pipeline.md +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/docs/voice/quickstart.md +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/docs/voice/tracing.md +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/docs/zh/agents.md +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/docs/zh/config.md +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/docs/zh/context.md +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/docs/zh/examples.md +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/docs/zh/guardrails.md +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/docs/zh/handoffs.md +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/docs/zh/index.md +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/docs/zh/mcp.md +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/docs/zh/models/index.md +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/docs/zh/models/litellm.md +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/docs/zh/multi_agent.md +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/docs/zh/quickstart.md +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/docs/zh/realtime/guide.md +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/docs/zh/realtime/quickstart.md +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/docs/zh/release.md +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/docs/zh/repl.md +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/docs/zh/results.md +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/docs/zh/running_agents.md +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/docs/zh/sessions/advanced_sqlite_session.md +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/docs/zh/sessions/encrypted_session.md +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/docs/zh/sessions/index.md +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/docs/zh/sessions/sqlalchemy_session.md +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/docs/zh/sessions.md +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/docs/zh/streaming.md +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/docs/zh/tools.md +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/docs/zh/tracing.md +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/docs/zh/usage.md +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/docs/zh/visualization.md +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/docs/zh/voice/pipeline.md +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/docs/zh/voice/quickstart.md +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/docs/zh/voice/tracing.md +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/examples/__init__.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/examples/agent_patterns/README.md +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/examples/agent_patterns/agents_as_tools.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/examples/agent_patterns/agents_as_tools_conditional.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/examples/agent_patterns/deterministic.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/examples/agent_patterns/forcing_tool_use.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/examples/agent_patterns/input_guardrails.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/examples/agent_patterns/llm_as_a_judge.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/examples/agent_patterns/output_guardrails.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/examples/agent_patterns/parallelization.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/examples/agent_patterns/routing.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/examples/agent_patterns/streaming_guardrails.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/examples/basic/agent_lifecycle_example.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/examples/basic/dynamic_system_prompt.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/examples/basic/hello_world.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/examples/basic/hello_world_gpt_5.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/examples/basic/hello_world_gpt_oss.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/examples/basic/hello_world_jupyter.ipynb +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/examples/basic/image_tool_output.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/examples/basic/lifecycle_example.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/examples/basic/local_file.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/examples/basic/local_image.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/examples/basic/media/image_bison.jpg +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/examples/basic/media/partial_o3-and-o4-mini-system-card.pdf +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/examples/basic/non_strict_output_type.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/examples/basic/previous_response_id.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/examples/basic/prompt_template.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/examples/basic/remote_image.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/examples/basic/remote_pdf.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/examples/basic/stream_function_call_args.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/examples/basic/stream_items.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/examples/basic/stream_text.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/examples/basic/tool_guardrails.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/examples/basic/tools.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/examples/basic/usage_tracking.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/examples/customer_service/main.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/examples/financial_research_agent/README.md +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/examples/financial_research_agent/__init__.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/examples/financial_research_agent/agents/__init__.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/examples/financial_research_agent/agents/financials_agent.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/examples/financial_research_agent/agents/planner_agent.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/examples/financial_research_agent/agents/risk_agent.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/examples/financial_research_agent/agents/search_agent.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/examples/financial_research_agent/agents/verifier_agent.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/examples/financial_research_agent/agents/writer_agent.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/examples/financial_research_agent/main.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/examples/financial_research_agent/manager.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/examples/financial_research_agent/printer.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/examples/handoffs/message_filter.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/examples/handoffs/message_filter_streaming.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/examples/hosted_mcp/__init__.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/examples/hosted_mcp/approvals.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/examples/hosted_mcp/connectors.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/examples/hosted_mcp/simple.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/examples/mcp/filesystem_example/README.md +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/examples/mcp/filesystem_example/main.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/examples/mcp/filesystem_example/sample_files/favorite_books.txt +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/examples/mcp/filesystem_example/sample_files/favorite_cities.txt +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/examples/mcp/filesystem_example/sample_files/favorite_songs.txt +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/examples/mcp/git_example/README.md +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/examples/mcp/git_example/main.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/examples/mcp/prompt_server/README.md +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/examples/mcp/prompt_server/main.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/examples/mcp/prompt_server/server.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/examples/mcp/sse_example/README.md +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/examples/mcp/sse_example/main.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/examples/mcp/sse_example/server.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/examples/mcp/streamablehttp_custom_client_example/README.md +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/examples/mcp/streamablehttp_custom_client_example/main.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/examples/mcp/streamablehttp_custom_client_example/server.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/examples/mcp/streamablehttp_example/README.md +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/examples/mcp/streamablehttp_example/main.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/examples/mcp/streamablehttp_example/server.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/examples/memory/advanced_sqlite_session_example.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/examples/memory/encrypted_session_example.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/examples/memory/openai_session_example.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/examples/memory/redis_session_example.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/examples/memory/sqlalchemy_session_example.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/examples/memory/sqlite_session_example.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/examples/model_providers/README.md +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/examples/model_providers/custom_example_agent.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/examples/model_providers/custom_example_global.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/examples/model_providers/custom_example_provider.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/examples/model_providers/litellm_auto.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/examples/model_providers/litellm_provider.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/examples/realtime/app/README.md +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/examples/realtime/app/static/app.js +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/examples/realtime/app/static/audio-playback.worklet.js +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/examples/realtime/app/static/audio-recorder.worklet.js +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/examples/realtime/app/static/favicon.ico +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/examples/realtime/app/static/index.html +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/examples/realtime/cli/demo.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/examples/realtime/twilio/README.md +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/examples/realtime/twilio/__init__.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/examples/realtime/twilio/requirements.txt +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/examples/realtime/twilio/server.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/examples/realtime/twilio/twilio_handler.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/examples/reasoning_content/__init__.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/examples/reasoning_content/gpt_oss_stream.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/examples/reasoning_content/main.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/examples/reasoning_content/runner_example.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/examples/research_bot/README.md +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/examples/research_bot/__init__.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/examples/research_bot/agents/__init__.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/examples/research_bot/agents/planner_agent.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/examples/research_bot/agents/search_agent.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/examples/research_bot/agents/writer_agent.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/examples/research_bot/main.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/examples/research_bot/manager.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/examples/research_bot/printer.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/examples/research_bot/sample_outputs/product_recs.md +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/examples/research_bot/sample_outputs/product_recs.txt +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/examples/research_bot/sample_outputs/vacation.md +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/examples/research_bot/sample_outputs/vacation.txt +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/examples/tools/code_interpreter.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/examples/tools/computer_use.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/examples/tools/file_search.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/examples/tools/image_generator.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/examples/tools/local_shell.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/examples/tools/web_search.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/examples/tools/web_search_filters.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/examples/voice/__init__.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/examples/voice/static/README.md +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/examples/voice/static/__init__.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/examples/voice/static/main.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/examples/voice/static/util.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/examples/voice/streamed/README.md +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/examples/voice/streamed/__init__.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/examples/voice/streamed/main.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/examples/voice/streamed/my_workflow.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/mkdocs.yml +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/src/agents/__init__.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/src/agents/_config.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/src/agents/_debug.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/src/agents/_run_impl.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/src/agents/agent.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/src/agents/agent_output.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/src/agents/computer.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/src/agents/exceptions.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/src/agents/extensions/__init__.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/src/agents/extensions/handoff_filters.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/src/agents/extensions/handoff_prompt.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/src/agents/extensions/memory/__init__.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/src/agents/extensions/memory/advanced_sqlite_session.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/src/agents/extensions/memory/encrypt_session.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/src/agents/extensions/memory/redis_session.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/src/agents/extensions/memory/sqlalchemy_session.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/src/agents/extensions/models/__init__.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/src/agents/extensions/models/litellm_provider.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/src/agents/extensions/visualization.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/src/agents/function_schema.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/src/agents/guardrail.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/src/agents/handoffs.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/src/agents/items.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/src/agents/lifecycle.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/src/agents/logger.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/src/agents/mcp/__init__.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/src/agents/mcp/server.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/src/agents/mcp/util.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/src/agents/memory/__init__.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/src/agents/memory/openai_conversations_session.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/src/agents/memory/session.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/src/agents/memory/sqlite_session.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/src/agents/memory/util.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/src/agents/model_settings.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/src/agents/models/__init__.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/src/agents/models/_openai_shared.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/src/agents/models/chatcmpl_converter.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/src/agents/models/chatcmpl_helpers.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/src/agents/models/default_models.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/src/agents/models/fake_id.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/src/agents/models/interface.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/src/agents/models/multi_provider.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/src/agents/models/openai_chatcompletions.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/src/agents/models/openai_provider.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/src/agents/models/openai_responses.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/src/agents/prompts.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/src/agents/py.typed +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/src/agents/realtime/README.md +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/src/agents/realtime/__init__.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/src/agents/realtime/_default_tracker.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/src/agents/realtime/_util.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/src/agents/realtime/agent.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/src/agents/realtime/audio_formats.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/src/agents/realtime/events.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/src/agents/realtime/handoffs.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/src/agents/realtime/items.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/src/agents/realtime/model.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/src/agents/realtime/model_events.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/src/agents/realtime/model_inputs.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/src/agents/realtime/openai_realtime.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/src/agents/realtime/runner.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/src/agents/repl.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/src/agents/result.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/src/agents/run.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/src/agents/run_context.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/src/agents/stream_events.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/src/agents/strict_schema.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/src/agents/tool.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/src/agents/tool_context.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/src/agents/tool_guardrails.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/src/agents/tracing/__init__.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/src/agents/tracing/create.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/src/agents/tracing/logger.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/src/agents/tracing/processor_interface.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/src/agents/tracing/processors.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/src/agents/tracing/provider.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/src/agents/tracing/scope.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/src/agents/tracing/setup.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/src/agents/tracing/span_data.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/src/agents/tracing/spans.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/src/agents/tracing/traces.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/src/agents/tracing/util.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/src/agents/usage.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/src/agents/util/__init__.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/src/agents/util/_coro.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/src/agents/util/_error_tracing.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/src/agents/util/_json.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/src/agents/util/_pretty_print.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/src/agents/util/_transforms.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/src/agents/util/_types.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/src/agents/version.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/src/agents/voice/__init__.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/src/agents/voice/events.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/src/agents/voice/exceptions.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/src/agents/voice/imports.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/src/agents/voice/input.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/src/agents/voice/model.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/src/agents/voice/models/__init__.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/src/agents/voice/models/openai_model_provider.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/src/agents/voice/models/openai_stt.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/src/agents/voice/models/openai_tts.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/src/agents/voice/pipeline.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/src/agents/voice/pipeline_config.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/src/agents/voice/result.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/src/agents/voice/utils.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/src/agents/voice/workflow.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/tests/README.md +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/tests/__init__.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/tests/conftest.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/tests/extensions/memory/test_advanced_sqlite_session.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/tests/extensions/memory/test_encrypt_session.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/tests/extensions/memory/test_redis_session.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/tests/extensions/memory/test_sqlalchemy_session.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/tests/fake_model.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/tests/fastapi/__init__.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/tests/fastapi/streaming_app.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/tests/fastapi/test_streaming_context.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/tests/mcp/__init__.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/tests/mcp/conftest.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/tests/mcp/helpers.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/tests/mcp/test_caching.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/tests/mcp/test_client_session_retries.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/tests/mcp/test_connect_disconnect.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/tests/mcp/test_mcp_tracing.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/tests/mcp/test_mcp_util.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/tests/mcp/test_message_handler.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/tests/mcp/test_prompt_server.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/tests/mcp/test_runner_calls_mcp.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/tests/mcp/test_server_errors.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/tests/mcp/test_streamable_http_client_factory.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/tests/mcp/test_tool_filtering.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/tests/model_settings/test_serialization.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/tests/models/__init__.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/tests/models/conftest.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/tests/models/test_default_models.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/tests/models/test_litellm_chatcompletions_stream.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/tests/models/test_litellm_user_agent.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/tests/models/test_map.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/tests/realtime/__init__.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/tests/realtime/test_agent.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/tests/realtime/test_audio_formats_unit.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/tests/realtime/test_conversion_helpers.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/tests/realtime/test_ga_session_update_normalization.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/tests/realtime/test_item_parsing.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/tests/realtime/test_model_events.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/tests/realtime/test_openai_realtime_conversions.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/tests/realtime/test_playback_tracker.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/tests/realtime/test_playback_tracker_manual_unit.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/tests/realtime/test_realtime_handoffs.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/tests/realtime/test_runner.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/tests/realtime/test_session_payload_and_formats.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/tests/realtime/test_tracing.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/tests/test_agent_as_tool.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/tests/test_agent_clone_shallow_copy.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/tests/test_agent_config.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/tests/test_agent_hooks.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/tests/test_agent_instructions_signature.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/tests/test_agent_llm_hooks.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/tests/test_agent_prompt.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/tests/test_agent_runner.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/tests/test_agent_runner_streamed.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/tests/test_agent_tracing.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/tests/test_anthropic_thinking_blocks.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/tests/test_call_model_input_filter.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/tests/test_call_model_input_filter_unit.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/tests/test_cancel_streaming.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/tests/test_computer_action.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/tests/test_config.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/tests/test_debug.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/tests/test_doc_parsing.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/tests/test_extended_thinking_message_order.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/tests/test_extension_filters.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/tests/test_extra_headers.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/tests/test_function_schema.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/tests/test_function_tool.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/tests/test_function_tool_decorator.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/tests/test_global_hooks.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/tests/test_guardrails.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/tests/test_handoff_tool.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/tests/test_items_helpers.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/tests/test_local_shell_tool.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/tests/test_logprobs.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/tests/test_max_turns.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/tests/test_model_payload_iterators.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/tests/test_openai_chatcompletions.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/tests/test_openai_chatcompletions_converter.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/tests/test_openai_chatcompletions_stream.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/tests/test_openai_conversations_session.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/tests/test_openai_responses.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/tests/test_openai_responses_converter.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/tests/test_output_tool.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/tests/test_pretty_print.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/tests/test_reasoning_content.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/tests/test_repl.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/tests/test_responses.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/tests/test_responses_tracing.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/tests/test_result_cast.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/tests/test_run.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/tests/test_run_config.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/tests/test_run_error_details.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/tests/test_run_hooks.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/tests/test_run_step_execution.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/tests/test_run_step_processing.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/tests/test_session.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/tests/test_session_exceptions.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/tests/test_soft_cancel.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/tests/test_stream_events.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/tests/test_stream_input_guardrail_timing.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/tests/test_streaming_tool_call_arguments.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/tests/test_strict_schema.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/tests/test_strict_schema_oneof.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/tests/test_tool_choice_reset.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/tests/test_tool_converter.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/tests/test_tool_guardrails.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/tests/test_tool_output_conversion.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/tests/test_tool_use_behavior.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/tests/test_trace_processor.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/tests/test_tracing.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/tests/test_tracing_errors.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/tests/test_tracing_errors_streamed.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/tests/test_usage.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/tests/test_visualization.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/tests/testing_processor.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/tests/tracing/test_processor_api_key.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/tests/tracing/test_set_api_key_fix.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/tests/utils/simple_session.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/tests/utils/test_json.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/tests/voice/__init__.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/tests/voice/conftest.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/tests/voice/fake_models.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/tests/voice/helpers.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/tests/voice/test_input.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/tests/voice/test_openai_stt.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/tests/voice/test_openai_tts.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/tests/voice/test_pipeline.py +0 -0
- {openai_agents-0.4.1 → openai_agents-0.4.2}/tests/voice/test_workflow.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: openai-agents
|
|
3
|
-
Version: 0.4.
|
|
3
|
+
Version: 0.4.2
|
|
4
4
|
Summary: OpenAI Agents SDK
|
|
5
5
|
Project-URL: Homepage, https://openai.github.io/openai-agents-python/
|
|
6
6
|
Project-URL: Repository, https://github.com/openai/openai-agents-python
|
|
@@ -44,7 +44,7 @@ Requires-Dist: numpy<3,>=2.2.0; (python_version >= '3.10') and extra == 'voice'
|
|
|
44
44
|
Requires-Dist: websockets<16,>=15.0; extra == 'voice'
|
|
45
45
|
Description-Content-Type: text/markdown
|
|
46
46
|
|
|
47
|
-
# OpenAI Agents SDK
|
|
47
|
+
# OpenAI Agents SDK [](https://pypi.org/project/openai-agents/)
|
|
48
48
|
|
|
49
49
|
The OpenAI Agents SDK is a lightweight yet powerful framework for building multi-agent workflows. It is provider-agnostic, supporting the OpenAI Responses and Chat Completions APIs, as well as 100+ other LLMs.
|
|
50
50
|
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# OpenAI Agents SDK
|
|
1
|
+
# OpenAI Agents SDK [](https://pypi.org/project/openai-agents/)
|
|
2
2
|
|
|
3
3
|
The OpenAI Agents SDK is a lightweight yet powerful framework for building multi-agent workflows. It is provider-agnostic, supporting the OpenAI Responses and Chat Completions APIs, as well as 100+ other LLMs.
|
|
4
4
|
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import asyncio
|
|
2
|
+
|
|
1
3
|
from agents import function_tool
|
|
2
4
|
from agents.extensions.handoff_prompt import RECOMMENDED_PROMPT_PREFIX
|
|
3
5
|
from agents.realtime import RealtimeAgent, realtime_handoff
|
|
@@ -13,20 +15,26 @@ will use the agent returned from get_starting_agent() as the starting agent."""
|
|
|
13
15
|
name_override="faq_lookup_tool", description_override="Lookup frequently asked questions."
|
|
14
16
|
)
|
|
15
17
|
async def faq_lookup_tool(question: str) -> str:
|
|
16
|
-
|
|
18
|
+
print("faq_lookup_tool called with question:", question)
|
|
19
|
+
|
|
20
|
+
# Simulate a slow API call
|
|
21
|
+
await asyncio.sleep(3)
|
|
22
|
+
|
|
23
|
+
q = question.lower()
|
|
24
|
+
if "wifi" in q or "wi-fi" in q:
|
|
25
|
+
return "We have free wifi on the plane, join Airline-Wifi"
|
|
26
|
+
elif "bag" in q or "baggage" in q:
|
|
17
27
|
return (
|
|
18
28
|
"You are allowed to bring one bag on the plane. "
|
|
19
29
|
"It must be under 50 pounds and 22 inches x 14 inches x 9 inches."
|
|
20
30
|
)
|
|
21
|
-
elif "seats" in
|
|
31
|
+
elif "seats" in q or "plane" in q:
|
|
22
32
|
return (
|
|
23
33
|
"There are 120 seats on the plane. "
|
|
24
34
|
"There are 22 business class seats and 98 economy seats. "
|
|
25
35
|
"Exit rows are rows 4 and 16. "
|
|
26
36
|
"Rows 5-8 are Economy Plus, with extra legroom. "
|
|
27
37
|
)
|
|
28
|
-
elif "wifi" in question:
|
|
29
|
-
return "We have free wifi on the plane, join Airline-Wifi"
|
|
30
38
|
return "I'm sorry, I don't know the answer to that question."
|
|
31
39
|
|
|
32
40
|
|
|
@@ -47,6 +47,9 @@ class RealtimeWebSocketManager:
|
|
|
47
47
|
|
|
48
48
|
agent = get_starting_agent()
|
|
49
49
|
runner = RealtimeRunner(agent)
|
|
50
|
+
# If you want to customize the runner behavior, you can pass options:
|
|
51
|
+
# runner_config = RealtimeRunConfig(async_tool_calls=False)
|
|
52
|
+
# runner = RealtimeRunner(agent, config=runner_config)
|
|
50
53
|
model_config: RealtimeModelConfig = {
|
|
51
54
|
"initial_model_settings": {
|
|
52
55
|
"turn_detection": {
|
|
@@ -110,18 +110,26 @@ class LitellmModel(Model):
|
|
|
110
110
|
prompt=prompt,
|
|
111
111
|
)
|
|
112
112
|
|
|
113
|
-
|
|
113
|
+
message: litellm.types.utils.Message | None = None
|
|
114
|
+
first_choice: litellm.types.utils.Choices | None = None
|
|
115
|
+
if response.choices and len(response.choices) > 0:
|
|
116
|
+
choice = response.choices[0]
|
|
117
|
+
if isinstance(choice, litellm.types.utils.Choices):
|
|
118
|
+
first_choice = choice
|
|
119
|
+
message = first_choice.message
|
|
114
120
|
|
|
115
121
|
if _debug.DONT_LOG_MODEL_DATA:
|
|
116
122
|
logger.debug("Received model response")
|
|
117
123
|
else:
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
124
|
+
if message is not None:
|
|
125
|
+
logger.debug(
|
|
126
|
+
f"""LLM resp:\n{
|
|
127
|
+
json.dumps(message.model_dump(), indent=2, ensure_ascii=False)
|
|
128
|
+
}\n"""
|
|
129
|
+
)
|
|
130
|
+
else:
|
|
131
|
+
finish_reason = first_choice.finish_reason if first_choice else "-"
|
|
132
|
+
logger.debug(f"LLM resp had no message. finish_reason: {finish_reason}")
|
|
125
133
|
|
|
126
134
|
if hasattr(response, "usage"):
|
|
127
135
|
response_usage = response.usage
|
|
@@ -152,14 +160,20 @@ class LitellmModel(Model):
|
|
|
152
160
|
logger.warning("No usage information returned from Litellm")
|
|
153
161
|
|
|
154
162
|
if tracing.include_data():
|
|
155
|
-
span_generation.span_data.output =
|
|
163
|
+
span_generation.span_data.output = (
|
|
164
|
+
[message.model_dump()] if message is not None else []
|
|
165
|
+
)
|
|
156
166
|
span_generation.span_data.usage = {
|
|
157
167
|
"input_tokens": usage.input_tokens,
|
|
158
168
|
"output_tokens": usage.output_tokens,
|
|
159
169
|
}
|
|
160
170
|
|
|
161
|
-
items =
|
|
162
|
-
|
|
171
|
+
items = (
|
|
172
|
+
Converter.message_to_output_items(
|
|
173
|
+
LitellmConverter.convert_message_to_openai(message)
|
|
174
|
+
)
|
|
175
|
+
if message is not None
|
|
176
|
+
else []
|
|
163
177
|
)
|
|
164
178
|
|
|
165
179
|
return ModelResponse(
|
|
@@ -326,6 +340,23 @@ class LitellmModel(Model):
|
|
|
326
340
|
)
|
|
327
341
|
|
|
328
342
|
reasoning_effort = model_settings.reasoning.effort if model_settings.reasoning else None
|
|
343
|
+
# Enable developers to pass non-OpenAI compatible reasoning_effort data like "none"
|
|
344
|
+
# Priority order:
|
|
345
|
+
# 1. model_settings.reasoning.effort
|
|
346
|
+
# 2. model_settings.extra_body["reasoning_effort"]
|
|
347
|
+
# 3. model_settings.extra_args["reasoning_effort"]
|
|
348
|
+
if (
|
|
349
|
+
reasoning_effort is None # Unset in model_settings
|
|
350
|
+
and isinstance(model_settings.extra_body, dict)
|
|
351
|
+
and "reasoning_effort" in model_settings.extra_body
|
|
352
|
+
):
|
|
353
|
+
reasoning_effort = model_settings.extra_body["reasoning_effort"]
|
|
354
|
+
if (
|
|
355
|
+
reasoning_effort is None # Unset in both model_settings and model_settings.extra_body
|
|
356
|
+
and model_settings.extra_args
|
|
357
|
+
and "reasoning_effort" in model_settings.extra_args
|
|
358
|
+
):
|
|
359
|
+
reasoning_effort = model_settings.extra_args["reasoning_effort"]
|
|
329
360
|
|
|
330
361
|
stream_options = None
|
|
331
362
|
if stream and model_settings.include_usage is not None:
|
|
@@ -343,6 +374,9 @@ class LitellmModel(Model):
|
|
|
343
374
|
if model_settings.extra_args:
|
|
344
375
|
extra_kwargs.update(model_settings.extra_args)
|
|
345
376
|
|
|
377
|
+
# Prevent duplicate reasoning_effort kwargs when it was promoted to a top-level argument.
|
|
378
|
+
extra_kwargs.pop("reasoning_effort", None)
|
|
379
|
+
|
|
346
380
|
ret = await litellm.acompletion(
|
|
347
381
|
model=self.model,
|
|
348
382
|
messages=converted_messages,
|
|
@@ -150,6 +150,12 @@ class ChatCmplStreamHandler:
|
|
|
150
150
|
)
|
|
151
151
|
|
|
152
152
|
if reasoning_content and state.reasoning_content_index_and_output:
|
|
153
|
+
# Ensure summary list has at least one element
|
|
154
|
+
if not state.reasoning_content_index_and_output[1].summary:
|
|
155
|
+
state.reasoning_content_index_and_output[1].summary = [
|
|
156
|
+
Summary(text="", type="summary_text")
|
|
157
|
+
]
|
|
158
|
+
|
|
153
159
|
yield ResponseReasoningSummaryTextDeltaEvent(
|
|
154
160
|
delta=reasoning_content,
|
|
155
161
|
item_id=FAKE_RESPONSES_ID,
|
|
@@ -201,7 +207,7 @@ class ChatCmplStreamHandler:
|
|
|
201
207
|
)
|
|
202
208
|
|
|
203
209
|
# Create a new summary with updated text
|
|
204
|
-
if state.reasoning_content_index_and_output[1].content
|
|
210
|
+
if not state.reasoning_content_index_and_output[1].content:
|
|
205
211
|
state.reasoning_content_index_and_output[1].content = [
|
|
206
212
|
Content(text="", type="reasoning_text")
|
|
207
213
|
]
|
|
@@ -184,6 +184,9 @@ class RealtimeRunConfig(TypedDict):
|
|
|
184
184
|
tracing_disabled: NotRequired[bool]
|
|
185
185
|
"""Whether tracing is disabled for this run."""
|
|
186
186
|
|
|
187
|
+
async_tool_calls: NotRequired[bool]
|
|
188
|
+
"""Whether function tool calls should run asynchronously. Defaults to True."""
|
|
189
|
+
|
|
187
190
|
# TODO (rm) Add history audio storage config
|
|
188
191
|
|
|
189
192
|
|
|
@@ -112,7 +112,7 @@ class RealtimeSession(RealtimeModelListener):
|
|
|
112
112
|
}
|
|
113
113
|
self._event_queue: asyncio.Queue[RealtimeSessionEvent] = asyncio.Queue()
|
|
114
114
|
self._closed = False
|
|
115
|
-
self._stored_exception:
|
|
115
|
+
self._stored_exception: BaseException | None = None
|
|
116
116
|
|
|
117
117
|
# Guardrails state tracking
|
|
118
118
|
self._interrupted_response_ids: set[str] = set()
|
|
@@ -123,6 +123,8 @@ class RealtimeSession(RealtimeModelListener):
|
|
|
123
123
|
)
|
|
124
124
|
|
|
125
125
|
self._guardrail_tasks: set[asyncio.Task[Any]] = set()
|
|
126
|
+
self._tool_call_tasks: set[asyncio.Task[Any]] = set()
|
|
127
|
+
self._async_tool_calls: bool = bool(self._run_config.get("async_tool_calls", True))
|
|
126
128
|
|
|
127
129
|
@property
|
|
128
130
|
def model(self) -> RealtimeModel:
|
|
@@ -216,7 +218,11 @@ class RealtimeSession(RealtimeModelListener):
|
|
|
216
218
|
if event.type == "error":
|
|
217
219
|
await self._put_event(RealtimeError(info=self._event_info, error=event.error))
|
|
218
220
|
elif event.type == "function_call":
|
|
219
|
-
|
|
221
|
+
agent_snapshot = self._current_agent
|
|
222
|
+
if self._async_tool_calls:
|
|
223
|
+
self._enqueue_tool_call_task(event, agent_snapshot)
|
|
224
|
+
else:
|
|
225
|
+
await self._handle_tool_call(event, agent_snapshot=agent_snapshot)
|
|
220
226
|
elif event.type == "audio":
|
|
221
227
|
await self._put_event(
|
|
222
228
|
RealtimeAudio(
|
|
@@ -384,11 +390,17 @@ class RealtimeSession(RealtimeModelListener):
|
|
|
384
390
|
"""Put an event into the queue."""
|
|
385
391
|
await self._event_queue.put(event)
|
|
386
392
|
|
|
387
|
-
async def _handle_tool_call(
|
|
393
|
+
async def _handle_tool_call(
|
|
394
|
+
self,
|
|
395
|
+
event: RealtimeModelToolCallEvent,
|
|
396
|
+
*,
|
|
397
|
+
agent_snapshot: RealtimeAgent | None = None,
|
|
398
|
+
) -> None:
|
|
388
399
|
"""Handle a tool call event."""
|
|
400
|
+
agent = agent_snapshot or self._current_agent
|
|
389
401
|
tools, handoffs = await asyncio.gather(
|
|
390
|
-
|
|
391
|
-
self._get_handoffs(
|
|
402
|
+
agent.get_all_tools(self._context_wrapper),
|
|
403
|
+
self._get_handoffs(agent, self._context_wrapper),
|
|
392
404
|
)
|
|
393
405
|
function_map = {tool.name: tool for tool in tools if isinstance(tool, FunctionTool)}
|
|
394
406
|
handoff_map = {handoff.tool_name: handoff for handoff in handoffs}
|
|
@@ -398,7 +410,7 @@ class RealtimeSession(RealtimeModelListener):
|
|
|
398
410
|
RealtimeToolStart(
|
|
399
411
|
info=self._event_info,
|
|
400
412
|
tool=function_map[event.name],
|
|
401
|
-
agent=
|
|
413
|
+
agent=agent,
|
|
402
414
|
)
|
|
403
415
|
)
|
|
404
416
|
|
|
@@ -423,7 +435,7 @@ class RealtimeSession(RealtimeModelListener):
|
|
|
423
435
|
info=self._event_info,
|
|
424
436
|
tool=func_tool,
|
|
425
437
|
output=result,
|
|
426
|
-
agent=
|
|
438
|
+
agent=agent,
|
|
427
439
|
)
|
|
428
440
|
)
|
|
429
441
|
elif event.name in handoff_map:
|
|
@@ -444,7 +456,7 @@ class RealtimeSession(RealtimeModelListener):
|
|
|
444
456
|
)
|
|
445
457
|
|
|
446
458
|
# Store previous agent for event
|
|
447
|
-
previous_agent =
|
|
459
|
+
previous_agent = agent
|
|
448
460
|
|
|
449
461
|
# Update current agent
|
|
450
462
|
self._current_agent = result
|
|
@@ -752,10 +764,49 @@ class RealtimeSession(RealtimeModelListener):
|
|
|
752
764
|
task.cancel()
|
|
753
765
|
self._guardrail_tasks.clear()
|
|
754
766
|
|
|
767
|
+
def _enqueue_tool_call_task(
|
|
768
|
+
self, event: RealtimeModelToolCallEvent, agent_snapshot: RealtimeAgent
|
|
769
|
+
) -> None:
|
|
770
|
+
"""Run tool calls in the background to avoid blocking realtime transport."""
|
|
771
|
+
task = asyncio.create_task(self._handle_tool_call(event, agent_snapshot=agent_snapshot))
|
|
772
|
+
self._tool_call_tasks.add(task)
|
|
773
|
+
task.add_done_callback(self._on_tool_call_task_done)
|
|
774
|
+
|
|
775
|
+
def _on_tool_call_task_done(self, task: asyncio.Task[Any]) -> None:
|
|
776
|
+
self._tool_call_tasks.discard(task)
|
|
777
|
+
|
|
778
|
+
if task.cancelled():
|
|
779
|
+
return
|
|
780
|
+
|
|
781
|
+
exception = task.exception()
|
|
782
|
+
if exception is None:
|
|
783
|
+
return
|
|
784
|
+
|
|
785
|
+
logger.exception("Realtime tool call task failed", exc_info=exception)
|
|
786
|
+
|
|
787
|
+
if self._stored_exception is None:
|
|
788
|
+
self._stored_exception = exception
|
|
789
|
+
|
|
790
|
+
asyncio.create_task(
|
|
791
|
+
self._put_event(
|
|
792
|
+
RealtimeError(
|
|
793
|
+
info=self._event_info,
|
|
794
|
+
error={"message": f"Tool call task failed: {exception}"},
|
|
795
|
+
)
|
|
796
|
+
)
|
|
797
|
+
)
|
|
798
|
+
|
|
799
|
+
def _cleanup_tool_call_tasks(self) -> None:
|
|
800
|
+
for task in self._tool_call_tasks:
|
|
801
|
+
if not task.done():
|
|
802
|
+
task.cancel()
|
|
803
|
+
self._tool_call_tasks.clear()
|
|
804
|
+
|
|
755
805
|
async def _cleanup(self) -> None:
|
|
756
806
|
"""Clean up all resources and mark session as closed."""
|
|
757
807
|
# Cancel and cleanup guardrail tasks
|
|
758
808
|
self._cleanup_guardrail_tasks()
|
|
809
|
+
self._cleanup_tool_call_tasks()
|
|
759
810
|
|
|
760
811
|
# Remove ourselves as a listener
|
|
761
812
|
self._model.remove_listener(self)
|
|
@@ -176,3 +176,41 @@ async def test_empty_kwargs_handling(monkeypatch):
|
|
|
176
176
|
|
|
177
177
|
# Should work without error and include regular parameters
|
|
178
178
|
assert captured["temperature"] == 0.3
|
|
179
|
+
|
|
180
|
+
|
|
181
|
+
@pytest.mark.allow_call_model_methods
|
|
182
|
+
@pytest.mark.asyncio
|
|
183
|
+
async def test_reasoning_effort_falls_back_to_extra_args(monkeypatch):
|
|
184
|
+
"""
|
|
185
|
+
Ensure reasoning_effort from extra_args is promoted when reasoning settings are missing.
|
|
186
|
+
"""
|
|
187
|
+
captured: dict[str, object] = {}
|
|
188
|
+
|
|
189
|
+
async def fake_acompletion(model, messages=None, **kwargs):
|
|
190
|
+
captured.update(kwargs)
|
|
191
|
+
msg = Message(role="assistant", content="test response")
|
|
192
|
+
choice = Choices(index=0, message=msg)
|
|
193
|
+
return ModelResponse(choices=[choice], usage=Usage(0, 0, 0))
|
|
194
|
+
|
|
195
|
+
monkeypatch.setattr(litellm, "acompletion", fake_acompletion)
|
|
196
|
+
|
|
197
|
+
# GitHub issue context: https://github.com/openai/openai-agents-python/issues/1764.
|
|
198
|
+
settings = ModelSettings(
|
|
199
|
+
extra_args={"reasoning_effort": "none", "custom_param": "custom_value"}
|
|
200
|
+
)
|
|
201
|
+
model = LitellmModel(model="test-model")
|
|
202
|
+
|
|
203
|
+
await model.get_response(
|
|
204
|
+
system_instructions=None,
|
|
205
|
+
input="test input",
|
|
206
|
+
model_settings=settings,
|
|
207
|
+
tools=[],
|
|
208
|
+
output_schema=None,
|
|
209
|
+
handoffs=[],
|
|
210
|
+
tracing=ModelTracing.DISABLED,
|
|
211
|
+
previous_response_id=None,
|
|
212
|
+
)
|
|
213
|
+
|
|
214
|
+
assert captured["reasoning_effort"] == "none"
|
|
215
|
+
assert captured["custom_param"] == "custom_value"
|
|
216
|
+
assert settings.extra_args == {"reasoning_effort": "none", "custom_param": "custom_value"}
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
import litellm
|
|
2
|
+
import pytest
|
|
3
|
+
from litellm.types.utils import Choices, Message, ModelResponse, Usage
|
|
4
|
+
|
|
5
|
+
from agents.extensions.models.litellm_model import LitellmModel
|
|
6
|
+
from agents.model_settings import ModelSettings
|
|
7
|
+
from agents.models.interface import ModelTracing
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
@pytest.mark.allow_call_model_methods
|
|
11
|
+
@pytest.mark.asyncio
|
|
12
|
+
async def test_extra_body_is_forwarded(monkeypatch):
|
|
13
|
+
"""
|
|
14
|
+
Forward `extra_body` entries into litellm.acompletion kwargs.
|
|
15
|
+
|
|
16
|
+
This ensures that user-provided parameters (e.g. cached_content)
|
|
17
|
+
arrive alongside default arguments.
|
|
18
|
+
"""
|
|
19
|
+
captured: dict[str, object] = {}
|
|
20
|
+
|
|
21
|
+
async def fake_acompletion(model, messages=None, **kwargs):
|
|
22
|
+
captured.update(kwargs)
|
|
23
|
+
msg = Message(role="assistant", content="ok")
|
|
24
|
+
choice = Choices(index=0, message=msg)
|
|
25
|
+
return ModelResponse(choices=[choice], usage=Usage(0, 0, 0))
|
|
26
|
+
|
|
27
|
+
monkeypatch.setattr(litellm, "acompletion", fake_acompletion)
|
|
28
|
+
settings = ModelSettings(
|
|
29
|
+
temperature=0.1, extra_body={"cached_content": "some_cache", "foo": 123}
|
|
30
|
+
)
|
|
31
|
+
model = LitellmModel(model="test-model")
|
|
32
|
+
|
|
33
|
+
await model.get_response(
|
|
34
|
+
system_instructions=None,
|
|
35
|
+
input=[],
|
|
36
|
+
model_settings=settings,
|
|
37
|
+
tools=[],
|
|
38
|
+
output_schema=None,
|
|
39
|
+
handoffs=[],
|
|
40
|
+
tracing=ModelTracing.DISABLED,
|
|
41
|
+
previous_response_id=None,
|
|
42
|
+
)
|
|
43
|
+
|
|
44
|
+
assert {"cached_content": "some_cache", "foo": 123}.items() <= captured.items()
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
@pytest.mark.allow_call_model_methods
|
|
48
|
+
@pytest.mark.asyncio
|
|
49
|
+
async def test_extra_body_reasoning_effort_is_promoted(monkeypatch):
|
|
50
|
+
"""
|
|
51
|
+
Ensure reasoning_effort from extra_body is promoted to the top-level parameter.
|
|
52
|
+
"""
|
|
53
|
+
captured: dict[str, object] = {}
|
|
54
|
+
|
|
55
|
+
async def fake_acompletion(model, messages=None, **kwargs):
|
|
56
|
+
captured.update(kwargs)
|
|
57
|
+
msg = Message(role="assistant", content="ok")
|
|
58
|
+
choice = Choices(index=0, message=msg)
|
|
59
|
+
return ModelResponse(choices=[choice], usage=Usage(0, 0, 0))
|
|
60
|
+
|
|
61
|
+
monkeypatch.setattr(litellm, "acompletion", fake_acompletion)
|
|
62
|
+
# GitHub issue context: https://github.com/openai/openai-agents-python/issues/1764.
|
|
63
|
+
settings = ModelSettings(
|
|
64
|
+
extra_body={"reasoning_effort": "none", "cached_content": "some_cache"}
|
|
65
|
+
)
|
|
66
|
+
model = LitellmModel(model="test-model")
|
|
67
|
+
|
|
68
|
+
await model.get_response(
|
|
69
|
+
system_instructions=None,
|
|
70
|
+
input=[],
|
|
71
|
+
model_settings=settings,
|
|
72
|
+
tools=[],
|
|
73
|
+
output_schema=None,
|
|
74
|
+
handoffs=[],
|
|
75
|
+
tracing=ModelTracing.DISABLED,
|
|
76
|
+
previous_response_id=None,
|
|
77
|
+
)
|
|
78
|
+
|
|
79
|
+
assert captured["reasoning_effort"] == "none"
|
|
80
|
+
assert captured["cached_content"] == "some_cache"
|
|
81
|
+
assert settings.extra_body == {"reasoning_effort": "none", "cached_content": "some_cache"}
|
|
82
|
+
|
|
83
|
+
|
|
84
|
+
@pytest.mark.allow_call_model_methods
|
|
85
|
+
@pytest.mark.asyncio
|
|
86
|
+
async def test_reasoning_effort_prefers_model_settings(monkeypatch):
|
|
87
|
+
"""
|
|
88
|
+
Verify explicit ModelSettings.reasoning takes precedence over extra_body entries.
|
|
89
|
+
"""
|
|
90
|
+
from openai.types.shared import Reasoning
|
|
91
|
+
|
|
92
|
+
captured: dict[str, object] = {}
|
|
93
|
+
|
|
94
|
+
async def fake_acompletion(model, messages=None, **kwargs):
|
|
95
|
+
captured.update(kwargs)
|
|
96
|
+
msg = Message(role="assistant", content="ok")
|
|
97
|
+
choice = Choices(index=0, message=msg)
|
|
98
|
+
return ModelResponse(choices=[choice], usage=Usage(0, 0, 0))
|
|
99
|
+
|
|
100
|
+
monkeypatch.setattr(litellm, "acompletion", fake_acompletion)
|
|
101
|
+
settings = ModelSettings(
|
|
102
|
+
reasoning=Reasoning(effort="low"),
|
|
103
|
+
extra_body={"reasoning_effort": "high"},
|
|
104
|
+
)
|
|
105
|
+
model = LitellmModel(model="test-model")
|
|
106
|
+
|
|
107
|
+
await model.get_response(
|
|
108
|
+
system_instructions=None,
|
|
109
|
+
input=[],
|
|
110
|
+
model_settings=settings,
|
|
111
|
+
tools=[],
|
|
112
|
+
output_schema=None,
|
|
113
|
+
handoffs=[],
|
|
114
|
+
tracing=ModelTracing.DISABLED,
|
|
115
|
+
previous_response_id=None,
|
|
116
|
+
)
|
|
117
|
+
|
|
118
|
+
assert captured["reasoning_effort"] == "low"
|
|
119
|
+
assert settings.extra_body == {"reasoning_effort": "high"}
|
|
120
|
+
|
|
121
|
+
|
|
122
|
+
@pytest.mark.allow_call_model_methods
|
|
123
|
+
@pytest.mark.asyncio
|
|
124
|
+
async def test_extra_body_reasoning_effort_overrides_extra_args(monkeypatch):
|
|
125
|
+
"""
|
|
126
|
+
Ensure extra_body reasoning_effort wins over extra_args when both are provided.
|
|
127
|
+
"""
|
|
128
|
+
captured: dict[str, object] = {}
|
|
129
|
+
|
|
130
|
+
async def fake_acompletion(model, messages=None, **kwargs):
|
|
131
|
+
captured.update(kwargs)
|
|
132
|
+
msg = Message(role="assistant", content="ok")
|
|
133
|
+
choice = Choices(index=0, message=msg)
|
|
134
|
+
return ModelResponse(choices=[choice], usage=Usage(0, 0, 0))
|
|
135
|
+
|
|
136
|
+
monkeypatch.setattr(litellm, "acompletion", fake_acompletion)
|
|
137
|
+
# GitHub issue context: https://github.com/openai/openai-agents-python/issues/1764.
|
|
138
|
+
settings = ModelSettings(
|
|
139
|
+
extra_body={"reasoning_effort": "none"},
|
|
140
|
+
extra_args={"reasoning_effort": "low", "custom_param": "custom"},
|
|
141
|
+
)
|
|
142
|
+
model = LitellmModel(model="test-model")
|
|
143
|
+
|
|
144
|
+
await model.get_response(
|
|
145
|
+
system_instructions=None,
|
|
146
|
+
input=[],
|
|
147
|
+
model_settings=settings,
|
|
148
|
+
tools=[],
|
|
149
|
+
output_schema=None,
|
|
150
|
+
handoffs=[],
|
|
151
|
+
tracing=ModelTracing.DISABLED,
|
|
152
|
+
previous_response_id=None,
|
|
153
|
+
)
|
|
154
|
+
|
|
155
|
+
assert captured["reasoning_effort"] == "none"
|
|
156
|
+
assert captured["custom_param"] == "custom"
|
|
157
|
+
assert settings.extra_args == {"reasoning_effort": "low", "custom_param": "custom"}
|
|
@@ -518,9 +518,7 @@ class TestSendEventAndConfig(TestOpenAIRealtimeWebSocketModel):
|
|
|
518
518
|
model._ongoing_response = True
|
|
519
519
|
model._created_session = SimpleNamespace(
|
|
520
520
|
audio=SimpleNamespace(
|
|
521
|
-
input=SimpleNamespace(
|
|
522
|
-
turn_detection=SimpleNamespace(interrupt_response=True)
|
|
523
|
-
)
|
|
521
|
+
input=SimpleNamespace(turn_detection=SimpleNamespace(interrupt_response=True))
|
|
524
522
|
)
|
|
525
523
|
)
|
|
526
524
|
|
|
@@ -545,9 +543,7 @@ class TestSendEventAndConfig(TestOpenAIRealtimeWebSocketModel):
|
|
|
545
543
|
model._ongoing_response = True
|
|
546
544
|
model._created_session = SimpleNamespace(
|
|
547
545
|
audio=SimpleNamespace(
|
|
548
|
-
input=SimpleNamespace(
|
|
549
|
-
turn_detection=SimpleNamespace(interrupt_response=True)
|
|
550
|
-
)
|
|
546
|
+
input=SimpleNamespace(turn_detection=SimpleNamespace(interrupt_response=True))
|
|
551
547
|
)
|
|
552
548
|
)
|
|
553
549
|
|
|
@@ -561,8 +561,13 @@ class TestEventHandling:
|
|
|
561
561
|
|
|
562
562
|
@pytest.mark.asyncio
|
|
563
563
|
async def test_function_call_event_triggers_tool_handling(self, mock_model, mock_agent):
|
|
564
|
-
"""Test that function_call events trigger tool call handling"""
|
|
565
|
-
session = RealtimeSession(
|
|
564
|
+
"""Test that function_call events trigger tool call handling synchronously when disabled"""
|
|
565
|
+
session = RealtimeSession(
|
|
566
|
+
mock_model,
|
|
567
|
+
mock_agent,
|
|
568
|
+
None,
|
|
569
|
+
run_config={"async_tool_calls": False},
|
|
570
|
+
)
|
|
566
571
|
|
|
567
572
|
# Create function call event
|
|
568
573
|
function_call_event = RealtimeModelToolCallEvent(
|
|
@@ -578,7 +583,9 @@ class TestEventHandling:
|
|
|
578
583
|
await session.on_event(function_call_event)
|
|
579
584
|
|
|
580
585
|
# Should have called the tool handler
|
|
581
|
-
handle_tool_call_mock.assert_called_once_with(
|
|
586
|
+
handle_tool_call_mock.assert_called_once_with(
|
|
587
|
+
function_call_event, agent_snapshot=mock_agent
|
|
588
|
+
)
|
|
582
589
|
|
|
583
590
|
# Should still have raw event
|
|
584
591
|
assert session._event_queue.qsize() == 1
|
|
@@ -586,6 +593,36 @@ class TestEventHandling:
|
|
|
586
593
|
assert isinstance(raw_event, RealtimeRawModelEvent)
|
|
587
594
|
assert raw_event.data == function_call_event
|
|
588
595
|
|
|
596
|
+
@pytest.mark.asyncio
|
|
597
|
+
async def test_function_call_event_runs_async_by_default(self, mock_model, mock_agent):
|
|
598
|
+
"""Function call handling should be scheduled asynchronously by default"""
|
|
599
|
+
session = RealtimeSession(mock_model, mock_agent, None)
|
|
600
|
+
|
|
601
|
+
function_call_event = RealtimeModelToolCallEvent(
|
|
602
|
+
name="test_function",
|
|
603
|
+
call_id="call_async",
|
|
604
|
+
arguments='{"param": "value"}',
|
|
605
|
+
)
|
|
606
|
+
|
|
607
|
+
with pytest.MonkeyPatch().context() as m:
|
|
608
|
+
handle_tool_call_mock = AsyncMock()
|
|
609
|
+
m.setattr(session, "_handle_tool_call", handle_tool_call_mock)
|
|
610
|
+
|
|
611
|
+
await session.on_event(function_call_event)
|
|
612
|
+
|
|
613
|
+
# Let the background task run
|
|
614
|
+
await asyncio.sleep(0)
|
|
615
|
+
|
|
616
|
+
handle_tool_call_mock.assert_awaited_once_with(
|
|
617
|
+
function_call_event, agent_snapshot=mock_agent
|
|
618
|
+
)
|
|
619
|
+
|
|
620
|
+
# Raw event still enqueued
|
|
621
|
+
assert session._event_queue.qsize() == 1
|
|
622
|
+
raw_event = await session._event_queue.get()
|
|
623
|
+
assert isinstance(raw_event, RealtimeRawModelEvent)
|
|
624
|
+
assert raw_event.data == function_call_event
|
|
625
|
+
|
|
589
626
|
|
|
590
627
|
class TestHistoryManagement:
|
|
591
628
|
"""Test suite for history management and audio transcription in
|