pydantic-ai 1.0.6__tar.gz → 1.0.7__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 pydantic-ai might be problematic. Click here for more details.

Files changed (450) hide show
  1. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/PKG-INFO +4 -4
  2. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/mcp_server.py +2 -1
  3. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/test_a2a.py +3 -3
  4. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/test_ag_ui.py +136 -2
  5. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/test_agent.py +186 -13
  6. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/test_history_processor.py +53 -13
  7. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/test_logfire.py +2 -0
  8. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/test_mcp.py +16 -0
  9. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/test_tools.py +237 -14
  10. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/.gitignore +0 -0
  11. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/LICENSE +0 -0
  12. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/Makefile +0 -0
  13. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/README.md +0 -0
  14. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/pyproject.toml +0 -0
  15. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/__init__.py +0 -0
  16. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/assets/dummy.pdf +0 -0
  17. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/assets/kiwi.png +0 -0
  18. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/assets/marcelo.mp3 +0 -0
  19. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/assets/product_name.txt +0 -0
  20. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/assets/small_video.mp4 +0 -0
  21. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/cassettes/test_dbos/test_complex_agent_run.yaml +0 -0
  22. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/cassettes/test_dbos/test_complex_agent_run_in_workflow.yaml +0 -0
  23. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/cassettes/test_dbos/test_complex_agent_run_stream_in_workflow.yaml +0 -0
  24. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/cassettes/test_dbos/test_dbos_agent_iter.yaml +0 -0
  25. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/cassettes/test_dbos/test_dbos_agent_iter_in_workflow.yaml +0 -0
  26. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/cassettes/test_dbos/test_dbos_agent_override_deps_in_workflow.yaml +0 -0
  27. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/cassettes/test_dbos/test_dbos_agent_override_tools_in_workflow.yaml +0 -0
  28. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/cassettes/test_dbos/test_dbos_agent_run.yaml +0 -0
  29. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/cassettes/test_dbos/test_dbos_agent_run_in_workflow_with_toolsets.yaml +0 -0
  30. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/cassettes/test_dbos/test_dbos_agent_run_stream.yaml +0 -0
  31. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/cassettes/test_dbos/test_dbos_agent_run_sync.yaml +0 -0
  32. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/cassettes/test_dbos/test_dbos_agent_run_sync_in_workflow.yaml +0 -0
  33. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/cassettes/test_dbos/test_dbos_agent_with_dataclass_deps_as_dict.yaml +0 -0
  34. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/cassettes/test_dbos/test_dbos_agent_with_hitl_tool.yaml +0 -0
  35. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/cassettes/test_dbos/test_dbos_agent_with_hitl_tool_sync.yaml +0 -0
  36. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/cassettes/test_dbos/test_dbos_agent_with_model_retry.yaml +0 -0
  37. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/cassettes/test_dbos/test_dbos_agent_with_non_dict_deps.yaml +0 -0
  38. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/cassettes/test_dbos/test_dbos_agent_with_unserializable_deps_type.yaml +0 -0
  39. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/cassettes/test_dbos/test_dbos_model_stream_direct.yaml +0 -0
  40. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/cassettes/test_dbos/test_multiple_agents.yaml +0 -0
  41. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/cassettes/test_dbos/test_simple_agent_run_in_workflow.yaml +0 -0
  42. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/cassettes/test_mcp/test_agent_with_server_not_running.yaml +0 -0
  43. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/cassettes/test_mcp/test_agent_with_stdio_server.yaml +0 -0
  44. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/cassettes/test_mcp/test_tool_returning_audio_resource.yaml +0 -0
  45. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/cassettes/test_mcp/test_tool_returning_audio_resource_link.yaml +0 -0
  46. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/cassettes/test_mcp/test_tool_returning_dict.yaml +0 -0
  47. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/cassettes/test_mcp/test_tool_returning_error.yaml +0 -0
  48. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/cassettes/test_mcp/test_tool_returning_image.yaml +0 -0
  49. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/cassettes/test_mcp/test_tool_returning_image_resource.yaml +0 -0
  50. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/cassettes/test_mcp/test_tool_returning_image_resource_link.yaml +0 -0
  51. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/cassettes/test_mcp/test_tool_returning_multiple_items.yaml +0 -0
  52. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/cassettes/test_mcp/test_tool_returning_none.yaml +0 -0
  53. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/cassettes/test_mcp/test_tool_returning_str.yaml +0 -0
  54. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/cassettes/test_mcp/test_tool_returning_text_resource.yaml +0 -0
  55. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/cassettes/test_mcp/test_tool_returning_text_resource_link.yaml +0 -0
  56. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/cassettes/test_settings/test_stop_settings[anthropic].yaml +0 -0
  57. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/cassettes/test_settings/test_stop_settings[bedrock].yaml +0 -0
  58. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/cassettes/test_settings/test_stop_settings[cohere].yaml +0 -0
  59. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/cassettes/test_settings/test_stop_settings[gemini].yaml +0 -0
  60. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/cassettes/test_settings/test_stop_settings[google].yaml +0 -0
  61. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/cassettes/test_settings/test_stop_settings[groq].yaml +0 -0
  62. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/cassettes/test_settings/test_stop_settings[mistral].yaml +0 -0
  63. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/cassettes/test_settings/test_stop_settings[openai].yaml +0 -0
  64. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/cassettes/test_temporal/test_complex_agent_run.yaml +0 -0
  65. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/cassettes/test_temporal/test_complex_agent_run_in_workflow.yaml +0 -0
  66. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/cassettes/test_temporal/test_complex_agent_run_stream_in_workflow.yaml +0 -0
  67. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/cassettes/test_temporal/test_logfire_plugin.yaml +0 -0
  68. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/cassettes/test_temporal/test_multiple_agents.yaml +0 -0
  69. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/cassettes/test_temporal/test_simple_agent_run_in_workflow.yaml +0 -0
  70. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/cassettes/test_temporal/test_temporal_agent_iter.yaml +0 -0
  71. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/cassettes/test_temporal/test_temporal_agent_override_deps_in_workflow.yaml +0 -0
  72. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/cassettes/test_temporal/test_temporal_agent_run.yaml +0 -0
  73. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/cassettes/test_temporal/test_temporal_agent_run_stream.yaml +0 -0
  74. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/cassettes/test_temporal/test_temporal_agent_run_sync.yaml +0 -0
  75. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/cassettes/test_temporal/test_temporal_agent_sync_tool_activity_disabled.yaml +0 -0
  76. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/cassettes/test_temporal/test_temporal_agent_with_dataclass_deps_as_dict.yaml +0 -0
  77. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/cassettes/test_temporal/test_temporal_agent_with_hitl_tool.yaml +0 -0
  78. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/cassettes/test_temporal/test_temporal_agent_with_model_retry.yaml +0 -0
  79. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/cassettes/test_temporal/test_temporal_agent_with_non_dict_deps.yaml +0 -0
  80. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/cassettes/test_temporal/test_temporal_agent_with_unserializable_deps_type.yaml +0 -0
  81. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/conftest.py +0 -0
  82. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/evals/__init__.py +0 -0
  83. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/evals/test_dataset.py +0 -0
  84. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/evals/test_evaluator_base.py +0 -0
  85. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/evals/test_evaluator_common.py +0 -0
  86. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/evals/test_evaluator_context.py +0 -0
  87. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/evals/test_evaluator_spec.py +0 -0
  88. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/evals/test_evaluators.py +0 -0
  89. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/evals/test_llm_as_a_judge.py +0 -0
  90. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/evals/test_otel.py +0 -0
  91. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/evals/test_render_numbers.py +0 -0
  92. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/evals/test_reporting.py +0 -0
  93. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/evals/test_reports.py +0 -0
  94. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/evals/test_utils.py +0 -0
  95. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/evals/utils.py +0 -0
  96. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/example_modules/README.md +0 -0
  97. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/example_modules/bank_database.py +0 -0
  98. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/example_modules/fake_database.py +0 -0
  99. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/example_modules/mcp_server.py +0 -0
  100. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/example_modules/weather_service.py +0 -0
  101. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/ext/__init__.py +0 -0
  102. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/ext/test_langchain.py +0 -0
  103. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/graph/__init__.py +0 -0
  104. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/graph/test_file_persistence.py +0 -0
  105. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/graph/test_graph.py +0 -0
  106. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/graph/test_mermaid.py +0 -0
  107. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/graph/test_persistence.py +0 -0
  108. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/graph/test_state.py +0 -0
  109. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/graph/test_utils.py +0 -0
  110. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/import_examples.py +0 -0
  111. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/json_body_serializer.py +0 -0
  112. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/__init__.py +0 -0
  113. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_anthropic/test_anthropic_code_execution_tool.yaml +0 -0
  114. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_anthropic/test_anthropic_model_empty_message_on_history.yaml +0 -0
  115. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_anthropic/test_anthropic_model_instructions.yaml +0 -0
  116. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_anthropic/test_anthropic_model_thinking_part.yaml +0 -0
  117. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_anthropic/test_anthropic_model_thinking_part_from_other_model.yaml +0 -0
  118. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_anthropic/test_anthropic_model_thinking_part_redacted.yaml +0 -0
  119. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_anthropic/test_anthropic_model_thinking_part_redacted_stream.yaml +0 -0
  120. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_anthropic/test_anthropic_model_thinking_part_stream.yaml +0 -0
  121. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_anthropic/test_anthropic_prompted_output.yaml +0 -0
  122. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_anthropic/test_anthropic_prompted_output_multiple.yaml +0 -0
  123. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_anthropic/test_anthropic_server_tool_pass_history_to_another_provider.yaml +0 -0
  124. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_anthropic/test_anthropic_server_tool_receive_history_from_another_provider.yaml +0 -0
  125. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_anthropic/test_anthropic_text_output_function.yaml +0 -0
  126. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_anthropic/test_anthropic_tool_output.yaml +0 -0
  127. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_anthropic/test_anthropic_tool_with_thinking.yaml +0 -0
  128. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_anthropic/test_anthropic_web_search_tool.yaml +0 -0
  129. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_anthropic/test_anthropic_web_search_tool_stream.yaml +0 -0
  130. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_anthropic/test_document_binary_content_input.yaml +0 -0
  131. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_anthropic/test_document_url_input.yaml +0 -0
  132. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_anthropic/test_extra_headers.yaml +0 -0
  133. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_anthropic/test_image_as_binary_content_tool_response.yaml +0 -0
  134. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_anthropic/test_image_url_input.yaml +0 -0
  135. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_anthropic/test_image_url_input_invalid_mime_type.yaml +0 -0
  136. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_anthropic/test_multiple_parallel_tool_calls.yaml +0 -0
  137. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_anthropic/test_text_document_url_input.yaml +0 -0
  138. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_bedrock/test_bedrock_anthropic_tool_with_thinking.yaml +0 -0
  139. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_bedrock/test_bedrock_empty_system_prompt.yaml +0 -0
  140. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_bedrock/test_bedrock_model.yaml +0 -0
  141. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_bedrock/test_bedrock_model_anthropic_model_without_tools.yaml +0 -0
  142. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_bedrock/test_bedrock_model_guardrail_config.yaml +0 -0
  143. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_bedrock/test_bedrock_model_instructions.yaml +0 -0
  144. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_bedrock/test_bedrock_model_iter_stream.yaml +0 -0
  145. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_bedrock/test_bedrock_model_max_tokens.yaml +0 -0
  146. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_bedrock/test_bedrock_model_other_parameters.yaml +0 -0
  147. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_bedrock/test_bedrock_model_performance_config.yaml +0 -0
  148. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_bedrock/test_bedrock_model_retry.yaml +0 -0
  149. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_bedrock/test_bedrock_model_stream.yaml +0 -0
  150. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_bedrock/test_bedrock_model_structured_output.yaml +0 -0
  151. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_bedrock/test_bedrock_model_thinking_part_anthropic.yaml +0 -0
  152. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_bedrock/test_bedrock_model_thinking_part_deepseek.yaml +0 -0
  153. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_bedrock/test_bedrock_model_thinking_part_from_other_model.yaml +0 -0
  154. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_bedrock/test_bedrock_model_thinking_part_redacted.yaml +0 -0
  155. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_bedrock/test_bedrock_model_thinking_part_redacted_stream.yaml +0 -0
  156. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_bedrock/test_bedrock_model_thinking_part_stream.yaml +0 -0
  157. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_bedrock/test_bedrock_model_top_p.yaml +0 -0
  158. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_bedrock/test_bedrock_multiple_documents_in_history.yaml +0 -0
  159. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_bedrock/test_document_url_input.yaml +0 -0
  160. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_bedrock/test_image_as_binary_content_input.yaml +0 -0
  161. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_bedrock/test_image_url_input.yaml +0 -0
  162. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_bedrock/test_text_as_binary_content_input.yaml +0 -0
  163. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_bedrock/test_text_document_url_input.yaml +0 -0
  164. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_bedrock/test_video_as_binary_content_input.yaml +0 -0
  165. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_bedrock/test_video_url_input.yaml +0 -0
  166. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_cohere/test_cohere_model_instructions.yaml +0 -0
  167. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_cohere/test_cohere_model_thinking_part.yaml +0 -0
  168. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_cohere/test_request_simple_success_with_vcr.yaml +0 -0
  169. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_deepseek/test_deepseek_model_thinking_part.yaml +0 -0
  170. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_deepseek/test_deepseek_model_thinking_stream.yaml +0 -0
  171. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_download_item/test_download_item_application_octet_stream.yaml +0 -0
  172. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_download_item/test_download_item_audio_mpeg.yaml +0 -0
  173. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_download_item/test_download_item_no_content_type.yaml +0 -0
  174. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_gemini/test_document_url_input.yaml +0 -0
  175. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_gemini/test_gemini_additional_properties_is_false.yaml +0 -0
  176. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_gemini/test_gemini_additional_properties_is_true.yaml +0 -0
  177. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_gemini/test_gemini_drop_exclusive_maximum.yaml +0 -0
  178. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_gemini/test_gemini_exclusive_minimum_and_maximum.yaml +0 -0
  179. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_gemini/test_gemini_model_instructions.yaml +0 -0
  180. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_gemini/test_gemini_model_thinking_part.yaml +0 -0
  181. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_gemini/test_gemini_native_output.yaml +0 -0
  182. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_gemini/test_gemini_native_output_multiple.yaml +0 -0
  183. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_gemini/test_gemini_prompted_output.yaml +0 -0
  184. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_gemini/test_gemini_prompted_output_multiple.yaml +0 -0
  185. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_gemini/test_gemini_prompted_output_with_tools.yaml +0 -0
  186. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_gemini/test_gemini_text_output_function.yaml +0 -0
  187. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_gemini/test_gemini_tool_config_any_with_tool_without_args.yaml +0 -0
  188. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_gemini/test_gemini_tool_output.yaml +0 -0
  189. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_gemini/test_gemini_youtube_video_url_input.yaml +0 -0
  190. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_gemini/test_image_as_binary_content_input.yaml +0 -0
  191. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_gemini/test_image_as_binary_content_tool_response.yaml +0 -0
  192. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_gemini/test_image_url_input.yaml +0 -0
  193. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_gemini/test_labels_are_ignored_with_gla_provider.yaml +0 -0
  194. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_gemini/test_video_as_binary_content_input.yaml +0 -0
  195. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_gemini/test_video_url_input.yaml +0 -0
  196. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_gemini_vertex/test_labels.yaml +0 -0
  197. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_gemini_vertex/test_url_input[AudioUrl (gs)].yaml +0 -0
  198. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_gemini_vertex/test_url_input[AudioUrl].yaml +0 -0
  199. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_gemini_vertex/test_url_input[DocumentUrl (gs)].yaml +0 -0
  200. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_gemini_vertex/test_url_input[DocumentUrl].yaml +0 -0
  201. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_gemini_vertex/test_url_input[ImageUrl (gs)].yaml +0 -0
  202. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_gemini_vertex/test_url_input[ImageUrl].yaml +0 -0
  203. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_gemini_vertex/test_url_input[VideoUrl (YouTube)].yaml +0 -0
  204. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_gemini_vertex/test_url_input[VideoUrl (gs)].yaml +0 -0
  205. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_gemini_vertex/test_url_input[VideoUrl].yaml +0 -0
  206. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_gemini_vertex/test_url_input_force_download.yaml +0 -0
  207. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_google/test_google_builtin_tools_with_other_tools.yaml +0 -0
  208. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_google/test_google_model.yaml +0 -0
  209. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_google/test_google_model_builtin_code_execution_stream.yaml +0 -0
  210. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_google/test_google_model_code_execution_tool.yaml +0 -0
  211. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_google/test_google_model_document_url_input.yaml +0 -0
  212. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_google/test_google_model_empty_assistant_response.yaml +0 -0
  213. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_google/test_google_model_empty_user_prompt.yaml +0 -0
  214. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_google/test_google_model_image_as_binary_content_input.yaml +0 -0
  215. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_google/test_google_model_image_url_input.yaml +0 -0
  216. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_google/test_google_model_instructions.yaml +0 -0
  217. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_google/test_google_model_iter_stream.yaml +0 -0
  218. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_google/test_google_model_max_tokens.yaml +0 -0
  219. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_google/test_google_model_multiple_documents_in_history.yaml +0 -0
  220. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_google/test_google_model_receive_web_search_history_from_another_provider.yaml +0 -0
  221. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_google/test_google_model_retry.yaml +0 -0
  222. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_google/test_google_model_safety_settings.yaml +0 -0
  223. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_google/test_google_model_server_tool_receive_history_from_another_provider.yaml +0 -0
  224. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_google/test_google_model_stream.yaml +0 -0
  225. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_google/test_google_model_structured_output.yaml +0 -0
  226. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_google/test_google_model_text_as_binary_content_input.yaml +0 -0
  227. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_google/test_google_model_text_document_url_input.yaml +0 -0
  228. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_google/test_google_model_thinking_config.yaml +0 -0
  229. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_google/test_google_model_thinking_part.yaml +0 -0
  230. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_google/test_google_model_thinking_part_from_other_model.yaml +0 -0
  231. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_google/test_google_model_thinking_part_iter.yaml +0 -0
  232. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_google/test_google_model_top_p.yaml +0 -0
  233. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_google/test_google_model_url_context_tool.yaml +0 -0
  234. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_google/test_google_model_usage_limit_exceeded.yaml +0 -0
  235. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_google/test_google_model_usage_limit_not_exceeded.yaml +0 -0
  236. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_google/test_google_model_vertex_labels.yaml +0 -0
  237. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_google/test_google_model_vertex_provider.yaml +0 -0
  238. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_google/test_google_model_video_as_binary_content_input.yaml +0 -0
  239. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_google/test_google_model_video_as_binary_content_input_with_vendor_metadata.yaml +0 -0
  240. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_google/test_google_model_video_url_input.yaml +0 -0
  241. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_google/test_google_model_web_search_tool.yaml +0 -0
  242. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_google/test_google_model_youtube_video_url_input_with_vendor_metadata.yaml +0 -0
  243. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_google/test_google_native_output.yaml +0 -0
  244. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_google/test_google_native_output_multiple.yaml +0 -0
  245. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_google/test_google_prompted_output.yaml +0 -0
  246. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_google/test_google_prompted_output_multiple.yaml +0 -0
  247. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_google/test_google_prompted_output_with_tools.yaml +0 -0
  248. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_google/test_google_text_output_function.yaml +0 -0
  249. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_google/test_google_timeout.yaml +0 -0
  250. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_google/test_google_tool_config_any_with_tool_without_args.yaml +0 -0
  251. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_google/test_google_tool_output.yaml +0 -0
  252. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_google/test_google_url_input[AudioUrl (gs)].yaml +0 -0
  253. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_google/test_google_url_input[AudioUrl].yaml +0 -0
  254. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_google/test_google_url_input[DocumentUrl (gs)].yaml +0 -0
  255. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_google/test_google_url_input[DocumentUrl].yaml +0 -0
  256. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_google/test_google_url_input[ImageUrl (gs)].yaml +0 -0
  257. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_google/test_google_url_input[ImageUrl].yaml +0 -0
  258. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_google/test_google_url_input[VideoUrl (YouTube)].yaml +0 -0
  259. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_google/test_google_url_input[VideoUrl (gs)].yaml +0 -0
  260. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_google/test_google_url_input[VideoUrl].yaml +0 -0
  261. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_google/test_google_url_input_force_download.yaml +0 -0
  262. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_google/test_google_vertexai_model_usage_limit_exceeded.yaml +0 -0
  263. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_groq/test_extra_headers.yaml +0 -0
  264. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_groq/test_groq_model_instructions.yaml +0 -0
  265. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_groq/test_groq_model_thinking_part.yaml +0 -0
  266. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_groq/test_groq_model_thinking_part_iter.yaml +0 -0
  267. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_groq/test_groq_model_web_search_tool.yaml +0 -0
  268. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_groq/test_groq_native_output.yaml +0 -0
  269. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_groq/test_groq_prompted_output.yaml +0 -0
  270. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_groq/test_image_as_binary_content_input.yaml +0 -0
  271. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_groq/test_image_as_binary_content_tool_response.yaml +0 -0
  272. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_groq/test_image_url_input.yaml +0 -0
  273. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_groq/test_tool_regular_error.yaml +0 -0
  274. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_groq/test_tool_use_failed_error.yaml +0 -0
  275. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_groq/test_tool_use_failed_error_streaming.yaml +0 -0
  276. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_huggingface/test_hf_model_instructions.yaml +0 -0
  277. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_huggingface/test_hf_model_thinking_part.yaml +0 -0
  278. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_huggingface/test_hf_model_thinking_part_iter.yaml +0 -0
  279. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_huggingface/test_image_as_binary_content_input.yaml +0 -0
  280. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_huggingface/test_image_url_input.yaml +0 -0
  281. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_huggingface/test_max_completion_tokens[Qwen-Qwen2.5-72B-Instruct].yaml +0 -0
  282. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_huggingface/test_max_completion_tokens[deepseek-ai-DeepSeek-R1-0528].yaml +0 -0
  283. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_huggingface/test_max_completion_tokens[meta-llama-Llama-3.3-70B-Instruct].yaml +0 -0
  284. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_huggingface/test_request_simple_success_with_vcr.yaml +0 -0
  285. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_huggingface/test_request_simple_usage.yaml +0 -0
  286. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_huggingface/test_simple_completion.yaml +0 -0
  287. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_huggingface/test_stream_completion.yaml +0 -0
  288. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_mistral/test_image_as_binary_content_tool_response.yaml +0 -0
  289. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_mistral/test_mistral_model_instructions.yaml +0 -0
  290. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_mistral/test_mistral_model_thinking_part.yaml +0 -0
  291. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_mistral/test_mistral_model_thinking_part_iter.yaml +0 -0
  292. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_model_names/test_known_model_names.yaml +0 -0
  293. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_openai/test_audio_as_binary_content_input.yaml +0 -0
  294. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_openai/test_compatible_api_with_tool_calls_without_id.yaml +0 -0
  295. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_openai/test_document_as_binary_content_input.yaml +0 -0
  296. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_openai/test_document_as_binary_content_input_with_tool.yaml +0 -0
  297. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_openai/test_document_url_input.yaml +0 -0
  298. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_openai/test_extra_headers.yaml +0 -0
  299. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_openai/test_image_as_binary_content_input.yaml +0 -0
  300. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_openai/test_image_as_binary_content_tool_response.yaml +0 -0
  301. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_openai/test_image_url_tool_response.yaml +0 -0
  302. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_openai/test_invalid_response.yaml +0 -0
  303. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_openai/test_max_completion_tokens[gpt-4.5-preview].yaml +0 -0
  304. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_openai/test_max_completion_tokens[gpt-4o-mini].yaml +0 -0
  305. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_openai/test_max_completion_tokens[o3-mini].yaml +0 -0
  306. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_openai/test_multiple_agent_tool_calls.yaml +0 -0
  307. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_openai/test_openai_audio_url_input.yaml +0 -0
  308. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_openai/test_openai_instructions.yaml +0 -0
  309. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_openai/test_openai_instructions_with_tool_calls_keep_instructions.yaml +0 -0
  310. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_openai/test_openai_model_cerebras_provider.yaml +0 -0
  311. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_openai/test_openai_model_cerebras_provider_harmony.yaml +0 -0
  312. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_openai/test_openai_model_cerebras_provider_qwen_3_coder.yaml +0 -0
  313. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_openai/test_openai_model_settings_temperature_ignored_on_gpt_5.yaml +0 -0
  314. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_openai/test_openai_model_thinking_part.yaml +0 -0
  315. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_openai/test_openai_model_without_system_prompt.yaml +0 -0
  316. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_openai/test_openai_native_output.yaml +0 -0
  317. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_openai/test_openai_native_output_multiple.yaml +0 -0
  318. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_openai/test_openai_o1_mini_system_role[developer].yaml +0 -0
  319. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_openai/test_openai_o1_mini_system_role[system].yaml +0 -0
  320. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_openai/test_openai_prompted_output.yaml +0 -0
  321. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_openai/test_openai_prompted_output_multiple.yaml +0 -0
  322. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_openai/test_openai_text_output_function.yaml +0 -0
  323. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_openai/test_openai_tool_output.yaml +0 -0
  324. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_openai/test_openai_web_search_tool.yaml +0 -0
  325. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_openai/test_openai_web_search_tool_model_not_supported.yaml +0 -0
  326. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_openai/test_openai_web_search_tool_with_user_location.yaml +0 -0
  327. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_openai/test_reasoning_model_with_temperature.yaml +0 -0
  328. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_openai/test_system_prompt_role_o1_mini.yaml +0 -0
  329. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_openai/test_text_response.yaml +0 -0
  330. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_openai/test_user_id.yaml +0 -0
  331. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_openai/test_valid_response.yaml +0 -0
  332. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_openai_responses/test_audio_as_binary_content_input.yaml +0 -0
  333. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_openai_responses/test_image_as_binary_content_input.yaml +0 -0
  334. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_openai_responses/test_image_as_binary_content_tool_response.yaml +0 -0
  335. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_openai_responses/test_native_output.yaml +0 -0
  336. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_openai_responses/test_native_output_multiple.yaml +0 -0
  337. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_openai_responses/test_openai_previous_response_id.yaml +0 -0
  338. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_openai_responses/test_openai_previous_response_id_auto_mode.yaml +0 -0
  339. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_openai_responses/test_openai_responses_code_execution_tool.yaml +0 -0
  340. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_openai_responses/test_openai_responses_code_execution_tool_stream.yaml +0 -0
  341. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_openai_responses/test_openai_responses_document_as_binary_content_input.yaml +0 -0
  342. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_openai_responses/test_openai_responses_document_url_input.yaml +0 -0
  343. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_openai_responses/test_openai_responses_image_url_input.yaml +0 -0
  344. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_openai_responses/test_openai_responses_model_builtin_tools.yaml +0 -0
  345. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_openai_responses/test_openai_responses_model_http_error.yaml +0 -0
  346. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_openai_responses/test_openai_responses_model_instructions.yaml +0 -0
  347. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_openai_responses/test_openai_responses_model_retry.yaml +0 -0
  348. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_openai_responses/test_openai_responses_model_simple_response.yaml +0 -0
  349. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_openai_responses/test_openai_responses_model_simple_response_with_tool_call.yaml +0 -0
  350. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_openai_responses/test_openai_responses_model_thinking_part.yaml +0 -0
  351. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_openai_responses/test_openai_responses_model_web_search_tool.yaml +0 -0
  352. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_openai_responses/test_openai_responses_model_web_search_tool_stream.yaml +0 -0
  353. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_openai_responses/test_openai_responses_model_web_search_tool_with_invalid_region.yaml +0 -0
  354. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_openai_responses/test_openai_responses_model_web_search_tool_with_user_location.yaml +0 -0
  355. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_openai_responses/test_openai_responses_output_type.yaml +0 -0
  356. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_openai_responses/test_openai_responses_reasoning_effort.yaml +0 -0
  357. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_openai_responses/test_openai_responses_reasoning_generate_summary.yaml +0 -0
  358. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_openai_responses/test_openai_responses_stream.yaml +0 -0
  359. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_openai_responses/test_openai_responses_system_prompt.yaml +0 -0
  360. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_openai_responses/test_openai_responses_text_document_url_input.yaml +0 -0
  361. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_openai_responses/test_openai_responses_thinking_part_from_other_model.yaml +0 -0
  362. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_openai_responses/test_openai_responses_thinking_part_iter.yaml +0 -0
  363. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_openai_responses/test_openai_responses_thinking_with_modified_history.yaml +0 -0
  364. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_openai_responses/test_openai_responses_thinking_with_tool_calls.yaml +0 -0
  365. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_openai_responses/test_openai_responses_verbosity.yaml +0 -0
  366. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_openai_responses/test_prompted_output.yaml +0 -0
  367. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_openai_responses/test_prompted_output_multiple.yaml +0 -0
  368. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_openai_responses/test_reasoning_model_with_temperature.yaml +0 -0
  369. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_openai_responses/test_text_output_function.yaml +0 -0
  370. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/cassettes/test_openai_responses/test_tool_output.yaml +0 -0
  371. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/mock_async_stream.py +0 -0
  372. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/mock_openai.py +0 -0
  373. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/test_anthropic.py +0 -0
  374. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/test_bedrock.py +0 -0
  375. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/test_cohere.py +0 -0
  376. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/test_deepseek.py +0 -0
  377. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/test_download_item.py +0 -0
  378. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/test_fallback.py +0 -0
  379. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/test_gemini.py +0 -0
  380. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/test_gemini_vertex.py +0 -0
  381. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/test_google.py +0 -0
  382. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/test_groq.py +0 -0
  383. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/test_huggingface.py +0 -0
  384. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/test_instrumented.py +0 -0
  385. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/test_mcp_sampling.py +0 -0
  386. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/test_mistral.py +0 -0
  387. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/test_model.py +0 -0
  388. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/test_model_function.py +0 -0
  389. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/test_model_names.py +0 -0
  390. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/test_model_request_parameters.py +0 -0
  391. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/test_model_settings.py +0 -0
  392. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/test_model_test.py +0 -0
  393. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/test_openai.py +0 -0
  394. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/models/test_openai_responses.py +0 -0
  395. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/parts_from_messages.py +0 -0
  396. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/providers/__init__.py +0 -0
  397. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/providers/cassettes/test_azure/test_azure_provider_call.yaml +0 -0
  398. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/providers/cassettes/test_gateway/test_gateway_provider_with_anthropic.yaml +0 -0
  399. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/providers/cassettes/test_gateway/test_gateway_provider_with_google_vertex.yaml +0 -0
  400. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/providers/cassettes/test_gateway/test_gateway_provider_with_groq.yaml +0 -0
  401. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/providers/cassettes/test_gateway/test_gateway_provider_with_openai.yaml +0 -0
  402. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/providers/cassettes/test_gateway/test_gateway_provider_with_openai_responses.yaml +0 -0
  403. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/providers/cassettes/test_google_vertex/test_vertexai_provider.yaml +0 -0
  404. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/providers/cassettes/test_heroku/test_heroku_model_provider_claude_3_7_sonnet.yaml +0 -0
  405. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/providers/cassettes/test_openrouter/test_openrouter_with_google_model.yaml +0 -0
  406. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/providers/test_anthropic.py +0 -0
  407. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/providers/test_azure.py +0 -0
  408. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/providers/test_bedrock.py +0 -0
  409. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/providers/test_cerebras.py +0 -0
  410. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/providers/test_cohere.py +0 -0
  411. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/providers/test_deepseek.py +0 -0
  412. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/providers/test_fireworks.py +0 -0
  413. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/providers/test_gateway.py +0 -0
  414. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/providers/test_github.py +0 -0
  415. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/providers/test_google_gla.py +0 -0
  416. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/providers/test_google_vertex.py +0 -0
  417. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/providers/test_grok.py +0 -0
  418. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/providers/test_groq.py +0 -0
  419. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/providers/test_heroku.py +0 -0
  420. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/providers/test_huggingface.py +0 -0
  421. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/providers/test_litellm.py +0 -0
  422. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/providers/test_mistral.py +0 -0
  423. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/providers/test_moonshotai.py +0 -0
  424. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/providers/test_ollama.py +0 -0
  425. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/providers/test_openai.py +0 -0
  426. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/providers/test_openrouter.py +0 -0
  427. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/providers/test_provider_names.py +0 -0
  428. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/providers/test_together.py +0 -0
  429. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/providers/test_vercel.py +0 -0
  430. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/test_builtin_tools.py +0 -0
  431. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/test_cli.py +0 -0
  432. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/test_dbos.py +0 -0
  433. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/test_deps.py +0 -0
  434. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/test_direct.py +0 -0
  435. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/test_examples.py +0 -0
  436. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/test_format_as_xml.py +0 -0
  437. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/test_json_body_serializer.py +0 -0
  438. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/test_live.py +0 -0
  439. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/test_messages.py +0 -0
  440. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/test_parts_manager.py +0 -0
  441. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/test_settings.py +0 -0
  442. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/test_streaming.py +0 -0
  443. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/test_temporal.py +0 -0
  444. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/test_tenacity.py +0 -0
  445. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/test_thinking_part.py +0 -0
  446. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/test_toolsets.py +0 -0
  447. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/test_usage_limits.py +0 -0
  448. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/test_utils.py +0 -0
  449. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/typed_agent.py +0 -0
  450. {pydantic_ai-1.0.6 → pydantic_ai-1.0.7}/tests/typed_graph.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pydantic-ai
