langwatch 0.1.0 → 0.1.1

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.
Files changed (39) hide show
  1. package/dist/{chunk-AP23NJ57.mjs → chunk-OVS4NSDE.mjs} +373 -2
  2. package/dist/chunk-OVS4NSDE.mjs.map +1 -0
  3. package/dist/index.d.mts +44 -2
  4. package/dist/index.d.ts +44 -2
  5. package/dist/index.js +6256 -472
  6. package/dist/index.js.map +1 -1
  7. package/dist/index.mjs +325 -351
  8. package/dist/index.mjs.map +1 -1
  9. package/dist/{utils-DDcm0z9v.d.mts → utils-K-jSEpnZ.d.mts} +4 -3
  10. package/dist/{utils-DDcm0z9v.d.ts → utils-K-jSEpnZ.d.ts} +4 -3
  11. package/dist/utils.d.mts +1 -1
  12. package/dist/utils.d.ts +1 -1
  13. package/dist/utils.js +370 -0
  14. package/dist/utils.js.map +1 -1
  15. package/dist/utils.mjs +3 -1
  16. package/example/README.md +3 -1
  17. package/example/app/(chat)/chat/[id]/page.tsx +1 -1
  18. package/example/app/(chat)/page.tsx +10 -5
  19. package/example/app/langchain/page.tsx +27 -0
  20. package/example/app/langchain-rag/page.tsx +28 -0
  21. package/example/app/share/[id]/page.tsx +1 -1
  22. package/example/components/chat-list.tsx +1 -1
  23. package/example/components/chat-panel.tsx +1 -1
  24. package/example/components/header.tsx +35 -13
  25. package/example/components/prompt-form.tsx +1 -1
  26. package/example/components/stocks/stock-purchase.tsx +1 -1
  27. package/example/components/stocks/stocks.tsx +1 -1
  28. package/example/lib/chat/langchain-rag.tsx +191 -0
  29. package/example/lib/chat/langchain.tsx +112 -0
  30. package/example/package-lock.json +285 -3
  31. package/example/package.json +1 -0
  32. package/package.json +11 -2
  33. package/src/index.ts +12 -3
  34. package/src/langchain.ts +557 -0
  35. package/src/types.ts +1 -1
  36. package/src/utils.ts +28 -1
  37. package/dist/chunk-AP23NJ57.mjs.map +0 -1
  38. /package/example/lib/chat/{actions.tsx → vercel-ai.tsx} +0 -0
  39. /package/src/{helpers.ts → typeUtils.ts} +0 -0
package/dist/index.mjs CHANGED
@@ -1,9 +1,12 @@
1
1
  import {
2
2
  __spreadProps,
3
3
  __spreadValues,
4
+ autoconvertTypedValues,
4
5
  captureError,
5
- convertFromVercelAIMessages
6
- } from "./chunk-AP23NJ57.mjs";
6
+ collectorRESTParamsSchema,
7
+ convertFromVercelAIMessages,
8
+ spanSchema
9
+ } from "./chunk-OVS4NSDE.mjs";
7
10
 
8
11
  // src/index.ts
9
12
  import EventEmitter from "events";
@@ -11,7 +14,7 @@ import { nanoid } from "nanoid";
11
14
  import { ZodError } from "zod";
12
15
  import { fromZodError } from "zod-validation-error";
13
16
 
14
- // src/helpers.ts
17
+ // src/typeUtils.ts
15
18
  function camelToSnakeCase(str) {
16
19
  return str.replace(/[A-Z]/g, (letter) => `_${letter.toLowerCase()}`);
17
20
  }
@@ -34,354 +37,318 @@ function camelToSnakeCaseNested(obj) {
34
37
  }
35
38
  }
36
39
 
