openai-agents 0.0.16__tar.gz → 0.0.17__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.0.16 → openai_agents-0.0.17}/PKG-INFO +1 -1
- {openai_agents-0.0.16 → openai_agents-0.0.17}/docs/ja/mcp.md +5 -4
- {openai_agents-0.0.16 → openai_agents-0.0.17}/docs/ja/tools.md +4 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/docs/ja/tracing.md +2 -1
- {openai_agents-0.0.16 → openai_agents-0.0.17}/docs/mcp.md +4 -3
- {openai_agents-0.0.16 → openai_agents-0.0.17}/docs/tools.md +5 -1
- {openai_agents-0.0.16 → openai_agents-0.0.17}/docs/tracing.md +1 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/examples/agent_patterns/input_guardrails.py +1 -1
- {openai_agents-0.0.16 → openai_agents-0.0.17}/examples/hosted_mcp/approvals.py +1 -1
- {openai_agents-0.0.16 → openai_agents-0.0.17}/examples/hosted_mcp/simple.py +1 -1
- {openai_agents-0.0.16 → openai_agents-0.0.17}/pyproject.toml +1 -1
- {openai_agents-0.0.16 → openai_agents-0.0.17}/src/agents/__init__.py +2 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/src/agents/_run_impl.py +4 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/src/agents/agent.py +19 -3
- {openai_agents-0.0.16 → openai_agents-0.0.17}/src/agents/agent_output.py +1 -1
- {openai_agents-0.0.16 → openai_agents-0.0.17}/src/agents/exceptions.py +38 -5
- {openai_agents-0.0.16 → openai_agents-0.0.17}/src/agents/extensions/models/litellm_model.py +2 -1
- {openai_agents-0.0.16 → openai_agents-0.0.17}/src/agents/extensions/visualization.py +35 -18
- {openai_agents-0.0.16 → openai_agents-0.0.17}/src/agents/handoffs.py +1 -1
- {openai_agents-0.0.16 → openai_agents-0.0.17}/src/agents/mcp/server.py +5 -5
- {openai_agents-0.0.16 → openai_agents-0.0.17}/src/agents/mcp/util.py +1 -1
- {openai_agents-0.0.16 → openai_agents-0.0.17}/src/agents/models/openai_chatcompletions.py +17 -5
- {openai_agents-0.0.16 → openai_agents-0.0.17}/src/agents/result.py +43 -13
- {openai_agents-0.0.16 → openai_agents-0.0.17}/src/agents/run.py +33 -6
- {openai_agents-0.0.16 → openai_agents-0.0.17}/src/agents/stream_events.py +1 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/src/agents/tool.py +16 -1
- {openai_agents-0.0.16 → openai_agents-0.0.17}/src/agents/tracing/processors.py +29 -3
- {openai_agents-0.0.16 → openai_agents-0.0.17}/src/agents/util/_pretty_print.py +12 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/src/agents/voice/model.py +2 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/tests/mcp/test_mcp_tracing.py +39 -21
- {openai_agents-0.0.16 → openai_agents-0.0.17}/tests/models/test_litellm_extra_body.py +1 -2
- {openai_agents-0.0.16 → openai_agents-0.0.17}/tests/test_agent_runner.py +35 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/tests/test_agent_runner_streamed.py +37 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/tests/test_function_tool.py +42 -1
- {openai_agents-0.0.16 → openai_agents-0.0.17}/tests/test_openai_chatcompletions.py +34 -0
- openai_agents-0.0.17/tests/test_run_error_details.py +48 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/tests/test_run_step_execution.py +1 -1
- {openai_agents-0.0.16 → openai_agents-0.0.17}/tests/test_run_step_processing.py +18 -14
- {openai_agents-0.0.16 → openai_agents-0.0.17}/tests/test_tracing_errors_streamed.py +0 -4
- {openai_agents-0.0.16 → openai_agents-0.0.17}/tests/test_visualization.py +15 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/uv.lock +1 -1
- {openai_agents-0.0.16 → openai_agents-0.0.17}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/.github/ISSUE_TEMPLATE/model_provider.md +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/.github/ISSUE_TEMPLATE/question.md +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/.github/PULL_REQUEST_TEMPLATE/pull_request_template.md +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/.github/workflows/docs.yml +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/.github/workflows/issues.yml +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/.github/workflows/publish.yml +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/.github/workflows/tests.yml +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/.gitignore +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/.prettierrc +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/.vscode/settings.json +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/AGENTS.md +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/LICENSE +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/Makefile +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/README.md +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/docs/agents.md +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/docs/assets/images/favicon-platform.svg +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/docs/assets/images/graph.png +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/docs/assets/images/mcp-tracing.jpg +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/docs/assets/images/orchestration.png +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/docs/assets/logo.svg +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/docs/config.md +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/docs/context.md +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/docs/examples.md +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/docs/guardrails.md +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/docs/handoffs.md +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/docs/index.md +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/docs/ja/agents.md +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/docs/ja/config.md +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/docs/ja/context.md +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/docs/ja/examples.md +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/docs/ja/guardrails.md +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/docs/ja/handoffs.md +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/docs/ja/index.md +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/docs/ja/models/index.md +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/docs/ja/models/litellm.md +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/docs/ja/models.md +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/docs/ja/multi_agent.md +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/docs/ja/quickstart.md +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/docs/ja/results.md +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/docs/ja/running_agents.md +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/docs/ja/streaming.md +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/docs/ja/visualization.md +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/docs/ja/voice/pipeline.md +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/docs/ja/voice/quickstart.md +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/docs/ja/voice/tracing.md +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/docs/models/index.md +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/docs/models/litellm.md +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/docs/multi_agent.md +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/docs/quickstart.md +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/docs/ref/agent.md +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/docs/ref/agent_output.md +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/docs/ref/exceptions.md +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/docs/ref/extensions/handoff_filters.md +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/docs/ref/extensions/handoff_prompt.md +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/docs/ref/extensions/litellm.md +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/docs/ref/function_schema.md +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/docs/ref/guardrail.md +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/docs/ref/handoffs.md +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/docs/ref/index.md +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/docs/ref/items.md +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/docs/ref/lifecycle.md +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/docs/ref/mcp/server.md +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/docs/ref/mcp/util.md +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/docs/ref/model_settings.md +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/docs/ref/models/interface.md +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/docs/ref/models/openai_chatcompletions.md +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/docs/ref/models/openai_responses.md +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/docs/ref/result.md +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/docs/ref/run.md +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/docs/ref/run_context.md +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/docs/ref/stream_events.md +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/docs/ref/tool.md +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/docs/ref/tracing/create.md +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/docs/ref/tracing/index.md +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/docs/ref/tracing/processor_interface.md +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/docs/ref/tracing/processors.md +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/docs/ref/tracing/scope.md +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/docs/ref/tracing/setup.md +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/docs/ref/tracing/span_data.md +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/docs/ref/tracing/spans.md +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/docs/ref/tracing/traces.md +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/docs/ref/tracing/util.md +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/docs/ref/usage.md +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/docs/ref/voice/events.md +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/docs/ref/voice/exceptions.md +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/docs/ref/voice/input.md +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/docs/ref/voice/model.md +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/docs/ref/voice/models/openai_provider.md +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/docs/ref/voice/models/openai_stt.md +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/docs/ref/voice/models/openai_tts.md +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/docs/ref/voice/pipeline.md +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/docs/ref/voice/pipeline_config.md +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/docs/ref/voice/result.md +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/docs/ref/voice/utils.md +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/docs/ref/voice/workflow.md +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/docs/results.md +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/docs/running_agents.md +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/docs/scripts/translate_docs.py +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/docs/streaming.md +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/docs/stylesheets/extra.css +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/docs/visualization.md +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/docs/voice/pipeline.md +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/docs/voice/quickstart.md +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/docs/voice/tracing.md +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/examples/__init__.py +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/examples/agent_patterns/README.md +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/examples/agent_patterns/agents_as_tools.py +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/examples/agent_patterns/deterministic.py +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/examples/agent_patterns/forcing_tool_use.py +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/examples/agent_patterns/llm_as_a_judge.py +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/examples/agent_patterns/output_guardrails.py +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/examples/agent_patterns/parallelization.py +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/examples/agent_patterns/routing.py +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/examples/agent_patterns/streaming_guardrails.py +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/examples/basic/agent_lifecycle_example.py +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/examples/basic/dynamic_system_prompt.py +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/examples/basic/hello_world.py +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/examples/basic/hello_world_jupyter.py +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/examples/basic/lifecycle_example.py +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/examples/basic/local_image.py +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/examples/basic/media/image_bison.jpg +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/examples/basic/non_strict_output_type.py +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/examples/basic/previous_response_id.py +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/examples/basic/remote_image.py +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/examples/basic/stream_items.py +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/examples/basic/stream_text.py +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/examples/basic/tools.py +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/examples/customer_service/main.py +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/examples/financial_research_agent/README.md +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/examples/financial_research_agent/__init__.py +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/examples/financial_research_agent/agents/__init__.py +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/examples/financial_research_agent/agents/financials_agent.py +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/examples/financial_research_agent/agents/planner_agent.py +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/examples/financial_research_agent/agents/risk_agent.py +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/examples/financial_research_agent/agents/search_agent.py +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/examples/financial_research_agent/agents/verifier_agent.py +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/examples/financial_research_agent/agents/writer_agent.py +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/examples/financial_research_agent/main.py +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/examples/financial_research_agent/manager.py +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/examples/financial_research_agent/printer.py +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/examples/handoffs/message_filter.py +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/examples/handoffs/message_filter_streaming.py +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/examples/hosted_mcp/__init__.py +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/examples/mcp/filesystem_example/README.md +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/examples/mcp/filesystem_example/main.py +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/examples/mcp/filesystem_example/sample_files/favorite_books.txt +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/examples/mcp/filesystem_example/sample_files/favorite_cities.txt +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/examples/mcp/filesystem_example/sample_files/favorite_songs.txt +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/examples/mcp/git_example/README.md +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/examples/mcp/git_example/main.py +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/examples/mcp/sse_example/README.md +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/examples/mcp/sse_example/main.py +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/examples/mcp/sse_example/server.py +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/examples/mcp/streamablehttp_example/README.md +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/examples/mcp/streamablehttp_example/main.py +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/examples/mcp/streamablehttp_example/server.py +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/examples/model_providers/README.md +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/examples/model_providers/custom_example_agent.py +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/examples/model_providers/custom_example_global.py +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/examples/model_providers/custom_example_provider.py +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/examples/model_providers/litellm_auto.py +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/examples/model_providers/litellm_provider.py +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/examples/research_bot/README.md +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/examples/research_bot/__init__.py +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/examples/research_bot/agents/__init__.py +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/examples/research_bot/agents/planner_agent.py +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/examples/research_bot/agents/search_agent.py +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/examples/research_bot/agents/writer_agent.py +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/examples/research_bot/main.py +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/examples/research_bot/manager.py +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/examples/research_bot/printer.py +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/examples/research_bot/sample_outputs/product_recs.md +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/examples/research_bot/sample_outputs/product_recs.txt +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/examples/research_bot/sample_outputs/vacation.md +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/examples/research_bot/sample_outputs/vacation.txt +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/examples/tools/code_interpreter.py +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/examples/tools/computer_use.py +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/examples/tools/file_search.py +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/examples/tools/image_generator.py +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/examples/tools/web_search.py +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/examples/voice/__init__.py +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/examples/voice/static/README.md +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/examples/voice/static/__init__.py +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/examples/voice/static/main.py +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/examples/voice/static/util.py +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/examples/voice/streamed/README.md +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/examples/voice/streamed/__init__.py +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/examples/voice/streamed/main.py +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/examples/voice/streamed/my_workflow.py +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/mkdocs.yml +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/src/agents/_config.py +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/src/agents/_debug.py +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/src/agents/computer.py +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/src/agents/extensions/__init__.py +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/src/agents/extensions/handoff_filters.py +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/src/agents/extensions/handoff_prompt.py +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/src/agents/extensions/models/__init__.py +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/src/agents/extensions/models/litellm_provider.py +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/src/agents/function_schema.py +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/src/agents/guardrail.py +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/src/agents/items.py +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/src/agents/lifecycle.py +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/src/agents/logger.py +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/src/agents/mcp/__init__.py +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/src/agents/model_settings.py +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/src/agents/models/__init__.py +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/src/agents/models/_openai_shared.py +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/src/agents/models/chatcmpl_converter.py +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/src/agents/models/chatcmpl_helpers.py +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/src/agents/models/chatcmpl_stream_handler.py +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/src/agents/models/fake_id.py +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/src/agents/models/interface.py +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/src/agents/models/multi_provider.py +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/src/agents/models/openai_provider.py +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/src/agents/models/openai_responses.py +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/src/agents/py.typed +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/src/agents/run_context.py +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/src/agents/strict_schema.py +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/src/agents/tracing/__init__.py +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/src/agents/tracing/create.py +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/src/agents/tracing/logger.py +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/src/agents/tracing/processor_interface.py +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/src/agents/tracing/scope.py +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/src/agents/tracing/setup.py +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/src/agents/tracing/span_data.py +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/src/agents/tracing/spans.py +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/src/agents/tracing/traces.py +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/src/agents/tracing/util.py +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/src/agents/usage.py +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/src/agents/util/__init__.py +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/src/agents/util/_coro.py +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/src/agents/util/_error_tracing.py +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/src/agents/util/_json.py +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/src/agents/util/_transforms.py +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/src/agents/util/_types.py +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/src/agents/version.py +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/src/agents/voice/__init__.py +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/src/agents/voice/events.py +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/src/agents/voice/exceptions.py +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/src/agents/voice/imports.py +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/src/agents/voice/input.py +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/src/agents/voice/models/__init__.py +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/src/agents/voice/models/openai_model_provider.py +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/src/agents/voice/models/openai_stt.py +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/src/agents/voice/models/openai_tts.py +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/src/agents/voice/pipeline.py +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/src/agents/voice/pipeline_config.py +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/src/agents/voice/result.py +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/src/agents/voice/utils.py +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/src/agents/voice/workflow.py +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/tests/README.md +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/tests/__init__.py +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/tests/conftest.py +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/tests/fake_model.py +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/tests/fastapi/__init__.py +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/tests/fastapi/streaming_app.py +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/tests/fastapi/test_streaming_context.py +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/tests/mcp/__init__.py +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/tests/mcp/conftest.py +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/tests/mcp/helpers.py +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/tests/mcp/test_caching.py +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/tests/mcp/test_connect_disconnect.py +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/tests/mcp/test_mcp_util.py +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/tests/mcp/test_runner_calls_mcp.py +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/tests/mcp/test_server_errors.py +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/tests/model_settings/test_serialization.py +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/tests/models/__init__.py +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/tests/models/conftest.py +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/tests/models/test_litellm_chatcompletions_stream.py +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/tests/models/test_map.py +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/tests/test_agent_config.py +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/tests/test_agent_hooks.py +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/tests/test_agent_tracing.py +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/tests/test_cancel_streaming.py +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/tests/test_computer_action.py +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/tests/test_config.py +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/tests/test_doc_parsing.py +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/tests/test_extension_filters.py +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/tests/test_extra_headers.py +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/tests/test_function_schema.py +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/tests/test_function_tool_decorator.py +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/tests/test_global_hooks.py +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/tests/test_guardrails.py +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/tests/test_handoff_tool.py +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/tests/test_items_helpers.py +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/tests/test_max_turns.py +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/tests/test_openai_chatcompletions_converter.py +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/tests/test_openai_chatcompletions_stream.py +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/tests/test_openai_responses_converter.py +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/tests/test_output_tool.py +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/tests/test_pretty_print.py +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/tests/test_responses.py +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/tests/test_responses_tracing.py +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/tests/test_result_cast.py +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/tests/test_run_config.py +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/tests/test_strict_schema.py +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/tests/test_tool_choice_reset.py +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/tests/test_tool_converter.py +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/tests/test_tool_use_behavior.py +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/tests/test_trace_processor.py +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/tests/test_tracing.py +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/tests/test_tracing_errors.py +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/tests/test_usage.py +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/tests/testing_processor.py +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/tests/tracing/test_processor_api_key.py +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/tests/voice/__init__.py +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/tests/voice/conftest.py +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/tests/voice/fake_models.py +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/tests/voice/helpers.py +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/tests/voice/test_input.py +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/tests/voice/test_openai_stt.py +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/tests/voice/test_openai_tts.py +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/tests/voice/test_pipeline.py +0 -0
- {openai_agents-0.0.16 → openai_agents-0.0.17}/tests/voice/test_workflow.py +0 -0
|
@@ -12,12 +12,13 @@ Agents SDK は MCP をサポートしており、これにより幅広い MCP
|
|
|
12
12
|
|
|
13
13
|
## MCP サーバー
|
|
14
14
|
|
|
15
|
-
現在、MCP 仕様では使用するトランスポート方式に基づき
|
|
15
|
+
現在、MCP 仕様では使用するトランスポート方式に基づき 3 種類のサーバーが定義されています。
|
|
16
16
|
|
|
17
|
-
1. **stdio** サーバー: アプリケーションのサブプロセスとして実行されます。ローカルで動かすイメージです。
|
|
17
|
+
1. **stdio** サーバー: アプリケーションのサブプロセスとして実行されます。ローカルで動かすイメージです。
|
|
18
18
|
2. **HTTP over SSE** サーバー: リモートで動作し、 URL 経由で接続します。
|
|
19
|
+
3. **Streamable HTTP** サーバー: MCP 仕様に定義された Streamable HTTP トランスポートを使用してリモートで動作します。
|
|
19
20
|
|
|
20
|
-
これらのサーバーへは [`MCPServerStdio`][agents.mcp.server.MCPServerStdio]
|
|
21
|
+
これらのサーバーへは [`MCPServerStdio`][agents.mcp.server.MCPServerStdio]、[`MCPServerSse`][agents.mcp.server.MCPServerSse]、[`MCPServerStreamableHttp`][agents.mcp.server.MCPServerStreamableHttp] クラスを使用して接続できます。
|
|
21
22
|
|
|
22
23
|
たとえば、[公式 MCP filesystem サーバー](https://www.npmjs.com/package/@modelcontextprotocol/server-filesystem)を利用する場合は次のようになります。
|
|
23
24
|
|
|
@@ -46,7 +47,7 @@ agent=Agent(
|
|
|
46
47
|
|
|
47
48
|
## キャッシュ
|
|
48
49
|
|
|
49
|
-
エージェントが実行されるたびに、MCP サーバーへ `list_tools()` が呼び出されます。サーバーがリモートの場合は特にレイテンシが発生します。ツール一覧を自動でキャッシュしたい場合は、[`MCPServerStdio`][agents.mcp.server.MCPServerStdio]
|
|
50
|
+
エージェントが実行されるたびに、MCP サーバーへ `list_tools()` が呼び出されます。サーバーがリモートの場合は特にレイテンシが発生します。ツール一覧を自動でキャッシュしたい場合は、[`MCPServerStdio`][agents.mcp.server.MCPServerStdio]、[`MCPServerSse`][agents.mcp.server.MCPServerSse]、[`MCPServerStreamableHttp`][agents.mcp.server.MCPServerStreamableHttp] の各クラスに `cache_tools_list=True` を渡してください。ツール一覧が変更されないと確信できる場合のみ使用してください。
|
|
50
51
|
|
|
51
52
|
キャッシュを無効化したい場合は、サーバーで `invalidate_tools_cache()` を呼び出します。
|
|
52
53
|
|
|
@@ -17,6 +17,10 @@ OpenAI は [`OpenAIResponsesModel`][agents.models.openai_responses.OpenAIRespons
|
|
|
17
17
|
- [`WebSearchTool`][agents.tool.WebSearchTool] はエージェントに Web 検索を行わせます。
|
|
18
18
|
- [`FileSearchTool`][agents.tool.FileSearchTool] は OpenAI ベクトルストアから情報を取得します。
|
|
19
19
|
- [`ComputerTool`][agents.tool.ComputerTool] はコンピュータ操作タスクを自動化します。
|
|
20
|
+
- [`CodeInterpreterTool`][agents.tool.CodeInterpreterTool] はサンドボックス環境でコードを実行します。
|
|
21
|
+
- [`HostedMCPTool`][agents.tool.HostedMCPTool] はリモート MCP サーバーのツールをモデルから直接利用できるようにします。
|
|
22
|
+
- [`ImageGenerationTool`][agents.tool.ImageGenerationTool] はプロンプトから画像を生成します。
|
|
23
|
+
- [`LocalShellTool`][agents.tool.LocalShellTool] はローカルマシンでシェルコマンドを実行します。
|
|
20
24
|
|
|
21
25
|
```python
|
|
22
26
|
from agents import Agent, FileSearchTool, Runner, WebSearchTool
|
|
@@ -119,4 +119,5 @@ async def main():
|
|
|
119
119
|
- [Comet Opik](https://www.comet.com/docs/opik/tracing/integrations/openai_agents)
|
|
120
120
|
- [Langfuse](https://langfuse.com/docs/integrations/openaiagentssdk/openai-agents)
|
|
121
121
|
- [Langtrace](https://docs.langtrace.ai/supported-integrations/llm-frameworks/openai-agents-sdk)
|
|
122
|
-
- [Okahu‑Monocle](https://github.com/monocle2ai/monocle)
|
|
122
|
+
- [Okahu‑Monocle](https://github.com/monocle2ai/monocle)
|
|
123
|
+
- [Portkey AI](https://portkey.ai/docs/integrations/agents/openai-agents)
|
|
@@ -8,12 +8,13 @@ The Agents SDK has support for MCP. This enables you to use a wide range of MCP
|
|
|
8
8
|
|
|
9
9
|
## MCP servers
|
|
10
10
|
|
|
11
|
-
Currently, the MCP spec defines
|
|
11
|
+
Currently, the MCP spec defines three kinds of servers, based on the transport mechanism they use:
|
|
12
12
|
|
|
13
13
|
1. **stdio** servers run as a subprocess of your application. You can think of them as running "locally".
|
|
14
14
|
2. **HTTP over SSE** servers run remotely. You connect to them via a URL.
|
|
15
|
+
3. **Streamable HTTP** servers run remotely using the Streamable HTTP transport defined in the MCP spec.
|
|
15
16
|
|
|
16
|
-
You can use the [`MCPServerStdio`][agents.mcp.server.MCPServerStdio]
|
|
17
|
+
You can use the [`MCPServerStdio`][agents.mcp.server.MCPServerStdio], [`MCPServerSse`][agents.mcp.server.MCPServerSse], and [`MCPServerStreamableHttp`][agents.mcp.server.MCPServerStreamableHttp] classes to connect to these servers.
|
|
17
18
|
|
|
18
19
|
For example, this is how you'd use the [official MCP filesystem server](https://www.npmjs.com/package/@modelcontextprotocol/server-filesystem).
|
|
19
20
|
|
|
@@ -42,7 +43,7 @@ agent=Agent(
|
|
|
42
43
|
|
|
43
44
|
## Caching
|
|
44
45
|
|
|
45
|
-
Every time an Agent runs, it calls `list_tools()` on the MCP server. This can be a latency hit, especially if the server is a remote server. To automatically cache the list of tools, you can pass `cache_tools_list=True` to
|
|
46
|
+
Every time an Agent runs, it calls `list_tools()` on the MCP server. This can be a latency hit, especially if the server is a remote server. To automatically cache the list of tools, you can pass `cache_tools_list=True` to [`MCPServerStdio`][agents.mcp.server.MCPServerStdio], [`MCPServerSse`][agents.mcp.server.MCPServerSse], and [`MCPServerStreamableHttp`][agents.mcp.server.MCPServerStreamableHttp]. You should only do this if you're certain the tool list will not change.
|
|
46
47
|
|
|
47
48
|
If you want to invalidate the cache, you can call `invalidate_tools_cache()` on the servers.
|
|
48
49
|
|
|
@@ -13,6 +13,10 @@ OpenAI offers a few built-in tools when using the [`OpenAIResponsesModel`][agent
|
|
|
13
13
|
- The [`WebSearchTool`][agents.tool.WebSearchTool] lets an agent search the web.
|
|
14
14
|
- The [`FileSearchTool`][agents.tool.FileSearchTool] allows retrieving information from your OpenAI Vector Stores.
|
|
15
15
|
- The [`ComputerTool`][agents.tool.ComputerTool] allows automating computer use tasks.
|
|
16
|
+
- The [`CodeInterpreterTool`][agents.tool.CodeInterpreterTool] lets the LLM execute code in a sandboxed environment.
|
|
17
|
+
- The [`HostedMCPTool`][agents.tool.HostedMCPTool] exposes a remote MCP server's tools to the model.
|
|
18
|
+
- The [`ImageGenerationTool`][agents.tool.ImageGenerationTool] generates images from a prompt.
|
|
19
|
+
- The [`LocalShellTool`][agents.tool.LocalShellTool] runs shell commands on your machine.
|
|
16
20
|
|
|
17
21
|
```python
|
|
18
22
|
from agents import Agent, FileSearchTool, Runner, WebSearchTool
|
|
@@ -266,7 +270,7 @@ The `agent.as_tool` function is a convenience method to make it easy to turn an
|
|
|
266
270
|
```python
|
|
267
271
|
@function_tool
|
|
268
272
|
async def run_my_agent() -> str:
|
|
269
|
-
|
|
273
|
+
"""A tool that runs the agent with custom configs"""
|
|
270
274
|
|
|
271
275
|
agent = Agent(name="My agent", instructions="...")
|
|
272
276
|
|
|
@@ -116,3 +116,4 @@ To customize this default setup, to send traces to alternative or additional bac
|
|
|
116
116
|
- [Langtrace](https://docs.langtrace.ai/supported-integrations/llm-frameworks/openai-agents-sdk)
|
|
117
117
|
- [Okahu-Monocle](https://github.com/monocle2ai/monocle)
|
|
118
118
|
- [Galileo](https://v2docs.galileo.ai/integrations/openai-agent-integration#openai-agent-integration)
|
|
119
|
+
- [Portkey AI](https://portkey.ai/docs/integrations/agents/openai-agents)
|
|
@@ -20,7 +20,7 @@ This example shows how to use guardrails.
|
|
|
20
20
|
Guardrails are checks that run in parallel to the agent's execution.
|
|
21
21
|
They can be used to do things like:
|
|
22
22
|
- Check if input messages are off-topic
|
|
23
|
-
- Check that
|
|
23
|
+
- Check that input messages don't violate any policies
|
|
24
24
|
- Take over control of the agent's execution if an unexpected input is detected
|
|
25
25
|
|
|
26
26
|
In this example, we'll setup an input guardrail that trips if the user is asking to do math homework.
|
|
@@ -14,6 +14,7 @@ from .exceptions import (
|
|
|
14
14
|
MaxTurnsExceeded,
|
|
15
15
|
ModelBehaviorError,
|
|
16
16
|
OutputGuardrailTripwireTriggered,
|
|
17
|
+
RunErrorDetails,
|
|
17
18
|
UserError,
|
|
18
19
|
)
|
|
19
20
|
from .guardrail import (
|
|
@@ -204,6 +205,7 @@ __all__ = [
|
|
|
204
205
|
"AgentHooks",
|
|
205
206
|
"RunContextWrapper",
|
|
206
207
|
"TContext",
|
|
208
|
+
"RunErrorDetails",
|
|
207
209
|
"RunResult",
|
|
208
210
|
"RunResultStreaming",
|
|
209
211
|
"RunConfig",
|
|
@@ -33,6 +33,7 @@ from openai.types.responses.response_output_item import (
|
|
|
33
33
|
ImageGenerationCall,
|
|
34
34
|
LocalShellCall,
|
|
35
35
|
McpApprovalRequest,
|
|
36
|
+
McpCall,
|
|
36
37
|
McpListTools,
|
|
37
38
|
)
|
|
38
39
|
from openai.types.responses.response_reasoning_item import ResponseReasoningItem
|
|
@@ -456,6 +457,9 @@ class RunImpl:
|
|
|
456
457
|
)
|
|
457
458
|
elif isinstance(output, McpListTools):
|
|
458
459
|
items.append(MCPListToolsItem(raw_item=output, agent=agent))
|
|
460
|
+
elif isinstance(output, McpCall):
|
|
461
|
+
items.append(ToolCallItem(raw_item=output, agent=agent))
|
|
462
|
+
tools_used.append("mcp")
|
|
459
463
|
elif isinstance(output, ImageGenerationCall):
|
|
460
464
|
items.append(ToolCallItem(raw_item=output, agent=agent))
|
|
461
465
|
tools_used.append("image_generation")
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
|
+
import asyncio
|
|
3
4
|
import dataclasses
|
|
4
5
|
import inspect
|
|
5
6
|
from collections.abc import Awaitable
|
|
@@ -17,7 +18,7 @@ from .mcp import MCPUtil
|
|
|
17
18
|
from .model_settings import ModelSettings
|
|
18
19
|
from .models.interface import Model
|
|
19
20
|
from .run_context import RunContextWrapper, TContext
|
|
20
|
-
from .tool import FunctionToolResult, Tool, function_tool
|
|
21
|
+
from .tool import FunctionTool, FunctionToolResult, Tool, function_tool
|
|
21
22
|
from .util import _transforms
|
|
22
23
|
from .util._types import MaybeAwaitable
|
|
23
24
|
|
|
@@ -246,7 +247,22 @@ class Agent(Generic[TContext]):
|
|
|
246
247
|
convert_schemas_to_strict = self.mcp_config.get("convert_schemas_to_strict", False)
|
|
247
248
|
return await MCPUtil.get_all_function_tools(self.mcp_servers, convert_schemas_to_strict)
|
|
248
249
|
|
|
249
|
-
async def get_all_tools(self) -> list[Tool]:
|
|
250
|
+
async def get_all_tools(self, run_context: RunContextWrapper[Any]) -> list[Tool]:
|
|
250
251
|
"""All agent tools, including MCP tools and function tools."""
|
|
251
252
|
mcp_tools = await self.get_mcp_tools()
|
|
252
|
-
|
|
253
|
+
|
|
254
|
+
async def _check_tool_enabled(tool: Tool) -> bool:
|
|
255
|
+
if not isinstance(tool, FunctionTool):
|
|
256
|
+
return True
|
|
257
|
+
|
|
258
|
+
attr = tool.is_enabled
|
|
259
|
+
if isinstance(attr, bool):
|
|
260
|
+
return attr
|
|
261
|
+
res = attr(run_context, self)
|
|
262
|
+
if inspect.isawaitable(res):
|
|
263
|
+
return bool(await res)
|
|
264
|
+
return bool(res)
|
|
265
|
+
|
|
266
|
+
results = await asyncio.gather(*(_check_tool_enabled(t) for t in self.tools))
|
|
267
|
+
enabled: list[Tool] = [t for t, ok in zip(self.tools, results) if ok]
|
|
268
|
+
return [*mcp_tools, *enabled]
|
|
@@ -38,7 +38,7 @@ class AgentOutputSchemaBase(abc.ABC):
|
|
|
38
38
|
@abc.abstractmethod
|
|
39
39
|
def is_strict_json_schema(self) -> bool:
|
|
40
40
|
"""Whether the JSON schema is in strict mode. Strict mode constrains the JSON schema
|
|
41
|
-
features, but guarantees
|
|
41
|
+
features, but guarantees valid JSON. See here for details:
|
|
42
42
|
https://platform.openai.com/docs/guides/structured-outputs#supported-schemas
|
|
43
43
|
"""
|
|
44
44
|
pass
|
|
@@ -1,12 +1,42 @@
|
|
|
1
|
-
from
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from dataclasses import dataclass
|
|
4
|
+
from typing import TYPE_CHECKING, Any
|
|
2
5
|
|
|
3
6
|
if TYPE_CHECKING:
|
|
7
|
+
from .agent import Agent
|
|
4
8
|
from .guardrail import InputGuardrailResult, OutputGuardrailResult
|
|
9
|
+
from .items import ModelResponse, RunItem, TResponseInputItem
|
|
10
|
+
from .run_context import RunContextWrapper
|
|
11
|
+
|
|
12
|
+
from .util._pretty_print import pretty_print_run_error_details
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
@dataclass
|
|
16
|
+
class RunErrorDetails:
|
|
17
|
+
"""Data collected from an agent run when an exception occurs."""
|
|
18
|
+
|
|
19
|
+
input: str | list[TResponseInputItem]
|
|
20
|
+
new_items: list[RunItem]
|
|
21
|
+
raw_responses: list[ModelResponse]
|
|
22
|
+
last_agent: Agent[Any]
|
|
23
|
+
context_wrapper: RunContextWrapper[Any]
|
|
24
|
+
input_guardrail_results: list[InputGuardrailResult]
|
|
25
|
+
output_guardrail_results: list[OutputGuardrailResult]
|
|
26
|
+
|
|
27
|
+
def __str__(self) -> str:
|
|
28
|
+
return pretty_print_run_error_details(self)
|
|
5
29
|
|
|
6
30
|
|
|
7
31
|
class AgentsException(Exception):
|
|
8
32
|
"""Base class for all exceptions in the Agents SDK."""
|
|
9
33
|
|
|
34
|
+
run_data: RunErrorDetails | None
|
|
35
|
+
|
|
36
|
+
def __init__(self, *args: object) -> None:
|
|
37
|
+
super().__init__(*args)
|
|
38
|
+
self.run_data = None
|
|
39
|
+
|
|
10
40
|
|
|
11
41
|
class MaxTurnsExceeded(AgentsException):
|
|
12
42
|
"""Exception raised when the maximum number of turns is exceeded."""
|
|
@@ -15,6 +45,7 @@ class MaxTurnsExceeded(AgentsException):
|
|
|
15
45
|
|
|
16
46
|
def __init__(self, message: str):
|
|
17
47
|
self.message = message
|
|
48
|
+
super().__init__(message)
|
|
18
49
|
|
|
19
50
|
|
|
20
51
|
class ModelBehaviorError(AgentsException):
|
|
@@ -26,6 +57,7 @@ class ModelBehaviorError(AgentsException):
|
|
|
26
57
|
|
|
27
58
|
def __init__(self, message: str):
|
|
28
59
|
self.message = message
|
|
60
|
+
super().__init__(message)
|
|
29
61
|
|
|
30
62
|
|
|
31
63
|
class UserError(AgentsException):
|
|
@@ -35,15 +67,16 @@ class UserError(AgentsException):
|
|
|
35
67
|
|
|
36
68
|
def __init__(self, message: str):
|
|
37
69
|
self.message = message
|
|
70
|
+
super().__init__(message)
|
|
38
71
|
|
|
39
72
|
|
|
40
73
|
class InputGuardrailTripwireTriggered(AgentsException):
|
|
41
74
|
"""Exception raised when a guardrail tripwire is triggered."""
|
|
42
75
|
|
|
43
|
-
guardrail_result:
|
|
76
|
+
guardrail_result: InputGuardrailResult
|
|
44
77
|
"""The result data of the guardrail that was triggered."""
|
|
45
78
|
|
|
46
|
-
def __init__(self, guardrail_result:
|
|
79
|
+
def __init__(self, guardrail_result: InputGuardrailResult):
|
|
47
80
|
self.guardrail_result = guardrail_result
|
|
48
81
|
super().__init__(
|
|
49
82
|
f"Guardrail {guardrail_result.guardrail.__class__.__name__} triggered tripwire"
|
|
@@ -53,10 +86,10 @@ class InputGuardrailTripwireTriggered(AgentsException):
|
|
|
53
86
|
class OutputGuardrailTripwireTriggered(AgentsException):
|
|
54
87
|
"""Exception raised when a guardrail tripwire is triggered."""
|
|
55
88
|
|
|
56
|
-
guardrail_result:
|
|
89
|
+
guardrail_result: OutputGuardrailResult
|
|
57
90
|
"""The result data of the guardrail that was triggered."""
|
|
58
91
|
|
|
59
|
-
def __init__(self, guardrail_result:
|
|
92
|
+
def __init__(self, guardrail_result: OutputGuardrailResult):
|
|
60
93
|
self.guardrail_result = guardrail_result
|
|
61
94
|
super().__init__(
|
|
62
95
|
f"Guardrail {guardrail_result.guardrail.__class__.__name__} triggered tripwire"
|
|
@@ -5,7 +5,6 @@ import time
|
|
|
5
5
|
from collections.abc import AsyncIterator
|
|
6
6
|
from typing import Any, Literal, cast, overload
|
|
7
7
|
|
|
8
|
-
import litellm.types
|
|
9
8
|
from openai.types.responses.response_usage import InputTokensDetails, OutputTokensDetails
|
|
10
9
|
|
|
11
10
|
from agents.exceptions import ModelBehaviorError
|
|
@@ -112,11 +111,13 @@ class LitellmModel(Model):
|
|
|
112
111
|
cached_tokens=getattr(
|
|
113
112
|
response_usage.prompt_tokens_details, "cached_tokens", 0
|
|
114
113
|
)
|
|
114
|
+
or 0
|
|
115
115
|
),
|
|
116
116
|
output_tokens_details=OutputTokensDetails(
|
|
117
117
|
reasoning_tokens=getattr(
|
|
118
118
|
response_usage.completion_tokens_details, "reasoning_tokens", 0
|
|
119
119
|
)
|
|
120
|
+
or 0
|
|
120
121
|
),
|
|
121
122
|
)
|
|
122
123
|
if response.usage
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
from
|
|
1
|
+
from __future__ import annotations
|
|
2
2
|
|
|
3
3
|
import graphviz # type: ignore
|
|
4
4
|
|
|
@@ -31,7 +31,9 @@ def get_main_graph(agent: Agent) -> str:
|
|
|
31
31
|
return "".join(parts)
|
|
32
32
|
|
|
33
33
|
|
|
34
|
-
def get_all_nodes(
|
|
34
|
+
def get_all_nodes(
|
|
35
|
+
agent: Agent, parent: Agent | None = None, visited: set[str] | None = None
|
|
36
|
+
) -> str:
|
|
35
37
|
"""
|
|
36
38
|
Recursively generates the nodes for the given agent and its handoffs in DOT format.
|
|
37
39
|
|
|
@@ -41,17 +43,23 @@ def get_all_nodes(agent: Agent, parent: Optional[Agent] = None) -> str:
|
|
|
41
43
|
Returns:
|
|
42
44
|
str: The DOT format string representing the nodes.
|
|
43
45
|
"""
|
|
46
|
+
if visited is None:
|
|
47
|
+
visited = set()
|
|
48
|
+
if agent.name in visited:
|
|
49
|
+
return ""
|
|
50
|
+
visited.add(agent.name)
|
|
51
|
+
|
|
44
52
|
parts = []
|
|
45
53
|
|
|
46
54
|
# Start and end the graph
|
|
47
|
-
parts.append(
|
|
48
|
-
'"__start__" [label="__start__", shape=ellipse, style=filled, '
|
|
49
|
-
"fillcolor=lightblue, width=0.5, height=0.3];"
|
|
50
|
-
'"__end__" [label="__end__", shape=ellipse, style=filled, '
|
|
51
|
-
"fillcolor=lightblue, width=0.5, height=0.3];"
|
|
52
|
-
)
|
|
53
|
-
# Ensure parent agent node is colored
|
|
54
55
|
if not parent:
|
|
56
|
+
parts.append(
|
|
57
|
+
'"__start__" [label="__start__", shape=ellipse, style=filled, '
|
|
58
|
+
"fillcolor=lightblue, width=0.5, height=0.3];"
|
|
59
|
+
'"__end__" [label="__end__", shape=ellipse, style=filled, '
|
|
60
|
+
"fillcolor=lightblue, width=0.5, height=0.3];"
|
|
61
|
+
)
|
|
62
|
+
# Ensure parent agent node is colored
|
|
55
63
|
parts.append(
|
|
56
64
|
f'"{agent.name}" [label="{agent.name}", shape=box, style=filled, '
|
|
57
65
|
"fillcolor=lightyellow, width=1.5, height=0.8];"
|
|
@@ -71,17 +79,20 @@ def get_all_nodes(agent: Agent, parent: Optional[Agent] = None) -> str:
|
|
|
71
79
|
f"fillcolor=lightyellow, width=1.5, height=0.8];"
|
|
72
80
|
)
|
|
73
81
|
if isinstance(handoff, Agent):
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
82
|
+
if handoff.name not in visited:
|
|
83
|
+
parts.append(
|
|
84
|
+
f'"{handoff.name}" [label="{handoff.name}", '
|
|
85
|
+
f"shape=box, style=filled, style=rounded, "
|
|
86
|
+
f"fillcolor=lightyellow, width=1.5, height=0.8];"
|
|
87
|
+
)
|
|
88
|
+
parts.append(get_all_nodes(handoff, agent, visited))
|
|
80
89
|
|
|
81
90
|
return "".join(parts)
|
|
82
91
|
|
|
83
92
|
|
|
84
|
-
def get_all_edges(
|
|
93
|
+
def get_all_edges(
|
|
94
|
+
agent: Agent, parent: Agent | None = None, visited: set[str] | None = None
|
|
95
|
+
) -> str:
|
|
85
96
|
"""
|
|
86
97
|
Recursively generates the edges for the given agent and its handoffs in DOT format.
|
|
87
98
|
|
|
@@ -92,6 +103,12 @@ def get_all_edges(agent: Agent, parent: Optional[Agent] = None) -> str:
|
|
|
92
103
|
Returns:
|
|
93
104
|
str: The DOT format string representing the edges.
|
|
94
105
|
"""
|
|
106
|
+
if visited is None:
|
|
107
|
+
visited = set()
|
|
108
|
+
if agent.name in visited:
|
|
109
|
+
return ""
|
|
110
|
+
visited.add(agent.name)
|
|
111
|
+
|
|
95
112
|
parts = []
|
|
96
113
|
|
|
97
114
|
if not parent:
|
|
@@ -109,7 +126,7 @@ def get_all_edges(agent: Agent, parent: Optional[Agent] = None) -> str:
|
|
|
109
126
|
if isinstance(handoff, Agent):
|
|
110
127
|
parts.append(f"""
|
|
111
128
|
"{agent.name}" -> "{handoff.name}";""")
|
|
112
|
-
parts.append(get_all_edges(handoff, agent))
|
|
129
|
+
parts.append(get_all_edges(handoff, agent, visited))
|
|
113
130
|
|
|
114
131
|
if not agent.handoffs and not isinstance(agent, Tool): # type: ignore
|
|
115
132
|
parts.append(f'"{agent.name}" -> "__end__";')
|
|
@@ -117,7 +134,7 @@ def get_all_edges(agent: Agent, parent: Optional[Agent] = None) -> str:
|
|
|
117
134
|
return "".join(parts)
|
|
118
135
|
|
|
119
136
|
|
|
120
|
-
def draw_graph(agent: Agent, filename:
|
|
137
|
+
def draw_graph(agent: Agent, filename: str | None = None) -> graphviz.Source:
|
|
121
138
|
"""
|
|
122
139
|
Draws the graph for the given agent and optionally saves it as a PNG file.
|
|
123
140
|
|
|
@@ -168,7 +168,7 @@ def handoff(
|
|
|
168
168
|
input_filter: a function that filters the inputs that are passed to the next agent.
|
|
169
169
|
"""
|
|
170
170
|
assert (on_handoff and input_type) or not (on_handoff and input_type), (
|
|
171
|
-
"You must provide either both
|
|
171
|
+
"You must provide either both on_handoff and input_type, or neither"
|
|
172
172
|
)
|
|
173
173
|
type_adapter: TypeAdapter[Any] | None
|
|
174
174
|
if input_type is not None:
|
|
@@ -88,7 +88,7 @@ class _MCPServerWithClientSession(MCPServer, abc.ABC):
|
|
|
88
88
|
tuple[
|
|
89
89
|
MemoryObjectReceiveStream[SessionMessage | Exception],
|
|
90
90
|
MemoryObjectSendStream[SessionMessage],
|
|
91
|
-
GetSessionIdCallback | None
|
|
91
|
+
GetSessionIdCallback | None,
|
|
92
92
|
]
|
|
93
93
|
]:
|
|
94
94
|
"""Create the streams for the server."""
|
|
@@ -243,7 +243,7 @@ class MCPServerStdio(_MCPServerWithClientSession):
|
|
|
243
243
|
tuple[
|
|
244
244
|
MemoryObjectReceiveStream[SessionMessage | Exception],
|
|
245
245
|
MemoryObjectSendStream[SessionMessage],
|
|
246
|
-
GetSessionIdCallback | None
|
|
246
|
+
GetSessionIdCallback | None,
|
|
247
247
|
]
|
|
248
248
|
]:
|
|
249
249
|
"""Create the streams for the server."""
|
|
@@ -314,7 +314,7 @@ class MCPServerSse(_MCPServerWithClientSession):
|
|
|
314
314
|
tuple[
|
|
315
315
|
MemoryObjectReceiveStream[SessionMessage | Exception],
|
|
316
316
|
MemoryObjectSendStream[SessionMessage],
|
|
317
|
-
GetSessionIdCallback | None
|
|
317
|
+
GetSessionIdCallback | None,
|
|
318
318
|
]
|
|
319
319
|
]:
|
|
320
320
|
"""Create the streams for the server."""
|
|
@@ -394,7 +394,7 @@ class MCPServerStreamableHttp(_MCPServerWithClientSession):
|
|
|
394
394
|
tuple[
|
|
395
395
|
MemoryObjectReceiveStream[SessionMessage | Exception],
|
|
396
396
|
MemoryObjectSendStream[SessionMessage],
|
|
397
|
-
GetSessionIdCallback | None
|
|
397
|
+
GetSessionIdCallback | None,
|
|
398
398
|
]
|
|
399
399
|
]:
|
|
400
400
|
"""Create the streams for the server."""
|
|
@@ -403,7 +403,7 @@ class MCPServerStreamableHttp(_MCPServerWithClientSession):
|
|
|
403
403
|
headers=self.params.get("headers", None),
|
|
404
404
|
timeout=self.params.get("timeout", timedelta(seconds=30)),
|
|
405
405
|
sse_read_timeout=self.params.get("sse_read_timeout", timedelta(seconds=60 * 5)),
|
|
406
|
-
terminate_on_close=self.params.get("terminate_on_close", True)
|
|
406
|
+
terminate_on_close=self.params.get("terminate_on_close", True),
|
|
407
407
|
)
|
|
408
408
|
|
|
409
409
|
@property
|
|
@@ -116,7 +116,7 @@ class MCPUtil:
|
|
|
116
116
|
if len(result.content) == 1:
|
|
117
117
|
tool_output = result.content[0].model_dump_json()
|
|
118
118
|
elif len(result.content) > 1:
|
|
119
|
-
tool_output = json.dumps([item.model_dump() for item in result.content])
|
|
119
|
+
tool_output = json.dumps([item.model_dump(mode="json") for item in result.content])
|
|
120
120
|
else:
|
|
121
121
|
logger.error(f"Errored MCP tool result: {result}")
|
|
122
122
|
tool_output = "Error running tool."
|
|
@@ -71,12 +71,22 @@ class OpenAIChatCompletionsModel(Model):
|
|
|
71
71
|
stream=False,
|
|
72
72
|
)
|
|
73
73
|
|
|
74
|
+
first_choice = response.choices[0]
|
|
75
|
+
message = first_choice.message
|
|
76
|
+
|
|
74
77
|
if _debug.DONT_LOG_MODEL_DATA:
|
|
75
78
|
logger.debug("Received model response")
|
|
76
79
|
else:
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
+
if message is not None:
|
|
81
|
+
logger.debug(
|
|
82
|
+
"LLM resp:\n%s\n",
|
|
83
|
+
json.dumps(message.model_dump(), indent=2),
|
|
84
|
+
)
|
|
85
|
+
else:
|
|
86
|
+
logger.debug(
|
|
87
|
+
"LLM resp had no message. finish_reason: %s",
|
|
88
|
+
first_choice.finish_reason,
|
|
89
|
+
)
|
|
80
90
|
|
|
81
91
|
usage = (
|
|
82
92
|
Usage(
|
|
@@ -101,13 +111,15 @@ class OpenAIChatCompletionsModel(Model):
|
|
|
101
111
|
else Usage()
|
|
102
112
|
)
|
|
103
113
|
if tracing.include_data():
|
|
104
|
-
span_generation.span_data.output =
|
|
114
|
+
span_generation.span_data.output = (
|
|
115
|
+
[message.model_dump()] if message is not None else []
|
|
116
|
+
)
|
|
105
117
|
span_generation.span_data.usage = {
|
|
106
118
|
"input_tokens": usage.input_tokens,
|
|
107
119
|
"output_tokens": usage.output_tokens,
|
|
108
120
|
}
|
|
109
121
|
|
|
110
|
-
items = Converter.message_to_output_items(
|
|
122
|
+
items = Converter.message_to_output_items(message) if message is not None else []
|
|
111
123
|
|
|
112
124
|
return ModelResponse(
|
|
113
125
|
output=items,
|