@@ -371,7 +371,7 @@ def start_tool_call_span(self, tool: ToolUse, parent_span: Optional[Span] = None
371
371
"type" : "tool_call" ,
372
372
"name" : tool ["name" ],
373
373
"id" : tool ["toolUseId" ],
374
- "arguments" : [ {"content" : tool ["input" ]}] ,
374
+ "arguments" : {"content" : tool ["input" ]},
375
375
}
376
376
],
377
377
}
@@ -727,7 +727,7 @@ def _add_event_messages(self, span: Span, messages: Messages) -> None:
727
727
input_messages : list = []
728
728
for message in messages :
729
729
input_messages .append (
730
- {"role" : message ["role" ], "parts" : [{ "type" : "text" , "content" : message ["content" ]}] }
730
+ {"role" : message ["role" ], "parts" : self . _map_content_blocks_to_otel_parts ( message ["content" ]) }
731
731
)
732
732
self ._add_event (
733
733
span , "gen_ai.client.inference.operation.details" , {"gen_ai.input.messages" : serialize (input_messages )}
@@ -740,6 +740,41 @@ def _add_event_messages(self, span: Span, messages: Messages) -> None:
740
740
{"content" : serialize (message ["content" ])},
741
741
)
742
742
743
+ def _map_content_blocks_to_otel_parts (self , content_blocks : list [ContentBlock ]) -> list [dict [str , Any ]]:
744
+ """Map ContentBlock objects to OpenTelemetry parts format."""
745
+ parts : list [dict [str , Any ]] = []
746
+
747
+ for block in content_blocks :
748
+ if "text" in block :
749
+ # Standard TextPart
750
+ parts .append ({"type" : "text" , "content" : block ["text" ]})
751
+ elif "toolUse" in block :
752
+ # Standard ToolCallRequestPart
753
+ tool_use = block ["toolUse" ]
754
+ parts .append (
755
+ {
756
+ "type" : "tool_call" ,
757
+ "name" : tool_use ["name" ],
758
+ "id" : tool_use ["toolUseId" ],
759
+ "arguments" : {"content" : tool_use ["input" ]},
760
+ }
761
+ )
762
+ elif "toolResult" in block :
763
+ # Standard ToolCallResponsePart
764
+ tool_result = block ["toolResult" ]
765
+ parts .append (
766
+ {
767
+ "type" : "tool_call_response" ,
768
+ "id" : tool_result ["toolUseId" ],
769
+ "response" : tool_result ["content" ],
770
+ }
771
+ )
772
+ else :
773
+ # For all other ContentBlock types, use the key as type and value as content
774
+ for key , value in block .items ():
775
+ parts .append ({"type" : key , "content" : value })
776
+ return parts
777
+
743
778
744
779
# Singleton instance for global access
745
780
_tracer_instance = None
0 commit comments