37
- // src/server/types/tracer.generated.ts
38
- import { z } from "zod";
39
- var chatRoleSchema = z.union([
40
- z.literal("system"),
41
- z.literal("user"),
42
- z.literal("assistant"),
43
- z.literal("function"),
44
- z.literal("tool"),
45
- z.literal("unknown")
46
- ]);
47
- var functionCallSchema = z.object({
48
- name: z.string().optional(),
49
- arguments: z.string().optional()
50
- });
51
- var toolCallSchema = z.object({
52
- id: z.string(),
53
- type: z.string(),
54
- function: functionCallSchema
55
- });
56
- var chatRichContentSchema = z.union([
57
- z.object({
58
- type: z.literal("text"),
59
- text: z.string().optional()
60
- }),
61
- z.object({
62
- type: z.literal("image_url"),
63
- image_url: z.object({
64
- url: z.string(),
65
- detail: z.union([z.literal("auto"), z.literal("low"), z.literal("high")]).optional()
66
- }).optional()
67
- })
68
- ]);
69
- var typedValueTextSchema = z.object({
70
- type: z.literal("text"),
71
- value: z.string()
72
- });
73
- var typedValueRawSchema = z.object({
74
- type: z.literal("raw"),
75
- value: z.string()
76
- });
77
- var jSONSerializableSchema = z.union([
78
- z.string(),
79
- z.number(),
80
- z.boolean(),
81
- z.record(z.any()),
82
- z.array(z.any())
83
- ]).nullable();
84
- var typedValueJsonSchema = z.object({
85
- type: z.literal("json"),
86
- value: jSONSerializableSchema
87
- });
88
- var moneySchema = z.object({
89
- currency: z.string(),
90
- amount: z.number()
91
- });
92
- var guardrailResultSchema = z.object({
93
- status: z.union([
94
- z.literal("processed"),
95
- z.literal("skipped"),
96
- z.literal("error")
97
- ]),
98
- passed: z.boolean(),
99
- score: z.number().optional().nullable(),
100
- details: z.string().optional().nullable(),
101
- cost: moneySchema.optional().nullable()
102
- });
103
- var typedValueGuardrailResultSchema = z.object({
104
- type: z.literal("guardrail_result"),
105
- value: guardrailResultSchema
106
- });
107
- var errorCaptureSchema = z.object({
108
- has_error: z.literal(true),
109
- message: z.string(),
110
- stacktrace: z.array(z.string())
111
- });
112
- var spanMetricsSchema = z.object({
113
- prompt_tokens: z.number().optional().nullable(),
114
- completion_tokens: z.number().optional().nullable(),
115
- tokens_estimated: z.boolean().optional().nullable(),
116
- cost: z.number().optional().nullable()
117
- });
118
- var spanParamsSchema = z.object({
119
- temperature: z.number().optional(),
120
- stream: z.boolean().optional(),
121
- functions: z.array(z.record(z.any())).optional(),
122
- tools: z.array(z.record(z.any())).optional(),
123
- tool_choice: z.string().optional()
124
- });
125
- var spanTimestampsSchema = z.object({
126
- started_at: z.number(),
127
- first_token_at: z.number().optional().nullable(),
128
- finished_at: z.number()
129
- });
130
- var spanTypesSchema = z.union([
131
- z.literal("span"),
132
- z.literal("llm"),
133
- z.literal("chain"),
134
- z.literal("tool"),
135
- z.literal("agent"),
136
- z.literal("rag"),
137
- z.literal("guardrail"),
138
- z.literal("unknown")
139
- ]);
140
- var rAGChunkSchema = z.object({
141
- document_id: z.string().optional().nullable(),
142
- chunk_id: z.string().optional().nullable(),
143
- content: z.union([z.string(), z.record(z.any()), z.array(z.any())])
144
- });
145
- var traceInputSchema = z.object({
146
- value: z.string(),
147
- embeddings: z.object({
148
- model: z.string(),
149
- embeddings: z.array(z.number())
150
- }).optional(),
151
- satisfaction_score: z.number().optional()
152
- });
153
- var traceOutputSchema = z.object({
154
- value: z.string(),
155
- embeddings: z.object({
156
- model: z.string(),
157
- embeddings: z.array(z.number())
158
- }).optional()
159
- });
160
- var traceSchema = z.object({
161
- trace_id: z.string(),
162
- project_id: z.string(),
163
- metadata: z.object({
164
- thread_id: z.string().optional(),
165
- user_id: z.string().optional(),
166
- customer_id: z.string().optional(),
167
- labels: z.array(z.string()).optional(),
168
- topic_id: z.string().optional(),
169
- subtopic_id: z.string().optional()
170
- }),
171
- timestamps: z.object({
172
- started_at: z.number(),
173
- inserted_at: z.number(),
174
- updated_at: z.number()
175
- }),
176
- input: traceInputSchema,
177
- output: traceOutputSchema.optional(),
178
- metrics: z.object({
179
- first_token_ms: z.number().optional().nullable(),
180
- total_time_ms: z.number().optional().nullable(),
181
- prompt_tokens: z.number().optional().nullable(),
182
- completion_tokens: z.number().optional().nullable(),
183
- total_cost: z.number().optional().nullable(),
184
- tokens_estimated: z.boolean().optional().nullable()
185
- }),
186
- error: errorCaptureSchema.optional().nullable(),
187
- indexing_md5s: z.array(z.string()).optional()
188
- });
189
- var elasticSearchTraceSchema = traceSchema.and(
190
- z.object({
191
- timestamps: traceSchema.shape.timestamps.and(
192
- z.object({
193
- updated_at: z.number()
194
- })
195
- )
196
- })
197
- );
198
- var traceCheckSchema = z.object({
199
- trace_id: z.string(),
200
- check_id: z.string(),
201
- project_id: z.string(),
202
- check_type: z.string(),
203
- check_name: z.string(),
204
- is_guardrail: z.boolean(),
205
- status: z.union([
206
- z.literal("scheduled"),
207
- z.literal("in_progress"),
208
- z.literal("error"),
209
- z.literal("skipped"),
210
- z.literal("processed")
211
- ]),
212
- passed: z.boolean().optional(),
213
- score: z.number().optional(),
214
- details: z.string().optional(),
215
- error: errorCaptureSchema.optional().nullable(),
216
- retries: z.number().optional(),
217
- timestamps: z.object({
218
- inserted_at: z.number().optional(),
219
- started_at: z.number().optional(),
220
- finished_at: z.number().optional(),
221
- updated_at: z.number()
222
- }),
223
- trace_metadata: z.object({
224
- thread_id: z.string().optional(),
225
- user_id: z.string().optional(),
226
- customer_id: z.string().optional(),
227
- labels: z.array(z.string()).optional(),
228
- topics: z.array(z.string()).optional()
229
- })
230
- });
231
- var experimentSchema = z.object({
232
- experiment_id: z.string(),
233
- variant: z.number()
234
- });
235
- var eventSchema = z.object({
236
- event_id: z.string(),
237
- event_type: z.string(),
238
- project_id: z.string(),
239
- metrics: z.record(z.number()),
240
- event_details: z.record(z.string()),
241
- trace_id: z.string().optional(),
242
- trace_metadata: z.object({
243
- thread_id: z.string().optional(),
244
- user_id: z.string().optional(),
245
- customer_id: z.string().optional(),
246
- labels: z.array(z.string()).optional(),
247
- topics: z.array(z.string()).optional()
248
- }),
249
- timestamps: z.object({
250
- started_at: z.number(),
251
- inserted_at: z.number(),
252
- updated_at: z.number()
253
- })
254
- });
255
- var elasticSearchEventSchema = eventSchema.omit({ metrics: true, event_details: true }).and(
256
- z.object({
257
- metrics: z.array(
258
- z.object({
259
- key: z.string(),
260
- value: z.number()
261
- })
262
- ),
263
- event_details: z.array(
264
- z.object({
265
- key: z.string(),
266
- value: z.string()
267
- })
268
- )
269
- })
270
- );
271
- var trackEventRESTParamsValidatorSchema = eventSchema.omit({
272
- event_id: true,
273
- project_id: true,
274
- timestamps: true,
275
- event_details: true,
276
- trace_metadata: true
277
- }).and(
278
- z.object({
279
- event_id: z.string().optional(),
280
- event_details: z.record(z.string()).optional(),
281
- timestamp: z.number().optional()
282
- })
283
- );
284
- var chatMessageSchema = z.object({
285
- role: chatRoleSchema.optional(),
286
- content: z.union([z.string(), z.array(chatRichContentSchema)]).optional().nullable(),
287
- function_call: functionCallSchema.optional().nullable(),
288
- tool_calls: z.array(toolCallSchema).optional().nullable(),
289
- tool_call_id: z.string().optional().nullable()
290
- });
291
- var typedValueChatMessagesSchema = z.object({
292
- type: z.literal("chat_messages"),
293
- value: z.array(chatMessageSchema)
294
- });
295
- var spanInputOutputSchema = z.lazy(
296
- () => z.union([
297
- typedValueTextSchema,
298
- typedValueChatMessagesSchema,
299
- typedValueGuardrailResultSchema,
300
- typedValueJsonSchema,
301
- typedValueRawSchema,
302
- z.object({
303
- type: z.literal("list"),
304
- value: z.array(spanInputOutputSchema)
305
- })
306
- ])
307
- );
308
- var baseSpanSchema = z.object({
309
- span_id: z.string(),
310
- parent_id: z.string().optional().nullable(),
311
- trace_id: z.string(),
312
- type: spanTypesSchema,
313
- name: z.string().optional().nullable(),
314
- input: spanInputOutputSchema.optional().nullable(),
315
- output: spanInputOutputSchema.optional().nullable(),
316
- error: errorCaptureSchema.optional().nullable(),
317
- timestamps: spanTimestampsSchema,
318
- metrics: spanMetricsSchema.optional().nullable()
319
- });
320
- var lLMSpanSchema = baseSpanSchema.extend({
321
- type: z.literal("llm"),
322
- vendor: z.string().optional().nullable(),
323
- model: z.string(),
324
- params: spanParamsSchema
325
- });
326
- var rAGSpanSchema = baseSpanSchema.extend({
327
- type: z.literal("rag"),
328
- contexts: z.array(rAGChunkSchema)
329
- });
330
- var spanSchema = z.union([
331
- lLMSpanSchema,
332
- rAGSpanSchema,
333
- baseSpanSchema
334
- ]);
335
- var spanInputOutputValidatorSchema = spanInputOutputSchema.and(
336
- z.object({
337
- value: z.any()
338
- })
339
- );
340
- var spanValidatorSchema = z.union([
341
- lLMSpanSchema.omit({ input: true, output: true }),
342
- rAGSpanSchema.omit({ input: true, output: true }),
343
- baseSpanSchema.omit({ input: true, output: true })
344
- ]).and(
345
- z.object({
346
- input: spanInputOutputValidatorSchema.optional().nullable(),
347
- output: spanInputOutputValidatorSchema.optional().nullable()
348
- })
349
- );
350
- var collectorRESTParamsSchema = z.object({
351
- trace_id: z.union([z.string(), z.undefined()]).optional().nullable(),
352
- spans: z.array(spanSchema),
353
- metadata: z.object({
354
- user_id: z.union([z.string(), z.undefined()]).optional().nullable(),
355
- thread_id: z.union([z.string(), z.undefined()]).optional().nullable(),
356
- customer_id: z.union([z.string(), z.undefined()]).optional().nullable(),
357
- labels: z.union([z.array(z.string()), z.undefined()]).optional().nullable(),
358
- experiments: z.union([z.array(experimentSchema), z.undefined()]).optional().nullable()
359
- }).optional()
360
- });
361
- var collectorRESTParamsValidatorSchema = collectorRESTParamsSchema.omit({ spans: true });
362
- var datasetSpanSchema = z.union([
363
- baseSpanSchema.omit({
364
- project_id: true,
365
- trace_id: true,
366
- id: true,
367
- timestamps: true,
368
- metrics: true
369
- }),
370
- lLMSpanSchema.omit({
371
- project_id: true,
372
- trace_id: true,
373
- id: true,
374
- timestamps: true,
375
- metrics: true
376
- }),
377
- rAGSpanSchema.omit({
378
- project_id: true,
379
- trace_id: true,
380
- id: true,
381
- timestamps: true,
382
- metrics: true
383
- })
384
- ]);
40
+ // src/langchain.ts
41
+ import { BaseCallbackHandler } from "@langchain/core/callbacks/base";
42
+ import {
43
+ AIMessage,
44
+ AIMessageChunk,
45
+ FunctionMessage,
46
+ FunctionMessageChunk,
47
+ HumanMessage,
48
+ HumanMessageChunk,
49
+ SystemMessage,
50
+ SystemMessageChunk,
51
+ ToolMessage,
52
+ ToolMessageChunk,
53
+ mapChatMessagesToStoredMessages
54
+ } from "@langchain/core/messages";
55
+ import { stringify } from "javascript-stringify";
56
+ var LangWatchCallbackHandler = class extends BaseCallbackHandler {
57
+ constructor({ trace }) {
58
+ super();
59
+ this.name = "LangWatchCallbackHandler";
60
+ this.spans = {};
61
+ this.trace = trace;
62
+ }
63
+ async handleLLMStart(llm, prompts, runId, parentRunId, extraParams, _tags, metadata, name) {
64
+ this.spans[runId] = this.buildLLMSpan({
65
+ llm,
66
+ runId,
67
+ parentRunId,
68
+ input: {
69
+ type: "json",
70
+ value: prompts
71
+ },
72
+ extraParams,
73
+ metadata,
74
+ name
75
+ });
76
+ }
77
+ buildLLMSpan({
78
+ llm,
79
+ runId,
80
+ parentRunId,
81
+ input,
82
+ extraParams,
83
+ metadata,
84
+ name
85
+ }) {
86
+ var _a, _b, _c, _d, _e, _f, _g, _h, _i;
87
+ try {
88
+ const parent = this.getParent(parentRunId);
89
+ const vendor = (_b = metadata == null ? void 0 : metadata.ls_provider) != null ? _b : (_a = llm.id.at(-2)) == null ? void 0 : _a.toString();
90
+ const model = (_e = (_d = metadata == null ? void 0 : metadata.ls_model_name) != null ? _d : (_c = llm.kwargs) == null ? void 0 : _c.model) != null ? _e : "unknown";
91
+ const span = parent.startLLMSpan({
92
+ spanId: runId,
93
+ name: name != null ? name : (_f = llm.id.at(-1)) == null ? void 0 : _f.toString(),
94
+ input,
95
+ model: [vendor, model].filter((x) => x).join("/"),
96
+ params: __spreadValues({
97
+ temperature: (_g = extraParams == null ? void 0 : extraParams.invocation_params) == null ? void 0 : _g.temperature
98
+ }, ((_h = extraParams == null ? void 0 : extraParams.invocation_params) == null ? void 0 : _h.functions) ? { functions: (_i = extraParams == null ? void 0 : extraParams.invocation_params) == null ? void 0 : _i.functions } : {})
99
+ });
100
+ return span;
101
+ } catch (e) {
102
+ this.trace.client.emit("error", e);
103
+ throw e;
104
+ }
105
+ }
106
+ async handleChatModelStart(llm, messages, runId, parentRunId, extraParams, tags, metadata, name) {
107
+ this.spans[runId] = this.buildLLMSpan({
108
+ name,
109
+ llm,
110
+ runId,
111
+ parentRunId,
112
+ input: {
113
+ type: "chat_messages",
114
+ value: messages.flatMap(convertFromLangChainMessages)
115
+ },
116
+ extraParams,
117
+ metadata
118
+ });
119
+ }
120
+ async handleNewToken(_token, runId) {
121
+ const span = this.spans[runId];
122
+ if (runId && span && !span.timestamps.firstTokenAt) {
123
+ span.update({
124
+ timestamps: __spreadProps(__spreadValues({}, span.timestamps), { firstTokenAt: Date.now() })
125
+ });
126
+ }
127
+ }
128
+ async handleLLMEnd(response, runId, _parentRunId) {
129
+ try {
130
+ const span = this.spans[runId];
131
+ if (!span) {
132
+ return;
133
+ }
134
+ const outputs = [];
135
+ for (const generation of response.generations) {
136
+ for (const generation_ of generation) {
137
+ if ("message" in generation_) {
138
+ outputs.push({
139
+ type: "chat_messages",
140
+ value: convertFromLangChainMessages([
141
+ generation_.message
142
+ ])
143
+ });
144
+ } else if ("text" in generation_) {
145
+ outputs.push({
146
+ type: "text",
147
+ value: generation_.text
148
+ });
149
+ } else {
150
+ outputs.push({
151
+ type: "text",
152
+ value: JSON.stringify(generation_)
153
+ });
154
+ }
155
+ }
156
+ }
157
+ const output = outputs.length === 1 ? outputs[0] : { type: "list", value: outputs };
158
+ span.end({
159
+ output
160
+ // ...(metrics ? { metrics } : {}),
161
+ });
162
+ } catch (e) {
163
+ this.trace.client.emit("error", e);
164
+ throw e;
165
+ }
166
+ }
167
+ async handleLLMError(err, runId, _parentRunId) {
168
+ this.errorSpan({ runId, error: err });
169
+ }
170
+ async handleChainStart(chain, inputs, runId, parentRunId, _tags, _metadata, _runType, name) {
171
+ this.spans[runId] = this.buildSpan({
172
+ type: "chain",
173
+ serialized: chain,
174
+ runId,
175
+ parentRunId,
176
+ input: inputs,
177
+ name
178
+ });
179
+ }
180
+ async handleChainEnd(output, runId, _parentRunId) {
181
+ this.endSpan({
182
+ runId,
183
+ output
184
+ });
185
+ }
186
+ async handleChainError(err, runId, _parentRunId, _tags, _kwargs) {
187
+ this.errorSpan({ runId, error: err });
188
+ }
189
+ async handleToolStart(tool, input, runId, parentRunId, _tags, _metadata, name) {
190
+ this.spans[runId] = this.buildSpan({
191
+ type: "tool",
192
+ serialized: tool,
193
+ runId,
194
+ parentRunId,
195
+ input,
196
+ name
197
+ });
198
+ }
199
+ async handleToolEnd(output, runId, _parentRunId) {
200
+ this.endSpan({ runId, output });
201
+ }
202
+ async handleToolError(err, runId, _parentRunId, _tags) {
203
+ this.errorSpan({ runId, error: err });
204
+ }
205
+ async handleRetrieverStart(retriever, query, runId, parentRunId, _tags, _metadata, name) {
206
+ var _a, _b;
207
+ try {
208
+ const parent = this.getParent(parentRunId);
209
+ this.spans[runId] = parent.startRAGSpan({
210
+ spanId: runId,
211
+ name: (_b = name != null ? name : retriever.name) != null ? _b : (_a = retriever.id.at(-1)) == null ? void 0 : _a.toString(),
212
+ input: this.autoconvertTypedValues(query)
213
+ });
214
+ } catch (e) {
215
+ this.trace.client.emit("error", e);
216
+ throw e;
217
+ }
218
+ }
219
+ async handleRetrieverEnd(documents, runId, _parentRunId, _tags) {
220
+ try {
221
+ const contexts = documents.map((doc) => __spreadValues({
222
+ content: doc.pageContent
223
+ }, doc.metadata.source ? { documentId: doc.metadata.source } : {}));
224
+ const span = this.spans[runId];
225
+ if (!span) {
226
+ return;
227
+ }
228
+ span.end({
229
+ contexts,
230
+ output: this.autoconvertTypedValues(documents)
231
+ });
232
+ } catch (e) {
233
+ this.trace.client.emit("error", e);
234
+ throw e;
235
+ }
236
+ }
237
+ async handleRetrieverError(err, runId, _parentRunId, _tags) {
238
+ this.errorSpan({ runId, error: err });
239
+ }
240
+ async handleAgentAction(_action, runId, _parentRunId, _tags) {
241
+ const span = this.spans[runId];
242
+ if (!span) {
243
+ return;
244
+ }
245
+ span.update({
246
+ type: "agent"
247
+ });
248
+ }
249
+ async handleAgentEnd(action, runId, _parentRunId, _tags) {
250
+ this.endSpan({
251
+ runId,
252
+ output: action.returnValues
253
+ });
254
+ }
255
+ buildSpan({
256
+ type,
257
+ serialized,
258
+ runId,
259
+ parentRunId,
260
+ input,
261
+ name
262
+ }) {
263
+ var _a, _b;
264
+ try {
265
+ const parent = this.getParent(parentRunId);
266
+ const span = parent.startSpan({
267
+ spanId: runId,
268
+ type,
269
+ name: (_b = name != null ? name : serialized.name) != null ? _b : (_a = serialized.id.at(-1)) == null ? void 0 : _a.toString(),
270
+ input: this.autoconvertTypedValues(input)
271
+ });
272
+ return span;
273
+ } catch (e) {
274
+ this.trace.client.emit("error", e);
275
+ throw e;
276
+ }
277
+ }
278
+ endSpan({ runId, output }) {
279
+ try {
280
+ const span = this.spans[runId];
281
+ if (!span) {
282
+ return;
283
+ }
284
+ span.end({
285
+ output: this.autoconvertTypedValues(output)
286
+ });
287
+ } catch (e) {
288
+ this.trace.client.emit("error", e);
289
+ throw e;
290
+ }
291
+ }
292
+ errorSpan({ runId, error }) {
293
+ const span = this.spans[runId];
294
+ if (!span) {
295
+ return;
296
+ }
297
+ span.end({
298
+ error
299
+ });
300
+ }
301
+ autoconvertTypedValues(value) {
302
+ var _a;
303
+ if (!value || typeof value === "object" && Object.keys(value).length === 0) {
304
+ return void 0;
305
+ }
306
+ if (typeof value === "string") {
307
+ return { type: "text", value };
308
+ }
309
+ try {
310
+ JSON.stringify(value);
311
+ return { type: "json", value };
312
+ } catch (e) {
313
+ return { type: "text", value: (_a = stringify(value)) != null ? _a : value.toString() };
314
+ }
315
+ }
316
+ getParent(parentRunId) {
317
+ var _a, _b;
318
+ return (_b = parentRunId ? this.spans[parentRunId] : this.spans[(_a = Object.keys(this.spans).at(-1)) != null ? _a : ""]) != null ? _b : this.trace;
319
+ }
320
+ };
321
+ var convertFromLangChainMessages = (messages) => {
322
+ const chatMessages = [];
323
+ for (const message of messages) {
324
+ chatMessages.push(convertFromLangChainMessage(message));
325
+ }
326
+ return chatMessages;
327
+ };
328
+ var convertFromLangChainMessage = (message) => {
329
+ var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j;
330
+ let role = "user";
331
+ const message_ = message.lc_serializable ? mapChatMessagesToStoredMessages([message])[0] : message;
332
+ if (message_ instanceof HumanMessage || message_ instanceof HumanMessageChunk || ((_a = message_.id) == null ? void 0 : _a.at(-1)) === "HumanMessage" || ((_b = message_.id) == null ? void 0 : _b.at(-1)) === "HumanMessageChunk" || message_.type === "human") {
333
+ role = "user";
334
+ } else if (message instanceof AIMessage || message instanceof AIMessageChunk || ((_c = message.id) == null ? void 0 : _c.at(-1)) === "AIMessage" || ((_d = message.id) == null ? void 0 : _d.at(-1)) === "AIMessageChunk" || message_.type === "ai") {
335
+ role = "assistant";
336
+ } else if (message instanceof SystemMessage || message instanceof SystemMessageChunk || ((_e = message.id) == null ? void 0 : _e.at(-1)) === "SystemMessage" || ((_f = message.id) == null ? void 0 : _f.at(-1)) === "SystemMessageChunk" || message_.type === "system") {
337
+ role = "system";
338
+ } else if (message instanceof FunctionMessage || message instanceof FunctionMessageChunk || ((_g = message.id) == null ? void 0 : _g.at(-1)) === "FunctionMessage" || ((_h = message.id) == null ? void 0 : _h.at(-1)) === "FunctionMessageChunk" || message_.type === "function") {
339
+ role = "function";
340
+ } else if (message instanceof ToolMessage || message instanceof ToolMessageChunk || ((_i = message.id) == null ? void 0 : _i.at(-1)) === "ToolMessage" || ((_j = message.id) == null ? void 0 : _j.at(-1)) === "ToolMessageChunk" || message_.type === "tool") {
341
+ role = "tool";
342
+ }
343
+ const content = typeof message.content === "string" ? message.content : message.content.map(
344
+ (content2) => content2.type === "text" ? { type: "text", text: content2.text } : content2.type == "image_url" ? { type: "image_url", image_url: content2.image_url } : { type: "text", text: JSON.stringify(content2) }
345
+ );
346
+ const functionCall = message.additional_kwargs;
347
+ return __spreadValues({
348
+ role,
349
+ content
350
+ }, functionCall && typeof functionCall === "object" && Object.keys(functionCall).length > 0 ? { function_call: functionCall } : {});
351
+ };
385
352
 
386
353
  // src/index.ts
387
354
  var LangWatch = class extends EventEmitter {
@@ -493,6 +460,12 @@ var LangWatchTrace = class {
493
460
  }, params));
494
461
  return span;
495
462
  }
463
+ getLangChainCallback() {
464
+ if (!this.langchainCallback) {
465
+ this.langchainCallback = new LangWatchCallbackHandler({ trace: this });
466
+ }
467
+ return this.langchainCallback;
468
+ }
496
469
  onEnd(span) {
497
470
  this.finishedSpans[span.span_id] = span;
498
471
  this.delayedSendSpans();
@@ -671,6 +644,7 @@ export {
671
644
  LangWatchRAGSpan,
672
645
  LangWatchSpan,
673
646
  LangWatchTrace,
647
+ autoconvertTypedValues,
674
648
  captureError,
675
649
  convertFromVercelAIMessages
676
650
  };