@uselemma/tracing 3.0.3 → 4.0.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.
@@ -0,0 +1,392 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.vercelAI = vercelAI;
4
+ const client_1 = require("./client");
5
+ function addMs(startedAt, durationMs) {
6
+ return typeof durationMs === "number"
7
+ ? new Date(startedAt.getTime() + durationMs)
8
+ : new Date();
9
+ }
10
+ function subtractMs(endedAt, durationMs) {
11
+ return typeof durationMs === "number"
12
+ ? new Date(endedAt.getTime() - durationMs)
13
+ : endedAt;
14
+ }
15
+ function v7StepKey(callId, stepNumber) {
16
+ return `${callId}:${stepNumber}`;
17
+ }
18
+ function isV7StepStart(event) {
19
+ return "callId" in event && "provider" in event && "modelId" in event;
20
+ }
21
+ function getTrace(trace) {
22
+ if (trace)
23
+ return trace;
24
+ try {
25
+ return (0, client_1.active)();
26
+ }
27
+ catch {
28
+ console.warn("@uselemma/tracing: vercelAI() telemetry received an event outside lemma.trace(); event ignored");
29
+ return undefined;
30
+ }
31
+ }
32
+ function stringifyContent(content) {
33
+ const text = content
34
+ .map((part) => {
35
+ if (!part || typeof part !== "object")
36
+ return "";
37
+ if (part.type !== "text")
38
+ return "";
39
+ return String(part.text ?? "");
40
+ })
41
+ .join("");
42
+ if (text)
43
+ return text;
44
+ return JSON.stringify(content);
45
+ }
46
+ function toolOutput(event, recordOutputs) {
47
+ if (!recordOutputs) {
48
+ return event.toolOutput.type === "tool-error"
49
+ ? { status: "ERROR" }
50
+ : {};
51
+ }
52
+ if (event.toolOutput.type === "tool-result") {
53
+ return { output: event.toolOutput.output };
54
+ }
55
+ return {
56
+ error: event.toolOutput.error,
57
+ status: "ERROR",
58
+ };
59
+ }
60
+ function v6ToolOutput(event, recordOutputs) {
61
+ if (!recordOutputs) {
62
+ return event.success ? {} : { status: "ERROR" };
63
+ }
64
+ if (event.success) {
65
+ return { output: event.output };
66
+ }
67
+ return {
68
+ error: event.error,
69
+ status: "ERROR",
70
+ };
71
+ }
72
+ function v6Input(event) {
73
+ if ("messages" in event && event.messages)
74
+ return event.messages;
75
+ return "prompt" in event ? event.prompt : undefined;
76
+ }
77
+ function v6InputMessages(event) {
78
+ const input = v6Input(event);
79
+ return Array.isArray(input) ? input : undefined;
80
+ }
81
+ function v6Output(event) {
82
+ if (typeof event.text === "string")
83
+ return event.text;
84
+ if (event.content)
85
+ return stringifyContent(event.content);
86
+ return undefined;
87
+ }
88
+ function vercelAI(options = {}) {
89
+ const modelCalls = new Map();
90
+ const v7Steps = new Map();
91
+ const v6Steps = new Map();
92
+ const v6Starts = [];
93
+ const generationSpanIdsByCallId = new Map();
94
+ const generationSpanIdsByToolCallId = new Map();
95
+ const toolExecutions = new Map();
96
+ let recordedV6Step = false;
97
+ let endedExplicitTrace = false;
98
+ function endOutput(event) {
99
+ if (typeof event.text === "string")
100
+ return event.text;
101
+ if (event.content)
102
+ return stringifyContent(event.content);
103
+ return undefined;
104
+ }
105
+ async function endExplicitTrace(event) {
106
+ if (endedExplicitTrace)
107
+ return;
108
+ const trace = options.trace;
109
+ if (typeof trace?.end !== "function")
110
+ return;
111
+ endedExplicitTrace = true;
112
+ const output = endOutput(event);
113
+ if (options.recordOutputs === false || output === undefined) {
114
+ await trace.end();
115
+ return;
116
+ }
117
+ await trace.end({ output });
118
+ }
119
+ function recordV6Generation(event, stored) {
120
+ const trace = getTrace(options.trace);
121
+ if (!trace)
122
+ return;
123
+ const startedAt = stored?.startedAt ?? new Date();
124
+ const endedAt = new Date();
125
+ const id = crypto.randomUUID();
126
+ const name = typeof options.generationName === "function"
127
+ ? options.generationName(event)
128
+ : (options.generationName ?? "vercel-ai-generation");
129
+ const usage = "totalUsage" in event ? event.totalUsage : event.usage;
130
+ const output = v6Output(event);
131
+ trace.recordGeneration({
132
+ id,
133
+ name,
134
+ input: options.recordInputs === false
135
+ ? undefined
136
+ : stored?.event && v6Input(stored.event),
137
+ output: options.recordOutputs === false ? undefined : output,
138
+ metadata: options.metadata,
139
+ model: event.model.modelId,
140
+ usage: {
141
+ inputTokens: usage?.inputTokens,
142
+ outputTokens: usage?.outputTokens,
143
+ },
144
+ startedAt,
145
+ endedAt,
146
+ llmProvider: event.model.provider,
147
+ llmInputMessages: options.recordInputs === false || !stored?.event
148
+ ? undefined
149
+ : v6InputMessages(stored.event),
150
+ llmOutputMessages: options.recordOutputs === false || output === undefined
151
+ ? undefined
152
+ : [{ role: "assistant", content: output }],
153
+ llmTools: stored?.event.tools,
154
+ });
155
+ generationSpanIdsByCallId.set("v6-latest", id);
156
+ }
157
+ function startV7Generation(event) {
158
+ const trace = getTrace(options.trace);
159
+ if (!trace)
160
+ return;
161
+ const name = typeof options.generationName === "function"
162
+ ? options.generationName({
163
+ callId: event.callId,
164
+ provider: event.provider,
165
+ modelId: event.modelId,
166
+ usage: {},
167
+ content: [],
168
+ performance: {},
169
+ })
170
+ : (options.generationName ?? "vercel-ai-generation");
171
+ const startedAt = new Date();
172
+ const handle = trace.startGeneration({
173
+ name,
174
+ input: options.recordInputs === false ? undefined : event.messages,
175
+ metadata: options.metadata,
176
+ model: event.modelId,
177
+ startedAt,
178
+ llmProvider: event.provider,
179
+ llmInputMessages: options.recordInputs === false ? undefined : event.messages,
180
+ llmTools: event.tools,
181
+ });
182
+ const stored = { event, startedAt, handle };
183
+ v7Steps.set(v7StepKey(event.callId, event.stepNumber), stored);
184
+ generationSpanIdsByCallId.set(event.callId, handle.id);
185
+ }
186
+ function endV7Generation(event) {
187
+ const stored = v7Steps.get(v7StepKey(event.callId, event.stepNumber));
188
+ v7Steps.delete(v7StepKey(event.callId, event.stepNumber));
189
+ if (!stored)
190
+ return;
191
+ const durationMs = event.performance?.stepTimeMs ?? event.performance?.responseTimeMs;
192
+ const output = typeof event.text === "string"
193
+ ? event.text
194
+ : event.content
195
+ ? stringifyContent(event.content)
196
+ : undefined;
197
+ for (const toolCall of event.toolCalls ?? []) {
198
+ if (toolCall.toolCallId) {
199
+ generationSpanIdsByToolCallId.set(toolCall.toolCallId, stored.handle.id);
200
+ }
201
+ }
202
+ stored.handle.end({
203
+ output: options.recordOutputs === false ? undefined : output,
204
+ usage: {
205
+ inputTokens: event.usage?.inputTokens,
206
+ outputTokens: event.usage?.outputTokens,
207
+ },
208
+ model: event.model.modelId,
209
+ durationMs,
210
+ endedAt: addMs(stored.startedAt, durationMs),
211
+ llmProvider: event.model.provider,
212
+ llmOutputMessages: options.recordOutputs === false || output === undefined
213
+ ? undefined
214
+ : [{ role: "assistant", content: output }],
215
+ });
216
+ }
217
+ return {
218
+ onLanguageModelCallStart(event) {
219
+ const trace = getTrace(options.trace);
220
+ if (!trace)
221
+ return;
222
+ if (generationSpanIdsByCallId.has(event.callId)) {
223
+ modelCalls.set(event.callId, { event, startedAt: new Date() });
224
+ return;
225
+ }
226
+ const startedAt = new Date();
227
+ const name = typeof options.generationName === "function"
228
+ ? options.generationName({
229
+ callId: event.callId,
230
+ provider: event.provider,
231
+ modelId: event.modelId,
232
+ usage: {},
233
+ content: [],
234
+ performance: {},
235
+ })
236
+ : (options.generationName ?? "vercel-ai-generation");
237
+ const handle = trace.startGeneration({
238
+ name,
239
+ input: options.recordInputs === false ? undefined : event.messages,
240
+ metadata: options.metadata,
241
+ model: event.modelId,
242
+ startedAt,
243
+ llmProvider: event.provider,
244
+ llmInputMessages: options.recordInputs === false ? undefined : event.messages,
245
+ llmTools: event.tools,
246
+ });
247
+ modelCalls.set(event.callId, { event, startedAt, handle });
248
+ generationSpanIdsByCallId.set(event.callId, handle.id);
249
+ },
250
+ onLanguageModelCallEnd(event) {
251
+ const stored = modelCalls.get(event.callId);
252
+ modelCalls.delete(event.callId);
253
+ if (!stored?.handle)
254
+ return;
255
+ stored.handle.end({
256
+ output: options.recordOutputs === false
257
+ ? undefined
258
+ : stringifyContent(event.content),
259
+ usage: {
260
+ inputTokens: event.usage.inputTokens,
261
+ outputTokens: event.usage.outputTokens,
262
+ },
263
+ model: event.modelId,
264
+ durationMs: event.performance.responseTimeMs,
265
+ endedAt: addMs(stored.startedAt, event.performance.responseTimeMs),
266
+ llmProvider: event.provider,
267
+ llmOutputMessages: options.recordOutputs === false
268
+ ? undefined
269
+ : [{ role: "assistant", content: stringifyContent(event.content) }],
270
+ });
271
+ },
272
+ onToolExecutionStart(event) {
273
+ const trace = getTrace(options.trace);
274
+ if (!trace)
275
+ return;
276
+ const parentId = event.toolCall.toolCallId &&
277
+ generationSpanIdsByToolCallId.get(event.toolCall.toolCallId);
278
+ const fallbackParentId = event.callId
279
+ ? generationSpanIdsByCallId.get(event.callId)
280
+ : undefined;
281
+ const name = typeof options.toolName === "function"
282
+ ? options.toolName({
283
+ ...event,
284
+ toolExecutionMs: undefined,
285
+ toolOutput: { type: "tool-result" },
286
+ })
287
+ : (options.toolName ?? event.toolCall.toolName);
288
+ const startedAt = new Date();
289
+ const handle = trace.startTool({
290
+ name,
291
+ parentId: parentId ?? fallbackParentId,
292
+ input: options.recordInputs === false ? undefined : event.toolCall.input,
293
+ metadata: options.metadata,
294
+ startedAt,
295
+ });
296
+ if (event.toolCall.toolCallId) {
297
+ toolExecutions.set(event.toolCall.toolCallId, { handle, startedAt });
298
+ }
299
+ },
300
+ onToolExecutionEnd(event) {
301
+ const trace = getTrace(options.trace);
302
+ if (!trace)
303
+ return;
304
+ const name = typeof options.toolName === "function"
305
+ ? options.toolName(event)
306
+ : (options.toolName ?? event.toolCall.toolName);
307
+ const storedTool = event.toolCall.toolCallId
308
+ ? toolExecutions.get(event.toolCall.toolCallId)
309
+ : undefined;
310
+ if (event.toolCall.toolCallId) {
311
+ toolExecutions.delete(event.toolCall.toolCallId);
312
+ }
313
+ if (storedTool) {
314
+ storedTool.handle.end({
315
+ durationMs: event.toolExecutionMs,
316
+ endedAt: addMs(storedTool.startedAt, event.toolExecutionMs),
317
+ ...toolOutput(event, options.recordOutputs !== false),
318
+ });
319
+ return;
320
+ }
321
+ const endedAt = new Date();
322
+ const startedAt = subtractMs(endedAt, event.toolExecutionMs);
323
+ const parentId = event.toolCall.toolCallId &&
324
+ generationSpanIdsByToolCallId.get(event.toolCall.toolCallId);
325
+ const fallbackParentId = event.callId
326
+ ? generationSpanIdsByCallId.get(event.callId)
327
+ : undefined;
328
+ trace.recordTool({
329
+ name,
330
+ parentId: parentId ?? fallbackParentId,
331
+ input: options.recordInputs === false ? undefined : event.toolCall.input,
332
+ metadata: options.metadata,
333
+ durationMs: event.toolExecutionMs,
334
+ startedAt,
335
+ endedAt,
336
+ ...toolOutput(event, options.recordOutputs !== false),
337
+ });
338
+ },
339
+ onStart(event) {
340
+ recordedV6Step = false;
341
+ v6Starts.push({ event, startedAt: new Date() });
342
+ },
343
+ onStepStart(event) {
344
+ if (isV7StepStart(event)) {
345
+ startV7Generation(event);
346
+ return;
347
+ }
348
+ v6Steps.set(event.stepNumber, { event, startedAt: new Date() });
349
+ },
350
+ onStepEnd(event) {
351
+ endV7Generation(event);
352
+ },
353
+ onStepFinish(event) {
354
+ recordedV6Step = true;
355
+ const stored = v6Steps.get(event.stepNumber);
356
+ v6Steps.delete(event.stepNumber);
357
+ recordV6Generation(event, stored);
358
+ },
359
+ async onFinish(event) {
360
+ if (recordedV6Step) {
361
+ v6Starts.shift();
362
+ recordedV6Step = false;
363
+ await endExplicitTrace(event);
364
+ return;
365
+ }
366
+ recordV6Generation(event, v6Starts.shift());
367
+ await endExplicitTrace(event);
368
+ },
369
+ async onEnd(event) {
370
+ await endExplicitTrace(event);
371
+ },
372
+ onToolCallFinish(event) {
373
+ const trace = getTrace(options.trace);
374
+ if (!trace)
375
+ return;
376
+ const name = typeof options.toolName === "function"
377
+ ? options.toolName(event)
378
+ : (options.toolName ?? event.toolCall.toolName);
379
+ const parentId = event.toolCall.toolCallId &&
380
+ generationSpanIdsByToolCallId.get(event.toolCall.toolCallId);
381
+ trace.recordTool({
382
+ name,
383
+ parentId: parentId ?? generationSpanIdsByCallId.get("v6-latest"),
384
+ input: options.recordInputs === false ? undefined : event.toolCall.input,
385
+ metadata: options.metadata,
386
+ durationMs: event.durationMs,
387
+ ...v6ToolOutput(event, options.recordOutputs !== false),
388
+ });
389
+ },
390
+ };
391
+ }
392
+ //# sourceMappingURL=vercel-ai.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vercel-ai.js","sourceRoot":"","sources":["../src/vercel-ai.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,55 @@
1
+ import { Lemma, active } from "@uselemma/tracing";
2
+
3
+ const lemma = new Lemma({
4
+ apiKey: process.env.LEMMA_API_KEY,
5
+ projectId: process.env.LEMMA_PROJECT_ID,
6
+ });
7
+
8
+ async function searchDocs(query: string) {
9
+ return [
10
+ { id: "doc-1", text: "Orders ship in two business days.", score: 0.91 },
11
+ ];
12
+ }
13
+
14
+ async function callModel(message: string, docs: unknown[]) {
15
+ return {
16
+ text: `Answer for ${message}`,
17
+ messages: [{ role: "user", content: message }],
18
+ usage: { inputTokens: 42, outputTokens: 12 },
19
+ docs,
20
+ };
21
+ }
22
+
23
+ export async function runSupportAgent(userMessage: string) {
24
+ return lemma.trace(
25
+ {
26
+ name: "support-agent",
27
+ input: userMessage,
28
+ threadId: "thread-123",
29
+ userId: "user-456",
30
+ },
31
+ async (trace) => {
32
+ const docs = await searchDocs(userMessage);
33
+
34
+ trace.recordTool({
35
+ name: "search_docs",
36
+ input: { query: userMessage },
37
+ output: docs,
38
+ toolParameters: { query: "string" },
39
+ });
40
+
41
+ const response = await callModel(userMessage, docs);
42
+ active().recordGeneration({
43
+ name: "draft-reply",
44
+ input: response.messages,
45
+ output: response.text,
46
+ model: "gpt-4o",
47
+ usage: response.usage,
48
+ llmInputMessages: response.messages,
49
+ llmInvocationParameters: { temperature: 0.2 },
50
+ });
51
+
52
+ return response.text;
53
+ },
54
+ );
55
+ }
@@ -0,0 +1,47 @@
1
+ import { Lemma } from "@uselemma/tracing";
2
+
3
+ const lemma = new Lemma({
4
+ apiKey: process.env.LEMMA_API_KEY,
5
+ projectId: process.env.LEMMA_PROJECT_ID,
6
+ });
7
+
8
+ async function searchDocs(query: string) {
9
+ return [
10
+ { id: "doc-1", text: "Orders ship in two business days.", score: 0.91 },
11
+ ];
12
+ }
13
+
14
+ export async function runDetachedHelpers(userMessage: string) {
15
+ const trace = lemma.trace({
16
+ name: "support-agent",
17
+ input: userMessage,
18
+ });
19
+
20
+ const retrieve = lemma.startSpan({
21
+ traceId: trace.id,
22
+ name: "retrieve-context",
23
+ input: { query: userMessage },
24
+ });
25
+
26
+ const docs = await searchDocs(userMessage);
27
+
28
+ lemma.recordTool({
29
+ traceId: trace.id,
30
+ parentSpanId: retrieve.id,
31
+ name: "search_docs",
32
+ input: { query: userMessage },
33
+ output: docs,
34
+ toolParameters: { query: "string" },
35
+ });
36
+
37
+ retrieve.end({
38
+ output: { count: docs.length },
39
+ retrievalDocuments: docs.map((doc) => ({
40
+ id: doc.id,
41
+ content: doc.text,
42
+ score: doc.score,
43
+ })),
44
+ });
45
+
46
+ await trace.end({ output: `Found ${docs.length} document(s).` });
47
+ }
@@ -0,0 +1,59 @@
1
+ import { Lemma } from "@uselemma/tracing";
2
+
3
+ const lemma = new Lemma({
4
+ apiKey: process.env.LEMMA_API_KEY,
5
+ projectId: process.env.LEMMA_PROJECT_ID,
6
+ });
7
+
8
+ async function searchDocs(query: string) {
9
+ return [
10
+ { id: "doc-1", text: "Orders ship in two business days.", score: 0.91 },
11
+ ];
12
+ }
13
+
14
+ async function callModel(message: string, docs: unknown[]) {
15
+ return {
16
+ text: `Answer for ${message}`,
17
+ usage: { inputTokens: 42, outputTokens: 12 },
18
+ docs,
19
+ };
20
+ }
21
+
22
+ export async function runWithHandles(userMessage: string) {
23
+ const trace = lemma.trace({
24
+ name: "support-agent",
25
+ input: userMessage,
26
+ threadId: "thread-123",
27
+ });
28
+
29
+ const retrieval = trace.startSpan({
30
+ name: "retrieve-context",
31
+ input: { query: userMessage },
32
+ });
33
+
34
+ const docs = await searchDocs(userMessage);
35
+ retrieval.recordTool({
36
+ name: "search_docs",
37
+ input: { query: userMessage },
38
+ output: docs,
39
+ toolParameters: { query: "string" },
40
+ });
41
+ retrieval.end({
42
+ output: { count: docs.length },
43
+ retrievalDocuments: docs.map((doc) => ({
44
+ id: doc.id,
45
+ content: doc.text,
46
+ score: doc.score,
47
+ })),
48
+ });
49
+
50
+ const response = await callModel(userMessage, docs);
51
+ trace.recordGeneration({
52
+ name: "draft-reply",
53
+ output: response.text,
54
+ model: "gpt-4o",
55
+ usage: response.usage,
56
+ });
57
+
58
+ await trace.end({ output: response.text });
59
+ }
@@ -0,0 +1,27 @@
1
+ import { generateText } from "ai";
2
+ import { Lemma, vercelAI } from "@uselemma/tracing";
3
+
4
+ const lemma = new Lemma({
5
+ apiKey: process.env.LEMMA_API_KEY,
6
+ projectId: process.env.LEMMA_PROJECT_ID,
7
+ });
8
+
9
+ export async function runVercelAIV6(
10
+ model: Parameters<typeof generateText>[0]["model"],
11
+ userMessage: string,
12
+ ) {
13
+ const trace = lemma.trace({
14
+ name: "support-agent",
15
+ input: userMessage,
16
+ });
17
+
18
+ const result = await generateText({
19
+ model,
20
+ prompt: userMessage,
21
+ experimental_telemetry: {
22
+ integrations: [vercelAI({ trace })],
23
+ },
24
+ });
25
+
26
+ return result.text;
27
+ }
@@ -0,0 +1,27 @@
1
+ import { generateText } from "ai";
2
+ import { Lemma, vercelAI } from "@uselemma/tracing";
3
+
4
+ const lemma = new Lemma({
5
+ apiKey: process.env.LEMMA_API_KEY,
6
+ projectId: process.env.LEMMA_PROJECT_ID,
7
+ });
8
+
9
+ export async function runVercelAIV7(
10
+ model: Parameters<typeof generateText>[0]["model"],
11
+ userMessage: string,
12
+ ) {
13
+ const trace = lemma.trace({
14
+ name: "support-agent",
15
+ input: userMessage,
16
+ });
17
+
18
+ const result = await generateText({
19
+ model,
20
+ prompt: userMessage,
21
+ telemetry: {
22
+ integrations: [vercelAI({ trace })],
23
+ },
24
+ });
25
+
26
+ return result.text;
27
+ }
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@uselemma/tracing",
3
- "version": "3.0.3",
4
- "description": "OpenTelemetry-based tracing module for Lemma",
3
+ "version": "4.0.1",
4
+ "description": "HTTP tracing SDK for Lemma",
5
5
  "license": "MIT",
