UNPKG

@openai/agents-core

Version:

The OpenAI Agents SDK is a lightweight yet powerful framework for building multi-agent workflows.

164 lines • 4.57 kB
import logger, { logModelAndToolActionError } from "../logger.mjs"; import { generateSpanId, NOOP_TRACE_OR_SPAN_ID, removePrivateFields, timeIso, } from "./utils.mjs"; export class Span { type = 'trace.span'; #data; #traceId; #spanId; #parentId; #traceMetadata; #processor; #startedAt; #endedAt; #error; #tracingApiKey; #previousSpan; constructor(options, processor) { this.#traceId = options.traceId; this.#spanId = options.spanId ?? generateSpanId(); this.#data = options.data; this.#processor = processor; this.#parentId = options.parentId ?? null; this.#traceMetadata = options.traceMetadata; this.#error = options.error ?? null; this.#startedAt = options.startedAt ?? null; this.#endedAt = options.endedAt ?? null; this.#tracingApiKey = options.tracingApiKey; } get traceId() { return this.#traceId; } get spanData() { return this.#data; } get traceMetadata() { return this.#traceMetadata; } get spanId() { return this.#spanId; } get parentId() { return this.#parentId; } get previousSpan() { return this.#previousSpan; } set previousSpan(span) { this.#previousSpan = span; } start() { if (this.#startedAt) { logger.warn('Span already started'); return; } this.#startedAt = timeIso(); void this.#processor.onSpanStart(this).catch((error) => { logModelAndToolActionError(logger, 'Tracing processor failed during span start', error); }); } end() { if (this.#endedAt) { if (logger.dontLogModelData || logger.dontLogToolData) { logger.debug('Span already finished. Span data is redacted.'); } else { logger.debug('Span already finished', this.spanData); } return; } this.#endedAt = timeIso(); void this.#processor.onSpanEnd(this).catch((error) => { logModelAndToolActionError(logger, 'Tracing processor failed during span end', error); }); } setError(error) { this.#error = error; } get error() { return this.#error; } get startedAt() { return this.#startedAt; } get endedAt() { return this.#endedAt; } get tracingApiKey() { return this.#tracingApiKey; } clone() { const span = new Span({ traceId: this.traceId, spanId: this.spanId, parentId: this.parentId ?? undefined, data: this.spanData, traceMetadata: this.traceMetadata, startedAt: this.#startedAt ?? undefined, endedAt: this.#endedAt ?? undefined, error: this.#error ?? undefined, tracingApiKey: this.#tracingApiKey, }, this.#processor); span.previousSpan = this.previousSpan?.clone(); return span; } toJSON() { return { object: this.type, id: this.spanId, trace_id: this.traceId, parent_id: this.parentId, started_at: this.startedAt, ended_at: this.endedAt, span_data: removePrivateFields(serializeSpanData(this.spanData)), error: this.error, }; } } function serializeSpanData(spanData) { if (spanData.type === 'task') { return { type: 'custom', name: 'task', data: { sdk_span_type: 'task', name: spanData.name, ...(spanData.usage ? { usage: spanData.usage } : {}), }, }; } if (spanData.type === 'turn') { return { type: 'custom', name: 'turn', data: { sdk_span_type: 'turn', turn: spanData.turn, agent_name: spanData.agent_name, ...(spanData.usage ? { usage: spanData.usage } : {}), }, }; } return spanData; } export class NoopSpan extends Span { constructor(data, processor) { super({ traceId: NOOP_TRACE_OR_SPAN_ID, spanId: NOOP_TRACE_OR_SPAN_ID, data, }, processor); } start() { return; } end() { return; } setError() { return; } toJSON() { return null; } } //# sourceMappingURL=spans.mjs.map