langwatch 1.0.0 → 1.2.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 +33 -0
- package/dist/{chunk-TKSTXX3D.js → chunk-CLTKABMO.js} +52 -2
- package/dist/chunk-CLTKABMO.js.map +1 -0
- package/dist/{chunk-L5KBRKHS.mjs → chunk-CMZFFKLA.mjs} +51 -1
- package/dist/{chunk-L5KBRKHS.mjs.map → chunk-CMZFFKLA.mjs.map} +1 -1
- package/dist/{chunk-52VMSJ4O.js → chunk-DTSULVK5.js} +39 -19
- package/dist/chunk-DTSULVK5.js.map +1 -0
- package/dist/{chunk-5Q2DUSMQ.mjs → chunk-JYTJEAOU.mjs} +3 -3
- package/dist/chunk-JYTJEAOU.mjs.map +1 -0
- package/dist/chunk-K6KPNTQO.js +15624 -0
- package/dist/chunk-K6KPNTQO.js.map +1 -0
- package/dist/{chunk-2O4ILSP5.mjs → chunk-LTDUROCE.mjs} +2 -2
- package/dist/{chunk-ALPIFEXL.mjs → chunk-PDNXHBSL.mjs} +26 -6
- package/dist/chunk-PDNXHBSL.mjs.map +1 -0
- package/dist/chunk-SYJIEBJY.mjs +15624 -0
- package/dist/chunk-SYJIEBJY.mjs.map +1 -0
- package/dist/{chunk-WHBCX64R.js → chunk-UOFSG6R4.js} +19 -19
- package/dist/chunk-UOFSG6R4.js.map +1 -0
- package/dist/{chunk-IUSLT65Z.js → chunk-ZTOXEWNX.js} +2 -2
- package/dist/chunk-ZTOXEWNX.js.map +1 -0
- package/dist/cli/bundle.js +265 -180
- package/dist/{implementation-CPfDot-W.d.mts → implementation-CHXrVq_q.d.mts} +1 -1
- package/dist/{implementation-aYHmyVZ_.d.ts → implementation-D_v0fUvU.d.ts} +1 -1
- package/dist/index.d.mts +1125 -5
- package/dist/index.d.ts +1125 -5
- package/dist/index.js +1272 -151
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +1197 -76
- package/dist/index.mjs.map +1 -1
- package/dist/observability-sdk/index.d.mts +3 -3
- package/dist/observability-sdk/index.d.ts +3 -3
- package/dist/observability-sdk/index.js +5 -5
- package/dist/observability-sdk/index.js.map +1 -1
- package/dist/observability-sdk/index.mjs +4 -4
- package/dist/observability-sdk/instrumentation/langchain/index.d.mts +1 -1
- package/dist/observability-sdk/instrumentation/langchain/index.d.ts +1 -1
- package/dist/observability-sdk/instrumentation/langchain/index.js +18 -18
- package/dist/observability-sdk/instrumentation/langchain/index.js.map +1 -1
- package/dist/observability-sdk/instrumentation/langchain/index.mjs +2 -2
- package/dist/observability-sdk/setup/node/index.js +4 -4
- package/dist/observability-sdk/setup/node/index.js.map +1 -1
- package/dist/observability-sdk/setup/node/index.mjs +3 -3
- package/dist/{types-Cw-3VUv7.d.mts → types-DlP7QdqU.d.mts} +15065 -6184
- package/dist/{types-CeZ-M8JZ.d.ts → types-av2kmt_i.d.ts} +15065 -6184
- package/package.json +9 -10
- package/dist/chunk-52VMSJ4O.js.map +0 -1
- package/dist/chunk-5Q2DUSMQ.mjs.map +0 -1
- package/dist/chunk-ADJOFPAZ.js +0 -1005
- package/dist/chunk-ADJOFPAZ.js.map +0 -1
- package/dist/chunk-ALPIFEXL.mjs.map +0 -1
- package/dist/chunk-C323F5VC.mjs +0 -1005
- package/dist/chunk-C323F5VC.mjs.map +0 -1
- package/dist/chunk-IUSLT65Z.js.map +0 -1
- package/dist/chunk-TKSTXX3D.js.map +0 -1
- package/dist/chunk-WHBCX64R.js.map +0 -1
- /package/dist/{chunk-2O4ILSP5.mjs.map → chunk-LTDUROCE.mjs.map} +0 -0
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
export { F as FilterableBatchSpanProcessor, L as LangWatchExporter, b as LangWatchExporterOptions, c as LangWatchLogger, L as LangWatchTraceExporter, b as LangWatchTraceExporterOptions, S as SpanProcessingExcludeRule, g as getLangWatchLogger, d as getLangWatchLoggerFromProvider, a as getLangWatchTracer, e as getLangWatchTracerFromProvider } from '../implementation-
|
|
1
|
+
export { F as FilterableBatchSpanProcessor, L as LangWatchExporter, b as LangWatchExporterOptions, c as LangWatchLogger, L as LangWatchTraceExporter, b as LangWatchTraceExporterOptions, S as SpanProcessingExcludeRule, g as getLangWatchLogger, d as getLangWatchLoggerFromProvider, a as getLangWatchTracer, e as getLangWatchTracerFromProvider } from '../implementation-CHXrVq_q.mjs';
|
|
2
2
|
import { OTLPLogExporter } from '@opentelemetry/exporter-logs-otlp-http';
|
|
3
3
|
import { D as DataCaptureMode } from '../types-DLfhJb38.mjs';
|
|
4
4
|
export { a as DataCaptureConfig, b as DataCaptureContext, c as DataCaptureOptions, d as DataCapturePredicate } from '../types-DLfhJb38.mjs';
|
|
5
|
-
import { L as LangWatchSpan } from '../types-
|
|
6
|
-
export { A as AddEvaluationParams, E as EvaluationStatus, e as EvaluationTimestamps, I as INPUT_OUTPUT_TYPES, f as InputOutputType, J as JsonSerializable, g as LangWatchSpanMetrics, h as LangWatchSpanOptions, i as LangWatchSpanRAGContext, j as LangWatchTracer, S as SimpleChatMessage, k as SpanType, l as emitEvaluationEvent, s as spanTypes } from '../types-
|
|
5
|
+
import { L as LangWatchSpan } from '../types-DlP7QdqU.mjs';
|
|
6
|
+
export { A as AddEvaluationParams, E as EvaluationStatus, e as EvaluationTimestamps, I as INPUT_OUTPUT_TYPES, f as InputOutputType, J as JsonSerializable, g as LangWatchSpanMetrics, h as LangWatchSpanOptions, i as LangWatchSpanRAGContext, j as LangWatchTracer, S as SimpleChatMessage, k as SpanType, l as emitEvaluationEvent, s as spanTypes } from '../types-DlP7QdqU.mjs';
|
|
7
7
|
import { Span } from '@opentelemetry/api';
|
|
8
8
|
export { S as SemConvAttributeKey, a as SemConvAttributes, b as SemConvLogRecordAttributes, l as attributes } from '../types-VOZv9LYO.mjs';
|
|
9
9
|
import '@opentelemetry/sdk-trace-base';
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
export { F as FilterableBatchSpanProcessor, L as LangWatchExporter, b as LangWatchExporterOptions, c as LangWatchLogger, L as LangWatchTraceExporter, b as LangWatchTraceExporterOptions, S as SpanProcessingExcludeRule, g as getLangWatchLogger, d as getLangWatchLoggerFromProvider, a as getLangWatchTracer, e as getLangWatchTracerFromProvider } from '../implementation-
|
|
1
|
+
export { F as FilterableBatchSpanProcessor, L as LangWatchExporter, b as LangWatchExporterOptions, c as LangWatchLogger, L as LangWatchTraceExporter, b as LangWatchTraceExporterOptions, S as SpanProcessingExcludeRule, g as getLangWatchLogger, d as getLangWatchLoggerFromProvider, a as getLangWatchTracer, e as getLangWatchTracerFromProvider } from '../implementation-D_v0fUvU.js';
|
|
2
2
|
import { OTLPLogExporter } from '@opentelemetry/exporter-logs-otlp-http';
|
|
3
3
|
import { D as DataCaptureMode } from '../types-DLfhJb38.js';
|
|
4
4
|
export { a as DataCaptureConfig, b as DataCaptureContext, c as DataCaptureOptions, d as DataCapturePredicate } from '../types-DLfhJb38.js';
|
|
5
|
-
import { L as LangWatchSpan } from '../types-
|
|
6
|
-
export { A as AddEvaluationParams, E as EvaluationStatus, e as EvaluationTimestamps, I as INPUT_OUTPUT_TYPES, f as InputOutputType, J as JsonSerializable, g as LangWatchSpanMetrics, h as LangWatchSpanOptions, i as LangWatchSpanRAGContext, j as LangWatchTracer, S as SimpleChatMessage, k as SpanType, l as emitEvaluationEvent, s as spanTypes } from '../types-
|
|
5
|
+
import { L as LangWatchSpan } from '../types-av2kmt_i.js';
|
|
6
|
+
export { A as AddEvaluationParams, E as EvaluationStatus, e as EvaluationTimestamps, I as INPUT_OUTPUT_TYPES, f as InputOutputType, J as JsonSerializable, g as LangWatchSpanMetrics, h as LangWatchSpanOptions, i as LangWatchSpanRAGContext, j as LangWatchTracer, S as SimpleChatMessage, k as SpanType, l as emitEvaluationEvent, s as spanTypes } from '../types-av2kmt_i.js';
|
|
7
7
|
import { Span } from '@opentelemetry/api';
|
|
8
8
|
export { S as SemConvAttributeKey, a as SemConvAttributes, b as SemConvLogRecordAttributes, l as attributes } from '../types-VOZv9LYO.js';
|
|
9
9
|
import '@opentelemetry/sdk-trace-base';
|
|
@@ -1,26 +1,26 @@
|
|
|
1
1
|
"use strict";Object.defineProperty(exports, "__esModule", {value: true});
|
|
2
2
|
|
|
3
3
|
|
|
4
|
-
var
|
|
4
|
+
var _chunkZTOXEWNXjs = require('../chunk-ZTOXEWNX.js');
|
|
5
5
|
|
|
6
6
|
|
|
7
7
|
|
|
8
8
|
|
|
9
9
|
|
|
10
10
|
|
|
11
|
-
var
|
|
11
|
+
var _chunkK6KPNTQOjs = require('../chunk-K6KPNTQO.js');
|
|
12
12
|
|
|
13
13
|
|
|
14
14
|
|
|
15
15
|
|
|
16
16
|
|
|
17
|
-
var
|
|
17
|
+
var _chunkUOFSG6R4js = require('../chunk-UOFSG6R4.js');
|
|
18
18
|
|
|
19
19
|
|
|
20
20
|
|
|
21
21
|
|
|
22
22
|
|
|
23
|
-
var
|
|
23
|
+
var _chunkCLTKABMOjs = require('../chunk-CLTKABMO.js');
|
|
24
24
|
|
|
25
25
|
|
|
26
26
|
|
|
@@ -38,5 +38,5 @@ var _chunkTKSTXX3Djs = require('../chunk-TKSTXX3D.js');
|
|
|
38
38
|
|
|
39
39
|
|
|
40
40
|
|
|
41
|
-
exports.DataCapturePresets =
|
|
41
|
+
exports.DataCapturePresets = _chunkZTOXEWNXjs.DataCapturePresets; exports.FilterableBatchSpanProcessor = _chunkZTOXEWNXjs.FilterableBatchSpanProcessor; exports.LangWatchExporter = _chunkUOFSG6R4js.LangWatchTraceExporter; exports.LangWatchLogsExporter = _chunkUOFSG6R4js.LangWatchLogsExporter; exports.LangWatchTraceExporter = _chunkUOFSG6R4js.LangWatchTraceExporter; exports.attributes = _chunkCLTKABMOjs.attributes_exports; exports.createLangWatchSpan = _chunkK6KPNTQOjs.createLangWatchSpan; exports.emitEvaluationEvent = _chunkK6KPNTQOjs.emitEvaluationEvent; exports.getDataCaptureMode = _chunkCLTKABMOjs.getDataCaptureMode; exports.getLangWatchLogger = _chunkUOFSG6R4js.getLangWatchLogger; exports.getLangWatchLoggerFromProvider = _chunkUOFSG6R4js.getLangWatchLoggerFromProvider; exports.getLangWatchTracer = _chunkK6KPNTQOjs.getLangWatchTracer; exports.getLangWatchTracerFromProvider = _chunkK6KPNTQOjs.getLangWatchTracerFromProvider; exports.shouldCaptureInput = _chunkCLTKABMOjs.shouldCaptureInput; exports.shouldCaptureOutput = _chunkCLTKABMOjs.shouldCaptureOutput; exports.spanTypes = _chunkK6KPNTQOjs.spanTypes;
|
|
42
42
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/home/runner/work/langwatch/langwatch/typescript
|
|
1
|
+
{"version":3,"sources":["/home/runner/work/langwatch/langwatch/sdks/typescript/dist/observability-sdk/index.js"],"names":[],"mappings":"AAAA;AACE;AACA;AACF,uDAA6B;AAC7B;AACE;AACA;AACA;AACA;AACA;AACF,uDAA6B;AAC7B;AACE;AACA;AACA;AACA;AACF,uDAA6B;AAC7B;AACE;AACA;AACA;AACA;AACF,uDAA6B;AAC7B;AACE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACF,gmCAAC","file":"/home/runner/work/langwatch/langwatch/sdks/typescript/dist/observability-sdk/index.js"}
|
|
@@ -1,26 +1,26 @@
|
|
|
1
1
|
import {
|
|
2
2
|
DataCapturePresets,
|
|
3
3
|
FilterableBatchSpanProcessor
|
|
4
|
-
} from "../chunk-
|
|
4
|
+
} from "../chunk-LTDUROCE.mjs";
|
|
5
5
|
import {
|
|
6
6
|
createLangWatchSpan,
|
|
7
7
|
emitEvaluationEvent,
|
|
8
8
|
getLangWatchTracer,
|
|
9
9
|
getLangWatchTracerFromProvider,
|
|
10
10
|
spanTypes
|
|
11
|
-
} from "../chunk-
|
|
11
|
+
} from "../chunk-SYJIEBJY.mjs";
|
|
12
12
|
import {
|
|
13
13
|
LangWatchLogsExporter,
|
|
14
14
|
LangWatchTraceExporter,
|
|
15
15
|
getLangWatchLogger,
|
|
16
16
|
getLangWatchLoggerFromProvider
|
|
17
|
-
} from "../chunk-
|
|
17
|
+
} from "../chunk-JYTJEAOU.mjs";
|
|
18
18
|
import {
|
|
19
19
|
attributes_exports,
|
|
20
20
|
getDataCaptureMode,
|
|
21
21
|
shouldCaptureInput,
|
|
22
22
|
shouldCaptureOutput
|
|
23
|
-
} from "../chunk-
|
|
23
|
+
} from "../chunk-CMZFFKLA.mjs";
|
|
24
24
|
export {
|
|
25
25
|
DataCapturePresets,
|
|
26
26
|
FilterableBatchSpanProcessor,
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import * as _opentelemetry_api from '@opentelemetry/api';
|
|
2
2
|
import { Attributes } from '@opentelemetry/api';
|
|
3
|
-
import { j as LangWatchTracer, L as LangWatchSpan, m as ChatMessage } from '../../../types-
|
|
3
|
+
import { j as LangWatchTracer, L as LangWatchSpan, m as ChatMessage } from '../../../types-DlP7QdqU.mjs';
|
|
4
4
|
import { AgentAction, AgentFinish } from '@langchain/core/agents';
|
|
5
5
|
import { BaseCallbackHandler } from '@langchain/core/callbacks/base';
|
|
6
6
|
import { DocumentInterface } from '@langchain/core/documents';
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import * as _opentelemetry_api from '@opentelemetry/api';
|
|
2
2
|
import { Attributes } from '@opentelemetry/api';
|
|
3
|
-
import { j as LangWatchTracer, L as LangWatchSpan, m as ChatMessage } from '../../../types-
|
|
3
|
+
import { j as LangWatchTracer, L as LangWatchSpan, m as ChatMessage } from '../../../types-av2kmt_i.js';
|
|
4
4
|
import { AgentAction, AgentFinish } from '@langchain/core/agents';
|
|
5
5
|
import { BaseCallbackHandler } from '@langchain/core/callbacks/base';
|
|
6
6
|
import { DocumentInterface } from '@langchain/core/documents';
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
"use strict";Object.defineProperty(exports, "__esModule", {value: true});
|
|
2
2
|
|
|
3
3
|
|
|
4
|
-
var
|
|
4
|
+
var _chunkK6KPNTQOjs = require('../../../chunk-K6KPNTQO.js');
|
|
5
5
|
|
|
6
6
|
|
|
7
7
|
|
|
8
8
|
|
|
9
|
-
var
|
|
9
|
+
var _chunkCLTKABMOjs = require('../../../chunk-CLTKABMO.js');
|
|
10
10
|
|
|
11
11
|
// src/observability-sdk/instrumentation/langchain/index.ts
|
|
12
12
|
var _base = require('@langchain/core/callbacks/base');
|
|
@@ -29,7 +29,7 @@ var LangWatchCallbackHandler = class extends _base.BaseCallbackHandler {
|
|
|
29
29
|
constructor() {
|
|
30
30
|
super(...arguments);
|
|
31
31
|
this.name = "LangWatchCallbackHandler";
|
|
32
|
-
this.tracer =
|
|
32
|
+
this.tracer = _chunkK6KPNTQOjs.getLangWatchTracer.call(void 0, "langwatch.instrumentation.langchain");
|
|
33
33
|
this.spans = {};
|
|
34
34
|
this.parentOf = {};
|
|
35
35
|
this.skipped = {};
|
|
@@ -64,7 +64,7 @@ var LangWatchCallbackHandler = class extends _base.BaseCallbackHandler {
|
|
|
64
64
|
span.setType(type);
|
|
65
65
|
if ((_a = args.tags) == null ? void 0 : _a.length)
|
|
66
66
|
span.setAttribute("langwatch.langchain.run.tags", args.tags.slice(0, 50));
|
|
67
|
-
if (
|
|
67
|
+
if (_chunkCLTKABMOjs.shouldCaptureInput.call(void 0, ) && args.input !== void 0) {
|
|
68
68
|
const i = args.input;
|
|
69
69
|
if (i && typeof i === "object" && "type" in i && "value" in i) {
|
|
70
70
|
span.setInput(i.type, i.value);
|
|
@@ -104,7 +104,7 @@ var LangWatchCallbackHandler = class extends _base.BaseCallbackHandler {
|
|
|
104
104
|
if (end.err) {
|
|
105
105
|
span.recordException(end.err);
|
|
106
106
|
span.setStatus({ code: _api.SpanStatusCode.ERROR, message: end.err.message });
|
|
107
|
-
} else if (
|
|
107
|
+
} else if (_chunkCLTKABMOjs.shouldCaptureOutput.call(void 0, ) && end.output !== void 0) {
|
|
108
108
|
span.setOutput(end.output);
|
|
109
109
|
}
|
|
110
110
|
span.end();
|
|
@@ -114,7 +114,7 @@ var LangWatchCallbackHandler = class extends _base.BaseCallbackHandler {
|
|
|
114
114
|
this.seenStarts.delete(runId);
|
|
115
115
|
}
|
|
116
116
|
async handleLLMStart(llm, prompts, runId, parentRunId, extraParams, tags, metadata, name) {
|
|
117
|
-
const input =
|
|
117
|
+
const input = _chunkCLTKABMOjs.shouldCaptureInput.call(void 0, ) && prompts ? {
|
|
118
118
|
type: "list",
|
|
119
119
|
value: prompts.map((p) => ({ type: "text", value: p }))
|
|
120
120
|
} : void 0;
|
|
@@ -131,7 +131,7 @@ var LangWatchCallbackHandler = class extends _base.BaseCallbackHandler {
|
|
|
131
131
|
});
|
|
132
132
|
}
|
|
133
133
|
async handleChatModelStart(llm, messages, runId, parentRunId, extraParams, tags, metadata, name) {
|
|
134
|
-
const input =
|
|
134
|
+
const input = _chunkCLTKABMOjs.shouldCaptureInput.call(void 0, ) ? {
|
|
135
135
|
type: "chat_messages",
|
|
136
136
|
value: messages.flatMap(convertFromLangChainMessages)
|
|
137
137
|
} : void 0;
|
|
@@ -158,7 +158,7 @@ var LangWatchCallbackHandler = class extends _base.BaseCallbackHandler {
|
|
|
158
158
|
"gen_ai.usage.total_tokens": (_d = tu.totalTokens) != null ? _d : 0
|
|
159
159
|
});
|
|
160
160
|
}
|
|
161
|
-
const outputs =
|
|
161
|
+
const outputs = _chunkCLTKABMOjs.shouldCaptureOutput.call(void 0, ) ? response.generations.flat().map((g) => {
|
|
162
162
|
if ("message" in g && g.message) {
|
|
163
163
|
return convertFromLangChainMessages([
|
|
164
164
|
g.message
|
|
@@ -186,7 +186,7 @@ var LangWatchCallbackHandler = class extends _base.BaseCallbackHandler {
|
|
|
186
186
|
metadata,
|
|
187
187
|
tags,
|
|
188
188
|
name,
|
|
189
|
-
input:
|
|
189
|
+
input: _chunkCLTKABMOjs.shouldCaptureInput.call(void 0, ) ? inputs : void 0
|
|
190
190
|
});
|
|
191
191
|
if (_runType) {
|
|
192
192
|
const span = this.spans[runId];
|
|
@@ -214,7 +214,7 @@ var LangWatchCallbackHandler = class extends _base.BaseCallbackHandler {
|
|
|
214
214
|
metadata,
|
|
215
215
|
tags,
|
|
216
216
|
name,
|
|
217
|
-
input:
|
|
217
|
+
input: _chunkCLTKABMOjs.shouldCaptureInput.call(void 0, ) ? { type: "text", value: input } : void 0
|
|
218
218
|
});
|
|
219
219
|
const span = this.spans[runId];
|
|
220
220
|
if (span) {
|
|
@@ -226,7 +226,7 @@ var LangWatchCallbackHandler = class extends _base.BaseCallbackHandler {
|
|
|
226
226
|
}
|
|
227
227
|
async handleToolEnd(output, runId, parentRunId) {
|
|
228
228
|
this.finishRun(runId, {
|
|
229
|
-
output:
|
|
229
|
+
output: _chunkCLTKABMOjs.shouldCaptureOutput.call(void 0, ) ? { type: "text", value: output } : void 0,
|
|
230
230
|
event: "handleToolEnd",
|
|
231
231
|
parentRunId
|
|
232
232
|
});
|
|
@@ -243,7 +243,7 @@ var LangWatchCallbackHandler = class extends _base.BaseCallbackHandler {
|
|
|
243
243
|
metadata,
|
|
244
244
|
tags,
|
|
245
245
|
name,
|
|
246
|
-
input:
|
|
246
|
+
input: _chunkCLTKABMOjs.shouldCaptureInput.call(void 0, ) ? { type: "text", value: query } : void 0
|
|
247
247
|
});
|
|
248
248
|
const span = this.spans[runId];
|
|
249
249
|
if (span) {
|
|
@@ -255,10 +255,10 @@ var LangWatchCallbackHandler = class extends _base.BaseCallbackHandler {
|
|
|
255
255
|
}
|
|
256
256
|
async handleRetrieverEnd(documents, runId, parentRunId, tags) {
|
|
257
257
|
const span = this.spans[runId];
|
|
258
|
-
if (span &&
|
|
258
|
+
if (span && _chunkCLTKABMOjs.shouldCaptureOutput.call(void 0, )) {
|
|
259
259
|
span.setOutput(documents);
|
|
260
260
|
}
|
|
261
|
-
if (span &&
|
|
261
|
+
if (span && _chunkCLTKABMOjs.shouldCaptureInput.call(void 0, )) {
|
|
262
262
|
span.setRAGContexts(
|
|
263
263
|
documents.map((document) => ({
|
|
264
264
|
document_id: document.metadata.id,
|
|
@@ -286,7 +286,7 @@ var LangWatchCallbackHandler = class extends _base.BaseCallbackHandler {
|
|
|
286
286
|
}
|
|
287
287
|
async handleAgentEnd(action, runId, parentRunId, tags) {
|
|
288
288
|
this.finishRun(runId, {
|
|
289
|
-
output:
|
|
289
|
+
output: _chunkCLTKABMOjs.shouldCaptureOutput.call(void 0, ) ? { type: "json", value: action.returnValues } : void 0,
|
|
290
290
|
event: "handleAgentEnd",
|
|
291
291
|
parentRunId,
|
|
292
292
|
tags
|
|
@@ -328,7 +328,7 @@ function convertFromLangChainMessage(message) {
|
|
|
328
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
329
|
) : JSON.stringify(message.content);
|
|
330
330
|
const functionCall = message.additional_kwargs;
|
|
331
|
-
return
|
|
331
|
+
return _chunkCLTKABMOjs.__spreadValues.call(void 0, {
|
|
332
332
|
role,
|
|
333
333
|
content
|
|
334
334
|
}, functionCall && typeof functionCall === "object" && Object.keys(functionCall).length > 0 ? { function_call: functionCall } : {});
|
|
@@ -360,7 +360,7 @@ function wrapNonScalarValues(value) {
|
|
|
360
360
|
if (value === null) return JSON.stringify(null);
|
|
361
361
|
if (typeof value === "string" || typeof value === "number" || typeof value === "boolean")
|
|
362
362
|
return value;
|
|
363
|
-
const chatMessages =
|
|
363
|
+
const chatMessages = _chunkK6KPNTQOjs.chatMessageSchema.array().safeParse(value);
|
|
364
364
|
if (Array.isArray(value) && chatMessages.success) {
|
|
365
365
|
return JSON.stringify({ type: "chat_messages", value: chatMessages.data });
|
|
366
366
|
}
|
|
@@ -379,7 +379,7 @@ function wrapNonScalarValues(value) {
|
|
|
379
379
|
}
|
|
380
380
|
}
|
|
381
381
|
function addLangChainEvent(span, eventName, runId, parentRunId, tags, metadata, attributes) {
|
|
382
|
-
const attrs =
|
|
382
|
+
const attrs = _chunkCLTKABMOjs.__spreadValues.call(void 0, {
|
|
383
383
|
"langwatch.langchain.run.id": runId,
|
|
384
384
|
"langwatch.langchain.run.parent_id": parentRunId,
|
|
385
385
|
"langwatch.langchain.event.name": eventName
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/home/runner/work/langwatch/langwatch/typescript-sdk/dist/observability-sdk/instrumentation/langchain/index.js","../../../../src/observability-sdk/instrumentation/langchain/index.ts"],"names":[],"mappings":"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","file":"/home/runner/work/langwatch/langwatch/typescript-sdk/dist/observability-sdk/instrumentation/langchain/index.js","sourcesContent":[null,"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"]}
|
|
1
|
+
{"version":3,"sources":["/home/runner/work/langwatch/langwatch/sdks/typescript/dist/observability-sdk/instrumentation/langchain/index.js","../../../../src/observability-sdk/instrumentation/langchain/index.ts"],"names":[],"mappings":"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","file":"/home/runner/work/langwatch/langwatch/sdks/typescript/dist/observability-sdk/instrumentation/langchain/index.js","sourcesContent":[null,"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"]}
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import {
|
|
2
2
|
chatMessageSchema,
|
|
3
3
|
getLangWatchTracer
|
|
4
|
-
} from "../../../chunk-
|
|
4
|
+
} from "../../../chunk-SYJIEBJY.mjs";
|
|
5
5
|
import {
|
|
6
6
|
__spreadValues,
|
|
7
7
|
shouldCaptureInput,
|
|
8
8
|
shouldCaptureOutput
|
|
9
|
-
} from "../../../chunk-
|
|
9
|
+
} from "../../../chunk-CMZFFKLA.mjs";
|
|
10
10
|
|
|
11
11
|
// src/observability-sdk/instrumentation/langchain/index.ts
|
|
12
12
|
import { BaseCallbackHandler } from "@langchain/core/callbacks/base";
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
"use strict";Object.defineProperty(exports, "__esModule", {value: true});
|
|
2
2
|
|
|
3
3
|
|
|
4
|
-
var
|
|
5
|
-
require('../../../chunk-
|
|
6
|
-
require('../../../chunk-
|
|
4
|
+
var _chunkDTSULVK5js = require('../../../chunk-DTSULVK5.js');
|
|
5
|
+
require('../../../chunk-UOFSG6R4.js');
|
|
6
|
+
require('../../../chunk-CLTKABMO.js');
|
|
7
7
|
|
|
8
8
|
|
|
9
9
|
|
|
10
|
-
exports.ensureSetup =
|
|
10
|
+
exports.ensureSetup = _chunkDTSULVK5js.ensureSetup; exports.setupObservability = _chunkDTSULVK5js.setupObservability;
|
|
11
11
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/home/runner/work/langwatch/langwatch/typescript
|
|
1
|
+
{"version":3,"sources":["/home/runner/work/langwatch/langwatch/sdks/typescript/dist/observability-sdk/setup/node/index.js"],"names":[],"mappings":"AAAA;AACE;AACA;AACF,6DAAmC;AACnC,sCAAmC;AACnC,sCAAmC;AACnC;AACE;AACA;AACF,qHAAC","file":"/home/runner/work/langwatch/langwatch/sdks/typescript/dist/observability-sdk/setup/node/index.js"}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import {
|
|
2
2
|
ensureSetup,
|
|
3
3
|
setupObservability
|
|
4
|
-
} from "../../../chunk-
|
|
5
|
-
import "../../../chunk-
|
|
6
|
-
import "../../../chunk-
|
|
4
|
+
} from "../../../chunk-PDNXHBSL.mjs";
|
|
5
|
+
import "../../../chunk-JYTJEAOU.mjs";
|
|
6
|
+
import "../../../chunk-CMZFFKLA.mjs";
|
|
7
7
|
export {
|
|
8
8
|
ensureSetup,
|
|
9
9
|
setupObservability
|