@@ -80,8 +80,6 @@ def _enum_values(enum_cls) -> dict[str, str]:
8080
8181
8282class GenAIProvider :
83- """String constants for known GenAI provider names."""
84-
8583 OPENAI = _PROVIDER_VALUES ["OPENAI" ]
8684 GCP_GEN_AI = _PROVIDER_VALUES ["GCP_GEN_AI" ]
8785 GCP_VERTEX_AI = _PROVIDER_VALUES ["GCP_VERTEX_AI" ]
@@ -105,8 +103,6 @@ class GenAIProvider:
105103
106104
107105class GenAIOperationName :
108- """Normalized GenAI operation names used by the processor."""
109-
110106 CHAT = _OPERATION_VALUES ["CHAT" ]
111107 GENERATE_CONTENT = _OPERATION_VALUES ["GENERATE_CONTENT" ]
112108 TEXT_COMPLETION = _OPERATION_VALUES ["TEXT_COMPLETION" ]
@@ -133,17 +129,13 @@ class GenAIOperationName:
133129
134130
135131class GenAIOutputType :
136- """Supported GenAI output types normalized by the processor."""
137-
138132 TEXT = _OUTPUT_VALUES ["TEXT" ]
139133 JSON = _OUTPUT_VALUES ["JSON" ]
140134 IMAGE = _OUTPUT_VALUES ["IMAGE" ]
141135 SPEECH = _OUTPUT_VALUES ["SPEECH" ]
142136
143137
144138class GenAIToolType :
145- """Canonical tool type values for tool spans."""
146-
147139 FUNCTION = "function"
148140 EXTENSION = "extension"
149141 DATASTORE = "datastore"
@@ -152,16 +144,13 @@ class GenAIToolType:
152144
153145
154146class GenAIEvaluationAttributes :
155- """Attribute names used to describe GenAI evaluation metadata."""
156-
157147 NAME = "gen_ai.evaluation.name"
158148 SCORE_VALUE = "gen_ai.evaluation.score.value"
159149 SCORE_LABEL = "gen_ai.evaluation.score.label"
160150 EXPLANATION = "gen_ai.evaluation.explanation"
161151
162152
163153def _attr (name : str , fallback : str ) -> str :
164- """Return semantic attribute name with fallback for older SDK versions."""
165154 return getattr (GenAIAttributes , name , fallback )
166155
167156
@@ -319,15 +308,13 @@ class ContentCaptureMode(Enum):
319308
320309 @property
321310 def capture_in_span (self ) -> bool :
322- """Return True when content should be captured on span attributes."""
323311 return self in (
324312 ContentCaptureMode .SPAN_ONLY ,
325313 ContentCaptureMode .SPAN_AND_EVENT ,
326314 )
327315
328316 @property
329317 def capture_in_event (self ) -> bool :
330- """Return True when content should be captured on span events."""
331318 return self in (
332319 ContentCaptureMode .EVENT_ONLY ,
333320 ContentCaptureMode .SPAN_AND_EVENT ,
@@ -397,14 +384,21 @@ def _get_span_status(span: Span[Any]) -> Status:
397384 return Status (StatusCode .OK )
398385
399386
387+ _SPAN_NAME_BASE_OVERRIDES : dict [str , str ] = {
388+ GenAIOperationName .SPEECH : "speech" ,
389+ GenAIOperationName .GUARDRAIL : "guardrail" ,
390+ GenAIOperationName .HANDOFF : "handoff" ,
391+ }
392+
393+
400394def get_span_name (
401395 operation_name : str ,
402396 model : Optional [str ] = None ,
403397 agent_name : Optional [str ] = None ,
404398 tool_name : Optional [str ] = None ,
405399) -> str :
406400 """Generate spec-compliant span name based on operation type."""
407- base_name = operation_name
401+ base_name = _SPAN_NAME_BASE_OVERRIDES . get ( operation_name , operation_name )
408402
409403 if operation_name in {
410404 GenAIOperationName .CHAT ,
@@ -440,6 +434,7 @@ def __init__(
440434 include_sensitive_data : bool = True ,
441435 content_mode : ContentCaptureMode = ContentCaptureMode .SPAN_AND_EVENT ,
442436 base_url : Optional [str ] = None ,
437+ emit_legacy : bool = True ,
443438 agent_name : Optional [str ] = None ,
444439 agent_id : Optional [str ] = None ,
445440 agent_description : Optional [str ] = None ,
@@ -456,28 +451,16 @@ def __init__(
456451 """Initialize processor with metrics support.
457452
458453 Args:
459- tracer: Optional OpenTelemetry tracer.
460- system_name: Provider name (openai/azure.ai.inference/etc.).
461- include_sensitive_data: Include model/tool IO when True.
462- content_mode: Control where message content is captured.
463- base_url: API endpoint for server.address/port.
464- agent_name: Name of the agent (can be overridden by env var).
465- agent_id: ID of the agent (can be overridden by env var).
466- agent_description: Description of the agent (can be overridden by
467- env var).
468- server_address: Server address (can be overridden by env var or
469- base_url).
470- server_port: Server port (can be overridden by env var or base_url).
471- metrics_enabled: Enable GenAI metrics when True.
472- agent_name_default: Fallback agent name when span data omits one.
473- agent_id_default: Fallback agent id when span data omits one.
474- agent_description_default: Fallback agent description when span data
475- omits one.
476- base_url_default: Default API endpoint when not supplied explicitly.
477- server_address_default: Default server address when not supplied
478- explicitly.
479- server_port_default: Default server port when not supplied
480- explicitly.
454+ tracer: Optional OpenTelemetry tracer
455+ system_name: Provider name (openai/azure.ai.inference/etc.)
456+ include_sensitive_data: Include model/tool IO when True
457+ base_url: API endpoint for server.address/port
458+ emit_legacy: Also emit deprecated attribute names
459+ agent_name: Name of the agent (can be overridden by env var)
460+ agent_id: ID of the agent (can be overridden by env var)
461+ agent_description: Description of the agent (can be overridden by env var)
462+ server_address: Server address (can be overridden by env var or base_url)
463+ server_port: Server port (can be overridden by env var or base_url)
481464 """
482465 self ._tracer = tracer
483466 self .system_name = normalize_provider (system_name ) or system_name
@@ -487,6 +470,8 @@ def __init__(
487470 )
488471 effective_base_url = base_url or base_url_default
489472 self .base_url = effective_base_url
473+ # Legacy emission removed; parameter retained for compatibility but unused
474+ self .emit_legacy = False
490475
491476 # Agent information - prefer explicit overrides; otherwise defer to span data
492477 self .agent_name = agent_name
@@ -1083,7 +1068,6 @@ def _build_content_payload(self, span: Span[Any]) -> ContentPayload:
10831068 elif _is_instance_of (span_data , FunctionSpanData ) and capture_tools :
10841069
10851070 def _serialize_tool_value (value : Any ) -> Optional [str ]:
1086- """Serialize tool payloads while preserving JSON structures."""
10871071 if value is None :
10881072 return None
10891073 if isinstance (value , (dict , list )):
@@ -1799,7 +1783,6 @@ def _merge_content_sequence(
17991783 return result
18001784
18011785 def _clone_message (self , message : Any ) -> Any :
1802- """Return a deep copy of normalized message content."""
18031786 if isinstance (message , dict ):
18041787 return {
18051788 key : self ._clone_message (value )
@@ -1812,7 +1795,6 @@ def _clone_message(self, message: Any) -> Any:
18121795 return message
18131796
18141797 def _is_placeholder_message (self , message : Any ) -> bool :
1815- """Return True when message only contains redacted placeholder text."""
18161798 if not isinstance (message , dict ):
18171799 return False
18181800 parts = message .get ("parts" )
0 commit comments