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