6
6
  "author": "Lemma",
7
7
  "repository": {
@@ -13,12 +13,11 @@
13
13
  "url": "https://github.com/uselemma/sdk/issues"
14
14
  },
15
15
  "keywords": [
16
- "opentelemetry",
17
16
  "tracing",
18
17
  "observability",
19
18
  "monitoring",
20
19
  "llm",
21
- "instrumentation"
20
+ "sdk"
22
21
  ],
23
22
  "main": "./dist/index.js",
24
23
  "types": "./dist/index.d.ts",
@@ -30,19 +29,12 @@
30
29
  },
31
30
  "files": [
32
31
  "dist",
32
+ "examples",
33
33
  "README.md",
34
34
  "LICENSE"
35
35
  ],
36
- "dependencies": {
37
- "@opentelemetry/api": "^1.9.0",
38
- "@opentelemetry/exporter-trace-otlp-proto": "^0.211.0",
39
- "@opentelemetry/sdk-trace-base": "^2.2.0",
40
- "@opentelemetry/sdk-trace-node": "^2.5.0",
41
- "uuid": "^13.0.0"
42
- },
36
+ "dependencies": {},
43
37
  "devDependencies": {
44
- "@arizeai/openinference-instrumentation-openai": "^4.0.5",
45
- "@opentelemetry/instrumentation": "^0.213.0",
46
38
  "@trivago/prettier-plugin-sort-imports": "^5.2.2",
47
39
  "@types/node": "^22.18.8",
48
40
  "@vitest/coverage-v8": "^3.2.4",