3
- Version: 1.0.6
3
+ Version: 1.0.7
4
4
  Summary: Agent Framework / shim to use Pydantic with LLMs
5
5
  Project-URL: Homepage, https://ai.pydantic.dev
6
6
  Project-URL: Source, https://github.com/pydantic/pydantic-ai
@@ -27,13 +27,13 @@ Classifier: Topic :: Internet
27
27
  Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
28
28
  Classifier: Topic :: Software Development :: Libraries :: Python Modules
29
29
  Requires-Python: >=3.10
30
- Requires-Dist: pydantic-ai-slim[ag-ui,anthropic,bedrock,cli,cohere,evals,google,groq,huggingface,logfire,mcp,mistral,openai,retries,temporal,vertexai]==1.0.6
30
+ Requires-Dist: pydantic-ai-slim[ag-ui,anthropic,bedrock,cli,cohere,evals,google,groq,huggingface,logfire,mcp,mistral,openai,retries,temporal,vertexai]==1.0.7
31
31
  Provides-Extra: a2a
32
32
  Requires-Dist: fasta2a>=0.4.1; extra == 'a2a'
33
33
  Provides-Extra: dbos
34
- Requires-Dist: pydantic-ai-slim[dbos]==1.0.6; extra == 'dbos'
34
+ Requires-Dist: pydantic-ai-slim[dbos]==1.0.7; extra == 'dbos'
35
35
  Provides-Extra: examples
