@cloudbase/agent-observability 1.0.1-alpha.16 → 1.0.1-alpha.18
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{chunk-ZGEMAYS4.mjs → chunk-MUTOOEDR.mjs} +159 -2
- package/dist/chunk-MUTOOEDR.mjs.map +1 -0
- package/dist/{chunk-NFEGQTCC.mjs → chunk-WMJKH4XE.mjs} +8 -1
- package/dist/{esm-PGEDANAI.mjs → esm-M4BB7YBD.mjs} +2 -2
- package/dist/index.d.mts +106 -6
- package/dist/index.d.ts +106 -6
- package/dist/index.js +157 -0
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +2 -2
- package/dist/langchain.d.mts +3 -1
- package/dist/langchain.d.ts +3 -1
- package/dist/langchain.js +187 -6
- package/dist/langchain.js.map +1 -1
- package/dist/langchain.mjs +34 -8
- package/dist/langchain.mjs.map +1 -1
- package/dist/server.d.mts +69 -1
- package/dist/server.d.ts +69 -1
- package/dist/server.js +83 -4
- package/dist/server.js.map +1 -1
- package/dist/server.mjs +83 -6
- package/dist/server.mjs.map +1 -1
- package/package.json +2 -2
- package/src/core/attributes.ts +243 -2
- package/src/core/spanWrapper.ts +5 -5
- package/src/index.ts +12 -6
- package/src/langchain/CallbackHandler.ts +44 -6
- package/src/langchain/index.ts +1 -1
- package/src/server/SingleLineConsoleSpanExporter.ts +131 -0
- package/src/server/index.ts +8 -2
- package/src/server/setup.ts +19 -4
- package/src/types.ts +108 -5
- package/dist/chunk-ZGEMAYS4.mjs.map +0 -1
- /package/dist/{chunk-NFEGQTCC.mjs.map → chunk-WMJKH4XE.mjs.map} +0 -0
- /package/dist/{esm-PGEDANAI.mjs.map → esm-M4BB7YBD.mjs.map} +0 -0
package/dist/langchain.mjs
CHANGED
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
import {
|
|
2
2
|
init_src,
|
|
3
3
|
startObservation
|
|
4
|
-
} from "./chunk-
|
|
5
|
-
import
|
|
4
|
+
} from "./chunk-MUTOOEDR.mjs";
|
|
5
|
+
import {
|
|
6
|
+
__require
|
|
7
|
+
} from "./chunk-WMJKH4XE.mjs";
|
|
6
8
|
|
|
7
9
|
// src/langchain/CallbackHandler.ts
|
|
8
10
|
init_src();
|
|
@@ -26,6 +28,8 @@ var CallbackHandler = class extends BaseCallbackHandler {
|
|
|
26
28
|
last_trace_id = null;
|
|
27
29
|
// External parent context from AG-UI.Server span
|
|
28
30
|
externalParentSpanContext;
|
|
31
|
+
// External metadata from AG-UI.Server (e.g., threadId, runId)
|
|
32
|
+
externalMetadata;
|
|
29
33
|
// Adapter name for ROOT span prefix
|
|
30
34
|
adapterName;
|
|
31
35
|
// Logger for debug output (defaults to noopLogger for silent operation)
|
|
@@ -47,10 +51,12 @@ var CallbackHandler = class extends BaseCallbackHandler {
|
|
|
47
51
|
* to the server-level span, creating a unified trace hierarchy.
|
|
48
52
|
*
|
|
49
53
|
* @param spanContext - SpanContext from the AG-UI.Server span
|
|
54
|
+
* @param metadata - Optional metadata from server (e.g., threadId, runId)
|
|
50
55
|
* @public
|
|
51
56
|
*/
|
|
52
|
-
setExternalParentContext(spanContext) {
|
|
57
|
+
setExternalParentContext(spanContext, metadata) {
|
|
53
58
|
this.externalParentSpanContext = spanContext;
|
|
59
|
+
this.externalMetadata = metadata;
|
|
54
60
|
}
|
|
55
61
|
async handleLLMNewToken(token, _idx, runId, _parentRunId, _tags, _fields) {
|
|
56
62
|
if (runId && !(runId in this.completionStartTimes)) {
|
|
@@ -80,7 +86,7 @@ var CallbackHandler = class extends BaseCallbackHandler {
|
|
|
80
86
|
parentRunId,
|
|
81
87
|
runId,
|
|
82
88
|
tags,
|
|
83
|
-
metadata,
|
|
89
|
+
metadata: this.joinTagsAndMetaData(tags, metadata),
|
|
84
90
|
attributes: {
|
|
85
91
|
input: finalInput
|
|
86
92
|
},
|
|
@@ -161,10 +167,15 @@ var CallbackHandler = class extends BaseCallbackHandler {
|
|
|
161
167
|
}
|
|
162
168
|
}
|
|
163
169
|
let extractedModelName;
|
|
170
|
+
let extractedSystem;
|
|
171
|
+
let extractedProvider;
|
|
164
172
|
if (extraParams) {
|
|
165
173
|
const invocationParamsModelName = extraParams.invocation_params.model;
|
|
166
174
|
const metadataModelName = metadata && "ls_model_name" in metadata ? metadata["ls_model_name"] : void 0;
|
|
167
175
|
extractedModelName = invocationParamsModelName ?? metadataModelName;
|
|
176
|
+
if (metadata && "ls_provider" in metadata) {
|
|
177
|
+
extractedProvider = metadata["ls_provider"];
|
|
178
|
+
}
|
|
168
179
|
}
|
|
169
180
|
const registeredPrompt = this.promptToParentRunMap.get(
|
|
170
181
|
parentRunId ?? "root"
|
|
@@ -257,7 +268,7 @@ var CallbackHandler = class extends BaseCallbackHandler {
|
|
|
257
268
|
attributes: {
|
|
258
269
|
input
|
|
259
270
|
},
|
|
260
|
-
metadata,
|
|
271
|
+
metadata: this.joinTagsAndMetaData(tags, metadata),
|
|
261
272
|
tags,
|
|
262
273
|
asType: "tool"
|
|
263
274
|
});
|
|
@@ -276,7 +287,7 @@ var CallbackHandler = class extends BaseCallbackHandler {
|
|
|
276
287
|
input: query
|
|
277
288
|
},
|
|
278
289
|
tags,
|
|
279
|
-
metadata,
|
|
290
|
+
metadata: this.joinTagsAndMetaData(tags, metadata),
|
|
280
291
|
asType: "span"
|
|
281
292
|
});
|
|
282
293
|
} catch (e) {
|
|
@@ -422,12 +433,14 @@ var CallbackHandler = class extends BaseCallbackHandler {
|
|
|
422
433
|
if (!parentRunId && this.adapterName) {
|
|
423
434
|
finalRunName = `Adapter.${this.adapterName}`;
|
|
424
435
|
}
|
|
436
|
+
const serverMetadata = this.externalMetadata ? { "agui.thread_id": this.externalMetadata.threadId, "agui.run_id": this.externalMetadata.runId } : {};
|
|
425
437
|
const observation = startObservation(
|
|
426
438
|
finalRunName,
|
|
427
439
|
{
|
|
428
440
|
version: this.version,
|
|
429
441
|
metadata: this.joinTagsAndMetaData(tags, metadata),
|
|
430
|
-
...attributes
|
|
442
|
+
...attributes,
|
|
443
|
+
...serverMetadata
|
|
431
444
|
},
|
|
432
445
|
{
|
|
433
446
|
asType: asType ?? "span",
|
|
@@ -444,6 +457,19 @@ var CallbackHandler = class extends BaseCallbackHandler {
|
|
|
444
457
|
this.logger.warn?.("Observation not found in runMap. Skipping operation.");
|
|
445
458
|
return;
|
|
446
459
|
}
|
|
460
|
+
const level = attributes.level;
|
|
461
|
+
const statusMessage = attributes.statusMessage;
|
|
462
|
+
if (level === "ERROR") {
|
|
463
|
+
try {
|
|
464
|
+
const { SpanStatusCode } = __require("@opentelemetry/api");
|
|
465
|
+
observation.otelSpan.setStatus({
|
|
466
|
+
code: SpanStatusCode.ERROR,
|
|
467
|
+
message: statusMessage || "Unknown error"
|
|
468
|
+
});
|
|
469
|
+
} catch (e) {
|
|
470
|
+
this.logger.debug?.("Failed to set span error status:", e);
|
|
471
|
+
}
|
|
472
|
+
}
|
|
447
473
|
observation.update(attributes).end();
|
|
448
474
|
this.last_trace_id = observation.traceId;
|
|
449
475
|
this.runMap.delete(runId);
|
|
@@ -465,7 +491,7 @@ var CallbackHandler = class extends BaseCallbackHandler {
|
|
|
465
491
|
if (!metadata) {
|
|
466
492
|
return;
|
|
467
493
|
}
|
|
468
|
-
const reservedKeys = ["promptInfo", "userId", "sessionId"];
|
|
494
|
+
const reservedKeys = ["promptInfo", "userId", "sessionId", "thread_id", "runId", "run_id"];
|
|
469
495
|
return Object.fromEntries(
|
|
470
496
|
Object.entries(metadata).filter(([key, _]) => !reservedKeys.includes(key))
|
|
471
497
|
);
|
package/dist/langchain.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/langchain/CallbackHandler.ts"],"sourcesContent":["/**\n * LangChain Callback Handler for AG-Kit Observability\n *\n * Converts LangChain callback events into AG-Kit observations with OpenInference semantics.\n */\n\nimport type { AgentAction, AgentFinish } from \"@langchain/core/agents\";\nimport { BaseCallbackHandler } from \"@langchain/core/callbacks/base\";\nimport type { Document } from \"@langchain/core/documents\";\nimport type { Serialized } from \"@langchain/core/load/serializable\";\nimport {\n AIMessage,\n AIMessageChunk,\n BaseMessage,\n type UsageMetadata,\n type BaseMessageFields,\n type MessageContent,\n} from \"@langchain/core/messages\";\nimport type { Generation, LLMResult } from \"@langchain/core/outputs\";\nimport type { ChainValues } from \"@langchain/core/utils/types\";\n\nimport {\n startObservation,\n type ObservationLLM,\n type ObservationSpan,\n type ObservationTool,\n type Observation,\n type ObservationAttributes,\n} from \"../index.js\";\nimport type { SpanContext } from \"@opentelemetry/api\";\nimport { type Logger, noopLogger } from \"@cloudbase/agent-shared\";\n\n/**\n * Constructor parameters for CallbackHandler.\n *\n * @public\n */\ntype ConstructorParams = {\n userId?: string;\n sessionId?: string;\n tags?: string[];\n version?: string;\n traceMetadata?: Record<string, unknown>;\n adapterName?: string; // e.g., \"LangGraph\" or \"LangChain\"\n /** Logger for debug output. Defaults to noopLogger (silent). */\n logger?: Logger;\n};\n\n/**\n * Message format for LLM input/output.\n *\n * @public\n */\nexport type LlmMessage = {\n role: string;\n content: BaseMessageFields[\"content\"];\n additional_kwargs?: BaseMessageFields[\"additional_kwargs\"];\n};\n\n/**\n * Anonymous message format (without role).\n *\n * @public\n */\nexport type AnonymousLlmMessage = {\n content: BaseMessageFields[\"content\"];\n additional_kwargs?: BaseMessageFields[\"additional_kwargs\"];\n};\n\n/**\n * Prompt information for linking to generations.\n *\n * @public\n */\ntype PromptInfo = {\n name: string;\n version: number;\n isFallback: boolean;\n};\n\n/**\n * LangChain Callback Handler for AG-Kit Observability.\n *\n * This handler intercepts LangChain callbacks and converts them into\n * AG-Kit observations following OpenInference semantic conventions.\n *\n * @public\n */\nexport class CallbackHandler extends BaseCallbackHandler {\n name = \"ObservabilityCallbackHandler\";\n\n private userId?: string;\n private version?: string;\n private sessionId?: string;\n private tags: string[];\n private traceMetadata?: Record<string, unknown>;\n\n private completionStartTimes: Record<string, Date> = {};\n private promptToParentRunMap;\n private runMap: Map<string, Observation> = new Map();\n\n public last_trace_id: string | null = null;\n\n // External parent context from AG-UI.Server span\n private externalParentSpanContext?: SpanContext;\n\n // Adapter name for ROOT span prefix\n private adapterName?: string;\n\n // Logger for debug output (defaults to noopLogger for silent operation)\n private logger: Logger;\n\n constructor(params?: ConstructorParams) {\n super();\n\n this.sessionId = params?.sessionId;\n this.userId = params?.userId;\n this.tags = params?.tags ?? [];\n this.traceMetadata = params?.traceMetadata;\n this.version = params?.version;\n this.adapterName = params?.adapterName;\n this.logger = params?.logger ?? noopLogger;\n\n this.promptToParentRunMap = new Map<string, PromptInfo>();\n }\n\n /**\n * Set external parent SpanContext from AG-UI.Server span.\n * This allows the CallbackHandler to link LangChain/LangGraph spans\n * to the server-level span, creating a unified trace hierarchy.\n *\n * @param spanContext - SpanContext from the AG-UI.Server span\n * @public\n */\n setExternalParentContext(spanContext: SpanContext): void {\n this.externalParentSpanContext = spanContext;\n }\n\n async handleLLMNewToken(\n token: string,\n _idx: any,\n runId: string,\n _parentRunId?: string,\n _tags?: string[],\n _fields?: any\n ): Promise<void> {\n if (runId && !(runId in this.completionStartTimes)) {\n this.logger.debug?.(`LLM first streaming token: ${runId}`);\n this.completionStartTimes[runId] = new Date();\n }\n }\n\n async handleChainStart(\n chain: Serialized,\n inputs: ChainValues,\n runId: string,\n parentRunId?: string | undefined,\n tags?: string[] | undefined,\n metadata?: Record<string, unknown> | undefined,\n runType?: string,\n name?: string\n ): Promise<void> {\n try {\n this.logger.debug?.(`Chain start with Id: ${runId}`);\n\n const runName = name ?? chain.id.at(-1)?.toString() ?? \"Langchain Run\";\n\n this.registerPromptInfo(parentRunId, metadata);\n\n let finalInput: string | ChainValues = inputs;\n if (\n typeof inputs === \"object\" &&\n \"input\" in inputs &&\n Array.isArray(inputs[\"input\"]) &&\n inputs[\"input\"].every((m: unknown) => m instanceof BaseMessage)\n ) {\n finalInput = inputs[\"input\"].map((m: BaseMessage) =>\n this.extractChatMessageContent(m)\n );\n } else if (\n typeof inputs === \"object\" &&\n \"messages\" in inputs &&\n Array.isArray(inputs[\"messages\"]) &&\n inputs[\"messages\"].every((m: unknown) => m instanceof BaseMessage)\n ) {\n finalInput = inputs[\"messages\"].map((m: BaseMessage) =>\n this.extractChatMessageContent(m)\n );\n } else if (\n typeof inputs === \"object\" &&\n \"content\" in inputs &&\n typeof inputs[\"content\"] === \"string\"\n ) {\n finalInput = inputs[\"content\"];\n }\n\n const observation = this.startAndRegisterObservation({\n runName,\n parentRunId,\n runId,\n tags,\n metadata,\n attributes: {\n input: finalInput,\n },\n asType: \"span\",\n });\n\n const traceTags = [...new Set([...(tags ?? []), ...this.tags])];\n\n if (!parentRunId) {\n observation.updateTrace({\n tags: traceTags,\n userId:\n metadata &&\n \"userId\" in metadata &&\n typeof metadata[\"userId\"] === \"string\"\n ? metadata[\"userId\"]\n : this.userId,\n sessionId:\n metadata &&\n \"sessionId\" in metadata &&\n typeof metadata[\"sessionId\"] === \"string\"\n ? metadata[\"sessionId\"]\n : this.sessionId,\n metadata: this.traceMetadata,\n version: this.version,\n });\n }\n } catch (e) {\n this.logger.debug?.(e instanceof Error ? e.message : String(e));\n }\n }\n\n async handleAgentAction(\n action: AgentAction,\n runId: string,\n parentRunId?: string\n ): Promise<void> {\n try {\n this.logger.debug?.(`Agent action ${action.tool} with ID: ${runId}`);\n this.startAndRegisterObservation({\n runId,\n parentRunId,\n runName: action.tool,\n attributes: {\n input: action,\n },\n asType: \"tool\",\n });\n } catch (e) {\n this.logger.debug?.(e instanceof Error ? e.message : String(e));\n }\n }\n\n async handleAgentEnd?(\n action: AgentFinish,\n runId: string,\n _parentRunId?: string\n ): Promise<void> {\n try {\n this.logger.debug?.(`Agent finish with ID: ${runId}`);\n this.handleObservationEnd({\n runId,\n attributes: { output: action },\n });\n } catch (e) {\n this.logger.debug?.(e instanceof Error ? e.message : String(e));\n }\n }\n\n async handleChainError(\n err: any,\n runId: string,\n _parentRunId?: string | undefined\n ): Promise<void> {\n try {\n this.logger.debug?.(`Chain error: ${err} with ID: ${runId}`);\n this.handleObservationEnd({\n runId,\n attributes: {\n level: \"ERROR\",\n statusMessage: err.toString(),\n },\n });\n } catch (e) {\n this.logger.debug?.(e instanceof Error ? e.message : String(e));\n }\n }\n\n async handleGenerationStart(\n llm: Serialized,\n messages: (LlmMessage | MessageContent | AnonymousLlmMessage)[],\n runId: string,\n parentRunId?: string | undefined,\n extraParams?: Record<string, unknown> | undefined,\n tags?: string[] | undefined,\n metadata?: Record<string, unknown> | undefined,\n name?: string\n ): Promise<void> {\n this.logger.debug?.(\n `Generation start with ID: ${runId} and parentRunId ${parentRunId}`\n );\n\n const runName = name ?? llm.id.at(-1)?.toString() ?? \"Langchain Generation\";\n\n const modelParameters: Record<string, any> = {};\n const invocationParams = extraParams?.[\"invocation_params\"];\n\n for (const [key, value] of Object.entries({\n temperature: (invocationParams as any)?.temperature,\n max_tokens: (invocationParams as any)?.max_tokens,\n top_p: (invocationParams as any)?.top_p,\n frequency_penalty: (invocationParams as any)?.frequency_penalty,\n presence_penalty: (invocationParams as any)?.presence_penalty,\n request_timeout: (invocationParams as any)?.request_timeout,\n })) {\n if (value !== undefined && value !== null) {\n modelParameters[key] = value;\n }\n }\n\n interface InvocationParams {\n _type?: string;\n model?: string;\n model_name?: string;\n repo_id?: string;\n }\n\n let extractedModelName: string | undefined;\n if (extraParams) {\n const invocationParamsModelName = (\n extraParams.invocation_params as InvocationParams\n ).model;\n const metadataModelName =\n metadata && \"ls_model_name\" in metadata\n ? (metadata[\"ls_model_name\"] as string)\n : undefined;\n\n extractedModelName = invocationParamsModelName ?? metadataModelName;\n }\n\n const registeredPrompt = this.promptToParentRunMap.get(\n parentRunId ?? \"root\"\n );\n if (registeredPrompt && parentRunId) {\n this.deregisterPromptInfo(parentRunId);\n }\n\n this.startAndRegisterObservation({\n runId,\n parentRunId,\n metadata,\n tags,\n runName,\n attributes: {\n input: messages,\n model: extractedModelName,\n modelParameters: modelParameters,\n },\n asType: \"llm\",\n });\n }\n\n async handleChatModelStart(\n llm: Serialized,\n messages: BaseMessage[][],\n runId: string,\n parentRunId?: string | undefined,\n extraParams?: Record<string, unknown> | undefined,\n tags?: string[] | undefined,\n metadata?: Record<string, unknown> | undefined,\n name?: string\n ): Promise<void> {\n try {\n this.logger.debug?.(`Chat model start with ID: ${runId}`);\n\n const prompts = messages.flatMap((message) =>\n message.map((m) => this.extractChatMessageContent(m))\n );\n\n this.handleGenerationStart(\n llm,\n prompts,\n runId,\n parentRunId,\n extraParams,\n tags,\n metadata,\n name\n );\n } catch (e) {\n this.logger.debug?.(e instanceof Error ? e.message : String(e));\n }\n }\n\n async handleChainEnd(\n outputs: ChainValues,\n runId: string,\n _parentRunId?: string | undefined\n ): Promise<void> {\n try {\n this.logger.debug?.(`Chain end with ID: ${runId}`);\n\n let finalOutput: ChainValues | string = outputs;\n if (\n typeof outputs === \"object\" &&\n \"output\" in outputs &&\n typeof outputs[\"output\"] === \"string\"\n ) {\n finalOutput = outputs[\"output\"];\n } else if (\n typeof outputs === \"object\" &&\n \"messages\" in outputs &&\n Array.isArray(outputs[\"messages\"]) &&\n outputs[\"messages\"].every((m: unknown) => m instanceof BaseMessage)\n ) {\n finalOutput = {\n messages: outputs.messages.map((message: BaseMessage) =>\n this.extractChatMessageContent(message)\n ),\n };\n }\n\n this.handleObservationEnd({\n runId,\n attributes: {\n output: finalOutput,\n },\n });\n this.deregisterPromptInfo(runId);\n } catch (e) {\n this.logger.debug?.(e instanceof Error ? e.message : String(e));\n }\n }\n\n async handleLLMStart(\n llm: Serialized,\n prompts: string[],\n runId: string,\n parentRunId?: string | undefined,\n extraParams?: Record<string, unknown> | undefined,\n tags?: string[] | undefined,\n metadata?: Record<string, unknown> | undefined,\n name?: string\n ): Promise<void> {\n try {\n this.logger.debug?.(`LLM start with ID: ${runId}`);\n this.handleGenerationStart(\n llm,\n prompts,\n runId,\n parentRunId,\n extraParams,\n tags,\n metadata,\n name\n );\n } catch (e) {\n this.logger.debug?.(e instanceof Error ? e.message : String(e));\n }\n }\n\n async handleToolStart(\n tool: Serialized,\n input: string,\n runId: string,\n parentRunId?: string | undefined,\n tags?: string[] | undefined,\n metadata?: Record<string, unknown> | undefined,\n name?: string\n ): Promise<void> {\n try {\n this.logger.debug?.(`Tool start with ID: ${runId}`);\n this.startAndRegisterObservation({\n runId,\n parentRunId,\n runName: name ?? tool.id.at(-1)?.toString() ?? \"Tool execution\",\n attributes: {\n input,\n },\n metadata,\n tags,\n asType: \"tool\",\n });\n } catch (e) {\n this.logger.debug?.(e instanceof Error ? e.message : String(e));\n }\n }\n\n async handleRetrieverStart(\n retriever: Serialized,\n query: string,\n runId: string,\n parentRunId?: string | undefined,\n tags?: string[] | undefined,\n metadata?: Record<string, unknown> | undefined,\n name?: string\n ): Promise<void> {\n try {\n this.logger.debug?.(`Retriever start with ID: ${runId}`);\n this.startAndRegisterObservation({\n runId,\n parentRunId,\n runName: name ?? retriever.id.at(-1)?.toString() ?? \"Retriever\",\n attributes: {\n input: query,\n },\n tags,\n metadata,\n asType: \"span\",\n });\n } catch (e) {\n this.logger.debug?.(e instanceof Error ? e.message : String(e));\n }\n }\n\n async handleRetrieverEnd(\n documents: Document<Record<string, any>>[],\n runId: string,\n _parentRunId?: string | undefined\n ): Promise<void> {\n try {\n this.logger.debug?.(`Retriever end with ID: ${runId}`);\n this.handleObservationEnd({\n runId,\n attributes: {\n output: documents,\n },\n });\n } catch (e) {\n this.logger.debug?.(e instanceof Error ? e.message : String(e));\n }\n }\n\n async handleRetrieverError(\n err: any,\n runId: string,\n _parentRunId?: string | undefined\n ): Promise<void> {\n try {\n this.logger.debug?.(`Retriever error: ${err} with ID: ${runId}`);\n this.handleObservationEnd({\n runId,\n attributes: {\n level: \"ERROR\",\n statusMessage: err.toString(),\n },\n });\n } catch (e) {\n this.logger.debug?.(e instanceof Error ? e.message : String(e));\n }\n }\n\n async handleToolEnd(\n output: string,\n runId: string,\n _parentRunId?: string | undefined\n ): Promise<void> {\n try {\n this.logger.debug?.(`Tool end with ID: ${runId}`);\n this.handleObservationEnd({\n runId,\n attributes: { output },\n });\n } catch (e) {\n this.logger.debug?.(e instanceof Error ? e.message : String(e));\n }\n }\n\n async handleToolError(\n err: any,\n runId: string,\n _parentRunId?: string | undefined\n ): Promise<void> {\n try {\n this.logger.debug?.(`Tool error ${err} with ID: ${runId}`);\n this.handleObservationEnd({\n runId,\n attributes: {\n level: \"ERROR\",\n statusMessage: err.toString(),\n },\n });\n } catch (e) {\n this.logger.debug?.(e instanceof Error ? e.message : String(e));\n }\n }\n\n async handleLLMEnd(\n output: LLMResult,\n runId: string,\n _parentRunId?: string | undefined\n ): Promise<void> {\n try {\n this.logger.debug?.(`LLM end with ID: ${runId}`);\n\n const lastResponse =\n output.generations[output.generations.length - 1][\n output.generations[output.generations.length - 1].length - 1\n ];\n const llmUsage =\n this.extractUsageMetadata(lastResponse) ??\n output.llmOutput?.[\"tokenUsage\"];\n const modelName = this.extractModelNameFromMetadata(lastResponse);\n\n const usageDetails: Record<string, any> = {\n input:\n llmUsage?.input_tokens ??\n (\"promptTokens\" in llmUsage ? llmUsage?.promptTokens : undefined),\n output:\n llmUsage?.output_tokens ??\n (\"completionTokens\" in llmUsage\n ? llmUsage?.completionTokens\n : undefined),\n total:\n llmUsage?.total_tokens ??\n (\"totalTokens\" in llmUsage ? llmUsage?.totalTokens : undefined),\n };\n\n if (llmUsage && \"input_token_details\" in llmUsage) {\n for (const [key, val] of Object.entries(\n llmUsage[\"input_token_details\"] ?? {}\n )) {\n usageDetails[`input_${key}`] = val;\n if (\"input\" in usageDetails && typeof val === \"number\") {\n usageDetails[\"input\"] = Math.max(0, usageDetails[\"input\"] - val);\n }\n }\n }\n\n if (llmUsage && \"output_token_details\" in llmUsage) {\n for (const [key, val] of Object.entries(\n llmUsage[\"output_token_details\"] ?? {}\n )) {\n usageDetails[`output_${key}`] = val;\n if (\"output\" in usageDetails && typeof val === \"number\") {\n usageDetails[\"output\"] = Math.max(0, usageDetails[\"output\"] - val);\n }\n }\n }\n\n const extractedOutput =\n \"message\" in lastResponse\n ? this.extractChatMessageContent(\n lastResponse[\"message\"] as BaseMessage\n )\n : lastResponse.text;\n\n this.handleObservationEnd({\n runId,\n attributes: {\n model: modelName,\n output: extractedOutput,\n completionStartTime:\n runId in this.completionStartTimes\n ? this.completionStartTimes[runId]\n : undefined,\n usageDetails: usageDetails,\n },\n });\n\n if (runId in this.completionStartTimes) {\n delete this.completionStartTimes[runId];\n }\n } catch (e) {\n this.logger.debug?.(e instanceof Error ? e.message : String(e));\n }\n }\n\n async handleLLMError(\n err: any,\n runId: string,\n _parentRunId?: string | undefined\n ): Promise<void> {\n try {\n this.logger.debug?.(`LLM error ${err} with ID: ${runId}`);\n this.handleObservationEnd({\n runId,\n attributes: {\n level: \"ERROR\",\n statusMessage: err.toString(),\n },\n });\n } catch (e) {\n this.logger.debug?.(e instanceof Error ? e.message : String(e));\n }\n }\n\n private registerPromptInfo(\n parentRunId?: string,\n metadata?: Record<string, unknown>\n ): void {\n if (metadata && \"promptInfo\" in metadata && parentRunId) {\n this.promptToParentRunMap.set(\n parentRunId,\n metadata.promptInfo as PromptInfo\n );\n }\n }\n\n private deregisterPromptInfo(runId: string): void {\n this.promptToParentRunMap.delete(runId);\n }\n\n private startAndRegisterObservation(params: {\n runName: string;\n runId: string;\n parentRunId?: string;\n attributes: Record<string, unknown>;\n metadata?: Record<string, unknown>;\n tags?: string[];\n asType?: \"span\" | \"llm\" | \"tool\";\n }): Observation {\n const { runName, runId, parentRunId, attributes, metadata, tags, asType } =\n params;\n\n // Determine parent context:\n // 1. If parentRunId exists, use the parent span from runMap (internal LangChain/LangGraph hierarchy)\n // 2. If no parentRunId (ROOT span) but externalParentSpanContext exists, use it (link to AG-UI.Server)\n // 3. Otherwise, create a new root span\n let parentSpanContext: SpanContext | undefined;\n\n if (parentRunId) {\n // Internal parent from LangChain/LangGraph\n parentSpanContext = this.runMap.get(parentRunId)?.otelSpan.spanContext();\n } else if (this.externalParentSpanContext) {\n // External parent from AG-UI.Server\n parentSpanContext = this.externalParentSpanContext;\n }\n\n // Add adapter name prefix to ROOT span\n let finalRunName = runName;\n if (!parentRunId && this.adapterName) {\n // ROOT span: add Adapter.LangGraph or Adapter.LangChain prefix\n finalRunName = `Adapter.${this.adapterName}`;\n }\n\n const observation = startObservation(\n finalRunName,\n {\n version: this.version,\n metadata: this.joinTagsAndMetaData(tags, metadata),\n ...attributes,\n },\n {\n asType: asType ?? \"span\",\n parentSpanContext,\n }\n );\n this.runMap.set(runId, observation);\n\n return observation;\n }\n\n private handleObservationEnd(params: {\n runId: string;\n attributes?: Record<string, unknown>;\n }) {\n const { runId, attributes = {} } = params;\n\n const observation = this.runMap.get(runId);\n if (!observation) {\n this.logger.warn?.(\"Observation not found in runMap. Skipping operation.\");\n return;\n }\n\n // Type-safe update: cast to ObservationAttributes which is the union of all observation attribute types\n observation.update(attributes as ObservationAttributes).end();\n\n this.last_trace_id = observation.traceId;\n this.runMap.delete(runId);\n }\n\n private joinTagsAndMetaData(\n tags?: string[] | undefined,\n metadata1?: Record<string, unknown> | undefined,\n metadata2?: Record<string, unknown> | undefined\n ): Record<string, unknown> | undefined {\n const finalDict: Record<string, unknown> = {};\n if (tags && tags.length > 0) {\n finalDict.tags = tags;\n }\n if (metadata1) {\n Object.assign(finalDict, metadata1);\n }\n if (metadata2) {\n Object.assign(finalDict, metadata2);\n }\n return this.stripObservabilityKeysFromMetadata(finalDict);\n }\n\n private stripObservabilityKeysFromMetadata(\n metadata?: Record<string, unknown>\n ): Record<string, unknown> | undefined {\n if (!metadata) {\n return;\n }\n\n const reservedKeys = [\"promptInfo\", \"userId\", \"sessionId\"];\n\n return Object.fromEntries(\n Object.entries(metadata).filter(([key, _]) => !reservedKeys.includes(key))\n );\n }\n\n private extractUsageMetadata(\n generation: Generation\n ): UsageMetadata | undefined {\n try {\n const usageMetadata =\n \"message\" in generation &&\n (AIMessage.isInstance(generation[\"message\"]) ||\n AIMessageChunk.isInstance(generation[\"message\"]))\n ? generation[\"message\"].usage_metadata\n : undefined;\n return usageMetadata;\n } catch (err) {\n this.logger.debug?.(`Error extracting usage metadata: ${err}`);\n return;\n }\n }\n\n private extractModelNameFromMetadata(generation: any): string | undefined {\n try {\n return \"message\" in generation &&\n (AIMessage.isInstance(generation[\"message\"]) ||\n AIMessageChunk.isInstance(generation[\"message\"]))\n ? generation[\"message\"].response_metadata.model_name\n : undefined;\n } catch {}\n }\n\n private extractChatMessageContent(\n message: BaseMessage\n ): LlmMessage | AnonymousLlmMessage | MessageContent {\n let response = undefined;\n\n if (message.getType() === \"human\") {\n response = { content: message.content, role: \"user\" };\n } else if (message.getType() === \"generic\") {\n response = {\n content: message.content,\n role: \"human\",\n };\n } else if (message.getType() === \"ai\") {\n response = { content: message.content, role: \"assistant\" };\n\n if (\n \"tool_calls\" in message &&\n Array.isArray(message.tool_calls) &&\n (message.tool_calls?.length ?? 0) > 0\n ) {\n (response as any)[\"tool_calls\"] = message[\"tool_calls\"];\n }\n if (\n \"additional_kwargs\" in message &&\n \"tool_calls\" in message[\"additional_kwargs\"]\n ) {\n (response as any)[\"tool_calls\"] =\n message[\"additional_kwargs\"][\"tool_calls\"];\n }\n } else if (message.getType() === \"system\") {\n response = { content: message.content, role: \"system\" };\n } else if (message.getType() === \"function\") {\n response = {\n content: message.content,\n additional_kwargs: message.additional_kwargs,\n role: message.name,\n };\n } else if (message.getType() === \"tool\") {\n response = {\n content: message.content,\n additional_kwargs: message.additional_kwargs,\n role: message.name,\n };\n } else if (!message.name) {\n response = { content: message.content };\n } else {\n response = {\n role: message.name,\n content: message.content,\n };\n }\n\n if (\n (message.additional_kwargs.function_call ||\n message.additional_kwargs.tool_calls) &&\n (response as any)[\"tool_calls\"] === undefined\n ) {\n return { ...response, additional_kwargs: message.additional_kwargs };\n }\n\n return response;\n }\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/langchain/CallbackHandler.ts"],"sourcesContent":["/**\n * LangChain Callback Handler for AG-Kit Observability\n *\n * Converts LangChain callback events into AG-Kit observations with OpenInference semantics.\n */\n\nimport type { AgentAction, AgentFinish } from \"@langchain/core/agents\";\nimport { BaseCallbackHandler } from \"@langchain/core/callbacks/base\";\nimport type { Document } from \"@langchain/core/documents\";\nimport type { Serialized } from \"@langchain/core/load/serializable\";\nimport {\n AIMessage,\n AIMessageChunk,\n BaseMessage,\n type UsageMetadata,\n type BaseMessageFields,\n type MessageContent,\n} from \"@langchain/core/messages\";\nimport type { Generation, LLMResult } from \"@langchain/core/outputs\";\nimport type { ChainValues } from \"@langchain/core/utils/types\";\n\nimport {\n startObservation,\n type ObservationLLM,\n type ObservationSpan,\n type ObservationTool,\n type Observation,\n type ObservationAttributes,\n} from \"../index\";\nimport type { SpanContext } from \"@opentelemetry/api\";\nimport { type Logger, noopLogger } from \"@cloudbase/agent-shared\";\n\n/**\n * Constructor parameters for CallbackHandler.\n *\n * @public\n */\ntype ConstructorParams = {\n userId?: string;\n sessionId?: string;\n tags?: string[];\n version?: string;\n traceMetadata?: Record<string, unknown>;\n adapterName?: string; // e.g., \"LangGraph\" or \"LangChain\"\n /** Logger for debug output. Defaults to noopLogger (silent). */\n logger?: Logger;\n};\n\n/**\n * Message format for LLM input/output.\n *\n * @public\n */\nexport type LlmMessage = {\n role: string;\n content: BaseMessageFields[\"content\"];\n additional_kwargs?: BaseMessageFields[\"additional_kwargs\"];\n};\n\n/**\n * Anonymous message format (without role).\n *\n * @public\n */\nexport type AnonymousLlmMessage = {\n content: BaseMessageFields[\"content\"];\n additional_kwargs?: BaseMessageFields[\"additional_kwargs\"];\n};\n\n/**\n * Prompt information for linking to generations.\n *\n * @public\n */\ntype PromptInfo = {\n name: string;\n version: number;\n isFallback: boolean;\n};\n\n/**\n * LangChain Callback Handler for AG-Kit Observability.\n *\n * This handler intercepts LangChain callbacks and converts them into\n * AG-Kit observations following OpenInference semantic conventions.\n *\n * @public\n */\nexport class CallbackHandler extends BaseCallbackHandler {\n name = \"ObservabilityCallbackHandler\";\n\n private userId?: string;\n private version?: string;\n private sessionId?: string;\n private tags: string[];\n private traceMetadata?: Record<string, unknown>;\n\n private completionStartTimes: Record<string, Date> = {};\n private promptToParentRunMap;\n private runMap: Map<string, Observation> = new Map();\n\n public last_trace_id: string | null = null;\n\n // External parent context from AG-UI.Server span\n private externalParentSpanContext?: SpanContext;\n\n // External metadata from AG-UI.Server (e.g., threadId, runId)\n private externalMetadata?: Record<string, string>;\n\n // Adapter name for ROOT span prefix\n private adapterName?: string;\n\n // Logger for debug output (defaults to noopLogger for silent operation)\n private logger: Logger;\n\n constructor(params?: ConstructorParams) {\n super();\n\n this.sessionId = params?.sessionId;\n this.userId = params?.userId;\n this.tags = params?.tags ?? [];\n this.traceMetadata = params?.traceMetadata;\n this.version = params?.version;\n this.adapterName = params?.adapterName;\n this.logger = params?.logger ?? noopLogger;\n\n this.promptToParentRunMap = new Map<string, PromptInfo>();\n }\n\n /**\n * Set external parent SpanContext from AG-UI.Server span.\n * This allows the CallbackHandler to link LangChain/LangGraph spans\n * to the server-level span, creating a unified trace hierarchy.\n *\n * @param spanContext - SpanContext from the AG-UI.Server span\n * @param metadata - Optional metadata from server (e.g., threadId, runId)\n * @public\n */\n setExternalParentContext(spanContext: SpanContext, metadata?: Record<string, string>): void {\n this.externalParentSpanContext = spanContext;\n this.externalMetadata = metadata;\n }\n\n async handleLLMNewToken(\n token: string,\n _idx: any,\n runId: string,\n _parentRunId?: string,\n _tags?: string[],\n _fields?: any\n ): Promise<void> {\n if (runId && !(runId in this.completionStartTimes)) {\n this.logger.debug?.(`LLM first streaming token: ${runId}`);\n this.completionStartTimes[runId] = new Date();\n }\n }\n\n async handleChainStart(\n chain: Serialized,\n inputs: ChainValues,\n runId: string,\n parentRunId?: string | undefined,\n tags?: string[] | undefined,\n metadata?: Record<string, unknown> | undefined,\n runType?: string,\n name?: string\n ): Promise<void> {\n try {\n this.logger.debug?.(`Chain start with Id: ${runId}`);\n\n const runName = name ?? chain.id.at(-1)?.toString() ?? \"Langchain Run\";\n\n this.registerPromptInfo(parentRunId, metadata);\n\n let finalInput: string | ChainValues = inputs;\n if (\n typeof inputs === \"object\" &&\n \"input\" in inputs &&\n Array.isArray(inputs[\"input\"]) &&\n inputs[\"input\"].every((m: unknown) => m instanceof BaseMessage)\n ) {\n finalInput = inputs[\"input\"].map((m: BaseMessage) =>\n this.extractChatMessageContent(m)\n );\n } else if (\n typeof inputs === \"object\" &&\n \"messages\" in inputs &&\n Array.isArray(inputs[\"messages\"]) &&\n inputs[\"messages\"].every((m: unknown) => m instanceof BaseMessage)\n ) {\n finalInput = inputs[\"messages\"].map((m: BaseMessage) =>\n this.extractChatMessageContent(m)\n );\n } else if (\n typeof inputs === \"object\" &&\n \"content\" in inputs &&\n typeof inputs[\"content\"] === \"string\"\n ) {\n finalInput = inputs[\"content\"];\n }\n\n const observation = this.startAndRegisterObservation({\n runName,\n parentRunId,\n runId,\n tags,\n metadata: this.joinTagsAndMetaData(tags, metadata),\n attributes: {\n input: finalInput,\n },\n asType: \"span\",\n });\n\n const traceTags = [...new Set([...(tags ?? []), ...this.tags])];\n\n if (!parentRunId) {\n observation.updateTrace({\n tags: traceTags,\n userId:\n metadata &&\n \"userId\" in metadata &&\n typeof metadata[\"userId\"] === \"string\"\n ? metadata[\"userId\"]\n : this.userId,\n sessionId:\n metadata &&\n \"sessionId\" in metadata &&\n typeof metadata[\"sessionId\"] === \"string\"\n ? metadata[\"sessionId\"]\n : this.sessionId,\n metadata: this.traceMetadata,\n version: this.version,\n });\n }\n } catch (e) {\n this.logger.debug?.(e instanceof Error ? e.message : String(e));\n }\n }\n\n async handleAgentAction(\n action: AgentAction,\n runId: string,\n parentRunId?: string\n ): Promise<void> {\n try {\n this.logger.debug?.(`Agent action ${action.tool} with ID: ${runId}`);\n this.startAndRegisterObservation({\n runId,\n parentRunId,\n runName: action.tool,\n attributes: {\n input: action,\n },\n asType: \"tool\",\n });\n } catch (e) {\n this.logger.debug?.(e instanceof Error ? e.message : String(e));\n }\n }\n\n async handleAgentEnd?(\n action: AgentFinish,\n runId: string,\n _parentRunId?: string\n ): Promise<void> {\n try {\n this.logger.debug?.(`Agent finish with ID: ${runId}`);\n this.handleObservationEnd({\n runId,\n attributes: { output: action },\n });\n } catch (e) {\n this.logger.debug?.(e instanceof Error ? e.message : String(e));\n }\n }\n\n async handleChainError(\n err: any,\n runId: string,\n _parentRunId?: string | undefined\n ): Promise<void> {\n try {\n this.logger.debug?.(`Chain error: ${err} with ID: ${runId}`);\n this.handleObservationEnd({\n runId,\n attributes: {\n level: \"ERROR\",\n statusMessage: err.toString(),\n },\n });\n } catch (e) {\n this.logger.debug?.(e instanceof Error ? e.message : String(e));\n }\n }\n\n async handleGenerationStart(\n llm: Serialized,\n messages: (LlmMessage | MessageContent | AnonymousLlmMessage)[],\n runId: string,\n parentRunId?: string | undefined,\n extraParams?: Record<string, unknown> | undefined,\n tags?: string[] | undefined,\n metadata?: Record<string, unknown> | undefined,\n name?: string\n ): Promise<void> {\n this.logger.debug?.(\n `Generation start with ID: ${runId} and parentRunId ${parentRunId}`\n );\n\n const runName = name ?? llm.id.at(-1)?.toString() ?? \"Langchain Generation\";\n\n const modelParameters: Record<string, any> = {};\n const invocationParams = extraParams?.[\"invocation_params\"];\n\n for (const [key, value] of Object.entries({\n temperature: (invocationParams as any)?.temperature,\n max_tokens: (invocationParams as any)?.max_tokens,\n top_p: (invocationParams as any)?.top_p,\n frequency_penalty: (invocationParams as any)?.frequency_penalty,\n presence_penalty: (invocationParams as any)?.presence_penalty,\n request_timeout: (invocationParams as any)?.request_timeout,\n })) {\n if (value !== undefined && value !== null) {\n modelParameters[key] = value;\n }\n }\n\n interface InvocationParams {\n _type?: string;\n model?: string;\n model_name?: string;\n repo_id?: string;\n }\n\n let extractedModelName: string | undefined;\n let extractedSystem: string | undefined;\n let extractedProvider: string | undefined;\n if (extraParams) {\n const invocationParamsModelName = (\n extraParams.invocation_params as InvocationParams\n ).model;\n const metadataModelName =\n metadata && \"ls_model_name\" in metadata\n ? (metadata[\"ls_model_name\"] as string)\n : undefined;\n\n extractedModelName = invocationParamsModelName ?? metadataModelName;\n \n // Extract provider from metadata (e.g., \"ls_provider\" from LangChain)\n if (metadata && \"ls_provider\" in metadata) {\n extractedProvider = metadata[\"ls_provider\"] as string;\n }\n }\n\n const registeredPrompt = this.promptToParentRunMap.get(\n parentRunId ?? \"root\"\n );\n if (registeredPrompt && parentRunId) {\n this.deregisterPromptInfo(parentRunId);\n }\n\n this.startAndRegisterObservation({\n runId,\n parentRunId,\n metadata,\n tags,\n runName,\n attributes: {\n input: messages,\n model: extractedModelName,\n modelParameters: modelParameters,\n },\n asType: \"llm\",\n });\n }\n\n async handleChatModelStart(\n llm: Serialized,\n messages: BaseMessage[][],\n runId: string,\n parentRunId?: string | undefined,\n extraParams?: Record<string, unknown> | undefined,\n tags?: string[] | undefined,\n metadata?: Record<string, unknown> | undefined,\n name?: string\n ): Promise<void> {\n try {\n this.logger.debug?.(`Chat model start with ID: ${runId}`);\n\n const prompts = messages.flatMap((message) =>\n message.map((m) => this.extractChatMessageContent(m))\n );\n\n this.handleGenerationStart(\n llm,\n prompts,\n runId,\n parentRunId,\n extraParams,\n tags,\n metadata,\n name\n );\n } catch (e) {\n this.logger.debug?.(e instanceof Error ? e.message : String(e));\n }\n }\n\n async handleChainEnd(\n outputs: ChainValues,\n runId: string,\n _parentRunId?: string | undefined\n ): Promise<void> {\n try {\n this.logger.debug?.(`Chain end with ID: ${runId}`);\n\n let finalOutput: ChainValues | string = outputs;\n if (\n typeof outputs === \"object\" &&\n \"output\" in outputs &&\n typeof outputs[\"output\"] === \"string\"\n ) {\n finalOutput = outputs[\"output\"];\n } else if (\n typeof outputs === \"object\" &&\n \"messages\" in outputs &&\n Array.isArray(outputs[\"messages\"]) &&\n outputs[\"messages\"].every((m: unknown) => m instanceof BaseMessage)\n ) {\n finalOutput = {\n messages: outputs.messages.map((message: BaseMessage) =>\n this.extractChatMessageContent(message)\n ),\n };\n }\n\n this.handleObservationEnd({\n runId,\n attributes: {\n output: finalOutput,\n },\n });\n this.deregisterPromptInfo(runId);\n } catch (e) {\n this.logger.debug?.(e instanceof Error ? e.message : String(e));\n }\n }\n\n async handleLLMStart(\n llm: Serialized,\n prompts: string[],\n runId: string,\n parentRunId?: string | undefined,\n extraParams?: Record<string, unknown> | undefined,\n tags?: string[] | undefined,\n metadata?: Record<string, unknown> | undefined,\n name?: string\n ): Promise<void> {\n try {\n this.logger.debug?.(`LLM start with ID: ${runId}`);\n this.handleGenerationStart(\n llm,\n prompts,\n runId,\n parentRunId,\n extraParams,\n tags,\n metadata,\n name\n );\n } catch (e) {\n this.logger.debug?.(e instanceof Error ? e.message : String(e));\n }\n }\n\n async handleToolStart(\n tool: Serialized,\n input: string,\n runId: string,\n parentRunId?: string | undefined,\n tags?: string[] | undefined,\n metadata?: Record<string, unknown> | undefined,\n name?: string\n ): Promise<void> {\n try {\n this.logger.debug?.(`Tool start with ID: ${runId}`);\n this.startAndRegisterObservation({\n runId,\n parentRunId,\n runName: name ?? tool.id.at(-1)?.toString() ?? \"Tool execution\",\n attributes: {\n input,\n },\n metadata: this.joinTagsAndMetaData(tags, metadata),\n tags,\n asType: \"tool\",\n });\n } catch (e) {\n this.logger.debug?.(e instanceof Error ? e.message : String(e));\n }\n }\n\n async handleRetrieverStart(\n retriever: Serialized,\n query: string,\n runId: string,\n parentRunId?: string | undefined,\n tags?: string[] | undefined,\n metadata?: Record<string, unknown> | undefined,\n name?: string\n ): Promise<void> {\n try {\n this.logger.debug?.(`Retriever start with ID: ${runId}`);\n this.startAndRegisterObservation({\n runId,\n parentRunId,\n runName: name ?? retriever.id.at(-1)?.toString() ?? \"Retriever\",\n attributes: {\n input: query,\n },\n tags,\n metadata: this.joinTagsAndMetaData(tags, metadata),\n asType: \"span\",\n });\n } catch (e) {\n this.logger.debug?.(e instanceof Error ? e.message : String(e));\n }\n }\n\n async handleRetrieverEnd(\n documents: Document<Record<string, any>>[],\n runId: string,\n _parentRunId?: string | undefined\n ): Promise<void> {\n try {\n this.logger.debug?.(`Retriever end with ID: ${runId}`);\n this.handleObservationEnd({\n runId,\n attributes: {\n output: documents,\n },\n });\n } catch (e) {\n this.logger.debug?.(e instanceof Error ? e.message : String(e));\n }\n }\n\n async handleRetrieverError(\n err: any,\n runId: string,\n _parentRunId?: string | undefined\n ): Promise<void> {\n try {\n this.logger.debug?.(`Retriever error: ${err} with ID: ${runId}`);\n this.handleObservationEnd({\n runId,\n attributes: {\n level: \"ERROR\",\n statusMessage: err.toString(),\n },\n });\n } catch (e) {\n this.logger.debug?.(e instanceof Error ? e.message : String(e));\n }\n }\n\n async handleToolEnd(\n output: string,\n runId: string,\n _parentRunId?: string | undefined\n ): Promise<void> {\n try {\n this.logger.debug?.(`Tool end with ID: ${runId}`);\n this.handleObservationEnd({\n runId,\n attributes: { output },\n });\n } catch (e) {\n this.logger.debug?.(e instanceof Error ? e.message : String(e));\n }\n }\n\n async handleToolError(\n err: any,\n runId: string,\n _parentRunId?: string | undefined\n ): Promise<void> {\n try {\n this.logger.debug?.(`Tool error ${err} with ID: ${runId}`);\n this.handleObservationEnd({\n runId,\n attributes: {\n level: \"ERROR\",\n statusMessage: err.toString(),\n },\n });\n } catch (e) {\n this.logger.debug?.(e instanceof Error ? e.message : String(e));\n }\n }\n\n async handleLLMEnd(\n output: LLMResult,\n runId: string,\n _parentRunId?: string | undefined\n ): Promise<void> {\n try {\n this.logger.debug?.(`LLM end with ID: ${runId}`);\n\n const lastResponse =\n output.generations[output.generations.length - 1][\n output.generations[output.generations.length - 1].length - 1\n ];\n const llmUsage =\n this.extractUsageMetadata(lastResponse) ??\n output.llmOutput?.[\"tokenUsage\"];\n const modelName = this.extractModelNameFromMetadata(lastResponse);\n\n const usageDetails: Record<string, any> = {\n input:\n llmUsage?.input_tokens ??\n (\"promptTokens\" in llmUsage ? llmUsage?.promptTokens : undefined),\n output:\n llmUsage?.output_tokens ??\n (\"completionTokens\" in llmUsage\n ? llmUsage?.completionTokens\n : undefined),\n total:\n llmUsage?.total_tokens ??\n (\"totalTokens\" in llmUsage ? llmUsage?.totalTokens : undefined),\n };\n\n if (llmUsage && \"input_token_details\" in llmUsage) {\n for (const [key, val] of Object.entries(\n llmUsage[\"input_token_details\"] ?? {}\n )) {\n usageDetails[`input_${key}`] = val;\n if (\"input\" in usageDetails && typeof val === \"number\") {\n usageDetails[\"input\"] = Math.max(0, usageDetails[\"input\"] - val);\n }\n }\n }\n\n if (llmUsage && \"output_token_details\" in llmUsage) {\n for (const [key, val] of Object.entries(\n llmUsage[\"output_token_details\"] ?? {}\n )) {\n usageDetails[`output_${key}`] = val;\n if (\"output\" in usageDetails && typeof val === \"number\") {\n usageDetails[\"output\"] = Math.max(0, usageDetails[\"output\"] - val);\n }\n }\n }\n\n const extractedOutput =\n \"message\" in lastResponse\n ? this.extractChatMessageContent(\n lastResponse[\"message\"] as BaseMessage\n )\n : lastResponse.text;\n\n this.handleObservationEnd({\n runId,\n attributes: {\n model: modelName,\n output: extractedOutput,\n completionStartTime:\n runId in this.completionStartTimes\n ? this.completionStartTimes[runId]\n : undefined,\n usageDetails: usageDetails,\n },\n });\n\n if (runId in this.completionStartTimes) {\n delete this.completionStartTimes[runId];\n }\n } catch (e) {\n this.logger.debug?.(e instanceof Error ? e.message : String(e));\n }\n }\n\n async handleLLMError(\n err: any,\n runId: string,\n _parentRunId?: string | undefined\n ): Promise<void> {\n try {\n this.logger.debug?.(`LLM error ${err} with ID: ${runId}`);\n this.handleObservationEnd({\n runId,\n attributes: {\n level: \"ERROR\",\n statusMessage: err.toString(),\n },\n });\n } catch (e) {\n this.logger.debug?.(e instanceof Error ? e.message : String(e));\n }\n }\n\n private registerPromptInfo(\n parentRunId?: string,\n metadata?: Record<string, unknown>\n ): void {\n if (metadata && \"promptInfo\" in metadata && parentRunId) {\n this.promptToParentRunMap.set(\n parentRunId,\n metadata.promptInfo as PromptInfo\n );\n }\n }\n\n private deregisterPromptInfo(runId: string): void {\n this.promptToParentRunMap.delete(runId);\n }\n\n private startAndRegisterObservation(params: {\n runName: string;\n runId: string;\n parentRunId?: string;\n attributes: Record<string, unknown>;\n metadata?: Record<string, unknown>;\n tags?: string[];\n asType?: \"span\" | \"llm\" | \"tool\";\n }): Observation {\n const { runName, runId, parentRunId, attributes, metadata, tags, asType } =\n params;\n\n // Determine parent context:\n // 1. If parentRunId exists, use the parent span from runMap (internal LangChain/LangGraph hierarchy)\n // 2. If no parentRunId (ROOT span) but externalParentSpanContext exists, use it (link to AG-UI.Server)\n // 3. Otherwise, create a new root span\n let parentSpanContext: SpanContext | undefined;\n\n if (parentRunId) {\n // Internal parent from LangChain/LangGraph\n parentSpanContext = this.runMap.get(parentRunId)?.otelSpan.spanContext();\n } else if (this.externalParentSpanContext) {\n // External parent from AG-UI.Server\n parentSpanContext = this.externalParentSpanContext;\n }\n\n // Add adapter name prefix to ROOT span\n let finalRunName = runName;\n if (!parentRunId && this.adapterName) {\n // ROOT span: add Adapter.LangGraph or Adapter.LangChain prefix\n finalRunName = `Adapter.${this.adapterName}`;\n }\n\n // Add agui.thread_id and agui.run_id to ALL spans if external metadata available\n // This ensures consistent tagging across the entire trace hierarchy\n const serverMetadata = this.externalMetadata\n ? { \"agui.thread_id\": this.externalMetadata.threadId, \"agui.run_id\": this.externalMetadata.runId }\n : {};\n\n const observation = startObservation(\n finalRunName,\n {\n version: this.version,\n metadata: this.joinTagsAndMetaData(tags, metadata),\n ...attributes,\n ...serverMetadata,\n },\n {\n asType: asType ?? \"span\",\n parentSpanContext,\n }\n );\n this.runMap.set(runId, observation);\n\n return observation;\n }\n\n private handleObservationEnd(params: {\n runId: string;\n attributes?: Record<string, unknown>;\n }) {\n const { runId, attributes = {} } = params;\n\n const observation = this.runMap.get(runId);\n if (!observation) {\n this.logger.warn?.(\"Observation not found in runMap. Skipping operation.\");\n return;\n }\n\n // Check if this is an error and set span status accordingly\n const level = attributes.level as string | undefined;\n const statusMessage = attributes.statusMessage as string | undefined;\n if (level === \"ERROR\") {\n try {\n const { SpanStatusCode } = require(\"@opentelemetry/api\");\n observation.otelSpan.setStatus({\n code: SpanStatusCode.ERROR,\n message: statusMessage || \"Unknown error\",\n });\n } catch (e) {\n this.logger.debug?.(\"Failed to set span error status:\", e);\n }\n }\n\n // Type-safe update: cast to ObservationAttributes which is the union of all observation attribute types\n observation.update(attributes as ObservationAttributes).end();\n\n this.last_trace_id = observation.traceId;\n this.runMap.delete(runId);\n }\n\n private joinTagsAndMetaData(\n tags?: string[] | undefined,\n metadata1?: Record<string, unknown> | undefined,\n metadata2?: Record<string, unknown> | undefined\n ): Record<string, unknown> | undefined {\n const finalDict: Record<string, unknown> = {};\n if (tags && tags.length > 0) {\n finalDict.tags = tags;\n }\n if (metadata1) {\n Object.assign(finalDict, metadata1);\n }\n if (metadata2) {\n Object.assign(finalDict, metadata2);\n }\n return this.stripObservabilityKeysFromMetadata(finalDict);\n }\n\n private stripObservabilityKeysFromMetadata(\n metadata?: Record<string, unknown>\n ): Record<string, unknown> | undefined {\n if (!metadata) {\n return;\n }\n\n // Filter out keys that should not be in metadata:\n // - thread_id, run_id: Become agui.thread_id, agui.run_id at span level\n // - promptInfo, userId, sessionId: Reserved for internal use\n const reservedKeys = [\"promptInfo\", \"userId\", \"sessionId\", \"thread_id\", \"runId\", \"run_id\"];\n\n return Object.fromEntries(\n Object.entries(metadata).filter(([key, _]) => !reservedKeys.includes(key))\n );\n }\n\n private extractUsageMetadata(\n generation: Generation\n ): UsageMetadata | undefined {\n try {\n const usageMetadata =\n \"message\" in generation &&\n (AIMessage.isInstance(generation[\"message\"]) ||\n AIMessageChunk.isInstance(generation[\"message\"]))\n ? generation[\"message\"].usage_metadata\n : undefined;\n return usageMetadata;\n } catch (err) {\n this.logger.debug?.(`Error extracting usage metadata: ${err}`);\n return;\n }\n }\n\n private extractModelNameFromMetadata(generation: any): string | undefined {\n try {\n return \"message\" in generation &&\n (AIMessage.isInstance(generation[\"message\"]) ||\n AIMessageChunk.isInstance(generation[\"message\"]))\n ? generation[\"message\"].response_metadata.model_name\n : undefined;\n } catch {}\n }\n\n private extractChatMessageContent(\n message: BaseMessage\n ): LlmMessage | AnonymousLlmMessage | MessageContent {\n let response = undefined;\n\n if (message.getType() === \"human\") {\n response = { content: message.content, role: \"user\" };\n } else if (message.getType() === \"generic\") {\n response = {\n content: message.content,\n role: \"human\",\n };\n } else if (message.getType() === \"ai\") {\n response = { content: message.content, role: \"assistant\" };\n\n if (\n \"tool_calls\" in message &&\n Array.isArray(message.tool_calls) &&\n (message.tool_calls?.length ?? 0) > 0\n ) {\n (response as any)[\"tool_calls\"] = message[\"tool_calls\"];\n }\n if (\n \"additional_kwargs\" in message &&\n \"tool_calls\" in message[\"additional_kwargs\"]\n ) {\n (response as any)[\"tool_calls\"] =\n message[\"additional_kwargs\"][\"tool_calls\"];\n }\n } else if (message.getType() === \"system\") {\n response = { content: message.content, role: \"system\" };\n } else if (message.getType() === \"function\") {\n response = {\n content: message.content,\n additional_kwargs: message.additional_kwargs,\n role: message.name,\n };\n } else if (message.getType() === \"tool\") {\n response = {\n content: message.content,\n additional_kwargs: message.additional_kwargs,\n role: message.name,\n };\n } else if (!message.name) {\n response = { content: message.content };\n } else {\n response = {\n role: message.name,\n content: message.content,\n };\n }\n\n if (\n (message.additional_kwargs.function_call ||\n message.additional_kwargs.tool_calls) &&\n (response as any)[\"tool_calls\"] === undefined\n ) {\n return { ...response, additional_kwargs: message.additional_kwargs };\n }\n\n return response;\n }\n\n}\n"],"mappings":"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","names":[]}
|
package/dist/server.d.mts
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import { SpanExporter, ReadableSpan } from '@opentelemetry/sdk-trace-base';
|
|
2
|
+
|
|
1
3
|
/**
|
|
2
4
|
* Observability configuration types for AG-Kit Server.
|
|
3
5
|
*
|
|
@@ -149,6 +151,72 @@ interface CustomTraceConfig {
|
|
|
149
151
|
*/
|
|
150
152
|
type ObservabilityConfig = ConsoleTraceConfig | OTLPTraceConfig | CustomTraceConfig;
|
|
151
153
|
|
|
154
|
+
/**
|
|
155
|
+
* Custom console exporter that outputs single-line JSON.
|
|
156
|
+
*
|
|
157
|
+
* This exporter outputs spans as single-line JSON for easier parsing
|
|
158
|
+
* with line-based tools (grep, jq, etc.).
|
|
159
|
+
*
|
|
160
|
+
* To switch back to standard multi-line output, use ConsoleSpanExporter instead.
|
|
161
|
+
*
|
|
162
|
+
* @example
|
|
163
|
+
* ```typescript
|
|
164
|
+
* // Single-line (current default)
|
|
165
|
+
* const exporter = new SingleLineConsoleSpanExporter();
|
|
166
|
+
*
|
|
167
|
+
* // Multi-line (standard OTel)
|
|
168
|
+
* import { ConsoleSpanExporter } from '@opentelemetry/sdk-trace-base';
|
|
169
|
+
* const exporter = new ConsoleSpanExporter();
|
|
170
|
+
* ```
|
|
171
|
+
*
|
|
172
|
+
* @packageDocumentation
|
|
173
|
+
*/
|
|
174
|
+
|
|
175
|
+
/**
|
|
176
|
+
* Export result codes.
|
|
177
|
+
*/
|
|
178
|
+
declare enum ExportResultCode {
|
|
179
|
+
SUCCESS = 0,
|
|
180
|
+
FAILED = 1
|
|
181
|
+
}
|
|
182
|
+
/**
|
|
183
|
+
* Export result interface.
|
|
184
|
+
*/
|
|
185
|
+
interface ExportResult {
|
|
186
|
+
code: ExportResultCode;
|
|
187
|
+
error?: Error;
|
|
188
|
+
}
|
|
189
|
+
/**
|
|
190
|
+
* Custom console exporter that outputs single-line JSON.
|
|
191
|
+
*
|
|
192
|
+
* This exporter outputs spans as single-line JSON for easier parsing
|
|
193
|
+
* with line-based tools (grep, jq, etc.).
|
|
194
|
+
*/
|
|
195
|
+
declare class SingleLineConsoleSpanExporter implements SpanExporter {
|
|
196
|
+
/**
|
|
197
|
+
* Export spans as single-line JSON.
|
|
198
|
+
*/
|
|
199
|
+
export(spans: ReadableSpan[], resultCallback: (result: ExportResult) => void): void;
|
|
200
|
+
/**
|
|
201
|
+
* Shutdown the exporter.
|
|
202
|
+
*/
|
|
203
|
+
shutdown(): Promise<void>;
|
|
204
|
+
/**
|
|
205
|
+
* Force flush the exporter.
|
|
206
|
+
*/
|
|
207
|
+
forceFlush?(): Promise<void>;
|
|
208
|
+
/**
|
|
209
|
+
* Convert a ReadableSpan to a dictionary for JSON serialization.
|
|
210
|
+
*/
|
|
211
|
+
private spanToDict;
|
|
212
|
+
}
|
|
213
|
+
/**
|
|
214
|
+
* Check if single-line console exporter should be used.
|
|
215
|
+
*
|
|
216
|
+
* Set CONSOLE_EXPORTER_SINGLE_LINE=false to use standard multi-line output.
|
|
217
|
+
*/
|
|
218
|
+
declare function isSingleLineConsoleExporterEnabled(): boolean;
|
|
219
|
+
|
|
152
220
|
/**
|
|
153
221
|
* Observability setup implementation for AG-Kit Server.
|
|
154
222
|
*
|
|
@@ -160,4 +228,4 @@ type ObservabilityConfig = ConsoleTraceConfig | OTLPTraceConfig | CustomTraceCon
|
|
|
160
228
|
|
|
161
229
|
declare function setupObservability(configs?: ObservabilityConfig | ObservabilityConfig[]): Promise<void>;
|
|
162
230
|
|
|
163
|
-
export { type BatchConfig, type ConsoleTraceConfig, type CustomTraceConfig, ExporterType, type OTLPTraceConfig, type ObservabilityConfig, setupObservability };
|
|
231
|
+
export { type BatchConfig, type ConsoleTraceConfig, type CustomTraceConfig, ExporterType, type OTLPTraceConfig, type ObservabilityConfig, SingleLineConsoleSpanExporter, isSingleLineConsoleExporterEnabled, setupObservability };
|
package/dist/server.d.ts
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import { SpanExporter, ReadableSpan } from '@opentelemetry/sdk-trace-base';
|
|
2
|
+
|
|
1
3
|
/**
|
|
2
4
|
* Observability configuration types for AG-Kit Server.
|
|
3
5
|
*
|
|
@@ -149,6 +151,72 @@ interface CustomTraceConfig {
|
|
|
149
151
|
*/
|
|
150
152
|
type ObservabilityConfig = ConsoleTraceConfig | OTLPTraceConfig | CustomTraceConfig;
|
|
151
153
|
|
|
154
|
+
/**
|
|
155
|
+
* Custom console exporter that outputs single-line JSON.
|
|
156
|
+
*
|
|
157
|
+
* This exporter outputs spans as single-line JSON for easier parsing
|
|
158
|
+
* with line-based tools (grep, jq, etc.).
|
|
159
|
+
*
|
|
160
|
+
* To switch back to standard multi-line output, use ConsoleSpanExporter instead.
|
|
161
|
+
*
|
|
162
|
+
* @example
|
|
163
|
+
* ```typescript
|
|
164
|
+
* // Single-line (current default)
|
|
165
|
+
* const exporter = new SingleLineConsoleSpanExporter();
|
|
166
|
+
*
|
|
167
|
+
* // Multi-line (standard OTel)
|
|
168
|
+
* import { ConsoleSpanExporter } from '@opentelemetry/sdk-trace-base';
|
|
169
|
+
* const exporter = new ConsoleSpanExporter();
|
|
170
|
+
* ```
|
|
171
|
+
*
|
|
172
|
+
* @packageDocumentation
|
|
173
|
+
*/
|
|
174
|
+
|
|
175
|
+
/**
|
|
176
|
+
* Export result codes.
|
|
177
|
+
*/
|
|
178
|
+
declare enum ExportResultCode {
|
|
179
|
+
SUCCESS = 0,
|
|
180
|
+
FAILED = 1
|
|
181
|
+
}
|
|
182
|
+
/**
|
|
183
|
+
* Export result interface.
|
|
184
|
+
*/
|
|
185
|
+
interface ExportResult {
|
|
186
|
+
code: ExportResultCode;
|
|
187
|
+
error?: Error;
|
|
188
|
+
}
|
|
189
|
+
/**
|
|
190
|
+
* Custom console exporter that outputs single-line JSON.
|
|
191
|
+
*
|
|
192
|
+
* This exporter outputs spans as single-line JSON for easier parsing
|
|
193
|
+
* with line-based tools (grep, jq, etc.).
|
|
194
|
+
*/
|
|
195
|
+
declare class SingleLineConsoleSpanExporter implements SpanExporter {
|
|
196
|
+
/**
|
|
197
|
+
* Export spans as single-line JSON.
|
|
198
|
+
*/
|
|
199
|
+
export(spans: ReadableSpan[], resultCallback: (result: ExportResult) => void): void;
|
|
200
|
+
/**
|
|
201
|
+
* Shutdown the exporter.
|
|
202
|
+
*/
|
|
203
|
+
shutdown(): Promise<void>;
|
|
204
|
+
/**
|
|
205
|
+
* Force flush the exporter.
|
|
206
|
+
*/
|
|
207
|
+
forceFlush?(): Promise<void>;
|
|
208
|
+
/**
|
|
209
|
+
* Convert a ReadableSpan to a dictionary for JSON serialization.
|
|
210
|
+
*/
|
|
211
|
+
private spanToDict;
|
|
212
|
+
}
|
|
213
|
+
/**
|
|
214
|
+
* Check if single-line console exporter should be used.
|
|
215
|
+
*
|
|
216
|
+
* Set CONSOLE_EXPORTER_SINGLE_LINE=false to use standard multi-line output.
|
|
217
|
+
*/
|
|
218
|
+
declare function isSingleLineConsoleExporterEnabled(): boolean;
|
|
219
|
+
|
|
152
220
|
/**
|
|
153
221
|
* Observability setup implementation for AG-Kit Server.
|
|
154
222
|
*
|
|
@@ -160,4 +228,4 @@ type ObservabilityConfig = ConsoleTraceConfig | OTLPTraceConfig | CustomTraceCon
|
|
|
160
228
|
|
|
161
229
|
declare function setupObservability(configs?: ObservabilityConfig | ObservabilityConfig[]): Promise<void>;
|
|
162
230
|
|
|
163
|
-
export { type BatchConfig, type ConsoleTraceConfig, type CustomTraceConfig, ExporterType, type OTLPTraceConfig, type ObservabilityConfig, setupObservability };
|
|
231
|
+
export { type BatchConfig, type ConsoleTraceConfig, type CustomTraceConfig, ExporterType, type OTLPTraceConfig, type ObservabilityConfig, SingleLineConsoleSpanExporter, isSingleLineConsoleExporterEnabled, setupObservability };
|
package/dist/server.js
CHANGED
|
@@ -1348,10 +1348,86 @@ var init_esm4 = __esm({
|
|
|
1348
1348
|
var server_exports = {};
|
|
1349
1349
|
__export(server_exports, {
|
|
1350
1350
|
ExporterType: () => ExporterType,
|
|
1351
|
+
SingleLineConsoleSpanExporter: () => SingleLineConsoleSpanExporter,
|
|
1352
|
+
isSingleLineConsoleExporterEnabled: () => isSingleLineConsoleExporterEnabled,
|
|
1351
1353
|
setupObservability: () => setupObservability
|
|
1352
1354
|
});
|
|
1353
1355
|
module.exports = __toCommonJS(server_exports);
|
|
1354
1356
|
|
|
1357
|
+
// src/server/SingleLineConsoleSpanExporter.ts
|
|
1358
|
+
var SingleLineConsoleSpanExporter = class {
|
|
1359
|
+
/**
|
|
1360
|
+
* Export spans as single-line JSON.
|
|
1361
|
+
*/
|
|
1362
|
+
export(spans, resultCallback) {
|
|
1363
|
+
try {
|
|
1364
|
+
for (const span of spans) {
|
|
1365
|
+
const spanDict = this.spanToDict(span);
|
|
1366
|
+
const jsonLine = JSON.stringify(spanDict);
|
|
1367
|
+
console.log(jsonLine);
|
|
1368
|
+
}
|
|
1369
|
+
resultCallback({ code: 0 /* SUCCESS */ });
|
|
1370
|
+
} catch (error) {
|
|
1371
|
+
resultCallback({ code: 1 /* FAILED */, error });
|
|
1372
|
+
}
|
|
1373
|
+
}
|
|
1374
|
+
/**
|
|
1375
|
+
* Shutdown the exporter.
|
|
1376
|
+
*/
|
|
1377
|
+
shutdown() {
|
|
1378
|
+
return Promise.resolve();
|
|
1379
|
+
}
|
|
1380
|
+
/**
|
|
1381
|
+
* Force flush the exporter.
|
|
1382
|
+
*/
|
|
1383
|
+
forceFlush() {
|
|
1384
|
+
return Promise.resolve();
|
|
1385
|
+
}
|
|
1386
|
+
/**
|
|
1387
|
+
* Convert a ReadableSpan to a dictionary for JSON serialization.
|
|
1388
|
+
*/
|
|
1389
|
+
spanToDict(span) {
|
|
1390
|
+
const context = span.spanContext();
|
|
1391
|
+
const parentId = span.parentSpanId || span.parentSpanContext?.spanId;
|
|
1392
|
+
return {
|
|
1393
|
+
name: span.name,
|
|
1394
|
+
context: {
|
|
1395
|
+
trace_id: context.traceId,
|
|
1396
|
+
span_id: context.spanId,
|
|
1397
|
+
trace_flags: context.traceFlags
|
|
1398
|
+
},
|
|
1399
|
+
kind: span.kind,
|
|
1400
|
+
parent_id: parentId,
|
|
1401
|
+
start_time: span.startTime,
|
|
1402
|
+
end_time: span.endTime,
|
|
1403
|
+
status: {
|
|
1404
|
+
status_code: span.status.code,
|
|
1405
|
+
description: span.status.message
|
|
1406
|
+
},
|
|
1407
|
+
attributes: span.attributes,
|
|
1408
|
+
events: span.events.map((event) => ({
|
|
1409
|
+
name: event.name,
|
|
1410
|
+
timestamp: event.time,
|
|
1411
|
+
attributes: event.attributes
|
|
1412
|
+
})),
|
|
1413
|
+
links: span.links.map((link) => ({
|
|
1414
|
+
context: {
|
|
1415
|
+
trace_id: link.context.traceId,
|
|
1416
|
+
span_id: link.context.spanId
|
|
1417
|
+
},
|
|
1418
|
+
attributes: link.attributes
|
|
1419
|
+
})),
|
|
1420
|
+
resource: {
|
|
1421
|
+
attributes: span.resource.attributes
|
|
1422
|
+
}
|
|
1423
|
+
};
|
|
1424
|
+
}
|
|
1425
|
+
};
|
|
1426
|
+
function isSingleLineConsoleExporterEnabled() {
|
|
1427
|
+
const value = process.env.CONSOLE_EXPORTER_SINGLE_LINE?.toLowerCase() || "true";
|
|
1428
|
+
return ["true", "1", "yes", "on"].includes(value);
|
|
1429
|
+
}
|
|
1430
|
+
|
|
1355
1431
|
// src/server/setup.ts
|
|
1356
1432
|
var TRUTHY_ENV_VALUES = /* @__PURE__ */ new Set(["true", "1", "yes", "on"]);
|
|
1357
1433
|
var DEFAULT_BATCH_CONFIG = {
|
|
@@ -1406,21 +1482,22 @@ async function setupConsoleExporter(config) {
|
|
|
1406
1482
|
const { NodeTracerProvider } = await import("@opentelemetry/sdk-trace-node");
|
|
1407
1483
|
const { ConsoleSpanExporter, BatchSpanProcessor } = await import("@opentelemetry/sdk-trace-base");
|
|
1408
1484
|
const batchConfig = resolveBatchConfig(config.batch);
|
|
1485
|
+
const useSingleLine = isSingleLineConsoleExporterEnabled();
|
|
1486
|
+
const exporter = useSingleLine ? new SingleLineConsoleSpanExporter() : new ConsoleSpanExporter();
|
|
1487
|
+
const exporterType = useSingleLine ? "single-line" : "multi-line";
|
|
1409
1488
|
let provider = trace.getTracerProvider();
|
|
1410
1489
|
const isRealProvider = "addSpanProcessor" in provider;
|
|
1411
1490
|
if (isRealProvider) {
|
|
1412
|
-
const exporter = new ConsoleSpanExporter();
|
|
1413
1491
|
const processor = new BatchSpanProcessor(exporter, batchConfig);
|
|
1414
1492
|
provider.addSpanProcessor(processor);
|
|
1415
1493
|
console.info(
|
|
1416
|
-
`[Observability] Console exporter configured (batch=${batchConfig.maxExportBatchSize}, delay=${batchConfig.scheduledDelayMillis}ms)`
|
|
1494
|
+
`[Observability] Console exporter configured (${exporterType}, batch=${batchConfig.maxExportBatchSize}, delay=${batchConfig.scheduledDelayMillis}ms)`
|
|
1417
1495
|
);
|
|
1418
1496
|
} else {
|
|
1419
1497
|
const resource = resourceFromAttributes({
|
|
1420
1498
|
"service.name": process.env.OTEL_SERVICE_NAME || "ag-ui-server",
|
|
1421
1499
|
"service.version": "1.0.0"
|
|
1422
1500
|
});
|
|
1423
|
-
const exporter = new ConsoleSpanExporter();
|
|
1424
1501
|
const processor = new BatchSpanProcessor(exporter, batchConfig);
|
|
1425
1502
|
const tracerProvider = new NodeTracerProvider({
|
|
1426
1503
|
resource,
|
|
@@ -1428,7 +1505,7 @@ async function setupConsoleExporter(config) {
|
|
|
1428
1505
|
});
|
|
1429
1506
|
tracerProvider.register();
|
|
1430
1507
|
console.info(
|
|
1431
|
-
`[Observability] Console exporter configured (batch=${batchConfig.maxExportBatchSize}, delay=${batchConfig.scheduledDelayMillis}ms)`
|
|
1508
|
+
`[Observability] Console exporter configured (${exporterType}, batch=${batchConfig.maxExportBatchSize}, delay=${batchConfig.scheduledDelayMillis}ms)`
|
|
1432
1509
|
);
|
|
1433
1510
|
}
|
|
1434
1511
|
}
|
|
@@ -1525,6 +1602,8 @@ var ExporterType = {
|
|
|
1525
1602
|
// Annotate the CommonJS export names for ESM import in node:
|
|
1526
1603
|
0 && (module.exports = {
|
|
1527
1604
|
ExporterType,
|
|
1605
|
+
SingleLineConsoleSpanExporter,
|
|
1606
|
+
isSingleLineConsoleExporterEnabled,
|
|
1528
1607
|
setupObservability
|
|
1529
1608
|
});
|
|
1530
1609
|
//# sourceMappingURL=server.js.map
|