From 0c4ce035e7ae84040818e2fad28f36ba4ec15999 Mon Sep 17 00:00:00 2001 From: Marcelo Trylesinski Date: Sat, 26 Apr 2025 18:39:23 +0200 Subject: [PATCH 1/2] otel: send `BinaryContent` information --- pydantic_ai_slim/pydantic_ai/messages.py | 4 ++++ tests/models/test_instrumented.py | 25 ++++++++++++++++++++++++ 2 files changed, 29 insertions(+) diff --git a/pydantic_ai_slim/pydantic_ai/messages.py b/pydantic_ai_slim/pydantic_ai/messages.py index 48eb82f65..ed2447f25 100644 --- a/pydantic_ai_slim/pydantic_ai/messages.py +++ b/pydantic_ai_slim/pydantic_ai/messages.py @@ -1,5 +1,6 @@ from __future__ import annotations as _annotations +import base64 import uuid from collections.abc import Sequence from dataclasses import dataclass, field, replace @@ -337,6 +338,9 @@ def otel_event(self) -> Event: content.append(part) elif isinstance(part, (ImageUrl, AudioUrl, DocumentUrl, VideoUrl)): content.append({'kind': part.kind, 'url': part.url}) + elif isinstance(part, BinaryContent): + base64_data = base64.b64encode(part.data).decode() + content.append({'kind': part.kind, 'content': base64_data, 'media_type': part.media_type}) else: content.append({'kind': part.kind}) return Event('gen_ai.user.message', body={'content': content, 'role': 'user'}) diff --git a/tests/models/test_instrumented.py b/tests/models/test_instrumented.py index 87323dae2..e65aa1493 100644 --- a/tests/models/test_instrumented.py +++ b/tests/models/test_instrumented.py @@ -819,3 +819,28 @@ def test_messages_to_otel_events_image_url(document_content: BinaryContent): }, ] ) + + +def test_messages_to_otel_events_binary_content(): + messages = [ + ModelRequest(parts=[UserPromptPart(content=[BinaryContent(data=b'binary_data', media_type='image/png')])]), + ModelResponse(parts=[TextPart('text1')]), + ] + assert [ + InstrumentedModel.event_to_dict(e) for e in InstrumentedModel.messages_to_otel_events(messages) + ] == snapshot( + [ + { + 'content': [{'kind': 'binary', 'content': 'YmluYXJ5X2RhdGE=', 'media_type': 'image/png'}], + 'role': 'user', + 'gen_ai.message.index': 0, + 'event.name': 'gen_ai.user.message', + }, + { + 'content': 'text1', + 'role': 'assistant', + 'gen_ai.message.index': 1, + 'event.name': 'gen_ai.assistant.message', + }, + ] + ) From 20a1663c10f52201b0b892e2f3d54a70f8377e76 Mon Sep 17 00:00:00 2001 From: Marcelo Trylesinski Date: Sat, 26 Apr 2025 18:52:36 +0200 Subject: [PATCH 2/2] fix test --- tests/models/test_instrumented.py | 29 ++--------------------------- 1 file changed, 2 insertions(+), 27 deletions(-) diff --git a/tests/models/test_instrumented.py b/tests/models/test_instrumented.py index e65aa1493..5dfaadca0 100644 --- a/tests/models/test_instrumented.py +++ b/tests/models/test_instrumented.py @@ -36,7 +36,7 @@ from pydantic_ai.settings import ModelSettings from pydantic_ai.usage import Usage -from ..conftest import try_import +from ..conftest import IsStr, try_import with try_import() as imports_successful: from logfire.testing import CaptureLogfire @@ -806,7 +806,7 @@ def test_messages_to_otel_events_image_url(document_content: BinaryContent): 'event.name': 'gen_ai.user.message', }, { - 'content': ['user_prompt6', {'kind': 'binary'}], + 'content': ['user_prompt6', {'kind': 'binary', 'content': IsStr(), 'media_type': 'application/pdf'}], 'role': 'user', 'gen_ai.message.index': 5, 'event.name': 'gen_ai.user.message', @@ -819,28 +819,3 @@ def test_messages_to_otel_events_image_url(document_content: BinaryContent): }, ] ) - - -def test_messages_to_otel_events_binary_content(): - messages = [ - ModelRequest(parts=[UserPromptPart(content=[BinaryContent(data=b'binary_data', media_type='image/png')])]), - ModelResponse(parts=[TextPart('text1')]), - ] - assert [ - InstrumentedModel.event_to_dict(e) for e in InstrumentedModel.messages_to_otel_events(messages) - ] == snapshot( - [ - { - 'content': [{'kind': 'binary', 'content': 'YmluYXJ5X2RhdGE=', 'media_type': 'image/png'}], - 'role': 'user', - 'gen_ai.message.index': 0, - 'event.name': 'gen_ai.user.message', - }, - { - 'content': 'text1', - 'role': 'assistant', - 'gen_ai.message.index': 1, - 'event.name': 'gen_ai.assistant.message', - }, - ] - )