pydantic-ai 0.5.0__tar.gz → 0.6.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.
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/Makefile +2 -5
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/PKG-INFO +3 -3
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/pyproject.toml +6 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/conftest.py +6 -6
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/evals/test_dataset.py +89 -89
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/graph/test_graph.py +0 -33
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/models/test_fallback.py +11 -1
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/models/test_gemini.py +24 -17
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/models/test_gemini_vertex.py +3 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/models/test_google.py +5 -3
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/models/test_openai.py +3 -3
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/providers/test_google_gla.py +5 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/providers/test_google_vertex.py +6 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/providers/test_provider_names.py +9 -5
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/test_agent.py +1 -56
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/test_examples.py +1 -6
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/test_live.py +17 -11
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/test_streaming.py +1 -1
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/typed_agent.py +1 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/.gitignore +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/LICENSE +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/README.md +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/__init__.py +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/assets/dummy.pdf +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/assets/kiwi.png +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/assets/marcelo.mp3 +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/assets/product_name.txt +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/assets/small_video.mp4 +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/cassettes/test_mcp/test_agent_with_server_not_running.yaml +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/cassettes/test_mcp/test_agent_with_stdio_server.yaml +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/cassettes/test_mcp/test_tool_returning_audio_resource.yaml +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/cassettes/test_mcp/test_tool_returning_audio_resource_link.yaml +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/cassettes/test_mcp/test_tool_returning_dict.yaml +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/cassettes/test_mcp/test_tool_returning_error.yaml +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/cassettes/test_mcp/test_tool_returning_image.yaml +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/cassettes/test_mcp/test_tool_returning_image_resource.yaml +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/cassettes/test_mcp/test_tool_returning_image_resource_link.yaml +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/cassettes/test_mcp/test_tool_returning_multiple_items.yaml +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/cassettes/test_mcp/test_tool_returning_none.yaml +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/cassettes/test_mcp/test_tool_returning_str.yaml +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/cassettes/test_mcp/test_tool_returning_text_resource.yaml +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/cassettes/test_mcp/test_tool_returning_text_resource_link.yaml +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/cassettes/test_settings/test_stop_settings[anthropic].yaml +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/cassettes/test_settings/test_stop_settings[bedrock].yaml +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/cassettes/test_settings/test_stop_settings[cohere].yaml +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/cassettes/test_settings/test_stop_settings[gemini].yaml +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/cassettes/test_settings/test_stop_settings[google].yaml +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/cassettes/test_settings/test_stop_settings[groq].yaml +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/cassettes/test_settings/test_stop_settings[mistral].yaml +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/cassettes/test_settings/test_stop_settings[openai].yaml +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/evals/__init__.py +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/evals/test_evaluator_base.py +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/evals/test_evaluator_common.py +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/evals/test_evaluator_context.py +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/evals/test_evaluator_spec.py +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/evals/test_evaluators.py +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/evals/test_llm_as_a_judge.py +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/evals/test_otel.py +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/evals/test_render_numbers.py +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/evals/test_reporting.py +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/evals/test_reports.py +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/evals/test_utils.py +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/evals/utils.py +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/example_modules/README.md +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/example_modules/bank_database.py +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/example_modules/fake_database.py +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/example_modules/mcp_server.py +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/example_modules/weather_service.py +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/ext/__init__.py +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/ext/test_langchain.py +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/graph/__init__.py +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/graph/test_file_persistence.py +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/graph/test_mermaid.py +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/graph/test_persistence.py +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/graph/test_state.py +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/graph/test_utils.py +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/import_examples.py +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/json_body_serializer.py +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/mcp_server.py +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/models/__init__.py +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/models/cassettes/test_anthropic/test_anthropic_model_empty_message_on_history.yaml +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/models/cassettes/test_anthropic/test_anthropic_model_instructions.yaml +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/models/cassettes/test_anthropic/test_anthropic_model_thinking_part.yaml +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/models/cassettes/test_anthropic/test_anthropic_model_thinking_part_stream.yaml +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/models/cassettes/test_anthropic/test_anthropic_prompted_output.yaml +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/models/cassettes/test_anthropic/test_anthropic_prompted_output_multiple.yaml +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/models/cassettes/test_anthropic/test_anthropic_text_output_function.yaml +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/models/cassettes/test_anthropic/test_anthropic_tool_output.yaml +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/models/cassettes/test_anthropic/test_anthropic_tool_with_thinking.yaml +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/models/cassettes/test_anthropic/test_document_binary_content_input.yaml +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/models/cassettes/test_anthropic/test_document_url_input.yaml +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/models/cassettes/test_anthropic/test_extra_headers.yaml +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/models/cassettes/test_anthropic/test_image_as_binary_content_tool_response.yaml +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/models/cassettes/test_anthropic/test_image_url_input.yaml +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/models/cassettes/test_anthropic/test_image_url_input_invalid_mime_type.yaml +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/models/cassettes/test_anthropic/test_multiple_parallel_tool_calls.yaml +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/models/cassettes/test_anthropic/test_text_document_url_input.yaml +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/models/cassettes/test_bedrock/test_bedrock_empty_system_prompt.yaml +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/models/cassettes/test_bedrock/test_bedrock_model.yaml +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/models/cassettes/test_bedrock/test_bedrock_model_anthropic_model_without_tools.yaml +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/models/cassettes/test_bedrock/test_bedrock_model_guardrail_config.yaml +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/models/cassettes/test_bedrock/test_bedrock_model_instructions.yaml +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/models/cassettes/test_bedrock/test_bedrock_model_iter_stream.yaml +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/models/cassettes/test_bedrock/test_bedrock_model_max_tokens.yaml +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/models/cassettes/test_bedrock/test_bedrock_model_other_parameters.yaml +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/models/cassettes/test_bedrock/test_bedrock_model_performance_config.yaml +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/models/cassettes/test_bedrock/test_bedrock_model_retry.yaml +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/models/cassettes/test_bedrock/test_bedrock_model_stream.yaml +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/models/cassettes/test_bedrock/test_bedrock_model_structured_output.yaml +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/models/cassettes/test_bedrock/test_bedrock_model_thinking_part.yaml +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/models/cassettes/test_bedrock/test_bedrock_model_thinking_part_stream.yaml +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/models/cassettes/test_bedrock/test_bedrock_model_top_p.yaml +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/models/cassettes/test_bedrock/test_bedrock_multiple_documents_in_history.yaml +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/models/cassettes/test_bedrock/test_document_url_input.yaml +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/models/cassettes/test_bedrock/test_image_as_binary_content_input.yaml +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/models/cassettes/test_bedrock/test_image_url_input.yaml +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/models/cassettes/test_bedrock/test_text_as_binary_content_input.yaml +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/models/cassettes/test_bedrock/test_text_document_url_input.yaml +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/models/cassettes/test_bedrock/test_video_as_binary_content_input.yaml +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/models/cassettes/test_bedrock/test_video_url_input.yaml +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/models/cassettes/test_cohere/test_cohere_model_instructions.yaml +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/models/cassettes/test_cohere/test_cohere_model_thinking_part.yaml +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/models/cassettes/test_cohere/test_request_simple_success_with_vcr.yaml +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/models/cassettes/test_deepseek/test_deepseek_model_thinking_part.yaml +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/models/cassettes/test_deepseek/test_deepseek_model_thinking_stream.yaml +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/models/cassettes/test_download_item/test_download_item_application_octet_stream.yaml +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/models/cassettes/test_download_item/test_download_item_audio_mpeg.yaml +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/models/cassettes/test_download_item/test_download_item_no_content_type.yaml +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/models/cassettes/test_gemini/test_document_url_input.yaml +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/models/cassettes/test_gemini/test_gemini_additional_properties_is_false.yaml +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/models/cassettes/test_gemini/test_gemini_additional_properties_is_true.yaml +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/models/cassettes/test_gemini/test_gemini_drop_exclusive_maximum.yaml +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/models/cassettes/test_gemini/test_gemini_exclusive_minimum_and_maximum.yaml +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/models/cassettes/test_gemini/test_gemini_model_instructions.yaml +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/models/cassettes/test_gemini/test_gemini_model_thinking_part.yaml +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/models/cassettes/test_gemini/test_gemini_native_output.yaml +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/models/cassettes/test_gemini/test_gemini_native_output_multiple.yaml +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/models/cassettes/test_gemini/test_gemini_prompted_output.yaml +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/models/cassettes/test_gemini/test_gemini_prompted_output_multiple.yaml +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/models/cassettes/test_gemini/test_gemini_prompted_output_with_tools.yaml +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/models/cassettes/test_gemini/test_gemini_text_output_function.yaml +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/models/cassettes/test_gemini/test_gemini_tool_config_any_with_tool_without_args.yaml +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/models/cassettes/test_gemini/test_gemini_tool_output.yaml +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/models/cassettes/test_gemini/test_gemini_youtube_video_url_input.yaml +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/models/cassettes/test_gemini/test_image_as_binary_content_input.yaml +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/models/cassettes/test_gemini/test_image_as_binary_content_tool_response.yaml +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/models/cassettes/test_gemini/test_image_url_input.yaml +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/models/cassettes/test_gemini/test_labels_are_ignored_with_gla_provider.yaml +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/models/cassettes/test_gemini/test_video_as_binary_content_input.yaml +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/models/cassettes/test_gemini/test_video_url_input.yaml +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/models/cassettes/test_gemini_vertex/test_labels.yaml +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/models/cassettes/test_gemini_vertex/test_url_input[AudioUrl (gs)].yaml +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/models/cassettes/test_gemini_vertex/test_url_input[AudioUrl].yaml +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/models/cassettes/test_gemini_vertex/test_url_input[DocumentUrl (gs)].yaml +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/models/cassettes/test_gemini_vertex/test_url_input[DocumentUrl].yaml +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/models/cassettes/test_gemini_vertex/test_url_input[ImageUrl (gs)].yaml +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/models/cassettes/test_gemini_vertex/test_url_input[ImageUrl].yaml +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/models/cassettes/test_gemini_vertex/test_url_input[VideoUrl (YouTube)].yaml +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/models/cassettes/test_gemini_vertex/test_url_input[VideoUrl (gs)].yaml +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/models/cassettes/test_gemini_vertex/test_url_input[VideoUrl].yaml +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/models/cassettes/test_gemini_vertex/test_url_input_force_download.yaml +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/models/cassettes/test_google/test_google_model.yaml +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/models/cassettes/test_google/test_google_model_document_url_input.yaml +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/models/cassettes/test_google/test_google_model_empty_assistant_response.yaml +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/models/cassettes/test_google/test_google_model_empty_user_prompt.yaml +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/models/cassettes/test_google/test_google_model_image_as_binary_content_input.yaml +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/models/cassettes/test_google/test_google_model_image_url_input.yaml +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/models/cassettes/test_google/test_google_model_instructions.yaml +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/models/cassettes/test_google/test_google_model_iter_stream.yaml +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/models/cassettes/test_google/test_google_model_max_tokens.yaml +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/models/cassettes/test_google/test_google_model_multiple_documents_in_history.yaml +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/models/cassettes/test_google/test_google_model_retry.yaml +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/models/cassettes/test_google/test_google_model_safety_settings.yaml +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/models/cassettes/test_google/test_google_model_stream.yaml +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/models/cassettes/test_google/test_google_model_structured_output.yaml +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/models/cassettes/test_google/test_google_model_text_as_binary_content_input.yaml +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/models/cassettes/test_google/test_google_model_text_document_url_input.yaml +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/models/cassettes/test_google/test_google_model_thinking_config.yaml +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/models/cassettes/test_google/test_google_model_thinking_part.yaml +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/models/cassettes/test_google/test_google_model_thinking_part_iter.yaml +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/models/cassettes/test_google/test_google_model_top_p.yaml +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/models/cassettes/test_google/test_google_model_vertex_labels.yaml +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/models/cassettes/test_google/test_google_model_vertex_provider.yaml +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/models/cassettes/test_google/test_google_model_video_as_binary_content_input.yaml +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/models/cassettes/test_google/test_google_model_video_as_binary_content_input_with_vendor_metadata.yaml +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/models/cassettes/test_google/test_google_model_video_url_input.yaml +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/models/cassettes/test_google/test_google_model_youtube_video_url_input_with_vendor_metadata.yaml +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/models/cassettes/test_google/test_google_native_output.yaml +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/models/cassettes/test_google/test_google_native_output_multiple.yaml +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/models/cassettes/test_google/test_google_prompted_output.yaml +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/models/cassettes/test_google/test_google_prompted_output_multiple.yaml +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/models/cassettes/test_google/test_google_prompted_output_with_tools.yaml +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/models/cassettes/test_google/test_google_text_output_function.yaml +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/models/cassettes/test_google/test_google_timeout.yaml +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/models/cassettes/test_google/test_google_tool_config_any_with_tool_without_args.yaml +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/models/cassettes/test_google/test_google_tool_output.yaml +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/models/cassettes/test_google/test_google_url_input[AudioUrl (gs)].yaml +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/models/cassettes/test_google/test_google_url_input[AudioUrl].yaml +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/models/cassettes/test_google/test_google_url_input[DocumentUrl (gs)].yaml +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/models/cassettes/test_google/test_google_url_input[DocumentUrl].yaml +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/models/cassettes/test_google/test_google_url_input[ImageUrl (gs)].yaml +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/models/cassettes/test_google/test_google_url_input[ImageUrl].yaml +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/models/cassettes/test_google/test_google_url_input[VideoUrl (YouTube)].yaml +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/models/cassettes/test_google/test_google_url_input[VideoUrl (gs)].yaml +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/models/cassettes/test_google/test_google_url_input[VideoUrl].yaml +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/models/cassettes/test_google/test_google_url_input_force_download.yaml +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/models/cassettes/test_groq/test_extra_headers.yaml +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/models/cassettes/test_groq/test_groq_model_instructions.yaml +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/models/cassettes/test_groq/test_groq_model_thinking_part.yaml +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/models/cassettes/test_groq/test_groq_model_thinking_part_iter.yaml +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/models/cassettes/test_groq/test_image_as_binary_content_input.yaml +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/models/cassettes/test_groq/test_image_as_binary_content_tool_response.yaml +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/models/cassettes/test_groq/test_image_url_input.yaml +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/models/cassettes/test_huggingface/test_hf_model_instructions.yaml +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/models/cassettes/test_huggingface/test_hf_model_thinking_part.yaml +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/models/cassettes/test_huggingface/test_hf_model_thinking_part_iter.yaml +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/models/cassettes/test_huggingface/test_image_as_binary_content_input.yaml +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/models/cassettes/test_huggingface/test_image_url_input.yaml +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/models/cassettes/test_huggingface/test_max_completion_tokens[Qwen-Qwen2.5-72B-Instruct].yaml +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/models/cassettes/test_huggingface/test_max_completion_tokens[deepseek-ai-DeepSeek-R1-0528].yaml +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/models/cassettes/test_huggingface/test_max_completion_tokens[meta-llama-Llama-3.3-70B-Instruct].yaml +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/models/cassettes/test_huggingface/test_request_simple_success_with_vcr.yaml +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/models/cassettes/test_huggingface/test_request_simple_usage.yaml +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/models/cassettes/test_huggingface/test_simple_completion.yaml +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/models/cassettes/test_huggingface/test_stream_completion.yaml +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/models/cassettes/test_mistral/test_image_as_binary_content_tool_response.yaml +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/models/cassettes/test_mistral/test_mistral_model_instructions.yaml +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/models/cassettes/test_mistral/test_mistral_model_thinking_part.yaml +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/models/cassettes/test_model_names/test_known_model_names.yaml +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/models/cassettes/test_openai/test_audio_as_binary_content_input.yaml +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/models/cassettes/test_openai/test_compatible_api_with_tool_calls_without_id.yaml +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/models/cassettes/test_openai/test_document_as_binary_content_input.yaml +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/models/cassettes/test_openai/test_document_url_input.yaml +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/models/cassettes/test_openai/test_extra_headers.yaml +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/models/cassettes/test_openai/test_image_as_binary_content_input.yaml +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/models/cassettes/test_openai/test_image_as_binary_content_tool_response.yaml +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/models/cassettes/test_openai/test_image_url_tool_response.yaml +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/models/cassettes/test_openai/test_invalid_response.yaml +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/models/cassettes/test_openai/test_max_completion_tokens[gpt-4.5-preview].yaml +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/models/cassettes/test_openai/test_max_completion_tokens[gpt-4o-mini].yaml +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/models/cassettes/test_openai/test_max_completion_tokens[o3-mini].yaml +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/models/cassettes/test_openai/test_multiple_agent_tool_calls.yaml +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/models/cassettes/test_openai/test_openai_audio_url_input.yaml +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/models/cassettes/test_openai/test_openai_instructions.yaml +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/models/cassettes/test_openai/test_openai_instructions_with_tool_calls_keep_instructions.yaml +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/models/cassettes/test_openai/test_openai_model_thinking_part.yaml +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/models/cassettes/test_openai/test_openai_model_thinking_part_iter.yaml +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/models/cassettes/test_openai/test_openai_model_without_system_prompt.yaml +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/models/cassettes/test_openai/test_openai_native_output.yaml +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/models/cassettes/test_openai/test_openai_native_output_multiple.yaml +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/models/cassettes/test_openai/test_openai_o1_mini_system_role[developer].yaml +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/models/cassettes/test_openai/test_openai_o1_mini_system_role[system].yaml +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/models/cassettes/test_openai/test_openai_prompted_output.yaml +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/models/cassettes/test_openai/test_openai_prompted_output_multiple.yaml +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/models/cassettes/test_openai/test_openai_responses_model_thinking_part.yaml +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/models/cassettes/test_openai/test_openai_text_output_function.yaml +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/models/cassettes/test_openai/test_openai_tool_output.yaml +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/models/cassettes/test_openai/test_reasoning_model_with_temperature.yaml +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/models/cassettes/test_openai/test_text_response.yaml +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/models/cassettes/test_openai/test_user_id.yaml +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/models/cassettes/test_openai/test_valid_response.yaml +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/models/cassettes/test_openai_responses/test_audio_as_binary_content_input.yaml +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/models/cassettes/test_openai_responses/test_image_as_binary_content_input.yaml +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/models/cassettes/test_openai_responses/test_image_as_binary_content_tool_response.yaml +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/models/cassettes/test_openai_responses/test_native_output.yaml +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/models/cassettes/test_openai_responses/test_native_output_multiple.yaml +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/models/cassettes/test_openai_responses/test_openai_responses_document_as_binary_content_input.yaml +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/models/cassettes/test_openai_responses/test_openai_responses_document_url_input.yaml +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/models/cassettes/test_openai_responses/test_openai_responses_image_url_input.yaml +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/models/cassettes/test_openai_responses/test_openai_responses_model_builtin_tools.yaml +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/models/cassettes/test_openai_responses/test_openai_responses_model_http_error.yaml +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/models/cassettes/test_openai_responses/test_openai_responses_model_instructions.yaml +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/models/cassettes/test_openai_responses/test_openai_responses_model_retry.yaml +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/models/cassettes/test_openai_responses/test_openai_responses_model_simple_response.yaml +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/models/cassettes/test_openai_responses/test_openai_responses_model_simple_response_with_tool_call.yaml +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/models/cassettes/test_openai_responses/test_openai_responses_output_type.yaml +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/models/cassettes/test_openai_responses/test_openai_responses_reasoning_effort.yaml +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/models/cassettes/test_openai_responses/test_openai_responses_reasoning_generate_summary.yaml +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/models/cassettes/test_openai_responses/test_openai_responses_stream.yaml +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/models/cassettes/test_openai_responses/test_openai_responses_system_prompt.yaml +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/models/cassettes/test_openai_responses/test_openai_responses_text_document_url_input.yaml +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/models/cassettes/test_openai_responses/test_prompted_output.yaml +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/models/cassettes/test_openai_responses/test_prompted_output_multiple.yaml +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/models/cassettes/test_openai_responses/test_reasoning_model_with_temperature.yaml +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/models/cassettes/test_openai_responses/test_text_output_function.yaml +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/models/cassettes/test_openai_responses/test_tool_output.yaml +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/models/mock_async_stream.py +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/models/test_anthropic.py +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/models/test_bedrock.py +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/models/test_cohere.py +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/models/test_deepseek.py +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/models/test_download_item.py +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/models/test_groq.py +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/models/test_huggingface.py +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/models/test_instrumented.py +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/models/test_mcp_sampling.py +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/models/test_mistral.py +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/models/test_model.py +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/models/test_model_function.py +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/models/test_model_names.py +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/models/test_model_request_parameters.py +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/models/test_model_settings.py +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/models/test_model_test.py +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/models/test_openai_responses.py +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/providers/__init__.py +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/providers/cassettes/test_azure/test_azure_provider_call.yaml +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/providers/cassettes/test_google_vertex/test_vertexai_provider.yaml +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/providers/cassettes/test_heroku/test_heroku_model_provider_claude_3_7_sonnet.yaml +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/providers/cassettes/test_openrouter/test_openrouter_with_google_model.yaml +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/providers/test_anthropic.py +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/providers/test_azure.py +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/providers/test_bedrock.py +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/providers/test_cohere.py +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/providers/test_deepseek.py +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/providers/test_fireworks.py +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/providers/test_github.py +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/providers/test_grok.py +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/providers/test_groq.py +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/providers/test_heroku.py +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/providers/test_huggingface.py +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/providers/test_mistral.py +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/providers/test_moonshotai.py +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/providers/test_openai.py +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/providers/test_openrouter.py +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/providers/test_together.py +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/providers/test_vercel.py +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/test_a2a.py +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/test_ag_ui.py +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/test_cli.py +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/test_deps.py +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/test_direct.py +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/test_format_as_xml.py +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/test_history_processor.py +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/test_json_body_serializer.py +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/test_logfire.py +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/test_mcp.py +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/test_messages.py +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/test_parts_manager.py +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/test_settings.py +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/test_tenacity.py +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/test_thinking_part.py +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/test_tools.py +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/test_toolsets.py +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/test_usage_limits.py +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/test_utils.py +0 -0
- {pydantic_ai-0.5.0 → pydantic_ai-0.6.0}/tests/typed_graph.py +0 -0
|
@@ -60,13 +60,10 @@ typecheck-both: typecheck-pyright typecheck-mypy
|
|
|
60
60
|
|
|
61
61
|
.PHONY: test
|
|
62
62
|
test: ## Run tests and collect coverage data
|
|
63
|
-
uv run coverage run -m pytest
|
|
63
|
+
COVERAGE_PROCESS_START=./pyproject.toml uv run coverage run -m pytest -n auto --dist=loadgroup
|
|
64
|
+
@uv run coverage combine
|
|
64
65
|
@uv run coverage report
|
|
65
66
|
|
|
66
|
-
.PHONY: test-fast
|
|
67
|
-
test-fast: ## Same as test except no coverage and 4x faster depending on hardware
|
|
68
|
-
uv run pytest -n auto --dist=loadgroup
|
|
69
|
-
|
|
70
67
|
.PHONY: test-all-python
|
|
71
68
|
test-all-python: ## Run tests on Python 3.9 to 3.13
|
|
72
69
|
UV_PROJECT_ENVIRONMENT=.venv39 uv run --python 3.9 --all-extras --all-packages coverage run -p -m pytest
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: pydantic-ai
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.6.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,vertexai]==0.
|
|
31
|
+
Requires-Dist: pydantic-ai-slim[ag-ui,anthropic,bedrock,cli,cohere,evals,google,groq,huggingface,mcp,mistral,openai,retries,vertexai]==0.6.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.
|
|
35
|
+
Requires-Dist: pydantic-ai-examples==0.6.0; extra == 'examples'
|
|
36
36
|
Provides-Extra: logfire
|
|
37
37
|
Requires-Dist: logfire>=3.11.0; extra == 'logfire'
|
|
38
38
|
Description-Content-Type: text/markdown
|
|
@@ -92,6 +92,7 @@ docs = [
|
|
|
92
92
|
"mkdocs-llmstxt>=0.2.0",
|
|
93
93
|
"mkdocs-material[imaging]>=9.5.45",
|
|
94
94
|
"mkdocstrings-python>=1.12.2",
|
|
95
|
+
"griffe-warnings-deprecated>=1.1.0",
|
|
95
96
|
]
|
|
96
97
|
docs-upload = ["algoliasearch>=4.12.0", "pydantic>=2.10.1"]
|
|
97
98
|
|
|
@@ -215,6 +216,10 @@ filterwarnings = [
|
|
|
215
216
|
|
|
216
217
|
# https://coverage.readthedocs.io/en/latest/config.html#run
|
|
217
218
|
[tool.coverage.run]
|
|
219
|
+
parallel = true
|
|
220
|
+
concurrency = ["multiprocessing", "thread"]
|
|
221
|
+
# We use a subdirectory for coverage data to avoid noisy coverage data files.
|
|
222
|
+
data_file = ".coverage/.coverage"
|
|
218
223
|
# required to avoid warnings about files created by create_module fixture
|
|
219
224
|
include = [
|
|
220
225
|
"pydantic_ai_slim/**/*.py",
|
|
@@ -245,6 +250,7 @@ source = [
|
|
|
245
250
|
|
|
246
251
|
# https://coverage.readthedocs.io/en/latest/config.html#report
|
|
247
252
|
[tool.coverage.report]
|
|
253
|
+
fail_under = 100
|
|
248
254
|
skip_covered = true
|
|
249
255
|
show_missing = true
|
|
250
256
|
ignore_errors = true
|
|
@@ -251,7 +251,7 @@ def pytest_recording_configure(config: Any, vcr: VCR):
|
|
|
251
251
|
def mock_vcr_aiohttp_content(mocker: MockerFixture):
|
|
252
252
|
try:
|
|
253
253
|
from vcr.stubs import aiohttp_stubs
|
|
254
|
-
except ImportError:
|
|
254
|
+
except ImportError: # pragma: lax no cover
|
|
255
255
|
return
|
|
256
256
|
|
|
257
257
|
# google-genai calls `self.response_stream.content.readline()` where `self.response_stream` is a `MockClientResponse`,
|
|
@@ -416,9 +416,9 @@ def vertex_provider_auth(mocker: MockerFixture) -> None: # pragma: lax no cover
|
|
|
416
416
|
|
|
417
417
|
|
|
418
418
|
@pytest.fixture()
|
|
419
|
-
async def vertex_provider():
|
|
419
|
+
async def vertex_provider(): # pragma: lax no cover
|
|
420
420
|
# NOTE: You need to comment out this line to rewrite the cassettes locally.
|
|
421
|
-
if not os.getenv('CI', False):
|
|
421
|
+
if not os.getenv('CI', False):
|
|
422
422
|
pytest.skip('Requires properly configured local google vertex config to pass')
|
|
423
423
|
|
|
424
424
|
try:
|
|
@@ -478,10 +478,10 @@ def model(
|
|
|
478
478
|
|
|
479
479
|
return CohereModel('command-r-plus', provider=CohereProvider(api_key=co_api_key))
|
|
480
480
|
elif request.param == 'gemini':
|
|
481
|
-
from pydantic_ai.models.gemini import GeminiModel
|
|
482
|
-
from pydantic_ai.providers.google_gla import GoogleGLAProvider
|
|
481
|
+
from pydantic_ai.models.gemini import GeminiModel # type: ignore[reportDeprecated]
|
|
482
|
+
from pydantic_ai.providers.google_gla import GoogleGLAProvider # type: ignore[reportDeprecated]
|
|
483
483
|
|
|
484
|
-
return GeminiModel('gemini-1.5-flash', provider=GoogleGLAProvider(api_key=gemini_api_key))
|
|
484
|
+
return GeminiModel('gemini-1.5-flash', provider=GoogleGLAProvider(api_key=gemini_api_key)) # type: ignore[reportDeprecated]
|
|
485
485
|
elif request.param == 'google':
|
|
486
486
|
from pydantic_ai.models.google import GoogleModel
|
|
487
487
|
from pydantic_ai.providers.google import GoogleProvider
|
|
@@ -7,11 +7,11 @@ from pathlib import Path
|
|
|
7
7
|
from typing import Any
|
|
8
8
|
|
|
9
9
|
import pytest
|
|
10
|
-
from dirty_equals import HasRepr, IsNumber
|
|
10
|
+
from dirty_equals import HasRepr, IsNumber, IsPartialDict
|
|
11
11
|
from inline_snapshot import snapshot
|
|
12
12
|
from pydantic import BaseModel, TypeAdapter
|
|
13
13
|
|
|
14
|
-
from ..conftest import
|
|
14
|
+
from ..conftest import try_import
|
|
15
15
|
from .utils import render_table
|
|
16
16
|
|
|
17
17
|
with try_import() as imports_successful:
|
|
@@ -1159,7 +1159,7 @@ async def test_evaluate_async_logfire(
|
|
|
1159
1159
|
example_dataset: Dataset[TaskInput, TaskOutput, TaskMetadata],
|
|
1160
1160
|
simple_evaluator: type[Evaluator[TaskInput, TaskOutput, TaskMetadata]],
|
|
1161
1161
|
capfire: CaptureLogfire,
|
|
1162
|
-
):
|
|
1162
|
+
): # pragma: lax no cover
|
|
1163
1163
|
"""Test evaluating a dataset."""
|
|
1164
1164
|
example_dataset.add_evaluator(simple_evaluator())
|
|
1165
1165
|
|
|
@@ -1197,90 +1197,90 @@ async def test_evaluate_async_logfire(
|
|
|
1197
1197
|
'parent': None,
|
|
1198
1198
|
'start_time': 1000000000,
|
|
1199
1199
|
},
|
|
1200
|
-
|
|
1201
|
-
|
|
1202
|
-
'
|
|
1203
|
-
|
|
1204
|
-
|
|
1205
|
-
|
|
1206
|
-
|
|
1207
|
-
|
|
1208
|
-
|
|
1209
|
-
|
|
1210
|
-
|
|
1211
|
-
|
|
1212
|
-
|
|
1213
|
-
|
|
1214
|
-
|
|
1215
|
-
|
|
1216
|
-
|
|
1217
|
-
|
|
1218
|
-
|
|
1219
|
-
|
|
1220
|
-
|
|
1221
|
-
|
|
1222
|
-
|
|
1223
|
-
|
|
1224
|
-
|
|
1225
|
-
|
|
1226
|
-
|
|
1227
|
-
|
|
1228
|
-
|
|
1229
|
-
'
|
|
1230
|
-
|
|
1231
|
-
|
|
1232
|
-
|
|
1233
|
-
|
|
1234
|
-
|
|
1235
|
-
|
|
1236
|
-
|
|
1237
|
-
|
|
1238
|
-
|
|
1239
|
-
|
|
1240
|
-
|
|
1241
|
-
|
|
1242
|
-
|
|
1243
|
-
|
|
1244
|
-
|
|
1245
|
-
'
|
|
1246
|
-
|
|
1247
|
-
|
|
1248
|
-
|
|
1249
|
-
|
|
1250
|
-
|
|
1251
|
-
|
|
1252
|
-
|
|
1253
|
-
|
|
1254
|
-
|
|
1255
|
-
|
|
1256
|
-
|
|
1257
|
-
|
|
1258
|
-
|
|
1259
|
-
|
|
1260
|
-
|
|
1261
|
-
|
|
1262
|
-
|
|
1263
|
-
|
|
1264
|
-
|
|
1265
|
-
|
|
1266
|
-
|
|
1267
|
-
|
|
1268
|
-
|
|
1269
|
-
|
|
1270
|
-
|
|
1271
|
-
|
|
1272
|
-
'
|
|
1273
|
-
|
|
1274
|
-
|
|
1275
|
-
|
|
1276
|
-
|
|
1277
|
-
|
|
1278
|
-
|
|
1279
|
-
|
|
1280
|
-
|
|
1281
|
-
|
|
1282
|
-
|
|
1283
|
-
|
|
1284
|
-
|
|
1285
|
-
|
|
1200
|
+
IsPartialDict(
|
|
1201
|
+
{
|
|
1202
|
+
'attributes': {
|
|
1203
|
+
'assertions': '{"correct":{"name":"correct","value":true,"reason":null,"source":{"name":"SimpleEvaluator","arguments":null}}}',
|
|
1204
|
+
'attributes': '{}',
|
|
1205
|
+
'case_name': 'case1',
|
|
1206
|
+
'expected_output': '{"answer":"4","confidence":1.0}',
|
|
1207
|
+
'inputs': '{"query":"What is 2+2?"}',
|
|
1208
|
+
'labels': '{}',
|
|
1209
|
+
'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"}}}',
|
|
1210
|
+
'logfire.msg': 'case: case1',
|
|
1211
|
+
'logfire.msg_template': 'case: {case_name}',
|
|
1212
|
+
'logfire.span_type': 'span',
|
|
1213
|
+
'metadata': '{"difficulty":"easy","category":"general"}',
|
|
1214
|
+
'metrics': '{}',
|
|
1215
|
+
'output': '{"answer":"4","confidence":1.0}',
|
|
1216
|
+
'scores': '{"confidence":{"name":"confidence","value":1.0,"reason":null,"source":{"name":"SimpleEvaluator","arguments":null}}}',
|
|
1217
|
+
'task_duration': 1.0,
|
|
1218
|
+
'task_name': 'mock_async_task',
|
|
1219
|
+
},
|
|
1220
|
+
'context': {'is_remote': False, 'span_id': 3, 'trace_id': 1},
|
|
1221
|
+
'end_time': 8000000000,
|
|
1222
|
+
'name': 'case: {case_name}',
|
|
1223
|
+
'parent': {'is_remote': False, 'span_id': 1, 'trace_id': 1},
|
|
1224
|
+
'start_time': 2000000000,
|
|
1225
|
+
}
|
|
1226
|
+
),
|
|
1227
|
+
IsPartialDict(
|
|
1228
|
+
{
|
|
1229
|
+
'attributes': {
|
|
1230
|
+
'logfire.json_schema': '{"type":"object","properties":{"task":{}}}',
|
|
1231
|
+
'logfire.msg': 'execute mock_async_task',
|
|
1232
|
+
'logfire.msg_template': 'execute {task}',
|
|
1233
|
+
'logfire.span_type': 'span',
|
|
1234
|
+
'task': 'mock_async_task',
|
|
1235
|
+
},
|
|
1236
|
+
'context': {'is_remote': False, 'span_id': 5, 'trace_id': 1},
|
|
1237
|
+
'end_time': 4000000000,
|
|
1238
|
+
'name': 'execute {task}',
|
|
1239
|
+
'parent': {'is_remote': False, 'span_id': 3, 'trace_id': 1},
|
|
1240
|
+
'start_time': 3000000000,
|
|
1241
|
+
}
|
|
1242
|
+
),
|
|
1243
|
+
IsPartialDict(
|
|
1244
|
+
{
|
|
1245
|
+
'attributes': {
|
|
1246
|
+
'assertions': '{"correct":{"name":"correct","value":true,"reason":null,"source":{"name":"SimpleEvaluator","arguments":null}}}',
|
|
1247
|
+
'attributes': '{}',
|
|
1248
|
+
'case_name': 'case2',
|
|
1249
|
+
'expected_output': '{"answer":"Paris","confidence":1.0}',
|
|
1250
|
+
'inputs': '{"query":"What is the capital of France?"}',
|
|
1251
|
+
'labels': '{}',
|
|
1252
|
+
'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"}}}',
|
|
1253
|
+
'logfire.msg': 'case: case2',
|
|
1254
|
+
'logfire.msg_template': 'case: {case_name}',
|
|
1255
|
+
'logfire.span_type': 'span',
|
|
1256
|
+
'metadata': '{"difficulty":"medium","category":"geography"}',
|
|
1257
|
+
'metrics': '{}',
|
|
1258
|
+
'output': '{"answer":"Paris","confidence":1.0}',
|
|
1259
|
+
'scores': '{"confidence":{"name":"confidence","value":1.0,"reason":null,"source":{"name":"SimpleEvaluator","arguments":null}}}',
|
|
1260
|
+
'task_duration': 1.0,
|
|
1261
|
+
'task_name': 'mock_async_task',
|
|
1262
|
+
},
|
|
1263
|
+
'context': {'is_remote': False, 'span_id': 7, 'trace_id': 1},
|
|
1264
|
+
'end_time': 9000000000,
|
|
1265
|
+
'name': 'case: {case_name}',
|
|
1266
|
+
'parent': {'is_remote': False, 'span_id': 1, 'trace_id': 1},
|
|
1267
|
+
'start_time': 5000000000,
|
|
1268
|
+
}
|
|
1269
|
+
),
|
|
1270
|
+
IsPartialDict(
|
|
1271
|
+
{
|
|
1272
|
+
'attributes': {
|
|
1273
|
+
'logfire.json_schema': '{"type":"object","properties":{"task":{}}}',
|
|
1274
|
+
'logfire.msg': 'execute mock_async_task',
|
|
1275
|
+
'logfire.msg_template': 'execute {task}',
|
|
1276
|
+
'logfire.span_type': 'span',
|
|
1277
|
+
'task': 'mock_async_task',
|
|
1278
|
+
},
|
|
1279
|
+
'context': {'is_remote': False, 'span_id': 9, 'trace_id': 1},
|
|
1280
|
+
'end_time': 7000000000,
|
|
1281
|
+
'name': 'execute {task}',
|
|
1282
|
+
'parent': {'is_remote': False, 'span_id': 7, 'trace_id': 1},
|
|
1283
|
+
'start_time': 6000000000,
|
|
1284
|
+
}
|
|
1285
|
+
),
|
|
1286
1286
|
]
|
|
@@ -401,39 +401,6 @@ async def test_iter_next_error(mock_snapshot_id: object):
|
|
|
401
401
|
await run.next()
|
|
402
402
|
|
|
403
403
|
|
|
404
|
-
async def test_next(mock_snapshot_id: object):
|
|
405
|
-
@dataclass
|
|
406
|
-
class Foo(BaseNode):
|
|
407
|
-
async def run(self, ctx: GraphRunContext) -> Bar:
|
|
408
|
-
return Bar()
|
|
409
|
-
|
|
410
|
-
@dataclass
|
|
411
|
-
class Bar(BaseNode):
|
|
412
|
-
async def run(self, ctx: GraphRunContext) -> Foo:
|
|
413
|
-
return Foo() # pragma: no cover
|
|
414
|
-
|
|
415
|
-
g = Graph(nodes=(Foo, Bar))
|
|
416
|
-
assert g.name is None
|
|
417
|
-
sp = FullStatePersistence()
|
|
418
|
-
with pytest.warns(DeprecationWarning, match='`next` is deprecated, use `async with graph.iter(...)'):
|
|
419
|
-
n = await g.next(Foo(), persistence=sp) # pyright: ignore[reportDeprecated]
|
|
420
|
-
assert n == Bar()
|
|
421
|
-
assert g.name == 'g'
|
|
422
|
-
assert sp.history == snapshot(
|
|
423
|
-
[
|
|
424
|
-
NodeSnapshot(
|
|
425
|
-
state=None,
|
|
426
|
-
node=Foo(),
|
|
427
|
-
start_ts=IsNow(tz=timezone.utc),
|
|
428
|
-
duration=IsFloat(),
|
|
429
|
-
status='success',
|
|
430
|
-
id='Foo:1',
|
|
431
|
-
),
|
|
432
|
-
NodeSnapshot(state=None, node=Bar(), id='Bar:2'),
|
|
433
|
-
]
|
|
434
|
-
)
|
|
435
|
-
|
|
436
|
-
|
|
437
404
|
async def test_deps(mock_snapshot_id: object):
|
|
438
405
|
@dataclass
|
|
439
406
|
class Deps:
|
|
@@ -3,6 +3,7 @@ from __future__ import annotations
|
|
|
3
3
|
import sys
|
|
4
4
|
from collections.abc import AsyncIterator
|
|
5
5
|
from datetime import timezone
|
|
6
|
+
from typing import Any
|
|
6
7
|
|
|
7
8
|
import pytest
|
|
8
9
|
from inline_snapshot import snapshot
|
|
@@ -247,6 +248,14 @@ def test_all_failed() -> None:
|
|
|
247
248
|
assert exceptions[0].body == {'error': 'test error'}
|
|
248
249
|
|
|
249
250
|
|
|
251
|
+
def add_missing_response_model(spans: list[dict[str, Any]]) -> list[dict[str, Any]]:
|
|
252
|
+
for span in spans:
|
|
253
|
+
attrs = span.setdefault('attributes', {})
|
|
254
|
+
if 'gen_ai.request.model' in attrs:
|
|
255
|
+
attrs.setdefault('gen_ai.response.model', attrs['gen_ai.request.model'])
|
|
256
|
+
return spans
|
|
257
|
+
|
|
258
|
+
|
|
250
259
|
@pytest.mark.skipif(not logfire_imports_successful(), reason='logfire not installed')
|
|
251
260
|
def test_all_failed_instrumented(capfire: CaptureLogfire) -> None:
|
|
252
261
|
fallback_model = FallbackModel(failure_model, failure_model)
|
|
@@ -260,7 +269,7 @@ def test_all_failed_instrumented(capfire: CaptureLogfire) -> None:
|
|
|
260
269
|
assert exceptions[0].status_code == 500
|
|
261
270
|
assert exceptions[0].model_name == 'test-function-model'
|
|
262
271
|
assert exceptions[0].body == {'error': 'test error'}
|
|
263
|
-
assert capfire.exporter.exported_spans_as_dict() == snapshot(
|
|
272
|
+
assert add_missing_response_model(capfire.exporter.exported_spans_as_dict()) == snapshot(
|
|
264
273
|
[
|
|
265
274
|
{
|
|
266
275
|
'name': 'chat fallback:function:failure_response:,function:failure_response:',
|
|
@@ -277,6 +286,7 @@ def test_all_failed_instrumented(capfire: CaptureLogfire) -> None:
|
|
|
277
286
|
'logfire.span_type': 'span',
|
|
278
287
|
'logfire.msg': 'chat fallback:function:failure_response:,function:failure_response:',
|
|
279
288
|
'logfire.level_num': 17,
|
|
289
|
+
'gen_ai.response.model': 'fallback:function:failure_response:,function:failure_response:',
|
|
280
290
|
},
|
|
281
291
|
'events': [
|
|
282
292
|
{
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
# pyright: reportPrivateUsage=false
|
|
2
|
+
# pyright: reportDeprecated=false
|
|
2
3
|
from __future__ import annotations as _annotations
|
|
3
4
|
|
|
4
5
|
import datetime
|
|
@@ -60,7 +61,11 @@ from pydantic_ai.tools import ToolDefinition
|
|
|
60
61
|
|
|
61
62
|
from ..conftest import ClientWithHandler, IsDatetime, IsInstance, IsNow, IsStr, TestEnv, try_import
|
|
62
63
|
|
|
63
|
-
pytestmark =
|
|
64
|
+
pytestmark = [
|
|
65
|
+
pytest.mark.anyio,
|
|
66
|
+
pytest.mark.filterwarnings('ignore:Use `GoogleModel` instead.:DeprecationWarning'),
|
|
67
|
+
pytest.mark.filterwarnings('ignore:`GoogleGLAProvider` is deprecated.:DeprecationWarning'),
|
|
68
|
+
]
|
|
64
69
|
|
|
65
70
|
|
|
66
71
|
async def test_model_simple(allow_model_requests: None):
|
|
@@ -360,24 +365,25 @@ async def test_json_def_enum(allow_model_requests: None):
|
|
|
360
365
|
|
|
361
366
|
# This tests that the enum values are properly converted to strings for Gemini
|
|
362
367
|
assert m._get_tools(mrp) == snapshot(
|
|
363
|
-
|
|
364
|
-
function_declarations
|
|
365
|
-
|
|
366
|
-
name
|
|
367
|
-
description
|
|
368
|
-
parameters
|
|
368
|
+
{
|
|
369
|
+
'function_declarations': [
|
|
370
|
+
{
|
|
371
|
+
'name': 'result',
|
|
372
|
+
'description': 'This is the tool for the final Result',
|
|
373
|
+
'parameters': {
|
|
369
374
|
'properties': {
|
|
370
375
|
'progress': {
|
|
371
376
|
'items': {'enum': ['100', '80', '60', '40', '20'], 'type': 'string'},
|
|
372
377
|
'type': 'array',
|
|
373
378
|
'nullable': True,
|
|
379
|
+
'default': None,
|
|
374
380
|
}
|
|
375
381
|
},
|
|
376
382
|
'type': 'object',
|
|
377
383
|
},
|
|
378
|
-
|
|
384
|
+
}
|
|
379
385
|
]
|
|
380
|
-
|
|
386
|
+
}
|
|
381
387
|
)
|
|
382
388
|
|
|
383
389
|
|
|
@@ -406,12 +412,12 @@ async def test_json_def_replaced_any_of(allow_model_requests: None):
|
|
|
406
412
|
)
|
|
407
413
|
mrp = m.customize_request_parameters(mrp)
|
|
408
414
|
assert m._get_tools(mrp) == snapshot(
|
|
409
|
-
|
|
410
|
-
function_declarations
|
|
411
|
-
|
|
412
|
-
name
|
|
413
|
-
description
|
|
414
|
-
parameters
|
|
415
|
+
{
|
|
416
|
+
'function_declarations': [
|
|
417
|
+
{
|
|
418
|
+
'name': 'result',
|
|
419
|
+
'description': 'This is the tool for the final Result',
|
|
420
|
+
'parameters': {
|
|
415
421
|
'properties': {
|
|
416
422
|
'op_location': {
|
|
417
423
|
'properties': {
|
|
@@ -421,13 +427,14 @@ async def test_json_def_replaced_any_of(allow_model_requests: None):
|
|
|
421
427
|
'required': ['lat', 'lng'],
|
|
422
428
|
'nullable': True,
|
|
423
429
|
'type': 'object',
|
|
430
|
+
'default': None,
|
|
424
431
|
}
|
|
425
432
|
},
|
|
426
433
|
'type': 'object',
|
|
427
434
|
},
|
|
428
|
-
|
|
435
|
+
}
|
|
429
436
|
]
|
|
430
|
-
|
|
437
|
+
}
|
|
431
438
|
)
|
|
432
439
|
|
|
433
440
|
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
# pyright: reportDeprecated=false
|
|
1
2
|
import os
|
|
2
3
|
from dataclasses import dataclass
|
|
3
4
|
from typing import Union
|
|
@@ -32,6 +33,8 @@ with try_import() as imports_successful:
|
|
|
32
33
|
pytestmark = [
|
|
33
34
|
pytest.mark.skipif(not imports_successful(), reason='google-auth not installed'),
|
|
34
35
|
pytest.mark.anyio,
|
|
36
|
+
pytest.mark.filterwarnings('ignore:Use `GoogleModel` instead.:DeprecationWarning'),
|
|
37
|
+
pytest.mark.filterwarnings('ignore:`GoogleVertexProvider` is deprecated.:DeprecationWarning'),
|
|
35
38
|
]
|
|
36
39
|
|
|
37
40
|
|
|
@@ -318,7 +318,9 @@ async def test_google_model_gla_labels_raises_value_error(allow_model_requests:
|
|
|
318
318
|
await agent.run('What is the capital of France?')
|
|
319
319
|
|
|
320
320
|
|
|
321
|
-
async def test_google_model_vertex_provider(
|
|
321
|
+
async def test_google_model_vertex_provider(
|
|
322
|
+
allow_model_requests: None, vertex_provider: GoogleProvider
|
|
323
|
+
): # pragma: lax no cover
|
|
322
324
|
model = GoogleModel('gemini-2.0-flash', provider=vertex_provider)
|
|
323
325
|
agent = Agent(model=model, system_prompt='You are a helpful chatbot.')
|
|
324
326
|
result = await agent.run('What is the capital of France?')
|
|
@@ -774,7 +776,7 @@ async def test_google_url_input(
|
|
|
774
776
|
expected_output: str,
|
|
775
777
|
allow_model_requests: None,
|
|
776
778
|
vertex_provider: GoogleProvider,
|
|
777
|
-
) -> None:
|
|
779
|
+
) -> None: # pragma: lax no cover
|
|
778
780
|
m = GoogleModel('gemini-2.0-flash', provider=vertex_provider)
|
|
779
781
|
agent = Agent(m)
|
|
780
782
|
result = await agent.run(['What is the main content of this URL?', url])
|
|
@@ -806,7 +808,7 @@ async def test_google_url_input(
|
|
|
806
808
|
not os.getenv('CI', False), reason='Requires properly configured local google vertex config to pass'
|
|
807
809
|
)
|
|
808
810
|
@pytest.mark.vcr()
|
|
809
|
-
async def test_google_url_input_force_download(allow_model_requests: None) -> None:
|
|
811
|
+
async def test_google_url_input_force_download(allow_model_requests: None) -> None: # pragma: lax no cover
|
|
810
812
|
provider = GoogleProvider(project='pydantic-ai', location='us-central1')
|
|
811
813
|
m = GoogleModel('gemini-2.0-flash', provider=provider)
|
|
812
814
|
agent = Agent(m)
|
|
@@ -37,12 +37,10 @@ from pydantic_ai.messages import (
|
|
|
37
37
|
UserPromptPart,
|
|
38
38
|
)
|
|
39
39
|
from pydantic_ai.models import ModelRequestParameters
|
|
40
|
-
from pydantic_ai.models.gemini import GeminiModel
|
|
41
40
|
from pydantic_ai.output import NativeOutput, PromptedOutput, TextOutput, ToolOutput
|
|
42
41
|
from pydantic_ai.profiles import ModelProfile
|
|
43
42
|
from pydantic_ai.profiles._json_schema import InlineDefsJsonSchemaTransformer
|
|
44
43
|
from pydantic_ai.profiles.openai import OpenAIModelProfile, openai_model_profile
|
|
45
|
-
from pydantic_ai.providers.google_gla import GoogleGLAProvider
|
|
46
44
|
from pydantic_ai.result import Usage
|
|
47
45
|
from pydantic_ai.settings import ModelSettings
|
|
48
46
|
from pydantic_ai.tools import ToolDefinition
|
|
@@ -65,6 +63,7 @@ with try_import() as imports_successful:
|
|
|
65
63
|
from openai.types.chat.chat_completion_token_logprob import ChatCompletionTokenLogprob
|
|
66
64
|
from openai.types.completion_usage import CompletionUsage, PromptTokensDetails
|
|
67
65
|
|
|
66
|
+
from pydantic_ai.models.google import GoogleModel
|
|
68
67
|
from pydantic_ai.models.openai import (
|
|
69
68
|
OpenAIModel,
|
|
70
69
|
OpenAIModelSettings,
|
|
@@ -73,6 +72,7 @@ with try_import() as imports_successful:
|
|
|
73
72
|
OpenAISystemPromptRole,
|
|
74
73
|
)
|
|
75
74
|
from pydantic_ai.profiles.openai import OpenAIJsonSchemaTransformer
|
|
75
|
+
from pydantic_ai.providers.google import GoogleProvider
|
|
76
76
|
from pydantic_ai.providers.openai import OpenAIProvider
|
|
77
77
|
|
|
78
78
|
# note: we use Union here so that casting works with Python 3.9
|
|
@@ -1016,7 +1016,7 @@ async def test_max_completion_tokens(allow_model_requests: None, model_name: str
|
|
|
1016
1016
|
|
|
1017
1017
|
|
|
1018
1018
|
async def test_multiple_agent_tool_calls(allow_model_requests: None, gemini_api_key: str, openai_api_key: str):
|
|
1019
|
-
gemini_model =
|
|
1019
|
+
gemini_model = GoogleModel('gemini-2.0-flash-exp', provider=GoogleProvider(api_key=gemini_api_key))
|
|
1020
1020
|
openai_model = OpenAIModel('gpt-4o-mini', provider=OpenAIProvider(api_key=openai_api_key))
|
|
1021
1021
|
|
|
1022
1022
|
agent = Agent(model=gemini_model)
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
# pyright: reportDeprecated=false
|
|
1
2
|
import re
|
|
2
3
|
|
|
3
4
|
import pytest
|
|
@@ -7,6 +8,10 @@ from pydantic_ai.providers.google_gla import GoogleGLAProvider
|
|
|
7
8
|
|
|
8
9
|
from ..conftest import TestEnv
|
|
9
10
|
|
|
11
|
+
pytestmark = [
|
|
12
|
+
pytest.mark.filterwarnings('ignore:`GoogleGLAProvider` is deprecated.:DeprecationWarning'),
|
|
13
|
+
]
|
|
14
|
+
|
|
10
15
|
|
|
11
16
|
def test_api_key_arg(env: TestEnv):
|
|
12
17
|
env.set('GEMINI_API_KEY', 'via-env-var')
|
|
@@ -1,7 +1,9 @@
|
|
|
1
|
+
# pyright: reportDeprecated=false
|
|
1
2
|
from __future__ import annotations as _annotations
|
|
2
3
|
|
|
3
4
|
import json
|
|
4
5
|
import os
|
|
6
|
+
import sys
|
|
5
7
|
from dataclasses import dataclass
|
|
6
8
|
from pathlib import Path
|
|
7
9
|
from unittest.mock import patch
|
|
@@ -24,6 +26,8 @@ with try_import() as imports_successful:
|
|
|
24
26
|
pytestmark = [
|
|
25
27
|
pytest.mark.skipif(not imports_successful(), reason='google-genai not installed'),
|
|
26
28
|
pytest.mark.anyio(),
|
|
29
|
+
pytest.mark.filterwarnings('ignore:Use `GoogleModel` instead.:DeprecationWarning'),
|
|
30
|
+
pytest.mark.filterwarnings('ignore:`GoogleVertexProvider` is deprecated.:DeprecationWarning'),
|
|
27
31
|
]
|
|
28
32
|
|
|
29
33
|
|
|
@@ -68,6 +72,7 @@ async def mock_refresh_token():
|
|
|
68
72
|
return 'my-token'
|
|
69
73
|
|
|
70
74
|
|
|
75
|
+
@pytest.mark.skipif(sys.version_info < (3, 10), reason='Flaky test in 3.9')
|
|
71
76
|
async def test_google_vertex_provider_service_account_file(
|
|
72
77
|
monkeypatch: pytest.MonkeyPatch, tmp_path: Path, allow_model_requests: None
|
|
73
78
|
):
|
|
@@ -81,6 +86,7 @@ async def test_google_vertex_provider_service_account_file(
|
|
|
81
86
|
assert getattr(provider.client.auth, 'project_id') == 'my-project-id'
|
|
82
87
|
|
|
83
88
|
|
|
89
|
+
@pytest.mark.skipif(sys.version_info < (3, 10), reason='Flaky test in 3.9')
|
|
84
90
|
async def test_google_vertex_provider_service_account_file_info(
|
|
85
91
|
monkeypatch: pytest.MonkeyPatch, allow_model_requests: None
|
|
86
92
|
):
|