@openai/agents-core
Version:
The OpenAI Agents SDK is a lightweight yet powerful framework for building multi-agent workflows.
164 lines • 4.57 kB
JavaScript
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