pydantic-ai 0.7.6__tar.gz → 0.8.0__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 (398) hide show
  1. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/PKG-INFO +3 -3
  2. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/mcp_server.py +20 -5
  3. pydantic_ai-0.8.0/tests/models/cassettes/test_openai_responses/test_openai_responses_usage_without_tokens_details.yaml +96 -0
  4. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/test_openai_responses.py +14 -1
  5. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/test_agent.py +66 -4
  6. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/test_cli.py +41 -0
  7. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/test_mcp.py +43 -4
  8. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/test_streaming.py +6 -13
  9. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/test_temporal.py +13 -7
  10. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/.gitignore +0 -0
  11. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/LICENSE +0 -0
  12. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/Makefile +0 -0
  13. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/README.md +0 -0
  14. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/pyproject.toml +0 -0
  15. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/__init__.py +0 -0
  16. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/assets/dummy.pdf +0 -0
  17. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/assets/kiwi.png +0 -0
  18. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/assets/marcelo.mp3 +0 -0
  19. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/assets/product_name.txt +0 -0
  20. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/assets/small_video.mp4 +0 -0
  21. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/cassettes/test_mcp/test_agent_with_server_not_running.yaml +0 -0
  22. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/cassettes/test_mcp/test_agent_with_stdio_server.yaml +0 -0
  23. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/cassettes/test_mcp/test_tool_returning_audio_resource.yaml +0 -0
  24. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/cassettes/test_mcp/test_tool_returning_audio_resource_link.yaml +0 -0
  25. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/cassettes/test_mcp/test_tool_returning_dict.yaml +0 -0
  26. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/cassettes/test_mcp/test_tool_returning_error.yaml +0 -0
  27. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/cassettes/test_mcp/test_tool_returning_image.yaml +0 -0
  28. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/cassettes/test_mcp/test_tool_returning_image_resource.yaml +0 -0
  29. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/cassettes/test_mcp/test_tool_returning_image_resource_link.yaml +0 -0
  30. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/cassettes/test_mcp/test_tool_returning_multiple_items.yaml +0 -0
  31. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/cassettes/test_mcp/test_tool_returning_none.yaml +0 -0
  32. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/cassettes/test_mcp/test_tool_returning_str.yaml +0 -0
  33. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/cassettes/test_mcp/test_tool_returning_text_resource.yaml +0 -0
  34. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/cassettes/test_mcp/test_tool_returning_text_resource_link.yaml +0 -0
  35. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/cassettes/test_settings/test_stop_settings[anthropic].yaml +0 -0
  36. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/cassettes/test_settings/test_stop_settings[bedrock].yaml +0 -0
  37. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/cassettes/test_settings/test_stop_settings[cohere].yaml +0 -0
  38. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/cassettes/test_settings/test_stop_settings[gemini].yaml +0 -0
  39. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/cassettes/test_settings/test_stop_settings[google].yaml +0 -0
  40. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/cassettes/test_settings/test_stop_settings[groq].yaml +0 -0
  41. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/cassettes/test_settings/test_stop_settings[mistral].yaml +0 -0
  42. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/cassettes/test_settings/test_stop_settings[openai].yaml +0 -0
  43. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/cassettes/test_temporal/test_complex_agent_run.yaml +0 -0
  44. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/cassettes/test_temporal/test_complex_agent_run_in_workflow.yaml +0 -0
  45. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/cassettes/test_temporal/test_complex_agent_run_stream_in_workflow.yaml +0 -0
  46. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/cassettes/test_temporal/test_logfire_plugin.yaml +0 -0
  47. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/cassettes/test_temporal/test_multiple_agents.yaml +0 -0
  48. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/cassettes/test_temporal/test_simple_agent_run_in_workflow.yaml +0 -0
  49. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/cassettes/test_temporal/test_temporal_agent_iter.yaml +0 -0
  50. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/cassettes/test_temporal/test_temporal_agent_override_deps_in_workflow.yaml +0 -0
  51. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/cassettes/test_temporal/test_temporal_agent_run.yaml +0 -0
  52. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/cassettes/test_temporal/test_temporal_agent_run_stream.yaml +0 -0
  53. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/cassettes/test_temporal/test_temporal_agent_run_sync.yaml +0 -0
  54. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/cassettes/test_temporal/test_temporal_agent_sync_tool_activity_disabled.yaml +0 -0
  55. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/cassettes/test_temporal/test_temporal_agent_with_dataclass_deps_as_dict.yaml +0 -0
  56. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/cassettes/test_temporal/test_temporal_agent_with_non_dict_deps.yaml +0 -0
  57. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/cassettes/test_temporal/test_temporal_agent_with_unserializable_deps_type.yaml +0 -0
  58. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/conftest.py +0 -0
  59. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/evals/__init__.py +0 -0
  60. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/evals/test_dataset.py +0 -0
  61. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/evals/test_evaluator_base.py +0 -0
  62. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/evals/test_evaluator_common.py +0 -0
  63. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/evals/test_evaluator_context.py +0 -0
  64. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/evals/test_evaluator_spec.py +0 -0
  65. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/evals/test_evaluators.py +0 -0
  66. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/evals/test_llm_as_a_judge.py +0 -0
  67. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/evals/test_otel.py +0 -0
  68. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/evals/test_render_numbers.py +0 -0
  69. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/evals/test_reporting.py +0 -0
  70. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/evals/test_reports.py +0 -0
  71. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/evals/test_utils.py +0 -0
  72. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/evals/utils.py +0 -0
  73. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/example_modules/README.md +0 -0
  74. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/example_modules/bank_database.py +0 -0
  75. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/example_modules/fake_database.py +0 -0
  76. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/example_modules/mcp_server.py +0 -0
  77. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/example_modules/weather_service.py +0 -0
  78. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/ext/__init__.py +0 -0
  79. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/ext/test_langchain.py +0 -0
  80. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/graph/__init__.py +0 -0
  81. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/graph/test_file_persistence.py +0 -0
  82. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/graph/test_graph.py +0 -0
  83. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/graph/test_mermaid.py +0 -0
  84. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/graph/test_persistence.py +0 -0
  85. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/graph/test_state.py +0 -0
  86. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/graph/test_utils.py +0 -0
  87. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/import_examples.py +0 -0
  88. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/json_body_serializer.py +0 -0
  89. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/__init__.py +0 -0
  90. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/cassettes/test_anthropic/test_anthropic_code_execution_tool.yaml +0 -0
  91. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/cassettes/test_anthropic/test_anthropic_model_empty_message_on_history.yaml +0 -0
  92. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/cassettes/test_anthropic/test_anthropic_model_instructions.yaml +0 -0
  93. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/cassettes/test_anthropic/test_anthropic_model_thinking_part.yaml +0 -0
  94. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/cassettes/test_anthropic/test_anthropic_model_thinking_part_stream.yaml +0 -0
  95. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/cassettes/test_anthropic/test_anthropic_prompted_output.yaml +0 -0
  96. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/cassettes/test_anthropic/test_anthropic_prompted_output_multiple.yaml +0 -0
  97. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/cassettes/test_anthropic/test_anthropic_server_tool_pass_history_to_another_provider.yaml +0 -0
  98. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/cassettes/test_anthropic/test_anthropic_server_tool_receive_history_from_another_provider.yaml +0 -0
  99. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/cassettes/test_anthropic/test_anthropic_text_output_function.yaml +0 -0
  100. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/cassettes/test_anthropic/test_anthropic_tool_output.yaml +0 -0
  101. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/cassettes/test_anthropic/test_anthropic_tool_with_thinking.yaml +0 -0
  102. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/cassettes/test_anthropic/test_anthropic_web_search_tool.yaml +0 -0
  103. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/cassettes/test_anthropic/test_anthropic_web_search_tool_stream.yaml +0 -0
  104. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/cassettes/test_anthropic/test_document_binary_content_input.yaml +0 -0
  105. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/cassettes/test_anthropic/test_document_url_input.yaml +0 -0
  106. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/cassettes/test_anthropic/test_extra_headers.yaml +0 -0
  107. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/cassettes/test_anthropic/test_image_as_binary_content_tool_response.yaml +0 -0
  108. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/cassettes/test_anthropic/test_image_url_input.yaml +0 -0
  109. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/cassettes/test_anthropic/test_image_url_input_invalid_mime_type.yaml +0 -0
  110. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/cassettes/test_anthropic/test_multiple_parallel_tool_calls.yaml +0 -0
  111. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/cassettes/test_anthropic/test_text_document_url_input.yaml +0 -0
  112. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/cassettes/test_bedrock/test_bedrock_anthropic_tool_with_thinking.yaml +0 -0
  113. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/cassettes/test_bedrock/test_bedrock_empty_system_prompt.yaml +0 -0
  114. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/cassettes/test_bedrock/test_bedrock_model.yaml +0 -0
  115. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/cassettes/test_bedrock/test_bedrock_model_anthropic_model_without_tools.yaml +0 -0
  116. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/cassettes/test_bedrock/test_bedrock_model_guardrail_config.yaml +0 -0
  117. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/cassettes/test_bedrock/test_bedrock_model_instructions.yaml +0 -0
  118. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/cassettes/test_bedrock/test_bedrock_model_iter_stream.yaml +0 -0
  119. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/cassettes/test_bedrock/test_bedrock_model_max_tokens.yaml +0 -0
  120. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/cassettes/test_bedrock/test_bedrock_model_other_parameters.yaml +0 -0
  121. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/cassettes/test_bedrock/test_bedrock_model_performance_config.yaml +0 -0
  122. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/cassettes/test_bedrock/test_bedrock_model_retry.yaml +0 -0
  123. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/cassettes/test_bedrock/test_bedrock_model_stream.yaml +0 -0
  124. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/cassettes/test_bedrock/test_bedrock_model_structured_output.yaml +0 -0
  125. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/cassettes/test_bedrock/test_bedrock_model_thinking_part.yaml +0 -0
  126. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/cassettes/test_bedrock/test_bedrock_model_thinking_part_stream.yaml +0 -0
  127. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/cassettes/test_bedrock/test_bedrock_model_top_p.yaml +0 -0
  128. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/cassettes/test_bedrock/test_bedrock_multiple_documents_in_history.yaml +0 -0
  129. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/cassettes/test_bedrock/test_document_url_input.yaml +0 -0
  130. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/cassettes/test_bedrock/test_image_as_binary_content_input.yaml +0 -0
  131. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/cassettes/test_bedrock/test_image_url_input.yaml +0 -0
  132. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/cassettes/test_bedrock/test_text_as_binary_content_input.yaml +0 -0
  133. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/cassettes/test_bedrock/test_text_document_url_input.yaml +0 -0
  134. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/cassettes/test_bedrock/test_video_as_binary_content_input.yaml +0 -0
  135. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/cassettes/test_bedrock/test_video_url_input.yaml +0 -0
  136. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/cassettes/test_cohere/test_cohere_model_instructions.yaml +0 -0
  137. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/cassettes/test_cohere/test_cohere_model_thinking_part.yaml +0 -0
  138. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/cassettes/test_cohere/test_request_simple_success_with_vcr.yaml +0 -0
  139. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/cassettes/test_deepseek/test_deepseek_model_thinking_part.yaml +0 -0
  140. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/cassettes/test_deepseek/test_deepseek_model_thinking_stream.yaml +0 -0
  141. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/cassettes/test_download_item/test_download_item_application_octet_stream.yaml +0 -0
  142. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/cassettes/test_download_item/test_download_item_audio_mpeg.yaml +0 -0
  143. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/cassettes/test_download_item/test_download_item_no_content_type.yaml +0 -0
  144. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/cassettes/test_gemini/test_document_url_input.yaml +0 -0
  145. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/cassettes/test_gemini/test_gemini_additional_properties_is_false.yaml +0 -0
  146. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/cassettes/test_gemini/test_gemini_additional_properties_is_true.yaml +0 -0
  147. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/cassettes/test_gemini/test_gemini_drop_exclusive_maximum.yaml +0 -0
  148. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/cassettes/test_gemini/test_gemini_exclusive_minimum_and_maximum.yaml +0 -0
  149. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/cassettes/test_gemini/test_gemini_model_instructions.yaml +0 -0
  150. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/cassettes/test_gemini/test_gemini_model_thinking_part.yaml +0 -0
  151. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/cassettes/test_gemini/test_gemini_native_output.yaml +0 -0
  152. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/cassettes/test_gemini/test_gemini_native_output_multiple.yaml +0 -0
  153. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/cassettes/test_gemini/test_gemini_prompted_output.yaml +0 -0
  154. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/cassettes/test_gemini/test_gemini_prompted_output_multiple.yaml +0 -0
  155. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/cassettes/test_gemini/test_gemini_prompted_output_with_tools.yaml +0 -0
  156. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/cassettes/test_gemini/test_gemini_text_output_function.yaml +0 -0
  157. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/cassettes/test_gemini/test_gemini_tool_config_any_with_tool_without_args.yaml +0 -0
  158. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/cassettes/test_gemini/test_gemini_tool_output.yaml +0 -0
  159. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/cassettes/test_gemini/test_gemini_youtube_video_url_input.yaml +0 -0
  160. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/cassettes/test_gemini/test_image_as_binary_content_input.yaml +0 -0
  161. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/cassettes/test_gemini/test_image_as_binary_content_tool_response.yaml +0 -0
  162. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/cassettes/test_gemini/test_image_url_input.yaml +0 -0
  163. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/cassettes/test_gemini/test_labels_are_ignored_with_gla_provider.yaml +0 -0
  164. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/cassettes/test_gemini/test_video_as_binary_content_input.yaml +0 -0
  165. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/cassettes/test_gemini/test_video_url_input.yaml +0 -0
  166. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/cassettes/test_gemini_vertex/test_labels.yaml +0 -0
  167. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/cassettes/test_gemini_vertex/test_url_input[AudioUrl (gs)].yaml +0 -0
  168. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/cassettes/test_gemini_vertex/test_url_input[AudioUrl].yaml +0 -0
  169. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/cassettes/test_gemini_vertex/test_url_input[DocumentUrl (gs)].yaml +0 -0
  170. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/cassettes/test_gemini_vertex/test_url_input[DocumentUrl].yaml +0 -0
  171. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/cassettes/test_gemini_vertex/test_url_input[ImageUrl (gs)].yaml +0 -0
  172. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/cassettes/test_gemini_vertex/test_url_input[ImageUrl].yaml +0 -0
  173. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/cassettes/test_gemini_vertex/test_url_input[VideoUrl (YouTube)].yaml +0 -0
  174. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/cassettes/test_gemini_vertex/test_url_input[VideoUrl (gs)].yaml +0 -0
  175. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/cassettes/test_gemini_vertex/test_url_input[VideoUrl].yaml +0 -0
  176. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/cassettes/test_gemini_vertex/test_url_input_force_download.yaml +0 -0
  177. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/cassettes/test_google/test_google_model.yaml +0 -0
  178. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/cassettes/test_google/test_google_model_code_execution_tool.yaml +0 -0
  179. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/cassettes/test_google/test_google_model_document_url_input.yaml +0 -0
  180. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/cassettes/test_google/test_google_model_empty_assistant_response.yaml +0 -0
  181. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/cassettes/test_google/test_google_model_empty_user_prompt.yaml +0 -0
  182. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/cassettes/test_google/test_google_model_image_as_binary_content_input.yaml +0 -0
  183. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/cassettes/test_google/test_google_model_image_url_input.yaml +0 -0
  184. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/cassettes/test_google/test_google_model_instructions.yaml +0 -0
  185. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/cassettes/test_google/test_google_model_iter_stream.yaml +0 -0
  186. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/cassettes/test_google/test_google_model_max_tokens.yaml +0 -0
  187. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/cassettes/test_google/test_google_model_multiple_documents_in_history.yaml +0 -0
  188. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/cassettes/test_google/test_google_model_receive_web_search_history_from_another_provider.yaml +0 -0
  189. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/cassettes/test_google/test_google_model_retry.yaml +0 -0
  190. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/cassettes/test_google/test_google_model_safety_settings.yaml +0 -0
  191. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/cassettes/test_google/test_google_model_server_tool_receive_history_from_another_provider.yaml +0 -0
  192. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/cassettes/test_google/test_google_model_stream.yaml +0 -0
  193. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/cassettes/test_google/test_google_model_structured_output.yaml +0 -0
  194. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/cassettes/test_google/test_google_model_text_as_binary_content_input.yaml +0 -0
  195. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/cassettes/test_google/test_google_model_text_document_url_input.yaml +0 -0
  196. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/cassettes/test_google/test_google_model_thinking_config.yaml +0 -0
  197. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/cassettes/test_google/test_google_model_thinking_part.yaml +0 -0
  198. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/cassettes/test_google/test_google_model_thinking_part_iter.yaml +0 -0
  199. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/cassettes/test_google/test_google_model_top_p.yaml +0 -0
  200. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/cassettes/test_google/test_google_model_url_context_tool.yaml +0 -0
  201. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/cassettes/test_google/test_google_model_usage_limit_exceeded.yaml +0 -0
  202. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/cassettes/test_google/test_google_model_usage_limit_not_exceeded.yaml +0 -0
  203. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/cassettes/test_google/test_google_model_vertex_labels.yaml +0 -0
  204. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/cassettes/test_google/test_google_model_vertex_provider.yaml +0 -0
  205. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/cassettes/test_google/test_google_model_video_as_binary_content_input.yaml +0 -0
  206. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/cassettes/test_google/test_google_model_video_as_binary_content_input_with_vendor_metadata.yaml +0 -0
  207. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/cassettes/test_google/test_google_model_video_url_input.yaml +0 -0
  208. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/cassettes/test_google/test_google_model_web_search_tool.yaml +0 -0
  209. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/cassettes/test_google/test_google_model_youtube_video_url_input_with_vendor_metadata.yaml +0 -0
  210. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/cassettes/test_google/test_google_native_output.yaml +0 -0
  211. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/cassettes/test_google/test_google_native_output_multiple.yaml +0 -0
  212. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/cassettes/test_google/test_google_prompted_output.yaml +0 -0
  213. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/cassettes/test_google/test_google_prompted_output_multiple.yaml +0 -0
  214. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/cassettes/test_google/test_google_prompted_output_with_tools.yaml +0 -0
  215. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/cassettes/test_google/test_google_text_output_function.yaml +0 -0
  216. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/cassettes/test_google/test_google_timeout.yaml +0 -0
  217. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/cassettes/test_google/test_google_tool_config_any_with_tool_without_args.yaml +0 -0
  218. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/cassettes/test_google/test_google_tool_output.yaml +0 -0
  219. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/cassettes/test_google/test_google_url_input[AudioUrl (gs)].yaml +0 -0
  220. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/cassettes/test_google/test_google_url_input[AudioUrl].yaml +0 -0
  221. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/cassettes/test_google/test_google_url_input[DocumentUrl (gs)].yaml +0 -0
  222. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/cassettes/test_google/test_google_url_input[DocumentUrl].yaml +0 -0
  223. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/cassettes/test_google/test_google_url_input[ImageUrl (gs)].yaml +0 -0
  224. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/cassettes/test_google/test_google_url_input[ImageUrl].yaml +0 -0
  225. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/cassettes/test_google/test_google_url_input[VideoUrl (YouTube)].yaml +0 -0
  226. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/cassettes/test_google/test_google_url_input[VideoUrl (gs)].yaml +0 -0
  227. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/cassettes/test_google/test_google_url_input[VideoUrl].yaml +0 -0
  228. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/cassettes/test_google/test_google_url_input_force_download.yaml +0 -0
  229. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/cassettes/test_google/test_google_vertexai_model_usage_limit_exceeded.yaml +0 -0
  230. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/cassettes/test_groq/test_extra_headers.yaml +0 -0
  231. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/cassettes/test_groq/test_groq_model_instructions.yaml +0 -0
  232. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/cassettes/test_groq/test_groq_model_thinking_part.yaml +0 -0
  233. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/cassettes/test_groq/test_groq_model_thinking_part_iter.yaml +0 -0
  234. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/cassettes/test_groq/test_groq_model_web_search_tool.yaml +0 -0
  235. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/cassettes/test_groq/test_image_as_binary_content_input.yaml +0 -0
  236. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/cassettes/test_groq/test_image_as_binary_content_tool_response.yaml +0 -0
  237. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/cassettes/test_groq/test_image_url_input.yaml +0 -0
  238. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/cassettes/test_huggingface/test_hf_model_instructions.yaml +0 -0
  239. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/cassettes/test_huggingface/test_hf_model_thinking_part.yaml +0 -0
  240. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/cassettes/test_huggingface/test_hf_model_thinking_part_iter.yaml +0 -0
  241. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/cassettes/test_huggingface/test_image_as_binary_content_input.yaml +0 -0
  242. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/cassettes/test_huggingface/test_image_url_input.yaml +0 -0
  243. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/cassettes/test_huggingface/test_max_completion_tokens[Qwen-Qwen2.5-72B-Instruct].yaml +0 -0
  244. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/cassettes/test_huggingface/test_max_completion_tokens[deepseek-ai-DeepSeek-R1-0528].yaml +0 -0
  245. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/cassettes/test_huggingface/test_max_completion_tokens[meta-llama-Llama-3.3-70B-Instruct].yaml +0 -0
  246. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/cassettes/test_huggingface/test_request_simple_success_with_vcr.yaml +0 -0
  247. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/cassettes/test_huggingface/test_request_simple_usage.yaml +0 -0
  248. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/cassettes/test_huggingface/test_simple_completion.yaml +0 -0
  249. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/cassettes/test_huggingface/test_stream_completion.yaml +0 -0
  250. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/cassettes/test_mistral/test_image_as_binary_content_tool_response.yaml +0 -0
  251. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/cassettes/test_mistral/test_mistral_model_instructions.yaml +0 -0
  252. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/cassettes/test_mistral/test_mistral_model_thinking_part.yaml +0 -0
  253. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/cassettes/test_model_names/test_known_model_names.yaml +0 -0
  254. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/cassettes/test_openai/test_audio_as_binary_content_input.yaml +0 -0
  255. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/cassettes/test_openai/test_compatible_api_with_tool_calls_without_id.yaml +0 -0
  256. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/cassettes/test_openai/test_document_as_binary_content_input.yaml +0 -0
  257. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/cassettes/test_openai/test_document_as_binary_content_input_with_tool.yaml +0 -0
  258. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/cassettes/test_openai/test_document_url_input.yaml +0 -0
  259. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/cassettes/test_openai/test_extra_headers.yaml +0 -0
  260. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/cassettes/test_openai/test_image_as_binary_content_input.yaml +0 -0
  261. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/cassettes/test_openai/test_image_as_binary_content_tool_response.yaml +0 -0
  262. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/cassettes/test_openai/test_image_url_tool_response.yaml +0 -0
  263. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/cassettes/test_openai/test_invalid_response.yaml +0 -0
  264. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/cassettes/test_openai/test_max_completion_tokens[gpt-4.5-preview].yaml +0 -0
  265. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/cassettes/test_openai/test_max_completion_tokens[gpt-4o-mini].yaml +0 -0
  266. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/cassettes/test_openai/test_max_completion_tokens[o3-mini].yaml +0 -0
  267. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/cassettes/test_openai/test_multiple_agent_tool_calls.yaml +0 -0
  268. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/cassettes/test_openai/test_openai_audio_url_input.yaml +0 -0
  269. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/cassettes/test_openai/test_openai_instructions.yaml +0 -0
  270. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/cassettes/test_openai/test_openai_instructions_with_tool_calls_keep_instructions.yaml +0 -0
  271. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/cassettes/test_openai/test_openai_model_cerebras_provider.yaml +0 -0
  272. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/cassettes/test_openai/test_openai_model_cerebras_provider_harmony.yaml +0 -0
  273. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/cassettes/test_openai/test_openai_model_cerebras_provider_qwen_3_coder.yaml +0 -0
  274. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/cassettes/test_openai/test_openai_model_settings_temperature_ignored_on_gpt_5.yaml +0 -0
  275. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/cassettes/test_openai/test_openai_model_thinking_part.yaml +0 -0
  276. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/cassettes/test_openai/test_openai_model_thinking_part_iter.yaml +0 -0
  277. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/cassettes/test_openai/test_openai_model_without_system_prompt.yaml +0 -0
  278. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/cassettes/test_openai/test_openai_native_output.yaml +0 -0
  279. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/cassettes/test_openai/test_openai_native_output_multiple.yaml +0 -0
  280. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/cassettes/test_openai/test_openai_o1_mini_system_role[developer].yaml +0 -0
  281. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/cassettes/test_openai/test_openai_o1_mini_system_role[system].yaml +0 -0
  282. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/cassettes/test_openai/test_openai_prompted_output.yaml +0 -0
  283. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/cassettes/test_openai/test_openai_prompted_output_multiple.yaml +0 -0
  284. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/cassettes/test_openai/test_openai_responses_model_thinking_part.yaml +0 -0
  285. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/cassettes/test_openai/test_openai_text_output_function.yaml +0 -0
  286. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/cassettes/test_openai/test_openai_tool_output.yaml +0 -0
  287. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/cassettes/test_openai/test_openai_web_search_tool.yaml +0 -0
  288. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/cassettes/test_openai/test_openai_web_search_tool_model_not_supported.yaml +0 -0
  289. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/cassettes/test_openai/test_openai_web_search_tool_with_user_location.yaml +0 -0
  290. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/cassettes/test_openai/test_reasoning_model_with_temperature.yaml +0 -0
  291. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/cassettes/test_openai/test_system_prompt_role_o1_mini.yaml +0 -0
  292. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/cassettes/test_openai/test_text_response.yaml +0 -0
  293. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/cassettes/test_openai/test_user_id.yaml +0 -0
  294. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/cassettes/test_openai/test_valid_response.yaml +0 -0
  295. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/cassettes/test_openai_responses/test_audio_as_binary_content_input.yaml +0 -0
  296. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/cassettes/test_openai_responses/test_image_as_binary_content_input.yaml +0 -0
  297. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/cassettes/test_openai_responses/test_image_as_binary_content_tool_response.yaml +0 -0
  298. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/cassettes/test_openai_responses/test_native_output.yaml +0 -0
  299. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/cassettes/test_openai_responses/test_native_output_multiple.yaml +0 -0
  300. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/cassettes/test_openai_responses/test_openai_responses_code_execution_tool.yaml +0 -0
  301. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/cassettes/test_openai_responses/test_openai_responses_code_execution_tool_stream.yaml +0 -0
  302. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/cassettes/test_openai_responses/test_openai_responses_document_as_binary_content_input.yaml +0 -0
  303. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/cassettes/test_openai_responses/test_openai_responses_document_url_input.yaml +0 -0
  304. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/cassettes/test_openai_responses/test_openai_responses_image_url_input.yaml +0 -0
  305. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/cassettes/test_openai_responses/test_openai_responses_model_builtin_tools.yaml +0 -0
  306. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/cassettes/test_openai_responses/test_openai_responses_model_http_error.yaml +0 -0
  307. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/cassettes/test_openai_responses/test_openai_responses_model_instructions.yaml +0 -0
  308. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/cassettes/test_openai_responses/test_openai_responses_model_retry.yaml +0 -0
  309. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/cassettes/test_openai_responses/test_openai_responses_model_simple_response.yaml +0 -0
  310. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/cassettes/test_openai_responses/test_openai_responses_model_simple_response_with_tool_call.yaml +0 -0
  311. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/cassettes/test_openai_responses/test_openai_responses_model_web_search_tool.yaml +0 -0
  312. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/cassettes/test_openai_responses/test_openai_responses_model_web_search_tool_stream.yaml +0 -0
  313. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/cassettes/test_openai_responses/test_openai_responses_model_web_search_tool_with_invalid_region.yaml +0 -0
  314. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/cassettes/test_openai_responses/test_openai_responses_model_web_search_tool_with_user_location.yaml +0 -0
  315. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/cassettes/test_openai_responses/test_openai_responses_output_type.yaml +0 -0
  316. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/cassettes/test_openai_responses/test_openai_responses_reasoning_effort.yaml +0 -0
  317. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/cassettes/test_openai_responses/test_openai_responses_reasoning_generate_summary.yaml +0 -0
  318. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/cassettes/test_openai_responses/test_openai_responses_stream.yaml +0 -0
  319. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/cassettes/test_openai_responses/test_openai_responses_system_prompt.yaml +0 -0
  320. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/cassettes/test_openai_responses/test_openai_responses_text_document_url_input.yaml +0 -0
  321. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/cassettes/test_openai_responses/test_openai_responses_verbosity.yaml +0 -0
  322. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/cassettes/test_openai_responses/test_prompted_output.yaml +0 -0
  323. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/cassettes/test_openai_responses/test_prompted_output_multiple.yaml +0 -0
  324. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/cassettes/test_openai_responses/test_reasoning_model_with_temperature.yaml +0 -0
  325. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/cassettes/test_openai_responses/test_text_output_function.yaml +0 -0
  326. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/cassettes/test_openai_responses/test_tool_output.yaml +0 -0
  327. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/mock_async_stream.py +0 -0
  328. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/test_anthropic.py +0 -0
  329. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/test_bedrock.py +0 -0
  330. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/test_cohere.py +0 -0
  331. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/test_deepseek.py +0 -0
  332. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/test_download_item.py +0 -0
  333. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/test_fallback.py +0 -0
  334. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/test_gemini.py +0 -0
  335. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/test_gemini_vertex.py +0 -0
  336. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/test_google.py +0 -0
  337. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/test_groq.py +0 -0
  338. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/test_huggingface.py +0 -0
  339. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/test_instrumented.py +0 -0
  340. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/test_mcp_sampling.py +0 -0
  341. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/test_mistral.py +0 -0
  342. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/test_model.py +0 -0
  343. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/test_model_function.py +0 -0
  344. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/test_model_names.py +0 -0
  345. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/test_model_request_parameters.py +0 -0
  346. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/test_model_settings.py +0 -0
  347. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/test_model_test.py +0 -0
  348. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/models/test_openai.py +0 -0
  349. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/parts_from_messages.py +0 -0
  350. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/providers/__init__.py +0 -0
  351. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/providers/cassettes/test_azure/test_azure_provider_call.yaml +0 -0
  352. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/providers/cassettes/test_google_vertex/test_vertexai_provider.yaml +0 -0
  353. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/providers/cassettes/test_heroku/test_heroku_model_provider_claude_3_7_sonnet.yaml +0 -0
  354. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/providers/cassettes/test_openrouter/test_openrouter_with_google_model.yaml +0 -0
  355. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/providers/test_anthropic.py +0 -0
  356. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/providers/test_azure.py +0 -0
  357. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/providers/test_bedrock.py +0 -0
  358. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/providers/test_cerebras.py +0 -0
  359. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/providers/test_cohere.py +0 -0
  360. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/providers/test_deepseek.py +0 -0
  361. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/providers/test_fireworks.py +0 -0
  362. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/providers/test_github.py +0 -0
  363. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/providers/test_google_gla.py +0 -0
  364. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/providers/test_google_vertex.py +0 -0
  365. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/providers/test_grok.py +0 -0
  366. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/providers/test_groq.py +0 -0
  367. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/providers/test_heroku.py +0 -0
  368. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/providers/test_huggingface.py +0 -0
  369. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/providers/test_mistral.py +0 -0
  370. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/providers/test_moonshotai.py +0 -0
  371. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/providers/test_ollama.py +0 -0
  372. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/providers/test_openai.py +0 -0
  373. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/providers/test_openrouter.py +0 -0
  374. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/providers/test_provider_names.py +0 -0
  375. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/providers/test_together.py +0 -0
  376. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/providers/test_vercel.py +0 -0
  377. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/test_a2a.py +0 -0
  378. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/test_ag_ui.py +0 -0
  379. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/test_builtin_tools.py +0 -0
  380. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/test_deps.py +0 -0
  381. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/test_direct.py +0 -0
  382. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/test_examples.py +0 -0
  383. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/test_format_as_xml.py +0 -0
  384. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/test_history_processor.py +0 -0
  385. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/test_json_body_serializer.py +0 -0
  386. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/test_live.py +0 -0
  387. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/test_logfire.py +0 -0
  388. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/test_messages.py +0 -0
  389. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/test_parts_manager.py +0 -0
  390. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/test_settings.py +0 -0
  391. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/test_tenacity.py +0 -0
  392. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/test_thinking_part.py +0 -0
  393. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/test_tools.py +0 -0
  394. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/test_toolsets.py +0 -0
  395. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/test_usage_limits.py +0 -0
  396. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/test_utils.py +0 -0
  397. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/typed_agent.py +0 -0
  398. {pydantic_ai-0.7.6 → pydantic_ai-0.8.0}/tests/typed_graph.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pydantic-ai
