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