openai-agents 0.0.12__tar.gz → 0.0.13__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 (345) hide show
  1. {openai_agents-0.0.12 → openai_agents-0.0.13}/PKG-INFO +2 -2
  2. {openai_agents-0.0.12 → openai_agents-0.0.13}/examples/financial_research_agent/main.py +1 -1
  3. {openai_agents-0.0.12 → openai_agents-0.0.13}/pyproject.toml +2 -2
  4. {openai_agents-0.0.12 → openai_agents-0.0.13}/src/agents/extensions/models/litellm_model.py +3 -4
  5. {openai_agents-0.0.12 → openai_agents-0.0.13}/src/agents/mcp/server.py +22 -4
  6. {openai_agents-0.0.12 → openai_agents-0.0.13}/src/agents/model_settings.py +21 -2
  7. {openai_agents-0.0.12 → openai_agents-0.0.13}/src/agents/models/chatcmpl_stream_handler.py +4 -2
  8. {openai_agents-0.0.12 → openai_agents-0.0.13}/src/agents/models/openai_chatcompletions.py +3 -6
  9. {openai_agents-0.0.12 → openai_agents-0.0.13}/src/agents/models/openai_responses.py +1 -1
  10. {openai_agents-0.0.12 → openai_agents-0.0.13}/src/agents/result.py +21 -3
  11. {openai_agents-0.0.12 → openai_agents-0.0.13}/tests/fake_model.py +4 -1
  12. {openai_agents-0.0.12 → openai_agents-0.0.13}/tests/mcp/test_server_errors.py +1 -1
  13. openai_agents-0.0.13/tests/model_settings/test_serialization.py +59 -0
  14. openai_agents-0.0.13/tests/models/test_litellm_chatcompletions_stream.py +286 -0
  15. openai_agents-0.0.13/tests/test_cancel_streaming.py +116 -0
  16. openai_agents-0.0.13/tests/test_extra_headers.py +92 -0
  17. {openai_agents-0.0.12 → openai_agents-0.0.13}/tests/voice/conftest.py +0 -1
  18. {openai_agents-0.0.12 → openai_agents-0.0.13}/uv.lock +5 -5
  19. {openai_agents-0.0.12 → openai_agents-0.0.13}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  20. {openai_agents-0.0.12 → openai_agents-0.0.13}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
  21. {openai_agents-0.0.12 → openai_agents-0.0.13}/.github/ISSUE_TEMPLATE/model_provider.md +0 -0
  22. {openai_agents-0.0.12 → openai_agents-0.0.13}/.github/ISSUE_TEMPLATE/question.md +0 -0
  23. {openai_agents-0.0.12 → openai_agents-0.0.13}/.github/PULL_REQUEST_TEMPLATE/pull_request_template.md +0 -0
  24. {openai_agents-0.0.12 → openai_agents-0.0.13}/.github/workflows/docs.yml +0 -0
  25. {openai_agents-0.0.12 → openai_agents-0.0.13}/.github/workflows/issues.yml +0 -0
  26. {openai_agents-0.0.12 → openai_agents-0.0.13}/.github/workflows/publish.yml +0 -0
  27. {openai_agents-0.0.12 → openai_agents-0.0.13}/.github/workflows/tests.yml +0 -0
  28. {openai_agents-0.0.12 → openai_agents-0.0.13}/.gitignore +0 -0
  29. {openai_agents-0.0.12 → openai_agents-0.0.13}/.prettierrc +0 -0
  30. {openai_agents-0.0.12 → openai_agents-0.0.13}/.vscode/settings.json +0 -0
  31. {openai_agents-0.0.12 → openai_agents-0.0.13}/LICENSE +0 -0
  32. {openai_agents-0.0.12 → openai_agents-0.0.13}/Makefile +0 -0
  33. {openai_agents-0.0.12 → openai_agents-0.0.13}/README.md +0 -0
  34. {openai_agents-0.0.12 → openai_agents-0.0.13}/docs/agents.md +0 -0
  35. {openai_agents-0.0.12 → openai_agents-0.0.13}/docs/assets/images/favicon-platform.svg +0 -0
  36. {openai_agents-0.0.12 → openai_agents-0.0.13}/docs/assets/images/graph.png +0 -0
  37. {openai_agents-0.0.12 → openai_agents-0.0.13}/docs/assets/images/mcp-tracing.jpg +0 -0
  38. {openai_agents-0.0.12 → openai_agents-0.0.13}/docs/assets/images/orchestration.png +0 -0
  39. {openai_agents-0.0.12 → openai_agents-0.0.13}/docs/assets/logo.svg +0 -0
  40. {openai_agents-0.0.12 → openai_agents-0.0.13}/docs/config.md +0 -0
  41. {openai_agents-0.0.12 → openai_agents-0.0.13}/docs/context.md +0 -0
  42. {openai_agents-0.0.12 → openai_agents-0.0.13}/docs/examples.md +0 -0
  43. {openai_agents-0.0.12 → openai_agents-0.0.13}/docs/guardrails.md +0 -0
  44. {openai_agents-0.0.12 → openai_agents-0.0.13}/docs/handoffs.md +0 -0
  45. {openai_agents-0.0.12 → openai_agents-0.0.13}/docs/index.md +0 -0
  46. {openai_agents-0.0.12 → openai_agents-0.0.13}/docs/ja/agents.md +0 -0
  47. {openai_agents-0.0.12 → openai_agents-0.0.13}/docs/ja/config.md +0 -0
  48. {openai_agents-0.0.12 → openai_agents-0.0.13}/docs/ja/context.md +0 -0
  49. {openai_agents-0.0.12 → openai_agents-0.0.13}/docs/ja/examples.md +0 -0
  50. {openai_agents-0.0.12 → openai_agents-0.0.13}/docs/ja/guardrails.md +0 -0
  51. {openai_agents-0.0.12 → openai_agents-0.0.13}/docs/ja/handoffs.md +0 -0
  52. {openai_agents-0.0.12 → openai_agents-0.0.13}/docs/ja/index.md +0 -0
  53. {openai_agents-0.0.12 → openai_agents-0.0.13}/docs/ja/mcp.md +0 -0
  54. {openai_agents-0.0.12 → openai_agents-0.0.13}/docs/ja/models/index.md +0 -0
  55. {openai_agents-0.0.12 → openai_agents-0.0.13}/docs/ja/models/litellm.md +0 -0
  56. {openai_agents-0.0.12 → openai_agents-0.0.13}/docs/ja/models.md +0 -0
  57. {openai_agents-0.0.12 → openai_agents-0.0.13}/docs/ja/multi_agent.md +0 -0
  58. {openai_agents-0.0.12 → openai_agents-0.0.13}/docs/ja/quickstart.md +0 -0
  59. {openai_agents-0.0.12 → openai_agents-0.0.13}/docs/ja/results.md +0 -0
  60. {openai_agents-0.0.12 → openai_agents-0.0.13}/docs/ja/running_agents.md +0 -0
  61. {openai_agents-0.0.12 → openai_agents-0.0.13}/docs/ja/streaming.md +0 -0
  62. {openai_agents-0.0.12 → openai_agents-0.0.13}/docs/ja/tools.md +0 -0
  63. {openai_agents-0.0.12 → openai_agents-0.0.13}/docs/ja/tracing.md +0 -0
  64. {openai_agents-0.0.12 → openai_agents-0.0.13}/docs/ja/visualization.md +0 -0
  65. {openai_agents-0.0.12 → openai_agents-0.0.13}/docs/ja/voice/pipeline.md +0 -0
  66. {openai_agents-0.0.12 → openai_agents-0.0.13}/docs/ja/voice/quickstart.md +0 -0
  67. {openai_agents-0.0.12 → openai_agents-0.0.13}/docs/ja/voice/tracing.md +0 -0
  68. {openai_agents-0.0.12 → openai_agents-0.0.13}/docs/mcp.md +0 -0
  69. {openai_agents-0.0.12 → openai_agents-0.0.13}/docs/models/index.md +0 -0
  70. {openai_agents-0.0.12 → openai_agents-0.0.13}/docs/models/litellm.md +0 -0
  71. {openai_agents-0.0.12 → openai_agents-0.0.13}/docs/multi_agent.md +0 -0
  72. {openai_agents-0.0.12 → openai_agents-0.0.13}/docs/quickstart.md +0 -0
  73. {openai_agents-0.0.12 → openai_agents-0.0.13}/docs/ref/agent.md +0 -0
  74. {openai_agents-0.0.12 → openai_agents-0.0.13}/docs/ref/agent_output.md +0 -0
  75. {openai_agents-0.0.12 → openai_agents-0.0.13}/docs/ref/exceptions.md +0 -0
  76. {openai_agents-0.0.12 → openai_agents-0.0.13}/docs/ref/extensions/handoff_filters.md +0 -0
  77. {openai_agents-0.0.12 → openai_agents-0.0.13}/docs/ref/extensions/handoff_prompt.md +0 -0
  78. {openai_agents-0.0.12 → openai_agents-0.0.13}/docs/ref/extensions/litellm.md +0 -0
  79. {openai_agents-0.0.12 → openai_agents-0.0.13}/docs/ref/function_schema.md +0 -0
  80. {openai_agents-0.0.12 → openai_agents-0.0.13}/docs/ref/guardrail.md +0 -0
  81. {openai_agents-0.0.12 → openai_agents-0.0.13}/docs/ref/handoffs.md +0 -0
  82. {openai_agents-0.0.12 → openai_agents-0.0.13}/docs/ref/index.md +0 -0
  83. {openai_agents-0.0.12 → openai_agents-0.0.13}/docs/ref/items.md +0 -0
  84. {openai_agents-0.0.12 → openai_agents-0.0.13}/docs/ref/lifecycle.md +0 -0
  85. {openai_agents-0.0.12 → openai_agents-0.0.13}/docs/ref/mcp/server.md +0 -0
  86. {openai_agents-0.0.12 → openai_agents-0.0.13}/docs/ref/mcp/util.md +0 -0
  87. {openai_agents-0.0.12 → openai_agents-0.0.13}/docs/ref/model_settings.md +0 -0
  88. {openai_agents-0.0.12 → openai_agents-0.0.13}/docs/ref/models/interface.md +0 -0
  89. {openai_agents-0.0.12 → openai_agents-0.0.13}/docs/ref/models/openai_chatcompletions.md +0 -0
  90. {openai_agents-0.0.12 → openai_agents-0.0.13}/docs/ref/models/openai_responses.md +0 -0
  91. {openai_agents-0.0.12 → openai_agents-0.0.13}/docs/ref/result.md +0 -0
  92. {openai_agents-0.0.12 → openai_agents-0.0.13}/docs/ref/run.md +0 -0
  93. {openai_agents-0.0.12 → openai_agents-0.0.13}/docs/ref/run_context.md +0 -0
  94. {openai_agents-0.0.12 → openai_agents-0.0.13}/docs/ref/stream_events.md +0 -0
  95. {openai_agents-0.0.12 → openai_agents-0.0.13}/docs/ref/tool.md +0 -0
  96. {openai_agents-0.0.12 → openai_agents-0.0.13}/docs/ref/tracing/create.md +0 -0
  97. {openai_agents-0.0.12 → openai_agents-0.0.13}/docs/ref/tracing/index.md +0 -0
  98. {openai_agents-0.0.12 → openai_agents-0.0.13}/docs/ref/tracing/processor_interface.md +0 -0
  99. {openai_agents-0.0.12 → openai_agents-0.0.13}/docs/ref/tracing/processors.md +0 -0
  100. {openai_agents-0.0.12 → openai_agents-0.0.13}/docs/ref/tracing/scope.md +0 -0
  101. {openai_agents-0.0.12 → openai_agents-0.0.13}/docs/ref/tracing/setup.md +0 -0
  102. {openai_agents-0.0.12 → openai_agents-0.0.13}/docs/ref/tracing/span_data.md +0 -0
  103. {openai_agents-0.0.12 → openai_agents-0.0.13}/docs/ref/tracing/spans.md +0 -0
  104. {openai_agents-0.0.12 → openai_agents-0.0.13}/docs/ref/tracing/traces.md +0 -0
  105. {openai_agents-0.0.12 → openai_agents-0.0.13}/docs/ref/tracing/util.md +0 -0
  106. {openai_agents-0.0.12 → openai_agents-0.0.13}/docs/ref/usage.md +0 -0
  107. {openai_agents-0.0.12 → openai_agents-0.0.13}/docs/ref/voice/events.md +0 -0
  108. {openai_agents-0.0.12 → openai_agents-0.0.13}/docs/ref/voice/exceptions.md +0 -0
  109. {openai_agents-0.0.12 → openai_agents-0.0.13}/docs/ref/voice/input.md +0 -0
  110. {openai_agents-0.0.12 → openai_agents-0.0.13}/docs/ref/voice/model.md +0 -0
  111. {openai_agents-0.0.12 → openai_agents-0.0.13}/docs/ref/voice/models/openai_provider.md +0 -0
  112. {openai_agents-0.0.12 → openai_agents-0.0.13}/docs/ref/voice/models/openai_stt.md +0 -0
  113. {openai_agents-0.0.12 → openai_agents-0.0.13}/docs/ref/voice/models/openai_tts.md +0 -0
  114. {openai_agents-0.0.12 → openai_agents-0.0.13}/docs/ref/voice/pipeline.md +0 -0
  115. {openai_agents-0.0.12 → openai_agents-0.0.13}/docs/ref/voice/pipeline_config.md +0 -0
  116. {openai_agents-0.0.12 → openai_agents-0.0.13}/docs/ref/voice/result.md +0 -0
  117. {openai_agents-0.0.12 → openai_agents-0.0.13}/docs/ref/voice/utils.md +0 -0
  118. {openai_agents-0.0.12 → openai_agents-0.0.13}/docs/ref/voice/workflow.md +0 -0
  119. {openai_agents-0.0.12 → openai_agents-0.0.13}/docs/results.md +0 -0
  120. {openai_agents-0.0.12 → openai_agents-0.0.13}/docs/running_agents.md +0 -0
  121. {openai_agents-0.0.12 → openai_agents-0.0.13}/docs/scripts/translate_docs.py +0 -0
  122. {openai_agents-0.0.12 → openai_agents-0.0.13}/docs/streaming.md +0 -0
  123. {openai_agents-0.0.12 → openai_agents-0.0.13}/docs/stylesheets/extra.css +0 -0
  124. {openai_agents-0.0.12 → openai_agents-0.0.13}/docs/tools.md +0 -0
  125. {openai_agents-0.0.12 → openai_agents-0.0.13}/docs/tracing.md +0 -0
  126. {openai_agents-0.0.12 → openai_agents-0.0.13}/docs/visualization.md +0 -0
  127. {openai_agents-0.0.12 → openai_agents-0.0.13}/docs/voice/pipeline.md +0 -0
  128. {openai_agents-0.0.12 → openai_agents-0.0.13}/docs/voice/quickstart.md +0 -0
  129. {openai_agents-0.0.12 → openai_agents-0.0.13}/docs/voice/tracing.md +0 -0
  130. {openai_agents-0.0.12 → openai_agents-0.0.13}/examples/__init__.py +0 -0
  131. {openai_agents-0.0.12 → openai_agents-0.0.13}/examples/agent_patterns/README.md +0 -0
  132. {openai_agents-0.0.12 → openai_agents-0.0.13}/examples/agent_patterns/agents_as_tools.py +0 -0
  133. {openai_agents-0.0.12 → openai_agents-0.0.13}/examples/agent_patterns/deterministic.py +0 -0
  134. {openai_agents-0.0.12 → openai_agents-0.0.13}/examples/agent_patterns/forcing_tool_use.py +0 -0
  135. {openai_agents-0.0.12 → openai_agents-0.0.13}/examples/agent_patterns/input_guardrails.py +0 -0
  136. {openai_agents-0.0.12 → openai_agents-0.0.13}/examples/agent_patterns/llm_as_a_judge.py +0 -0
  137. {openai_agents-0.0.12 → openai_agents-0.0.13}/examples/agent_patterns/output_guardrails.py +0 -0
  138. {openai_agents-0.0.12 → openai_agents-0.0.13}/examples/agent_patterns/parallelization.py +0 -0
  139. {openai_agents-0.0.12 → openai_agents-0.0.13}/examples/agent_patterns/routing.py +0 -0
  140. {openai_agents-0.0.12 → openai_agents-0.0.13}/examples/agent_patterns/streaming_guardrails.py +0 -0
  141. {openai_agents-0.0.12 → openai_agents-0.0.13}/examples/basic/agent_lifecycle_example.py +0 -0
  142. {openai_agents-0.0.12 → openai_agents-0.0.13}/examples/basic/dynamic_system_prompt.py +0 -0
  143. {openai_agents-0.0.12 → openai_agents-0.0.13}/examples/basic/hello_world.py +0 -0
  144. {openai_agents-0.0.12 → openai_agents-0.0.13}/examples/basic/hello_world_jupyter.py +0 -0
  145. {openai_agents-0.0.12 → openai_agents-0.0.13}/examples/basic/lifecycle_example.py +0 -0
  146. {openai_agents-0.0.12 → openai_agents-0.0.13}/examples/basic/local_image.py +0 -0
  147. {openai_agents-0.0.12 → openai_agents-0.0.13}/examples/basic/media/image_bison.jpg +0 -0
  148. {openai_agents-0.0.12 → openai_agents-0.0.13}/examples/basic/non_strict_output_type.py +0 -0
  149. {openai_agents-0.0.12 → openai_agents-0.0.13}/examples/basic/previous_response_id.py +0 -0
  150. {openai_agents-0.0.12 → openai_agents-0.0.13}/examples/basic/remote_image.py +0 -0
  151. {openai_agents-0.0.12 → openai_agents-0.0.13}/examples/basic/stream_items.py +0 -0
  152. {openai_agents-0.0.12 → openai_agents-0.0.13}/examples/basic/stream_text.py +0 -0
  153. {openai_agents-0.0.12 → openai_agents-0.0.13}/examples/basic/tools.py +0 -0
  154. {openai_agents-0.0.12 → openai_agents-0.0.13}/examples/customer_service/main.py +0 -0
  155. {openai_agents-0.0.12 → openai_agents-0.0.13}/examples/financial_research_agent/README.md +0 -0
  156. {openai_agents-0.0.12 → openai_agents-0.0.13}/examples/financial_research_agent/__init__.py +0 -0
  157. {openai_agents-0.0.12 → openai_agents-0.0.13}/examples/financial_research_agent/agents/__init__.py +0 -0
  158. {openai_agents-0.0.12 → openai_agents-0.0.13}/examples/financial_research_agent/agents/financials_agent.py +0 -0
  159. {openai_agents-0.0.12 → openai_agents-0.0.13}/examples/financial_research_agent/agents/planner_agent.py +0 -0
  160. {openai_agents-0.0.12 → openai_agents-0.0.13}/examples/financial_research_agent/agents/risk_agent.py +0 -0
  161. {openai_agents-0.0.12 → openai_agents-0.0.13}/examples/financial_research_agent/agents/search_agent.py +0 -0
  162. {openai_agents-0.0.12 → openai_agents-0.0.13}/examples/financial_research_agent/agents/verifier_agent.py +0 -0
  163. {openai_agents-0.0.12 → openai_agents-0.0.13}/examples/financial_research_agent/agents/writer_agent.py +0 -0
  164. {openai_agents-0.0.12 → openai_agents-0.0.13}/examples/financial_research_agent/manager.py +0 -0
  165. {openai_agents-0.0.12 → openai_agents-0.0.13}/examples/financial_research_agent/printer.py +0 -0
  166. {openai_agents-0.0.12 → openai_agents-0.0.13}/examples/handoffs/message_filter.py +0 -0
  167. {openai_agents-0.0.12 → openai_agents-0.0.13}/examples/handoffs/message_filter_streaming.py +0 -0
  168. {openai_agents-0.0.12 → openai_agents-0.0.13}/examples/mcp/filesystem_example/README.md +0 -0
  169. {openai_agents-0.0.12 → openai_agents-0.0.13}/examples/mcp/filesystem_example/main.py +0 -0
  170. {openai_agents-0.0.12 → openai_agents-0.0.13}/examples/mcp/filesystem_example/sample_files/favorite_books.txt +0 -0
  171. {openai_agents-0.0.12 → openai_agents-0.0.13}/examples/mcp/filesystem_example/sample_files/favorite_cities.txt +0 -0
  172. {openai_agents-0.0.12 → openai_agents-0.0.13}/examples/mcp/filesystem_example/sample_files/favorite_songs.txt +0 -0
  173. {openai_agents-0.0.12 → openai_agents-0.0.13}/examples/mcp/git_example/README.md +0 -0
  174. {openai_agents-0.0.12 → openai_agents-0.0.13}/examples/mcp/git_example/main.py +0 -0
  175. {openai_agents-0.0.12 → openai_agents-0.0.13}/examples/mcp/sse_example/README.md +0 -0
  176. {openai_agents-0.0.12 → openai_agents-0.0.13}/examples/mcp/sse_example/main.py +0 -0
  177. {openai_agents-0.0.12 → openai_agents-0.0.13}/examples/mcp/sse_example/server.py +0 -0
  178. {openai_agents-0.0.12 → openai_agents-0.0.13}/examples/model_providers/README.md +0 -0
  179. {openai_agents-0.0.12 → openai_agents-0.0.13}/examples/model_providers/custom_example_agent.py +0 -0
  180. {openai_agents-0.0.12 → openai_agents-0.0.13}/examples/model_providers/custom_example_global.py +0 -0
  181. {openai_agents-0.0.12 → openai_agents-0.0.13}/examples/model_providers/custom_example_provider.py +0 -0
  182. {openai_agents-0.0.12 → openai_agents-0.0.13}/examples/model_providers/litellm_auto.py +0 -0
  183. {openai_agents-0.0.12 → openai_agents-0.0.13}/examples/model_providers/litellm_provider.py +0 -0
  184. {openai_agents-0.0.12 → openai_agents-0.0.13}/examples/research_bot/README.md +0 -0
  185. {openai_agents-0.0.12 → openai_agents-0.0.13}/examples/research_bot/__init__.py +0 -0
  186. {openai_agents-0.0.12 → openai_agents-0.0.13}/examples/research_bot/agents/__init__.py +0 -0
  187. {openai_agents-0.0.12 → openai_agents-0.0.13}/examples/research_bot/agents/planner_agent.py +0 -0
  188. {openai_agents-0.0.12 → openai_agents-0.0.13}/examples/research_bot/agents/search_agent.py +0 -0
  189. {openai_agents-0.0.12 → openai_agents-0.0.13}/examples/research_bot/agents/writer_agent.py +0 -0
  190. {openai_agents-0.0.12 → openai_agents-0.0.13}/examples/research_bot/main.py +0 -0
  191. {openai_agents-0.0.12 → openai_agents-0.0.13}/examples/research_bot/manager.py +0 -0
  192. {openai_agents-0.0.12 → openai_agents-0.0.13}/examples/research_bot/printer.py +0 -0
  193. {openai_agents-0.0.12 → openai_agents-0.0.13}/examples/research_bot/sample_outputs/product_recs.md +0 -0
  194. {openai_agents-0.0.12 → openai_agents-0.0.13}/examples/research_bot/sample_outputs/product_recs.txt +0 -0
  195. {openai_agents-0.0.12 → openai_agents-0.0.13}/examples/research_bot/sample_outputs/vacation.md +0 -0
  196. {openai_agents-0.0.12 → openai_agents-0.0.13}/examples/research_bot/sample_outputs/vacation.txt +0 -0
  197. {openai_agents-0.0.12 → openai_agents-0.0.13}/examples/tools/computer_use.py +0 -0
  198. {openai_agents-0.0.12 → openai_agents-0.0.13}/examples/tools/file_search.py +0 -0
  199. {openai_agents-0.0.12 → openai_agents-0.0.13}/examples/tools/web_search.py +0 -0
  200. {openai_agents-0.0.12 → openai_agents-0.0.13}/examples/voice/__init__.py +0 -0
  201. {openai_agents-0.0.12 → openai_agents-0.0.13}/examples/voice/static/README.md +0 -0
  202. {openai_agents-0.0.12 → openai_agents-0.0.13}/examples/voice/static/__init__.py +0 -0
  203. {openai_agents-0.0.12 → openai_agents-0.0.13}/examples/voice/static/main.py +0 -0
  204. {openai_agents-0.0.12 → openai_agents-0.0.13}/examples/voice/static/util.py +0 -0
  205. {openai_agents-0.0.12 → openai_agents-0.0.13}/examples/voice/streamed/README.md +0 -0
  206. {openai_agents-0.0.12 → openai_agents-0.0.13}/examples/voice/streamed/__init__.py +0 -0
  207. {openai_agents-0.0.12 → openai_agents-0.0.13}/examples/voice/streamed/main.py +0 -0
  208. {openai_agents-0.0.12 → openai_agents-0.0.13}/examples/voice/streamed/my_workflow.py +0 -0
  209. {openai_agents-0.0.12 → openai_agents-0.0.13}/mkdocs.yml +0 -0
  210. {openai_agents-0.0.12 → openai_agents-0.0.13}/src/agents/__init__.py +0 -0
  211. {openai_agents-0.0.12 → openai_agents-0.0.13}/src/agents/_config.py +0 -0
  212. {openai_agents-0.0.12 → openai_agents-0.0.13}/src/agents/_debug.py +0 -0
  213. {openai_agents-0.0.12 → openai_agents-0.0.13}/src/agents/_run_impl.py +0 -0
  214. {openai_agents-0.0.12 → openai_agents-0.0.13}/src/agents/agent.py +0 -0
  215. {openai_agents-0.0.12 → openai_agents-0.0.13}/src/agents/agent_output.py +0 -0
  216. {openai_agents-0.0.12 → openai_agents-0.0.13}/src/agents/computer.py +0 -0
  217. {openai_agents-0.0.12 → openai_agents-0.0.13}/src/agents/exceptions.py +0 -0
  218. {openai_agents-0.0.12 → openai_agents-0.0.13}/src/agents/extensions/__init__.py +0 -0
  219. {openai_agents-0.0.12 → openai_agents-0.0.13}/src/agents/extensions/handoff_filters.py +0 -0
  220. {openai_agents-0.0.12 → openai_agents-0.0.13}/src/agents/extensions/handoff_prompt.py +0 -0
  221. {openai_agents-0.0.12 → openai_agents-0.0.13}/src/agents/extensions/models/__init__.py +0 -0
  222. {openai_agents-0.0.12 → openai_agents-0.0.13}/src/agents/extensions/models/litellm_provider.py +0 -0
  223. {openai_agents-0.0.12 → openai_agents-0.0.13}/src/agents/extensions/visualization.py +0 -0
  224. {openai_agents-0.0.12 → openai_agents-0.0.13}/src/agents/function_schema.py +0 -0
  225. {openai_agents-0.0.12 → openai_agents-0.0.13}/src/agents/guardrail.py +0 -0
  226. {openai_agents-0.0.12 → openai_agents-0.0.13}/src/agents/handoffs.py +0 -0
  227. {openai_agents-0.0.12 → openai_agents-0.0.13}/src/agents/items.py +0 -0
  228. {openai_agents-0.0.12 → openai_agents-0.0.13}/src/agents/lifecycle.py +0 -0
  229. {openai_agents-0.0.12 → openai_agents-0.0.13}/src/agents/logger.py +0 -0
  230. {openai_agents-0.0.12 → openai_agents-0.0.13}/src/agents/mcp/__init__.py +0 -0
  231. {openai_agents-0.0.12 → openai_agents-0.0.13}/src/agents/mcp/util.py +0 -0
  232. {openai_agents-0.0.12 → openai_agents-0.0.13}/src/agents/models/__init__.py +0 -0
  233. {openai_agents-0.0.12 → openai_agents-0.0.13}/src/agents/models/_openai_shared.py +0 -0
  234. {openai_agents-0.0.12 → openai_agents-0.0.13}/src/agents/models/chatcmpl_converter.py +0 -0
  235. {openai_agents-0.0.12 → openai_agents-0.0.13}/src/agents/models/chatcmpl_helpers.py +0 -0
  236. {openai_agents-0.0.12 → openai_agents-0.0.13}/src/agents/models/fake_id.py +0 -0
  237. {openai_agents-0.0.12 → openai_agents-0.0.13}/src/agents/models/interface.py +0 -0
  238. {openai_agents-0.0.12 → openai_agents-0.0.13}/src/agents/models/multi_provider.py +0 -0
  239. {openai_agents-0.0.12 → openai_agents-0.0.13}/src/agents/models/openai_provider.py +0 -0
  240. {openai_agents-0.0.12 → openai_agents-0.0.13}/src/agents/py.typed +0 -0
  241. {openai_agents-0.0.12 → openai_agents-0.0.13}/src/agents/run.py +0 -0
  242. {openai_agents-0.0.12 → openai_agents-0.0.13}/src/agents/run_context.py +0 -0
  243. {openai_agents-0.0.12 → openai_agents-0.0.13}/src/agents/stream_events.py +0 -0
  244. {openai_agents-0.0.12 → openai_agents-0.0.13}/src/agents/strict_schema.py +0 -0
  245. {openai_agents-0.0.12 → openai_agents-0.0.13}/src/agents/tool.py +0 -0
  246. {openai_agents-0.0.12 → openai_agents-0.0.13}/src/agents/tracing/__init__.py +0 -0
  247. {openai_agents-0.0.12 → openai_agents-0.0.13}/src/agents/tracing/create.py +0 -0
  248. {openai_agents-0.0.12 → openai_agents-0.0.13}/src/agents/tracing/logger.py +0 -0
  249. {openai_agents-0.0.12 → openai_agents-0.0.13}/src/agents/tracing/processor_interface.py +0 -0
  250. {openai_agents-0.0.12 → openai_agents-0.0.13}/src/agents/tracing/processors.py +0 -0
  251. {openai_agents-0.0.12 → openai_agents-0.0.13}/src/agents/tracing/scope.py +0 -0
  252. {openai_agents-0.0.12 → openai_agents-0.0.13}/src/agents/tracing/setup.py +0 -0
  253. {openai_agents-0.0.12 → openai_agents-0.0.13}/src/agents/tracing/span_data.py +0 -0
  254. {openai_agents-0.0.12 → openai_agents-0.0.13}/src/agents/tracing/spans.py +0 -0
  255. {openai_agents-0.0.12 → openai_agents-0.0.13}/src/agents/tracing/traces.py +0 -0
  256. {openai_agents-0.0.12 → openai_agents-0.0.13}/src/agents/tracing/util.py +0 -0
  257. {openai_agents-0.0.12 → openai_agents-0.0.13}/src/agents/usage.py +0 -0
  258. {openai_agents-0.0.12 → openai_agents-0.0.13}/src/agents/util/__init__.py +0 -0
  259. {openai_agents-0.0.12 → openai_agents-0.0.13}/src/agents/util/_coro.py +0 -0
  260. {openai_agents-0.0.12 → openai_agents-0.0.13}/src/agents/util/_error_tracing.py +0 -0
  261. {openai_agents-0.0.12 → openai_agents-0.0.13}/src/agents/util/_json.py +0 -0
  262. {openai_agents-0.0.12 → openai_agents-0.0.13}/src/agents/util/_pretty_print.py +0 -0
  263. {openai_agents-0.0.12 → openai_agents-0.0.13}/src/agents/util/_transforms.py +0 -0
  264. {openai_agents-0.0.12 → openai_agents-0.0.13}/src/agents/util/_types.py +0 -0
  265. {openai_agents-0.0.12 → openai_agents-0.0.13}/src/agents/version.py +0 -0
  266. {openai_agents-0.0.12 → openai_agents-0.0.13}/src/agents/voice/__init__.py +0 -0
  267. {openai_agents-0.0.12 → openai_agents-0.0.13}/src/agents/voice/events.py +0 -0
  268. {openai_agents-0.0.12 → openai_agents-0.0.13}/src/agents/voice/exceptions.py +0 -0
  269. {openai_agents-0.0.12 → openai_agents-0.0.13}/src/agents/voice/imports.py +0 -0
  270. {openai_agents-0.0.12 → openai_agents-0.0.13}/src/agents/voice/input.py +0 -0
  271. {openai_agents-0.0.12 → openai_agents-0.0.13}/src/agents/voice/model.py +0 -0
  272. {openai_agents-0.0.12 → openai_agents-0.0.13}/src/agents/voice/models/__init__.py +0 -0
  273. {openai_agents-0.0.12 → openai_agents-0.0.13}/src/agents/voice/models/openai_model_provider.py +0 -0
  274. {openai_agents-0.0.12 → openai_agents-0.0.13}/src/agents/voice/models/openai_stt.py +0 -0
  275. {openai_agents-0.0.12 → openai_agents-0.0.13}/src/agents/voice/models/openai_tts.py +0 -0
  276. {openai_agents-0.0.12 → openai_agents-0.0.13}/src/agents/voice/pipeline.py +0 -0
  277. {openai_agents-0.0.12 → openai_agents-0.0.13}/src/agents/voice/pipeline_config.py +0 -0
  278. {openai_agents-0.0.12 → openai_agents-0.0.13}/src/agents/voice/result.py +0 -0
  279. {openai_agents-0.0.12 → openai_agents-0.0.13}/src/agents/voice/utils.py +0 -0
  280. {openai_agents-0.0.12 → openai_agents-0.0.13}/src/agents/voice/workflow.py +0 -0
  281. {openai_agents-0.0.12 → openai_agents-0.0.13}/tests/README.md +0 -0
  282. {openai_agents-0.0.12 → openai_agents-0.0.13}/tests/__init__.py +0 -0
  283. {openai_agents-0.0.12 → openai_agents-0.0.13}/tests/conftest.py +0 -0
  284. {openai_agents-0.0.12 → openai_agents-0.0.13}/tests/fastapi/__init__.py +0 -0
  285. {openai_agents-0.0.12 → openai_agents-0.0.13}/tests/fastapi/streaming_app.py +0 -0
  286. {openai_agents-0.0.12 → openai_agents-0.0.13}/tests/fastapi/test_streaming_context.py +0 -0
  287. {openai_agents-0.0.12 → openai_agents-0.0.13}/tests/mcp/__init__.py +0 -0
  288. {openai_agents-0.0.12 → openai_agents-0.0.13}/tests/mcp/conftest.py +0 -0
  289. {openai_agents-0.0.12 → openai_agents-0.0.13}/tests/mcp/helpers.py +0 -0
  290. {openai_agents-0.0.12 → openai_agents-0.0.13}/tests/mcp/test_caching.py +0 -0
  291. {openai_agents-0.0.12 → openai_agents-0.0.13}/tests/mcp/test_connect_disconnect.py +0 -0
  292. {openai_agents-0.0.12 → openai_agents-0.0.13}/tests/mcp/test_mcp_tracing.py +0 -0
  293. {openai_agents-0.0.12 → openai_agents-0.0.13}/tests/mcp/test_mcp_util.py +0 -0
  294. {openai_agents-0.0.12 → openai_agents-0.0.13}/tests/mcp/test_runner_calls_mcp.py +0 -0
  295. {openai_agents-0.0.12 → openai_agents-0.0.13}/tests/models/__init__.py +0 -0
  296. {openai_agents-0.0.12 → openai_agents-0.0.13}/tests/models/conftest.py +0 -0
  297. {openai_agents-0.0.12 → openai_agents-0.0.13}/tests/models/test_map.py +0 -0
  298. {openai_agents-0.0.12 → openai_agents-0.0.13}/tests/test_agent_config.py +0 -0
  299. {openai_agents-0.0.12 → openai_agents-0.0.13}/tests/test_agent_hooks.py +0 -0
  300. {openai_agents-0.0.12 → openai_agents-0.0.13}/tests/test_agent_runner.py +0 -0
  301. {openai_agents-0.0.12 → openai_agents-0.0.13}/tests/test_agent_runner_streamed.py +0 -0
  302. {openai_agents-0.0.12 → openai_agents-0.0.13}/tests/test_agent_tracing.py +0 -0
  303. {openai_agents-0.0.12 → openai_agents-0.0.13}/tests/test_computer_action.py +0 -0
  304. {openai_agents-0.0.12 → openai_agents-0.0.13}/tests/test_config.py +0 -0
  305. {openai_agents-0.0.12 → openai_agents-0.0.13}/tests/test_doc_parsing.py +0 -0
  306. {openai_agents-0.0.12 → openai_agents-0.0.13}/tests/test_extension_filters.py +0 -0
  307. {openai_agents-0.0.12 → openai_agents-0.0.13}/tests/test_function_schema.py +0 -0
  308. {openai_agents-0.0.12 → openai_agents-0.0.13}/tests/test_function_tool.py +0 -0
  309. {openai_agents-0.0.12 → openai_agents-0.0.13}/tests/test_function_tool_decorator.py +0 -0
  310. {openai_agents-0.0.12 → openai_agents-0.0.13}/tests/test_global_hooks.py +0 -0
  311. {openai_agents-0.0.12 → openai_agents-0.0.13}/tests/test_guardrails.py +0 -0
  312. {openai_agents-0.0.12 → openai_agents-0.0.13}/tests/test_handoff_tool.py +0 -0
  313. {openai_agents-0.0.12 → openai_agents-0.0.13}/tests/test_items_helpers.py +0 -0
  314. {openai_agents-0.0.12 → openai_agents-0.0.13}/tests/test_max_turns.py +0 -0
  315. {openai_agents-0.0.12 → openai_agents-0.0.13}/tests/test_openai_chatcompletions.py +0 -0
  316. {openai_agents-0.0.12 → openai_agents-0.0.13}/tests/test_openai_chatcompletions_converter.py +0 -0
  317. {openai_agents-0.0.12 → openai_agents-0.0.13}/tests/test_openai_chatcompletions_stream.py +0 -0
  318. {openai_agents-0.0.12 → openai_agents-0.0.13}/tests/test_openai_responses_converter.py +0 -0
  319. {openai_agents-0.0.12 → openai_agents-0.0.13}/tests/test_output_tool.py +0 -0
  320. {openai_agents-0.0.12 → openai_agents-0.0.13}/tests/test_pretty_print.py +0 -0
  321. {openai_agents-0.0.12 → openai_agents-0.0.13}/tests/test_responses.py +0 -0
  322. {openai_agents-0.0.12 → openai_agents-0.0.13}/tests/test_responses_tracing.py +0 -0
  323. {openai_agents-0.0.12 → openai_agents-0.0.13}/tests/test_result_cast.py +0 -0
  324. {openai_agents-0.0.12 → openai_agents-0.0.13}/tests/test_run_config.py +0 -0
  325. {openai_agents-0.0.12 → openai_agents-0.0.13}/tests/test_run_step_execution.py +0 -0
  326. {openai_agents-0.0.12 → openai_agents-0.0.13}/tests/test_run_step_processing.py +0 -0
  327. {openai_agents-0.0.12 → openai_agents-0.0.13}/tests/test_strict_schema.py +0 -0
  328. {openai_agents-0.0.12 → openai_agents-0.0.13}/tests/test_tool_choice_reset.py +0 -0
  329. {openai_agents-0.0.12 → openai_agents-0.0.13}/tests/test_tool_converter.py +0 -0
  330. {openai_agents-0.0.12 → openai_agents-0.0.13}/tests/test_tool_use_behavior.py +0 -0
  331. {openai_agents-0.0.12 → openai_agents-0.0.13}/tests/test_trace_processor.py +0 -0
  332. {openai_agents-0.0.12 → openai_agents-0.0.13}/tests/test_tracing.py +0 -0
  333. {openai_agents-0.0.12 → openai_agents-0.0.13}/tests/test_tracing_errors.py +0 -0
  334. {openai_agents-0.0.12 → openai_agents-0.0.13}/tests/test_tracing_errors_streamed.py +0 -0
  335. {openai_agents-0.0.12 → openai_agents-0.0.13}/tests/test_visualization.py +0 -0
  336. {openai_agents-0.0.12 → openai_agents-0.0.13}/tests/testing_processor.py +0 -0
  337. {openai_agents-0.0.12 → openai_agents-0.0.13}/tests/tracing/test_processor_api_key.py +0 -0
  338. {openai_agents-0.0.12 → openai_agents-0.0.13}/tests/voice/__init__.py +0 -0
  339. {openai_agents-0.0.12 → openai_agents-0.0.13}/tests/voice/fake_models.py +0 -0
  340. {openai_agents-0.0.12 → openai_agents-0.0.13}/tests/voice/helpers.py +0 -0
  341. {openai_agents-0.0.12 → openai_agents-0.0.13}/tests/voice/test_input.py +0 -0
  342. {openai_agents-0.0.12 → openai_agents-0.0.13}/tests/voice/test_openai_stt.py +0 -0
  343. {openai_agents-0.0.12 → openai_agents-0.0.13}/tests/voice/test_openai_tts.py +0 -0
  344. {openai_agents-0.0.12 → openai_agents-0.0.13}/tests/voice/test_pipeline.py +0 -0
  345. {openai_agents-0.0.12 → openai_agents-0.0.13}/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.12
