Fix tracing in GeminiMultimodalLiveLLMService

This commit is contained in:
Paul Kompfner
2025-10-04 15:33:01 -04:00
parent 9b4ca12f49
commit 04a68f2c57
2 changed files with 22 additions and 33 deletions

View File

@@ -1172,19 +1172,8 @@ class GeminiMultimodalLiveLLMService(LLMService):
self._bot_is_speaking = False self._bot_is_speaking = False
text = self._bot_text_buffer text = self._bot_text_buffer
# Determine output and modality for tracing
# TODO: looks like there's a bug here - output_text and output_modality are unused
if text:
# TEXT modality
output_text = text
output_modality = "TEXT"
else:
# AUDIO modality
output_text = self._llm_output_buffer
output_modality = "AUDIO"
# Trace the complete LLM response (this will be handled by the decorator) # Trace the complete LLM response (this will be handled by the decorator)
# The decorator will extract the output text and usage metadata from the event # The decorator will extract the output text and usage metadata from the message
self._bot_text_buffer = "" self._bot_text_buffer = ""
self._llm_output_buffer = "" self._llm_output_buffer = ""

View File

@@ -651,9 +651,9 @@ def traced_gemini_live(operation: str) -> Callable:
elif operation == "llm_tool_call" and args: elif operation == "llm_tool_call" and args:
# Extract tool call information # Extract tool call information
evt = args[0] if args else None msg = args[0] if args else None
if evt and hasattr(evt, "toolCall") and evt.toolCall.functionCalls: if msg and hasattr(msg, "tool_call") and msg.tool_call.function_calls:
function_calls = evt.toolCall.functionCalls function_calls = msg.tool_call.function_calls
if function_calls: if function_calls:
# Add information about the first function call # Add information about the first function call
call = function_calls[0] call = function_calls[0]
@@ -722,19 +722,19 @@ def traced_gemini_live(operation: str) -> Callable:
elif operation == "llm_response" and args: elif operation == "llm_response" and args:
# Extract usage and response metadata from turn complete event # Extract usage and response metadata from turn complete event
evt = args[0] if args else None msg = args[0] if args else None
if evt and hasattr(evt, "usageMetadata") and evt.usageMetadata: if msg and hasattr(msg, "usage_metadata") and msg.usage_metadata:
usage = evt.usageMetadata usage = msg.usage_metadata
# Token usage - basic attributes for span visibility # Token usage - basic attributes for span visibility
if hasattr(usage, "promptTokenCount"): if hasattr(usage, "prompt_token_count"):
operation_attrs["tokens.prompt"] = usage.promptTokenCount or 0 operation_attrs["tokens.prompt"] = usage.prompt_token_count or 0
if hasattr(usage, "responseTokenCount"): if hasattr(usage, "response_token_count"):
operation_attrs["tokens.completion"] = ( operation_attrs["tokens.completion"] = (
usage.responseTokenCount or 0 usage.response_token_count or 0
) )
if hasattr(usage, "totalTokenCount"): if hasattr(usage, "total_token_count"):
operation_attrs["tokens.total"] = usage.totalTokenCount or 0 operation_attrs["tokens.total"] = usage.total_token_count or 0
# Get output text and modality from service state # Get output text and modality from service state
text = getattr(self, "_bot_text_buffer", "") text = getattr(self, "_bot_text_buffer", "")
@@ -751,9 +751,9 @@ def traced_gemini_live(operation: str) -> Callable:
# Add turn completion status # Add turn completion status
if ( if (
evt msg
and hasattr(evt, "serverContent") and hasattr(msg, "server_content")
and evt.serverContent.turnComplete and msg.server_content.turn_complete
): ):
operation_attrs["turn_complete"] = True operation_attrs["turn_complete"] = True
@@ -772,16 +772,16 @@ def traced_gemini_live(operation: str) -> Callable:
# For llm_response operation, also handle token usage metrics # For llm_response operation, also handle token usage metrics
if operation == "llm_response" and hasattr(self, "start_llm_usage_metrics"): if operation == "llm_response" and hasattr(self, "start_llm_usage_metrics"):
evt = args[0] if args else None msg = args[0] if args else None
if evt and hasattr(evt, "usageMetadata") and evt.usageMetadata: if msg and hasattr(msg, "usage_metadata") and msg.usage_metadata:
usage = evt.usageMetadata usage = msg.usage_metadata
# Create LLMTokenUsage object # Create LLMTokenUsage object
from pipecat.metrics.metrics import LLMTokenUsage from pipecat.metrics.metrics import LLMTokenUsage
tokens = LLMTokenUsage( tokens = LLMTokenUsage(
prompt_tokens=usage.promptTokenCount or 0, prompt_tokens=usage.prompt_token_count or 0,
completion_tokens=usage.responseTokenCount or 0, completion_tokens=usage.response_token_count or 0,
total_tokens=usage.totalTokenCount or 0, total_tokens=usage.total_token_count or 0,
) )
_add_token_usage_to_span(current_span, tokens) _add_token_usage_to_span(current_span, tokens)