36
- Requires-Dist: pydantic-ai-examples==1.0.6; extra == 'examples'
36
+ Requires-Dist: pydantic-ai-examples==1.0.7; extra == 'examples'
37
37
  Description-Content-Type: text/markdown
38
38
 
39
39
  <div align="center">
@@ -11,6 +11,7 @@ from mcp.types import (
11
11
  SamplingMessage,
12
12
  TextContent,
13
13
  TextResourceContents,
14
+ ToolAnnotations,
14
15
  )
15
16
  from pydantic import AnyUrl, BaseModel
16
17
 
@@ -18,7 +19,7 @@ mcp = FastMCP('Pydantic AI MCP Server')
18
19
  log_level = 'unset'
19
20
 
20
21
 
21
- @mcp.tool()
22
+ @mcp.tool(annotations=ToolAnnotations(title='Celsius to Fahrenheit'))
22
23
  async def celsius_to_fahrenheit(celsius: float) -> float:
23
24
  """Convert Celsius to Fahrenheit.
24
25
 
@@ -623,10 +623,10 @@ async def test_a2a_multiple_tasks_same_context():
623
623
  content='Final result processed.',
624
624
  tool_call_id=IsStr(),
625
625
  timestamp=IsDatetime(),
626
- )
627
- ]
626
+ ),
627
+ UserPromptPart(content='Second message', timestamp=IsDatetime()),
628
+ ],
628
629
  ),
629
- ModelRequest(parts=[UserPromptPart(content='Second message', timestamp=IsDatetime())]),
630
630
  ]
631
631
  )
632
632
 
@@ -21,7 +21,16 @@ from pydantic import BaseModel
21
21
  from pydantic_ai._run_context import RunContext
22
22
  from pydantic_ai.agent import Agent, AgentRunResult
23
23
  from pydantic_ai.exceptions import UserError
24
- from pydantic_ai.messages import ModelMessage
24
+ from pydantic_ai.messages import (
25
+ ModelMessage,
26
+ ModelRequest,
27
+ ModelResponse,
28
+ SystemPromptPart,
29
+ TextPart,
30
+ ToolCallPart,
31
+ ToolReturnPart,
32
+ UserPromptPart,
33
+ )
25
34
  from pydantic_ai.models.function import (
26
35
  AgentInfo,
27
36
  DeltaThinkingCalls,
@@ -34,7 +43,7 @@ from pydantic_ai.models.test import TestModel
34
43
  from pydantic_ai.output import OutputDataT
35
44
  from pydantic_ai.tools import AgentDepsT, ToolDefinition
36
45
 
37
- from .conftest import IsSameStr
46
+ from .conftest import IsDatetime, IsSameStr
38
47
 
39
48
  has_ag_ui: bool = False
40
49
  with contextlib.suppress(ImportError):
@@ -59,6 +68,7 @@ with contextlib.suppress(ImportError):
59
68
  SSE_CONTENT_TYPE,
60
69
  OnCompleteFunc,
61
70
  StateDeps,
71
+ _messages_from_ag_ui, # type: ignore[reportPrivateUsage]
62
72
  run_ag_ui,
63
73
  )
64
74
 
@@ -1347,3 +1357,127 @@ async def test_callback_with_error() -> None:
1347
1357
  assert len(events) > 0
1348
1358
  assert events[0]['type'] == 'RUN_STARTED'
1349
1359
  assert any(event['type'] == 'RUN_ERROR' for event in events)
1360
+
1361
+
1362
+ async def test_messages_from_ag_ui() -> None:
1363
+ messages = [
1364
+ SystemMessage(
1365
+ id='msg_1',
1366
+ content='System message',
1367
+ ),
1368
+ DeveloperMessage(
1369
+ id='msg_2',
1370
+ content='Developer message',
1371
+ ),
1372
+ UserMessage(
1373
+ id='msg_3',
1374
+ content='User message',
1375
+ ),
1376
+ UserMessage(
1377
+ id='msg_4',
1378
+ content='User message',
1379
+ ),
1380
+ AssistantMessage(
1381
+ id='msg_5',
1382
+ content='Assistant message',
1383
+ ),
1384
+ AssistantMessage(
1385
+ id='msg_6',
1386
+ tool_calls=[
1387
+ ToolCall(
1388
+ id='tool_call_1',
1389
+ function=FunctionCall(
1390
+ name='tool_call_1',
1391
+ arguments='{}',
1392
+ ),
1393
+ ),
1394
+ ],
1395
+ ),
1396
+ AssistantMessage(
1397
+ id='msg_7',
1398
+ tool_calls=[
1399
+ ToolCall(
1400
+ id='tool_call_2',
1401
+ function=FunctionCall(
1402
+ name='tool_call_2',
1403
+ arguments='{}',
1404
+ ),
1405
+ ),
1406
+ ],
1407
+ ),
1408
+ ToolMessage(
1409
+ id='msg_8',
1410
+ content='Tool message',
1411
+ tool_call_id='tool_call_1',
1412
+ ),
1413
+ ToolMessage(
1414
+ id='msg_9',
1415
+ content='Tool message',
1416
+ tool_call_id='tool_call_2',
1417
+ ),
1418
+ UserMessage(
1419
+ id='msg_10',
1420
+ content='User message',
1421
+ ),
1422
+ AssistantMessage(
1423
+ id='msg_11',
1424
+ content='Assistant message',
1425
+ ),
1426
+ ]
1427
+
1428
+ assert _messages_from_ag_ui(messages) == snapshot(
1429
+ [
1430
+ ModelRequest(
1431
+ parts=[
1432
+ SystemPromptPart(
1433
+ content='System message',
1434
+ timestamp=IsDatetime(),
1435
+ ),
1436
+ SystemPromptPart(
1437
+ content='Developer message',
1438
+ timestamp=IsDatetime(),
1439
+ ),
1440
+ UserPromptPart(
1441
+ content='User message',
1442
+ timestamp=IsDatetime(),
1443
+ ),
1444
+ UserPromptPart(
1445
+ content='User message',
1446
+ timestamp=IsDatetime(),
1447
+ ),
1448
+ ]
1449
+ ),
1450
+ ModelResponse(
1451
+ parts=[
1452
+ TextPart(content='Assistant message'),
1453
+ ToolCallPart(tool_name='tool_call_1', args='{}', tool_call_id='tool_call_1'),
1454
+ ToolCallPart(tool_name='tool_call_2', args='{}', tool_call_id='tool_call_2'),
1455
+ ],
1456
+ timestamp=IsDatetime(),
1457
+ ),
1458
+ ModelRequest(
1459
+ parts=[
1460
+ ToolReturnPart(
1461
+ tool_name='tool_call_1',
1462
+ content='Tool message',
1463
+ tool_call_id='tool_call_1',
1464
+ timestamp=IsDatetime(),
1465
+ ),
1466
+ ToolReturnPart(
1467
+ tool_name='tool_call_2',
1468
+ content='Tool message',
1469
+ tool_call_id='tool_call_2',
1470
+ timestamp=IsDatetime(),
1471
+ ),
1472
+ UserPromptPart(
1473
+ content='User message',
1474
+ timestamp=IsDatetime(),
1475
+ ),
1476
+ ]
1477
+ ),
1478
+ ModelResponse(
1479
+ parts=[TextPart(content='Assistant message')],
1480
+ timestamp=IsDatetime(),
1481
+ ),
1482
+ ]
1483
+ )
@@ -1797,7 +1797,7 @@ def test_run_with_history_new():
1797
1797
  ),
1798
1798
  ]
1799
1799
  )
1800
- assert result2._new_message_index == snapshot(4) # pyright: ignore[reportPrivateUsage]
1800
+ assert result2.new_messages() == result2.all_messages()[-2:]
1801
1801
  assert result2.output == snapshot('{"ret_a":"a-apple"}')
1802
1802
  assert result2._output_tool_name == snapshot(None) # pyright: ignore[reportPrivateUsage]
1803
1803
  assert result2.usage() == snapshot(RunUsage(requests=1, input_tokens=55, output_tokens=13))
@@ -1854,7 +1854,7 @@ def test_run_with_history_new():
1854
1854
  ),
1855
1855
  ]
1856
1856
  )
1857
- assert result3._new_message_index == snapshot(4) # pyright: ignore[reportPrivateUsage]
1857
+ assert result3.new_messages() == result3.all_messages()[-2:]
1858
1858
  assert result3.output == snapshot('{"ret_a":"a-apple"}')
1859
1859
  assert result3._output_tool_name == snapshot(None) # pyright: ignore[reportPrivateUsage]
1860
1860
  assert result3.usage() == snapshot(RunUsage(requests=1, input_tokens=55, output_tokens=13))
@@ -1983,7 +1983,7 @@ def test_run_with_history_new_structured():
1983
1983
  ]
1984
1984
  )
1985
1985
  assert result2.output == snapshot(Response(a=0))
1986
- assert result2._new_message_index == snapshot(5) # pyright: ignore[reportPrivateUsage]
1986
+ assert result2.new_messages() == result2.all_messages()[-3:]
1987
1987
  assert result2._output_tool_name == snapshot('final_result') # pyright: ignore[reportPrivateUsage]
1988
1988
  assert result2.usage() == snapshot(RunUsage(requests=1, input_tokens=59, output_tokens=13))
1989
1989
  new_msg_part_kinds = [(m.kind, [p.part_kind for p in m.parts]) for m in result2.all_messages()]
@@ -2003,34 +2003,61 @@ def test_run_with_history_new_structured():
2003
2003
 
2004
2004
 
2005
2005
  def test_run_with_history_ending_on_model_request_and_no_user_prompt():
2006
+ m = TestModel()
2007
+ agent = Agent(m)
2008
+
2009
+ @agent.system_prompt(dynamic=True)
2010
+ async def system_prompt(ctx: RunContext) -> str:
2011
+ return f'System prompt: user prompt length = {len(ctx.prompt or [])}'
2012
+
2006
2013
  messages: list[ModelMessage] = [
2007
- ModelRequest(parts=[UserPromptPart(content='Hello')], instructions='Original instructions'),
2014
+ ModelRequest(
2015
+ parts=[
2016
+ SystemPromptPart(content='System prompt', dynamic_ref=system_prompt.__qualname__),
2017
+ UserPromptPart(content=['Hello', ImageUrl('https://example.com/image.jpg')]),
2018
+ UserPromptPart(content='How goes it?'),
2019
+ ],
2020
+ instructions='Original instructions',
2021
+ ),
2008
2022
  ]
2009
2023
 
2010
- m = TestModel()
2011
- agent = Agent(m, instructions='New instructions')
2024
+ @agent.instructions
2025
+ async def instructions(ctx: RunContext) -> str:
2026
+ assert ctx.prompt == ['Hello', ImageUrl('https://example.com/image.jpg'), 'How goes it?']
2027
+ return 'New instructions'
2012
2028
 
2013
2029
  result = agent.run_sync(message_history=messages)
2014
2030
  assert result.all_messages() == snapshot(
2015
2031
  [
2016
2032
  ModelRequest(
2017
2033
  parts=[
2034
+ SystemPromptPart(
2035
+ content='System prompt: user prompt length = 3',
2036
+ timestamp=IsDatetime(),
2037
+ dynamic_ref=IsStr(),
2038
+ ),
2018
2039
  UserPromptPart(
2019
- content='Hello',
2040
+ content=['Hello', ImageUrl(url='https://example.com/image.jpg', identifier='39cfc4')],
2020
2041
  timestamp=IsDatetime(),
2021
- )
2042
+ ),
2043
+ UserPromptPart(
2044
+ content='How goes it?',
2045
+ timestamp=IsDatetime(),
2046
+ ),
2022
2047
  ],
2023
2048
  instructions='New instructions',
2024
2049
  ),
2025
2050
  ModelResponse(
2026
2051
  parts=[TextPart(content='success (no tool calls)')],
2027
- usage=RequestUsage(input_tokens=51, output_tokens=4),
2052
+ usage=RequestUsage(input_tokens=61, output_tokens=4),
2028
2053
  model_name='test',
2029
2054
  timestamp=IsDatetime(),
2030
2055
  ),
2031
2056
  ]
2032
2057
  )
2033
2058
 
2059
+ assert result.new_messages() == result.all_messages()[-1:]
2060
+
2034
2061
 
2035
2062
  def test_run_with_history_ending_on_model_response_with_tool_calls_and_no_user_prompt():
2036
2063
  """Test that an agent run with message_history ending on ModelResponse starts with CallToolsNode."""
@@ -2084,6 +2111,8 @@ def test_run_with_history_ending_on_model_response_with_tool_calls_and_no_user_p
2084
2111
  ]
2085
2112
  )
2086
2113
 
2114
+ assert result.new_messages() == result.all_messages()[-2:]
2115
+
2087
2116
 
2088
2117
  def test_run_with_history_ending_on_model_response_with_tool_calls_and_user_prompt():
2089
2118
  """Test that an agent run raises error when message_history ends on ModelResponse with tool calls and there's a new prompt."""