3
+ Version: 0.0.13
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
@@ -20,7 +20,7 @@ Classifier: Typing :: Typed
20
20
  Requires-Python: >=3.9
21
21
  Requires-Dist: griffe<2,>=1.5.6
22
22
  Requires-Dist: mcp<2,>=1.6.0; python_version >= '3.10'
23
- Requires-Dist: openai>=1.66.5
23
+ Requires-Dist: openai>=1.76.0
24
24
  Requires-Dist: pydantic<3,>=2.10
25
25
  Requires-Dist: requests<3,>=2.0
26
26
  Requires-Dist: types-requests<3,>=2.0
@@ -4,7 +4,7 @@ from .manager import FinancialResearchManager
4
4
 
5
5
 
6
6
  # Entrypoint for the financial bot example.
7
- # Run this as `python -m examples.financial_bot.main` and enter a
7
+ # Run this as `python -m examples.financial_research_agent.main` and enter a
8
8
  # financial research query, for example:
9
9
  # "Write up an analysis of Apple Inc.'s most recent quarter."
10
10
  async def main() -> None:
@@ -1,13 +1,13 @@
1
1
  [project]
2
2
  name = "openai-agents"
3
- version = "0.0.12"
3
+ version = "0.0.13"
4
4
  description = "OpenAI Agents SDK"
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.9"
7
7
  license = "MIT"
