Skip to content

Commit c903bdf

Browse files
authored
Merge pull request #13 from AgentOps-AI/agents-responses
Process response data from updated version of OpenAI Agents.
2 parents 65dfefd + 9c29eed commit c903bdf

7 files changed

Lines changed: 152 additions & 246 deletions

File tree

examples/openai-agents-example/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
},
1111
"dependencies": {
1212
"openai": "^4.0.0",
13-
"@openai/agents": "^0.0.1",
13+
"@openai/agents": "^0.0.8",
1414
"agentops": "file:../..",
1515
"zod": "^3.22.0",
1616
"dotenv": "^16.0.0"

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@
4242
"LICENSE"
4343
],
4444
"dependencies": {
45-
"@openai/agents": "^0.0.1",
45+
"@openai/agents": "^0.0.8",
4646
"@opentelemetry/api": "^1.8.0",
4747
"@opentelemetry/exporter-trace-otlp-http": "^0.52.1",
4848
"@opentelemetry/instrumentation": "^0.52.1",

src/instrumentation/openai-agents/attributes.ts

Lines changed: 16 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ import { AttributeMap } from '../../attributes';
1818
import { convertGenerationSpan } from './generation';
1919
import { convertAgentSpan } from './agent';
2020
import { convertFunctionSpan } from './function';
21-
import { convertResponseSpan, convertEnhancedResponseSpan, AgentOpsResponseSpanData } from './response';
21+
import { convertResponseSpan } from './response';
2222
import { convertHandoffSpan } from './handoff';
2323
import { convertCustomSpan } from './custom';
2424
import { convertGuardrailSpan } from './guardrail';
@@ -94,52 +94,46 @@ export function getSpanAttributes(item: OpenAISpan<any>): Record<string, any> {
9494
'openai_agents.trace_id': item.traceId,
9595
};
9696

97-
let typeSpecificAttributes: Record<string, any> = {};
97+
let attributes: Record<string, any> = {};
9898
switch (spanData.type) {
9999
case 'generation':
100-
typeSpecificAttributes = convertGenerationSpan(spanData as GenerationSpanData);
100+
attributes = convertGenerationSpan(spanData as GenerationSpanData);
101101
break;
102102
case 'agent':
103-
typeSpecificAttributes = convertAgentSpan(spanData as AgentSpanData);
103+
attributes = convertAgentSpan(spanData as AgentSpanData);
104104
break;
105105
case 'function':
106-
typeSpecificAttributes = convertFunctionSpan(spanData as FunctionSpanData);
106+
attributes = convertFunctionSpan(spanData as FunctionSpanData);
107107
break;
108108
case 'response':
109-
// Check if this is an enhanced AgentOps response span with generation data
110-
// TODO check this more effectively that this...
111-
if ('agentops_model' in spanData || 'agentops_input_messages' in spanData || 'agentops_output_messages' in spanData || 'agentops_usage' in spanData) {
112-
typeSpecificAttributes = convertEnhancedResponseSpan(spanData as AgentOpsResponseSpanData);
113-
} else {
114-
typeSpecificAttributes = convertResponseSpan(spanData as ResponseSpanData);
115-
}
109+
attributes = convertResponseSpan(spanData as ResponseSpanData);
116110
break;
117111
case 'handoff':
118-
typeSpecificAttributes = convertHandoffSpan(spanData as HandoffSpanData);
112+
attributes = convertHandoffSpan(spanData as HandoffSpanData);
119113
break;
120114
case 'custom':
121-
typeSpecificAttributes = convertCustomSpan(spanData as CustomSpanData);
115+
attributes = convertCustomSpan(spanData as CustomSpanData);
122116
break;
123117
case 'guardrail':
124-
typeSpecificAttributes = convertGuardrailSpan(spanData as GuardrailSpanData);
118+
attributes = convertGuardrailSpan(spanData as GuardrailSpanData);
125119
break;
126120
case 'transcription':
127-
typeSpecificAttributes = convertTranscriptionSpan(spanData as TranscriptionSpanData);
121+
attributes = convertTranscriptionSpan(spanData as TranscriptionSpanData);
128122
break;
129123
case 'speech':
130-
typeSpecificAttributes = convertSpeechSpan(spanData as SpeechSpanData);
124+
attributes = convertSpeechSpan(spanData as SpeechSpanData);
131125
break;
132126
case 'speech_group':
133-
typeSpecificAttributes = convertSpeechGroupSpan(spanData as SpeechGroupSpanData);
127+
attributes = convertSpeechGroupSpan(spanData as SpeechGroupSpanData);
134128
break;
135129
case 'mcp_tools':
136-
typeSpecificAttributes = convertMCPListToolsSpan(spanData as MCPListToolsSpanData);
130+
attributes = convertMCPListToolsSpan(spanData as MCPListToolsSpanData);
137131
break;
138132
default:
139133
// For unknown span types, include the raw span data
140-
typeSpecificAttributes = {'span.raw_data': spanData };
134+
attributes = {'span.raw_data': spanData };
141135
break;
142136
}
143137

144-
return { ...baseAttributes, ...typeSpecificAttributes };
145-
}
138+
return { ...baseAttributes, ...attributes };
139+
}

