openai-agents 0.2.1__tar.gz → 0.2.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.
Potentially problematic release.
This version of openai-agents might be problematic. Click here for more details.
- openai_agents-0.2.2/.github/workflows/update-docs.yml +60 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/PKG-INFO +1 -1
- {openai_agents-0.2.1 → openai_agents-0.2.2}/docs/scripts/translate_docs.py +2 -1
- {openai_agents-0.2.1 → openai_agents-0.2.2}/pyproject.toml +1 -1
- {openai_agents-0.2.1 → openai_agents-0.2.2}/src/agents/realtime/runner.py +1 -43
- {openai_agents-0.2.1 → openai_agents-0.2.2}/src/agents/realtime/session.py +23 -7
- {openai_agents-0.2.1 → openai_agents-0.2.2}/tests/realtime/test_runner.py +87 -62
- {openai_agents-0.2.1 → openai_agents-0.2.2}/tests/realtime/test_session.py +115 -1
- {openai_agents-0.2.1 → openai_agents-0.2.2}/tests/realtime/test_tracing.py +16 -25
- {openai_agents-0.2.1 → openai_agents-0.2.2}/tests/test_session_exceptions.py +2 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/uv.lock +1 -1
- {openai_agents-0.2.1 → openai_agents-0.2.2}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/.github/ISSUE_TEMPLATE/model_provider.md +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/.github/ISSUE_TEMPLATE/question.md +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/.github/PULL_REQUEST_TEMPLATE/pull_request_template.md +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/.github/workflows/docs.yml +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/.github/workflows/issues.yml +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/.github/workflows/publish.yml +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/.github/workflows/tests.yml +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/.gitignore +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/.prettierrc +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/.vscode/launch.json +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/.vscode/settings.json +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/AGENTS.md +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/CLAUDE.md +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/LICENSE +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/Makefile +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/README.md +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/docs/agents.md +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/docs/assets/images/favicon-platform.svg +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/docs/assets/images/graph.png +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/docs/assets/images/mcp-tracing.jpg +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/docs/assets/images/orchestration.png +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/docs/assets/logo.svg +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/docs/config.md +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/docs/context.md +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/docs/examples.md +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/docs/guardrails.md +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/docs/handoffs.md +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/docs/index.md +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/docs/ja/agents.md +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/docs/ja/config.md +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/docs/ja/context.md +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/docs/ja/examples.md +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/docs/ja/guardrails.md +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/docs/ja/handoffs.md +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/docs/ja/index.md +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/docs/ja/mcp.md +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/docs/ja/models/index.md +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/docs/ja/models/litellm.md +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/docs/ja/multi_agent.md +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/docs/ja/quickstart.md +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/docs/ja/repl.md +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/docs/ja/results.md +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/docs/ja/running_agents.md +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/docs/ja/streaming.md +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/docs/ja/tools.md +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/docs/ja/tracing.md +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/docs/ja/visualization.md +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/docs/ja/voice/pipeline.md +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/docs/ja/voice/quickstart.md +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/docs/ja/voice/tracing.md +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/docs/mcp.md +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/docs/models/index.md +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/docs/models/litellm.md +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/docs/multi_agent.md +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/docs/quickstart.md +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/docs/realtime/guide.md +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/docs/realtime/quickstart.md +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/docs/ref/agent.md +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/docs/ref/agent_output.md +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/docs/ref/exceptions.md +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/docs/ref/extensions/handoff_filters.md +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/docs/ref/extensions/handoff_prompt.md +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/docs/ref/extensions/litellm.md +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/docs/ref/function_schema.md +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/docs/ref/guardrail.md +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/docs/ref/handoffs.md +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/docs/ref/index.md +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/docs/ref/items.md +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/docs/ref/lifecycle.md +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/docs/ref/mcp/server.md +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/docs/ref/mcp/util.md +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/docs/ref/memory.md +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/docs/ref/model_settings.md +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/docs/ref/models/interface.md +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/docs/ref/models/openai_chatcompletions.md +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/docs/ref/models/openai_responses.md +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/docs/ref/realtime/agent.md +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/docs/ref/realtime/config.md +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/docs/ref/realtime/events.md +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/docs/ref/realtime/runner.md +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/docs/ref/realtime/session.md +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/docs/ref/repl.md +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/docs/ref/result.md +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/docs/ref/run.md +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/docs/ref/run_context.md +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/docs/ref/stream_events.md +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/docs/ref/tool.md +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/docs/ref/tracing/create.md +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/docs/ref/tracing/index.md +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/docs/ref/tracing/processor_interface.md +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/docs/ref/tracing/processors.md +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/docs/ref/tracing/scope.md +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/docs/ref/tracing/setup.md +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/docs/ref/tracing/span_data.md +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/docs/ref/tracing/spans.md +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/docs/ref/tracing/traces.md +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/docs/ref/tracing/util.md +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/docs/ref/usage.md +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/docs/ref/voice/events.md +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/docs/ref/voice/exceptions.md +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/docs/ref/voice/input.md +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/docs/ref/voice/model.md +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/docs/ref/voice/models/openai_provider.md +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/docs/ref/voice/models/openai_stt.md +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/docs/ref/voice/models/openai_tts.md +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/docs/ref/voice/pipeline.md +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/docs/ref/voice/pipeline_config.md +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/docs/ref/voice/result.md +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/docs/ref/voice/utils.md +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/docs/ref/voice/workflow.md +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/docs/release.md +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/docs/repl.md +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/docs/results.md +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/docs/running_agents.md +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/docs/sessions.md +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/docs/streaming.md +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/docs/stylesheets/extra.css +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/docs/tools.md +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/docs/tracing.md +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/docs/visualization.md +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/docs/voice/pipeline.md +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/docs/voice/quickstart.md +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/docs/voice/tracing.md +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/examples/__init__.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/examples/agent_patterns/README.md +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/examples/agent_patterns/agents_as_tools.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/examples/agent_patterns/deterministic.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/examples/agent_patterns/forcing_tool_use.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/examples/agent_patterns/input_guardrails.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/examples/agent_patterns/llm_as_a_judge.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/examples/agent_patterns/output_guardrails.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/examples/agent_patterns/parallelization.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/examples/agent_patterns/routing.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/examples/agent_patterns/streaming_guardrails.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/examples/basic/agent_lifecycle_example.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/examples/basic/dynamic_system_prompt.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/examples/basic/hello_world.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/examples/basic/hello_world_jupyter.ipynb +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/examples/basic/lifecycle_example.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/examples/basic/local_image.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/examples/basic/media/image_bison.jpg +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/examples/basic/non_strict_output_type.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/examples/basic/previous_response_id.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/examples/basic/prompt_template.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/examples/basic/remote_image.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/examples/basic/session_example.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/examples/basic/stream_items.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/examples/basic/stream_text.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/examples/basic/tools.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/examples/customer_service/main.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/examples/financial_research_agent/README.md +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/examples/financial_research_agent/__init__.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/examples/financial_research_agent/agents/__init__.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/examples/financial_research_agent/agents/financials_agent.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/examples/financial_research_agent/agents/planner_agent.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/examples/financial_research_agent/agents/risk_agent.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/examples/financial_research_agent/agents/search_agent.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/examples/financial_research_agent/agents/verifier_agent.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/examples/financial_research_agent/agents/writer_agent.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/examples/financial_research_agent/main.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/examples/financial_research_agent/manager.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/examples/financial_research_agent/printer.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/examples/handoffs/message_filter.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/examples/handoffs/message_filter_streaming.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/examples/hosted_mcp/__init__.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/examples/hosted_mcp/approvals.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/examples/hosted_mcp/simple.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/examples/mcp/filesystem_example/README.md +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/examples/mcp/filesystem_example/main.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/examples/mcp/filesystem_example/sample_files/favorite_books.txt +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/examples/mcp/filesystem_example/sample_files/favorite_cities.txt +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/examples/mcp/filesystem_example/sample_files/favorite_songs.txt +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/examples/mcp/git_example/README.md +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/examples/mcp/git_example/main.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/examples/mcp/prompt_server/README.md +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/examples/mcp/prompt_server/main.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/examples/mcp/prompt_server/server.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/examples/mcp/sse_example/README.md +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/examples/mcp/sse_example/main.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/examples/mcp/sse_example/server.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/examples/mcp/streamablehttp_example/README.md +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/examples/mcp/streamablehttp_example/main.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/examples/mcp/streamablehttp_example/server.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/examples/model_providers/README.md +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/examples/model_providers/custom_example_agent.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/examples/model_providers/custom_example_global.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/examples/model_providers/custom_example_provider.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/examples/model_providers/litellm_auto.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/examples/model_providers/litellm_provider.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/examples/realtime/app/README.md +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/examples/realtime/app/server.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/examples/realtime/app/static/app.js +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/examples/realtime/app/static/index.html +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/examples/realtime/cli/demo.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/examples/realtime/cli/ui.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/examples/reasoning_content/__init__.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/examples/reasoning_content/main.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/examples/reasoning_content/runner_example.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/examples/research_bot/README.md +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/examples/research_bot/__init__.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/examples/research_bot/agents/__init__.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/examples/research_bot/agents/planner_agent.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/examples/research_bot/agents/search_agent.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/examples/research_bot/agents/writer_agent.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/examples/research_bot/main.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/examples/research_bot/manager.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/examples/research_bot/printer.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/examples/research_bot/sample_outputs/product_recs.md +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/examples/research_bot/sample_outputs/product_recs.txt +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/examples/research_bot/sample_outputs/vacation.md +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/examples/research_bot/sample_outputs/vacation.txt +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/examples/tools/code_interpreter.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/examples/tools/computer_use.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/examples/tools/file_search.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/examples/tools/image_generator.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/examples/tools/web_search.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/examples/voice/__init__.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/examples/voice/static/README.md +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/examples/voice/static/__init__.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/examples/voice/static/main.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/examples/voice/static/util.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/examples/voice/streamed/README.md +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/examples/voice/streamed/__init__.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/examples/voice/streamed/main.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/examples/voice/streamed/my_workflow.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/mkdocs.yml +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/src/agents/__init__.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/src/agents/_config.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/src/agents/_debug.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/src/agents/_run_impl.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/src/agents/agent.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/src/agents/agent_output.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/src/agents/computer.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/src/agents/exceptions.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/src/agents/extensions/__init__.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/src/agents/extensions/handoff_filters.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/src/agents/extensions/handoff_prompt.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/src/agents/extensions/models/__init__.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/src/agents/extensions/models/litellm_model.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/src/agents/extensions/models/litellm_provider.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/src/agents/extensions/visualization.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/src/agents/function_schema.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/src/agents/guardrail.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/src/agents/handoffs.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/src/agents/items.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/src/agents/lifecycle.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/src/agents/logger.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/src/agents/mcp/__init__.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/src/agents/mcp/server.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/src/agents/mcp/util.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/src/agents/memory/__init__.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/src/agents/memory/session.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/src/agents/model_settings.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/src/agents/models/__init__.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/src/agents/models/_openai_shared.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/src/agents/models/chatcmpl_converter.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/src/agents/models/chatcmpl_helpers.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/src/agents/models/chatcmpl_stream_handler.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/src/agents/models/fake_id.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/src/agents/models/interface.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/src/agents/models/multi_provider.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/src/agents/models/openai_chatcompletions.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/src/agents/models/openai_provider.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/src/agents/models/openai_responses.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/src/agents/prompts.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/src/agents/py.typed +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/src/agents/realtime/README.md +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/src/agents/realtime/__init__.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/src/agents/realtime/agent.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/src/agents/realtime/config.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/src/agents/realtime/events.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/src/agents/realtime/handoffs.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/src/agents/realtime/items.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/src/agents/realtime/model.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/src/agents/realtime/model_events.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/src/agents/realtime/model_inputs.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/src/agents/realtime/openai_realtime.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/src/agents/repl.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/src/agents/result.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/src/agents/run.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/src/agents/run_context.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/src/agents/stream_events.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/src/agents/strict_schema.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/src/agents/tool.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/src/agents/tool_context.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/src/agents/tracing/__init__.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/src/agents/tracing/create.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/src/agents/tracing/logger.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/src/agents/tracing/processor_interface.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/src/agents/tracing/processors.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/src/agents/tracing/provider.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/src/agents/tracing/scope.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/src/agents/tracing/setup.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/src/agents/tracing/span_data.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/src/agents/tracing/spans.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/src/agents/tracing/traces.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/src/agents/tracing/util.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/src/agents/usage.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/src/agents/util/__init__.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/src/agents/util/_coro.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/src/agents/util/_error_tracing.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/src/agents/util/_json.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/src/agents/util/_pretty_print.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/src/agents/util/_transforms.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/src/agents/util/_types.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/src/agents/version.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/src/agents/voice/__init__.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/src/agents/voice/events.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/src/agents/voice/exceptions.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/src/agents/voice/imports.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/src/agents/voice/input.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/src/agents/voice/model.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/src/agents/voice/models/__init__.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/src/agents/voice/models/openai_model_provider.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/src/agents/voice/models/openai_stt.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/src/agents/voice/models/openai_tts.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/src/agents/voice/pipeline.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/src/agents/voice/pipeline_config.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/src/agents/voice/result.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/src/agents/voice/utils.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/src/agents/voice/workflow.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/tests/README.md +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/tests/__init__.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/tests/conftest.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/tests/fake_model.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/tests/fastapi/__init__.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/tests/fastapi/streaming_app.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/tests/fastapi/test_streaming_context.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/tests/mcp/__init__.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/tests/mcp/conftest.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/tests/mcp/helpers.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/tests/mcp/test_caching.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/tests/mcp/test_connect_disconnect.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/tests/mcp/test_mcp_tracing.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/tests/mcp/test_mcp_util.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/tests/mcp/test_prompt_server.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/tests/mcp/test_runner_calls_mcp.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/tests/mcp/test_server_errors.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/tests/mcp/test_tool_filtering.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/tests/model_settings/test_serialization.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/tests/models/__init__.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/tests/models/conftest.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/tests/models/test_kwargs_functionality.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/tests/models/test_litellm_chatcompletions_stream.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/tests/models/test_litellm_extra_body.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/tests/models/test_map.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/tests/realtime/__init__.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/tests/realtime/test_agent.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/tests/realtime/test_conversion_helpers.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/tests/realtime/test_item_parsing.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/tests/realtime/test_model_events.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/tests/realtime/test_openai_realtime.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/tests/realtime/test_realtime_handoffs.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/tests/test_agent_config.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/tests/test_agent_hooks.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/tests/test_agent_prompt.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/tests/test_agent_runner.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/tests/test_agent_runner_streamed.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/tests/test_agent_tracing.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/tests/test_cancel_streaming.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/tests/test_computer_action.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/tests/test_config.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/tests/test_doc_parsing.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/tests/test_extension_filters.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/tests/test_extra_headers.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/tests/test_function_schema.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/tests/test_function_tool.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/tests/test_function_tool_decorator.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/tests/test_global_hooks.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/tests/test_guardrails.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/tests/test_handoff_tool.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/tests/test_items_helpers.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/tests/test_max_turns.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/tests/test_openai_chatcompletions.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/tests/test_openai_chatcompletions_converter.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/tests/test_openai_chatcompletions_stream.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/tests/test_openai_responses_converter.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/tests/test_output_tool.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/tests/test_pretty_print.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/tests/test_reasoning_content.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/tests/test_repl.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/tests/test_responses.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/tests/test_responses_tracing.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/tests/test_result_cast.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/tests/test_run.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/tests/test_run_config.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/tests/test_run_error_details.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/tests/test_run_step_execution.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/tests/test_run_step_processing.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/tests/test_session.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/tests/test_strict_schema.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/tests/test_tool_choice_reset.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/tests/test_tool_converter.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/tests/test_tool_use_behavior.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/tests/test_trace_processor.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/tests/test_tracing.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/tests/test_tracing_errors.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/tests/test_tracing_errors_streamed.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/tests/test_usage.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/tests/test_visualization.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/tests/testing_processor.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/tests/tracing/test_processor_api_key.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/tests/voice/__init__.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/tests/voice/conftest.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/tests/voice/fake_models.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/tests/voice/helpers.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/tests/voice/test_input.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/tests/voice/test_openai_stt.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/tests/voice/test_openai_tts.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/tests/voice/test_pipeline.py +0 -0
- {openai_agents-0.2.1 → openai_agents-0.2.2}/tests/voice/test_workflow.py +0 -0
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
name: "Update Translated Docs"
|
|
2
|
+
|
|
3
|
+
# This GitHub Actions job automates the process of updating all translated document pages. Please note the following:
|
|
4
|
+
# 1. The translation results may vary each time; some differences in detail are expected.
|
|
5
|
+
# 2. When you add a new page to the left-hand menu, **make sure to manually update mkdocs.yml** to include the new item.
|
|
6
|
+
# 3. If you switch to a different LLM (for example, from o3 to a newer model), be sure to conduct thorough testing before making the switch.
|
|
7
|
+
|
|
8
|
+
on:
|
|
9
|
+
push:
|
|
10
|
+
branches:
|
|
11
|
+
- main
|
|
12
|
+
paths:
|
|
13
|
+
- 'docs/**'
|
|
14
|
+
- mkdocs.yml
|
|
15
|
+
|
|
16
|
+
jobs:
|
|
17
|
+
update-docs:
|
|
18
|
+
if: "!contains(github.event.head_commit.message, 'Update all translated document pages')"
|
|
19
|
+
name: Build and Push Translated Docs
|
|
20
|
+
runs-on: ubuntu-latest
|
|
21
|
+
timeout-minutes: 20
|
|
22
|
+
env:
|
|
23
|
+
PROD_OPENAI_API_KEY: ${{ secrets.PROD_OPENAI_API_KEY }}
|
|
24
|
+
steps:
|
|
25
|
+
- name: Checkout repository
|
|
26
|
+
uses: actions/checkout@v3
|
|
27
|
+
with:
|
|
28
|
+
fetch-depth: 0
|
|
29
|
+
- name: Setup uv
|
|
30
|
+
uses: astral-sh/setup-uv@v5
|
|
31
|
+
with:
|
|
32
|
+
enable-cache: true
|
|
33
|
+
- name: Install dependencies
|
|
34
|
+
run: make sync
|
|
35
|
+
- name: Build full docs
|
|
36
|
+
run: make build-full-docs
|
|
37
|
+
|
|
38
|
+
- name: Commit changes
|
|
39
|
+
id: commit
|
|
40
|
+
run: |
|
|
41
|
+
git config user.name "github-actions[bot]"
|
|
42
|
+
git config user.email "github-actions[bot]@users.noreply.github.com"
|
|
43
|
+
git add docs/
|
|
44
|
+
if [ -n "$(git status --porcelain)" ]; then
|
|
45
|
+
git commit -m "Update all translated document pages"
|
|
46
|
+
echo "committed=true" >> "$GITHUB_OUTPUT"
|
|
47
|
+
else
|
|
48
|
+
echo "No changes to commit"
|
|
49
|
+
echo "committed=false" >> "$GITHUB_OUTPUT"
|
|
50
|
+
fi
|
|
51
|
+
|
|
52
|
+
- name: Create Pull Request
|
|
53
|
+
if: steps.commit.outputs.committed == 'true'
|
|
54
|
+
uses: peter-evans/create-pull-request@v6
|
|
55
|
+
with:
|
|
56
|
+
commit-message: "Update all translated document pages"
|
|
57
|
+
title: "Update all translated document pages"
|
|
58
|
+
body: "Automated update of translated documentation"
|
|
59
|
+
branch: update-translated-docs-${{ github.run_id }}
|
|
60
|
+
delete-branch: true
|
|
@@ -30,7 +30,8 @@ languages = {
|
|
|
30
30
|
}
|
|
31
31
|
|
|
32
32
|
# Initialize OpenAI client
|
|
33
|
-
|
|
33
|
+
api_key = os.getenv("PROD_OPENAI_API_KEY") or os.getenv("OPENAI_API_KEY")
|
|
34
|
+
openai_client = OpenAI(api_key=api_key)
|
|
34
35
|
|
|
35
36
|
# Define dictionaries for translation control
|
|
36
37
|
do_not_translate = [
|
|
@@ -2,13 +2,10 @@
|
|
|
2
2
|
|
|
3
3
|
from __future__ import annotations
|
|
4
4
|
|
|
5
|
-
import
|
|
6
|
-
|
|
7
|
-
from ..run_context import RunContextWrapper, TContext
|
|
5
|
+
from ..run_context import TContext
|
|
8
6
|
from .agent import RealtimeAgent
|
|
9
7
|
from .config import (
|
|
10
8
|
RealtimeRunConfig,
|
|
11
|
-
RealtimeSessionModelSettings,
|
|
12
9
|
)
|
|
13
10
|
from .model import (
|
|
14
11
|
RealtimeModel,
|
|
@@ -67,16 +64,6 @@ class RealtimeRunner:
|
|
|
67
64
|
print(event)
|
|
68
65
|
```
|
|
69
66
|
"""
|
|
70
|
-
model_settings = await self._get_model_settings(
|
|
71
|
-
agent=self._starting_agent,
|
|
72
|
-
disable_tracing=self._config.get("tracing_disabled", False) if self._config else False,
|
|
73
|
-
initial_settings=model_config.get("initial_model_settings") if model_config else None,
|
|
74
|
-
overrides=self._config.get("model_settings") if self._config else None,
|
|
75
|
-
)
|
|
76
|
-
|
|
77
|
-
model_config = model_config.copy() if model_config else {}
|
|
78
|
-
model_config["initial_model_settings"] = model_settings
|
|
79
|
-
|
|
80
67
|
# Create and return the connection
|
|
81
68
|
session = RealtimeSession(
|
|
82
69
|
model=self._model,
|
|
@@ -87,32 +74,3 @@ class RealtimeRunner:
|
|
|
87
74
|
)
|
|
88
75
|
|
|
89
76
|
return session
|
|
90
|
-
|
|
91
|
-
async def _get_model_settings(
|
|
92
|
-
self,
|
|
93
|
-
agent: RealtimeAgent,
|
|
94
|
-
disable_tracing: bool,
|
|
95
|
-
context: TContext | None = None,
|
|
96
|
-
initial_settings: RealtimeSessionModelSettings | None = None,
|
|
97
|
-
overrides: RealtimeSessionModelSettings | None = None,
|
|
98
|
-
) -> RealtimeSessionModelSettings:
|
|
99
|
-
context_wrapper = RunContextWrapper(context)
|
|
100
|
-
model_settings = initial_settings.copy() if initial_settings else {}
|
|
101
|
-
|
|
102
|
-
instructions, tools = await asyncio.gather(
|
|
103
|
-
agent.get_system_prompt(context_wrapper),
|
|
104
|
-
agent.get_all_tools(context_wrapper),
|
|
105
|
-
)
|
|
106
|
-
|
|
107
|
-
if instructions is not None:
|
|
108
|
-
model_settings["instructions"] = instructions
|
|
109
|
-
if tools is not None:
|
|
110
|
-
model_settings["tools"] = tools
|
|
111
|
-
|
|
112
|
-
if overrides:
|
|
113
|
-
model_settings.update(overrides)
|
|
114
|
-
|
|
115
|
-
if disable_tracing:
|
|
116
|
-
model_settings["tracing"] = None
|
|
117
|
-
|
|
118
|
-
return model_settings
|
|
@@ -114,8 +114,13 @@ class RealtimeSession(RealtimeModelListener):
|
|
|
114
114
|
# Add ourselves as a listener
|
|
115
115
|
self._model.add_listener(self)
|
|
116
116
|
|
|
117
|
+
model_config = self._model_config.copy()
|
|
118
|
+
model_config["initial_model_settings"] = await self._get_updated_model_settings_from_agent(
|
|
119
|
+
self._current_agent
|
|
120
|
+
)
|
|
121
|
+
|
|
117
122
|
# Connect to the model
|
|
118
|
-
await self._model.connect(
|
|
123
|
+
await self._model.connect(model_config)
|
|
119
124
|
|
|
120
125
|
# Emit initial history update
|
|
121
126
|
await self._put_event(
|
|
@@ -319,7 +324,9 @@ class RealtimeSession(RealtimeModelListener):
|
|
|
319
324
|
self._current_agent = result
|
|
320
325
|
|
|
321
326
|
# Get updated model settings from new agent
|
|
322
|
-
updated_settings = await self.
|
|
327
|
+
updated_settings = await self._get_updated_model_settings_from_agent(
|
|
328
|
+
self._current_agent
|
|
329
|
+
)
|
|
323
330
|
|
|
324
331
|
# Send handoff event
|
|
325
332
|
await self._put_event(
|
|
@@ -495,19 +502,28 @@ class RealtimeSession(RealtimeModelListener):
|
|
|
495
502
|
# Mark as closed
|
|
496
503
|
self._closed = True
|
|
497
504
|
|
|
498
|
-
async def
|
|
499
|
-
self,
|
|
505
|
+
async def _get_updated_model_settings_from_agent(
|
|
506
|
+
self,
|
|
507
|
+
agent: RealtimeAgent,
|
|
500
508
|
) -> RealtimeSessionModelSettings:
|
|
501
509
|
updated_settings: RealtimeSessionModelSettings = {}
|
|
502
510
|
instructions, tools, handoffs = await asyncio.gather(
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
self._get_handoffs(
|
|
511
|
+
agent.get_system_prompt(self._context_wrapper),
|
|
512
|
+
agent.get_all_tools(self._context_wrapper),
|
|
513
|
+
self._get_handoffs(agent, self._context_wrapper),
|
|
506
514
|
)
|
|
507
515
|
updated_settings["instructions"] = instructions or ""
|
|
508
516
|
updated_settings["tools"] = tools or []
|
|
509
517
|
updated_settings["handoffs"] = handoffs or []
|
|
510
518
|
|
|
519
|
+
# Override with initial settings
|
|
520
|
+
initial_settings = self._model_config.get("initial_model_settings", {})
|
|
521
|
+
updated_settings.update(initial_settings)
|
|
522
|
+
|
|
523
|
+
disable_tracing = self._run_config.get("tracing_disabled", False)
|
|
524
|
+
if disable_tracing:
|
|
525
|
+
updated_settings["tracing"] = None
|
|
526
|
+
|
|
511
527
|
return updated_settings
|
|
512
528
|
|
|
513
529
|
@classmethod
|
|
@@ -1,18 +1,21 @@
|
|
|
1
1
|
from unittest.mock import AsyncMock, Mock, patch
|
|
2
2
|
|
|
3
3
|
import pytest
|
|
4
|
-
from inline_snapshot import snapshot
|
|
5
4
|
|
|
6
5
|
from agents.realtime.agent import RealtimeAgent
|
|
7
6
|
from agents.realtime.config import RealtimeRunConfig, RealtimeSessionModelSettings
|
|
8
7
|
from agents.realtime.model import RealtimeModel, RealtimeModelConfig
|
|
9
8
|
from agents.realtime.runner import RealtimeRunner
|
|
10
9
|
from agents.realtime.session import RealtimeSession
|
|
10
|
+
from agents.tool import function_tool
|
|
11
11
|
|
|
12
12
|
|
|
13
13
|
class MockRealtimeModel(RealtimeModel):
|
|
14
|
+
def __init__(self):
|
|
15
|
+
self.connect_args = None
|
|
16
|
+
|
|
14
17
|
async def connect(self, options=None):
|
|
15
|
-
|
|
18
|
+
self.connect_args = options
|
|
16
19
|
|
|
17
20
|
def add_listener(self, listener):
|
|
18
21
|
pass
|
|
@@ -53,7 +56,9 @@ def mock_model():
|
|
|
53
56
|
|
|
54
57
|
|
|
55
58
|
@pytest.mark.asyncio
|
|
56
|
-
async def test_run_creates_session_with_no_settings(
|
|
59
|
+
async def test_run_creates_session_with_no_settings(
|
|
60
|
+
mock_agent: Mock, mock_model: MockRealtimeModel
|
|
61
|
+
):
|
|
57
62
|
"""Test that run() creates a session correctly if no settings are provided"""
|
|
58
63
|
runner = RealtimeRunner(mock_agent, model=mock_model)
|
|
59
64
|
|
|
@@ -71,22 +76,17 @@ async def test_run_creates_session_with_no_settings(mock_agent, mock_model):
|
|
|
71
76
|
assert call_args[1]["agent"] == mock_agent
|
|
72
77
|
assert call_args[1]["context"] is None
|
|
73
78
|
|
|
74
|
-
#
|
|
79
|
+
# With no settings provided, model_config should be None
|
|
75
80
|
model_config = call_args[1]["model_config"]
|
|
76
|
-
assert model_config
|
|
77
|
-
{
|
|
78
|
-
"initial_model_settings": {
|
|
79
|
-
"instructions": "Test instructions",
|
|
80
|
-
"tools": [{"type": "function", "name": "test_tool"}],
|
|
81
|
-
}
|
|
82
|
-
}
|
|
83
|
-
)
|
|
81
|
+
assert model_config is None
|
|
84
82
|
|
|
85
83
|
assert session == mock_session
|
|
86
84
|
|
|
87
85
|
|
|
88
86
|
@pytest.mark.asyncio
|
|
89
|
-
async def test_run_creates_session_with_settings_only_in_init(
|
|
87
|
+
async def test_run_creates_session_with_settings_only_in_init(
|
|
88
|
+
mock_agent: Mock, mock_model: MockRealtimeModel
|
|
89
|
+
):
|
|
90
90
|
"""Test that it creates a session with the right settings if they are provided only in init"""
|
|
91
91
|
config = RealtimeRunConfig(
|
|
92
92
|
model_settings=RealtimeSessionModelSettings(model_name="gpt-4o-realtime", voice="nova")
|
|
@@ -99,28 +99,19 @@ async def test_run_creates_session_with_settings_only_in_init(mock_agent, mock_m
|
|
|
99
99
|
|
|
100
100
|
_ = await runner.run()
|
|
101
101
|
|
|
102
|
-
# Verify session was created
|
|
102
|
+
# Verify session was created - runner no longer processes settings
|
|
103
103
|
call_args = mock_session_class.call_args
|
|
104
104
|
model_config = call_args[1]["model_config"]
|
|
105
105
|
|
|
106
|
-
#
|
|
107
|
-
assert model_config
|
|
108
|
-
{
|
|
109
|
-
"initial_model_settings": {
|
|
110
|
-
"instructions": "Test instructions",
|
|
111
|
-
"tools": [{"type": "function", "name": "test_tool"}],
|
|
112
|
-
"model_name": "gpt-4o-realtime",
|
|
113
|
-
"voice": "nova",
|
|
114
|
-
}
|
|
115
|
-
}
|
|
116
|
-
)
|
|
106
|
+
# Runner should pass None for model_config when none provided to run()
|
|
107
|
+
assert model_config is None
|
|
117
108
|
|
|
118
109
|
|
|
119
110
|
@pytest.mark.asyncio
|
|
120
111
|
async def test_run_creates_session_with_settings_in_both_init_and_run_overrides(
|
|
121
|
-
mock_agent, mock_model
|
|
112
|
+
mock_agent: Mock, mock_model: MockRealtimeModel
|
|
122
113
|
):
|
|
123
|
-
"""Test settings in
|
|
114
|
+
"""Test settings provided in run() parameter are passed through"""
|
|
124
115
|
init_config = RealtimeRunConfig(
|
|
125
116
|
model_settings=RealtimeSessionModelSettings(model_name="gpt-4o-realtime", voice="nova")
|
|
126
117
|
)
|
|
@@ -138,26 +129,18 @@ async def test_run_creates_session_with_settings_in_both_init_and_run_overrides(
|
|
|
138
129
|
|
|
139
130
|
_ = await runner.run(model_config=run_model_config)
|
|
140
131
|
|
|
141
|
-
# Verify run()
|
|
132
|
+
# Verify run() model_config is passed through as-is
|
|
142
133
|
call_args = mock_session_class.call_args
|
|
143
134
|
model_config = call_args[1]["model_config"]
|
|
144
135
|
|
|
145
|
-
#
|
|
146
|
-
assert model_config ==
|
|
147
|
-
{
|
|
148
|
-
"initial_model_settings": {
|
|
149
|
-
"voice": "nova",
|
|
150
|
-
"input_audio_format": "pcm16",
|
|
151
|
-
"instructions": "Test instructions",
|
|
152
|
-
"tools": [{"type": "function", "name": "test_tool"}],
|
|
153
|
-
"model_name": "gpt-4o-realtime",
|
|
154
|
-
}
|
|
155
|
-
}
|
|
156
|
-
)
|
|
136
|
+
# Runner should pass the model_config from run() parameter directly
|
|
137
|
+
assert model_config == run_model_config
|
|
157
138
|
|
|
158
139
|
|
|
159
140
|
@pytest.mark.asyncio
|
|
160
|
-
async def test_run_creates_session_with_settings_only_in_run(
|
|
141
|
+
async def test_run_creates_session_with_settings_only_in_run(
|
|
142
|
+
mock_agent: Mock, mock_model: MockRealtimeModel
|
|
143
|
+
):
|
|
161
144
|
"""Test settings provided only in run()"""
|
|
162
145
|
runner = RealtimeRunner(mock_agent, model=mock_model)
|
|
163
146
|
|
|
@@ -173,26 +156,16 @@ async def test_run_creates_session_with_settings_only_in_run(mock_agent, mock_mo
|
|
|
173
156
|
|
|
174
157
|
_ = await runner.run(model_config=run_model_config)
|
|
175
158
|
|
|
176
|
-
# Verify run()
|
|
159
|
+
# Verify run() model_config is passed through as-is
|
|
177
160
|
call_args = mock_session_class.call_args
|
|
178
161
|
model_config = call_args[1]["model_config"]
|
|
179
162
|
|
|
180
|
-
#
|
|
181
|
-
assert model_config ==
|
|
182
|
-
{
|
|
183
|
-
"initial_model_settings": {
|
|
184
|
-
"model_name": "gpt-4o-realtime-preview",
|
|
185
|
-
"voice": "shimmer",
|
|
186
|
-
"modalities": ["text", "audio"],
|
|
187
|
-
"instructions": "Test instructions",
|
|
188
|
-
"tools": [{"type": "function", "name": "test_tool"}],
|
|
189
|
-
}
|
|
190
|
-
}
|
|
191
|
-
)
|
|
163
|
+
# Runner should pass the model_config from run() parameter directly
|
|
164
|
+
assert model_config == run_model_config
|
|
192
165
|
|
|
193
166
|
|
|
194
167
|
@pytest.mark.asyncio
|
|
195
|
-
async def test_run_with_context_parameter(mock_agent, mock_model):
|
|
168
|
+
async def test_run_with_context_parameter(mock_agent: Mock, mock_model: MockRealtimeModel):
|
|
196
169
|
"""Test that context parameter is passed through to session"""
|
|
197
170
|
runner = RealtimeRunner(mock_agent, model=mock_model)
|
|
198
171
|
test_context = {"user_id": "test123"}
|
|
@@ -208,17 +181,69 @@ async def test_run_with_context_parameter(mock_agent, mock_model):
|
|
|
208
181
|
|
|
209
182
|
|
|
210
183
|
@pytest.mark.asyncio
|
|
211
|
-
async def
|
|
212
|
-
"""Test
|
|
184
|
+
async def test_run_with_none_values_from_agent_does_not_crash(mock_model: MockRealtimeModel):
|
|
185
|
+
"""Test that runner handles agents with None values without crashing"""
|
|
213
186
|
agent = Mock(spec=RealtimeAgent)
|
|
214
187
|
agent.get_system_prompt = AsyncMock(return_value=None)
|
|
215
188
|
agent.get_all_tools = AsyncMock(return_value=None)
|
|
216
189
|
|
|
217
190
|
runner = RealtimeRunner(agent, model=mock_model)
|
|
218
191
|
|
|
219
|
-
with patch("agents.realtime.runner.RealtimeSession"):
|
|
220
|
-
|
|
192
|
+
with patch("agents.realtime.runner.RealtimeSession") as mock_session_class:
|
|
193
|
+
mock_session = Mock(spec=RealtimeSession)
|
|
194
|
+
mock_session_class.return_value = mock_session
|
|
195
|
+
|
|
196
|
+
session = await runner.run()
|
|
197
|
+
|
|
198
|
+
# Should not crash and return session
|
|
199
|
+
assert session == mock_session
|
|
200
|
+
# Runner no longer calls agent methods directly - session does that
|
|
201
|
+
agent.get_system_prompt.assert_not_called()
|
|
202
|
+
agent.get_all_tools.assert_not_called()
|
|
203
|
+
|
|
204
|
+
|
|
205
|
+
@pytest.mark.asyncio
|
|
206
|
+
async def test_tool_and_handoffs_are_correct(mock_model: MockRealtimeModel):
|
|
207
|
+
@function_tool
|
|
208
|
+
def tool_one():
|
|
209
|
+
return "result_one"
|
|
210
|
+
|
|
211
|
+
agent_1 = RealtimeAgent(
|
|
212
|
+
name="one",
|
|
213
|
+
instructions="instr_one",
|
|
214
|
+
)
|
|
215
|
+
agent_2 = RealtimeAgent(
|
|
216
|
+
name="two",
|
|
217
|
+
instructions="instr_two",
|
|
218
|
+
tools=[tool_one],
|
|
219
|
+
handoffs=[agent_1],
|
|
220
|
+
)
|
|
221
|
+
|
|
222
|
+
session = RealtimeSession(
|
|
223
|
+
model=mock_model,
|
|
224
|
+
agent=agent_2,
|
|
225
|
+
context=None,
|
|
226
|
+
model_config=None,
|
|
227
|
+
run_config=None,
|
|
228
|
+
)
|
|
229
|
+
|
|
230
|
+
async with session:
|
|
231
|
+
pass
|
|
221
232
|
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
233
|
+
# Assert that the model.connect() was called with the correct settings
|
|
234
|
+
connect_args = mock_model.connect_args
|
|
235
|
+
assert connect_args is not None
|
|
236
|
+
assert isinstance(connect_args, dict)
|
|
237
|
+
initial_model_settings = connect_args["initial_model_settings"]
|
|
238
|
+
assert initial_model_settings is not None
|
|
239
|
+
assert isinstance(initial_model_settings, dict)
|
|
240
|
+
assert initial_model_settings["instructions"] == "instr_two"
|
|
241
|
+
assert len(initial_model_settings["tools"]) == 1
|
|
242
|
+
tool = initial_model_settings["tools"][0]
|
|
243
|
+
assert tool.name == "tool_one"
|
|
244
|
+
|
|
245
|
+
handoffs = initial_model_settings["handoffs"]
|
|
246
|
+
assert len(handoffs) == 1
|
|
247
|
+
handoff = handoffs[0]
|
|
248
|
+
assert handoff.tool_name == "transfer_to_one"
|
|
249
|
+
assert handoff.agent_name == "one"
|
|
@@ -29,7 +29,7 @@ from agents.realtime.items import (
|
|
|
29
29
|
RealtimeItem,
|
|
30
30
|
UserMessageItem,
|
|
31
31
|
)
|
|
32
|
-
from agents.realtime.model import RealtimeModel
|
|
32
|
+
from agents.realtime.model import RealtimeModel, RealtimeModelConfig
|
|
33
33
|
from agents.realtime.model_events import (
|
|
34
34
|
RealtimeModelAudioDoneEvent,
|
|
35
35
|
RealtimeModelAudioEvent,
|
|
@@ -1206,3 +1206,117 @@ class TestGuardrailFunctionality:
|
|
|
1206
1206
|
guardrail_events = [e for e in events if isinstance(e, RealtimeGuardrailTripped)]
|
|
1207
1207
|
assert len(guardrail_events) == 1
|
|
1208
1208
|
assert len(guardrail_events[0].guardrail_results) == 2
|
|
1209
|
+
|
|
1210
|
+
|
|
1211
|
+
class TestModelSettingsIntegration:
|
|
1212
|
+
"""Test suite for model settings integration in RealtimeSession."""
|
|
1213
|
+
|
|
1214
|
+
@pytest.mark.asyncio
|
|
1215
|
+
async def test_session_gets_model_settings_from_agent_during_connection(self):
|
|
1216
|
+
"""Test that session properly gets model settings from agent during __aenter__."""
|
|
1217
|
+
# Create mock model that records the config passed to connect()
|
|
1218
|
+
mock_model = Mock(spec=RealtimeModel)
|
|
1219
|
+
mock_model.connect = AsyncMock()
|
|
1220
|
+
mock_model.add_listener = Mock()
|
|
1221
|
+
|
|
1222
|
+
# Create agent with specific settings
|
|
1223
|
+
agent = Mock(spec=RealtimeAgent)
|
|
1224
|
+
agent.get_system_prompt = AsyncMock(return_value="Test agent instructions")
|
|
1225
|
+
agent.get_all_tools = AsyncMock(return_value=[{"type": "function", "name": "test_tool"}])
|
|
1226
|
+
agent.handoffs = []
|
|
1227
|
+
|
|
1228
|
+
session = RealtimeSession(mock_model, agent, None)
|
|
1229
|
+
|
|
1230
|
+
# Connect the session
|
|
1231
|
+
await session.__aenter__()
|
|
1232
|
+
|
|
1233
|
+
# Verify model.connect was called with settings from agent
|
|
1234
|
+
mock_model.connect.assert_called_once()
|
|
1235
|
+
connect_config = mock_model.connect.call_args[0][0]
|
|
1236
|
+
|
|
1237
|
+
initial_settings = connect_config["initial_model_settings"]
|
|
1238
|
+
assert initial_settings["instructions"] == "Test agent instructions"
|
|
1239
|
+
assert initial_settings["tools"] == [{"type": "function", "name": "test_tool"}]
|
|
1240
|
+
assert initial_settings["handoffs"] == []
|
|
1241
|
+
|
|
1242
|
+
await session.__aexit__(None, None, None)
|
|
1243
|
+
|
|
1244
|
+
@pytest.mark.asyncio
|
|
1245
|
+
async def test_model_config_overrides_agent_settings(self):
|
|
1246
|
+
"""Test that initial_model_settings from model_config override agent settings."""
|
|
1247
|
+
mock_model = Mock(spec=RealtimeModel)
|
|
1248
|
+
mock_model.connect = AsyncMock()
|
|
1249
|
+
mock_model.add_listener = Mock()
|
|
1250
|
+
|
|
1251
|
+
agent = Mock(spec=RealtimeAgent)
|
|
1252
|
+
agent.get_system_prompt = AsyncMock(return_value="Agent instructions")
|
|
1253
|
+
agent.get_all_tools = AsyncMock(return_value=[{"type": "function", "name": "agent_tool"}])
|
|
1254
|
+
agent.handoffs = []
|
|
1255
|
+
|
|
1256
|
+
# Provide model config with overrides
|
|
1257
|
+
model_config: RealtimeModelConfig = {
|
|
1258
|
+
"initial_model_settings": {
|
|
1259
|
+
"instructions": "Override instructions",
|
|
1260
|
+
"voice": "nova",
|
|
1261
|
+
"model_name": "gpt-4o-realtime",
|
|
1262
|
+
}
|
|
1263
|
+
}
|
|
1264
|
+
|
|
1265
|
+
session = RealtimeSession(mock_model, agent, None, model_config=model_config)
|
|
1266
|
+
|
|
1267
|
+
await session.__aenter__()
|
|
1268
|
+
|
|
1269
|
+
# Verify overrides were applied
|
|
1270
|
+
connect_config = mock_model.connect.call_args[0][0]
|
|
1271
|
+
initial_settings = connect_config["initial_model_settings"]
|
|
1272
|
+
|
|
1273
|
+
# Should have override values
|
|
1274
|
+
assert initial_settings["instructions"] == "Override instructions"
|
|
1275
|
+
assert initial_settings["voice"] == "nova"
|
|
1276
|
+
assert initial_settings["model_name"] == "gpt-4o-realtime"
|
|
1277
|
+
# Should still have agent tools since not overridden
|
|
1278
|
+
assert initial_settings["tools"] == [{"type": "function", "name": "agent_tool"}]
|
|
1279
|
+
|
|
1280
|
+
await session.__aexit__(None, None, None)
|
|
1281
|
+
|
|
1282
|
+
@pytest.mark.asyncio
|
|
1283
|
+
async def test_handoffs_are_included_in_model_settings(self):
|
|
1284
|
+
"""Test that handoffs from agent are properly processed into model settings."""
|
|
1285
|
+
mock_model = Mock(spec=RealtimeModel)
|
|
1286
|
+
mock_model.connect = AsyncMock()
|
|
1287
|
+
mock_model.add_listener = Mock()
|
|
1288
|
+
|
|
1289
|
+
# Create agent with handoffs
|
|
1290
|
+
agent = Mock(spec=RealtimeAgent)
|
|
1291
|
+
agent.get_system_prompt = AsyncMock(return_value="Agent with handoffs")
|
|
1292
|
+
agent.get_all_tools = AsyncMock(return_value=[])
|
|
1293
|
+
|
|
1294
|
+
# Create a mock handoff
|
|
1295
|
+
handoff_agent = Mock(spec=RealtimeAgent)
|
|
1296
|
+
handoff_agent.name = "handoff_target"
|
|
1297
|
+
|
|
1298
|
+
mock_handoff = Mock(spec=Handoff)
|
|
1299
|
+
mock_handoff.tool_name = "transfer_to_specialist"
|
|
1300
|
+
mock_handoff.is_enabled = True
|
|
1301
|
+
|
|
1302
|
+
agent.handoffs = [handoff_agent] # Agent handoff
|
|
1303
|
+
|
|
1304
|
+
# Mock the _get_handoffs method since it's complex
|
|
1305
|
+
with pytest.MonkeyPatch().context() as m:
|
|
1306
|
+
|
|
1307
|
+
async def mock_get_handoffs(cls, agent, context_wrapper):
|
|
1308
|
+
return [mock_handoff]
|
|
1309
|
+
|
|
1310
|
+
m.setattr("agents.realtime.session.RealtimeSession._get_handoffs", mock_get_handoffs)
|
|
1311
|
+
|
|
1312
|
+
session = RealtimeSession(mock_model, agent, None)
|
|
1313
|
+
|
|
1314
|
+
await session.__aenter__()
|
|
1315
|
+
|
|
1316
|
+
# Verify handoffs were included
|
|
1317
|
+
connect_config = mock_model.connect.call_args[0][0]
|
|
1318
|
+
initial_settings = connect_config["initial_model_settings"]
|
|
1319
|
+
|
|
1320
|
+
assert initial_settings["handoffs"] == [mock_handoff]
|
|
1321
|
+
|
|
1322
|
+
await session.__aexit__(None, None, None)
|
|
@@ -1,8 +1,11 @@
|
|
|
1
|
-
from unittest.mock import AsyncMock, patch
|
|
1
|
+
from unittest.mock import AsyncMock, Mock, patch
|
|
2
2
|
|
|
3
3
|
import pytest
|
|
4
4
|
|
|
5
|
+
from agents.realtime.agent import RealtimeAgent
|
|
6
|
+
from agents.realtime.model import RealtimeModel
|
|
5
7
|
from agents.realtime.openai_realtime import OpenAIRealtimeWebSocketModel
|
|
8
|
+
from agents.realtime.session import RealtimeSession
|
|
6
9
|
|
|
7
10
|
|
|
8
11
|
class TestRealtimeTracingIntegration:
|
|
@@ -219,36 +222,24 @@ class TestRealtimeTracingIntegration:
|
|
|
219
222
|
@pytest.mark.asyncio
|
|
220
223
|
async def test_tracing_disabled_prevents_tracing(self, mock_websocket):
|
|
221
224
|
"""Test that tracing_disabled=True prevents tracing configuration."""
|
|
222
|
-
from agents.realtime.agent import RealtimeAgent
|
|
223
|
-
from agents.realtime.runner import RealtimeRunner
|
|
224
225
|
|
|
225
|
-
# Create a test agent and
|
|
226
|
+
# Create a test agent and mock model
|
|
226
227
|
agent = RealtimeAgent(name="test_agent", instructions="test")
|
|
228
|
+
agent.handoffs = []
|
|
227
229
|
|
|
228
|
-
|
|
230
|
+
mock_model = Mock(spec=RealtimeModel)
|
|
229
231
|
|
|
230
|
-
#
|
|
231
|
-
|
|
232
|
+
# Create session with tracing disabled
|
|
233
|
+
session = RealtimeSession(
|
|
234
|
+
model=mock_model,
|
|
232
235
|
agent=agent,
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
+
context=None,
|
|
237
|
+
model_config=None,
|
|
238
|
+
run_config={"tracing_disabled": True},
|
|
236
239
|
)
|
|
237
240
|
|
|
241
|
+
# Test the _get_updated_model_settings_from_agent method directly
|
|
242
|
+
model_settings = await session._get_updated_model_settings_from_agent(agent)
|
|
243
|
+
|
|
238
244
|
# When tracing is disabled, model settings should have tracing=None
|
|
239
245
|
assert model_settings["tracing"] is None
|
|
240
|
-
|
|
241
|
-
# Also test that the runner passes disable_tracing=True correctly
|
|
242
|
-
with patch.object(runner, "_get_model_settings") as mock_get_settings:
|
|
243
|
-
mock_get_settings.return_value = {"tracing": None}
|
|
244
|
-
|
|
245
|
-
with patch("agents.realtime.session.RealtimeSession") as mock_session_class:
|
|
246
|
-
mock_session = AsyncMock()
|
|
247
|
-
mock_session_class.return_value = mock_session
|
|
248
|
-
|
|
249
|
-
await runner.run()
|
|
250
|
-
|
|
251
|
-
# Verify that _get_model_settings was called with disable_tracing=True
|
|
252
|
-
mock_get_settings.assert_called_once_with(
|
|
253
|
-
agent=agent, disable_tracing=True, initial_settings=None, overrides=None
|
|
254
|
-
)
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{openai_agents-0.2.1 → openai_agents-0.2.2}/.github/PULL_REQUEST_TEMPLATE/pull_request_template.md
RENAMED
|
File without changes
|