langwatch 1.18.0 → 1.20.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +25 -11
- package/dist/agent/index.d.mts +122 -79
- package/dist/agent/index.d.ts +122 -79
- package/dist/agent/index.js +523 -300
- package/dist/agent/index.js.map +1 -1
- package/dist/agent/index.mjs +522 -301
- package/dist/agent/index.mjs.map +1 -1
- package/dist/chunk-5VYEG3RS.js +117 -0
- package/dist/chunk-5VYEG3RS.js.map +1 -0
- package/dist/{chunk-O4J3ZPZY.js → chunk-5ZNEXSAB.js} +7912 -2564
- package/dist/chunk-5ZNEXSAB.js.map +1 -0
- package/dist/chunk-BDQ2RG7R.mjs +852 -0
- package/dist/chunk-BDQ2RG7R.mjs.map +1 -0
- package/dist/chunk-BL3GHEKF.js +59 -0
- package/dist/chunk-BL3GHEKF.js.map +1 -0
- package/dist/chunk-C7IWJ2GJ.mjs +59 -0
- package/dist/chunk-C7IWJ2GJ.mjs.map +1 -0
- package/dist/chunk-EQ5CFQGJ.js +852 -0
- package/dist/chunk-EQ5CFQGJ.js.map +1 -0
- package/dist/{chunk-NPEK4RSD.mjs → chunk-ET5KYCG2.mjs} +7757 -2409
- package/dist/chunk-ET5KYCG2.mjs.map +1 -0
- package/dist/{chunk-MVQJMRM6.mjs → chunk-FKYYEGJ7.mjs} +120 -112
- package/dist/chunk-FKYYEGJ7.mjs.map +1 -0
- package/dist/{chunk-JJASOJOK.js → chunk-HCK7TCSK.js} +138 -130
- package/dist/chunk-HCK7TCSK.js.map +1 -0
- package/dist/{chunk-LCG5Y2EG.js → chunk-N76BG37W.js} +15 -101
- package/dist/chunk-N76BG37W.js.map +1 -0
- package/dist/chunk-SERULD4Z.mjs +117 -0
- package/dist/chunk-SERULD4Z.mjs.map +1 -0
- package/dist/{chunk-73QOHSHU.js → chunk-WDUUAIG3.js} +2 -2
- package/dist/chunk-WDUUAIG3.js.map +1 -0
- package/dist/{chunk-WMDQVWA6.mjs → chunk-WSGVZ3J2.mjs} +22 -108
- package/dist/chunk-WSGVZ3J2.mjs.map +1 -0
- package/dist/{chunk-57L2K66L.mjs → chunk-XQ4CP2JK.mjs} +2 -2
- package/dist/chunk-XQ4CP2JK.mjs.map +1 -0
- package/dist/cli/bundle.js +766 -479
- package/dist/implementation-B4Z2ksnA.d.mts +261 -0
- package/dist/implementation-BFUgzz5C.d.ts +261 -0
- package/dist/index.d.mts +398 -1123
- package/dist/index.d.ts +398 -1123
- package/dist/index.js +7613 -3566
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +7419 -3372
- package/dist/index.mjs.map +1 -1
- package/dist/observability-sdk/index.d.mts +16 -76
- package/dist/observability-sdk/index.d.ts +16 -76
- package/dist/observability-sdk/index.js +8 -5
- package/dist/observability-sdk/index.js.map +1 -1
- package/dist/observability-sdk/index.mjs +8 -5
- package/dist/observability-sdk/instrumentation/langchain/index.d.mts +3 -5
- package/dist/observability-sdk/instrumentation/langchain/index.d.ts +3 -5
- package/dist/observability-sdk/instrumentation/langchain/index.js +160 -112
- package/dist/observability-sdk/instrumentation/langchain/index.js.map +1 -1
- package/dist/observability-sdk/instrumentation/langchain/index.mjs +148 -100
- package/dist/observability-sdk/instrumentation/langchain/index.mjs.map +1 -1
- package/dist/observability-sdk/semconv/index.d.mts +37 -0
- package/dist/observability-sdk/semconv/index.d.ts +37 -0
- package/dist/observability-sdk/semconv/index.js +121 -0
- package/dist/observability-sdk/semconv/index.js.map +1 -0
- package/dist/observability-sdk/semconv/index.mjs +121 -0
- package/dist/observability-sdk/semconv/index.mjs.map +1 -0
- package/dist/observability-sdk/setup/node/index.d.mts +73 -313
- package/dist/observability-sdk/setup/node/index.d.ts +73 -313
- package/dist/observability-sdk/setup/node/index.js +6 -4
- package/dist/observability-sdk/setup/node/index.js.map +1 -1
- package/dist/observability-sdk/setup/node/index.mjs +5 -3
- package/dist/types-B696jWYQ.d.mts +16010 -0
- package/dist/types-Bo6OvFct.d.ts +16010 -0
- package/dist/{types-VOZv9LYO.d.mts → types-CoS5PmeU.d.mts} +22 -59
- package/dist/{types-VOZv9LYO.d.ts → types-CoS5PmeU.d.ts} +22 -59
- package/dist/{types-DLfhJb38.d.mts → types-RkiBQZ9j.d.mts} +1 -6
- package/dist/{types-DLfhJb38.d.ts → types-RkiBQZ9j.d.ts} +1 -6
- package/dist/values-1yj9l0Sa.d.mts +112 -0
- package/dist/values-1yj9l0Sa.d.ts +112 -0
- package/package.json +95 -64
- package/dist/chunk-57L2K66L.mjs.map +0 -1
- package/dist/chunk-73QOHSHU.js.map +0 -1
- package/dist/chunk-HY2N6TO5.mjs +0 -566
- package/dist/chunk-HY2N6TO5.mjs.map +0 -1
- package/dist/chunk-JJASOJOK.js.map +0 -1
- package/dist/chunk-LCG5Y2EG.js.map +0 -1
- package/dist/chunk-MVQJMRM6.mjs.map +0 -1
- package/dist/chunk-NPEK4RSD.mjs.map +0 -1
- package/dist/chunk-O4J3ZPZY.js.map +0 -1
- package/dist/chunk-UEJSGC3P.js +0 -566
- package/dist/chunk-UEJSGC3P.js.map +0 -1
- package/dist/chunk-WMDQVWA6.mjs.map +0 -1
- package/dist/implementation-BvX-7vox.d.ts +0 -716
- package/dist/implementation-CQ__V0Vc.d.mts +0 -716
- package/dist/types-CNEUr6Hm.d.ts +0 -36682
- package/dist/types-DfPAHmAh.d.mts +0 -36682
|
@@ -1,20 +1,21 @@
|
|
|
1
1
|
import {
|
|
2
2
|
chatMessageSchema,
|
|
3
|
-
getLangWatchTracer
|
|
4
|
-
|
|
3
|
+
getLangWatchTracer,
|
|
4
|
+
processSpanInputOutput
|
|
5
|
+
} from "../../../chunk-ET5KYCG2.mjs";
|
|
5
6
|
import {
|
|
6
|
-
__spreadValues,
|
|
7
7
|
shouldCaptureInput,
|
|
8
8
|
shouldCaptureOutput
|
|
9
|
-
} from "../../../chunk-
|
|
9
|
+
} from "../../../chunk-SERULD4Z.mjs";
|
|
10
|
+
import {
|
|
11
|
+
ATTR_LANGWATCH_INPUT,
|
|
12
|
+
__spreadValues
|
|
13
|
+
} from "../../../chunk-WSGVZ3J2.mjs";
|
|
10
14
|
|
|
11
15
|
// src/observability-sdk/instrumentation/langchain/index.ts
|
|
12
16
|
import { BaseCallbackHandler } from "@langchain/core/callbacks/base";
|
|
13
|
-
import {
|
|
14
|
-
|
|
15
|
-
trace,
|
|
16
|
-
SpanStatusCode
|
|
17
|
-
} from "@opentelemetry/api";
|
|
17
|
+
import { context, trace, SpanStatusCode } from "@opentelemetry/api";
|
|
18
|
+
import { isAttributeValue } from "@opentelemetry/core";
|
|
18
19
|
var LANGGRAPH_METADATA_KEYS = /* @__PURE__ */ new Set([
|
|
19
20
|
"thread_id",
|
|
20
21
|
"langgraph_step",
|
|
@@ -45,11 +46,7 @@ var LangWatchCallbackHandler = class extends BaseCallbackHandler {
|
|
|
45
46
|
}
|
|
46
47
|
if (this.seenStarts.has(runId)) return;
|
|
47
48
|
this.seenStarts.add(runId);
|
|
48
|
-
const parentCtx = getResolvedParentContext(
|
|
49
|
-
parentRunId,
|
|
50
|
-
this.spans,
|
|
51
|
-
this.parentOf
|
|
52
|
-
);
|
|
49
|
+
const parentCtx = getResolvedParentContext(parentRunId, this.spans, this.parentOf);
|
|
53
50
|
const parentSpan = parentRunId ? this.spans[parentRunId] : void 0;
|
|
54
51
|
const links = parentSpan ? [{ context: parentSpan.spanContext() }] : void 0;
|
|
55
52
|
const { name, type } = deriveNameAndType({
|
|
@@ -65,12 +62,7 @@ var LangWatchCallbackHandler = class extends BaseCallbackHandler {
|
|
|
65
62
|
if ((_a = args.tags) == null ? void 0 : _a.length)
|
|
66
63
|
span.setAttribute("langwatch.langchain.run.tags", args.tags.slice(0, 50));
|
|
67
64
|
if (shouldCaptureInput() && args.input !== void 0) {
|
|
68
|
-
|
|
69
|
-
if (i && typeof i === "object" && "type" in i && "value" in i) {
|
|
70
|
-
span.setInput(i.type, i.value);
|
|
71
|
-
} else {
|
|
72
|
-
span.setInput(i);
|
|
73
|
-
}
|
|
65
|
+
setRunInput(span, args.input);
|
|
74
66
|
}
|
|
75
67
|
if (args.extraParams) {
|
|
76
68
|
span.setAttributes(
|
|
@@ -92,15 +84,7 @@ var LangWatchCallbackHandler = class extends BaseCallbackHandler {
|
|
|
92
84
|
finishRun(runId, end) {
|
|
93
85
|
const span = this.spans[runId];
|
|
94
86
|
if (!span) return;
|
|
95
|
-
addLangChainEvent(
|
|
96
|
-
span,
|
|
97
|
-
end.event,
|
|
98
|
-
runId,
|
|
99
|
-
end.parentRunId,
|
|
100
|
-
end.tags,
|
|
101
|
-
end.md,
|
|
102
|
-
end.extra
|
|
103
|
-
);
|
|
87
|
+
addLangChainEvent(span, end.event, runId, end.parentRunId, end.tags, end.md, end.extra);
|
|
104
88
|
if (end.err) {
|
|
105
89
|
span.recordException(end.err);
|
|
106
90
|
span.setStatus({ code: SpanStatusCode.ERROR, message: end.err.message });
|
|
@@ -160,9 +144,7 @@ var LangWatchCallbackHandler = class extends BaseCallbackHandler {
|
|
|
160
144
|
}
|
|
161
145
|
const outputs = shouldCaptureOutput() ? response.generations.flat().map((g) => {
|
|
162
146
|
if ("message" in g && g.message) {
|
|
163
|
-
return convertFromLangChainMessages([
|
|
164
|
-
g.message
|
|
165
|
-
]);
|
|
147
|
+
return convertFromLangChainMessages([g.message]);
|
|
166
148
|
} else if ("text" in g && g.text) {
|
|
167
149
|
return g.text;
|
|
168
150
|
}
|
|
@@ -296,50 +278,84 @@ var LangWatchCallbackHandler = class extends BaseCallbackHandler {
|
|
|
296
278
|
function convertFromLangChainMessages(messages) {
|
|
297
279
|
const out = [];
|
|
298
280
|
for (const message of messages) {
|
|
299
|
-
out.push(
|
|
300
|
-
convertFromLangChainMessage(message)
|
|
301
|
-
);
|
|
281
|
+
out.push(convertFromLangChainMessage(message));
|
|
302
282
|
}
|
|
303
283
|
return out;
|
|
304
284
|
}
|
|
285
|
+
function messageRoleOf(message) {
|
|
286
|
+
const msgType = "type" in message ? message.type : void 0;
|
|
287
|
+
if (msgType === "human") return "user";
|
|
288
|
+
if (msgType === "ai") return "assistant";
|
|
289
|
+
if (msgType === "system") return "system";
|
|
290
|
+
if (msgType === "function") return "function";
|
|
291
|
+
if (msgType === "tool") return "tool";
|
|
292
|
+
return legacyMessageRoleOf(message);
|
|
293
|
+
}
|
|
294
|
+
function legacyMessageRoleOf(message) {
|
|
295
|
+
var _a, _b;
|
|
296
|
+
const legacyType = (_a = message._getType) == null ? void 0 : _a.call(message);
|
|
297
|
+
const lastId = (_b = message.id) == null ? void 0 : _b[message.id.length - 1];
|
|
298
|
+
if (legacyType === "human" || lastId === "HumanMessage") return "user";
|
|
299
|
+
if (legacyType === "ai" || lastId === "AIMessage") return "assistant";
|
|
300
|
+
if (legacyType === "system" || lastId === "SystemMessage") return "system";
|
|
301
|
+
if (legacyType === "function" || lastId === "FunctionMessage") return "function";
|
|
302
|
+
if (legacyType === "tool" || lastId === "ToolMessage") return "tool";
|
|
303
|
+
return "user";
|
|
304
|
+
}
|
|
305
305
|
function convertFromLangChainMessage(message) {
|
|
306
|
-
|
|
307
|
-
let
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
else if (
|
|
311
|
-
|
|
312
|
-
else if (
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
}
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
role = "tool";
|
|
325
|
-
}
|
|
306
|
+
const role = messageRoleOf(message);
|
|
307
|
+
let content;
|
|
308
|
+
if (typeof message.content === "string") {
|
|
309
|
+
content = message.content;
|
|
310
|
+
} else if (message.content == null) {
|
|
311
|
+
content = null;
|
|
312
|
+
} else if (Array.isArray(message.content)) {
|
|
313
|
+
content = message.content.map((c) => {
|
|
314
|
+
if ((c == null ? void 0 : c.type) === "text") {
|
|
315
|
+
return { type: "text", text: c.text };
|
|
316
|
+
}
|
|
317
|
+
if ((c == null ? void 0 : c.type) === "image_url") {
|
|
318
|
+
return { type: "image_url", image_url: c.image_url };
|
|
319
|
+
}
|
|
320
|
+
return { type: "text", text: JSON.stringify(c) };
|
|
321
|
+
});
|
|
322
|
+
} else {
|
|
323
|
+
content = JSON.stringify(message.content);
|
|
326
324
|
}
|
|
327
|
-
const content = typeof message.content === "string" ? message.content : message.content == null ? null : Array.isArray(message.content) ? message.content.map(
|
|
328
|
-
(c) => (c == null ? void 0 : c.type) === "text" ? { type: "text", text: c.text } : (c == null ? void 0 : c.type) === "image_url" ? { type: "image_url", image_url: c.image_url } : { type: "text", text: JSON.stringify(c) }
|
|
329
|
-
) : JSON.stringify(message.content);
|
|
330
325
|
const functionCall = message.additional_kwargs;
|
|
331
326
|
return __spreadValues({
|
|
332
327
|
role,
|
|
333
328
|
content
|
|
334
|
-
}, functionCall && typeof functionCall === "object" && Object.keys(functionCall).length > 0 ? { function_call: functionCall } : {});
|
|
329
|
+
}, functionCall && typeof functionCall === "object" && Object.keys(functionCall).length > 0 && isFunctionCallShaped(functionCall) ? { function_call: functionCall } : {});
|
|
330
|
+
}
|
|
331
|
+
function isFunctionCallShaped(kwargs) {
|
|
332
|
+
const isOptionalString = (value) => value === void 0 || typeof value === "string";
|
|
333
|
+
return isOptionalString(Reflect.get(kwargs, "name")) && isOptionalString(Reflect.get(kwargs, "arguments"));
|
|
334
|
+
}
|
|
335
|
+
function setRunInput(span, input) {
|
|
336
|
+
if (input && typeof input === "object" && "type" in input && "value" in input) {
|
|
337
|
+
span.setAttribute(
|
|
338
|
+
ATTR_LANGWATCH_INPUT,
|
|
339
|
+
JSON.stringify(processSpanInputOutput(input.type, input.value))
|
|
340
|
+
);
|
|
341
|
+
return;
|
|
342
|
+
}
|
|
343
|
+
span.setInput(input);
|
|
335
344
|
}
|
|
336
345
|
function className(serialized) {
|
|
337
346
|
const id = serialized == null ? void 0 : serialized.id;
|
|
338
347
|
if (Array.isArray(id) && id.length) return String(id[id.length - 1]);
|
|
339
|
-
const ns = serialized
|
|
348
|
+
const ns = serialized && "lc_namespace" in serialized ? serialized.lc_namespace : void 0;
|
|
340
349
|
if (Array.isArray(ns) && ns.length) return String(ns[ns.length - 1]);
|
|
341
350
|
return "";
|
|
342
351
|
}
|
|
352
|
+
function displayOf(value) {
|
|
353
|
+
var _a;
|
|
354
|
+
if (typeof value === "string") return value;
|
|
355
|
+
if (typeof value === "number" || typeof value === "boolean" || typeof value === "bigint")
|
|
356
|
+
return String(value);
|
|
357
|
+
return (_a = JSON.stringify(value)) != null ? _a : String(value);
|
|
358
|
+
}
|
|
343
359
|
function shorten(str, max = 120) {
|
|
344
360
|
return typeof str === "string" && str.length > max ? str.slice(0, max - 1) + "\u2026" : str;
|
|
345
361
|
}
|
|
@@ -400,10 +416,7 @@ function setLangGraphAttributes(span, metadata) {
|
|
|
400
416
|
if (value !== void 0) {
|
|
401
417
|
const wrapped = wrapNonScalarValues(value);
|
|
402
418
|
if (wrapped !== void 0) {
|
|
403
|
-
span.setAttribute(
|
|
404
|
-
`langwatch.langgraph.${key}`,
|
|
405
|
-
wrapped
|
|
406
|
-
);
|
|
419
|
+
span.setAttribute(`langwatch.langgraph.${key}`, wrapped);
|
|
407
420
|
}
|
|
408
421
|
}
|
|
409
422
|
}
|
|
@@ -418,18 +431,22 @@ function buildLangChainMetadataAttributes(metadata) {
|
|
|
418
431
|
);
|
|
419
432
|
}
|
|
420
433
|
function applyGenAIAttrs(span, metadata, extraParams) {
|
|
421
|
-
var _a, _b, _c, _d
|
|
434
|
+
var _a, _b, _c, _d;
|
|
422
435
|
const md = metadata != null ? metadata : {};
|
|
423
|
-
const ex = extraParams != null ? extraParams : {};
|
|
424
436
|
const provider = md.ls_provider;
|
|
425
|
-
const requestModel = (
|
|
426
|
-
const temperature = (
|
|
427
|
-
const responseModel = (
|
|
428
|
-
if (provider) span.setAttribute("gen_ai.system", provider);
|
|
429
|
-
if (requestModel
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
if (responseModel
|
|
437
|
+
const requestModel = (_b = (_a = md.ls_model_name) != null ? _a : propertyOf(md.kwargs, "model")) != null ? _b : propertyOf(extraParams == null ? void 0 : extraParams.kwargs, "model");
|
|
438
|
+
const temperature = (_d = (_c = md.ls_temperature) != null ? _c : propertyOf(md.kwargs, "temperature")) != null ? _d : propertyOf(extraParams == null ? void 0 : extraParams.kwargs, "temperature");
|
|
439
|
+
const responseModel = propertyOf(md.response_metadata, "model_name");
|
|
440
|
+
if (provider && isAttributeValue(provider)) span.setAttribute("gen_ai.system", provider);
|
|
441
|
+
if (requestModel && isAttributeValue(requestModel))
|
|
442
|
+
span.setAttribute("gen_ai.request.model", requestModel);
|
|
443
|
+
if (typeof temperature === "number") span.setAttribute("gen_ai.request.temperature", temperature);
|
|
444
|
+
if (responseModel && isAttributeValue(responseModel))
|
|
445
|
+
span.setAttribute("gen_ai.response.model", responseModel);
|
|
446
|
+
}
|
|
447
|
+
function propertyOf(value, key) {
|
|
448
|
+
if (value === null || value === void 0) return void 0;
|
|
449
|
+
return Reflect.get(Object(value), key);
|
|
433
450
|
}
|
|
434
451
|
function getResolvedParentContext(runId, spans, parentOf) {
|
|
435
452
|
let cur = runId;
|
|
@@ -440,14 +457,61 @@ function getResolvedParentContext(runId, spans, parentOf) {
|
|
|
440
457
|
}
|
|
441
458
|
return context.active();
|
|
442
459
|
}
|
|
460
|
+
function typeFromRunKind(runType) {
|
|
461
|
+
if (runType === "tool") {
|
|
462
|
+
return "tool";
|
|
463
|
+
}
|
|
464
|
+
if (runType === "retriever") {
|
|
465
|
+
return "rag";
|
|
466
|
+
}
|
|
467
|
+
if (runType === "llm" || runType === "chat") {
|
|
468
|
+
return "llm";
|
|
469
|
+
}
|
|
470
|
+
return "chain";
|
|
471
|
+
}
|
|
472
|
+
function llmRunName({ md, cls }) {
|
|
473
|
+
var _a, _b;
|
|
474
|
+
const prov = (_a = md == null ? void 0 : md.ls_provider) != null ? _a : "LLM";
|
|
475
|
+
const model = (_b = md == null ? void 0 : md.ls_model_name) != null ? _b : cls || "call";
|
|
476
|
+
const temp = md == null ? void 0 : md.ls_temperature;
|
|
477
|
+
let tempStr = null;
|
|
478
|
+
if (typeof temp === "number") {
|
|
479
|
+
tempStr = temp.toString();
|
|
480
|
+
} else if (temp != null) {
|
|
481
|
+
tempStr = JSON.stringify(temp);
|
|
482
|
+
}
|
|
483
|
+
return tempStr != null ? `${prov} ${model} (temp ${tempStr})` : `${prov} ${model}`;
|
|
484
|
+
}
|
|
485
|
+
function routerRunName(md) {
|
|
486
|
+
var _a;
|
|
487
|
+
const pathArr = md == null ? void 0 : md.langgraph_path;
|
|
488
|
+
const fromNode = Array.isArray(pathArr) && pathArr.length ? pathArr[pathArr.length - 1] : void 0;
|
|
489
|
+
const triggers = md == null ? void 0 : md.langgraph_triggers;
|
|
490
|
+
const decision = Array.isArray(triggers) ? String((_a = triggers.find((t) => String(t).startsWith("branch:"))) != null ? _a : "").replace(
|
|
491
|
+
/^branch:(to:)?/,
|
|
492
|
+
""
|
|
493
|
+
) : void 0;
|
|
494
|
+
return `Route: ${fromNode != null ? fromNode : "unknown"} \u2192 ${decision != null ? decision : "unknown"}`;
|
|
495
|
+
}
|
|
496
|
+
function toolRunName({
|
|
497
|
+
metadata,
|
|
498
|
+
cls,
|
|
499
|
+
inputs,
|
|
500
|
+
serialized
|
|
501
|
+
}) {
|
|
502
|
+
var _a, _b;
|
|
503
|
+
const tool = displayOf((_a = metadata == null ? void 0 : metadata.name) != null ? _a : cls || "tool");
|
|
504
|
+
const prev = (_b = previewInput(inputs)) != null ? _b : previewInput(serialized && "input" in serialized ? serialized.input : void 0);
|
|
505
|
+
return prev ? `Tool: ${tool} \u2014 ${prev}` : `Tool: ${tool}`;
|
|
506
|
+
}
|
|
443
507
|
function deriveNameAndType(opts) {
|
|
444
|
-
var _a
|
|
508
|
+
var _a;
|
|
445
509
|
const { runType, name, serialized, metadata, inputs } = opts;
|
|
446
510
|
const hardName = (_a = name == null ? void 0 : name.trim()) != null ? _a : metadata == null ? void 0 : metadata.operation_name;
|
|
447
511
|
if (hardName) {
|
|
448
512
|
return {
|
|
449
513
|
name: hardName,
|
|
450
|
-
type: runType
|
|
514
|
+
type: typeFromRunKind(runType)
|
|
451
515
|
};
|
|
452
516
|
}
|
|
453
517
|
const cls = className(serialized);
|
|
@@ -457,43 +521,27 @@ function deriveNameAndType(opts) {
|
|
|
457
521
|
const isRouter = cls.startsWith("Branch<") || hasTriggers;
|
|
458
522
|
const isGraphRunner = (md == null ? void 0 : md.langgraph_path) && !(md == null ? void 0 : md.langgraph_node);
|
|
459
523
|
if (runType === "llm" || runType === "chat") {
|
|
460
|
-
|
|
461
|
-
const model = (_c = md == null ? void 0 : md.ls_model_name) != null ? _c : cls || "call";
|
|
462
|
-
const temp = md == null ? void 0 : md.ls_temperature;
|
|
463
|
-
const tempStr = temp != null ? typeof temp === "number" ? temp.toString() : JSON.stringify(temp) : null;
|
|
464
|
-
const nm = tempStr != null ? `${prov} ${model} (temp ${tempStr})` : `${prov} ${model}`;
|
|
465
|
-
return { name: nm, type: "llm" };
|
|
524
|
+
return { name: llmRunName({ md, cls }), type: "llm" };
|
|
466
525
|
}
|
|
467
526
|
if (isRouter) {
|
|
468
|
-
|
|
469
|
-
const fromNode = Array.isArray(pathArr) && pathArr.length ? pathArr[pathArr.length - 1] : void 0;
|
|
470
|
-
const decision = Array.isArray(md == null ? void 0 : md.langgraph_triggers) ? String(
|
|
471
|
-
(_d = md.langgraph_triggers.find(
|
|
472
|
-
(t) => String(t).startsWith("branch:")
|
|
473
|
-
)) != null ? _d : ""
|
|
474
|
-
).replace(/^branch:(to:)?/, "") : void 0;
|
|
475
|
-
const nm = `Route: ${fromNode != null ? fromNode : "unknown"} \u2192 ${decision != null ? decision : "unknown"}`;
|
|
476
|
-
return { name: nm, type: "component" };
|
|
527
|
+
return { name: routerRunName(md), type: "component" };
|
|
477
528
|
}
|
|
478
529
|
if (hasNode) {
|
|
479
530
|
const step = md == null ? void 0 : md.langgraph_step;
|
|
480
|
-
const nm = `Node: ${md.langgraph_node}${step != null ? ` (step ${
|
|
531
|
+
const nm = `Node: ${displayOf(md.langgraph_node)}${step != null ? ` (step ${displayOf(step)})` : ""}`;
|
|
481
532
|
return { name: nm, type: "component" };
|
|
482
533
|
}
|
|
483
534
|
if (isGraphRunner && runType === "chain") {
|
|
484
535
|
return { name: "Graph: LangGraph", type: "chain" };
|
|
485
536
|
}
|
|
486
537
|
if (runType === "tool") {
|
|
487
|
-
|
|
488
|
-
const prev = (_f = previewInput(inputs)) != null ? _f : previewInput(serialized == null ? void 0 : serialized.input);
|
|
489
|
-
return {
|
|
490
|
-
name: prev ? `Tool: ${tool} \u2014 ${prev}` : `Tool: ${tool}`,
|
|
491
|
-
type: "tool"
|
|
492
|
-
};
|
|
538
|
+
return { name: toolRunName({ metadata, cls, inputs, serialized }), type: "tool" };
|
|
493
539
|
}
|
|
540
|
+
return fallbackNameAndType({ runType, cls });
|
|
541
|
+
}
|
|
542
|
+
function fallbackNameAndType({ runType, cls }) {
|
|
494
543
|
if (runType === "retriever") return { name: "Retriever", type: "rag" };
|
|
495
|
-
if (cls.includes("Agent"))
|
|
496
|
-
return { name: `Agent: ${cls}`, type: "component" };
|
|
544
|
+
if (cls.includes("Agent")) return { name: `Agent: ${cls}`, type: "component" };
|
|
497
545
|
if (cls.startsWith("Runnable"))
|
|
498
546
|
return { name: `Runnable: ${cls.replace(/^Runnable/, "")}`, type: "chain" };
|
|
499
547
|
return { name: cls || "LangChain operation", type: "chain" };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/observability-sdk/instrumentation/langchain/index.ts"],"sourcesContent":["import type { AgentAction, AgentFinish } from \"@langchain/core/agents\";\nimport { BaseCallbackHandler } from \"@langchain/core/callbacks/base\";\nimport { type DocumentInterface } from \"@langchain/core/documents\";\nimport type { Serialized } from \"@langchain/core/load/serializable\";\nimport { type BaseMessage } from \"@langchain/core/messages\";\nimport type { ChatGeneration, LLMResult } from \"@langchain/core/outputs\";\nimport {\n chatMessageSchema,\n type ChatMessage,\n type ChatRichContent,\n} from \"../../../internal/generated/types/tracer\";\nimport type { ChainValues } from \"@langchain/core/utils/types\";\nimport { getLangWatchTracer } from \"../../tracer\";\nimport type { LangWatchSpan } from \"../../span\";\nimport {\n context,\n trace,\n SpanStatusCode,\n type Attributes,\n} from \"@opentelemetry/api\";\nimport { shouldCaptureInput, shouldCaptureOutput } from \"../../config\";\n\ntype RunKind = \"llm\" | \"chat\" | \"chain\" | \"tool\" | \"retriever\";\n\ntype StartArgs = {\n kind: RunKind;\n runId: string;\n parentRunId?: string;\n serialized?: Serialized;\n metadata?: Record<string, unknown>;\n tags?: string[];\n name?: string;\n extraParams?: Record<string, unknown>;\n input?: unknown; // already prepared for setInput()\n};\n\nconst LANGGRAPH_METADATA_KEYS = new Set<string>([\n \"thread_id\",\n \"langgraph_step\",\n \"langgraph_node\",\n \"langgraph_triggers\",\n \"langgraph_path\",\n \"langgraph_checkpoint_ns\",\n \"__pregel_task_id\",\n \"checkpoint_ns\",\n]);\n\nexport class LangWatchCallbackHandler extends BaseCallbackHandler {\n name = \"LangWatchCallbackHandler\";\n tracer = getLangWatchTracer(\"langwatch.instrumentation.langchain\");\n\n private spans: Record<string, LangWatchSpan | undefined> = {};\n private parentOf: Record<string, string | undefined> = {};\n private skipped: Record<string, true | undefined> = {};\n private seenStarts = new Set<string>();\n\n private startRunSpan(args: StartArgs) {\n const { runId, parentRunId, serialized, tags } = args;\n this.parentOf[runId] = parentRunId;\n\n // if we want to skip, we record as such as we cn do context matching latet\n if (ctxSkip(serialized, tags)) {\n this.skipped[runId] = true;\n return;\n }\n if (this.seenStarts.has(runId)) return;\n this.seenStarts.add(runId);\n\n const parentCtx = getResolvedParentContext(\n parentRunId,\n this.spans,\n this.parentOf\n );\n const parentSpan = parentRunId ? this.spans[parentRunId] : void 0;\n const links = parentSpan\n ? [{ context: parentSpan.spanContext() }]\n : void 0;\n\n const { name, type } = deriveNameAndType({\n runType: args.kind,\n name: args.name,\n serialized: args.serialized,\n metadata: args.metadata,\n tags: args.tags,\n inputs: args.input,\n });\n\n const span = this.tracer.startSpan(name, { links }, parentCtx);\n span.setType(type);\n\n if (args.tags?.length)\n span.setAttribute(\"langwatch.langchain.run.tags\", args.tags.slice(0, 50));\n\n if (shouldCaptureInput() && args.input !== void 0) {\n const i: any = args.input as any;\n if (i && typeof i === \"object\" && \"type\" in i && \"value\" in i) {\n span.setInput(i.type, i.value);\n } else {\n span.setInput(i);\n }\n }\n\n if (args.extraParams) {\n span.setAttributes(\n Object.fromEntries(\n Object.entries(args.extraParams).map(([k, v]) => [\n `langwatch.langchain.run.extra_params.${k}`,\n wrapNonScalarValues(v),\n ])\n )\n );\n }\n\n if (args.metadata) {\n applyGenAIAttrs(span, args.metadata, args.extraParams);\n setLangGraphAttributes(span, args.metadata);\n span.setAttributes(buildLangChainMetadataAttributes(args.metadata));\n }\n\n this.spans[runId] = span;\n }\n\n private finishRun(\n runId: string,\n end: {\n output?: unknown;\n err?: Error;\n event: string;\n parentRunId?: string;\n extra?: Attributes;\n tags?: string[];\n md?: Record<string, unknown>;\n }\n ) {\n const span = this.spans[runId];\n if (!span) return;\n\n addLangChainEvent(\n span,\n end.event,\n runId,\n end.parentRunId,\n end.tags,\n end.md,\n end.extra\n );\n\n if (end.err) {\n span.recordException(end.err);\n span.setStatus({ code: SpanStatusCode.ERROR, message: end.err.message });\n } else if (shouldCaptureOutput() && end.output !== undefined) {\n span.setOutput(end.output as any);\n }\n\n span.end();\n\n delete this.spans[runId];\n delete this.parentOf[runId];\n delete this.skipped[runId];\n this.seenStarts.delete(runId);\n }\n\n async handleLLMStart(\n llm: Serialized,\n prompts: string[],\n runId: string,\n parentRunId?: string,\n extraParams?: Record<string, unknown>,\n tags?: string[],\n metadata?: Record<string, unknown>,\n name?: string\n ): Promise<void> {\n const input = shouldCaptureInput() && prompts\n ? {\n type: \"list\",\n value: prompts.map((p) => ({ type: \"text\", value: p })),\n }\n : void 0;\n\n this.startRunSpan({\n kind: \"llm\",\n runId,\n parentRunId,\n serialized: llm,\n metadata,\n tags,\n name,\n extraParams,\n input,\n });\n }\n\n async handleChatModelStart(\n llm: Serialized,\n messages: BaseMessage[][],\n runId: string,\n parentRunId?: string,\n extraParams?: Record<string, unknown>,\n tags?: string[],\n metadata?: Record<string, unknown>,\n name?: string\n ): Promise<void> {\n const input = shouldCaptureInput()\n ? {\n type: \"chat_messages\",\n value: messages.flatMap(convertFromLangChainMessages),\n }\n : void 0;\n\n this.startRunSpan({\n kind: \"chat\",\n runId,\n parentRunId,\n serialized: llm,\n metadata,\n tags,\n name,\n extraParams,\n input,\n });\n }\n\n async handleLLMEnd(\n response: LLMResult,\n runId: string,\n parentRunId?: string\n ): Promise<void> {\n const span = this.spans[runId];\n const tu = (response.llmOutput as any)?.tokenUsage as\n | {\n promptTokens?: number;\n completionTokens?: number;\n totalTokens?: number;\n }\n | undefined;\n if (span && tu) {\n span.setAttributes({\n \"gen_ai.usage.prompt_tokens\": tu.promptTokens ?? 0,\n \"gen_ai.usage.completion_tokens\": tu.completionTokens ?? 0,\n \"gen_ai.usage.total_tokens\": tu.totalTokens ?? 0,\n });\n }\n\n const outputs = shouldCaptureOutput()\n ? response.generations.flat().map((g) => {\n if (\"message\" in g && g.message) {\n return convertFromLangChainMessages([\n (g as ChatGeneration).message,\n ]);\n } else if (\"text\" in g && g.text) {\n return g.text;\n }\n return g;\n })\n : undefined;\n\n this.finishRun(runId, {\n output: outputs,\n event: \"handleLLMEnd\",\n parentRunId,\n });\n }\n\n async handleLLMError(\n err: Error,\n runId: string,\n parentRunId?: string\n ): Promise<void> {\n this.finishRun(runId, { err, event: \"handleLLMError\", parentRunId });\n }\n\n async handleChainStart(\n chain: Serialized,\n inputs: ChainValues,\n runId: string,\n parentRunId?: string,\n tags?: string[],\n metadata?: Record<string, unknown>,\n _runType?: string,\n name?: string\n ): Promise<void> {\n this.startRunSpan({\n kind: \"chain\",\n runId,\n parentRunId,\n serialized: chain,\n metadata,\n tags,\n name,\n input: shouldCaptureInput() ? inputs : void 0,\n });\n\n if (_runType) {\n const span = this.spans[runId];\n if (span) span.setAttribute(\"langwatch.langchain.run.type\", _runType);\n }\n }\n\n async handleChainEnd(\n output: ChainValues,\n runId: string,\n parentRunId?: string\n ): Promise<void> {\n this.finishRun(runId, { output, event: \"handleChainEnd\", parentRunId });\n }\n\n async handleChainError(\n err: Error,\n runId: string,\n parentRunId?: string,\n tags?: string[],\n kwargs?: { inputs?: Record<string, unknown> | undefined }\n ): Promise<void> {\n this.finishRun(runId, {\n err,\n event: \"handleChainError\",\n parentRunId,\n tags,\n md: kwargs,\n });\n }\n\n async handleToolStart(\n tool: Serialized,\n input: string,\n runId: string,\n parentRunId?: string,\n tags?: string[],\n metadata?: Record<string, unknown>,\n name?: string\n ): Promise<void> {\n this.startRunSpan({\n kind: \"tool\",\n runId,\n parentRunId,\n serialized: tool,\n metadata,\n tags,\n name,\n input: shouldCaptureInput() ? { type: \"text\", value: input } : void 0,\n });\n\n const span = this.spans[runId];\n if (span) {\n span.setAttributes({\n \"langwatch.langchain.run.id\": runId,\n \"langwatch.langchain.run.parent_id\": parentRunId,\n });\n }\n }\n\n async handleToolEnd(\n output: string,\n runId: string,\n parentRunId?: string\n ): Promise<void> {\n this.finishRun(runId, {\n output: shouldCaptureOutput()\n ? { type: \"text\", value: output }\n : void 0,\n event: \"handleToolEnd\",\n parentRunId,\n });\n }\n\n async handleToolError(\n err: Error,\n runId: string,\n parentRunId?: string,\n tags?: string[]\n ): Promise<void> {\n this.finishRun(runId, { err, event: \"handleToolError\", parentRunId, tags });\n }\n\n async handleRetrieverStart(\n retriever: Serialized,\n query: string,\n runId: string,\n parentRunId?: string,\n tags?: string[],\n metadata?: Record<string, unknown>,\n name?: string\n ) {\n this.startRunSpan({\n kind: \"retriever\",\n runId,\n parentRunId,\n serialized: retriever,\n metadata,\n tags,\n name,\n input: shouldCaptureInput() ? { type: \"text\", value: query } : void 0,\n });\n\n const span = this.spans[runId];\n if (span) {\n span.setAttributes({\n \"langwatch.langchain.run.id\": runId,\n \"langwatch.langchain.run.parent_id\": parentRunId,\n });\n }\n }\n\n async handleRetrieverEnd(\n documents: DocumentInterface<Record<string, any>>[],\n runId: string,\n parentRunId?: string,\n tags?: string[]\n ) {\n const span = this.spans[runId];\n\n if (span && shouldCaptureOutput()) {\n span.setOutput(documents);\n }\n\n if (span && shouldCaptureInput()) {\n span.setRAGContexts(\n documents.map((document) => ({\n document_id: document.metadata.id,\n chunk_id: document.metadata.chunk_id,\n content: document.pageContent,\n }))\n );\n }\n\n this.finishRun(runId, { event: \"handleRetrieverEnd\", parentRunId, tags });\n }\n\n async handleRetrieverError(\n err: Error,\n runId: string,\n parentRunId?: string,\n tags?: string[]\n ) {\n this.finishRun(runId, {\n err,\n event: \"handleRetrieverError\",\n parentRunId,\n tags,\n });\n }\n\n async handleAgentAction(\n _action: AgentAction,\n runId: string,\n parentRunId?: string,\n tags?: string[]\n ): Promise<void> {\n const span = this.spans[runId];\n if (span) {\n addLangChainEvent(span, \"handleAgentAction\", runId, parentRunId, tags);\n span.setType(\"agent\");\n }\n }\n\n async handleAgentEnd(\n action: AgentFinish,\n runId: string,\n parentRunId?: string,\n tags?: string[]\n ): Promise<void> {\n this.finishRun(runId, {\n output: shouldCaptureOutput()\n ? { type: \"json\", value: action.returnValues }\n : void 0,\n event: \"handleAgentEnd\",\n parentRunId,\n tags,\n });\n }\n}\n\nexport function convertFromLangChainMessages(\n messages: BaseMessage[]\n): ChatMessage[] {\n const out: ChatMessage[] = [];\n for (const message of messages) {\n out.push(\n convertFromLangChainMessage(message as BaseMessage & { id?: string[] })\n );\n }\n return out;\n}\n\nfunction convertFromLangChainMessage(\n message: BaseMessage & { id?: string[] }\n): ChatMessage {\n let role: ChatMessage[\"role\"] = \"user\";\n\n const msgType = (message as any).type as string | undefined;\n if (msgType === \"human\") role = \"user\";\n else if (msgType === \"ai\") role = \"assistant\";\n else if (msgType === \"system\") role = \"system\";\n else if (msgType === \"function\") role = \"function\";\n else if (msgType === \"tool\") role = \"tool\";\n else {\n if (\n (message as any)?._getType?.() === \"human\" ||\n message.id?.[message.id.length - 1] === \"HumanMessage\"\n ) {\n role = \"user\";\n } else if (\n (message as any)?._getType?.() === \"ai\" ||\n message.id?.[message.id.length - 1] === \"AIMessage\"\n ) {\n role = \"assistant\";\n } else if (\n (message as any)?._getType?.() === \"system\" ||\n message.id?.[message.id.length - 1] === \"SystemMessage\"\n ) {\n role = \"system\";\n } else if (\n (message as any)?._getType?.() === \"function\" ||\n message.id?.[message.id.length - 1] === \"FunctionMessage\"\n ) {\n role = \"function\";\n } else if (\n (message as any)?._getType?.() === \"tool\" ||\n message.id?.[message.id.length - 1] === \"ToolMessage\"\n ) {\n role = \"tool\";\n }\n }\n\n const content: ChatMessage[\"content\"] =\n typeof (message as any).content === \"string\"\n ? ((message as any).content as string)\n : (message as any).content == null\n ? null\n : Array.isArray((message as any).content)\n ? (message as any).content.map(\n (c: any): ChatRichContent =>\n c?.type === \"text\"\n ? { type: \"text\", text: c.text }\n : c?.type === \"image_url\"\n ? { type: \"image_url\", image_url: c.image_url }\n : { type: \"text\", text: JSON.stringify(c) }\n )\n : JSON.stringify((message as any).content);\n\n const functionCall = (message as any).additional_kwargs;\n\n return {\n role,\n content,\n ...(functionCall &&\n typeof functionCall === \"object\" &&\n Object.keys(functionCall).length > 0\n ? { function_call: functionCall }\n : {}),\n };\n}\n\nfunction className(serialized?: Serialized): string {\n const id = (serialized as any)?.id;\n if (Array.isArray(id) && id.length) return String(id[id.length - 1]);\n const ns = (serialized as any)?.lc_namespace;\n if (Array.isArray(ns) && ns.length) return String(ns[ns.length - 1]);\n\n return \"\";\n}\n\nfunction shorten(str: string, max = 120): string {\n return typeof str === \"string\" && str.length > max\n ? str.slice(0, max - 1) + \"…\"\n : str;\n}\n\nfunction previewInput(v: unknown): string | undefined {\n if (typeof v === \"string\") {\n const s = v.trim();\n return s ? shorten(s, 120) : void 0;\n }\n return void 0;\n}\n\nfunction ctxSkip(serialized?: Serialized, tags?: string[]) {\n const cls = className(serialized);\n return (\n cls.startsWith(\"ChannelWrite\") ||\n (tags?.includes(\"langsmith:hidden\") ?? false)\n );\n}\n\nfunction wrapNonScalarValues(\n value: unknown\n): string | number | boolean | undefined {\n if (value === void 0) return void 0;\n if (value === null) return JSON.stringify(null);\n if (\n typeof value === \"string\" ||\n typeof value === \"number\" ||\n typeof value === \"boolean\"\n )\n return value;\n\n // Special-case: ChatMessage[] detection via zod schema the project already has\n const chatMessages = chatMessageSchema.array().safeParse(value as any);\n if (Array.isArray(value) && chatMessages.success) {\n return JSON.stringify({ type: \"chat_messages\", value: chatMessages.data });\n }\n\n try {\n const seen = new WeakSet();\n const json = JSON.stringify(value as any, (k, val) => {\n if (typeof val === \"object\" && val !== null) {\n if (seen.has(val)) return \"[Circular]\";\n seen.add(val);\n }\n return val;\n });\n return json;\n } catch {\n return JSON.stringify({ type: \"raw\", value: \"[Non-Serializable]\" });\n }\n}\n\nfunction addLangChainEvent(\n span: LangWatchSpan,\n eventName: string,\n runId: string,\n parentRunId: string | undefined,\n tags?: string[],\n metadata?: Record<string, unknown>,\n attributes?: Attributes\n) {\n const attrs: Attributes = {\n \"langwatch.langchain.run.id\": runId,\n \"langwatch.langchain.run.parent_id\": parentRunId,\n \"langwatch.langchain.event.name\": eventName,\n ...attributes,\n };\n\n if (tags?.length) attrs[\"langwatch.langchain.run.tags\"] = tags.slice(0, 50);\n if (metadata) {\n Object.entries(metadata).forEach(([key, value]) => {\n attrs[key] = wrapNonScalarValues(value);\n });\n }\n\n span.addEvent(\"langwatch.langchain.callback\", attrs);\n}\n\nfunction setLangGraphAttributes(\n span: LangWatchSpan,\n metadata?: Record<string, unknown>\n) {\n if (!metadata) return;\n const keys = Object.keys(metadata);\n for (const key of keys) {\n const value = (metadata as any)[key];\n if (value !== undefined) {\n const wrapped = wrapNonScalarValues(value);\n if (wrapped !== undefined) {\n span.setAttribute(\n `langwatch.langgraph.${key}` as const,\n wrapped as any\n );\n }\n }\n }\n}\n\nfunction buildLangChainMetadataAttributes(metadata: Record<string, unknown>) {\n if (!metadata) return {};\n return Object.fromEntries(\n Object.entries(metadata)\n .filter(([key]) => !LANGGRAPH_METADATA_KEYS.has(key))\n .map(([key, value]) => [\n `langwatch.langchain.run.metadata.${key}`,\n wrapNonScalarValues(value),\n ])\n );\n}\n\nfunction applyGenAIAttrs(\n span: LangWatchSpan,\n metadata?: Record<string, unknown>,\n extraParams?: Record<string, unknown>\n) {\n const md = (metadata ?? {}) as any;\n const ex = (extraParams ?? {}) as any;\n\n const provider = md.ls_provider as string | undefined;\n const requestModel = md.ls_model_name ?? md.kwargs?.model ?? ex.kwargs?.model;\n const temperature =\n md.ls_temperature ?? md.kwargs?.temperature ?? ex.kwargs?.temperature;\n const responseModel = md.response_metadata?.model_name as string | undefined;\n\n if (provider) span.setAttribute(\"gen_ai.system\", provider);\n if (requestModel) span.setAttribute(\"gen_ai.request.model\", requestModel);\n if (typeof temperature === \"number\")\n span.setAttribute(\"gen_ai.request.temperature\", temperature);\n if (responseModel) span.setAttribute(\"gen_ai.response.model\", responseModel);\n}\n\nfunction getResolvedParentContext(\n runId: string | undefined,\n spans: Record<string, LangWatchSpan | undefined>,\n parentOf: Record<string, string | undefined>\n) {\n let cur = runId;\n while (cur) {\n const s = spans[cur];\n if (s) return trace.setSpan(context.active(), s);\n cur = parentOf[cur];\n }\n return context.active();\n}\n\nfunction deriveNameAndType(opts: {\n runType: RunKind;\n name?: string;\n serialized?: Serialized;\n metadata?: Record<string, unknown>;\n tags?: string[];\n inputs?: unknown;\n}): { name: string; type: \"llm\" | \"chain\" | \"tool\" | \"rag\" | \"component\" } {\n const { runType, name, serialized, metadata, inputs } = opts;\n\n // user-specified name / metadata override\n const hardName = (name?.trim() ?? (metadata as any)?.operation_name) as\n | string\n | undefined;\n if (hardName) {\n return {\n name: hardName,\n type:\n runType === \"tool\"\n ? \"tool\"\n : runType === \"retriever\"\n ? \"rag\"\n : runType === \"llm\" || runType === \"chat\"\n ? \"llm\"\n : \"chain\",\n };\n }\n\n const cls = className(serialized);\n const md = (metadata ?? {}) as any;\n\n // LangGraph node / router - prioritize routers over nodes\n const hasNode = md?.langgraph_node != null;\n const hasTriggers = Array.isArray(md?.langgraph_triggers) && md.langgraph_triggers.length > 0;\n const isRouter =\n cls.startsWith(\"Branch<\") || hasTriggers;\n const isGraphRunner = md?.langgraph_path && !md?.langgraph_node;\n\n // LLM / Chat - always prioritize runType over metadata\n if (runType === \"llm\" || runType === \"chat\") {\n const prov = (md?.ls_provider as string) ?? \"LLM\";\n const model = (md?.ls_model_name as string) ?? (cls || \"call\");\n const temp = md?.ls_temperature;\n const tempStr =\n temp != null\n ? typeof temp === \"number\"\n ? temp.toString()\n : JSON.stringify(temp)\n : null;\n const nm =\n tempStr != null\n ? `${prov} ${model} (temp ${tempStr})`\n : `${prov} ${model}`;\n return { name: nm, type: \"llm\" };\n }\n\n // Prioritize LangGraph routers over nodes (but after LLM/Chat)\n if (isRouter) {\n const pathArr = md?.langgraph_path as string[] | undefined;\n const fromNode =\n Array.isArray(pathArr) && pathArr.length\n ? pathArr[pathArr.length - 1]\n : undefined;\n const decision = Array.isArray(md?.langgraph_triggers)\n ? String(\n md.langgraph_triggers.find((t: any) =>\n String(t).startsWith(\"branch:\")\n ) ?? \"\"\n ).replace(/^branch:(to:)?/, \"\")\n : undefined;\n const nm = `Route: ${fromNode ?? \"unknown\"} → ${decision ?? \"unknown\"}`;\n return { name: nm, type: \"component\" };\n }\n\n if (hasNode) {\n const step = md?.langgraph_step;\n const nm = `Node: ${md.langgraph_node}${\n step != null ? ` (step ${String(step)})` : \"\"\n }`;\n return { name: nm, type: \"component\" };\n }\n if (isGraphRunner && runType === \"chain\") {\n return { name: \"Graph: LangGraph\", type: \"chain\" };\n }\n\n // Tool\n if (runType === \"tool\") {\n const tool = (metadata as any)?.name ?? (cls || \"tool\");\n const prev =\n previewInput(inputs) ?? previewInput((serialized as any)?.input);\n return {\n name: prev ? `Tool: ${tool} — ${prev}` : `Tool: ${tool}`,\n type: \"tool\",\n };\n }\n\n // Retriever\n if (runType === \"retriever\") return { name: \"Retriever\", type: \"rag\" };\n\n // Fallbacks\n if (cls.includes(\"Agent\"))\n return { name: `Agent: ${cls}`, type: \"component\" };\n if (cls.startsWith(\"Runnable\"))\n return { name: `Runnable: ${cls.replace(/^Runnable/, \"\")}`, type: \"chain\" };\n return { name: cls || \"LangChain operation\", type: \"chain\" };\n}\n\n// Export helper functions for testing\nexport {\n className,\n shorten,\n previewInput,\n ctxSkip,\n wrapNonScalarValues,\n addLangChainEvent,\n setLangGraphAttributes,\n buildLangChainMetadataAttributes,\n applyGenAIAttrs,\n getResolvedParentContext,\n deriveNameAndType,\n};\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../../../src/observability-sdk/instrumentation/langchain/index.ts"],"sourcesContent":["import type { AgentAction, AgentFinish } from \"@langchain/core/agents\";\nimport { BaseCallbackHandler } from \"@langchain/core/callbacks/base\";\nimport { type DocumentInterface } from \"@langchain/core/documents\";\nimport type { Serialized } from \"@langchain/core/load/serializable\";\nimport { type BaseMessage } from \"@langchain/core/messages\";\nimport type { ChatGeneration, LLMResult } from \"@langchain/core/outputs\";\nimport type { ChainValues } from \"@langchain/core/utils/types\";\nimport { context, trace, SpanStatusCode, type Attributes } from \"@opentelemetry/api\";\nimport { isAttributeValue } from \"@opentelemetry/core\";\n\nimport {\n chatMessageSchema,\n type ChatMessage,\n type ChatRichContent,\n} from \"../../../internal/generated/types/tracer\";\nimport { shouldCaptureInput, shouldCaptureOutput } from \"../../config\";\nimport { ATTR_LANGWATCH_INPUT } from \"../../semconv/attributes\";\nimport { processSpanInputOutput, type LangWatchSpan } from \"../../span\";\nimport { getLangWatchTracer } from \"../../tracer\";\n\ntype RunKind = \"llm\" | \"chat\" | \"chain\" | \"tool\" | \"retriever\";\n\ntype StartArgs = {\n kind: RunKind;\n runId: string;\n parentRunId?: string;\n serialized?: Serialized;\n metadata?: Record<string, unknown>;\n tags?: string[];\n name?: string;\n extraParams?: Record<string, unknown>;\n input?: unknown; // already prepared for setInput()\n};\n\nconst LANGGRAPH_METADATA_KEYS = new Set<string>([\n \"thread_id\",\n \"langgraph_step\",\n \"langgraph_node\",\n \"langgraph_triggers\",\n \"langgraph_path\",\n \"langgraph_checkpoint_ns\",\n \"__pregel_task_id\",\n \"checkpoint_ns\",\n]);\n\nexport class LangWatchCallbackHandler extends BaseCallbackHandler {\n name = \"LangWatchCallbackHandler\";\n tracer = getLangWatchTracer(\"langwatch.instrumentation.langchain\");\n\n private spans: Record<string, LangWatchSpan | undefined> = {};\n private parentOf: Record<string, string | undefined> = {};\n private skipped: Record<string, true | undefined> = {};\n private seenStarts = new Set<string>();\n\n private startRunSpan(args: StartArgs) {\n const { runId, parentRunId, serialized, tags } = args;\n this.parentOf[runId] = parentRunId;\n\n // if we want to skip, we record as such as we cn do context matching latet\n if (ctxSkip(serialized, tags)) {\n this.skipped[runId] = true;\n return;\n }\n if (this.seenStarts.has(runId)) return;\n this.seenStarts.add(runId);\n\n const parentCtx = getResolvedParentContext(parentRunId, this.spans, this.parentOf);\n const parentSpan = parentRunId ? this.spans[parentRunId] : void 0;\n const links = parentSpan ? [{ context: parentSpan.spanContext() }] : void 0;\n\n const { name, type } = deriveNameAndType({\n runType: args.kind,\n name: args.name,\n serialized: args.serialized,\n metadata: args.metadata,\n tags: args.tags,\n inputs: args.input,\n });\n\n const span = this.tracer.startSpan(name, { links }, parentCtx);\n span.setType(type);\n\n if (args.tags?.length)\n span.setAttribute(\"langwatch.langchain.run.tags\", args.tags.slice(0, 50));\n\n if (shouldCaptureInput() && args.input !== void 0) {\n setRunInput(span, args.input);\n }\n\n if (args.extraParams) {\n span.setAttributes(\n Object.fromEntries(\n Object.entries(args.extraParams).map(([k, v]) => [\n `langwatch.langchain.run.extra_params.${k}`,\n wrapNonScalarValues(v),\n ]),\n ),\n );\n }\n\n if (args.metadata) {\n applyGenAIAttrs(span, args.metadata, args.extraParams);\n setLangGraphAttributes(span, args.metadata);\n span.setAttributes(buildLangChainMetadataAttributes(args.metadata));\n }\n\n this.spans[runId] = span;\n }\n\n private finishRun(\n runId: string,\n end: {\n output?: unknown;\n err?: Error;\n event: string;\n parentRunId?: string;\n extra?: Attributes;\n tags?: string[];\n md?: Record<string, unknown>;\n },\n ) {\n const span = this.spans[runId];\n if (!span) return;\n\n addLangChainEvent(span, end.event, runId, end.parentRunId, end.tags, end.md, end.extra);\n\n if (end.err) {\n span.recordException(end.err);\n span.setStatus({ code: SpanStatusCode.ERROR, message: end.err.message });\n } else if (shouldCaptureOutput() && end.output !== undefined) {\n span.setOutput(end.output);\n }\n\n span.end();\n\n delete this.spans[runId];\n delete this.parentOf[runId];\n delete this.skipped[runId];\n this.seenStarts.delete(runId);\n }\n\n async handleLLMStart(\n llm: Serialized,\n prompts: string[],\n runId: string,\n parentRunId?: string,\n extraParams?: Record<string, unknown>,\n tags?: string[],\n metadata?: Record<string, unknown>,\n name?: string,\n ): Promise<void> {\n const input =\n shouldCaptureInput() && prompts\n ? {\n type: \"list\",\n value: prompts.map((p) => ({ type: \"text\", value: p })),\n }\n : void 0;\n\n this.startRunSpan({\n kind: \"llm\",\n runId,\n parentRunId,\n serialized: llm,\n metadata,\n tags,\n name,\n extraParams,\n input,\n });\n }\n\n async handleChatModelStart(\n llm: Serialized,\n messages: BaseMessage[][],\n runId: string,\n parentRunId?: string,\n extraParams?: Record<string, unknown>,\n tags?: string[],\n metadata?: Record<string, unknown>,\n name?: string,\n ): Promise<void> {\n const input = shouldCaptureInput()\n ? {\n type: \"chat_messages\",\n value: messages.flatMap(convertFromLangChainMessages),\n }\n : void 0;\n\n this.startRunSpan({\n kind: \"chat\",\n runId,\n parentRunId,\n serialized: llm,\n metadata,\n tags,\n name,\n extraParams,\n input,\n });\n }\n\n async handleLLMEnd(response: LLMResult, runId: string, parentRunId?: string): Promise<void> {\n const span = this.spans[runId];\n const tu = response.llmOutput?.tokenUsage as\n | {\n promptTokens?: number;\n completionTokens?: number;\n totalTokens?: number;\n }\n | undefined;\n if (span && tu) {\n span.setAttributes({\n \"gen_ai.usage.prompt_tokens\": tu.promptTokens ?? 0,\n \"gen_ai.usage.completion_tokens\": tu.completionTokens ?? 0,\n \"gen_ai.usage.total_tokens\": tu.totalTokens ?? 0,\n });\n }\n\n const outputs = shouldCaptureOutput()\n ? response.generations.flat().map((g) => {\n if (\"message\" in g && g.message) {\n return convertFromLangChainMessages([(g as ChatGeneration).message]);\n } else if (\"text\" in g && g.text) {\n return g.text;\n }\n return g;\n })\n : undefined;\n\n this.finishRun(runId, {\n output: outputs,\n event: \"handleLLMEnd\",\n parentRunId,\n });\n }\n\n async handleLLMError(err: Error, runId: string, parentRunId?: string): Promise<void> {\n this.finishRun(runId, { err, event: \"handleLLMError\", parentRunId });\n }\n\n async handleChainStart(\n chain: Serialized,\n inputs: ChainValues,\n runId: string,\n parentRunId?: string,\n tags?: string[],\n metadata?: Record<string, unknown>,\n _runType?: string,\n name?: string,\n ): Promise<void> {\n this.startRunSpan({\n kind: \"chain\",\n runId,\n parentRunId,\n serialized: chain,\n metadata,\n tags,\n name,\n input: shouldCaptureInput() ? inputs : void 0,\n });\n\n if (_runType) {\n const span = this.spans[runId];\n if (span) span.setAttribute(\"langwatch.langchain.run.type\", _runType);\n }\n }\n\n async handleChainEnd(output: ChainValues, runId: string, parentRunId?: string): Promise<void> {\n this.finishRun(runId, { output, event: \"handleChainEnd\", parentRunId });\n }\n\n async handleChainError(\n err: Error,\n runId: string,\n parentRunId?: string,\n tags?: string[],\n kwargs?: { inputs?: Record<string, unknown> | undefined },\n ): Promise<void> {\n this.finishRun(runId, {\n err,\n event: \"handleChainError\",\n parentRunId,\n tags,\n md: kwargs,\n });\n }\n\n async handleToolStart(\n tool: Serialized,\n input: string,\n runId: string,\n parentRunId?: string,\n tags?: string[],\n metadata?: Record<string, unknown>,\n name?: string,\n ): Promise<void> {\n this.startRunSpan({\n kind: \"tool\",\n runId,\n parentRunId,\n serialized: tool,\n metadata,\n tags,\n name,\n input: shouldCaptureInput() ? { type: \"text\", value: input } : void 0,\n });\n\n const span = this.spans[runId];\n if (span) {\n span.setAttributes({\n \"langwatch.langchain.run.id\": runId,\n \"langwatch.langchain.run.parent_id\": parentRunId,\n });\n }\n }\n\n async handleToolEnd(output: string, runId: string, parentRunId?: string): Promise<void> {\n this.finishRun(runId, {\n output: shouldCaptureOutput() ? { type: \"text\", value: output } : void 0,\n event: \"handleToolEnd\",\n parentRunId,\n });\n }\n\n async handleToolError(\n err: Error,\n runId: string,\n parentRunId?: string,\n tags?: string[],\n ): Promise<void> {\n this.finishRun(runId, { err, event: \"handleToolError\", parentRunId, tags });\n }\n\n async handleRetrieverStart(\n retriever: Serialized,\n query: string,\n runId: string,\n parentRunId?: string,\n tags?: string[],\n metadata?: Record<string, unknown>,\n name?: string,\n ) {\n this.startRunSpan({\n kind: \"retriever\",\n runId,\n parentRunId,\n serialized: retriever,\n metadata,\n tags,\n name,\n input: shouldCaptureInput() ? { type: \"text\", value: query } : void 0,\n });\n\n const span = this.spans[runId];\n if (span) {\n span.setAttributes({\n \"langwatch.langchain.run.id\": runId,\n \"langwatch.langchain.run.parent_id\": parentRunId,\n });\n }\n }\n\n async handleRetrieverEnd(\n documents: DocumentInterface[],\n runId: string,\n parentRunId?: string,\n tags?: string[],\n ) {\n const span = this.spans[runId];\n\n if (span && shouldCaptureOutput()) {\n span.setOutput(documents);\n }\n\n if (span && shouldCaptureInput()) {\n span.setRAGContexts(\n documents.map((document) => ({\n document_id: document.metadata.id,\n chunk_id: document.metadata.chunk_id,\n content: document.pageContent,\n })),\n );\n }\n\n this.finishRun(runId, { event: \"handleRetrieverEnd\", parentRunId, tags });\n }\n\n async handleRetrieverError(err: Error, runId: string, parentRunId?: string, tags?: string[]) {\n this.finishRun(runId, {\n err,\n event: \"handleRetrieverError\",\n parentRunId,\n tags,\n });\n }\n\n async handleAgentAction(\n _action: AgentAction,\n runId: string,\n parentRunId?: string,\n tags?: string[],\n ): Promise<void> {\n const span = this.spans[runId];\n if (span) {\n addLangChainEvent(span, \"handleAgentAction\", runId, parentRunId, tags);\n span.setType(\"agent\");\n }\n }\n\n async handleAgentEnd(\n action: AgentFinish,\n runId: string,\n parentRunId?: string,\n tags?: string[],\n ): Promise<void> {\n this.finishRun(runId, {\n output: shouldCaptureOutput() ? { type: \"json\", value: action.returnValues } : void 0,\n event: \"handleAgentEnd\",\n parentRunId,\n tags,\n });\n }\n}\n\nexport function convertFromLangChainMessages(messages: BaseMessage[]): ChatMessage[] {\n const out: ChatMessage[] = [];\n for (const message of messages) {\n out.push(convertFromLangChainMessage(message as BaseMessage & { id?: string[] }));\n }\n return out;\n}\n\nfunction messageRoleOf(message: BaseMessage & { id?: string[] }): ChatMessage[\"role\"] {\n const msgType = \"type\" in message ? message.type : undefined;\n if (msgType === \"human\") return \"user\";\n if (msgType === \"ai\") return \"assistant\";\n if (msgType === \"system\") return \"system\";\n if (msgType === \"function\") return \"function\";\n if (msgType === \"tool\") return \"tool\";\n return legacyMessageRoleOf(message);\n}\n\nfunction legacyMessageRoleOf(message: BaseMessage & { id?: string[] }): ChatMessage[\"role\"] {\n const legacyType = message._getType?.();\n const lastId = message.id?.[message.id.length - 1];\n if (legacyType === \"human\" || lastId === \"HumanMessage\") return \"user\";\n if (legacyType === \"ai\" || lastId === \"AIMessage\") return \"assistant\";\n if (legacyType === \"system\" || lastId === \"SystemMessage\") return \"system\";\n if (legacyType === \"function\" || lastId === \"FunctionMessage\") return \"function\";\n if (legacyType === \"tool\" || lastId === \"ToolMessage\") return \"tool\";\n return \"user\";\n}\n\nfunction convertFromLangChainMessage(message: BaseMessage & { id?: string[] }): ChatMessage {\n const role = messageRoleOf(message);\n\n let content: ChatMessage[\"content\"];\n if (typeof message.content === \"string\") {\n content = message.content;\n } else if (message.content == null) {\n content = null;\n } else if (Array.isArray(message.content)) {\n content = message.content.map((c): ChatRichContent => {\n if (c?.type === \"text\") {\n return { type: \"text\", text: c.text };\n }\n if (c?.type === \"image_url\") {\n return { type: \"image_url\", image_url: c.image_url };\n }\n return { type: \"text\", text: JSON.stringify(c) };\n });\n } else {\n content = JSON.stringify(message.content);\n }\n\n const functionCall = message.additional_kwargs;\n\n return {\n role,\n content,\n ...(functionCall &&\n typeof functionCall === \"object\" &&\n Object.keys(functionCall).length > 0 &&\n isFunctionCallShaped(functionCall)\n ? { function_call: functionCall }\n : {}),\n };\n}\n\n/** All of `additional_kwargs` travels as `function_call`; its name/arguments must be strings. */\nfunction isFunctionCallShaped<T extends object>(\n kwargs: T,\n): kwargs is T & { name?: string; arguments?: string } {\n const isOptionalString = (value: unknown) => value === undefined || typeof value === \"string\";\n return (\n isOptionalString(Reflect.get(kwargs, \"name\")) &&\n isOptionalString(Reflect.get(kwargs, \"arguments\"))\n );\n}\n\n/** A `{ type, value }` input keeps its declared type, as `span.setInput(type, value)` would. */\nfunction setRunInput(span: LangWatchSpan, input: unknown) {\n if (input && typeof input === \"object\" && \"type\" in input && \"value\" in input) {\n span.setAttribute(\n ATTR_LANGWATCH_INPUT,\n JSON.stringify(processSpanInputOutput(input.type, input.value)),\n );\n return;\n }\n span.setInput(input);\n}\n\nfunction className(serialized?: Serialized): string {\n const id = serialized?.id;\n if (Array.isArray(id) && id.length) return String(id[id.length - 1]);\n const ns = serialized && \"lc_namespace\" in serialized ? serialized.lc_namespace : undefined;\n if (Array.isArray(ns) && ns.length) return String(ns[ns.length - 1]);\n\n return \"\";\n}\n\nfunction displayOf(value: unknown): string {\n if (typeof value === \"string\") return value;\n if (typeof value === \"number\" || typeof value === \"boolean\" || typeof value === \"bigint\")\n return String(value);\n return JSON.stringify(value) ?? String(value);\n}\n\nfunction shorten(str: string, max = 120): string {\n return typeof str === \"string\" && str.length > max ? str.slice(0, max - 1) + \"…\" : str;\n}\n\nfunction previewInput(v: unknown): string | undefined {\n if (typeof v === \"string\") {\n const s = v.trim();\n return s ? shorten(s, 120) : void 0;\n }\n return void 0;\n}\n\nfunction ctxSkip(serialized?: Serialized, tags?: string[]) {\n const cls = className(serialized);\n return cls.startsWith(\"ChannelWrite\") || (tags?.includes(\"langsmith:hidden\") ?? false);\n}\n\nfunction wrapNonScalarValues(value: unknown): string | number | boolean | undefined {\n if (value === void 0) return void 0;\n if (value === null) return JSON.stringify(null);\n if (typeof value === \"string\" || typeof value === \"number\" || typeof value === \"boolean\")\n return value;\n\n // Special-case: ChatMessage[] detection via zod schema the project already has\n const chatMessages = chatMessageSchema.array().safeParse(value);\n if (Array.isArray(value) && chatMessages.success) {\n return JSON.stringify({ type: \"chat_messages\", value: chatMessages.data });\n }\n\n try {\n const seen = new WeakSet();\n const json = JSON.stringify(value, (k, val) => {\n if (typeof val === \"object\" && val !== null) {\n if (seen.has(val)) return \"[Circular]\";\n seen.add(val);\n }\n return val;\n });\n return json;\n } catch {\n return JSON.stringify({ type: \"raw\", value: \"[Non-Serializable]\" });\n }\n}\n\nfunction addLangChainEvent(\n span: LangWatchSpan,\n eventName: string,\n runId: string,\n parentRunId: string | undefined,\n tags?: string[],\n metadata?: Record<string, unknown>,\n attributes?: Attributes,\n) {\n const attrs: Attributes = {\n \"langwatch.langchain.run.id\": runId,\n \"langwatch.langchain.run.parent_id\": parentRunId,\n \"langwatch.langchain.event.name\": eventName,\n ...attributes,\n };\n\n if (tags?.length) attrs[\"langwatch.langchain.run.tags\"] = tags.slice(0, 50);\n if (metadata) {\n Object.entries(metadata).forEach(([key, value]) => {\n attrs[key] = wrapNonScalarValues(value);\n });\n }\n\n span.addEvent(\"langwatch.langchain.callback\", attrs);\n}\n\nfunction setLangGraphAttributes(span: LangWatchSpan, metadata?: Record<string, unknown>) {\n if (!metadata) return;\n const keys = Object.keys(metadata);\n for (const key of keys) {\n const value = metadata[key];\n if (value !== undefined) {\n const wrapped = wrapNonScalarValues(value);\n if (wrapped !== undefined) {\n span.setAttribute(`langwatch.langgraph.${key}` as const, wrapped);\n }\n }\n }\n}\n\nfunction buildLangChainMetadataAttributes(metadata: Record<string, unknown>) {\n if (!metadata) return {};\n return Object.fromEntries(\n Object.entries(metadata)\n .filter(([key]) => !LANGGRAPH_METADATA_KEYS.has(key))\n .map(([key, value]) => [\n `langwatch.langchain.run.metadata.${key}`,\n wrapNonScalarValues(value),\n ]),\n );\n}\n\nfunction applyGenAIAttrs(\n span: LangWatchSpan,\n metadata?: Record<string, unknown>,\n extraParams?: Record<string, unknown>,\n) {\n const md = metadata ?? {};\n\n const provider = md.ls_provider;\n const requestModel =\n md.ls_model_name ?? propertyOf(md.kwargs, \"model\") ?? propertyOf(extraParams?.kwargs, \"model\");\n const temperature =\n md.ls_temperature ??\n propertyOf(md.kwargs, \"temperature\") ??\n propertyOf(extraParams?.kwargs, \"temperature\");\n const responseModel = propertyOf(md.response_metadata, \"model_name\");\n\n if (provider && isAttributeValue(provider)) span.setAttribute(\"gen_ai.system\", provider);\n if (requestModel && isAttributeValue(requestModel))\n span.setAttribute(\"gen_ai.request.model\", requestModel);\n if (typeof temperature === \"number\") span.setAttribute(\"gen_ai.request.temperature\", temperature);\n if (responseModel && isAttributeValue(responseModel))\n span.setAttribute(\"gen_ai.response.model\", responseModel);\n}\n\nfunction propertyOf(value: unknown, key: string): unknown {\n if (value === null || value === undefined) return undefined;\n return Reflect.get(Object(value), key);\n}\n\nfunction getResolvedParentContext(\n runId: string | undefined,\n spans: Record<string, LangWatchSpan | undefined>,\n parentOf: Record<string, string | undefined>,\n) {\n let cur = runId;\n while (cur) {\n const s = spans[cur];\n if (s) return trace.setSpan(context.active(), s);\n cur = parentOf[cur];\n }\n return context.active();\n}\n\nfunction typeFromRunKind(runType: RunKind): \"llm\" | \"chain\" | \"tool\" | \"rag\" | \"component\" {\n if (runType === \"tool\") {\n return \"tool\";\n }\n if (runType === \"retriever\") {\n return \"rag\";\n }\n if (runType === \"llm\" || runType === \"chat\") {\n return \"llm\";\n }\n return \"chain\";\n}\n\nfunction llmRunName({ md, cls }: { md: Record<string, unknown>; cls: string }): string {\n const prov = (md?.ls_provider as string) ?? \"LLM\";\n const model = (md?.ls_model_name as string) ?? (cls || \"call\");\n const temp = md?.ls_temperature;\n let tempStr: string | null = null;\n if (typeof temp === \"number\") {\n tempStr = temp.toString();\n } else if (temp != null) {\n tempStr = JSON.stringify(temp);\n }\n return tempStr != null ? `${prov} ${model} (temp ${tempStr})` : `${prov} ${model}`;\n}\n\nfunction routerRunName(md: Record<string, unknown>): string {\n const pathArr = md?.langgraph_path as string[] | undefined;\n const fromNode =\n Array.isArray(pathArr) && pathArr.length ? pathArr[pathArr.length - 1] : undefined;\n const triggers = md?.langgraph_triggers;\n const decision = Array.isArray(triggers)\n ? String(triggers.find((t) => String(t).startsWith(\"branch:\")) ?? \"\").replace(\n /^branch:(to:)?/,\n \"\",\n )\n : undefined;\n return `Route: ${fromNode ?? \"unknown\"} → ${decision ?? \"unknown\"}`;\n}\n\nfunction toolRunName({\n metadata,\n cls,\n inputs,\n serialized,\n}: {\n metadata?: Record<string, unknown>;\n cls: string;\n inputs?: unknown;\n serialized?: Serialized;\n}): string {\n const tool = displayOf(metadata?.name ?? (cls || \"tool\"));\n const prev =\n previewInput(inputs) ??\n previewInput(serialized && \"input\" in serialized ? serialized.input : undefined);\n return prev ? `Tool: ${tool} — ${prev}` : `Tool: ${tool}`;\n}\n\nfunction deriveNameAndType(opts: {\n runType: RunKind;\n name?: string;\n serialized?: Serialized;\n metadata?: Record<string, unknown>;\n tags?: string[];\n inputs?: unknown;\n}): { name: string; type: \"llm\" | \"chain\" | \"tool\" | \"rag\" | \"component\" } {\n const { runType, name, serialized, metadata, inputs } = opts;\n\n // user-specified name / metadata override\n const hardName = (name?.trim() ?? metadata?.operation_name) as string | undefined;\n if (hardName) {\n return {\n name: hardName,\n type: typeFromRunKind(runType),\n };\n }\n\n const cls = className(serialized);\n const md = metadata ?? {};\n\n // LangGraph node / router - prioritize routers over nodes\n const hasNode = md?.langgraph_node != null;\n const hasTriggers = Array.isArray(md?.langgraph_triggers) && md.langgraph_triggers.length > 0;\n const isRouter = cls.startsWith(\"Branch<\") || hasTriggers;\n const isGraphRunner = md?.langgraph_path && !md?.langgraph_node;\n\n // LLM / Chat - always prioritize runType over metadata\n if (runType === \"llm\" || runType === \"chat\") {\n return { name: llmRunName({ md, cls }), type: \"llm\" };\n }\n\n // Prioritize LangGraph routers over nodes (but after LLM/Chat)\n if (isRouter) {\n return { name: routerRunName(md), type: \"component\" };\n }\n\n if (hasNode) {\n const step = md?.langgraph_step;\n const nm = `Node: ${displayOf(md.langgraph_node)}${step != null ? ` (step ${displayOf(step)})` : \"\"}`;\n return { name: nm, type: \"component\" };\n }\n if (isGraphRunner && runType === \"chain\") {\n return { name: \"Graph: LangGraph\", type: \"chain\" };\n }\n\n // Tool\n if (runType === \"tool\") {\n return { name: toolRunName({ metadata, cls, inputs, serialized }), type: \"tool\" };\n }\n\n return fallbackNameAndType({ runType, cls });\n}\n\nfunction fallbackNameAndType({ runType, cls }: { runType: RunKind; cls: string }): {\n name: string;\n type: \"llm\" | \"chain\" | \"tool\" | \"rag\" | \"component\";\n} {\n if (runType === \"retriever\") return { name: \"Retriever\", type: \"rag\" };\n\n if (cls.includes(\"Agent\")) return { name: `Agent: ${cls}`, type: \"component\" };\n if (cls.startsWith(\"Runnable\"))\n return { name: `Runnable: ${cls.replace(/^Runnable/, \"\")}`, type: \"chain\" };\n return { name: cls || \"LangChain operation\", type: \"chain\" };\n}\n\n// Export helper functions for testing\nexport {\n className,\n shorten,\n previewInput,\n ctxSkip,\n wrapNonScalarValues,\n addLangChainEvent,\n setLangGraphAttributes,\n buildLangChainMetadataAttributes,\n applyGenAIAttrs,\n getResolvedParentContext,\n deriveNameAndType,\n};\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
export { A as ATTR_LANGWATCH_CUSTOMER_ID, c as ATTR_LANGWATCH_EVALUATION_CUSTOM, d as ATTR_LANGWATCH_INPUT, e as ATTR_LANGWATCH_LABELS, f as ATTR_LANGWATCH_LANGCHAIN_EVENT_NAME, g as ATTR_LANGWATCH_LANGCHAIN_RUN_EXTRA_PARAMS, h as ATTR_LANGWATCH_LANGCHAIN_RUN_ID, i as ATTR_LANGWATCH_LANGCHAIN_RUN_METADATA, j as ATTR_LANGWATCH_LANGCHAIN_RUN_PARENT_ID, k as ATTR_LANGWATCH_LANGCHAIN_RUN_TAGS, m as ATTR_LANGWATCH_LANGCHAIN_RUN_TYPE, n as ATTR_LANGWATCH_LANGCHAIN_TAGS, o as ATTR_LANGWATCH_METRICS, p as ATTR_LANGWATCH_OUTPUT, q as ATTR_LANGWATCH_PARAMS, r as ATTR_LANGWATCH_PROMPT_HANDLE, s as ATTR_LANGWATCH_PROMPT_ID, t as ATTR_LANGWATCH_PROMPT_SELECTED_ID, u as ATTR_LANGWATCH_PROMPT_VARIABLES, v as ATTR_LANGWATCH_PROMPT_VERSION_ID, w as ATTR_LANGWATCH_PROMPT_VERSION_NUMBER, x as ATTR_LANGWATCH_RAG_CONTEXTS, y as ATTR_LANGWATCH_SDK_LANGUAGE, z as ATTR_LANGWATCH_SDK_NAME, B as ATTR_LANGWATCH_SDK_VERSION, C as ATTR_LANGWATCH_SPAN_TYPE, D as ATTR_LANGWATCH_STREAMING, E as ATTR_LANGWATCH_TAGS, F as ATTR_LANGWATCH_THREAD_ID, G as ATTR_LANGWATCH_TIMESTAMPS, H as ATTR_LANGWATCH_USER_ID, S as SemConvAttributeKey, a as SemConvAttributes, b as SemConvLogRecordAttributes } from '../../types-CoS5PmeU.mjs';
|
|
2
|
+
export { a as VAL_GEN_AI_FINISH_REASONS, b as VAL_GEN_AI_FINISH_REASON_CONTENT_FILTER, c as VAL_GEN_AI_FINISH_REASON_ERROR, d as VAL_GEN_AI_FINISH_REASON_LENGTH, e as VAL_GEN_AI_FINISH_REASON_STOP, f as VAL_GEN_AI_FINISH_REASON_TOOL_CALLS, V as VAL_GEN_AI_SYSTEMS, g as VAL_GEN_AI_SYSTEM_ANTHROPIC, h as VAL_GEN_AI_SYSTEM_AWS_BEDROCK, i as VAL_GEN_AI_SYSTEM_AZURE_AI_INFERENCE, j as VAL_GEN_AI_SYSTEM_AZURE_AI_OPENAI, k as VAL_GEN_AI_SYSTEM_COHERE, l as VAL_GEN_AI_SYSTEM_DEEPSEEK, m as VAL_GEN_AI_SYSTEM_GCP_GEMINI, n as VAL_GEN_AI_SYSTEM_GCP_GEN_AI, o as VAL_GEN_AI_SYSTEM_GCP_VERTEX_AI, p as VAL_GEN_AI_SYSTEM_GROQ, q as VAL_GEN_AI_SYSTEM_IBM_WATSONX_AI, r as VAL_GEN_AI_SYSTEM_MISTRAL_AI, s as VAL_GEN_AI_SYSTEM_OPENAI, t as VAL_GEN_AI_SYSTEM_PERPLEXITY, u as VAL_GEN_AI_SYSTEM_XAI } from '../../values-1yj9l0Sa.mjs';
|
|
3
|
+
import '@opentelemetry/api';
|
|
4
|
+
import '@opentelemetry/api-logs';
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* GenAI system message event name
|
|
8
|
+
* Used for log records representing system messages in AI conversations
|
|
9
|
+
*/
|
|
10
|
+
declare const LOG_EVNT_GEN_AI_SYSTEM_MESSAGE = "gen.ai.system_message";
|
|
11
|
+
/**
|
|
12
|
+
* GenAI user message event name
|
|
13
|
+
* Used for log records representing user messages in AI conversations
|
|
14
|
+
*/
|
|
15
|
+
declare const LOG_EVNT_GEN_AI_USER_MESSAGE = "gen.ai.user_message";
|
|
16
|
+
/**
|
|
17
|
+
* GenAI assistant message event name
|
|
18
|
+
* Used for log records representing assistant responses in AI conversations
|
|
19
|
+
*/
|
|
20
|
+
declare const LOG_EVNT_GEN_AI_ASSISTANT_MESSAGE = "gen.ai.assistant_message";
|
|
21
|
+
/**
|
|
22
|
+
* GenAI tool message event name
|
|
23
|
+
* Used for log records representing tool calls or responses in AI conversations
|
|
24
|
+
*/
|
|
25
|
+
declare const LOG_EVNT_GEN_AI_TOOL_MESSAGE = "gen.ai.tool_message";
|
|
26
|
+
/**
|
|
27
|
+
* GenAI choice event name
|
|
28
|
+
* Used for log records representing choices made by AI models
|
|
29
|
+
*/
|
|
30
|
+
declare const LOG_EVNT_GEN_AI_CHOICE = "gen.ai.choice";
|
|
31
|
+
/**
|
|
32
|
+
* LangWatch LangChain callback event name
|
|
33
|
+
* Used for log records representing LangChain callback events
|
|
34
|
+
*/
|
|
35
|
+
declare const EVNT_LANGWATCH_LANGCHAIN_CALLBACK = "langwatch.langchain.callback";
|
|
36
|
+
|
|
37
|
+
export { EVNT_LANGWATCH_LANGCHAIN_CALLBACK, LOG_EVNT_GEN_AI_ASSISTANT_MESSAGE, LOG_EVNT_GEN_AI_CHOICE, LOG_EVNT_GEN_AI_SYSTEM_MESSAGE, LOG_EVNT_GEN_AI_TOOL_MESSAGE, LOG_EVNT_GEN_AI_USER_MESSAGE };
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
export { A as ATTR_LANGWATCH_CUSTOMER_ID, c as ATTR_LANGWATCH_EVALUATION_CUSTOM, d as ATTR_LANGWATCH_INPUT, e as ATTR_LANGWATCH_LABELS, f as ATTR_LANGWATCH_LANGCHAIN_EVENT_NAME, g as ATTR_LANGWATCH_LANGCHAIN_RUN_EXTRA_PARAMS, h as ATTR_LANGWATCH_LANGCHAIN_RUN_ID, i as ATTR_LANGWATCH_LANGCHAIN_RUN_METADATA, j as ATTR_LANGWATCH_LANGCHAIN_RUN_PARENT_ID, k as ATTR_LANGWATCH_LANGCHAIN_RUN_TAGS, m as ATTR_LANGWATCH_LANGCHAIN_RUN_TYPE, n as ATTR_LANGWATCH_LANGCHAIN_TAGS, o as ATTR_LANGWATCH_METRICS, p as ATTR_LANGWATCH_OUTPUT, q as ATTR_LANGWATCH_PARAMS, r as ATTR_LANGWATCH_PROMPT_HANDLE, s as ATTR_LANGWATCH_PROMPT_ID, t as ATTR_LANGWATCH_PROMPT_SELECTED_ID, u as ATTR_LANGWATCH_PROMPT_VARIABLES, v as ATTR_LANGWATCH_PROMPT_VERSION_ID, w as ATTR_LANGWATCH_PROMPT_VERSION_NUMBER, x as ATTR_LANGWATCH_RAG_CONTEXTS, y as ATTR_LANGWATCH_SDK_LANGUAGE, z as ATTR_LANGWATCH_SDK_NAME, B as ATTR_LANGWATCH_SDK_VERSION, C as ATTR_LANGWATCH_SPAN_TYPE, D as ATTR_LANGWATCH_STREAMING, E as ATTR_LANGWATCH_TAGS, F as ATTR_LANGWATCH_THREAD_ID, G as ATTR_LANGWATCH_TIMESTAMPS, H as ATTR_LANGWATCH_USER_ID, S as SemConvAttributeKey, a as SemConvAttributes, b as SemConvLogRecordAttributes } from '../../types-CoS5PmeU.js';
|
|
2
|
+
export { a as VAL_GEN_AI_FINISH_REASONS, b as VAL_GEN_AI_FINISH_REASON_CONTENT_FILTER, c as VAL_GEN_AI_FINISH_REASON_ERROR, d as VAL_GEN_AI_FINISH_REASON_LENGTH, e as VAL_GEN_AI_FINISH_REASON_STOP, f as VAL_GEN_AI_FINISH_REASON_TOOL_CALLS, V as VAL_GEN_AI_SYSTEMS, g as VAL_GEN_AI_SYSTEM_ANTHROPIC, h as VAL_GEN_AI_SYSTEM_AWS_BEDROCK, i as VAL_GEN_AI_SYSTEM_AZURE_AI_INFERENCE, j as VAL_GEN_AI_SYSTEM_AZURE_AI_OPENAI, k as VAL_GEN_AI_SYSTEM_COHERE, l as VAL_GEN_AI_SYSTEM_DEEPSEEK, m as VAL_GEN_AI_SYSTEM_GCP_GEMINI, n as VAL_GEN_AI_SYSTEM_GCP_GEN_AI, o as VAL_GEN_AI_SYSTEM_GCP_VERTEX_AI, p as VAL_GEN_AI_SYSTEM_GROQ, q as VAL_GEN_AI_SYSTEM_IBM_WATSONX_AI, r as VAL_GEN_AI_SYSTEM_MISTRAL_AI, s as VAL_GEN_AI_SYSTEM_OPENAI, t as VAL_GEN_AI_SYSTEM_PERPLEXITY, u as VAL_GEN_AI_SYSTEM_XAI } from '../../values-1yj9l0Sa.js';
|
|
3
|
+
import '@opentelemetry/api';
|
|
4
|
+
import '@opentelemetry/api-logs';
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* GenAI system message event name
|
|
8
|
+
* Used for log records representing system messages in AI conversations
|
|
9
|
+
*/
|
|
10
|
+
declare const LOG_EVNT_GEN_AI_SYSTEM_MESSAGE = "gen.ai.system_message";
|
|
11
|
+
/**
|
|
12
|
+
* GenAI user message event name
|
|
13
|
+
* Used for log records representing user messages in AI conversations
|
|
14
|
+
*/
|
|
15
|
+
declare const LOG_EVNT_GEN_AI_USER_MESSAGE = "gen.ai.user_message";
|
|
16
|
+
/**
|
|
17
|
+
* GenAI assistant message event name
|
|
18
|
+
* Used for log records representing assistant responses in AI conversations
|
|
19
|
+
*/
|
|
20
|
+
declare const LOG_EVNT_GEN_AI_ASSISTANT_MESSAGE = "gen.ai.assistant_message";
|
|
21
|
+
/**
|
|
22
|
+
* GenAI tool message event name
|
|
23
|
+
* Used for log records representing tool calls or responses in AI conversations
|
|
24
|
+
*/
|
|
25
|
+
declare const LOG_EVNT_GEN_AI_TOOL_MESSAGE = "gen.ai.tool_message";
|
|
26
|
+
/**
|
|
27
|
+
* GenAI choice event name
|
|
28
|
+
* Used for log records representing choices made by AI models
|
|
29
|
+
*/
|
|
30
|
+
declare const LOG_EVNT_GEN_AI_CHOICE = "gen.ai.choice";
|
|
31
|
+
/**
|
|
32
|
+
* LangWatch LangChain callback event name
|
|
33
|
+
* Used for log records representing LangChain callback events
|
|
34
|
+
*/
|
|
35
|
+
declare const EVNT_LANGWATCH_LANGCHAIN_CALLBACK = "langwatch.langchain.callback";
|
|
36
|
+
|
|
37
|
+
export { EVNT_LANGWATCH_LANGCHAIN_CALLBACK, LOG_EVNT_GEN_AI_ASSISTANT_MESSAGE, LOG_EVNT_GEN_AI_CHOICE, LOG_EVNT_GEN_AI_SYSTEM_MESSAGE, LOG_EVNT_GEN_AI_TOOL_MESSAGE, LOG_EVNT_GEN_AI_USER_MESSAGE };
|