8
8
  authors = [{ name = "OpenAI", email = "support@openai.com" }]
9
9
  dependencies = [
10
- "openai>=1.66.5",
10
+ "openai>=1.76.0",
11
11
  "pydantic>=2.10, <3",
12
12
  "griffe>=1.5.6, <2",
13
13
  "typing-extensions>=4.12.2, <5",
@@ -1,6 +1,5 @@
1
1
  from __future__ import annotations
2
2
 
3
- import dataclasses
4
3
  import json
5
4
  import time
6
5
  from collections.abc import AsyncIterator
@@ -75,7 +74,7 @@ class LitellmModel(Model):
75
74
  ) -> ModelResponse:
76
75
  with generation_span(
77
76
  model=str(self.model),
78
- model_config=dataclasses.asdict(model_settings)
77
+ model_config=model_settings.to_json_dict()
79
78
  | {"base_url": str(self.base_url or ""), "model_impl": "litellm"},
80
79
  disabled=tracing.is_disabled(),
81
80
  ) as span_generation:
@@ -147,7 +146,7 @@ class LitellmModel(Model):
147
146
  ) -> AsyncIterator[TResponseStreamEvent]:
148
147
  with generation_span(
149
148
  model=str(self.model),
150
- model_config=dataclasses.asdict(model_settings)
149
+ model_config=model_settings.to_json_dict()
151
150
  | {"base_url": str(self.base_url or ""), "model_impl": "litellm"},
152
151
  disabled=tracing.is_disabled(),
153
152
  ) as span_generation:
