pydantic-ai 0.4.4__tar.gz → 0.4.6__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.
Files changed (337) hide show
  1. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/.gitignore +0 -1
  2. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/PKG-INFO +3 -3
  3. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/evals/test_dataset.py +132 -1
  4. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/evals/test_llm_as_a_judge.py +189 -7
  5. pydantic_ai-0.4.6/tests/models/cassettes/test_download_item/test_download_item_audio_mpeg.yaml +487 -0
  6. pydantic_ai-0.4.6/tests/models/cassettes/test_openai/test_invalid_response.yaml +51 -0
  7. pydantic_ai-0.4.6/tests/models/cassettes/test_openai/test_text_response.yaml +49 -0
  8. pydantic_ai-0.4.6/tests/models/cassettes/test_openai/test_valid_response.yaml +79 -0
  9. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/models/test_download_item.py +10 -0
  10. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/models/test_mistral.py +87 -3
  11. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/models/test_openai.py +41 -1
  12. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/test_examples.py +1 -1
  13. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/test_format_as_xml.py +23 -25
  14. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/test_logfire.py +0 -3
  15. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/test_messages.py +1 -8
  16. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/test_tools.py +20 -0
  17. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/LICENSE +0 -0
  18. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/Makefile +0 -0
  19. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/README.md +0 -0
  20. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/pyproject.toml +0 -0
  21. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/__init__.py +0 -0
  22. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/assets/dummy.pdf +0 -0
  23. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/assets/kiwi.png +0 -0
  24. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/assets/marcelo.mp3 +0 -0
  25. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/assets/small_video.mp4 +0 -0
  26. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/cassettes/test_mcp/test_agent_with_server_not_running.yaml +0 -0
  27. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/cassettes/test_mcp/test_agent_with_stdio_server.yaml +0 -0
  28. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/cassettes/test_mcp/test_tool_returning_audio_resource.yaml +0 -0
  29. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/cassettes/test_mcp/test_tool_returning_dict.yaml +0 -0
  30. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/cassettes/test_mcp/test_tool_returning_error.yaml +0 -0
  31. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/cassettes/test_mcp/test_tool_returning_image.yaml +0 -0
  32. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/cassettes/test_mcp/test_tool_returning_image_resource.yaml +0 -0
  33. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/cassettes/test_mcp/test_tool_returning_multiple_items.yaml +0 -0
  34. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/cassettes/test_mcp/test_tool_returning_none.yaml +0 -0
  35. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/cassettes/test_mcp/test_tool_returning_str.yaml +0 -0
  36. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/cassettes/test_mcp/test_tool_returning_text_resource.yaml +0 -0
  37. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/cassettes/test_settings/test_stop_settings[anthropic].yaml +0 -0
  38. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/cassettes/test_settings/test_stop_settings[bedrock].yaml +0 -0
  39. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/cassettes/test_settings/test_stop_settings[cohere].yaml +0 -0
  40. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/cassettes/test_settings/test_stop_settings[gemini].yaml +0 -0
  41. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/cassettes/test_settings/test_stop_settings[google].yaml +0 -0
  42. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/cassettes/test_settings/test_stop_settings[groq].yaml +0 -0
  43. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/cassettes/test_settings/test_stop_settings[mistral].yaml +0 -0
  44. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/cassettes/test_settings/test_stop_settings[openai].yaml +0 -0
  45. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/conftest.py +0 -0
  46. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/evals/__init__.py +0 -0
  47. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/evals/test_evaluator_base.py +0 -0
  48. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/evals/test_evaluator_common.py +0 -0
  49. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/evals/test_evaluator_context.py +0 -0
  50. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/evals/test_evaluator_spec.py +0 -0
  51. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/evals/test_evaluators.py +0 -0
  52. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/evals/test_otel.py +0 -0
  53. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/evals/test_render_numbers.py +0 -0
  54. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/evals/test_reporting.py +0 -0
  55. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/evals/test_reports.py +0 -0
  56. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/evals/test_utils.py +0 -0
  57. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/evals/utils.py +0 -0
  58. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/example_modules/README.md +0 -0
  59. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/example_modules/bank_database.py +0 -0
  60. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/example_modules/fake_database.py +0 -0
  61. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/example_modules/mcp_server.py +0 -0
  62. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/example_modules/weather_service.py +0 -0
  63. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/ext/__init__.py +0 -0
  64. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/ext/test_langchain.py +0 -0
  65. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/graph/__init__.py +0 -0
  66. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/graph/test_file_persistence.py +0 -0
  67. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/graph/test_graph.py +0 -0
  68. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/graph/test_mermaid.py +0 -0
  69. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/graph/test_persistence.py +0 -0
  70. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/graph/test_state.py +0 -0
  71. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/graph/test_utils.py +0 -0
  72. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/import_examples.py +0 -0
  73. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/json_body_serializer.py +0 -0
  74. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/mcp_server.py +0 -0
  75. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/models/__init__.py +0 -0
  76. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/models/cassettes/test_anthropic/test_anthropic_model_empty_message_on_history.yaml +0 -0
  77. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/models/cassettes/test_anthropic/test_anthropic_model_instructions.yaml +0 -0
  78. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/models/cassettes/test_anthropic/test_anthropic_model_thinking_part.yaml +0 -0
  79. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/models/cassettes/test_anthropic/test_anthropic_model_thinking_part_stream.yaml +0 -0
  80. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/models/cassettes/test_anthropic/test_anthropic_prompted_output.yaml +0 -0
  81. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/models/cassettes/test_anthropic/test_anthropic_prompted_output_multiple.yaml +0 -0
  82. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/models/cassettes/test_anthropic/test_anthropic_text_output_function.yaml +0 -0
  83. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/models/cassettes/test_anthropic/test_anthropic_tool_output.yaml +0 -0
  84. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/models/cassettes/test_anthropic/test_anthropic_tool_with_thinking.yaml +0 -0
  85. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/models/cassettes/test_anthropic/test_document_binary_content_input.yaml +0 -0
  86. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/models/cassettes/test_anthropic/test_document_url_input.yaml +0 -0
  87. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/models/cassettes/test_anthropic/test_extra_headers.yaml +0 -0
  88. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/models/cassettes/test_anthropic/test_image_as_binary_content_tool_response.yaml +0 -0
  89. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/models/cassettes/test_anthropic/test_image_url_input.yaml +0 -0
  90. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/models/cassettes/test_anthropic/test_image_url_input_invalid_mime_type.yaml +0 -0
  91. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/models/cassettes/test_anthropic/test_multiple_parallel_tool_calls.yaml +0 -0
  92. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/models/cassettes/test_anthropic/test_text_document_url_input.yaml +0 -0
  93. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/models/cassettes/test_bedrock/test_bedrock_empty_system_prompt.yaml +0 -0
  94. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/models/cassettes/test_bedrock/test_bedrock_model.yaml +0 -0
  95. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/models/cassettes/test_bedrock/test_bedrock_model_anthropic_model_without_tools.yaml +0 -0
  96. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/models/cassettes/test_bedrock/test_bedrock_model_guardrail_config.yaml +0 -0
  97. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/models/cassettes/test_bedrock/test_bedrock_model_instructions.yaml +0 -0
  98. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/models/cassettes/test_bedrock/test_bedrock_model_iter_stream.yaml +0 -0
  99. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/models/cassettes/test_bedrock/test_bedrock_model_max_tokens.yaml +0 -0
  100. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/models/cassettes/test_bedrock/test_bedrock_model_other_parameters.yaml +0 -0
  101. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/models/cassettes/test_bedrock/test_bedrock_model_performance_config.yaml +0 -0
  102. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/models/cassettes/test_bedrock/test_bedrock_model_retry.yaml +0 -0
  103. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/models/cassettes/test_bedrock/test_bedrock_model_stream.yaml +0 -0
  104. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/models/cassettes/test_bedrock/test_bedrock_model_structured_output.yaml +0 -0
  105. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/models/cassettes/test_bedrock/test_bedrock_model_thinking_part.yaml +0 -0
  106. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/models/cassettes/test_bedrock/test_bedrock_model_thinking_part_stream.yaml +0 -0
  107. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/models/cassettes/test_bedrock/test_bedrock_model_top_p.yaml +0 -0
  108. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/models/cassettes/test_bedrock/test_bedrock_multiple_documents_in_history.yaml +0 -0
  109. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/models/cassettes/test_bedrock/test_document_url_input.yaml +0 -0
  110. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/models/cassettes/test_bedrock/test_image_as_binary_content_input.yaml +0 -0
  111. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/models/cassettes/test_bedrock/test_image_url_input.yaml +0 -0
  112. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/models/cassettes/test_bedrock/test_text_as_binary_content_input.yaml +0 -0
  113. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/models/cassettes/test_bedrock/test_text_document_url_input.yaml +0 -0
  114. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/models/cassettes/test_bedrock/test_video_as_binary_content_input.yaml +0 -0
  115. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/models/cassettes/test_bedrock/test_video_url_input.yaml +0 -0
  116. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/models/cassettes/test_cohere/test_cohere_model_instructions.yaml +0 -0
  117. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/models/cassettes/test_cohere/test_cohere_model_thinking_part.yaml +0 -0
  118. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/models/cassettes/test_cohere/test_request_simple_success_with_vcr.yaml +0 -0
  119. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/models/cassettes/test_deepseek/test_deepseek_model_thinking_part.yaml +0 -0
  120. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/models/cassettes/test_deepseek/test_deepseek_model_thinking_stream.yaml +0 -0
  121. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/models/cassettes/test_download_item/test_download_item_application_octet_stream.yaml +0 -0
  122. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/models/cassettes/test_download_item/test_download_item_no_content_type.yaml +0 -0
  123. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/models/cassettes/test_gemini/test_document_url_input.yaml +0 -0
  124. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/models/cassettes/test_gemini/test_gemini_additional_properties_is_false.yaml +0 -0
  125. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/models/cassettes/test_gemini/test_gemini_additional_properties_is_true.yaml +0 -0
  126. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/models/cassettes/test_gemini/test_gemini_drop_exclusive_maximum.yaml +0 -0
  127. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/models/cassettes/test_gemini/test_gemini_exclusive_minimum_and_maximum.yaml +0 -0
  128. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/models/cassettes/test_gemini/test_gemini_model_instructions.yaml +0 -0
  129. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/models/cassettes/test_gemini/test_gemini_model_thinking_part.yaml +0 -0
  130. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/models/cassettes/test_gemini/test_gemini_native_output.yaml +0 -0
  131. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/models/cassettes/test_gemini/test_gemini_native_output_multiple.yaml +0 -0
  132. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/models/cassettes/test_gemini/test_gemini_prompted_output.yaml +0 -0
  133. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/models/cassettes/test_gemini/test_gemini_prompted_output_multiple.yaml +0 -0
  134. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/models/cassettes/test_gemini/test_gemini_prompted_output_with_tools.yaml +0 -0
  135. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/models/cassettes/test_gemini/test_gemini_text_output_function.yaml +0 -0
  136. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/models/cassettes/test_gemini/test_gemini_tool_config_any_with_tool_without_args.yaml +0 -0
  137. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/models/cassettes/test_gemini/test_gemini_tool_output.yaml +0 -0
  138. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/models/cassettes/test_gemini/test_gemini_youtube_video_url_input.yaml +0 -0
  139. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/models/cassettes/test_gemini/test_image_as_binary_content_input.yaml +0 -0
  140. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/models/cassettes/test_gemini/test_image_as_binary_content_tool_response.yaml +0 -0
  141. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/models/cassettes/test_gemini/test_image_url_input.yaml +0 -0
  142. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/models/cassettes/test_gemini/test_labels_are_ignored_with_gla_provider.yaml +0 -0
  143. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/models/cassettes/test_gemini/test_video_as_binary_content_input.yaml +0 -0
  144. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/models/cassettes/test_gemini/test_video_url_input.yaml +0 -0
  145. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/models/cassettes/test_gemini_vertex/test_labels.yaml +0 -0
  146. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/models/cassettes/test_gemini_vertex/test_url_input[AudioUrl (gs)].yaml +0 -0
  147. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/models/cassettes/test_gemini_vertex/test_url_input[AudioUrl].yaml +0 -0
  148. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/models/cassettes/test_gemini_vertex/test_url_input[DocumentUrl (gs)].yaml +0 -0
  149. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/models/cassettes/test_gemini_vertex/test_url_input[DocumentUrl].yaml +0 -0
  150. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/models/cassettes/test_gemini_vertex/test_url_input[ImageUrl (gs)].yaml +0 -0
  151. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/models/cassettes/test_gemini_vertex/test_url_input[ImageUrl].yaml +0 -0
  152. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/models/cassettes/test_gemini_vertex/test_url_input[VideoUrl (YouTube)].yaml +0 -0
  153. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/models/cassettes/test_gemini_vertex/test_url_input[VideoUrl (gs)].yaml +0 -0
  154. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/models/cassettes/test_gemini_vertex/test_url_input[VideoUrl].yaml +0 -0
  155. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/models/cassettes/test_gemini_vertex/test_url_input_force_download.yaml +0 -0
  156. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/models/cassettes/test_google/test_google_model.yaml +0 -0
  157. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/models/cassettes/test_google/test_google_model_document_url_input.yaml +0 -0
  158. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/models/cassettes/test_google/test_google_model_empty_assistant_response.yaml +0 -0
  159. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/models/cassettes/test_google/test_google_model_empty_user_prompt.yaml +0 -0
  160. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/models/cassettes/test_google/test_google_model_image_as_binary_content_input.yaml +0 -0
  161. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/models/cassettes/test_google/test_google_model_image_url_input.yaml +0 -0
  162. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/models/cassettes/test_google/test_google_model_instructions.yaml +0 -0
  163. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/models/cassettes/test_google/test_google_model_iter_stream.yaml +0 -0
  164. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/models/cassettes/test_google/test_google_model_max_tokens.yaml +0 -0
  165. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/models/cassettes/test_google/test_google_model_multiple_documents_in_history.yaml +0 -0
  166. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/models/cassettes/test_google/test_google_model_retry.yaml +0 -0
  167. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/models/cassettes/test_google/test_google_model_safety_settings.yaml +0 -0
  168. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/models/cassettes/test_google/test_google_model_stream.yaml +0 -0
  169. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/models/cassettes/test_google/test_google_model_structured_output.yaml +0 -0
  170. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/models/cassettes/test_google/test_google_model_text_as_binary_content_input.yaml +0 -0
  171. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/models/cassettes/test_google/test_google_model_text_document_url_input.yaml +0 -0
  172. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/models/cassettes/test_google/test_google_model_thinking_config.yaml +0 -0
  173. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/models/cassettes/test_google/test_google_model_thinking_part.yaml +0 -0
  174. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/models/cassettes/test_google/test_google_model_thinking_part_iter.yaml +0 -0
  175. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/models/cassettes/test_google/test_google_model_top_p.yaml +0 -0
  176. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/models/cassettes/test_google/test_google_model_vertex_labels.yaml +0 -0
  177. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/models/cassettes/test_google/test_google_model_vertex_provider.yaml +0 -0
  178. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/models/cassettes/test_google/test_google_model_video_as_binary_content_input.yaml +0 -0
  179. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/models/cassettes/test_google/test_google_model_video_as_binary_content_input_with_vendor_metadata.yaml +0 -0
  180. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/models/cassettes/test_google/test_google_model_video_url_input.yaml +0 -0
  181. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/models/cassettes/test_google/test_google_model_youtube_video_url_input_with_vendor_metadata.yaml +0 -0
  182. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/models/cassettes/test_google/test_google_native_output.yaml +0 -0
  183. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/models/cassettes/test_google/test_google_native_output_multiple.yaml +0 -0
  184. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/models/cassettes/test_google/test_google_prompted_output.yaml +0 -0
  185. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/models/cassettes/test_google/test_google_prompted_output_multiple.yaml +0 -0
  186. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/models/cassettes/test_google/test_google_prompted_output_with_tools.yaml +0 -0
  187. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/models/cassettes/test_google/test_google_text_output_function.yaml +0 -0
  188. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/models/cassettes/test_google/test_google_timeout.yaml +0 -0
  189. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/models/cassettes/test_google/test_google_tool_config_any_with_tool_without_args.yaml +0 -0
  190. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/models/cassettes/test_google/test_google_tool_output.yaml +0 -0
  191. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/models/cassettes/test_google/test_google_url_input[AudioUrl (gs)].yaml +0 -0
  192. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/models/cassettes/test_google/test_google_url_input[AudioUrl].yaml +0 -0
  193. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/models/cassettes/test_google/test_google_url_input[DocumentUrl (gs)].yaml +0 -0
  194. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/models/cassettes/test_google/test_google_url_input[DocumentUrl].yaml +0 -0
  195. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/models/cassettes/test_google/test_google_url_input[ImageUrl (gs)].yaml +0 -0
  196. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/models/cassettes/test_google/test_google_url_input[ImageUrl].yaml +0 -0
  197. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/models/cassettes/test_google/test_google_url_input[VideoUrl (YouTube)].yaml +0 -0
  198. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/models/cassettes/test_google/test_google_url_input[VideoUrl (gs)].yaml +0 -0
  199. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/models/cassettes/test_google/test_google_url_input[VideoUrl].yaml +0 -0
  200. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/models/cassettes/test_google/test_google_url_input_force_download.yaml +0 -0
  201. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/models/cassettes/test_groq/test_extra_headers.yaml +0 -0
  202. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/models/cassettes/test_groq/test_groq_model_instructions.yaml +0 -0
  203. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/models/cassettes/test_groq/test_groq_model_thinking_part.yaml +0 -0
  204. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/models/cassettes/test_groq/test_image_as_binary_content_input.yaml +0 -0
  205. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/models/cassettes/test_groq/test_image_as_binary_content_tool_response.yaml +0 -0
  206. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/models/cassettes/test_groq/test_image_url_input.yaml +0 -0
  207. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/models/cassettes/test_huggingface/test_hf_model_instructions.yaml +0 -0
  208. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/models/cassettes/test_huggingface/test_hf_model_thinking_part.yaml +0 -0
  209. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/models/cassettes/test_huggingface/test_image_as_binary_content_input.yaml +0 -0
  210. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/models/cassettes/test_huggingface/test_image_url_input.yaml +0 -0
  211. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/models/cassettes/test_huggingface/test_max_completion_tokens[Qwen-Qwen2.5-72B-Instruct].yaml +0 -0
  212. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/models/cassettes/test_huggingface/test_max_completion_tokens[deepseek-ai-DeepSeek-R1-0528].yaml +0 -0
  213. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/models/cassettes/test_huggingface/test_max_completion_tokens[meta-llama-Llama-3.3-70B-Instruct].yaml +0 -0
  214. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/models/cassettes/test_huggingface/test_request_simple_success_with_vcr.yaml +0 -0
  215. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/models/cassettes/test_huggingface/test_request_simple_usage.yaml +0 -0
  216. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/models/cassettes/test_huggingface/test_simple_completion.yaml +0 -0
  217. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/models/cassettes/test_huggingface/test_stream_completion.yaml +0 -0
  218. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/models/cassettes/test_mistral/test_image_as_binary_content_tool_response.yaml +0 -0
  219. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/models/cassettes/test_mistral/test_mistral_model_instructions.yaml +0 -0
  220. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/models/cassettes/test_mistral/test_mistral_model_thinking_part.yaml +0 -0
  221. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/models/cassettes/test_model_names/test_known_model_names.yaml +0 -0
  222. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/models/cassettes/test_openai/test_audio_as_binary_content_input.yaml +0 -0
  223. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/models/cassettes/test_openai/test_compatible_api_with_tool_calls_without_id.yaml +0 -0
  224. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/models/cassettes/test_openai/test_document_as_binary_content_input.yaml +0 -0
  225. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/models/cassettes/test_openai/test_document_url_input.yaml +0 -0
  226. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/models/cassettes/test_openai/test_extra_headers.yaml +0 -0
  227. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/models/cassettes/test_openai/test_image_as_binary_content_input.yaml +0 -0
  228. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/models/cassettes/test_openai/test_image_as_binary_content_tool_response.yaml +0 -0
  229. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/models/cassettes/test_openai/test_image_url_tool_response.yaml +0 -0
  230. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/models/cassettes/test_openai/test_max_completion_tokens[gpt-4.5-preview].yaml +0 -0
  231. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/models/cassettes/test_openai/test_max_completion_tokens[gpt-4o-mini].yaml +0 -0
  232. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/models/cassettes/test_openai/test_max_completion_tokens[o3-mini].yaml +0 -0
  233. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/models/cassettes/test_openai/test_multiple_agent_tool_calls.yaml +0 -0
  234. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/models/cassettes/test_openai/test_openai_audio_url_input.yaml +0 -0
  235. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/models/cassettes/test_openai/test_openai_instructions.yaml +0 -0
  236. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/models/cassettes/test_openai/test_openai_instructions_with_tool_calls_keep_instructions.yaml +0 -0
  237. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/models/cassettes/test_openai/test_openai_model_thinking_part.yaml +0 -0
  238. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/models/cassettes/test_openai/test_openai_model_thinking_part_iter.yaml +0 -0
  239. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/models/cassettes/test_openai/test_openai_model_without_system_prompt.yaml +0 -0
  240. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/models/cassettes/test_openai/test_openai_native_output.yaml +0 -0
  241. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/models/cassettes/test_openai/test_openai_native_output_multiple.yaml +0 -0
  242. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/models/cassettes/test_openai/test_openai_o1_mini_system_role[developer].yaml +0 -0
  243. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/models/cassettes/test_openai/test_openai_o1_mini_system_role[system].yaml +0 -0
  244. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/models/cassettes/test_openai/test_openai_prompted_output.yaml +0 -0
  245. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/models/cassettes/test_openai/test_openai_prompted_output_multiple.yaml +0 -0
  246. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/models/cassettes/test_openai/test_openai_responses_model_thinking_part.yaml +0 -0
  247. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/models/cassettes/test_openai/test_openai_text_output_function.yaml +0 -0
  248. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/models/cassettes/test_openai/test_openai_tool_output.yaml +0 -0
  249. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/models/cassettes/test_openai/test_reasoning_model_with_temperature.yaml +0 -0
  250. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/models/cassettes/test_openai/test_user_id.yaml +0 -0
  251. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/models/cassettes/test_openai_responses/test_audio_as_binary_content_input.yaml +0 -0
  252. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/models/cassettes/test_openai_responses/test_image_as_binary_content_input.yaml +0 -0
  253. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/models/cassettes/test_openai_responses/test_image_as_binary_content_tool_response.yaml +0 -0
  254. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/models/cassettes/test_openai_responses/test_native_output.yaml +0 -0
  255. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/models/cassettes/test_openai_responses/test_native_output_multiple.yaml +0 -0
  256. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/models/cassettes/test_openai_responses/test_openai_responses_document_as_binary_content_input.yaml +0 -0
  257. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/models/cassettes/test_openai_responses/test_openai_responses_document_url_input.yaml +0 -0
  258. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/models/cassettes/test_openai_responses/test_openai_responses_image_url_input.yaml +0 -0
  259. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/models/cassettes/test_openai_responses/test_openai_responses_model_builtin_tools.yaml +0 -0
  260. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/models/cassettes/test_openai_responses/test_openai_responses_model_http_error.yaml +0 -0
  261. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/models/cassettes/test_openai_responses/test_openai_responses_model_instructions.yaml +0 -0
  262. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/models/cassettes/test_openai_responses/test_openai_responses_model_retry.yaml +0 -0
  263. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/models/cassettes/test_openai_responses/test_openai_responses_model_simple_response.yaml +0 -0
  264. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/models/cassettes/test_openai_responses/test_openai_responses_model_simple_response_with_tool_call.yaml +0 -0
  265. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/models/cassettes/test_openai_responses/test_openai_responses_output_type.yaml +0 -0
  266. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/models/cassettes/test_openai_responses/test_openai_responses_reasoning_effort.yaml +0 -0
  267. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/models/cassettes/test_openai_responses/test_openai_responses_reasoning_generate_summary.yaml +0 -0
  268. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/models/cassettes/test_openai_responses/test_openai_responses_stream.yaml +0 -0
  269. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/models/cassettes/test_openai_responses/test_openai_responses_system_prompt.yaml +0 -0
  270. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/models/cassettes/test_openai_responses/test_openai_responses_text_document_url_input.yaml +0 -0
  271. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/models/cassettes/test_openai_responses/test_prompted_output.yaml +0 -0
  272. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/models/cassettes/test_openai_responses/test_prompted_output_multiple.yaml +0 -0
  273. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/models/cassettes/test_openai_responses/test_reasoning_model_with_temperature.yaml +0 -0
  274. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/models/cassettes/test_openai_responses/test_text_output_function.yaml +0 -0
  275. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/models/cassettes/test_openai_responses/test_tool_output.yaml +0 -0
  276. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/models/mock_async_stream.py +0 -0
  277. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/models/test_anthropic.py +0 -0
  278. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/models/test_bedrock.py +0 -0
  279. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/models/test_cohere.py +0 -0
  280. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/models/test_deepseek.py +0 -0
  281. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/models/test_fallback.py +0 -0
  282. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/models/test_gemini.py +0 -0
  283. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/models/test_gemini_vertex.py +0 -0
  284. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/models/test_google.py +0 -0
  285. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/models/test_groq.py +0 -0
  286. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/models/test_huggingface.py +0 -0
  287. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/models/test_instrumented.py +0 -0
  288. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/models/test_mcp_sampling.py +0 -0
  289. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/models/test_model.py +0 -0
  290. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/models/test_model_function.py +0 -0
  291. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/models/test_model_names.py +0 -0
  292. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/models/test_model_request_parameters.py +0 -0
  293. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/models/test_model_settings.py +0 -0
  294. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/models/test_model_test.py +0 -0
  295. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/models/test_openai_responses.py +0 -0
  296. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/providers/__init__.py +0 -0
  297. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/providers/cassettes/test_azure/test_azure_provider_call.yaml +0 -0
  298. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/providers/cassettes/test_google_vertex/test_vertexai_provider.yaml +0 -0
  299. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/providers/cassettes/test_heroku/test_heroku_model_provider_claude_3_7_sonnet.yaml +0 -0
  300. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/providers/cassettes/test_openrouter/test_openrouter_with_google_model.yaml +0 -0
  301. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/providers/test_anthropic.py +0 -0
  302. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/providers/test_azure.py +0 -0
  303. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/providers/test_bedrock.py +0 -0
  304. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/providers/test_cohere.py +0 -0
  305. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/providers/test_deepseek.py +0 -0
  306. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/providers/test_fireworks.py +0 -0
  307. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/providers/test_github.py +0 -0
  308. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/providers/test_google_gla.py +0 -0
  309. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/providers/test_google_vertex.py +0 -0
  310. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/providers/test_grok.py +0 -0
  311. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/providers/test_groq.py +0 -0
  312. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/providers/test_heroku.py +0 -0
  313. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/providers/test_huggingface.py +0 -0
  314. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/providers/test_mistral.py +0 -0
  315. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/providers/test_openai.py +0 -0
  316. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/providers/test_openrouter.py +0 -0
  317. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/providers/test_provider_names.py +0 -0
  318. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/providers/test_together.py +0 -0
  319. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/test_a2a.py +0 -0
  320. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/test_ag_ui.py +0 -0
  321. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/test_agent.py +0 -0
  322. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/test_cli.py +0 -0
  323. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/test_deps.py +0 -0
  324. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/test_direct.py +0 -0
  325. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/test_history_processor.py +0 -0
  326. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/test_json_body_serializer.py +0 -0
  327. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/test_live.py +0 -0
  328. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/test_mcp.py +0 -0
  329. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/test_parts_manager.py +0 -0
  330. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/test_settings.py +0 -0
  331. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/test_streaming.py +0 -0
  332. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/test_thinking_part.py +0 -0
  333. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/test_toolsets.py +0 -0
  334. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/test_usage_limits.py +0 -0
  335. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/test_utils.py +0 -0
  336. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/typed_agent.py +0 -0
  337. {pydantic_ai-0.4.4 → pydantic_ai-0.4.6}/tests/typed_graph.py +0 -0
