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.

Files changed (357) hide show
  1. {openai_agents-0.0.16 → openai_agents-0.0.17}/PKG-INFO +1 -1
  2. {openai_agents-0.0.16 → openai_agents-0.0.17}/docs/ja/mcp.md +5 -4
  3. {openai_agents-0.0.16 → openai_agents-0.0.17}/docs/ja/tools.md +4 -0
  4. {openai_agents-0.0.16 → openai_agents-0.0.17}/docs/ja/tracing.md +2 -1
  5. {openai_agents-0.0.16 → openai_agents-0.0.17}/docs/mcp.md +4 -3
  6. {openai_agents-0.0.16 → openai_agents-0.0.17}/docs/tools.md +5 -1
  7. {openai_agents-0.0.16 → openai_agents-0.0.17}/docs/tracing.md +1 -0
  8. {openai_agents-0.0.16 → openai_agents-0.0.17}/examples/agent_patterns/input_guardrails.py +1 -1
  9. {openai_agents-0.0.16 → openai_agents-0.0.17}/examples/hosted_mcp/approvals.py +1 -1
  10. {openai_agents-0.0.16 → openai_agents-0.0.17}/examples/hosted_mcp/simple.py +1 -1
  11. {openai_agents-0.0.16 → openai_agents-0.0.17}/pyproject.toml +1 -1
  12. {openai_agents-0.0.16 → openai_agents-0.0.17}/src/agents/__init__.py +2 -0
  13. {openai_agents-0.0.16 → openai_agents-0.0.17}/src/agents/_run_impl.py +4 -0
  14. {openai_agents-0.0.16 → openai_agents-0.0.17}/src/agents/agent.py +19 -3
  15. {openai_agents-0.0.16 → openai_agents-0.0.17}/src/agents/agent_output.py +1 -1
  16. {openai_agents-0.0.16 → openai_agents-0.0.17}/src/agents/exceptions.py +38 -5
  17. {openai_agents-0.0.16 → openai_agents-0.0.17}/src/agents/extensions/models/litellm_model.py +2 -1
  18. {openai_agents-0.0.16 → openai_agents-0.0.17}/src/agents/extensions/visualization.py +35 -18
  19. {openai_agents-0.0.16 → openai_agents-0.0.17}/src/agents/handoffs.py +1 -1
  20. {openai_agents-0.0.16 → openai_agents-0.0.17}/src/agents/mcp/server.py +5 -5
  21. {openai_agents-0.0.16 → openai_agents-0.0.17}/src/agents/mcp/util.py +1 -1
  22. {openai_agents-0.0.16 → openai_agents-0.0.17}/src/agents/models/openai_chatcompletions.py +17 -5
  23. {openai_agents-0.0.16 → openai_agents-0.0.17}/src/agents/result.py +43 -13
  24. {openai_agents-0.0.16 → openai_agents-0.0.17}/src/agents/run.py +33 -6
  25. {openai_agents-0.0.16 → openai_agents-0.0.17}/src/agents/stream_events.py +1 -0
  26. {openai_agents-0.0.16 → openai_agents-0.0.17}/src/agents/tool.py +16 -1
  27. {openai_agents-0.0.16 → openai_agents-0.0.17}/src/agents/tracing/processors.py +29 -3
  28. {openai_agents-0.0.16 → openai_agents-0.0.17}/src/agents/util/_pretty_print.py +12 -0
  29. {openai_agents-0.0.16 → openai_agents-0.0.17}/src/agents/voice/model.py +2 -0
  30. {openai_agents-0.0.16 → openai_agents-0.0.17}/tests/mcp/test_mcp_tracing.py +39 -21
  31. {openai_agents-0.0.16 → openai_agents-0.0.17}/tests/models/test_litellm_extra_body.py +1 -2
  32. {openai_agents-0.0.16 → openai_agents-0.0.17}/tests/test_agent_runner.py +35 -0
  33. {openai_agents-0.0.16 → openai_agents-0.0.17}/tests/test_agent_runner_streamed.py +37 -0
  34. {openai_agents-0.0.16 → openai_agents-0.0.17}/tests/test_function_tool.py +42 -1
  35. {openai_agents-0.0.16 → openai_agents-0.0.17}/tests/test_openai_chatcompletions.py +34 -0
  36. openai_agents-0.0.17/tests/test_run_error_details.py +48 -0
  37. {openai_agents-0.0.16 → openai_agents-0.0.17}/tests/test_run_step_execution.py +1 -1
  38. {openai_agents-0.0.16 → openai_agents-0.0.17}/tests/test_run_step_processing.py +18 -14
  39. {openai_agents-0.0.16 → openai_agents-0.0.17}/tests/test_tracing_errors_streamed.py +0 -4
  40. {openai_agents-0.0.16 → openai_agents-0.0.17}/tests/test_visualization.py +15 -0
  41. {openai_agents-0.0.16 → openai_agents-0.0.17}/uv.lock +1 -1
  42. {openai_agents-0.0.16 → openai_agents-0.0.17}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  43. {openai_agents-0.0.16 → openai_agents-0.0.17}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
  44. {openai_agents-0.0.16 → openai_agents-0.0.17}/.github/ISSUE_TEMPLATE/model_provider.md +0 -0
  45. {openai_agents-0.0.16 → openai_agents-0.0.17}/.github/ISSUE_TEMPLATE/question.md +0 -0
  46. {openai_agents-0.0.16 → openai_agents-0.0.17}/.github/PULL_REQUEST_TEMPLATE/pull_request_template.md +0 -0
  47. {openai_agents-0.0.16 → openai_agents-0.0.17}/.github/workflows/docs.yml +0 -0
  48. {openai_agents-0.0.16 → openai_agents-0.0.17}/.github/workflows/issues.yml +0 -0
  49. {openai_agents-0.0.16 → openai_agents-0.0.17}/.github/workflows/publish.yml +0 -0
  50. {openai_agents-0.0.16 → openai_agents-0.0.17}/.github/workflows/tests.yml +0 -0
  51. {openai_agents-0.0.16 → openai_agents-0.0.17}/.gitignore +0 -0
  52. {openai_agents-0.0.16 → openai_agents-0.0.17}/.prettierrc +0 -0
  53. {openai_agents-0.0.16 → openai_agents-0.0.17}/.vscode/settings.json +0 -0
  54. {openai_agents-0.0.16 → openai_agents-0.0.17}/AGENTS.md +0 -0
  55. {openai_agents-0.0.16 → openai_agents-0.0.17}/LICENSE +0 -0
  56. {openai_agents-0.0.16 → openai_agents-0.0.17}/Makefile +0 -0
  57. {openai_agents-0.0.16 → openai_agents-0.0.17}/README.md +0 -0
  58. {openai_agents-0.0.16 → openai_agents-0.0.17}/docs/agents.md +0 -0
  59. {openai_agents-0.0.16 → openai_agents-0.0.17}/docs/assets/images/favicon-platform.svg +0 -0
  60. {openai_agents-0.0.16 → openai_agents-0.0.17}/docs/assets/images/graph.png +0 -0
  61. {openai_agents-0.0.16 → openai_agents-0.0.17}/docs/assets/images/mcp-tracing.jpg +0 -0
  62. {openai_agents-0.0.16 → openai_agents-0.0.17}/docs/assets/images/orchestration.png +0 -0
  63. {openai_agents-0.0.16 → openai_agents-0.0.17}/docs/assets/logo.svg +0 -0
  64. {openai_agents-0.0.16 → openai_agents-0.0.17}/docs/config.md +0 -0
  65. {openai_agents-0.0.16 → openai_agents-0.0.17}/docs/context.md +0 -0
  66. {openai_agents-0.0.16 → openai_agents-0.0.17}/docs/examples.md +0 -0
  67. {openai_agents-0.0.16 → openai_agents-0.0.17}/docs/guardrails.md +0 -0
  68. {openai_agents-0.0.16 → openai_agents-0.0.17}/docs/handoffs.md +0 -0
  69. {openai_agents-0.0.16 → openai_agents-0.0.17}/docs/index.md +0 -0
  70. {openai_agents-0.0.16 → openai_agents-0.0.17}/docs/ja/agents.md +0 -0
  71. {openai_agents-0.0.16 → openai_agents-0.0.17}/docs/ja/config.md +0 -0
  72. {openai_agents-0.0.16 → openai_agents-0.0.17}/docs/ja/context.md +0 -0
  73. {openai_agents-0.0.16 → openai_agents-0.0.17}/docs/ja/examples.md +0 -0
  74. {openai_agents-0.0.16 → openai_agents-0.0.17}/docs/ja/guardrails.md +0 -0
  75. {openai_agents-0.0.16 → openai_agents-0.0.17}/docs/ja/handoffs.md +0 -0
  76. {openai_agents-0.0.16 → openai_agents-0.0.17}/docs/ja/index.md +0 -0
  77. {openai_agents-0.0.16 → openai_agents-0.0.17}/docs/ja/models/index.md +0 -0
  78. {openai_agents-0.0.16 → openai_agents-0.0.17}/docs/ja/models/litellm.md +0 -0
  79. {openai_agents-0.0.16 → openai_agents-0.0.17}/docs/ja/models.md +0 -0
  80. {openai_agents-0.0.16 → openai_agents-0.0.17}/docs/ja/multi_agent.md +0 -0
  81. {openai_agents-0.0.16 → openai_agents-0.0.17}/docs/ja/quickstart.md +0 -0
  82. {openai_agents-0.0.16 → openai_agents-0.0.17}/docs/ja/results.md +0 -0
  83. {openai_agents-0.0.16 → openai_agents-0.0.17}/docs/ja/running_agents.md +0 -0
  84. {openai_agents-0.0.16 → openai_agents-0.0.17}/docs/ja/streaming.md +0 -0
  85. {openai_agents-0.0.16 → openai_agents-0.0.17}/docs/ja/visualization.md +0 -0
  86. {openai_agents-0.0.16 → openai_agents-0.0.17}/docs/ja/voice/pipeline.md +0 -0
  87. {openai_agents-0.0.16 → openai_agents-0.0.17}/docs/ja/voice/quickstart.md +0 -0
  88. {openai_agents-0.0.16 → openai_agents-0.0.17}/docs/ja/voice/tracing.md +0 -0
  89. {openai_agents-0.0.16 → openai_agents-0.0.17}/docs/models/index.md +0 -0
  90. {openai_agents-0.0.16 → openai_agents-0.0.17}/docs/models/litellm.md +0 -0
  91. {openai_agents-0.0.16 → openai_agents-0.0.17}/docs/multi_agent.md +0 -0
  92. {openai_agents-0.0.16 → openai_agents-0.0.17}/docs/quickstart.md +0 -0
  93. {openai_agents-0.0.16 → openai_agents-0.0.17}/docs/ref/agent.md +0 -0
  94. {openai_agents-0.0.16 → openai_agents-0.0.17}/docs/ref/agent_output.md +0 -0
  95. {openai_agents-0.0.16 → openai_agents-0.0.17}/docs/ref/exceptions.md +0 -0
  96. {openai_agents-0.0.16 → openai_agents-0.0.17}/docs/ref/extensions/handoff_filters.md +0 -0
  97. {openai_agents-0.0.16 → openai_agents-0.0.17}/docs/ref/extensions/handoff_prompt.md +0 -0
  98. {openai_agents-0.0.16 → openai_agents-0.0.17}/docs/ref/extensions/litellm.md +0 -0
  99. {openai_agents-0.0.16 → openai_agents-0.0.17}/docs/ref/function_schema.md +0 -0
  100. {openai_agents-0.0.16 → openai_agents-0.0.17}/docs/ref/guardrail.md +0 -0
  101. {openai_agents-0.0.16 → openai_agents-0.0.17}/docs/ref/handoffs.md +0 -0
  102. {openai_agents-0.0.16 → openai_agents-0.0.17}/docs/ref/index.md +0 -0
  103. {openai_agents-0.0.16 → openai_agents-0.0.17}/docs/ref/items.md +0 -0
  104. {openai_agents-0.0.16 → openai_agents-0.0.17}/docs/ref/lifecycle.md +0 -0
  105. {openai_agents-0.0.16 → openai_agents-0.0.17}/docs/ref/mcp/server.md +0 -0
  106. {openai_agents-0.0.16 → openai_agents-0.0.17}/docs/ref/mcp/util.md +0 -0
  107. {openai_agents-0.0.16 → openai_agents-0.0.17}/docs/ref/model_settings.md +0 -0
  108. {openai_agents-0.0.16 → openai_agents-0.0.17}/docs/ref/models/interface.md +0 -0
  109. {openai_agents-0.0.16 → openai_agents-0.0.17}/docs/ref/models/openai_chatcompletions.md +0 -0
  110. {openai_agents-0.0.16 → openai_agents-0.0.17}/docs/ref/models/openai_responses.md +0 -0
  111. {openai_agents-0.0.16 → openai_agents-0.0.17}/docs/ref/result.md +0 -0
  112. {openai_agents-0.0.16 → openai_agents-0.0.17}/docs/ref/run.md +0 -0
  113. {openai_agents-0.0.16 → openai_agents-0.0.17}/docs/ref/run_context.md +0 -0
  114. {openai_agents-0.0.16 → openai_agents-0.0.17}/docs/ref/stream_events.md +0 -0
  115. {openai_agents-0.0.16 → openai_agents-0.0.17}/docs/ref/tool.md +0 -0
  116. {openai_agents-0.0.16 → openai_agents-0.0.17}/docs/ref/tracing/create.md +0 -0
  117. {openai_agents-0.0.16 → openai_agents-0.0.17}/docs/ref/tracing/index.md +0 -0
  118. {openai_agents-0.0.16 → openai_agents-0.0.17}/docs/ref/tracing/processor_interface.md +0 -0
  119. {openai_agents-0.0.16 → openai_agents-0.0.17}/docs/ref/tracing/processors.md +0 -0
  120. {openai_agents-0.0.16 → openai_agents-0.0.17}/docs/ref/tracing/scope.md +0 -0
  121. {openai_agents-0.0.16 → openai_agents-0.0.17}/docs/ref/tracing/setup.md +0 -0
  122. {openai_agents-0.0.16 → openai_agents-0.0.17}/docs/ref/tracing/span_data.md +0 -0
  123. {openai_agents-0.0.16 → openai_agents-0.0.17}/docs/ref/tracing/spans.md +0 -0
  124. {openai_agents-0.0.16 → openai_agents-0.0.17}/docs/ref/tracing/traces.md +0 -0
  125. {openai_agents-0.0.16 → openai_agents-0.0.17}/docs/ref/tracing/util.md +0 -0
  126. {openai_agents-0.0.16 → openai_agents-0.0.17}/docs/ref/usage.md +0 -0
  127. {openai_agents-0.0.16 → openai_agents-0.0.17}/docs/ref/voice/events.md +0 -0
  128. {openai_agents-0.0.16 → openai_agents-0.0.17}/docs/ref/voice/exceptions.md +0 -0
  129. {openai_agents-0.0.16 → openai_agents-0.0.17}/docs/ref/voice/input.md +0 -0
  130. {openai_agents-0.0.16 → openai_agents-0.0.17}/docs/ref/voice/model.md +0 -0
  131. {openai_agents-0.0.16 → openai_agents-0.0.17}/docs/ref/voice/models/openai_provider.md +0 -0
  132. {openai_agents-0.0.16 → openai_agents-0.0.17}/docs/ref/voice/models/openai_stt.md +0 -0
  133. {openai_agents-0.0.16 → openai_agents-0.0.17}/docs/ref/voice/models/openai_tts.md +0 -0
  134. {openai_agents-0.0.16 → openai_agents-0.0.17}/docs/ref/voice/pipeline.md +0 -0
  135. {openai_agents-0.0.16 → openai_agents-0.0.17}/docs/ref/voice/pipeline_config.md +0 -0
  136. {openai_agents-0.0.16 → openai_agents-0.0.17}/docs/ref/voice/result.md +0 -0
  137. {openai_agents-0.0.16 → openai_agents-0.0.17}/docs/ref/voice/utils.md +0 -0
  138. {openai_agents-0.0.16 → openai_agents-0.0.17}/docs/ref/voice/workflow.md +0 -0
  139. {openai_agents-0.0.16 → openai_agents-0.0.17}/docs/results.md +0 -0
  140. {openai_agents-0.0.16 → openai_agents-0.0.17}/docs/running_agents.md +0 -0
  141. {openai_agents-0.0.16 → openai_agents-0.0.17}/docs/scripts/translate_docs.py +0 -0
  142. {openai_agents-0.0.16 → openai_agents-0.0.17}/docs/streaming.md +0 -0
  143. {openai_agents-0.0.16 → openai_agents-0.0.17}/docs/stylesheets/extra.css +0 -0
  144. {openai_agents-0.0.16 → openai_agents-0.0.17}/docs/visualization.md +0 -0
  145. {openai_agents-0.0.16 → openai_agents-0.0.17}/docs/voice/pipeline.md +0 -0
  146. {openai_agents-0.0.16 → openai_agents-0.0.17}/docs/voice/quickstart.md +0 -0
  147. {openai_agents-0.0.16 → openai_agents-0.0.17}/docs/voice/tracing.md +0 -0
  148. {openai_agents-0.0.16 → openai_agents-0.0.17}/examples/__init__.py +0 -0
  149. {openai_agents-0.0.16 → openai_agents-0.0.17}/examples/agent_patterns/README.md +0 -0
  150. {openai_agents-0.0.16 → openai_agents-0.0.17}/examples/agent_patterns/agents_as_tools.py +0 -0
  151. {openai_agents-0.0.16 → openai_agents-0.0.17}/examples/agent_patterns/deterministic.py +0 -0
  152. {openai_agents-0.0.16 → openai_agents-0.0.17}/examples/agent_patterns/forcing_tool_use.py +0 -0
  153. {openai_agents-0.0.16 → openai_agents-0.0.17}/examples/agent_patterns/llm_as_a_judge.py +0 -0
  154. {openai_agents-0.0.16 → openai_agents-0.0.17}/examples/agent_patterns/output_guardrails.py +0 -0
  155. {openai_agents-0.0.16 → openai_agents-0.0.17}/examples/agent_patterns/parallelization.py +0 -0
  156. {openai_agents-0.0.16 → openai_agents-0.0.17}/examples/agent_patterns/routing.py +0 -0
  157. {openai_agents-0.0.16 → openai_agents-0.0.17}/examples/agent_patterns/streaming_guardrails.py +0 -0
  158. {openai_agents-0.0.16 → openai_agents-0.0.17}/examples/basic/agent_lifecycle_example.py +0 -0
  159. {openai_agents-0.0.16 → openai_agents-0.0.17}/examples/basic/dynamic_system_prompt.py +0 -0
  160. {openai_agents-0.0.16 → openai_agents-0.0.17}/examples/basic/hello_world.py +0 -0
  161. {openai_agents-0.0.16 → openai_agents-0.0.17}/examples/basic/hello_world_jupyter.py +0 -0
  162. {openai_agents-0.0.16 → openai_agents-0.0.17}/examples/basic/lifecycle_example.py +0 -0
  163. {openai_agents-0.0.16 → openai_agents-0.0.17}/examples/basic/local_image.py +0 -0
  164. {openai_agents-0.0.16 → openai_agents-0.0.17}/examples/basic/media/image_bison.jpg +0 -0
  165. {openai_agents-0.0.16 → openai_agents-0.0.17}/examples/basic/non_strict_output_type.py +0 -0
  166. {openai_agents-0.0.16 → openai_agents-0.0.17}/examples/basic/previous_response_id.py +0 -0
  167. {openai_agents-0.0.16 → openai_agents-0.0.17}/examples/basic/remote_image.py +0 -0
  168. {openai_agents-0.0.16 → openai_agents-0.0.17}/examples/basic/stream_items.py +0 -0
  169. {openai_agents-0.0.16 → openai_agents-0.0.17}/examples/basic/stream_text.py +0 -0
  170. {openai_agents-0.0.16 → openai_agents-0.0.17}/examples/basic/tools.py +0 -0
  171. {openai_agents-0.0.16 → openai_agents-0.0.17}/examples/customer_service/main.py +0 -0
  172. {openai_agents-0.0.16 → openai_agents-0.0.17}/examples/financial_research_agent/README.md +0 -0
  173. {openai_agents-0.0.16 → openai_agents-0.0.17}/examples/financial_research_agent/__init__.py +0 -0
  174. {openai_agents-0.0.16 → openai_agents-0.0.17}/examples/financial_research_agent/agents/__init__.py +0 -0
  175. {openai_agents-0.0.16 → openai_agents-0.0.17}/examples/financial_research_agent/agents/financials_agent.py +0 -0
  176. {openai_agents-0.0.16 → openai_agents-0.0.17}/examples/financial_research_agent/agents/planner_agent.py +0 -0
  177. {openai_agents-0.0.16 → openai_agents-0.0.17}/examples/financial_research_agent/agents/risk_agent.py +0 -0
  178. {openai_agents-0.0.16 → openai_agents-0.0.17}/examples/financial_research_agent/agents/search_agent.py +0 -0
  179. {openai_agents-0.0.16 → openai_agents-0.0.17}/examples/financial_research_agent/agents/verifier_agent.py +0 -0
  180. {openai_agents-0.0.16 → openai_agents-0.0.17}/examples/financial_research_agent/agents/writer_agent.py +0 -0
  181. {openai_agents-0.0.16 → openai_agents-0.0.17}/examples/financial_research_agent/main.py +0 -0
  182. {openai_agents-0.0.16 → openai_agents-0.0.17}/examples/financial_research_agent/manager.py +0 -0
  183. {openai_agents-0.0.16 → openai_agents-0.0.17}/examples/financial_research_agent/printer.py +0 -0
  184. {openai_agents-0.0.16 → openai_agents-0.0.17}/examples/handoffs/message_filter.py +0 -0
  185. {openai_agents-0.0.16 → openai_agents-0.0.17}/examples/handoffs/message_filter_streaming.py +0 -0
  186. {openai_agents-0.0.16 → openai_agents-0.0.17}/examples/hosted_mcp/__init__.py +0 -0
  187. {openai_agents-0.0.16 → openai_agents-0.0.17}/examples/mcp/filesystem_example/README.md +0 -0
  188. {openai_agents-0.0.16 → openai_agents-0.0.17}/examples/mcp/filesystem_example/main.py +0 -0
  189. {openai_agents-0.0.16 → openai_agents-0.0.17}/examples/mcp/filesystem_example/sample_files/favorite_books.txt +0 -0
  190. {openai_agents-0.0.16 → openai_agents-0.0.17}/examples/mcp/filesystem_example/sample_files/favorite_cities.txt +0 -0
  191. {openai_agents-0.0.16 → openai_agents-0.0.17}/examples/mcp/filesystem_example/sample_files/favorite_songs.txt +0 -0
  192. {openai_agents-0.0.16 → openai_agents-0.0.17}/examples/mcp/git_example/README.md +0 -0
  193. {openai_agents-0.0.16 → openai_agents-0.0.17}/examples/mcp/git_example/main.py +0 -0
  194. {openai_agents-0.0.16 → openai_agents-0.0.17}/examples/mcp/sse_example/README.md +0 -0
  195. {openai_agents-0.0.16 → openai_agents-0.0.17}/examples/mcp/sse_example/main.py +0 -0
  196. {openai_agents-0.0.16 → openai_agents-0.0.17}/examples/mcp/sse_example/server.py +0 -0
  197. {openai_agents-0.0.16 → openai_agents-0.0.17}/examples/mcp/streamablehttp_example/README.md +0 -0
  198. {openai_agents-0.0.16 → openai_agents-0.0.17}/examples/mcp/streamablehttp_example/main.py +0 -0
  199. {openai_agents-0.0.16 → openai_agents-0.0.17}/examples/mcp/streamablehttp_example/server.py +0 -0
  200. {openai_agents-0.0.16 → openai_agents-0.0.17}/examples/model_providers/README.md +0 -0
  201. {openai_agents-0.0.16 → openai_agents-0.0.17}/examples/model_providers/custom_example_agent.py +0 -0
  202. {openai_agents-0.0.16 → openai_agents-0.0.17}/examples/model_providers/custom_example_global.py +0 -0
  203. {openai_agents-0.0.16 → openai_agents-0.0.17}/examples/model_providers/custom_example_provider.py +0 -0
  204. {openai_agents-0.0.16 → openai_agents-0.0.17}/examples/model_providers/litellm_auto.py +0 -0
  205. {openai_agents-0.0.16 → openai_agents-0.0.17}/examples/model_providers/litellm_provider.py +0 -0
  206. {openai_agents-0.0.16 → openai_agents-0.0.17}/examples/research_bot/README.md +0 -0
  207. {openai_agents-0.0.16 → openai_agents-0.0.17}/examples/research_bot/__init__.py +0 -0
  208. {openai_agents-0.0.16 → openai_agents-0.0.17}/examples/research_bot/agents/__init__.py +0 -0
  209. {openai_agents-0.0.16 → openai_agents-0.0.17}/examples/research_bot/agents/planner_agent.py +0 -0
  210. {openai_agents-0.0.16 → openai_agents-0.0.17}/examples/research_bot/agents/search_agent.py +0 -0
  211. {openai_agents-0.0.16 → openai_agents-0.0.17}/examples/research_bot/agents/writer_agent.py +0 -0
  212. {openai_agents-0.0.16 → openai_agents-0.0.17}/examples/research_bot/main.py +0 -0
  213. {openai_agents-0.0.16 → openai_agents-0.0.17}/examples/research_bot/manager.py +0 -0
  214. {openai_agents-0.0.16 → openai_agents-0.0.17}/examples/research_bot/printer.py +0 -0
  215. {openai_agents-0.0.16 → openai_agents-0.0.17}/examples/research_bot/sample_outputs/product_recs.md +0 -0
  216. {openai_agents-0.0.16 → openai_agents-0.0.17}/examples/research_bot/sample_outputs/product_recs.txt +0 -0
  217. {openai_agents-0.0.16 → openai_agents-0.0.17}/examples/research_bot/sample_outputs/vacation.md +0 -0
  218. {openai_agents-0.0.16 → openai_agents-0.0.17}/examples/research_bot/sample_outputs/vacation.txt +0 -0
  219. {openai_agents-0.0.16 → openai_agents-0.0.17}/examples/tools/code_interpreter.py +0 -0
  220. {openai_agents-0.0.16 → openai_agents-0.0.17}/examples/tools/computer_use.py +0 -0
  221. {openai_agents-0.0.16 → openai_agents-0.0.17}/examples/tools/file_search.py +0 -0
  222. {openai_agents-0.0.16 → openai_agents-0.0.17}/examples/tools/image_generator.py +0 -0
  223. {openai_agents-0.0.16 → openai_agents-0.0.17}/examples/tools/web_search.py +0 -0
  224. {openai_agents-0.0.16 → openai_agents-0.0.17}/examples/voice/__init__.py +0 -0
  225. {openai_agents-0.0.16 → openai_agents-0.0.17}/examples/voice/static/README.md +0 -0
  226. {openai_agents-0.0.16 → openai_agents-0.0.17}/examples/voice/static/__init__.py +0 -0
  227. {openai_agents-0.0.16 → openai_agents-0.0.17}/examples/voice/static/main.py +0 -0
  228. {openai_agents-0.0.16 → openai_agents-0.0.17}/examples/voice/static/util.py +0 -0
  229. {openai_agents-0.0.16 → openai_agents-0.0.17}/examples/voice/streamed/README.md +0 -0
  230. {openai_agents-0.0.16 → openai_agents-0.0.17}/examples/voice/streamed/__init__.py +0 -0
  231. {openai_agents-0.0.16 → openai_agents-0.0.17}/examples/voice/streamed/main.py +0 -0
  232. {openai_agents-0.0.16 → openai_agents-0.0.17}/examples/voice/streamed/my_workflow.py +0 -0
  233. {openai_agents-0.0.16 → openai_agents-0.0.17}/mkdocs.yml +0 -0
  234. {openai_agents-0.0.16 → openai_agents-0.0.17}/src/agents/_config.py +0 -0
  235. {openai_agents-0.0.16 → openai_agents-0.0.17}/src/agents/_debug.py +0 -0
  236. {openai_agents-0.0.16 → openai_agents-0.0.17}/src/agents/computer.py +0 -0
  237. {openai_agents-0.0.16 → openai_agents-0.0.17}/src/agents/extensions/__init__.py +0 -0
  238. {openai_agents-0.0.16 → openai_agents-0.0.17}/src/agents/extensions/handoff_filters.py +0 -0
  239. {openai_agents-0.0.16 → openai_agents-0.0.17}/src/agents/extensions/handoff_prompt.py +0 -0
  240. {openai_agents-0.0.16 → openai_agents-0.0.17}/src/agents/extensions/models/__init__.py +0 -0
  241. {openai_agents-0.0.16 → openai_agents-0.0.17}/src/agents/extensions/models/litellm_provider.py +0 -0
  242. {openai_agents-0.0.16 → openai_agents-0.0.17}/src/agents/function_schema.py +0 -0
  243. {openai_agents-0.0.16 → openai_agents-0.0.17}/src/agents/guardrail.py +0 -0
  244. {openai_agents-0.0.16 → openai_agents-0.0.17}/src/agents/items.py +0 -0
  245. {openai_agents-0.0.16 → openai_agents-0.0.17}/src/agents/lifecycle.py +0 -0
  246. {openai_agents-0.0.16 → openai_agents-0.0.17}/src/agents/logger.py +0 -0
  247. {openai_agents-0.0.16 → openai_agents-0.0.17}/src/agents/mcp/__init__.py +0 -0
  248. {openai_agents-0.0.16 → openai_agents-0.0.17}/src/agents/model_settings.py +0 -0
  249. {openai_agents-0.0.16 → openai_agents-0.0.17}/src/agents/models/__init__.py +0 -0
  250. {openai_agents-0.0.16 → openai_agents-0.0.17}/src/agents/models/_openai_shared.py +0 -0
  251. {openai_agents-0.0.16 → openai_agents-0.0.17}/src/agents/models/chatcmpl_converter.py +0 -0
  252. {openai_agents-0.0.16 → openai_agents-0.0.17}/src/agents/models/chatcmpl_helpers.py +0 -0
  253. {openai_agents-0.0.16 → openai_agents-0.0.17}/src/agents/models/chatcmpl_stream_handler.py +0 -0
  254. {openai_agents-0.0.16 → openai_agents-0.0.17}/src/agents/models/fake_id.py +0 -0
  255. {openai_agents-0.0.16 → openai_agents-0.0.17}/src/agents/models/interface.py +0 -0
  256. {openai_agents-0.0.16 → openai_agents-0.0.17}/src/agents/models/multi_provider.py +0 -0
  257. {openai_agents-0.0.16 → openai_agents-0.0.17}/src/agents/models/openai_provider.py +0 -0
  258. {openai_agents-0.0.16 → openai_agents-0.0.17}/src/agents/models/openai_responses.py +0 -0
  259. {openai_agents-0.0.16 → openai_agents-0.0.17}/src/agents/py.typed +0 -0
  260. {openai_agents-0.0.16 → openai_agents-0.0.17}/src/agents/run_context.py +0 -0
  261. {openai_agents-0.0.16 → openai_agents-0.0.17}/src/agents/strict_schema.py +0 -0
  262. {openai_agents-0.0.16 → openai_agents-0.0.17}/src/agents/tracing/__init__.py +0 -0
  263. {openai_agents-0.0.16 → openai_agents-0.0.17}/src/agents/tracing/create.py +0 -0
  264. {openai_agents-0.0.16 → openai_agents-0.0.17}/src/agents/tracing/logger.py +0 -0
  265. {openai_agents-0.0.16 → openai_agents-0.0.17}/src/agents/tracing/processor_interface.py +0 -0
  266. {openai_agents-0.0.16 → openai_agents-0.0.17}/src/agents/tracing/scope.py +0 -0
  267. {openai_agents-0.0.16 → openai_agents-0.0.17}/src/agents/tracing/setup.py +0 -0
  268. {openai_agents-0.0.16 → openai_agents-0.0.17}/src/agents/tracing/span_data.py +0 -0
  269. {openai_agents-0.0.16 → openai_agents-0.0.17}/src/agents/tracing/spans.py +0 -0
  270. {openai_agents-0.0.16 → openai_agents-0.0.17}/src/agents/tracing/traces.py +0 -0
  271. {openai_agents-0.0.16 → openai_agents-0.0.17}/src/agents/tracing/util.py +0 -0
  272. {openai_agents-0.0.16 → openai_agents-0.0.17}/src/agents/usage.py +0 -0
  273. {openai_agents-0.0.16 → openai_agents-0.0.17}/src/agents/util/__init__.py +0 -0
  274. {openai_agents-0.0.16 → openai_agents-0.0.17}/src/agents/util/_coro.py +0 -0
  275. {openai_agents-0.0.16 → openai_agents-0.0.17}/src/agents/util/_error_tracing.py +0 -0
  276. {openai_agents-0.0.16 → openai_agents-0.0.17}/src/agents/util/_json.py +0 -0
  277. {openai_agents-0.0.16 → openai_agents-0.0.17}/src/agents/util/_transforms.py +0 -0
  278. {openai_agents-0.0.16 → openai_agents-0.0.17}/src/agents/util/_types.py +0 -0
  279. {openai_agents-0.0.16 → openai_agents-0.0.17}/src/agents/version.py +0 -0
  280. {openai_agents-0.0.16 → openai_agents-0.0.17}/src/agents/voice/__init__.py +0 -0
  281. {openai_agents-0.0.16 → openai_agents-0.0.17}/src/agents/voice/events.py +0 -0
  282. {openai_agents-0.0.16 → openai_agents-0.0.17}/src/agents/voice/exceptions.py +0 -0
  283. {openai_agents-0.0.16 → openai_agents-0.0.17}/src/agents/voice/imports.py +0 -0
  284. {openai_agents-0.0.16 → openai_agents-0.0.17}/src/agents/voice/input.py +0 -0
  285. {openai_agents-0.0.16 → openai_agents-0.0.17}/src/agents/voice/models/__init__.py +0 -0
  286. {openai_agents-0.0.16 → openai_agents-0.0.17}/src/agents/voice/models/openai_model_provider.py +0 -0
  287. {openai_agents-0.0.16 → openai_agents-0.0.17}/src/agents/voice/models/openai_stt.py +0 -0
  288. {openai_agents-0.0.16 → openai_agents-0.0.17}/src/agents/voice/models/openai_tts.py +0 -0
  289. {openai_agents-0.0.16 → openai_agents-0.0.17}/src/agents/voice/pipeline.py +0 -0
  290. {openai_agents-0.0.16 → openai_agents-0.0.17}/src/agents/voice/pipeline_config.py +0 -0
  291. {openai_agents-0.0.16 → openai_agents-0.0.17}/src/agents/voice/result.py +0 -0
  292. {openai_agents-0.0.16 → openai_agents-0.0.17}/src/agents/voice/utils.py +0 -0
  293. {openai_agents-0.0.16 → openai_agents-0.0.17}/src/agents/voice/workflow.py +0 -0
  294. {openai_agents-0.0.16 → openai_agents-0.0.17}/tests/README.md +0 -0
  295. {openai_agents-0.0.16 → openai_agents-0.0.17}/tests/__init__.py +0 -0
  296. {openai_agents-0.0.16 → openai_agents-0.0.17}/tests/conftest.py +0 -0
  297. {openai_agents-0.0.16 → openai_agents-0.0.17}/tests/fake_model.py +0 -0
  298. {openai_agents-0.0.16 → openai_agents-0.0.17}/tests/fastapi/__init__.py +0 -0
  299. {openai_agents-0.0.16 → openai_agents-0.0.17}/tests/fastapi/streaming_app.py +0 -0
  300. {openai_agents-0.0.16 → openai_agents-0.0.17}/tests/fastapi/test_streaming_context.py +0 -0
  301. {openai_agents-0.0.16 → openai_agents-0.0.17}/tests/mcp/__init__.py +0 -0
  302. {openai_agents-0.0.16 → openai_agents-0.0.17}/tests/mcp/conftest.py +0 -0
  303. {openai_agents-0.0.16 → openai_agents-0.0.17}/tests/mcp/helpers.py +0 -0
  304. {openai_agents-0.0.16 → openai_agents-0.0.17}/tests/mcp/test_caching.py +0 -0
  305. {openai_agents-0.0.16 → openai_agents-0.0.17}/tests/mcp/test_connect_disconnect.py +0 -0
  306. {openai_agents-0.0.16 → openai_agents-0.0.17}/tests/mcp/test_mcp_util.py +0 -0
  307. {openai_agents-0.0.16 → openai_agents-0.0.17}/tests/mcp/test_runner_calls_mcp.py +0 -0
  308. {openai_agents-0.0.16 → openai_agents-0.0.17}/tests/mcp/test_server_errors.py +0 -0
  309. {openai_agents-0.0.16 → openai_agents-0.0.17}/tests/model_settings/test_serialization.py +0 -0
  310. {openai_agents-0.0.16 → openai_agents-0.0.17}/tests/models/__init__.py +0 -0
  311. {openai_agents-0.0.16 → openai_agents-0.0.17}/tests/models/conftest.py +0 -0
  312. {openai_agents-0.0.16 → openai_agents-0.0.17}/tests/models/test_litellm_chatcompletions_stream.py +0 -0
  313. {openai_agents-0.0.16 → openai_agents-0.0.17}/tests/models/test_map.py +0 -0
  314. {openai_agents-0.0.16 → openai_agents-0.0.17}/tests/test_agent_config.py +0 -0
  315. {openai_agents-0.0.16 → openai_agents-0.0.17}/tests/test_agent_hooks.py +0 -0
  316. {openai_agents-0.0.16 → openai_agents-0.0.17}/tests/test_agent_tracing.py +0 -0
  317. {openai_agents-0.0.16 → openai_agents-0.0.17}/tests/test_cancel_streaming.py +0 -0
  318. {openai_agents-0.0.16 → openai_agents-0.0.17}/tests/test_computer_action.py +0 -0
  319. {openai_agents-0.0.16 → openai_agents-0.0.17}/tests/test_config.py +0 -0
  320. {openai_agents-0.0.16 → openai_agents-0.0.17}/tests/test_doc_parsing.py +0 -0
  321. {openai_agents-0.0.16 → openai_agents-0.0.17}/tests/test_extension_filters.py +0 -0
  322. {openai_agents-0.0.16 → openai_agents-0.0.17}/tests/test_extra_headers.py +0 -0
  323. {openai_agents-0.0.16 → openai_agents-0.0.17}/tests/test_function_schema.py +0 -0
  324. {openai_agents-0.0.16 → openai_agents-0.0.17}/tests/test_function_tool_decorator.py +0 -0
  325. {openai_agents-0.0.16 → openai_agents-0.0.17}/tests/test_global_hooks.py +0 -0
  326. {openai_agents-0.0.16 → openai_agents-0.0.17}/tests/test_guardrails.py +0 -0
  327. {openai_agents-0.0.16 → openai_agents-0.0.17}/tests/test_handoff_tool.py +0 -0
  328. {openai_agents-0.0.16 → openai_agents-0.0.17}/tests/test_items_helpers.py +0 -0
  329. {openai_agents-0.0.16 → openai_agents-0.0.17}/tests/test_max_turns.py +0 -0
  330. {openai_agents-0.0.16 → openai_agents-0.0.17}/tests/test_openai_chatcompletions_converter.py +0 -0
  331. {openai_agents-0.0.16 → openai_agents-0.0.17}/tests/test_openai_chatcompletions_stream.py +0 -0
  332. {openai_agents-0.0.16 → openai_agents-0.0.17}/tests/test_openai_responses_converter.py +0 -0
  333. {openai_agents-0.0.16 → openai_agents-0.0.17}/tests/test_output_tool.py +0 -0
  334. {openai_agents-0.0.16 → openai_agents-0.0.17}/tests/test_pretty_print.py +0 -0
  335. {openai_agents-0.0.16 → openai_agents-0.0.17}/tests/test_responses.py +0 -0
  336. {openai_agents-0.0.16 → openai_agents-0.0.17}/tests/test_responses_tracing.py +0 -0
  337. {openai_agents-0.0.16 → openai_agents-0.0.17}/tests/test_result_cast.py +0 -0
  338. {openai_agents-0.0.16 → openai_agents-0.0.17}/tests/test_run_config.py +0 -0
  339. {openai_agents-0.0.16 → openai_agents-0.0.17}/tests/test_strict_schema.py +0 -0
  340. {openai_agents-0.0.16 → openai_agents-0.0.17}/tests/test_tool_choice_reset.py +0 -0
  341. {openai_agents-0.0.16 → openai_agents-0.0.17}/tests/test_tool_converter.py +0 -0
  342. {openai_agents-0.0.16 → openai_agents-0.0.17}/tests/test_tool_use_behavior.py +0 -0
  343. {openai_agents-0.0.16 → openai_agents-0.0.17}/tests/test_trace_processor.py +0 -0
  344. {openai_agents-0.0.16 → openai_agents-0.0.17}/tests/test_tracing.py +0 -0
  345. {openai_agents-0.0.16 → openai_agents-0.0.17}/tests/test_tracing_errors.py +0 -0
  346. {openai_agents-0.0.16 → openai_agents-0.0.17}/tests/test_usage.py +0 -0
  347. {openai_agents-0.0.16 → openai_agents-0.0.17}/tests/testing_processor.py +0 -0
  348. {openai_agents-0.0.16 → openai_agents-0.0.17}/tests/tracing/test_processor_api_key.py +0 -0
  349. {openai_agents-0.0.16 → openai_agents-0.0.17}/tests/voice/__init__.py +0 -0
  350. {openai_agents-0.0.16 → openai_agents-0.0.17}/tests/voice/conftest.py +0 -0
  351. {openai_agents-0.0.16 → openai_agents-0.0.17}/tests/voice/fake_models.py +0 -0
  352. {openai_agents-0.0.16 → openai_agents-0.0.17}/tests/voice/helpers.py +0 -0
  353. {openai_agents-0.0.16 → openai_agents-0.0.17}/tests/voice/test_input.py +0 -0
  354. {openai_agents-0.0.16 → openai_agents-0.0.17}/tests/voice/test_openai_stt.py +0 -0
  355. {openai_agents-0.0.16 → openai_agents-0.0.17}/tests/voice/test_openai_tts.py +0 -0
  356. {openai_agents-0.0.16 → openai_agents-0.0.17}/tests/voice/test_pipeline.py +0 -0
  357. {openai_agents-0.0.16 → openai_agents-0.0.17}/tests/voice/test_workflow.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: openai-agents