@@ -286,7 +285,7 @@ class LitellmModel(Model):
286
285
  stream=stream,
287
286
  stream_options=stream_options,
288
287
  reasoning_effort=reasoning_effort,
289
- extra_headers=HEADERS,
288
+ extra_headers={**HEADERS, **(model_settings.extra_headers or {})},
290
289
  api_key=self.api_key,
291
290
  base_url=self.base_url,
292
291
  **extra_kwargs,
@@ -3,6 +3,7 @@ from __future__ import annotations
3
3
  import abc
4
4
  import asyncio
5
5
  from contextlib import AbstractAsyncContextManager, AsyncExitStack
6
+ from datetime import timedelta
6
7
  from pathlib import Path
7
8
  from typing import Any, Literal
8
9
 
@@ -54,7 +55,7 @@ class MCPServer(abc.ABC):
54
55
  class _MCPServerWithClientSession(MCPServer, abc.ABC):
55
56
  """Base class for MCP servers that use a `ClientSession` to communicate with the server."""
56
57
 
57
- def __init__(self, cache_tools_list: bool):
58
+ def __init__(self, cache_tools_list: bool, client_session_timeout_seconds: float | None):
58
59
  """
59
60
  Args:
60
61
  cache_tools_list: Whether to cache the tools list. If `True`, the tools list will be
@@ -63,12 +64,16 @@ class _MCPServerWithClientSession(MCPServer, abc.ABC):
63
64
  by calling `invalidate_tools_cache()`. You should set this to `True` if you know the
64
65
  server will not change its tools list, because it can drastically improve latency
65
66
  (by avoiding a round-trip to the server every time).
67
+
68
+ client_session_timeout_seconds: the read timeout passed to the MCP ClientSession.
66
69
  """