@@ -2136,6 +2165,8 @@ def test_run_with_history_ending_on_model_response_without_tool_calls_or_user_pr
2136
2165
  ]
2137
2166
  )
2138
2167
 
2168
+ assert result.new_messages() == []
2169
+
2139
2170
 
2140
2171
  def test_empty_tool_calls():
2141
2172
  def empty(_: list[ModelMessage], _info: AgentInfo) -> ModelResponse:
@@ -2941,6 +2972,8 @@ def test_dynamic_false_no_reevaluate():
2941
2972
  ]
2942
2973
  )
2943
2974
 
2975
+ assert res_two.new_messages() == res_two.all_messages()[-2:]
2976
+
2944
2977
 
2945
2978
  def test_dynamic_true_reevaluate_system_prompt():
2946
2979
  """When dynamic is true, the system prompt is reevaluated
@@ -3023,6 +3056,8 @@ def test_dynamic_true_reevaluate_system_prompt():
3023
3056
  ]
3024
3057
  )
3025
3058
 
3059
+ assert res_two.new_messages() == res_two.all_messages()[-2:]
3060
+
3026
3061
 
3027
3062
  def test_dynamic_system_prompt_no_changes():
3028
3063
  """Test coverage for _reevaluate_dynamic_prompts branch where no parts are changed
