Skip to content
Merged
Show file tree
Hide file tree
Changes from 3 commits
Commits
Show all changes
40 commits
Select commit Hold shift + click to select a range
4b37996
Initial plan
Copilot Oct 13, 2025
0f94601
Add nagkumar91 to component_owners.yml and rename openai-agents to op…
Copilot Oct 13, 2025
36c61e9
Merge pull request #1 from nagkumar91/copilot/add-nagkumar91-to-compo…
nagkumar91 Oct 13, 2025
3bbc833
Capture agent content via child span aggregation
nagkumar91 Oct 13, 2025
f63cbbf
Capture agent content via child span aggregation
nagkumar91 Oct 13, 2025
48a7747
Add content capture demonstration
nagkumar91 Oct 13, 2025
d6be37d
uv lock update
nagkumar91 Oct 13, 2025
41e3725
Capture agent content via child span aggregation
nagkumar91 Oct 13, 2025
5c369c3
Capture agent content via child span aggregation
nagkumar91 Oct 13, 2025
c57d59b
Add content capture demonstration
nagkumar91 Oct 13, 2025
2c283a6
Align OpenAI agents samples with OTLP exporter
nagkumar91 Oct 13, 2025
dcf1fde
Merge remote-tracking branch 'origin/feature/openai-agents-content-ca…
nagkumar91 Oct 13, 2025
9e20abb
Merge branch 'main' into feature/openai-agents-content-capture
nagkumar91 Oct 13, 2025
5535cd3
Restore GenAI semantic processor instrumentation
nagkumar91 Oct 13, 2025
1daffb3
update changelog
nagkumar91 Oct 13, 2025
d666678
Remove OpenAI Agents event emission
nagkumar91 Oct 13, 2025
f75132f
Align constants with GenAI semantic conventions
nagkumar91 Oct 13, 2025
80f64b7
Add env fallbacks for agent configuration
nagkumar91 Oct 13, 2025
4acdc2b
Provide default agent configuration values
nagkumar91 Oct 13, 2025
a056a00
Fix agent span message aggregation
nagkumar91 Oct 14, 2025
c9aee0e
Merge branch 'main' into feature/openai-agents-content-capture
nagkumar91 Oct 14, 2025
4820302
Merge branch 'main' into feature/openai-agents-content-capture
nagkumar91 Oct 14, 2025
54675a0
Collapse GenAI helpers into span_processor
nagkumar91 Oct 14, 2025
8c4457d
Update span processor unit tests
nagkumar91 Oct 14, 2025
29fb58f
Propagate request model to agent spans
nagkumar91 Oct 14, 2025
d24dd3f
Rename chat spans with resolved models
nagkumar91 Oct 14, 2025
ce897b9
Annotate root spans with operation name
nagkumar91 Oct 14, 2025
3ab9179
Record finish reasons on generation spans
nagkumar91 Oct 14, 2025
2b9dc6c
Depend on util-genai helpers
nagkumar91 Oct 14, 2025
e01bc21
Merge branch 'main' into feature/openai-agents-content-capture
nagkumar91 Oct 14, 2025
f665c90
Normalize span naming constants
nagkumar91 Oct 14, 2025
4b85acd
Return parsed server attributes on error
nagkumar91 Oct 14, 2025
baa72fe
docs: add missing docstrings for span processor
nagkumar91 Oct 14, 2025
1697f3d
refactor: drop legacy span name overrides
nagkumar91 Oct 14, 2025
fae3b26
revert: restore original span processor
nagkumar91 Oct 14, 2025
c3a992e
refactor: remove legacy span overrides
nagkumar91 Oct 14, 2025
29c4ceb
fix: guard token histogram before recording metrics
nagkumar91 Oct 14, 2025
e887859
chore: reuse semantic attribute symbols in metrics
nagkumar91 Oct 14, 2025
cd0acb2
chore: remove server attr fallback
nagkumar91 Oct 14, 2025
bcefa75
Merge branch 'main' into feature/openai-agents-content-capture
nagkumar91 Oct 15, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
# OpenAI Agents Content Capture Demo