67
70
  self.session: ClientSession | None = None
68
71
  self.exit_stack: AsyncExitStack = AsyncExitStack()
69
72
  self._cleanup_lock: asyncio.Lock = asyncio.Lock()
70
73
  self.cache_tools_list = cache_tools_list
71
74
 
75
+ self.client_session_timeout_seconds = client_session_timeout_seconds
76
+
72
77
  # The cache is always dirty at startup, so that we fetch tools at least once
73
78
  self._cache_dirty = True
74
79
  self._tools_list: list[MCPTool] | None = None
@@ -101,7 +106,15 @@ class _MCPServerWithClientSession(MCPServer, abc.ABC):
101
106
  try:
102
107
  transport = await self.exit_stack.enter_async_context(self.create_streams())
103
108
  read, write = transport
104
- session = await self.exit_stack.enter_async_context(ClientSession(read, write))
109
+ session = await self.exit_stack.enter_async_context(
110
+ ClientSession(
111
+ read,
112
+ write,
113
+ timedelta(seconds=self.client_session_timeout_seconds)
114
+ if self.client_session_timeout_seconds
115
+ else None,
116
+ )
117
+ )
105
118
  await session.initialize()
106
119
  self.session = session
107
120
  except Exception as e:
@@ -183,6 +196,7 @@ class MCPServerStdio(_MCPServerWithClientSession):
183
196
  params: MCPServerStdioParams,