@@ -15,7 +15,6 @@ examples/pydantic_ai_examples/.chat_app_messages.sqlite
15
15
  .vscode/
16
16
  /question_graph_history.json
17
17
  /docs-site/.wrangler/
18
- /CLAUDE.md
19
18
  node_modules/
20
19
  **.idea/
21
20
  .coverage*
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pydantic-ai
3
- Version: 0.4.4
3
+ Version: 0.4.6
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,vertexai]==0.4.4
31
+ Requires-Dist: pydantic-ai-slim[ag-ui,anthropic,bedrock,cli,cohere,evals,google,groq,huggingface,mcp,mistral,openai,vertexai]==0.4.6
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.4.4; extra == 'examples'
35
+ Requires-Dist: pydantic-ai-examples==0.4.6; extra == 'examples'
36
36
  Provides-Extra: logfire
37
37
  Requires-Dist: logfire>=3.11.0; extra == 'logfire'
38
38
  Description-Content-Type: text/markdown
@@ -11,7 +11,7 @@ from dirty_equals import HasRepr, IsNumber
11
11
  from inline_snapshot import snapshot
12
12
  from pydantic import BaseModel
13
13
 
14
- from ..conftest import try_import
14
+ from ..conftest import IsStr, try_import
15
15
  from .utils import render_table
