@cloudbase/agent-observability 1.0.1-alpha.10

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.
@@ -0,0 +1,535 @@
1
+ import {
2
+ init_src,
3
+ startObservation
4
+ } from "./chunk-ZGEMAYS4.mjs";
5
+ import "./chunk-NFEGQTCC.mjs";
6
+
7
+ // src/langchain/CallbackHandler.ts
8
+ init_src();
9
+ import { BaseCallbackHandler } from "@langchain/core/callbacks/base";
10
+ import {
11
+ AIMessage,
12
+ AIMessageChunk,
13
+ BaseMessage
14
+ } from "@langchain/core/messages";
15
+ var CallbackHandler = class extends BaseCallbackHandler {
16
+ name = "ObservabilityCallbackHandler";
17
+ userId;
18
+ version;
19
+ sessionId;
20
+ tags;
21
+ traceMetadata;
22
+ completionStartTimes = {};
23
+ promptToParentRunMap;
24
+ runMap = /* @__PURE__ */ new Map();
25
+ last_trace_id = null;
26
+ // External parent context from AG-UI.Server span
27
+ externalParentSpanContext;
28
+ // Adapter name for ROOT span prefix
29
+ adapterName;
30
+ constructor(params) {
31
+ super();
32
+ this.sessionId = params?.sessionId;
33
+ this.userId = params?.userId;
34
+ this.tags = params?.tags ?? [];
35
+ this.traceMetadata = params?.traceMetadata;
36
+ this.version = params?.version;
37
+ this.adapterName = params?.adapterName;
38
+ this.promptToParentRunMap = /* @__PURE__ */ new Map();
39
+ }
40
+ get logger() {
41
+ return console;
42
+ }
43
+ /**
44
+ * Set external parent SpanContext from AG-UI.Server span.
45
+ * This allows the CallbackHandler to link LangChain/LangGraph spans
46
+ * to the server-level span, creating a unified trace hierarchy.
47
+ *
48
+ * @param spanContext - SpanContext from the AG-UI.Server span
49
+ * @public
50
+ */
51
+ setExternalParentContext(spanContext) {
52
+ this.externalParentSpanContext = spanContext;
53
+ }
54
+ async handleLLMNewToken(token, _idx, runId, _parentRunId, _tags, _fields) {
55
+ if (runId && !(runId in this.completionStartTimes)) {
56
+ this.logger.debug(`LLM first streaming token: ${runId}`);
57
+ this.completionStartTimes[runId] = /* @__PURE__ */ new Date();
58
+ }
59
+ }
60
+ async handleChainStart(chain, inputs, runId, parentRunId, tags, metadata, runType, name) {
61
+ try {
62
+ this.logger.debug(`Chain start with Id: ${runId}`);
63
+ const runName = name ?? chain.id.at(-1)?.toString() ?? "Langchain Run";
64
+ this.registerPromptInfo(parentRunId, metadata);
65
+ let finalInput = inputs;
66
+ if (typeof inputs === "object" && "input" in inputs && Array.isArray(inputs["input"]) && inputs["input"].every((m) => m instanceof BaseMessage)) {
67
+ finalInput = inputs["input"].map(
68
+ (m) => this.extractChatMessageContent(m)
69
+ );
70
+ } else if (typeof inputs === "object" && "messages" in inputs && Array.isArray(inputs["messages"]) && inputs["messages"].every((m) => m instanceof BaseMessage)) {
71
+ finalInput = inputs["messages"].map(
72
+ (m) => this.extractChatMessageContent(m)
73
+ );
74
+ } else if (typeof inputs === "object" && "content" in inputs && typeof inputs["content"] === "string") {
75
+ finalInput = inputs["content"];
76
+ }
77
+ const observation = this.startAndRegisterObservation({
78
+ runName,
79
+ parentRunId,
80
+ runId,
81
+ tags,
82
+ metadata,
83
+ attributes: {
84
+ input: finalInput
85
+ },
86
+ asType: "span"
87
+ });
88
+ const traceTags = [.../* @__PURE__ */ new Set([...tags ?? [], ...this.tags])];
89
+ if (!parentRunId) {
90
+ observation.updateTrace({
91
+ tags: traceTags,
92
+ userId: metadata && "userId" in metadata && typeof metadata["userId"] === "string" ? metadata["userId"] : this.userId,
93
+ sessionId: metadata && "sessionId" in metadata && typeof metadata["sessionId"] === "string" ? metadata["sessionId"] : this.sessionId,
94
+ metadata: this.traceMetadata,
95
+ version: this.version
96
+ });
97
+ }
98
+ } catch (e) {
99
+ this.logger.debug(e instanceof Error ? e.message : String(e));
100
+ }
101
+ }
102
+ async handleAgentAction(action, runId, parentRunId) {
103
+ try {
104
+ this.logger.debug(`Agent action ${action.tool} with ID: ${runId}`);
105
+ this.startAndRegisterObservation({
106
+ runId,
107
+ parentRunId,
108
+ runName: action.tool,
109
+ attributes: {
110
+ input: action
111
+ },
112
+ asType: "tool"
113
+ });
114
+ } catch (e) {
115
+ this.logger.debug(e instanceof Error ? e.message : String(e));
116
+ }
117
+ }
118
+ async handleAgentEnd(action, runId, _parentRunId) {
119
+ try {
120
+ this.logger.debug(`Agent finish with ID: ${runId}`);
121
+ this.handleObservationEnd({
122
+ runId,
123
+ attributes: { output: action }
124
+ });
125
+ } catch (e) {
126
+ this.logger.debug(e instanceof Error ? e.message : String(e));
127
+ }
128
+ }
129
+ async handleChainError(err, runId, _parentRunId) {
130
+ try {
131
+ this.logger.debug(`Chain error: ${err} with ID: ${runId}`);
132
+ this.handleObservationEnd({
133
+ runId,
134
+ attributes: {
135
+ level: "ERROR",
136
+ statusMessage: err.toString()
137
+ }
138
+ });
139
+ } catch (e) {
140
+ this.logger.debug(e instanceof Error ? e.message : String(e));
141
+ }
142
+ }
143
+ async handleGenerationStart(llm, messages, runId, parentRunId, extraParams, tags, metadata, name) {
144
+ this.logger.debug(
145
+ `Generation start with ID: ${runId} and parentRunId ${parentRunId}`
146
+ );
147
+ const runName = name ?? llm.id.at(-1)?.toString() ?? "Langchain Generation";
148
+ const modelParameters = {};
149
+ const invocationParams = extraParams?.["invocation_params"];
150
+ for (const [key, value] of Object.entries({
151
+ temperature: invocationParams?.temperature,
152
+ max_tokens: invocationParams?.max_tokens,
153
+ top_p: invocationParams?.top_p,
154
+ frequency_penalty: invocationParams?.frequency_penalty,
155
+ presence_penalty: invocationParams?.presence_penalty,
156
+ request_timeout: invocationParams?.request_timeout
157
+ })) {
158
+ if (value !== void 0 && value !== null) {
159
+ modelParameters[key] = value;
160
+ }
161
+ }
162
+ let extractedModelName;
163
+ if (extraParams) {
164
+ const invocationParamsModelName = extraParams.invocation_params.model;
165
+ const metadataModelName = metadata && "ls_model_name" in metadata ? metadata["ls_model_name"] : void 0;
166
+ extractedModelName = invocationParamsModelName ?? metadataModelName;
167
+ }
168
+ const registeredPrompt = this.promptToParentRunMap.get(
169
+ parentRunId ?? "root"
170
+ );
171
+ if (registeredPrompt && parentRunId) {
172
+ this.deregisterPromptInfo(parentRunId);
173
+ }
174
+ this.startAndRegisterObservation({
175
+ runId,
176
+ parentRunId,
177
+ metadata,
178
+ tags,
179
+ runName,
180
+ attributes: {
181
+ input: messages,
182
+ model: extractedModelName,
183
+ modelParameters
184
+ },
185
+ asType: "llm"
186
+ });
187
+ }
188
+ async handleChatModelStart(llm, messages, runId, parentRunId, extraParams, tags, metadata, name) {
189
+ try {
190
+ this.logger.debug(`Chat model start with ID: ${runId}`);
191
+ const prompts = messages.flatMap(
192
+ (message) => message.map((m) => this.extractChatMessageContent(m))
193
+ );
194
+ this.handleGenerationStart(
195
+ llm,
196
+ prompts,
197
+ runId,
198
+ parentRunId,
199
+ extraParams,
200
+ tags,
201
+ metadata,
202
+ name
203
+ );
204
+ } catch (e) {
205
+ this.logger.debug(e instanceof Error ? e.message : String(e));
206
+ }
207
+ }
208
+ async handleChainEnd(outputs, runId, _parentRunId) {
209
+ try {
210
+ this.logger.debug(`Chain end with ID: ${runId}`);
211
+ let finalOutput = outputs;
212
+ if (typeof outputs === "object" && "output" in outputs && typeof outputs["output"] === "string") {
213
+ finalOutput = outputs["output"];
214
+ } else if (typeof outputs === "object" && "messages" in outputs && Array.isArray(outputs["messages"]) && outputs["messages"].every((m) => m instanceof BaseMessage)) {
215
+ finalOutput = {
216
+ messages: outputs.messages.map(
217
+ (message) => this.extractChatMessageContent(message)
218
+ )
219
+ };
220
+ }
221
+ this.handleObservationEnd({
222
+ runId,
223
+ attributes: {
224
+ output: finalOutput
225
+ }
226
+ });
227
+ this.deregisterPromptInfo(runId);
228
+ } catch (e) {
229
+ this.logger.debug(e instanceof Error ? e.message : String(e));
230
+ }
231
+ }
232
+ async handleLLMStart(llm, prompts, runId, parentRunId, extraParams, tags, metadata, name) {
233
+ try {
234
+ this.logger.debug(`LLM start with ID: ${runId}`);
235
+ this.handleGenerationStart(
236
+ llm,
237
+ prompts,
238
+ runId,
239
+ parentRunId,
240
+ extraParams,
241
+ tags,
242
+ metadata,
243
+ name
244
+ );
245
+ } catch (e) {
246
+ this.logger.debug(e instanceof Error ? e.message : String(e));
247
+ }
248
+ }
249
+ async handleToolStart(tool, input, runId, parentRunId, tags, metadata, name) {
250
+ try {
251
+ this.logger.debug(`Tool start with ID: ${runId}`);
252
+ this.startAndRegisterObservation({
253
+ runId,
254
+ parentRunId,
255
+ runName: name ?? tool.id.at(-1)?.toString() ?? "Tool execution",
256
+ attributes: {
257
+ input
258
+ },
259
+ metadata,
260
+ tags,
261
+ asType: "tool"
262
+ });
263
+ } catch (e) {
264
+ this.logger.debug(e instanceof Error ? e.message : String(e));
265
+ }
266
+ }
267
+ async handleRetrieverStart(retriever, query, runId, parentRunId, tags, metadata, name) {
268
+ try {
269
+ this.logger.debug(`Retriever start with ID: ${runId}`);
270
+ this.startAndRegisterObservation({
271
+ runId,
272
+ parentRunId,
273
+ runName: name ?? retriever.id.at(-1)?.toString() ?? "Retriever",
274
+ attributes: {
275
+ input: query
276
+ },
277
+ tags,
278
+ metadata,
279
+ asType: "span"
280
+ });
281
+ } catch (e) {
282
+ this.logger.debug(e instanceof Error ? e.message : String(e));
283
+ }
284
+ }
285
+ async handleRetrieverEnd(documents, runId, _parentRunId) {
286
+ try {
287
+ this.logger.debug(`Retriever end with ID: ${runId}`);
288
+ this.handleObservationEnd({
289
+ runId,
290
+ attributes: {
291
+ output: documents
292
+ }
293
+ });
294
+ } catch (e) {
295
+ this.logger.debug(e instanceof Error ? e.message : String(e));
296
+ }
297
+ }
298
+ async handleRetrieverError(err, runId, _parentRunId) {
299
+ try {
300
+ this.logger.debug(`Retriever error: ${err} with ID: ${runId}`);
301
+ this.handleObservationEnd({
302
+ runId,
303
+ attributes: {
304
+ level: "ERROR",
305
+ statusMessage: err.toString()
306
+ }
307
+ });
308
+ } catch (e) {
309
+ this.logger.debug(e instanceof Error ? e.message : String(e));
310
+ }
311
+ }
312
+ async handleToolEnd(output, runId, _parentRunId) {
313
+ try {
314
+ this.logger.debug(`Tool end with ID: ${runId}`);
315
+ this.handleObservationEnd({
316
+ runId,
317
+ attributes: { output }
318
+ });
319
+ } catch (e) {
320
+ this.logger.debug(e instanceof Error ? e.message : String(e));
321
+ }
322
+ }
323
+ async handleToolError(err, runId, _parentRunId) {
324
+ try {
325
+ this.logger.debug(`Tool error ${err} with ID: ${runId}`);
326
+ this.handleObservationEnd({
327
+ runId,
328
+ attributes: {
329
+ level: "ERROR",
330
+ statusMessage: err.toString()
331
+ }
332
+ });
333
+ } catch (e) {
334
+ this.logger.debug(e instanceof Error ? e.message : String(e));
335
+ }
336
+ }
337
+ async handleLLMEnd(output, runId, _parentRunId) {
338
+ try {
339
+ this.logger.debug(`LLM end with ID: ${runId}`);
340
+ const lastResponse = output.generations[output.generations.length - 1][output.generations[output.generations.length - 1].length - 1];
341
+ const llmUsage = this.extractUsageMetadata(lastResponse) ?? output.llmOutput?.["tokenUsage"];
342
+ const modelName = this.extractModelNameFromMetadata(lastResponse);
343
+ const usageDetails = {
344
+ input: llmUsage?.input_tokens ?? ("promptTokens" in llmUsage ? llmUsage?.promptTokens : void 0),
345
+ output: llmUsage?.output_tokens ?? ("completionTokens" in llmUsage ? llmUsage?.completionTokens : void 0),
346
+ total: llmUsage?.total_tokens ?? ("totalTokens" in llmUsage ? llmUsage?.totalTokens : void 0)
347
+ };
348
+ if (llmUsage && "input_token_details" in llmUsage) {
349
+ for (const [key, val] of Object.entries(
350
+ llmUsage["input_token_details"] ?? {}
351
+ )) {
352
+ usageDetails[`input_${key}`] = val;
353
+ if ("input" in usageDetails && typeof val === "number") {
354
+ usageDetails["input"] = Math.max(0, usageDetails["input"] - val);
355
+ }
356
+ }
357
+ }
358
+ if (llmUsage && "output_token_details" in llmUsage) {
359
+ for (const [key, val] of Object.entries(
360
+ llmUsage["output_token_details"] ?? {}
361
+ )) {
362
+ usageDetails[`output_${key}`] = val;
363
+ if ("output" in usageDetails && typeof val === "number") {
364
+ usageDetails["output"] = Math.max(0, usageDetails["output"] - val);
365
+ }
366
+ }
367
+ }
368
+ const extractedOutput = "message" in lastResponse ? this.extractChatMessageContent(
369
+ lastResponse["message"]
370
+ ) : lastResponse.text;
371
+ this.handleObservationEnd({
372
+ runId,
373
+ attributes: {
374
+ model: modelName,
375
+ output: extractedOutput,
376
+ completionStartTime: runId in this.completionStartTimes ? this.completionStartTimes[runId] : void 0,
377
+ usageDetails
378
+ }
379
+ });
380
+ if (runId in this.completionStartTimes) {
381
+ delete this.completionStartTimes[runId];
382
+ }
383
+ } catch (e) {
384
+ this.logger.debug(e instanceof Error ? e.message : String(e));
385
+ }
386
+ }
387
+ async handleLLMError(err, runId, _parentRunId) {
388
+ try {
389
+ this.logger.debug(`LLM error ${err} with ID: ${runId}`);
390
+ this.handleObservationEnd({
391
+ runId,
392
+ attributes: {
393
+ level: "ERROR",
394
+ statusMessage: err.toString()
395
+ }
396
+ });
397
+ } catch (e) {
398
+ this.logger.debug(e instanceof Error ? e.message : String(e));
399
+ }
400
+ }
401
+ registerPromptInfo(parentRunId, metadata) {
402
+ if (metadata && "promptInfo" in metadata && parentRunId) {
403
+ this.promptToParentRunMap.set(
404
+ parentRunId,
405
+ metadata.promptInfo
406
+ );
407
+ }
408
+ }
409
+ deregisterPromptInfo(runId) {
410
+ this.promptToParentRunMap.delete(runId);
411
+ }
412
+ startAndRegisterObservation(params) {
413
+ const { runName, runId, parentRunId, attributes, metadata, tags, asType } = params;
414
+ let parentSpanContext;
415
+ if (parentRunId) {
416
+ parentSpanContext = this.runMap.get(parentRunId)?.otelSpan.spanContext();
417
+ } else if (this.externalParentSpanContext) {
418
+ parentSpanContext = this.externalParentSpanContext;
419
+ }
420
+ let finalRunName = runName;
421
+ if (!parentRunId && this.adapterName) {
422
+ finalRunName = `Adapter.${this.adapterName}`;
423
+ }
424
+ const observation = startObservation(
425
+ finalRunName,
426
+ {
427
+ version: this.version,
428
+ metadata: this.joinTagsAndMetaData(tags, metadata),
429
+ ...attributes
430
+ },
431
+ {
432
+ asType: asType ?? "span",
433
+ parentSpanContext
434
+ }
435
+ );
436
+ this.runMap.set(runId, observation);
437
+ return observation;
438
+ }
439
+ handleObservationEnd(params) {
440
+ const { runId, attributes = {} } = params;
441
+ const observation = this.runMap.get(runId);
442
+ if (!observation) {
443
+ this.logger.warn("Observation not found in runMap. Skipping operation.");
444
+ return;
445
+ }
446
+ observation.update(attributes).end();
447
+ this.last_trace_id = observation.traceId;
448
+ this.runMap.delete(runId);
449
+ }
450
+ joinTagsAndMetaData(tags, metadata1, metadata2) {
451
+ const finalDict = {};
452
+ if (tags && tags.length > 0) {
453
+ finalDict.tags = tags;
454
+ }
455
+ if (metadata1) {
456
+ Object.assign(finalDict, metadata1);
457
+ }
458
+ if (metadata2) {
459
+ Object.assign(finalDict, metadata2);
460
+ }
461
+ return this.stripObservabilityKeysFromMetadata(finalDict);
462
+ }
463
+ stripObservabilityKeysFromMetadata(metadata) {
464
+ if (!metadata) {
465
+ return;
466
+ }
467
+ const reservedKeys = ["promptInfo", "userId", "sessionId"];
468
+ return Object.fromEntries(
469
+ Object.entries(metadata).filter(([key, _]) => !reservedKeys.includes(key))
470
+ );
471
+ }
472
+ extractUsageMetadata(generation) {
473
+ try {
474
+ const usageMetadata = "message" in generation && (AIMessage.isInstance(generation["message"]) || AIMessageChunk.isInstance(generation["message"])) ? generation["message"].usage_metadata : void 0;
475
+ return usageMetadata;
476
+ } catch (err) {
477
+ this.logger.debug(`Error extracting usage metadata: ${err}`);
478
+ return;
479
+ }
480
+ }
481
+ extractModelNameFromMetadata(generation) {
482
+ try {
483
+ return "message" in generation && (AIMessage.isInstance(generation["message"]) || AIMessageChunk.isInstance(generation["message"])) ? generation["message"].response_metadata.model_name : void 0;
484
+ } catch {
485
+ }
486
+ }
487
+ extractChatMessageContent(message) {
488
+ let response = void 0;
489
+ if (message.getType() === "human") {
490
+ response = { content: message.content, role: "user" };
491
+ } else if (message.getType() === "generic") {
492
+ response = {
493
+ content: message.content,
494
+ role: "human"
495
+ };
496
+ } else if (message.getType() === "ai") {
497
+ response = { content: message.content, role: "assistant" };
498
+ if ("tool_calls" in message && Array.isArray(message.tool_calls) && (message.tool_calls?.length ?? 0) > 0) {
499
+ response["tool_calls"] = message["tool_calls"];
500
+ }
501
+ if ("additional_kwargs" in message && "tool_calls" in message["additional_kwargs"]) {
502
+ response["tool_calls"] = message["additional_kwargs"]["tool_calls"];
503
+ }
504
+ } else if (message.getType() === "system") {
505
+ response = { content: message.content, role: "system" };
506
+ } else if (message.getType() === "function") {
507
+ response = {
508
+ content: message.content,
509
+ additional_kwargs: message.additional_kwargs,
510
+ role: message.name
511
+ };
512
+ } else if (message.getType() === "tool") {
513
+ response = {
514
+ content: message.content,
515
+ additional_kwargs: message.additional_kwargs,
516
+ role: message.name
517
+ };
518
+ } else if (!message.name) {
519
+ response = { content: message.content };
520
+ } else {
521
+ response = {
522
+ role: message.name,
523
+ content: message.content
524
+ };
525
+ }
526
+ if ((message.additional_kwargs.function_call || message.additional_kwargs.tool_calls) && response["tool_calls"] === void 0) {
527
+ return { ...response, additional_kwargs: message.additional_kwargs };
528
+ }
529
+ return response;
530
+ }
531
+ };
532
+ export {
533
+ CallbackHandler
534
+ };
535
+ //# sourceMappingURL=langchain.mjs.map
@@ -0,0 +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\";\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};\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 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\n this.promptToParentRunMap = new Map<string, PromptInfo>();\n }\n\n get logger() {\n return console;\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":[]}