langwatch 0.0.3 → 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 (40) 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 +47 -5
  4. package/dist/index.d.ts +47 -5
  5. package/dist/index.js +6275 -485
  6. package/dist/index.js.map +1 -1
  7. package/dist/index.mjs +329 -349
  8. package/dist/index.mjs.map +1 -1
  9. package/dist/{utils-Dg5eWsAz.d.mts → utils-K-jSEpnZ.d.mts} +11 -7
  10. package/dist/{utils-Dg5eWsAz.d.ts → utils-K-jSEpnZ.d.ts} +11 -7
  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/lib/chat/{actions.tsx → vercel-ai.tsx} +4 -6
  31. package/example/package-lock.json +287 -4
  32. package/example/package.json +1 -0
  33. package/package.json +12 -2
  34. package/src/index.test.ts +96 -28
  35. package/src/index.ts +18 -9
  36. package/src/langchain.ts +557 -0
  37. package/src/types.ts +4 -4
  38. package/src/utils.ts +28 -1
  39. package/dist/chunk-AP23NJ57.mjs.map +0 -1
  40. /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,348 +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.union([
296
- typedValueTextSchema,
297
- typedValueChatMessagesSchema,
298
- typedValueGuardrailResultSchema,
299
- typedValueJsonSchema,
300
- typedValueRawSchema
301
- ]);
302
- var baseSpanSchema = z.object({
303
- span_id: z.string(),
304
- parent_id: z.string().optional().nullable(),
305
- trace_id: z.string(),
306
- type: spanTypesSchema,
307
- name: z.string().optional().nullable(),
308
- input: spanInputOutputSchema.optional().nullable(),
309
- outputs: z.array(spanInputOutputSchema),
310
- error: errorCaptureSchema.optional().nullable(),
311
- timestamps: spanTimestampsSchema,
312
- metrics: spanMetricsSchema.optional().nullable()
313
- });
314
- var lLMSpanSchema = baseSpanSchema.extend({
315
- type: z.literal("llm"),
316
- vendor: z.string().optional().nullable(),
317
- model: z.string(),
318
- params: spanParamsSchema
319
- });
320
- var rAGSpanSchema = baseSpanSchema.extend({
321
- type: z.literal("rag"),
322
- contexts: z.array(rAGChunkSchema)
323
- });
324
- var spanSchema = z.union([
325
- lLMSpanSchema,
326
- rAGSpanSchema,
327
- baseSpanSchema
328
- ]);
329
- var spanInputOutputValidatorSchema = spanInputOutputSchema.and(
330
- z.object({
331
- value: z.any()
332
- })
333
- );
334
- var spanValidatorSchema = z.union([
335
- lLMSpanSchema.omit({ input: true, outputs: true }),
336
- rAGSpanSchema.omit({ input: true, outputs: true }),
337
- baseSpanSchema.omit({ input: true, outputs: true })
338
- ]).and(
339
- z.object({
340
- input: spanInputOutputValidatorSchema.optional().nullable(),
341
- outputs: z.array(spanInputOutputValidatorSchema)
342
- })
343
- );
344
- var collectorRESTParamsSchema = z.object({
345
- trace_id: z.union([z.string(), z.undefined()]).optional().nullable(),
346
- spans: z.array(spanSchema),
347
- metadata: z.object({
348
- user_id: z.union([z.string(), z.undefined()]).optional().nullable(),
349
- thread_id: z.union([z.string(), z.undefined()]).optional().nullable(),
350
- customer_id: z.union([z.string(), z.undefined()]).optional().nullable(),
351
- labels: z.union([z.array(z.string()), z.undefined()]).optional().nullable(),
352
- experiments: z.union([z.array(experimentSchema), z.undefined()]).optional().nullable()
353
- }).optional()
354
- });
355
- var collectorRESTParamsValidatorSchema = collectorRESTParamsSchema.omit({ spans: true });
356
- var datasetSpanSchema = z.union([
357
- baseSpanSchema.omit({
358
- project_id: true,
359
- trace_id: true,
360
- id: true,
361
- timestamps: true,
362
- metrics: true
363
- }),
364
- lLMSpanSchema.omit({
365
- project_id: true,
366
- trace_id: true,
367
- id: true,
368
- timestamps: true,
369
- metrics: true
370
- }),
371
- rAGSpanSchema.omit({
372
- project_id: true,
373
- trace_id: true,
374
- id: true,
375
- timestamps: true,
376
- metrics: true
377
- })
378
- ]);
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
+ };
379
352
 
380
353
  // src/index.ts
381
354
  var LangWatch = class extends EventEmitter {
@@ -487,6 +460,12 @@ var LangWatchTrace = class {
487
460
  }, params));
488
461
  return span;
489
462
  }
463
+ getLangChainCallback() {
464
+ if (!this.langchainCallback) {
465
+ this.langchainCallback = new LangWatchCallbackHandler({ trace: this });
466
+ }
467
+ return this.langchainCallback;
468
+ }
490
469
  onEnd(span) {
491
470
  this.finishedSpans[span.span_id] = span;
492
471
  this.delayedSendSpans();
@@ -526,7 +505,7 @@ var LangWatchSpan = class _LangWatchSpan {
526
505
  type,
527
506
  name,
528
507
  input,
529
- outputs,
508
+ output,
530
509
  error,
531
510
  timestamps,
532
511
  metrics
@@ -537,7 +516,7 @@ var LangWatchSpan = class _LangWatchSpan {
537
516
  this.type = type != null ? type : "span";
538
517
  this.name = name;
539
518
  this.input = input;
540
- this.outputs = outputs != null ? outputs : [];
519
+ this.output = output;
541
520
  this.error = error;
542
521
  this.timestamps = timestamps != null ? timestamps : {
543
522
  startedAt: Date.now()
@@ -561,8 +540,8 @@ var LangWatchSpan = class _LangWatchSpan {
561
540
  if ("input" in params) {
562
541
  this.input = params.input;
563
542
  }
564
- if (params.outputs) {
565
- this.outputs = params.outputs;
543
+ if ("output" in params) {
544
+ this.output = params.output;
566
545
  }
567
546
  if ("error" in params) {
568
547
  this.error = params.error;
@@ -665,6 +644,7 @@ export {
665
644
  LangWatchRAGSpan,
666
645
  LangWatchSpan,
667
646
  LangWatchTrace,
647
+ autoconvertTypedValues,
668
648
  captureError,
669
649
  convertFromVercelAIMessages
670
650
  };