@@ -165,6 +165,16 @@ def _assert_text_message(
165165 assert message .get ("finish_reason" ) == finish_reason
166166
167167
168+ def _normalize_to_list (value : Any ) -> list [Any ]:
169+ """Normalize tuple or list to list for OpenTelemetry compatibility."""
170+ return list (value ) if isinstance (value , tuple ) else value
171+
172+
173+ def _normalize_to_dict (value : Any ) -> dict [str , Any ]:
174+ """Normalize tuple or dict to dict for OpenTelemetry compatibility."""
175+ return dict (value ) if isinstance (value , tuple ) else value
176+
177+
168178class TestVersion (unittest .TestCase ):
169179 @patch_env_vars (
170180 stability_mode = "gen_ai_latest_experimental" ,
@@ -515,14 +525,10 @@ class BoomError(RuntimeError):
515525 content_capturing = "EVENT_ONLY" ,
516526 )
517527 def test_emits_llm_event (self ):
518- message = _create_input_message ("test query" )
519- chat_generation = _create_output_message ("test response" )
520- system_instruction = _create_system_instruction ()
521-
522528 invocation = LLMInvocation (
523529 request_model = "event-model" ,
524- input_messages = [message ],
525- system_instruction = system_instruction ,
530+ input_messages = [_create_input_message ( "test query" ) ],
531+ system_instruction = _create_system_instruction () ,
526532 provider = "test-provider" ,
527533 temperature = 0.7 ,
528534 max_tokens = 100 ,
@@ -533,14 +539,13 @@ def test_emits_llm_event(self):
533539 )
534540
535541 self .telemetry_handler .start_llm (invocation )
536- invocation .output_messages = [chat_generation ]
542+ invocation .output_messages = [_create_output_message ( "test response" ) ]
537543 self .telemetry_handler .stop_llm (invocation )
538544
539545 # Check that event was emitted
540546 logs = self .log_exporter .get_finished_logs ()
541547 self .assertEqual (len (logs ), 1 )
542- log_data = logs [0 ]
543- log_record = log_data .log_record
548+ log_record = logs [0 ].log_record
544549
545550 # Verify event name
546551 self .assertEqual (
@@ -562,60 +567,27 @@ def test_emits_llm_event(self):
562567
563568 # Verify messages are in structured format (not JSON string)
564569 # OpenTelemetry may convert lists to tuples, so we normalize
565- input_messages = attrs [GenAI .GEN_AI_INPUT_MESSAGES ]
566- input_messages_list = (
567- list (input_messages )
568- if isinstance (input_messages , tuple )
569- else input_messages
570- )
571- self .assertEqual (len (input_messages_list ), 1 )
572- input_msg = (
573- dict (input_messages_list [0 ])
574- if isinstance (input_messages_list [0 ], tuple )
575- else input_messages_list [0 ]
570+ input_msg = _normalize_to_dict (
571+ _normalize_to_list (attrs [GenAI .GEN_AI_INPUT_MESSAGES ])[0 ]
576572 )
577573 self .assertEqual (input_msg ["role" ], "Human" )
578- parts = (
579- list (input_msg ["parts" ])
580- if isinstance (input_msg ["parts" ], tuple )
581- else input_msg ["parts" ]
574+ self .assertEqual (
575+ _normalize_to_list (input_msg ["parts" ])[0 ]["content" ], "test query"
582576 )
583- self .assertEqual (parts [0 ]["content" ], "test query" )
584577
585- output_messages = attrs [GenAI .GEN_AI_OUTPUT_MESSAGES ]
586- output_messages_list = (
587- list (output_messages )
588- if isinstance (output_messages , tuple )
589- else output_messages
590- )
591- self .assertEqual (len (output_messages_list ), 1 )
592- output_msg = (
593- dict (output_messages_list [0 ])
594- if isinstance (output_messages_list [0 ], tuple )
595- else output_messages_list [0 ]
578+ output_msg = _normalize_to_dict (
579+ _normalize_to_list (attrs [GenAI .GEN_AI_OUTPUT_MESSAGES ])[0 ]
596580 )
597581 self .assertEqual (output_msg ["role" ], "AI" )
598- output_parts = (
599- list (output_msg ["parts" ])
600- if isinstance (output_msg ["parts" ], tuple )
601- else output_msg ["parts" ]
582+ self .assertEqual (
583+ _normalize_to_list (output_msg ["parts" ])[0 ]["content" ],
584+ "test response" ,
602585 )
603- self .assertEqual (output_parts [0 ]["content" ], "test response" )
604586 self .assertEqual (output_msg ["finish_reason" ], "stop" )
605587
606588 # Verify system instruction is present in event in structured format
607- self .assertIn (GenAI .GEN_AI_SYSTEM_INSTRUCTIONS , attrs )
608- system_instructions = attrs [GenAI .GEN_AI_SYSTEM_INSTRUCTIONS ]
609- system_instructions_list = (
610- list (system_instructions )
611- if isinstance (system_instructions , tuple )
612- else system_instructions
613- )
614- self .assertEqual (len (system_instructions_list ), 1 )
615- sys_instr = (
616- dict (system_instructions_list [0 ])
617- if isinstance (system_instructions_list [0 ], tuple )
618- else system_instructions_list [0 ]
589+ sys_instr = _normalize_to_dict (
590+ _normalize_to_list (attrs [GenAI .GEN_AI_SYSTEM_INSTRUCTIONS ])[0 ]
619591 )
620592 self .assertEqual (sys_instr ["content" ], "You are a helpful assistant." )
621593 self .assertEqual (sys_instr ["type" ], "text" )
0 commit comments