diff --git a/.changeset/clever-needles-flow.md b/.changeset/clever-needles-flow.md new file mode 100644 index 00000000..127f3a6d --- /dev/null +++ b/.changeset/clever-needles-flow.md @@ -0,0 +1,6 @@ +--- +"@openai/agents-core": patch +"@openai/agents-openai": patch +--- + +Add OpenAI Response object on ResponseSpanData for other exporters. diff --git a/packages/agents-core/src/tracing/spans.ts b/packages/agents-core/src/tracing/spans.ts index 6e39b168..850178cc 100644 --- a/packages/agents-core/src/tracing/spans.ts +++ b/packages/agents-core/src/tracing/spans.ts @@ -38,6 +38,7 @@ export type ResponseSpanData = SpanDataBase & { * Not used by the OpenAI tracing provider but helpful for other tracing providers. */ _input?: string | Record[]; + _response?: Record; }; export type HandoffSpanData = SpanDataBase & { diff --git a/packages/agents-core/test/tracing.test.ts b/packages/agents-core/test/tracing.test.ts index 624679bf..32ef1fdb 100644 --- a/packages/agents-core/test/tracing.test.ts +++ b/packages/agents-core/test/tracing.test.ts @@ -10,7 +10,12 @@ import { import { Trace, NoopTrace } from '../src/tracing/traces'; -import { Span, CustomSpanData, NoopSpan } from '../src/tracing/spans'; +import { + Span, + CustomSpanData, + ResponseSpanData, + NoopSpan, +} from '../src/tracing/spans'; import { BatchTraceProcessor, @@ -301,3 +306,27 @@ describe('TraceProvider disabled behaviour', () => { expect(span).toBeInstanceOf(NoopSpan); }); }); + +// ----------------------------------------------------------------------------------------- +// Tests for ResponseSpanData serialization +// ----------------------------------------------------------------------------------------- + +describe('ResponseSpanData serialization', () => { + it('removes private fields _input and _response from JSON output', () => { + const data: ResponseSpanData = { + type: 'response', + response_id: 'resp_123', + _input: 'private input data', + _response: { id: 'response_obj' } as any, + }; + + const span = new Span({ traceId: 'trace_123', data }, new TestProcessor()); + + const json = span.toJSON() as any; + + expect(json.span_data.type).toBe('response'); + expect(json.span_data.response_id).toBe('resp_123'); + expect(json.span_data).not.toHaveProperty('_input'); + expect(json.span_data).not.toHaveProperty('_response'); + }); +}); diff --git a/packages/agents-openai/src/openaiResponsesModel.ts b/packages/agents-openai/src/openaiResponsesModel.ts index c544ad10..26756efa 100644 --- a/packages/agents-openai/src/openaiResponsesModel.ts +++ b/packages/agents-openai/src/openaiResponsesModel.ts @@ -837,9 +837,8 @@ export class OpenAIResponsesModel implements Model { if (request.tracing) { span.spanData.response_id = response.id; - if (request.tracing === true) { - span.spanData._input = request.input; - } + span.spanData._input = request.input; + span.spanData._response = response; } return response; @@ -931,8 +930,9 @@ export class OpenAIResponsesModel implements Model { }; } - if (span && finalResponse && request.tracing) { + if (request.tracing && span && finalResponse) { span.spanData.response_id = finalResponse.id; + span.spanData._response = finalResponse; } } catch (error) { if (span) {