From 577c644dae35d308d1175f9d2c25dbe0a0162703 Mon Sep 17 00:00:00 2001 From: Abhijeet Prasad Date: Tue, 1 Sep 2026 16:16:35 -0400 Subject: [PATCH] fix(pydantic_ai): log invocation params on llm spans Expose effective Pydantic AI model settings as metadata.invocation_params on leaf LLM spans, matching the LangGraph tracing experience. Add VCR-backed regression coverage for temperature and max token settings. --- .../pydantic_ai/test_pydantic_ai_integration.py | 7 +++++-- py/src/braintrust/integrations/pydantic_ai/tracing.py | 2 ++ 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/py/src/braintrust/integrations/pydantic_ai/test_pydantic_ai_integration.py b/py/src/braintrust/integrations/pydantic_ai/test_pydantic_ai_integration.py index e721d0af..42f4052a 100644 --- a/py/src/braintrust/integrations/pydantic_ai/test_pydantic_ai_integration.py +++ b/py/src/braintrust/integrations/pydantic_ai/test_pydantic_ai_integration.py @@ -965,10 +965,13 @@ async def test_agent_with_model_settings_in_metadata(memory_logger): assert chat_settings["max_tokens"] == 100 assert chat_settings["temperature"] == 0.5 - # Verify model_settings is NOT in chat metadata (it's in input) + assert chat_span["span_attributes"]["type"] == SpanTypeAttribute.LLM + invocation_params = chat_span["metadata"]["invocation_params"] + assert invocation_params["max_tokens"] == 100 + assert invocation_params["temperature"] == 0.5 + assert "model_settings" not in chat_span["metadata"], "model_settings should NOT be in chat span metadata" - # Verify other metadata is present assert chat_span["metadata"]["model"] == "gpt-4o-mini" assert chat_span["metadata"]["provider"] == "openai" diff --git a/py/src/braintrust/integrations/pydantic_ai/tracing.py b/py/src/braintrust/integrations/pydantic_ai/tracing.py index 280c0057..3058d104 100644 --- a/py/src/braintrust/integrations/pydantic_ai/tracing.py +++ b/py/src/braintrust/integrations/pydantic_ai/tracing.py @@ -364,6 +364,8 @@ def _build_model_class_input_and_metadata(instance: Any, args: Any, kwargs: Any) input_data["model_settings"] = model_settings metadata = _build_model_metadata(model_name, provider, model_settings=None) + if model_settings is not None: + metadata["invocation_params"] = model_settings return model_name, display_name, input_data, metadata