3
- Version: 0.0.16
3
+ Version: 0.0.17
4
4
  Summary: OpenAI Agents SDK
5
5
  Project-URL: Homepage, https://github.com/openai/openai-agents-python
6
6
  Project-URL: Repository, https://github.com/openai/openai-agents-python
@@ -12,12 +12,13 @@ Agents SDK は MCP をサポートしており、これにより幅広い MCP
12
12
 
13
13
  ## MCP サーバー
14
14
 
15
- 現在、MCP 仕様では使用するトランスポート方式に基づき 2 種類のサーバーが定義されています。
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][`MCPServerSse`][agents.mcp.server.MCPServerSse] クラスを使用して接続できます。
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][`MCPServerSse`][agents.mcp.server.MCPServerSse] の両方に `cache_tools_list=True` を渡してください。ツール一覧が変更されないと確信できる場合のみ使用してください。
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 two kinds of servers, based on the transport mechanism they use:
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] and [`MCPServerSse`][agents.mcp.server.MCPServerSse] classes to connect to these servers.
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 both [`MCPServerStdio`][agents.mcp.server.MCPServerStdio] and [`MCPServerSse`][agents.mcp.server.MCPServerSse]. You should only do this if you're certain the tool list will not change.
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
- """A tool that runs the agent with custom configs".
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 output messages don't violate any policies
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.
@@ -48,7 +48,7 @@ async def main(verbose: bool, stream: bool):
48
48
  print(res.final_output)
49
49
 
50
50
  if verbose:
51
- for item in result.new_items:
51
+ for item in res.new_items:
52
52
  print(item)
53
53
 
54
54
 
@@ -34,7 +34,7 @@ async def main(verbose: bool, stream: bool):
34
34
  # The repository is primarily written in multiple languages, including Rust and TypeScript...
35
35
 
36
36
  if verbose:
37
- for item in result.new_items:
37
+ for item in res.new_items:
38
38
  print(item)
39
39
 
40
40
 
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "openai-agents"
3
- version = "0.0.16"
3
+ version = "0.0.17"
4
4
  description = "OpenAI Agents SDK"
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.9"
@@ -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
- return mcp_tools + self.tools
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 valis JSON. See here for details:
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 typing import TYPE_CHECKING
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: "InputGuardrailResult"
76
+ guardrail_result: InputGuardrailResult
44
77
  """The result data of the guardrail that was triggered."""
45
78
 
46
- def __init__(self, guardrail_result: "InputGuardrailResult"):
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: "OutputGuardrailResult"
89
+ guardrail_result: OutputGuardrailResult
57
90
  """The result data of the guardrail that was triggered."""
58
91
 
59
- def __init__(self, guardrail_result: "OutputGuardrailResult"):
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 typing import Optional
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(agent: Agent, parent: Optional[Agent] = None) -> str:
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
- parts.append(
75
- f'"{handoff.name}" [label="{handoff.name}", '
76
- f"shape=box, style=filled, style=rounded, "
77
- f"fillcolor=lightyellow, width=1.5, height=0.8];"
78
- )
79
- parts.append(get_all_nodes(handoff))
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(agent: Agent, parent: Optional[Agent] = None) -> str:
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: Optional[str] = None) -> graphviz.Source:
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 on_input and input_type, or neither"
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
- logger.debug(
78
- f"LLM resp:\n{json.dumps(response.choices[0].message.model_dump(), indent=2)}\n"
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 = [response.choices[0].message.model_dump()]
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(response.choices[0].message)
122
+ items = Converter.message_to_output_items(message) if message is not None else []
111
123
 
112
124
  return ModelResponse(
113
125
  output=items,