@cloudbase/agent-observability 0.0.16 → 0.0.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.
@@ -1,7 +1,8 @@
1
1
  import {
2
2
  init_src,
3
3
  startObservation
4
- } from "./chunk-ZGEMAYS4.mjs";
4
+ } from "./chunk-AHSI4KTT.mjs";
5
+ import "./chunk-5EXUNUGP.mjs";
5
6
  import "./chunk-NFEGQTCC.mjs";
6
7
 
7
8
  // src/langchain/CallbackHandler.ts
@@ -26,6 +27,8 @@ var CallbackHandler = class extends BaseCallbackHandler {
26
27
  last_trace_id = null;
27
28
  // External parent context from AG-UI.Server span
28
29
  externalParentSpanContext;
30
+ // External metadata from AG-UI.Server (e.g., threadId, runId)
31
+ externalMetadata;
29
32
  // Adapter name for ROOT span prefix
30
33
  adapterName;
31
34
  // Logger for debug output (defaults to noopLogger for silent operation)
@@ -47,10 +50,12 @@ var CallbackHandler = class extends BaseCallbackHandler {
47
50
  * to the server-level span, creating a unified trace hierarchy.
48
51
  *
49
52
  * @param spanContext - SpanContext from the AG-UI.Server span
53
+ * @param metadata - Optional metadata from server (e.g., threadId, runId)
50
54
  * @public
51
55
  */
52
- setExternalParentContext(spanContext) {
56
+ setExternalParentContext(spanContext, metadata) {
53
57
  this.externalParentSpanContext = spanContext;
58
+ this.externalMetadata = metadata;
54
59
  }
55
60
  async handleLLMNewToken(token, _idx, runId, _parentRunId, _tags, _fields) {
56
61
  if (runId && !(runId in this.completionStartTimes)) {
@@ -60,7 +65,6 @@ var CallbackHandler = class extends BaseCallbackHandler {
60
65
  }
61
66
  async handleChainStart(chain, inputs, runId, parentRunId, tags, metadata, runType, name) {
62
67
  try {
63
- this.logger.debug?.(`Chain start with Id: ${runId}`);
64
68
  const runName = name ?? chain.id.at(-1)?.toString() ?? "Langchain Run";
65
69
  this.registerPromptInfo(parentRunId, metadata);
66
70
  let finalInput = inputs;
@@ -80,11 +84,11 @@ var CallbackHandler = class extends BaseCallbackHandler {
80
84
  parentRunId,
81
85
  runId,
82
86
  tags,
83
- metadata,
87
+ metadata: this.joinTagsAndMetaData(tags, metadata),
84
88
  attributes: {
85
89
  input: finalInput
86
90
  },
87
- asType: "span"
91
+ asType: "chain"
88
92
  });
89
93
  const traceTags = [.../* @__PURE__ */ new Set([...tags ?? [], ...this.tags])];
90
94
  if (!parentRunId) {
@@ -161,10 +165,15 @@ var CallbackHandler = class extends BaseCallbackHandler {
161
165
  }
162
166
  }
163
167
  let extractedModelName;
168
+ let extractedSystem;
169
+ let extractedProvider;
164
170
  if (extraParams) {
165
171
  const invocationParamsModelName = extraParams.invocation_params.model;
166
172
  const metadataModelName = metadata && "ls_model_name" in metadata ? metadata["ls_model_name"] : void 0;
167
173
  extractedModelName = invocationParamsModelName ?? metadataModelName;
174
+ if (metadata && "ls_provider" in metadata) {
175
+ extractedProvider = metadata["ls_provider"];
176
+ }
168
177
  }
169
178
  const registeredPrompt = this.promptToParentRunMap.get(
170
179
  parentRunId ?? "root"
@@ -257,7 +266,7 @@ var CallbackHandler = class extends BaseCallbackHandler {
257
266
  attributes: {
258
267
  input
259
268
  },
260
- metadata,
269
+ metadata: this.joinTagsAndMetaData(tags, metadata),
261
270
  tags,
262
271
  asType: "tool"
263
272
  });
@@ -276,8 +285,8 @@ var CallbackHandler = class extends BaseCallbackHandler {
276
285
  input: query
277
286
  },
278
287
  tags,
279
- metadata,
280
- asType: "span"
288
+ metadata: this.joinTagsAndMetaData(tags, metadata),
289
+ asType: "retriever"
281
290
  });
282
291
  } catch (e) {
283
292
  this.logger.debug?.(e instanceof Error ? e.message : String(e));
@@ -422,15 +431,17 @@ var CallbackHandler = class extends BaseCallbackHandler {
422
431
  if (!parentRunId && this.adapterName) {
423
432
  finalRunName = `Adapter.${this.adapterName}`;
424
433
  }
434
+ const serverMetadata = this.externalMetadata ? { "agui.thread_id": this.externalMetadata.threadId, "agui.run_id": this.externalMetadata.runId } : {};
425
435
  const observation = startObservation(
426
436
  finalRunName,
427
437
  {
428
438
  version: this.version,
429
439
  metadata: this.joinTagsAndMetaData(tags, metadata),
430
- ...attributes
440
+ ...attributes,
441
+ ...serverMetadata
431
442
  },
432
443
  {
433
- asType: asType ?? "span",
444
+ asType: asType ?? "chain",
434
445
  parentSpanContext
435
446
  }
436
447
  );
@@ -444,6 +455,15 @@ var CallbackHandler = class extends BaseCallbackHandler {
444
455
  this.logger.warn?.("Observation not found in runMap. Skipping operation.");
445
456
  return;
446
457
  }
458
+ const level = attributes.level;
459
+ const statusMessage = attributes.statusMessage;
460
+ if (level === "ERROR") {
461
+ try {
462
+ observation.setErrorStatus(statusMessage || "Unknown error");
463
+ } catch (e) {
464
+ this.logger.debug?.("Failed to set span error status:", e);
465
+ }
466
+ }
447
467
  observation.update(attributes).end();
448
468
  this.last_trace_id = observation.traceId;
449
469
  this.runMap.delete(runId);
@@ -465,7 +485,7 @@ var CallbackHandler = class extends BaseCallbackHandler {
465
485
  if (!metadata) {
466
486
  return;
467
487
  }
468
- const reservedKeys = ["promptInfo", "userId", "sessionId"];
488
+ const reservedKeys = ["promptInfo", "userId", "sessionId", "thread_id", "runId", "run_id"];
469
489
  return Object.fromEntries(
470
490
  Object.entries(metadata).filter(([key, _]) => !reservedKeys.includes(key))
471
491
  );
@@ -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 Observability\n *\n * Converts LangChain callback events into 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 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 Observability.\n *\n * This handler intercepts LangChain callbacks and converts them into\n * 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 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: \"chain\",\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: \"retriever\",\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?: \"llm\" | \"tool\" | \"chain\" | \"retriever\" | \"agent\";\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 ?? \"chain\",\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 observation.setErrorStatus(statusMessage || \"Unknown error\");\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,5 +1,7 @@
1
+ import { SpanExporter, ReadableSpan } from '@opentelemetry/sdk-trace-base';
2
+
1
3
  /**
2
- * Observability configuration types for AG-Kit Server.
4
+ * Observability configuration types for the server.
3
5
  *
4
6
  * Provides a unified configuration interface for trace exporters:
5
7
  * - Console: Development/debugging output
@@ -60,6 +62,7 @@ interface BatchConfig {
60
62
  * Console trace exporter configuration.
61
63
  *
62
64
  * Outputs traces to stdout in JSON format using ConsoleSpanExporter.
65
+ * Uses SimpleSpanProcessor for immediate export (no batching).
63
66
  * Useful for development and debugging.
64
67
  *
65
68
  * @example
@@ -67,7 +70,6 @@ interface BatchConfig {
67
70
  * import { ExporterType } from '@cloudbase/agent-observability/server';
68
71
  *
69
72
  * { type: ExporterType.Console }
70
- * { type: ExporterType.Console, batch: { maxExportBatchSize: 200 } }
71
73
  * ```
72
74
  *
73
75
  * @public
@@ -75,8 +77,6 @@ interface BatchConfig {
75
77
  interface ConsoleTraceConfig {
76
78
  /** Discriminator for console exporter */
77
79
  type: typeof ExporterType.Console;
78
- /** Optional batch processing configuration */
79
- batch?: BatchConfig;
80
80
  }
81
81
  /**
82
82
  * OTLP trace exporter configuration.
@@ -150,7 +150,73 @@ interface CustomTraceConfig {
150
150
  type ObservabilityConfig = ConsoleTraceConfig | OTLPTraceConfig | CustomTraceConfig;
151
151
 
152
152
  /**
153
- * Observability setup implementation for AG-Kit Server.
153
+ * Custom console exporter that outputs single-line JSON.
154
+ *
155
+ * This exporter outputs spans as single-line JSON for easier parsing
156
+ * with line-based tools (grep, jq, etc.).
157
+ *
158
+ * To switch back to standard multi-line output, use ConsoleSpanExporter instead.
159
+ *
160
+ * @example
161
+ * ```typescript
162
+ * // Single-line (current default)
163
+ * const exporter = new SingleLineConsoleSpanExporter();
164
+ *
165
+ * // Multi-line (standard OTel)
166
+ * import { ConsoleSpanExporter } from '@opentelemetry/sdk-trace-base';
167
+ * const exporter = new ConsoleSpanExporter();
168
+ * ```
169
+ *
170
+ * @packageDocumentation
171
+ */
172
+
173
+ /**
174
+ * Export result codes.
175
+ */
176
+ declare enum ExportResultCode {
177
+ SUCCESS = 0,
178
+ FAILED = 1
179
+ }
180
+ /**
181
+ * Export result interface.
182
+ */
183
+ interface ExportResult {
184
+ code: ExportResultCode;
185
+ error?: Error;
186
+ }
187
+ /**
188
+ * Custom console exporter that outputs single-line JSON.
189
+ *
190
+ * This exporter outputs spans as single-line JSON for easier parsing
191
+ * with line-based tools (grep, jq, etc.).
192
+ */
193
+ declare class SingleLineConsoleSpanExporter implements SpanExporter {
194
+ /**
195
+ * Export spans as single-line JSON.
196
+ */
197
+ export(spans: ReadableSpan[], resultCallback: (result: ExportResult) => void): void;
198
+ /**
199
+ * Shutdown the exporter.
200
+ */
201
+ shutdown(): Promise<void>;
202
+ /**
203
+ * Force flush the exporter.
204
+ */
205
+ forceFlush?(): Promise<void>;
206
+ /**
207
+ * Convert a ReadableSpan to a dictionary for JSON serialization.
208
+ */
209
+ private spanToDict;
210
+ }
211
+ /**
212
+ * Check if single-line console exporter should be used.
213
+ *
214
+ * Set CONSOLE_EXPORTER_SINGLE_LINE=false to use standard multi-line output.
215
+ */
216
+ declare function isSingleLineConsoleExporterEnabled(): boolean;
217
+
218
+ /**
219
+ * Observability setup implementation for the server.
154
220
  *
155
221
  * Merges configuration from environment variables and parameters,
156
222
  * then applies each exporter configuration.
@@ -160,4 +226,4 @@ type ObservabilityConfig = ConsoleTraceConfig | OTLPTraceConfig | CustomTraceCon
160
226
 
161
227
  declare function setupObservability(configs?: ObservabilityConfig | ObservabilityConfig[]): Promise<void>;
162
228
 
163
- export { type BatchConfig, type ConsoleTraceConfig, type CustomTraceConfig, ExporterType, type OTLPTraceConfig, type ObservabilityConfig, setupObservability };
229
+ export { type BatchConfig, type ConsoleTraceConfig, type CustomTraceConfig, ExporterType, type OTLPTraceConfig, type ObservabilityConfig, SingleLineConsoleSpanExporter, isSingleLineConsoleExporterEnabled, setupObservability };
package/dist/server.d.ts CHANGED
@@ -1,5 +1,7 @@
1
+ import { SpanExporter, ReadableSpan } from '@opentelemetry/sdk-trace-base';
2
+
1
3
  /**
2
- * Observability configuration types for AG-Kit Server.
4
+ * Observability configuration types for the server.
3
5
  *
4
6
  * Provides a unified configuration interface for trace exporters:
5
7
  * - Console: Development/debugging output
@@ -60,6 +62,7 @@ interface BatchConfig {
60
62
  * Console trace exporter configuration.
61
63
  *
62
64
  * Outputs traces to stdout in JSON format using ConsoleSpanExporter.
65
+ * Uses SimpleSpanProcessor for immediate export (no batching).
63
66
  * Useful for development and debugging.
64
67
  *
65
68
  * @example
@@ -67,7 +70,6 @@ interface BatchConfig {
67
70
  * import { ExporterType } from '@cloudbase/agent-observability/server';
68
71
  *
69
72
  * { type: ExporterType.Console }
70
- * { type: ExporterType.Console, batch: { maxExportBatchSize: 200 } }
71
73
  * ```
72
74
  *
73
75
  * @public
@@ -75,8 +77,6 @@ interface BatchConfig {
75
77
  interface ConsoleTraceConfig {
76
78
  /** Discriminator for console exporter */
77
79
  type: typeof ExporterType.Console;
78
- /** Optional batch processing configuration */
79
- batch?: BatchConfig;
80
80
  }
81
81
  /**
82
82
  * OTLP trace exporter configuration.
@@ -150,7 +150,73 @@ interface CustomTraceConfig {
150
150
  type ObservabilityConfig = ConsoleTraceConfig | OTLPTraceConfig | CustomTraceConfig;
151
151
 
152
152
  /**
153
- * Observability setup implementation for AG-Kit Server.
153
+ * Custom console exporter that outputs single-line JSON.
154
+ *
155
+ * This exporter outputs spans as single-line JSON for easier parsing
156
+ * with line-based tools (grep, jq, etc.).
157
+ *
158
+ * To switch back to standard multi-line output, use ConsoleSpanExporter instead.
159
+ *
160
+ * @example
161
+ * ```typescript
162
+ * // Single-line (current default)
163
+ * const exporter = new SingleLineConsoleSpanExporter();
164
+ *
165
+ * // Multi-line (standard OTel)
166
+ * import { ConsoleSpanExporter } from '@opentelemetry/sdk-trace-base';
167
+ * const exporter = new ConsoleSpanExporter();
168
+ * ```
169
+ *
170
+ * @packageDocumentation
171
+ */
172
+
173
+ /**
174
+ * Export result codes.
175
+ */
176
+ declare enum ExportResultCode {
177
+ SUCCESS = 0,
178
+ FAILED = 1
179
+ }
180
+ /**
181
+ * Export result interface.
182
+ */
183
+ interface ExportResult {
184
+ code: ExportResultCode;
185
+ error?: Error;
186
+ }
187
+ /**
188
+ * Custom console exporter that outputs single-line JSON.
189
+ *
190
+ * This exporter outputs spans as single-line JSON for easier parsing
191
+ * with line-based tools (grep, jq, etc.).
192
+ */
193
+ declare class SingleLineConsoleSpanExporter implements SpanExporter {
194
+ /**
195
+ * Export spans as single-line JSON.
196
+ */
197
+ export(spans: ReadableSpan[], resultCallback: (result: ExportResult) => void): void;
198
+ /**
199
+ * Shutdown the exporter.
200
+ */
201
+ shutdown(): Promise<void>;
202
+ /**
203
+ * Force flush the exporter.
204
+ */
205
+ forceFlush?(): Promise<void>;
206
+ /**
207
+ * Convert a ReadableSpan to a dictionary for JSON serialization.
208
+ */
209
+ private spanToDict;
210
+ }
211
+ /**
212
+ * Check if single-line console exporter should be used.
213
+ *
214
+ * Set CONSOLE_EXPORTER_SINGLE_LINE=false to use standard multi-line output.
215
+ */
216
+ declare function isSingleLineConsoleExporterEnabled(): boolean;
217
+
218
+ /**
219
+ * Observability setup implementation for the server.
154
220
  *
155
221
  * Merges configuration from environment variables and parameters,
156
222
  * then applies each exporter configuration.
@@ -160,4 +226,4 @@ type ObservabilityConfig = ConsoleTraceConfig | OTLPTraceConfig | CustomTraceCon
160
226
 
161
227
  declare function setupObservability(configs?: ObservabilityConfig | ObservabilityConfig[]): Promise<void>;
162
228
 
163
- export { type BatchConfig, type ConsoleTraceConfig, type CustomTraceConfig, ExporterType, type OTLPTraceConfig, type ObservabilityConfig, setupObservability };
229
+ export { type BatchConfig, type ConsoleTraceConfig, type CustomTraceConfig, ExporterType, type OTLPTraceConfig, type ObservabilityConfig, SingleLineConsoleSpanExporter, isSingleLineConsoleExporterEnabled, setupObservability };