src/instrumentation/openai-agents/exporter.ts

Lines changed: 0 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -2,17 +2,13 @@ import { trace, context, SpanStatusCode, SpanKind, Span, ROOT_CONTEXT } from '@o
22
import type { TracingExporter, Trace as OpenAITrace, Span as OpenAISpan } from '@openai/agents';
33
import { InstrumentationBase } from '../base';
44
import { getSpanAttributes, getSpanName, getSpanKind } from './attributes';
5-
import type { AgentOpsResponseSpanData } from './response';
65

76

87
export class OpenAIAgentsTracingExporter implements TracingExporter {
98
private readonly instrumentation: InstrumentationBase;
109
private readonly traceMap = new Map<string, Span>(); // OpenAI Agents trace ID -> root OpenTelemetry span
1110
private readonly spanMap = new Map<string, Span>(); // OpenAI Agents span ID -> OpenTelemetry span
1211

13-
// Storage for enhanced response data, keyed by response ID
14-
private readonly enhancedResponseData = new Map<string, Partial<AgentOpsResponseSpanData>>();
15-
1612
/**
1713
* Creates a new OpenAIAgentsTracingExporter instance.
1814
* @param instrumentation The instrumentation base to use for exporting spans.
@@ -21,20 +17,6 @@ export class OpenAIAgentsTracingExporter implements TracingExporter {
2117
this.instrumentation = instrumentation;
2218
}
2319

24-
/**
25-
* Stores enhanced response data for later injection into response spans.
26-
*/
27-
public storeEnhancedResponseData(responseId: string, enhancedData: Partial<AgentOpsResponseSpanData>): void {
28-
this.enhancedResponseData.set(responseId, enhancedData);
29-
}
30-
31-
/**
32-
* Retrieves enhanced response data for a given response ID.
33-
*/
34-
private getEnhancedResponseData(responseId: string): Partial<AgentOpsResponseSpanData> | undefined {
35-
return this.enhancedResponseData.get(responseId);
36-
}
37-
3820
/**
3921
* Exports OpenAI Agents traces and spans to OpenTelemetry spans.
4022
* @param items The items to export, which can be either traces or spans.
@@ -81,15 +63,6 @@ export class OpenAIAgentsTracingExporter implements TracingExporter {
8163
* The span is stored in a map for later reference.
8264
*/
8365
private handleSpan(item: OpenAISpan<any>): void {
84-
// Check if this is a response span that we can enhance with stored generation data
85-
if (item.spanData.type === 'response' && item.spanData.response_id) {
86-
const enhancedData = this.getEnhancedResponseData(item.spanData.response_id);
87-
if (enhancedData) {
88-
// Enhance the span data directly
89-
Object.assign(item.spanData, enhancedData);
90-
}
91-
}
92-
9366
const attributes = getSpanAttributes(item);
9467
const spanName = getSpanName(item.spanData);
9568

src/instrumentation/openai-agents/index.ts

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ import { BatchTraceProcessor, addTraceProcessor, setTracingDisabled } from '@ope
22
import { InstrumentationBase } from '../base';
33
import { InstrumentorMetadata } from '../../types';
44
import { OpenAIAgentsTracingExporter } from './exporter';
5-
import { patchOpenAIResponsesModel } from './response';
65

76
export const debug = require('debug')('agentops:instrumentation:openai-agents');
87

@@ -34,9 +33,6 @@ export class OpenAIAgentsInstrumentation extends InstrumentationBase {
3433
const { getGlobalTraceProvider } = moduleExports;
3534
const globalProvider = getGlobalTraceProvider();
3635
globalProvider.registerProcessor(processor);
37-
38-
// Patch OpenAI Responses model to capture enhanced generation data
39-
patchOpenAIResponsesModel(exporter, moduleExports);
4036
} catch (error) {
4137
console.error('[agentops.instrumentation.openai-agents] failed: ', error);
4238
}

0 commit comments

Comments
 (0)