This example exercises the `OpenAIAgentsInstrumentor` with message content
capture enabled, illustrating how prompts, responses, and tool payloads are
recorded on spans and span events.

> The demo uses the local tracing utilities from the `openai-agents`
> package—no outbound API calls are made.

## Prerequisites

1. Activate the repository virtual environment:

```bash
source ../../../../.venv/bin/activate
```

2. Ensure `openai-agents` is installed in the environment (it is included in
the shared development venv for this repository).

## Run the demo

```bash
python main.py
```

The script will:

- Configure the OpenTelemetry SDK with a console span exporter.
- Instrument the OpenAI Agents tracing hooks with content capture enabled.
- Simulate an agent invocation that performs a generation and a tool call.
- Print the resulting spans, attributes, and events (including JSON-encoded
prompts and responses) to stdout.

## Customisation tips

- Set `OTEL_SERVICE_NAME` before running to override the default service name.
- Swap the `ConsoleSpanExporter` in `demo.py` for an OTLP exporter if you want
to ship spans to a collector.
- Modify the prompts, tool payloads, or add additional spans in `run_workflow`
to explore different content capture scenarios.
Original file line number Diff line number Diff line change
@@ -0,0 +1,117 @@
"""
Content capture demo for the OpenAI Agents instrumentation.

This script spins up the instrumentation with message capture enabled and
simulates an agent invocation plus a tool call using the tracing helpers from
the ``openai-agents`` package. Spans are exported to the console so you can
inspect captured prompts, responses, and tool payloads without making any
OpenAI API calls.
"""

from __future__ import annotations

import json
import os
from typing import Any

from agents.tracing import agent_span, function_span, generation_span, trace

from opentelemetry.instrumentation.openai_agents import (
OpenAIAgentsInstrumentor,
)
from opentelemetry.sdk.resources import Resource
from opentelemetry.sdk.trace import TracerProvider
from opentelemetry.sdk.trace.export import (
ConsoleSpanExporter,
SimpleSpanProcessor,
)


def configure_tracing() -> None:
"""Configure a tracer provider that writes spans to stdout."""
resource = Resource.create(
{
"service.name": os.environ.get(
"OTEL_SERVICE_NAME", "openai-agents-content-capture-demo"
)
}
)
provider = TracerProvider(resource=resource)
provider.add_span_processor(SimpleSpanProcessor(ConsoleSpanExporter()))

# Instrument with explicit content capture mode to ensure prompts/responses are recorded.
OpenAIAgentsInstrumentor().instrument(
tracer_provider=provider,
capture_message_content="span_and_event",
system="openai",
agent_name="Travel Concierge",
base_url="https://api.openai.com/v1",
)


def dump(title: str, payload: Any) -> None:
"""Pretty-print helper used to show intermediate context."""
print(f"\n=== {title} ===")
print(json.dumps(payload, indent=2))


def run_workflow() -> None:
"""Simulate an agent workflow with a generation and a tool invocation."""
itinerary_prompt = [
{"role": "system", "content": "Plan high level travel itineraries."},
{
"role": "user",
"content": "I'm visiting Paris for 3 days in November.",
},
]

tool_args = {"city": "Paris", "date": "2025-11-12"}
tool_result = {
"forecast": "Mostly sunny, highs 15°C",
"packing_tips": ["light jacket", "comfortable shoes"],
}

with trace("travel-booking-workflow"):
with agent_span(operation="invoke", name="travel_planner") as agent:
dump(
"Agent span started",
{"span_id": agent.span_id, "trace_id": agent.trace_id},
)

with generation_span(
input=itinerary_prompt,
output=[
{
"role": "assistant",
"content": (
"Day 1 visit the Louvre, Day 2 tour Versailles, "
"Day 3 explore Montmartre."
),
}
],
model="gpt-4o-mini",
usage={
"input_tokens": 128,
"output_tokens": 96,
"total_tokens": 224,
},
):
pass

with function_span(
name="fetch_weather",
input=json.dumps(tool_args),
output=tool_result,
):
pass

print("\nWorkflow complete – spans exported to console above.")


def main() -> None:
configure_tracing()
run_workflow()


if __name__ == "__main__":
main()
Loading
Loading