Skip to content

Commit 29fb58f

Browse files
committed
Propagate request model to agent spans
1 parent 8c4457d commit 29fb58f

File tree

2 files changed

+33
-6
lines changed

2 files changed

+33
-6
lines changed

instrumentation-genai/opentelemetry-instrumentation-openai-agents-v2/src/opentelemetry/instrumentation/openai_agents/span_processor.py

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1099,12 +1099,6 @@ def _update_agent_aggregate(
10991099
self, span: Span[Any], payload: ContentPayload
11001100
) -> None:
11011101
"""Accumulate child span content for parent agent span."""
1102-
if not (
1103-
payload.input_messages
1104-
or payload.output_messages
1105-
or payload.system_instructions
1106-
):
1107-
return
11081102
agent_id = self._find_agent_parent_span_id(span.parent_id)
11091103
if not agent_id:
11101104
return
@@ -1114,6 +1108,7 @@ def _update_agent_aggregate(
11141108
"input_messages": [],
11151109
"output_messages": [],
11161110
"system_instructions": [],
1111+
"request_model": None,
11171112
},
11181113
)
11191114
if payload.input_messages:
@@ -1129,6 +1124,14 @@ def _update_agent_aggregate(
11291124
entry["system_instructions"], payload.system_instructions
11301125
)
11311126

1127+
if not entry.get("request_model"):
1128+
model = getattr(span.span_data, "model", None)
1129+
if not model:
1130+
response_obj = getattr(span.span_data, "response", None)
1131+
model = getattr(response_obj, "model", None)
1132+
if model:
1133+
entry["request_model"] = model
1134+
11321135
def _infer_output_type(self, span_data: Any) -> str:
11331136
"""Infer gen_ai.output.type for multiple span kinds."""
11341137
if _is_instance_of(span_data, FunctionSpanData):
@@ -1311,6 +1314,7 @@ def on_span_start(self, span: Span[Any]) -> None:
13111314
"input_messages": [],
13121315
"output_messages": [],
13131316
"system_instructions": [],
1317+
"request_model": None,
13141318
}
13151319

13161320
parent_span = (
@@ -1801,6 +1805,8 @@ def _get_attributes_from_agent_span_data(
18011805
yield GEN_AI_AGENT_DESCRIPTION, description
18021806

18031807
model = getattr(span_data, "model", None)
1808+
if not model and agent_content:
1809+
model = agent_content.get("request_model")
18041810
if model:
18051811
yield GEN_AI_REQUEST_MODEL, model
18061812

instrumentation-genai/opentelemetry-instrumentation-openai-agents-v2/tests/test_z_span_processor_unit.py

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -326,6 +326,27 @@ def __init__(self) -> None:
326326
assert agent_attrs[sp.GEN_AI_REQUEST_MODEL] == "model-x"
327327
assert agent_attrs[sp.GEN_AI_OUTPUT_TYPE] == sp.GenAIOutputType.TEXT
328328

329+
# Fallback to aggregated model when span data lacks it
330+
agent_span_no_model = AgentSpanData(
331+
name="helper-2",
332+
output_type="json",
333+
description="desc",
334+
agent_id="agent-456",
335+
operation="invoke_agent",
336+
)
337+
agent_content = {
338+
"input_messages": [],
339+
"output_messages": [],
340+
"system_instructions": [],
341+
"request_model": "gpt-fallback",
342+
}
343+
agent_attrs_fallback = _collect(
344+
processor._get_attributes_from_agent_span_data(
345+
agent_span_no_model, agent_content
346+
)
347+
)
348+
assert agent_attrs_fallback[sp.GEN_AI_REQUEST_MODEL] == "gpt-fallback"
349+
329350
function_span = FunctionSpanData(name="lookup_weather")
330351
function_span.tool_type = "extension"
331352
function_span.call_id = "call-42"

0 commit comments

Comments
 (0)