184
197
  cache_tools_list: bool = False,
185
198
  name: str | None = None,
199
+ client_session_timeout_seconds: float | None = 5,
186
200
  ):
187
201
  """Create a new MCP server based on the stdio transport.
188
202
 
@@ -199,8 +213,9 @@ class MCPServerStdio(_MCPServerWithClientSession):
199
213
  improve latency (by avoiding a round-trip to the server every time).
200
214
  name: A readable name for the server. If not provided, we'll create one from the
201
215
  command.
216
+ client_session_timeout_seconds: the read timeout passed to the MCP ClientSession.
202
217
  """
203
- super().__init__(cache_tools_list)
218
+ super().__init__(cache_tools_list, client_session_timeout_seconds)
204
219
 
205
220
  self.params = StdioServerParameters(
206
221
  command=params["command"],
@@ -257,6 +272,7 @@ class MCPServerSse(_MCPServerWithClientSession):
257
272
  params: MCPServerSseParams,
258
273
  cache_tools_list: bool = False,
259
274
  name: str | None = None,
275
+ client_session_timeout_seconds: float | None = 5,
260
276
  ):
261
277
  """Create a new MCP server based on the HTTP with SSE transport.
262
278
 
@@ -274,8 +290,10 @@ class MCPServerSse(_MCPServerWithClientSession):
274
290
 
275
291
  name: A readable name for the server. If not provided, we'll create one from the
276
292
  URL.
293
+
294
+ client_session_timeout_seconds: the read timeout passed to the MCP ClientSession.
277
295
  """