3
- Version: 0.7.6
3
+ Version: 0.8.0
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
@@ -28,11 +28,11 @@ Classifier: Topic :: Internet
28
28
  Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
29
29
  Classifier: Topic :: Software Development :: Libraries :: Python Modules
30
30
  Requires-Python: >=3.9
31
- Requires-Dist: pydantic-ai-slim[ag-ui,anthropic,bedrock,cli,cohere,evals,google,groq,huggingface,mcp,mistral,openai,retries,temporal,vertexai]==0.7.6
31
+ Requires-Dist: pydantic-ai-slim[ag-ui,anthropic,bedrock,cli,cohere,evals,google,groq,huggingface,mcp,mistral,openai,retries,temporal,vertexai]==0.8.0
32
32
  Provides-Extra: a2a
33
33
  Requires-Dist: fasta2a>=0.4.1; extra == 'a2a'
34
34
  Provides-Extra: examples
35
- Requires-Dist: pydantic-ai-examples==0.7.6; extra == 'examples'
35
+ Requires-Dist: pydantic-ai-examples==0.8.0; extra == 'examples'
36
36
  Provides-Extra: logfire
37
37
  Requires-Dist: logfire>=3.14.1; extra == 'logfire'
38
38
  Description-Content-Type: text/markdown
@@ -3,8 +3,7 @@ from pathlib import Path
3
3
  from typing import Any