@@ -3553,6 +3588,8 @@ def test_instructions_with_message_history():
3553
3588
  ]
3554
3589
  )
3555
3590
 
3591
+ assert result.new_messages() == result.all_messages()[-2:]
3592
+
3556
3593
 
3557
3594
  def test_instructions_parameter_with_sequence():
3558
3595
  def instructions() -> str:
@@ -4675,7 +4712,11 @@ async def test_hitl_tool_approval():
4675
4712
  content='File \'new_file.py\' created with content: print("Hello, world!")',
4676
4713
  tool_call_id='create_file',
4677
4714
  timestamp=IsDatetime(),
4678
- ),
4715
+ )
4716
+ ]
4717
+ ),
4718
+ ModelRequest(
4719
+ parts=[
4679
4720
  ToolReturnPart(
4680
4721
  tool_name='delete_file',
4681
4722
  content="File 'ok_to_delete.py' deleted",
@@ -4700,6 +4741,33 @@ async def test_hitl_tool_approval():
4700
4741
  )
4701
4742
  assert result.output == snapshot('Done!')
4702
4743
 
4744
+ assert result.new_messages() == snapshot(
4745
+ [
4746
+ ModelRequest(
4747
+ parts=[
4748
+ ToolReturnPart(
4749
+ tool_name='delete_file',
4750
+ content="File 'ok_to_delete.py' deleted",
4751
+ tool_call_id='ok_to_delete',
4752
+ timestamp=IsDatetime(),
4753
+ ),
4754
+ ToolReturnPart(
4755
+ tool_name='delete_file',
4756
+ content='File cannot be deleted',
4757
+ tool_call_id='never_delete',
4758
+ timestamp=IsDatetime(),
4759
+ ),
4760
+ ]
4761
+ ),
4762
+ ModelResponse(
4763
+ parts=[TextPart(content='Done!')],
4764
+ usage=RequestUsage(input_tokens=78, output_tokens=24),
4765
+ model_name='function:model_function:',
4766
+ timestamp=IsDatetime(),
4767
+ ),
4768
+ ]
4769
+ )
4770
+
4703
4771
 
4704
4772
  async def test_run_with_deferred_tool_results_errors():
4705
4773
  agent = Agent('test')
@@ -4708,7 +4776,7 @@ async def test_run_with_deferred_tool_results_errors():
4708
4776
 
4709
4777
  with pytest.raises(
4710
4778
  UserError,
4711
- match='Tool call results were provided, but the last message in the history was a `ModelRequest` with user parts not tied to preliminary tool results.',
4779
+ match='Tool call results were provided, but the message history does not contain a `ModelResponse`.',
4712
4780
  ):
4713
4781
  await agent.run(
4714
4782
  'Hello again',
@@ -4753,6 +4821,15 @@ async def test_run_with_deferred_tool_results_errors():
4753
4821
  deferred_tool_results=DeferredToolResults(approvals={'create_file': True}),
4754
4822
  )
4755
4823
 
4824
+ with pytest.raises(
4825
+ UserError, match='Cannot provide a new user prompt when the message history contains unprocessed tool calls.'
4826
+ ):
4827
+ await agent.run(
4828
+ 'Hello again',
4829
+ message_history=message_history,
4830
+ deferred_tool_results=DeferredToolResults(approvals={'create_file': True}),
4831
+ )
4832
+
4756
4833
  message_history: list[ModelMessage] = [
4757
4834
  ModelRequest(parts=[UserPromptPart(content='Hello')]),
4758
4835
  ModelResponse(
@@ -4772,7 +4849,6 @@ async def test_run_with_deferred_tool_results_errors():
4772
4849
 
4773
4850
  with pytest.raises(UserError, match="Tool call 'run_me' was already executed and its result cannot be overridden."):
4774
4851
  await agent.run(
4775
- 'Hello again',
4776
4852
  message_history=message_history,
4777
4853
  deferred_tool_results=DeferredToolResults(
4778
4854
  calls={'run_me': 'Failure', 'defer_me': 'Failure'},
@@ -4783,7 +4859,6 @@ async def test_run_with_deferred_tool_results_errors():
4783
4859
  UserError, match="Tool call 'run_me_too' was already executed and its result cannot be overridden."
4784
4860
  ):
4785
4861
  await agent.run(
4786
- 'Hello again',
4787
4862
  message_history=message_history,
4788
4863
  deferred_tool_results=DeferredToolResults(
4789
4864
  calls={'run_me_too': 'Success', 'defer_me': 'Failure'},
@@ -4802,3 +4877,101 @@ def test_tool_requires_approval_error():
4802
4877
  @agent.tool_plain(requires_approval=True)
4803
4878
  def delete_file(path: str) -> None:
4804
4879
  pass
4880
+
4881
+
4882
+ async def test_consecutive_model_responses_in_history():
4883
+ received_messages: list[ModelMessage] | None = None
4884
+
4885
+ def llm(messages: list[ModelMessage], info: AgentInfo) -> ModelResponse:
4886
+ nonlocal received_messages
4887
+ received_messages = messages
4888
+ return ModelResponse(
4889
+ parts=[
4890
+ TextPart('All right then, goodbye!'),
4891
+ ]
4892
+ )
4893
+
4894
+ history: list[ModelMessage] = [
4895
+ ModelRequest(parts=[UserPromptPart(content='Hello...')]),
4896
+ ModelResponse(parts=[TextPart(content='...world!')]),
4897
+ ModelResponse(parts=[TextPart(content='Anything else I can help with?')]),
4898
+ ]
4899
+
4900
+ m = FunctionModel(llm)
4901
+ agent = Agent(m)
4902
+ result = await agent.run('No thanks', message_history=history)
4903
+
4904
+ assert result.all_messages() == snapshot(
4905
+ [
4906
+ ModelRequest(
4907
+ parts=[
4908
+ UserPromptPart(
4909
+ content='Hello...',
4910
+ timestamp=IsDatetime(),
4911
+ )
4912
+ ]
4913
+ ),
4914
+ ModelResponse(
4915
+ parts=[TextPart(content='...world!'), TextPart(content='Anything else I can help with?')],
4916
+ timestamp=IsDatetime(),
4917
+ ),
4918
+ ModelRequest(
4919
+ parts=[
4920
+ UserPromptPart(
4921
+ content='No thanks',
4922
+ timestamp=IsDatetime(),
4923
+ )
4924
+ ]
4925
+ ),
4926
+ ModelResponse(
4927
+ parts=[TextPart(content='All right then, goodbye!')],
4928
+ usage=RequestUsage(input_tokens=54, output_tokens=12),
4929
+ model_name='function:llm:',
4930
+ timestamp=IsDatetime(),
4931
+ ),
4932
+ ]
4933
+ )
4934
+
4935
+ assert result.new_messages() == snapshot(
4936
+ [
4937
+ ModelRequest(
4938
+ parts=[
4939
+ UserPromptPart(
4940
+ content='No thanks',
4941
+ timestamp=IsDatetime(),
4942
+ )
4943
+ ]
4944
+ ),
4945
+ ModelResponse(
4946
+ parts=[TextPart(content='All right then, goodbye!')],
4947
+ usage=RequestUsage(input_tokens=54, output_tokens=12),
4948
+ model_name='function:llm:',
4949
+ timestamp=IsDatetime(),
4950
+ ),
4951
+ ]
4952
+ )
4953
+
4954
+ assert received_messages == snapshot(
4955
+ [
4956
+ ModelRequest(
4957
+ parts=[
4958
+ UserPromptPart(
4959
+ content='Hello...',
4960
+ timestamp=IsDatetime(),
4961
+ )
4962
+ ]
4963
+ ),
4964
+ ModelResponse(
4965
+ parts=[TextPart(content='...world!'), TextPart(content='Anything else I can help with?')],
4966
+ timestamp=IsDatetime(),
4967
+ ),
4968
+ ModelRequest(
4969
+ parts=[
4970
+ UserPromptPart(
4971
+ content='No thanks',
4972
+ timestamp=IsDatetime(),
4973
+ )
4974
+ ]
4975
+ ),
4976
+ ]
4977
+ )
@@ -1,5 +1,5 @@
1
1
  from collections.abc import AsyncIterator
2
- from typing import Any, cast
2
+ from typing import Any
3
3
 
4
4
  import pytest
5
5
  from inline_snapshot import snapshot
@@ -174,8 +174,18 @@ async def test_history_processor_messages_sent_to_provider(
174
174
  )
175
175
  assert received_messages == snapshot(
176
176
  [
177
- ModelRequest(parts=[UserPromptPart(content='Previous question', timestamp=IsDatetime())]),
178
- ModelRequest(parts=[UserPromptPart(content='New question', timestamp=IsDatetime())]),
177
+ ModelRequest(
178
+ parts=[
179
+ UserPromptPart(
180
+ content='Previous question',
181
+ timestamp=IsDatetime(),
182
+ ),
183
+ UserPromptPart(
184
+ content='New question',
185
+ timestamp=IsDatetime(),
186
+ ),
187
+ ]
188
+ )
179
189
  ]
180
190
  )
181
191
 
@@ -244,8 +254,18 @@ async def test_async_history_processor(function_model: FunctionModel, received_m
244
254
  await agent.run('Question 2', message_history=message_history)
245
255
  assert received_messages == snapshot(
246
256
  [
247
- ModelRequest(parts=[UserPromptPart(content='Question 1', timestamp=IsDatetime())]),
248
- ModelRequest(parts=[UserPromptPart(content='Question 2', timestamp=IsDatetime())]),
257
+ ModelRequest(
258
+ parts=[
259
+ UserPromptPart(
260
+ content='Question 1',
261
+ timestamp=IsDatetime(),
262
+ ),
263
+ UserPromptPart(
264
+ content='Question 2',
265
+ timestamp=IsDatetime(),
266
+ ),
267
+ ]
268
+ )
249
269
  ]
250
270
  )
251
271
 
@@ -271,8 +291,18 @@ async def test_history_processor_on_streamed_run(function_model: FunctionModel,
271
291
 
272
292
  assert received_messages == snapshot(
273
293
  [
274
- ModelRequest(parts=[UserPromptPart(content='Question 1', timestamp=IsDatetime())]),
275
- ModelRequest(parts=[UserPromptPart(content='Question 2', timestamp=IsDatetime())]),
294
+ ModelRequest(
295
+ parts=[
296
+ UserPromptPart(
297
+ content='Question 1',
298
+ timestamp=IsDatetime(),
299
+ ),
300
+ UserPromptPart(
301
+ content='Question 2',
302
+ timestamp=IsDatetime(),
303
+ ),
304
+ ]
305
+ )
276
306
  ]
277
307
  )
278
308
 
@@ -367,9 +397,19 @@ async def test_history_processor_mixed_signatures(function_model: FunctionModel,
367
397
  await agent.run('Question 2', message_history=message_history, deps=Deps())
368
398
 
369
399
  # Should have filtered responses and added prefix
370
- assert len(received_messages) == 2
371
- for msg in received_messages:
372
- assert isinstance(msg, ModelRequest)
373
- user_part = msg.parts[0]
374
- assert isinstance(user_part, UserPromptPart)
375
- assert cast(str, user_part.content).startswith('TEST: ')
400
+ assert received_messages == snapshot(
401
+ [
402
+ ModelRequest(
403
+ parts=[
404
+ UserPromptPart(
405
+ content='TEST: Question 1',
406
+ timestamp=IsDatetime(),
407
+ ),
408
+ UserPromptPart(
409
+ content='TEST: Question 2',
410
+ timestamp=IsDatetime(),
411
+ ),
412
+ ]
413
+ )
414
+ ]
415
+ )
@@ -387,6 +387,7 @@ def test_logfire(
387
387
  'strict': None,
388
388
  'sequential': False,
389
389
  'kind': 'function',
390
+ 'metadata': None,
390
391
  }
391
392
  ],
392
393
  'builtin_tools': [],
@@ -780,6 +781,7 @@ def test_instructions_with_structured_output_exclude_content_v2(
780
781
  'strict': None,
781
782
  'sequential': False,
782
783
  'kind': 'output',
784
+ 'metadata': None,
783
785
  }
784
786
  ],
785
787
  'allow_text_output': False,
@@ -1252,6 +1252,22 @@ async def test_tool_returning_multiple_items(allow_model_requests: None, agent:
1252
1252
  )
1253
1253
 
1254
1254
 
1255
+ async def test_tool_metadata_extraction():
1256
+ """Test that MCP tool metadata is properly extracted into ToolDefinition."""
1257
+
1258
+ server = MCPServerStdio('python', ['-m', 'tests.mcp_server'])
1259
+ async with server:
1260
+ ctx = RunContext(deps=None, model=TestModel(), usage=RunUsage())
1261
+ tools = [tool.tool_def for tool in (await server.get_tools(ctx)).values()]
1262
+ # find `celsius_to_fahrenheit`
1263
+ celsius_to_fahrenheit = next(tool for tool in tools if tool.name == 'celsius_to_fahrenheit')
1264
+ assert celsius_to_fahrenheit.metadata is not None
1265
+ assert celsius_to_fahrenheit.metadata.get('annotations') is not None
1266
+ assert celsius_to_fahrenheit.metadata.get('annotations', {}).get('title', None) == 'Celsius to Fahrenheit'
1267
+ assert celsius_to_fahrenheit.metadata.get('output_schema') is not None
1268
+ assert celsius_to_fahrenheit.metadata.get('output_schema', {}).get('type', None) == 'object'
1269
+
1270
+
1255
1271
  async def test_client_sampling(run_context: RunContext[int]):
1256
1272
  server = MCPServerStdio('python', ['-m', 'tests.mcp_server'])
1257
1273
  server.sampling_model = TestModel(custom_output_text='sampling model response')