16
16
 
17
17
  with try_import() as imports_successful:
@@ -1086,3 +1086,134 @@ def test_evaluate_non_serializable_inputs():
1086
1086
  │ Averages │ │ 1.0s │
1087
1087
  └──────────┴────────────────────────────────────────────────────────────────────────────────────┴──────────┘
1088
1088
  """)
1089
+
1090
+
1091
+ async def test_evaluate_async_logfire(
1092
+ example_dataset: Dataset[TaskInput, TaskOutput, TaskMetadata],
1093
+ simple_evaluator: type[Evaluator[TaskInput, TaskOutput, TaskMetadata]],
1094
+ capfire: CaptureLogfire,
1095
+ ):
1096
+ """Test evaluating a dataset."""
1097
+ example_dataset.add_evaluator(simple_evaluator())
1098
+
1099
+ async def mock_async_task(inputs: TaskInput) -> TaskOutput:
1100
+ if inputs.query == 'What is 2+2?':
1101
+ return TaskOutput(answer='4')
1102
+ elif inputs.query == 'What is the capital of France?':
1103
+ return TaskOutput(answer='Paris')
1104
+ return TaskOutput(answer='Unknown') # pragma: no cover
1105
+
1106
+ await example_dataset.evaluate(mock_async_task)
1107
+
1108
+ spans = capfire.exporter.exported_spans_as_dict()
1109
+ spans.sort(key=lambda s: s['start_time'])
1110
+ assert spans == [
1111
+ {
1112
+ 'attributes': {
1113
+ 'averages': '{"name":"Averages","scores":{"confidence":1.0},"labels":{},"metrics":{},"assertions":1.0,"task_duration":1.0,"total_duration":5.0}',
1114
+ 'cases': '[{"name":"case1","inputs":{"query":"What is '
1115
+ '2+2?"},"metadata":{"difficulty":"easy","category":"general"},"expected_output":{"answer":"4","confidence":1.0},"output":{"answer":"4","confidence":1.0},"metrics":{},"attributes":{},"scores":{"confidence":{"name":"confidence","value":1.0,"reason":null,"source":{"name":"SimpleEvaluator","arguments":null}}},"labels":{},"assertions":{"correct":{"name":"correct","value":true,"reason":null,"source":{"name":"SimpleEvaluator","arguments":null}}},"task_duration":1.0,"total_duration":6.0,"trace_id":"00000000000000000000000000000001","span_id":"0000000000000003"},{"name":"case2","inputs":{"query":"What '
1116
+ 'is the capital of '
1117
+ 'France?"},"metadata":{"difficulty":"medium","category":"geography"},"expected_output":{"answer":"Paris","confidence":1.0},"output":{"answer":"Paris","confidence":1.0},"metrics":{},"attributes":{},"scores":{"confidence":{"name":"confidence","value":1.0,"reason":null,"source":{"name":"SimpleEvaluator","arguments":null}}},"labels":{},"assertions":{"correct":{"name":"correct","value":true,"reason":null,"source":{"name":"SimpleEvaluator","arguments":null}}},"task_duration":1.0,"total_duration":4.0,"trace_id":"00000000000000000000000000000001","span_id":"0000000000000007"}]',
1118
+ 'code.filepath': 'test_dataset.py',
1119
+ 'code.function': 'test_evaluate_async_logfire',
1120
+ 'code.lineno': 123,
1121
+ 'logfire.json_schema': '{"type":"object","properties":{"name":{},"cases":{"type":"array"},"averages":{"type":"object"}}}',
1122
+ 'logfire.msg': 'evaluate mock_async_task',
1123
+ 'logfire.msg_template': 'evaluate {name}',
1124
+ 'logfire.span_type': 'span',
1125
+ 'name': 'mock_async_task',
1126
+ },
1127
+ 'context': {'is_remote': False, 'span_id': 1, 'trace_id': 1},
1128
+ 'end_time': 10000000000,
1129
+ 'name': 'evaluate {name}',
1130
+ 'parent': None,
1131
+ 'start_time': 1000000000,
1132
+ },
1133
+ {
1134
+ 'attributes': {
1135
+ 'assertions': '{"correct":{"name":"correct","value":true,"reason":null,"source":{"name":"SimpleEvaluator","arguments":null}}}',
1136
+ 'attributes': '{}',
1137
+ 'case_name': 'case1',
1138
+ 'code.filepath': IsStr(),
1139
+ 'code.lineno': 123,
1140
+ 'expected_output': '{"answer":"4","confidence":1.0}',
1141
+ 'inputs': '{"query":"What is 2+2?"}',
1142
+ 'labels': '{}',
1143
+ 'logfire.json_schema': '{"type":"object","properties":{"task_name":{},"case_name":{},"inputs":{"type":"object","title":"TaskInput","x-python-datatype":"PydanticModel"},"metadata":{"type":"object","title":"TaskMetadata","x-python-datatype":"PydanticModel"},"expected_output":{"type":"object","title":"TaskOutput","x-python-datatype":"PydanticModel"},"output":{"type":"object","title":"TaskOutput","x-python-datatype":"PydanticModel"},"task_duration":{},"metrics":{"type":"object"},"attributes":{"type":"object"},"assertions":{"type":"object"},"scores":{"type":"object"},"labels":{"type":"object"}}}',
1144
+ 'logfire.msg': 'case: case1',
1145
+ 'logfire.msg_template': 'case: {case_name}',
1146
+ 'logfire.span_type': 'span',
1147
+ 'metadata': '{"difficulty":"easy","category":"general"}',
1148
+ 'metrics': '{}',
1149
+ 'output': '{"answer":"4","confidence":1.0}',
1150
+ 'scores': '{"confidence":{"name":"confidence","value":1.0,"reason":null,"source":{"name":"SimpleEvaluator","arguments":null}}}',
1151
+ 'task_duration': 1.0,
1152
+ 'task_name': 'mock_async_task',
1153
+ },
1154
+ 'context': {'is_remote': False, 'span_id': 3, 'trace_id': 1},
1155
+ 'end_time': 8000000000,
1156
+ 'name': 'case: {case_name}',
1157
+ 'parent': {'is_remote': False, 'span_id': 1, 'trace_id': 1},
1158
+ 'start_time': 2000000000,
1159
+ },
1160
+ {
1161
+ 'attributes': {
1162
+ 'code.filepath': IsStr(),
1163
+ 'code.lineno': 123,
1164
+ 'logfire.json_schema': '{"type":"object","properties":{"task":{}}}',
1165
+ 'logfire.msg': 'execute mock_async_task',
1166
+ 'logfire.msg_template': 'execute {task}',
1167
+ 'logfire.span_type': 'span',
1168
+ 'task': 'mock_async_task',
1169
+ },
1170
+ 'context': {'is_remote': False, 'span_id': 5, 'trace_id': 1},
1171
+ 'end_time': 4000000000,
1172
+ 'name': 'execute {task}',
1173
+ 'parent': {'is_remote': False, 'span_id': 3, 'trace_id': 1},
1174
+ 'start_time': 3000000000,
1175
+ },
1176
+ {
1177
+ 'attributes': {
1178
+ 'assertions': '{"correct":{"name":"correct","value":true,"reason":null,"source":{"name":"SimpleEvaluator","arguments":null}}}',
1179
+ 'attributes': '{}',
1180
+ 'case_name': 'case2',
1181
+ 'code.filepath': IsStr(),
1182
+ 'code.lineno': 123,
1183
+ 'expected_output': '{"answer":"Paris","confidence":1.0}',
1184
+ 'inputs': '{"query":"What is the capital of France?"}',
1185
+ 'labels': '{}',
1186
+ 'logfire.json_schema': '{"type":"object","properties":{"task_name":{},"case_name":{},"inputs":{"type":"object","title":"TaskInput","x-python-datatype":"PydanticModel"},"metadata":{"type":"object","title":"TaskMetadata","x-python-datatype":"PydanticModel"},"expected_output":{"type":"object","title":"TaskOutput","x-python-datatype":"PydanticModel"},"output":{"type":"object","title":"TaskOutput","x-python-datatype":"PydanticModel"},"task_duration":{},"metrics":{"type":"object"},"attributes":{"type":"object"},"assertions":{"type":"object"},"scores":{"type":"object"},"labels":{"type":"object"}}}',
1187
+ 'logfire.msg': 'case: case2',
1188
+ 'logfire.msg_template': 'case: {case_name}',
1189
+ 'logfire.span_type': 'span',
1190
+ 'metadata': '{"difficulty":"medium","category":"geography"}',
1191
+ 'metrics': '{}',
1192
+ 'output': '{"answer":"Paris","confidence":1.0}',
1193
+ 'scores': '{"confidence":{"name":"confidence","value":1.0,"reason":null,"source":{"name":"SimpleEvaluator","arguments":null}}}',
1194
+ 'task_duration': 1.0,
1195
+ 'task_name': 'mock_async_task',
1196
+ },
1197
+ 'context': {'is_remote': False, 'span_id': 7, 'trace_id': 1},
1198
+ 'end_time': 9000000000,
1199
+ 'name': 'case: {case_name}',
1200
+ 'parent': {'is_remote': False, 'span_id': 1, 'trace_id': 1},
1201
+ 'start_time': 5000000000,
1202
+ },
1203
+ {
1204
+ 'attributes': {
1205
+ 'code.filepath': IsStr(),
1206
+ 'code.lineno': 123,
1207
+ 'logfire.json_schema': '{"type":"object","properties":{"task":{}}}',
1208
+ 'logfire.msg': 'execute mock_async_task',
1209
+ 'logfire.msg_template': 'execute {task}',
1210
+ 'logfire.span_type': 'span',
1211
+ 'task': 'mock_async_task',
1212
+ },
1213
+ 'context': {'is_remote': False, 'span_id': 9, 'trace_id': 1},
1214
+ 'end_time': 7000000000,
1215
+ 'name': 'execute {task}',
1216
+ 'parent': {'is_remote': False, 'span_id': 7, 'trace_id': 1},
1217
+ 'start_time': 6000000000,
1218
+ },
1219
+ ]
@@ -1,9 +1,10 @@
1
1
  from __future__ import annotations as _annotations
2
2
 
3
3
  import pytest
4
+ from inline_snapshot import snapshot
4
5
  from pytest_mock import MockerFixture
5
6
 
6
- from ..conftest import try_import
7
+ from ..conftest import BinaryContent, try_import
7
8
 
8
9
  with try_import() as imports_successful:
9
10
  from pydantic_ai.settings import ModelSettings
@@ -141,6 +142,54 @@ async def test_judge_input_output_mock(mocker: MockerFixture):
141
142
  assert '<Rubric>\nOutput contains input\n</Rubric>' in call_args[0]
142
143
 
143
144
 
145
+ async def test_judge_input_output_binary_content_list_mock(mocker: MockerFixture, image_content: BinaryContent):
146
+ """Test judge_input_output function with mocked agent."""
147
+ # Mock the agent run method
148
+ mock_result = mocker.MagicMock()
149
+ mock_result.output = GradingOutput(reason='Test passed', pass_=True, score=1.0)
150
+ mock_run = mocker.patch('pydantic_ai.Agent.run', return_value=mock_result)
151
+
152
+ result = await judge_input_output([image_content, image_content], 'Hello world', 'Output contains input')
153
+ assert isinstance(result, GradingOutput)
154
+ assert result.reason == 'Test passed'
155
+ assert result.pass_ is True
156
+ assert result.score == 1.0
157
+
158
+ # Verify the agent was called with correct prompt
159
+ mock_run.assert_called_once()
160
+ raw_prompt = mock_run.call_args[0][0]
161
+
162
+ # 1) It must be a list
163
+ assert isinstance(raw_prompt, list), 'Expected prompt to be a list when passing binary'
164
+
165
+ # 2) The BinaryContent you passed in should be one of the elements
166
+ assert image_content in raw_prompt, 'Expected the exact BinaryContent instance to be in the prompt list'
167
+
168
+
169
+ async def test_judge_input_output_binary_content_mock(mocker: MockerFixture, image_content: BinaryContent):
170
+ """Test judge_input_output function with mocked agent."""
171
+ # Mock the agent run method
172
+ mock_result = mocker.MagicMock()
173
+ mock_result.output = GradingOutput(reason='Test passed', pass_=True, score=1.0)
174
+ mock_run = mocker.patch('pydantic_ai.Agent.run', return_value=mock_result)
175
+
176
+ result = await judge_input_output(image_content, 'Hello world', 'Output contains input')
177
+ assert isinstance(result, GradingOutput)
178
+ assert result.reason == 'Test passed'
179
+ assert result.pass_ is True
180
+ assert result.score == 1.0
181
+
182
+ # Verify the agent was called with correct prompt
183
+ mock_run.assert_called_once()
184
+ raw_prompt = mock_run.call_args[0][0]
185
+
186
+ # 1) It must be a list
187
+ assert isinstance(raw_prompt, list), 'Expected prompt to be a list when passing binary'
188
+
189
+ # 2) The BinaryContent you passed in should be one of the elements
190
+ assert image_content in raw_prompt, 'Expected the exact BinaryContent instance to be in the prompt list'
191
+
192
+
144
193
  @pytest.mark.anyio
145
194
  async def test_judge_input_output_with_model_settings_mock(mocker: MockerFixture):
146
195
  """Test judge_input_output function with model_settings and mocked agent."""
@@ -172,7 +221,7 @@ async def test_judge_input_output_with_model_settings_mock(mocker: MockerFixture
172
221
 
173
222
 
174
223
  @pytest.mark.anyio
175
- async def test_judge_input_output_expected_mock(mocker: MockerFixture):
224
+ async def test_judge_input_output_expected_mock(mocker: MockerFixture, image_content: BinaryContent):
176
225
  """Test judge_input_output_expected function with mocked agent."""
177
226
  # Mock the agent run method
178
227
  mock_result = mocker.MagicMock()
@@ -187,16 +236,29 @@ async def test_judge_input_output_expected_mock(mocker: MockerFixture):
187
236
  assert result.score == 1.0
188
237
 
189
238
  # Verify the agent was called with correct prompt
190
- mock_run.assert_called_once()
191
239
  call_args = mock_run.call_args[0]
192
240
  assert '<Input>\nHello\n</Input>' in call_args[0]
193
241
  assert '<ExpectedOutput>\nHello\n</ExpectedOutput>' in call_args[0]
194
242
  assert '<Output>\nHello world\n</Output>' in call_args[0]
195
243
  assert '<Rubric>\nOutput contains input\n</Rubric>' in call_args[0]
196
244
 
245
+ result = await judge_input_output_expected(image_content, 'Hello world', 'Hello', 'Output contains input')
246
+ assert isinstance(result, GradingOutput)
247
+ assert result.reason == 'Test passed'
248
+ assert result.pass_ is True
249
+ assert result.score == 1.0
250
+
251
+ call_args = mock_run.call_args[0]
252
+ assert image_content in call_args[0]
253
+ assert '<ExpectedOutput>\nHello\n</ExpectedOutput>' in call_args[0]
254
+ assert '<Output>\nHello world\n</Output>' in call_args[0]
255
+ assert '<Rubric>\nOutput contains input\n</Rubric>' in call_args[0]
256
+
197
257
 
198
258
  @pytest.mark.anyio
199
- async def test_judge_input_output_expected_with_model_settings_mock(mocker: MockerFixture):
259
+ async def test_judge_input_output_expected_with_model_settings_mock(
260
+ mocker: MockerFixture, image_content: BinaryContent
261
+ ):
200
262
  """Test judge_input_output_expected function with model_settings and mocked agent."""
201
263
  mock_result = mocker.MagicMock()
202
264
  mock_result.output = GradingOutput(reason='Test passed with settings', pass_=True, score=1.0)
@@ -216,7 +278,6 @@ async def test_judge_input_output_expected_with_model_settings_mock(mocker: Mock
216
278
  assert result.pass_ is True
217
279
  assert result.score == 1.0
218
280
 
219
- mock_run.assert_called_once()
220
281
  call_args, call_kwargs = mock_run.call_args
221
282
  assert '<Input>\nHello settings\n</Input>' in call_args[0]
222
283
  assert '<ExpectedOutput>\nHello\n</ExpectedOutput>' in call_args[0]
@@ -226,6 +287,108 @@ async def test_judge_input_output_expected_with_model_settings_mock(mocker: Mock
226
287
  # Check if 'model' kwarg is passed, its value will be the default model or None
227
288
  assert 'model' in call_kwargs
228
289
 
290
+ result = await judge_input_output_expected(
291
+ image_content,
292
+ 'Hello world with settings',
293
+ 'Hello',
294
+ 'Output contains input with settings',
295
+ model_settings=test_model_settings,
296
+ )
297
+
298
+ assert isinstance(result, GradingOutput)
299
+ assert result.reason == 'Test passed with settings'
300
+ assert result.pass_ is True
301
+ assert result.score == 1.0
302
+
303
+ call_args, call_kwargs = mock_run.call_args
304
+ assert image_content in call_args[0]
305
+ assert '<ExpectedOutput>\nHello\n</ExpectedOutput>' in call_args[0]
306
+ assert '<Output>\nHello world with settings\n</Output>' in call_args[0]
307
+ assert '<Rubric>\nOutput contains input with settings\n</Rubric>' in call_args[0]
308
+ assert call_kwargs['model_settings'] == test_model_settings
309
+ # Check if 'model' kwarg is passed, its value will be the default model or None
310
+ assert 'model' in call_kwargs
311
+
312
+ result = await judge_input_output_expected(
313
+ 123,
314
+ 'Hello world with settings',
315
+ 'Hello',
316
+ 'Output contains input with settings',
317
+ model_settings=test_model_settings,
318
+ )
319
+
320
+ assert isinstance(result, GradingOutput)
321
+ assert result.reason == 'Test passed with settings'
322
+ assert result.pass_ is True
323
+ assert result.score == 1.0
324
+
325
+ call_args, call_kwargs = mock_run.call_args
326
+
327
+ assert call_args == snapshot(
328
+ (
329
+ [
330
+ '<Input>\n',
331
+ '123',
332
+ '</Input>',
333
+ """\
334
+ <Output>
335
+ Hello world with settings
336
+ </Output>\
337
+ """,
338
+ """\
339
+ <Rubric>
340
+ Output contains input with settings
341
+ </Rubric>\
342
+ """,
343
+ """\
344
+ <ExpectedOutput>
345
+ Hello
346
+ </ExpectedOutput>\
347
+ """,
348
+ ],
349
+ )
350
+ )
351
+
352
+ result = await judge_input_output_expected(
353
+ [123],
354
+ 'Hello world with settings',
355
+ 'Hello',
356
+ 'Output contains input with settings',
357
+ model_settings=test_model_settings,
358
+ )
359
+
360
+ assert isinstance(result, GradingOutput)
361
+ assert result.reason == 'Test passed with settings'
362
+ assert result.pass_ is True
363
+ assert result.score == 1.0
364
+
365
+ call_args, call_kwargs = mock_run.call_args
366
+
367
+ assert call_args == snapshot(
368
+ (
369
+ [
370
+ '<Input>\n',
371
+ '123',
372
+ '</Input>',
373
+ """\
374
+ <Output>
375
+ Hello world with settings
376
+ </Output>\
377
+ """,
378
+ """\
379
+ <Rubric>
380
+ Output contains input with settings
381
+ </Rubric>\
382
+ """,
383
+ """\
384
+ <ExpectedOutput>
385
+ Hello
386
+ </ExpectedOutput>\
387
+ """,
388
+ ],
389
+ )
390
+ )
391
+
229
392
 
230
393
  @pytest.mark.anyio
231
394
  async def test_judge_output_expected_mock(mocker: MockerFixture):
@@ -243,7 +406,6 @@ async def test_judge_output_expected_mock(mocker: MockerFixture):
243
406
  assert result.score == 1.0
244
407
 
245
408
  # Verify the agent was called with correct prompt
246
- mock_run.assert_called_once()
247
409
  call_args = mock_run.call_args[0]
248
410
  assert '<Input>' not in call_args[0]
249
411
  assert '<ExpectedOutput>\nHello\n</ExpectedOutput>' in call_args[0]
@@ -252,7 +414,7 @@ async def test_judge_output_expected_mock(mocker: MockerFixture):
252
414
 
253
415
 
254
416
  @pytest.mark.anyio
255
- async def test_judge_output_expected_with_model_settings_mock(mocker: MockerFixture):
417
+ async def test_judge_output_expected_with_model_settings_mock(mocker: MockerFixture, image_content: BinaryContent):
256
418
  """Test judge_output_expected function with model_settings and mocked agent."""
257
419
  mock_result = mocker.MagicMock()
258
420
  mock_result.output = GradingOutput(reason='Test passed with settings', pass_=True, score=1.0)
@@ -280,3 +442,23 @@ async def test_judge_output_expected_with_model_settings_mock(mocker: MockerFixt
280
442
  assert call_kwargs['model_settings'] == test_model_settings
281
443
  # Check if 'model' kwarg is passed, its value will be the default model or None
282
444
  assert 'model' in call_kwargs
445
+
446
+ result = await judge_output_expected(
447
+ image_content,
448
+ 'Hello',
449
+ 'Output contains input with settings',
450
+ model_settings=test_model_settings,
451
+ )
452
+ assert isinstance(result, GradingOutput)
453
+ assert result.reason == 'Test passed with settings'
454
+ assert result.pass_ is True
455
+ assert result.score == 1.0
456
+
457
+ call_args, call_kwargs = mock_run.call_args
458
+ assert '<Input>' not in call_args[0]
459
+ assert '<ExpectedOutput>\nHello\n</ExpectedOutput>' in call_args[0]
460
+ assert '<Output>' in call_args[0]
461
+ assert '<Rubric>\nOutput contains input with settings\n</Rubric>' in call_args[0]
462
+ assert call_kwargs['model_settings'] == test_model_settings
463
+ # Check if 'model' kwarg is passed, its value will be the default model or None
464
+ assert 'model' in call_kwargs