4
4
 
5
5
  from mcp.server.fastmcp import Context, FastMCP, Image
6
- from mcp.server.session import ServerSessionT
7
- from mcp.shared.context import LifespanContextT, RequestT
6
+ from mcp.server.session import ServerSession
8
7
  from mcp.types import (
9
8
  BlobResourceContents,
10
9
  EmbeddedResource,
@@ -13,7 +12,7 @@ from mcp.types import (
13
12
  TextContent,
14
13
  TextResourceContents,
15
14
  )
16
- from pydantic import AnyUrl
15
+ from pydantic import AnyUrl, BaseModel
17
16
 
18
17
  mcp = FastMCP('Pydantic AI MCP Server')
19
18
  log_level = 'unset'
@@ -170,7 +169,7 @@ async def get_log_level(ctx: Context) -> str: # type: ignore
170
169
 
171
170
 
172
171
  @mcp.tool()
173
- async def echo_deps(ctx: Context[ServerSessionT, LifespanContextT, RequestT]) -> dict[str, Any]:
172
+ async def echo_deps(ctx: Context[ServerSession, None]) -> dict[str, Any]:
174
173
  """Echo the run context.
175
174
 
176
175
  Args:
@@ -186,7 +185,7 @@ async def echo_deps(ctx: Context[ServerSessionT, LifespanContextT, RequestT]) ->
186
185
 
187
186
 
188
187
  @mcp.tool()
189
- async def use_sampling(ctx: Context, foo: str) -> str: # type: ignore
188
+ async def use_sampling(ctx: Context[ServerSession, None], foo: str) -> str:
190
189
  """Use sampling callback."""
191
190
 
192
191
  result = await ctx.session.create_message(
@@ -202,6 +201,22 @@ async def use_sampling(ctx: Context, foo: str) -> str: # type: ignore
202
201
  return result.model_dump_json(indent=2)
203
202
 
204
203
 
204
+ class UserResponse(BaseModel):
205
+ response: str
206
+
207
+
208
+ @mcp.tool()
209
+ async def use_elicitation(ctx: Context[ServerSession, None], question: str) -> str:
210
+ """Use elicitation callback to ask the user a question."""
211
+
212
+ result = await ctx.elicit(message=question, schema=UserResponse)
213
+
214
+ if result.action == 'accept' and result.data:
215
+ return f'User responded: {result.data.response}'
216
+ else:
217
+ return f'User {result.action}ed the elicitation'
218
+
219
+
205
220
  @mcp._mcp_server.set_logging_level() # pyright: ignore[reportPrivateUsage]
206
221
  async def set_logging_level(level: str) -> None:
207
222
  global log_level
@@ -0,0 +1,96 @@
1
+ interactions:
2
+ - request:
3
+ headers:
4
+ accept:
5
+ - application/json
6
+ accept-encoding:
7
+ - gzip, deflate
8
+ connection:
9
+ - keep-alive
10
+ content-length:
11
+ - '84'
12
+ content-type:
13
+ - application/json
14
+ host:
15
+ - api.openai.com
16
+ method: POST
17
+ parsed_body:
18
+ input:
19
+ - content: What is 2+2?
20
+ role: user
21
+ model: gpt-4o
22
+ stream: false
23
+ uri: https://api.openai.com/v1/responses
24
+ response:
25
+ headers:
26
+ alt-svc:
27
+ - h3=":443"; ma=86400
28
+ connection:
29
+ - keep-alive
30
+ content-length:
31
+ - '1369'
32
+ content-type:
33
+ - application/json
34
+ openai-organization:
35
+ - pydantic-28gund
36
+ openai-processing-ms:
37
+ - '899'
38
+ openai-project:
39
+ - proj_dKobscVY9YJxeEaDJen54e3d
40
+ openai-version:
41
+ - '2020-10-01'
42
+ strict-transport-security:
43
+ - max-age=31536000; includeSubDomains; preload
44
+ transfer-encoding:
45
+ - chunked
46
+ parsed_body:
47
+ background: false
48
+ created_at: 1756246493
49
+ error: null
50
+ id: resp_68ae31dd0edc819da9e77ad3cdb128770306cb62070aed80
51
+ incomplete_details: null
52
+ instructions: null
53
+ max_output_tokens: null
54
+ max_tool_calls: null
55
+ metadata: {}
56
+ model: gpt-4o-2024-08-06
57
+ object: response
58
+ output:
59
+ - content:
60
+ - annotations: []
61
+ logprobs: []
62
+ text: 2 + 2 equals 4.
63
+ type: output_text
64
+ id: msg_68ae31ddcef0819da13eb00d2b393eb60306cb62070aed80
65
+ role: assistant
66
+ status: completed
67
+ type: message
68
+ parallel_tool_calls: true
69
+ previous_response_id: null
70
+ prompt_cache_key: null
71
+ reasoning:
72
+ effort: null
73
+ summary: null
74
+ safety_identifier: null
75
+ service_tier: default
76
+ status: completed
77
+ store: true
78
+ temperature: 1.0
79
+ text:
80
+ format:
81
+ type: text
82
+ verbosity: medium
83
+ tool_choice: auto
84
+ tools: []
85
+ top_logprobs: 0
86
+ top_p: 1.0
87
+ truncation: disabled
88
+ usage:
89
+ input_tokens: 14
90
+ output_tokens: 9
91
+ total_tokens: 23
92
+ user: null
93
+ status:
94
+ code: 200
95
+ message: OK
96
+ version: 1
@@ -29,7 +29,7 @@ from pydantic_ai.messages import (
29
29
  from pydantic_ai.output import NativeOutput, PromptedOutput, TextOutput, ToolOutput
30
30
  from pydantic_ai.profiles.openai import openai_model_profile
31
31
  from pydantic_ai.tools import ToolDefinition
32
- from pydantic_ai.usage import RequestUsage
32
+ from pydantic_ai.usage import RequestUsage, RunUsage
33
33
 
34
34
  from ..conftest import IsDatetime, IsStr, TestEnv, try_import
35
35
  from ..parts_from_messages import part_types_from_messages
@@ -1076,3 +1076,16 @@ async def test_openai_responses_verbosity(allow_model_requests: None, openai_api
1076
1076
  agent = Agent(model=model, model_settings=OpenAIResponsesModelSettings(openai_text_verbosity='low'))
1077
1077
  result = await agent.run('What is 2+2?')
1078
1078
  assert result.output == snapshot('4')
1079
+
1080
+
1081
+ async def test_openai_responses_usage_without_tokens_details(allow_model_requests: None, openai_api_key: str):
1082
+ # The VCR cassette was manually modified to remove the input_tokens_details and output_tokens_details fields.
1083
+ provider = OpenAIProvider(api_key=openai_api_key)
1084
+ model = OpenAIResponsesModel('gpt-4o', provider=provider)
1085
+
1086
+ agent = Agent(model=model)
1087
+ result = await agent.run('What is 2+2?')
1088
+
1089
+ assert result.usage() == snapshot(
1090
+ RunUsage(input_tokens=14, output_tokens=9, details={'reasoning_tokens': 0}, requests=1)
1091
+ )
@@ -29,7 +29,6 @@ from pydantic_ai.agent import AgentRunResult, WrapperAgent
29
29
  from pydantic_ai.messages import (
30
30
  AgentStreamEvent,
31
31
  BinaryContent,
32
- HandleResponseEvent,
33
32
  ImageUrl,
34
33
  ModelMessage,
35
34
  ModelMessagesTypeAdapter,
@@ -3076,6 +3075,65 @@ def test_binary_content_serializable():
3076
3075
  assert messages == result.all_messages()
3077
3076
 
3078
3077
 
3078
+ def test_image_url_serializable_missing_media_type():
3079
+ agent = Agent('test')
3080
+ content = ImageUrl('https://example.com/chart.jpeg')
3081
+ result = agent.run_sync(['Hello', content])
3082
+ serialized = result.all_messages_json()
3083
+ assert json.loads(serialized) == snapshot(
3084
+ [
3085
+ {
3086
+ 'parts': [
3087
+ {
3088
+ 'content': [
3089
+ 'Hello',
3090
+ {
3091
+ 'url': 'https://example.com/chart.jpeg',
3092
+ 'force_download': False,
3093
+ 'vendor_metadata': None,
3094
+ 'kind': 'image-url',
3095
+ 'media_type': 'image/jpeg',
3096
+ },
3097
+ ],
3098
+ 'timestamp': IsStr(),
3099
+ 'part_kind': 'user-prompt',
3100
+ }
3101
+ ],
3102
+ 'instructions': None,
3103
+ 'kind': 'request',
3104
+ },
3105
+ {
3106
+ 'parts': [{'content': 'success (no tool calls)', 'part_kind': 'text'}],
3107
+ 'usage': {
3108
+ 'input_tokens': 51,
3109
+ 'cache_write_tokens': 0,
3110
+ 'cache_read_tokens': 0,
3111
+ 'output_tokens': 4,
3112
+ 'input_audio_tokens': 0,
3113
+ 'cache_audio_read_tokens': 0,
3114
+ 'output_audio_tokens': 0,
3115
+ 'details': {},
3116
+ },
3117
+ 'model_name': 'test',
3118
+ 'timestamp': IsStr(),
3119
+ 'provider_name': None,
3120
+ 'provider_details': None,
3121
+ 'provider_request_id': None,
3122
+ 'kind': 'response',
3123
+ },
3124
+ ]
3125
+ )
3126
+
3127
+ # We also need to be able to round trip the serialized messages.
3128
+ messages = ModelMessagesTypeAdapter.validate_json(serialized)
3129
+ part = messages[0].parts[0]
3130
+ assert isinstance(part, UserPromptPart)
3131
+ content = part.content[1]
3132
+ assert isinstance(content, ImageUrl)
3133
+ assert content.media_type == 'image/jpeg'
3134
+ assert messages == result.all_messages()
3135
+
3136
+
3079
3137
  def test_image_url_serializable():
3080
3138
  agent = Agent('test')
3081
3139
 
@@ -3095,6 +3153,7 @@ def test_image_url_serializable():
3095
3153
  'force_download': False,
3096
3154
  'vendor_metadata': None,
3097
3155
  'kind': 'image-url',
3156
+ 'media_type': 'image/jpeg',
3098
3157
  },
3099
3158
  ],
3100
3159
  'timestamp': IsStr(),
@@ -3128,6 +3187,11 @@ def test_image_url_serializable():
3128
3187
 
3129
3188
  # We also need to be able to round trip the serialized messages.
3130
3189
  messages = ModelMessagesTypeAdapter.validate_json(serialized)
3190
+ part = messages[0].parts[0]
3191
+ assert isinstance(part, UserPromptPart)
3192
+ content = part.content[1]
3193
+ assert isinstance(content, ImageUrl)
3194
+ assert content.media_type == 'image/jpeg'
3131
3195
  assert messages == result.all_messages()
3132
3196
 
3133
3197
 
@@ -4155,9 +4219,7 @@ def test_toolsets():
4155
4219
 
4156
4220
 
4157
4221
  async def test_wrapper_agent():
4158
- async def event_stream_handler(
4159
- ctx: RunContext[None], events: AsyncIterable[Union[AgentStreamEvent, HandleResponseEvent]]
4160
- ):
4222
+ async def event_stream_handler(ctx: RunContext[None], events: AsyncIterable[AgentStreamEvent]):
4161
4223
  pass # pragma: no cover
4162
4224
 
4163
4225
  foo_toolset = FunctionToolset()
@@ -292,6 +292,7 @@ def test_agent_to_cli_sync(mocker: MockerFixture, env: TestEnv):
292
292
  code_theme='monokai',
293
293
  prog_name='pydantic-ai',
294
294
  deps=None,
295
+ message_history=None,
295
296
  )
296
297
 
297
298
 
@@ -307,4 +308,44 @@ async def test_agent_to_cli_async(mocker: MockerFixture, env: TestEnv):
307
308
  code_theme='monokai',
308
309
  prog_name='pydantic-ai',
309
310
  deps=None,
311
+ message_history=None,
312
+ )
313
+
314
+
315
+ @pytest.mark.anyio
316
+ async def test_agent_to_cli_with_message_history(mocker: MockerFixture, env: TestEnv):
317
+ env.set('OPENAI_API_KEY', 'test')
318
+ mock_run_chat = mocker.patch('pydantic_ai._cli.run_chat')
319
+
320
+ # Create some test message history - cast to the proper base type
321
+ test_messages: list[ModelMessage] = [ModelResponse(parts=[TextPart('Hello!')])]
322
+
323
+ await cli_agent.to_cli(message_history=test_messages)
324
+ mock_run_chat.assert_awaited_once_with(
325
+ stream=True,
326
+ agent=IsInstance(Agent),
327
+ console=IsInstance(Console),
328
+ code_theme='monokai',
329
+ prog_name='pydantic-ai',
330
+ deps=None,
331
+ message_history=test_messages,
332
+ )
333
+
334
+
335
+ def test_agent_to_cli_sync_with_message_history(mocker: MockerFixture, env: TestEnv):
336
+ env.set('OPENAI_API_KEY', 'test')
337
+ mock_run_chat = mocker.patch('pydantic_ai._cli.run_chat')
338
+
339
+ # Create some test message history - cast to the proper base type
340
+ test_messages: list[ModelMessage] = [ModelResponse(parts=[TextPart('Hello!')])]
341
+
342
+ cli_agent.to_cli_sync(message_history=test_messages)
343
+ mock_run_chat.assert_awaited_once_with(
344
+ stream=True,
345
+ agent=IsInstance(Agent),
346
+ console=IsInstance(Console),
347
+ code_theme='monokai',
348
+ prog_name='pydantic-ai',
349
+ deps=None,
350
+ message_history=test_messages,
310
351
  )
@@ -34,7 +34,9 @@ from .conftest import IsDatetime, IsNow, IsStr, try_import
34
34
 
35
35
  with try_import() as imports_successful:
36
36
  from mcp import ErrorData, McpError, SamplingMessage
37
- from mcp.types import CreateMessageRequestParams, ImageContent, TextContent
37
+ from mcp.client.session import ClientSession
38
+ from mcp.shared.context import RequestContext
39
+ from mcp.types import CreateMessageRequestParams, ElicitRequestParams, ElicitResult, ImageContent, TextContent
38
40
 
39
41
  from pydantic_ai._mcp import map_from_mcp_params, map_from_model_response
40
42
  from pydantic_ai.mcp import CallToolFunc, MCPServerSSE, MCPServerStdio, ToolResult
@@ -74,7 +76,7 @@ async def test_stdio_server(run_context: RunContext[int]):
74
76
  server = MCPServerStdio('python', ['-m', 'tests.mcp_server'])
75
77
  async with server:
76
78
  tools = [tool.tool_def for tool in (await server.get_tools(run_context)).values()]
77
- assert len(tools) == snapshot(16)
79
+ assert len(tools) == snapshot(17)
78
80
  assert tools[0].name == 'celsius_to_fahrenheit'
79
81
  assert isinstance(tools[0].description, str)
80
82
  assert tools[0].description.startswith('Convert Celsius to Fahrenheit.')
@@ -122,7 +124,7 @@ async def test_stdio_server_with_cwd(run_context: RunContext[int]):
122
124
  server = MCPServerStdio('python', ['mcp_server.py'], cwd=test_dir)
123
125
  async with server:
124
126
  tools = await server.get_tools(run_context)
125
- assert len(tools) == snapshot(16)
127
+ assert len(tools) == snapshot(17)
126
128
 
127
129
 
128
130
  async def test_process_tool_call(run_context: RunContext[int]) -> int:
@@ -291,7 +293,7 @@ async def test_log_level_unset(run_context: RunContext[int]):
291
293
  assert server.log_level is None
292
294
  async with server:
293
295
  tools = [tool.tool_def for tool in (await server.get_tools(run_context)).values()]
294
- assert len(tools) == snapshot(16)
296
+ assert len(tools) == snapshot(17)
295
297
  assert tools[13].name == 'get_log_level'
296
298
 
297
299
  result = await server.direct_call_tool('get_log_level', {})
@@ -1260,3 +1262,40 @@ def test_map_from_mcp_params_model_response():
1260
1262
  def test_map_from_model_response():
1261
1263
  with pytest.raises(UnexpectedModelBehavior, match='Unexpected part type: ThinkingPart, expected TextPart'):
1262
1264
  map_from_model_response(ModelResponse(parts=[ThinkingPart(content='Thinking...')]))
1265
+
1266
+
1267
+ async def test_elicitation_callback_functionality(run_context: RunContext[int]):
1268
+ """Test that elicitation callback is actually called and works."""
1269
+ # Track callback execution
1270
+ callback_called = False
1271
+ callback_message = None
1272
+ callback_response = 'Yes, proceed with the action'
1273
+
1274
+ async def mock_elicitation_callback(
1275
+ context: RequestContext[ClientSession, Any, Any], params: ElicitRequestParams
1276
+ ) -> ElicitResult:
1277
+ nonlocal callback_called, callback_message
1278
+ callback_called = True
1279
+ callback_message = params.message
1280
+ return ElicitResult(action='accept', content={'response': callback_response})
1281
+
1282
+ server = MCPServerStdio('python', ['-m', 'tests.mcp_server'], elicitation_callback=mock_elicitation_callback)
1283
+
1284
+ async with server:
1285
+ # Call the tool that uses elicitation
1286
+ result = await server.direct_call_tool('use_elicitation', {'question': 'Should I continue?'})
1287
+
1288
+ # Verify the callback was called
1289
+ assert callback_called, 'Elicitation callback should have been called'
1290
+ assert callback_message == 'Should I continue?', 'Callback should receive the question'
1291
+ assert result == f'User responded: {callback_response}', 'Tool should return the callback response'
1292
+
1293
+
1294
+ async def test_elicitation_callback_not_set(run_context: RunContext[int]):
1295
+ """Test that elicitation fails when no callback is set."""
1296
+ server = MCPServerStdio('python', ['-m', 'tests.mcp_server'])
1297
+
1298
+ async with server:
1299
+ # Should raise an error when elicitation is attempted without callback
1300
+ with pytest.raises(ModelRetry, match='Elicitation not supported'):
1301
+ await server.direct_call_tool('use_elicitation', {'question': 'Should I continue?'})
@@ -20,7 +20,6 @@ from pydantic_ai.messages import (
20
20
  FinalResultEvent,
21
21
  FunctionToolCallEvent,
22
22
  FunctionToolResultEvent,
23
- HandleResponseEvent,
24
23
  ModelMessage,
25
24
  ModelRequest,
26
25
  ModelResponse,
@@ -1271,11 +1270,9 @@ async def test_run_event_stream_handler():
1271
1270
  async def ret_a(x: str) -> str:
1272
1271
  return f'{x}-apple'
1273
1272
 
1274
- events: list[AgentStreamEvent | HandleResponseEvent] = []
1273
+ events: list[AgentStreamEvent] = []
1275
1274
 
1276
- async def event_stream_handler(
1277
- ctx: RunContext[None], stream: AsyncIterable[AgentStreamEvent | HandleResponseEvent]
1278
- ):
1275
+ async def event_stream_handler(ctx: RunContext[None], stream: AsyncIterable[AgentStreamEvent]):
1279
1276
  async for event in stream:
1280
1277
  events.append(event)
1281
1278
 
@@ -1314,11 +1311,9 @@ def test_run_sync_event_stream_handler():
1314
1311
  async def ret_a(x: str) -> str:
1315
1312
  return f'{x}-apple'
1316
1313
 
1317
- events: list[AgentStreamEvent | HandleResponseEvent] = []
1314
+ events: list[AgentStreamEvent] = []
1318
1315
 
1319
- async def event_stream_handler(
1320
- ctx: RunContext[None], stream: AsyncIterable[AgentStreamEvent | HandleResponseEvent]
1321
- ):
1316
+ async def event_stream_handler(ctx: RunContext[None], stream: AsyncIterable[AgentStreamEvent]):
1322
1317
  async for event in stream:
1323
1318
  events.append(event)
1324
1319
 
@@ -1357,11 +1352,9 @@ async def test_run_stream_event_stream_handler():
1357
1352
  async def ret_a(x: str) -> str:
1358
1353
  return f'{x}-apple'
1359
1354
 
1360
- events: list[AgentStreamEvent | HandleResponseEvent] = []
1355
+ events: list[AgentStreamEvent] = []
1361
1356
 
1362
- async def event_stream_handler(
1363
- ctx: RunContext[None], stream: AsyncIterable[AgentStreamEvent | HandleResponseEvent]
1364
- ):
1357
+ async def event_stream_handler(ctx: RunContext[None], stream: AsyncIterable[AgentStreamEvent]):
1365
1358
  async for event in stream:
1366
1359
  events.append(event)
1367
1360
 
@@ -19,7 +19,6 @@ from pydantic_ai.messages import (
19
19
  FinalResultEvent,
20
20
  FunctionToolCallEvent,
21
21
  FunctionToolResultEvent,
22
- HandleResponseEvent,
23
22
  ModelMessage,
24
23
  ModelRequest,
25
24
  PartDeltaEvent,
@@ -196,7 +195,7 @@ class Deps(BaseModel):
196
195
 
197
196
  async def event_stream_handler(
198
197
  ctx: RunContext[Deps],
199
- stream: AsyncIterable[AgentStreamEvent | HandleResponseEvent],
198
+ stream: AsyncIterable[AgentStreamEvent],
200
199
  ):
201
200
  logfire.info(f'{ctx.run_step=}')
202
201
  async for event in stream:
@@ -207,8 +206,15 @@ async def get_country(ctx: RunContext[Deps]) -> str:
207
206
  return ctx.deps.country
208
207
 
209
208
 
210
- def get_weather(city: str) -> str:
211
- return 'sunny'
209
+ class WeatherArgs(BaseModel):
210
+ city: str
211
+
212
+
213
+ def get_weather(args: WeatherArgs) -> str:
214
+ if args.city == 'Mexico City':
215
+ return 'sunny'
216
+ else:
217
+ return 'unknown' # pragma: no cover
212
218
 
213
219
 
214
220
  @dataclass
@@ -629,11 +635,11 @@ async def test_complex_agent_run_in_workflow(
629
635
 
630
636
 
631
637
  async def test_complex_agent_run(allow_model_requests: None):
632
- events: list[AgentStreamEvent | HandleResponseEvent] = []
638
+ events: list[AgentStreamEvent] = []
633
639
 
634
640
  async def event_stream_handler(
635
641
  ctx: RunContext[Deps],
636
- stream: AsyncIterable[AgentStreamEvent | HandleResponseEvent],
642
+ stream: AsyncIterable[AgentStreamEvent],
637
643
  ):
638
644
  async for event in stream:
639
645
  events.append(event)
@@ -1154,7 +1160,7 @@ async def test_temporal_agent_iter_in_workflow(allow_model_requests: None, clien
1154
1160
 
1155
1161
  async def simple_event_stream_handler(
1156
1162
  ctx: RunContext[None],
1157
- stream: AsyncIterable[AgentStreamEvent | HandleResponseEvent],
1163
+ stream: AsyncIterable[AgentStreamEvent],
1158
1164
  ):
1159
1165
  pass
1160
1166
 
File without changes
File without changes
File without changes
File without changes
File without changes