278
- super().__init__(cache_tools_list)
296
+ super().__init__(cache_tools_list, client_session_timeout_seconds)
279
297
 
280
298
  self.params = params
281
299
  self._name = name or f"sse: {self.params['url']}"
@@ -1,10 +1,12 @@
1
1
  from __future__ import annotations
2
2
 
3
+ import dataclasses
3
4
  from dataclasses import dataclass, fields, replace
4
- from typing import Literal
5
+ from typing import Any, Literal
5
6
 
6
- from openai._types import Body, Query
7
+ from openai._types import Body, Headers, Query
7
8
  from openai.types.shared import Reasoning
9
+ from pydantic import BaseModel
8
10
 
9
11
 
10
12
  @dataclass
@@ -67,6 +69,10 @@ class ModelSettings:
67
69
  """Additional body fields to provide with the request.
68
70
  Defaults to None if not provided."""
69
71
 
72
+ extra_headers: Headers | None = None
73
+ """Additional headers to provide with the request.
74
+ Defaults to None if not provided."""
75
+
70
76
  def resolve(self, override: ModelSettings | None) -> ModelSettings:
71
77
  """Produce a new ModelSettings by overlaying any non-None values from the
72
78
  override on top of this instance."""
@@ -79,3 +85,16 @@ class ModelSettings:
79
85
  if getattr(override, field.name) is not None
80
86
  }
81
87
  return replace(self, **changes)
88
+
89
+ def to_json_dict(self) -> dict[str, Any]:
90
+ dataclass_dict = dataclasses.asdict(self)
91
+
92
+ json_dict: dict[str, Any] = {}
93
+
94
+ for field_name, value in dataclass_dict.items():
95
+ if isinstance(value, BaseModel):
96
+ json_dict[field_name] = value.model_dump(mode="json")
97
+ else:
98
+ json_dict[field_name] = value
99
+
100
+ return json_dict
@@ -56,7 +56,8 @@ class ChatCmplStreamHandler:
56
56
  type="response.created",
57
57
  )
58
58
 
59
- usage = chunk.usage
59
+ # This is always set by the OpenAI API, but not by others e.g. LiteLLM
60
+ usage = chunk.usage if hasattr(chunk, "usage") else None
60
61
 
61
62
  if not chunk.choices or not chunk.choices[0].delta:
62
63
  continue
@@ -112,7 +113,8 @@ class ChatCmplStreamHandler:
112
113
  state.text_content_index_and_output[1].text += delta.content
113
114
 
114
115
  # Handle refusals (model declines to answer)
115
- if delta.refusal:
116
+ # This is always set by the OpenAI API, but not by others e.g. LiteLLM
117
+ if hasattr(delta, "refusal") and delta.refusal:
116
118
  if not state.refusal_content_index_and_output:
117
119
  # Initialize a content tracker for streaming refusal text
118
120
  state.refusal_content_index_and_output = (
@@ -1,6 +1,5 @@
1
1
  from __future__ import annotations
2
2
 
3
- import dataclasses
4
3
  import json
5
4
  import time
6
5
  from collections.abc import AsyncIterator
@@ -56,8 +55,7 @@ class OpenAIChatCompletionsModel(Model):
56
55
  ) -> ModelResponse:
57
56
  with generation_span(
58
57
  model=str(self.model),
59
- model_config=dataclasses.asdict(model_settings)
60
- | {"base_url": str(self._client.base_url)},
58
+ model_config=model_settings.to_json_dict() | {"base_url": str(self._client.base_url)},
61
59
  disabled=tracing.is_disabled(),
62
60
  ) as span_generation:
63
61
  response = await self._fetch_response(
@@ -121,8 +119,7 @@ class OpenAIChatCompletionsModel(Model):
121
119
  """
122
120
  with generation_span(
123
121
  model=str(self.model),
124
- model_config=dataclasses.asdict(model_settings)
125
- | {"base_url": str(self._client.base_url)},
122
+ model_config=model_settings.to_json_dict() | {"base_url": str(self._client.base_url)},
126
123
  disabled=tracing.is_disabled(),
127
124
  ) as span_generation:
128
125
  response, stream = await self._fetch_response(
@@ -255,7 +252,7 @@ class OpenAIChatCompletionsModel(Model):
255
252
  stream_options=self._non_null_or_not_given(stream_options),
256
253
  store=self._non_null_or_not_given(store),
257
254
  reasoning_effort=self._non_null_or_not_given(reasoning_effort),
258
- extra_headers=HEADERS,
255
+ extra_headers={ **HEADERS, **(model_settings.extra_headers or {}) },
259
256
  extra_query=model_settings.extra_query,
260
257
  extra_body=model_settings.extra_body,
261
258
  metadata=self._non_null_or_not_given(model_settings.metadata),
@@ -253,7 +253,7 @@ class OpenAIResponsesModel(Model):
253
253
  tool_choice=tool_choice,
254
254
  parallel_tool_calls=parallel_tool_calls,
255
255
  stream=stream,
256
- extra_headers=_HEADERS,
256
+ extra_headers={**_HEADERS, **(model_settings.extra_headers or {})},
257
257
  extra_query=model_settings.extra_query,
258
258
  extra_body=model_settings.extra_body,
259
259
  text=response_format,
@@ -75,7 +75,9 @@ class RunResultBase(abc.ABC):
75
75
 
76
76
  def to_input_list(self) -> list[TResponseInputItem]:
77
77
  """Creates a new input list, merging the original input with all the new items generated."""
78
- original_items: list[TResponseInputItem] = ItemHelpers.input_to_new_input_list(self.input)
78
+ original_items: list[TResponseInputItem] = ItemHelpers.input_to_new_input_list(
79
+ self.input
80
+ )
79
81
  new_items = [item.to_input_item() for item in self.new_items]
80
82
 
81
83
  return original_items + new_items
@@ -152,6 +154,18 @@ class RunResultStreaming(RunResultBase):
152
154
  """
153
155
  return self.current_agent
154
156
 
157
+ def cancel(self) -> None:
158
+ """Cancels the streaming run, stopping all background tasks and marking the run as
159
+ complete."""
160
+ self._cleanup_tasks() # Cancel all running tasks
161
+ self.is_complete = True # Mark the run as complete to stop event streaming
162
+
163
+ # Optionally, clear the event queue to prevent processing stale events
164
+ while not self._event_queue.empty():
165
+ self._event_queue.get_nowait()
166
+ while not self._input_guardrail_queue.empty():
167
+ self._input_guardrail_queue.get_nowait()
168
+
155
169
  async def stream_events(self) -> AsyncIterator[StreamEvent]:
156
170
  """Stream deltas for new items as they are generated. We're using the types from the
157
171
  OpenAI Responses API, so these are semantic events: each event has a `type` field that
@@ -192,13 +206,17 @@ class RunResultStreaming(RunResultBase):
192
206
 
193
207
  def _check_errors(self):
194
208
  if self.current_turn > self.max_turns:
195
- self._stored_exception = MaxTurnsExceeded(f"Max turns ({self.max_turns}) exceeded")
209
+ self._stored_exception = MaxTurnsExceeded(
210
+ f"Max turns ({self.max_turns}) exceeded"
211
+ )
196
212
 
197
213
  # Fetch all the completed guardrail results from the queue and raise if needed
198
214
  while not self._input_guardrail_queue.empty():
199
215
  guardrail_result = self._input_guardrail_queue.get_nowait()
200
216
  if guardrail_result.output.tripwire_triggered:
201
- self._stored_exception = InputGuardrailTripwireTriggered(guardrail_result)
217
+ self._stored_exception = InputGuardrailTripwireTriggered(
218
+ guardrail_result
219
+ )
202
220
 
203
221
  # Check the tasks for any exceptions
204
222
  if self._run_impl_task and self._run_impl_task.done():
@@ -127,7 +127,10 @@ class FakeModel(Model):
127
127
  )
128
128
 
129
129
 
130
- def get_response_obj(output: list[TResponseOutputItem], response_id: str | None = None) -> Response:
130
+ def get_response_obj(
131
+ output: list[TResponseOutputItem],
132
+ response_id: str | None = None,
133
+ ) -> Response:
131
134
  return Response(
132
135
  id=response_id or "123",
133
136
  created_at=123,
@@ -6,7 +6,7 @@ from agents.mcp.server import _MCPServerWithClientSession
6
6
 
7
7
  class CrashingClientSessionServer(_MCPServerWithClientSession):
8
8
  def __init__(self):
9
- super().__init__(cache_tools_list=False)
9
+ super().__init__(cache_tools_list=False, client_session_timeout_seconds=5)
10
10
  self.cleanup_called = False
11
11
 
12
12
  def create_streams(self):
@@ -0,0 +1,59 @@
1
+ import json
2
+ from dataclasses import fields
3
+
4
+ from openai.types.shared import Reasoning
5
+
6
+ from agents.model_settings import ModelSettings
7
+
8
+
9
+ def verify_serialization(model_settings: ModelSettings) -> None:
10
+ """Verify that ModelSettings can be serialized to a JSON string."""
11
+ json_dict = model_settings.to_json_dict()
12
+ json_string = json.dumps(json_dict)
13
+ assert json_string is not None
14
+
15
+
16
+ def test_basic_serialization() -> None:
17
+ """Tests whether ModelSettings can be serialized to a JSON string."""
18
+
19
+ # First, lets create a ModelSettings instance
20
+ model_settings = ModelSettings(
21
+ temperature=0.5,
22
+ top_p=0.9,
23
+ max_tokens=100,
24
+ )
25
+
26
+ # Now, lets serialize the ModelSettings instance to a JSON string
27
+ verify_serialization(model_settings)
28
+
29
+
30
+ def test_all_fields_serialization() -> None:
31
+ """Tests whether ModelSettings can be serialized to a JSON string."""
32
+
33
+ # First, lets create a ModelSettings instance
34
+ model_settings = ModelSettings(
35
+ temperature=0.5,
36
+ top_p=0.9,
37
+ frequency_penalty=0.0,
38
+ presence_penalty=0.0,
39
+ tool_choice="auto",
40
+ parallel_tool_calls=True,
41
+ truncation="auto",
42
+ max_tokens=100,
43
+ reasoning=Reasoning(),
44
+ metadata={"foo": "bar"},
45
+ store=False,
46
+ include_usage=False,
47
+ extra_query={"foo": "bar"},
48
+ extra_body={"foo": "bar"},
49
+ extra_headers={"foo": "bar"},
50
+ )
51
+
52
+ # Verify that every single field is set to a non-None value
53
+ for field in fields(model_settings):
54
+ assert getattr(model_settings, field.name) is not None, (
55
+ f"You must set the {field.name} field"
56
+ )
57
+
58
+ # Now, lets serialize the ModelSettings instance to a JSON string
59
+ verify_serialization(model_settings)