@uselemma/tracing 3.0.2 → 4.0.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 CHANGED
@@ -1,6 +1,6 @@
1
1
  # @uselemma/tracing
2
2
 
3
- OpenTelemetry-based tracing for AI agents. Capture inputs, outputs, timing, token usage, and errors then view everything in [Lemma](https://uselemma.ai).
3
+ HTTP tracing SDK for AI agents. No OpenTelemetry setup is required: the SDK sends completed trace payloads directly to the Lemma API.
4
4
 
5
5
  ## Installation
6
6
 
@@ -10,80 +10,224 @@ npm install @uselemma/tracing
10
10
 
11
11
  ## Quick Start
12
12
 
13
- ### 1. Register the tracer provider
13
+ ```typescript
14
+ import { Lemma } from "@uselemma/tracing";
15
+
16
+ const lemma = new Lemma({
17
+ apiKey: process.env.LEMMA_API_KEY,
18
+ projectId: process.env.LEMMA_PROJECT_ID,
19
+ });
20
+
21
+ const answer = await lemma.trace(
22
+ {
23
+ name: "support-agent",
24
+ input: userMessage,
25
+ threadId: conversationId,
26
+ userId: user.id,
27
+ },
28
+ async (trace) => {
29
+ const docs = await searchDocs(userMessage);
30
+ trace.recordTool({
31
+ name: "search_docs",
32
+ input: { query: userMessage },
33
+ output: docs,
34
+ });
35
+
36
+ const response = await callModel(userMessage, docs);
37
+ trace.recordGeneration({
38
+ name: "draft-reply",
39
+ input: response.messages,
40
+ output: response.text,
41
+ model: "gpt-4o",
42
+ usage: {
43
+ inputTokens: response.usage.inputTokens,
44
+ outputTokens: response.usage.outputTokens,
45
+ },
46
+ });
47
+
48
+ return response.text;
49
+ },
50
+ );
51
+ ```
52
+
53
+ `trace()` creates one Lemma trace. The callback receives a context object; any child span, generation, or tool recorded through that context is attached to the trace.
14
54
 
15
- Call `registerOTel` once when your application starts. It reads `LEMMA_API_KEY` and `LEMMA_PROJECT_ID` from environment variables by default.
55
+ ## One-Off Events
56
+
57
+ Use one-off calls when the work already happened and you want to record it:
16
58
 
17
59
  ```typescript
18
- import { registerOTel } from "@uselemma/tracing";
60
+ trace.recordSpan({
61
+ name: "rerank-results",
62
+ input: { candidates: candidates.length },
63
+ output: { kept: ranked.length },
64
+ });
19
65
 
20
- registerOTel();
66
+ trace.recordTool({
67
+ name: "lookup_order",
68
+ input: { orderId },
69
+ output: order,
70
+ });
71
+
72
+ trace.recordGeneration({
73
+ name: "answer",
74
+ input: messages,
75
+ output: text,
76
+ model: "gpt-4o",
77
+ llmInputMessages: [{ role: "user", content: userMessage }],
78
+ llmInvocationParameters: { temperature: 0.2 },
79
+ });
21
80
  ```
22
81
 
23
- ### 2. Wrap your agent
82
+ Pass contract fields as native props such as `llmInputMessages`, `llmInvocationParameters`, `toolParameters`, and `retrievalDocuments`. Use `attributes` only when you need to send raw span attributes that do not yet have a native SDK prop.
83
+
84
+ ## Live Spans
24
85
 
25
- `agent` creates a root OpenTelemetry span named `ai.agent.run`. Return a value from the wrapped function the wrapper auto-captures it as `ai.agent.output` and closes the span automatically.
86
+ Use `startSpan()`, `startTool()`, or `startGeneration()` when you want the SDK to measure work from a handle and finish it later:
26
87
 
27
88
  ```typescript
28
- import { agent } from "@uselemma/tracing";
89
+ const span = trace.startSpan({ name: "retrieve-context", input: query });
90
+ try {
91
+ const docs = await retrieve(query);
92
+ span.end({ output: docs, durationMs: 250 });
93
+ } catch (error) {
94
+ span.end({ error });
95
+ throw error;
96
+ }
97
+ ```
29
98
 
30
- const myAgent = agent(
31
- "my-agent",
32
- async (input: { userMessage: string }) => {
33
- const result = await doWork(input.userMessage);
34
- return result; // wrapper auto-captures output and closes the span
35
- },
36
- );
99
+ ```typescript
100
+ const tool = trace.startTool({ name: "search_docs", input: { query } });
101
+ const docs = await searchDocs(query);
102
+ tool.end({ output: docs, durationMs: 25 });
103
+
104
+ const generation = trace.startGeneration({
105
+ name: "answer",
106
+ input: messages,
107
+ model: "gpt-4o",
108
+ });
109
+ const response = await callModel(messages);
110
+ generation.end({ output: response.text, durationMs: response.durationMs });
111
+ ```
37
112
 
38
- const { result, runId } = await myAgent(
39
- { userMessage: "hello" },
40
- { threadId: "thread_123" }, // optional: link multi-turn runs
41
- );
113
+ The SDK measures trace durations from timestamps. Pass `durationMs` on callback traces, spans, generations, tools, `span.end({ durationMs })`, or `trace.end({ durationMs })` when you already measured the work yourself. When child spans, generations, or tools omit `durationMs`, Lemma splits the parent's remaining unclaimed duration equally across siblings that also omitted duration.
114
+
115
+ You can also create a trace handle first and record work on it over time:
116
+
117
+ ```typescript
118
+ const trace = lemma.trace({ name: "support-agent", input: userMessage });
119
+
120
+ const span = trace.startSpan("retrieve-context");
121
+ const docs = await retrieve(userMessage);
122
+ span.recordTool({
123
+ name: "search_docs",
124
+ input: { query: userMessage },
125
+ output: docs,
126
+ toolParameters: { query: "string" },
127
+ });
128
+ span.end({
129
+ output: { count: docs.length },
130
+ durationMs: 250,
131
+ retrievalDocuments: docs.map((doc) => ({
132
+ id: doc.id,
133
+ content: doc.text,
134
+ score: doc.score,
135
+ })),
136
+ });
137
+
138
+ await trace.end({ output: "final answer", durationMs: 1234 });
42
139
  ```
43
140
 
44
- ### 3. Add child spans (optional)
141
+ ## Vercel AI SDK
45
142
 
46
- Use the typed helpers to add spans for internal functions:
143
+ Pass `vercelAI()` to the AI SDK telemetry integrations option while the call runs inside a Lemma trace. AI SDK v7 uses `telemetry`; AI SDK v6 uses `experimental_telemetry`.
47
144
 
48
145
  ```typescript
49
- import { agent, tool, retrieval, llm, trace } from "@uselemma/tracing";
146
+ import { generateText } from "ai";
147
+ import { Lemma, vercelAI } from "@uselemma/tracing";
148
+
149
+ const lemma = new Lemma();
150
+
151
+ const answer = await lemma.trace(
152
+ { name: "support-agent", input: userMessage },
153
+ async () => {
154
+ const result = await generateText({
155
+ model,
156
+ prompt: userMessage,
157
+ telemetry: {
158
+ integrations: [vercelAI()],
159
+ },
160
+ });
161
+
162
+ return result.text;
163
+ },
164
+ );
165
+ ```
50
166
 
51
- const search = retrieval("vector-search", async (query: string) => {
52
- return vectorDB.search(query, { topK: 5 });
53
- });
167
+ For AI SDK v6, pass the same helper through `experimental_telemetry`:
54
168
 
55
- const lookupOrder = tool("lookup-order", async (orderId: string) => {
56
- return db.orders.findById(orderId);
169
+ ```typescript
170
+ await generateText({
171
+ model,
172
+ prompt: userMessage,
173
+ experimental_telemetry: {
174
+ integrations: [vercelAI()],
175
+ },
57
176
  });
177
+ ```
58
178
 
59
- const agent = agent("rag-agent", async (input: string) => {
60
- const docs = await search(input); // retrieval.vector-search span
61
- const context = docs.join("\n");
62
- return generateAnswer(context, input);
179
+ The integration records model calls as generations and tool executions as tool calls. Use `vercelAI({ recordInputs: false, recordOutputs: false })` to avoid sending prompts, tool inputs, tool outputs, or model output text.
180
+
181
+ When you pass a trace handle with `vercelAI({ trace })`, the integration ends it from the AI SDK terminal callback: `onEnd` in AI SDK v7 and `onFinish` in AI SDK v6. When you use the callback form of `lemma.trace()`, the callback still owns trace closure.
182
+
183
+ When a helper only has IDs, use the client-level methods:
184
+
185
+ ```typescript
186
+ const trace = lemma.trace();
187
+
188
+ const span = lemma.startSpan({ traceId: trace.id });
189
+ lemma.recordTool({
190
+ traceId: trace.id,
191
+ parentSpanId: span.id,
192
+ name: "tool call",
63
193
  });
194
+
195
+ await trace.flush();
64
196
  ```
65
197
 
66
- ## Export Behavior
198
+ Detached handle calls require `traceId`. If a detached observation has a parent, pass `parentSpanId`; calls that cannot attach safely warn and no-op.
67
199
 
68
- - Spans are exported in run-specific batches keyed by `lemma.run_id`.
69
- - A run batch is exported when its top-level `ai.agent.run` span ends.
70
- - `forceFlush()` exports remaining runs in separate batches per run.
71
- - Spans with `instrumentationScope.name === "next.js"` are excluded from export.
200
+ ## Active Context
72
201
 
73
- ## Environment Variables
202
+ The SDK keeps the active trace in async context, so helpers deeper in your code can record without receiving the context explicitly:
74
203
 
75
- | Variable | Description |
76
- | ------------------ | --------------------- |
77
- | `LEMMA_API_KEY` | Your Lemma API key |
78
- | `LEMMA_PROJECT_ID` | Your Lemma project ID |
204
+ ```typescript
205
+ import { active } from "@uselemma/tracing";
206
+
207
+ export function recordSearch(docs: unknown[]) {
208
+ active().recordTool({
209
+ name: "search_docs",
210
+ output: docs,
211
+ });
212
+ }
213
+ ```
214
+
215
+ ## Configuration
79
216
 
80
- Both are required unless passed explicitly to `registerOTel()`.
217
+ | Option | Environment variable | Default |
218
+ | ----------- | -------------------- | ------------------------- |
219
+ | `apiKey` | `LEMMA_API_KEY` | Required |
220
+ | `projectId` | `LEMMA_PROJECT_ID` | Required |
221
+ | `baseUrl` | none | `https://api.uselemma.ai` |
81
222
 
82
223
  ## Documentation
83
224
 
84
- - [Quickstart](https://docs.uselemma.ai/getting-started/quickstart) — first trace in 2 minutes
85
- - [Tracing Overview](https://docs.uselemma.ai/tracing/overview) — concepts, API reference, and usage patterns
86
- - [Vercel AI SDK](https://docs.uselemma.ai/integrations/vercel-ai-sdk) — framework setup, streaming, and examples
225
+ - [Quickstart](https://docs.uselemma.ai/getting-started/quickstart)
226
+ - [Trace contract](https://docs.uselemma.ai/reference/trace-contract)
227
+
228
+ ## Examples
229
+
230
+ See [`examples/`](./examples) for complete callback tracing, trace handle, record-by-ID, and Vercel AI SDK v6/v7 examples.
87
231
 
88
232
  ## License
89
233
 
@@ -0,0 +1,237 @@
1
+ export type JsonValue = string | number | boolean | null | JsonValue[] | {
2
+ [key: string]: JsonValue;
3
+ };
4
+ export type LemmaClientOptions = {
5
+ apiKey?: string;
6
+ projectId?: string;
7
+ baseUrl?: string;
8
+ fetch?: typeof fetch;
9
+ };
10
+ export type TraceOptions = {
11
+ id?: string;
12
+ name?: string;
13
+ durationMs?: number;
14
+ input?: unknown;
15
+ output?: unknown;
16
+ metadata?: Record<string, unknown>;
17
+ threadId?: string;
18
+ userId?: string;
19
+ environment?: string;
20
+ };
21
+ export type TraceEndOptions = {
22
+ output?: unknown;
23
+ durationMs?: number;
24
+ };
25
+ export type SpanType = "span" | "generation" | "tool";
26
+ export type SpanOptions = {
27
+ id?: string;
28
+ parentId?: string | null;
29
+ parentSpanId?: string | null;
30
+ name: string;
31
+ type?: SpanType;
32
+ input?: unknown;
33
+ output?: unknown;
34
+ metadata?: Record<string, unknown>;
35
+ attributes?: Record<string, unknown>;
36
+ startedAt?: Date | string;
37
+ endedAt?: Date | string | null;
38
+ durationMs?: number;
39
+ status?: "OK" | "ERROR";
40
+ error?: unknown;
41
+ model?: string;
42
+ usage?: {
43
+ inputTokens?: number;
44
+ outputTokens?: number;
45
+ };
46
+ toolName?: string;
47
+ inputMimeType?: string;
48
+ outputMimeType?: string;
49
+ llmModelName?: string;
50
+ llmProvider?: string;
51
+ llmSystem?: string;
52
+ llmInvocationParameters?: unknown;
53
+ llmInputMessages?: unknown[];
54
+ llmOutputMessages?: unknown[];
55
+ llmTools?: unknown;
56
+ llmTokenCountPrompt?: number;
57
+ llmTokenCountCompletion?: number;
58
+ llmTokenCountTotal?: number;
59
+ llmPromptTemplate?: string;
60
+ llmPromptTemplateVariables?: unknown;
61
+ llmPromptTemplateVersion?: string;
62
+ toolDescription?: string;
63
+ toolParameters?: unknown;
64
+ retrievalDocuments?: unknown[];
65
+ embeddingModelName?: string;
66
+ embeddingInvocationParameters?: unknown;
67
+ embeddingEmbeddings?: unknown;
68
+ rerankerModelName?: string;
69
+ rerankerInputDocuments?: unknown[];
70
+ rerankerOutputDocuments?: unknown[];
71
+ };
72
+ export type GenerationOptions = Omit<SpanOptions, "type" | "toolName">;
73
+ export type ToolOptions = Omit<SpanOptions, "type" | "model" | "usage">;
74
+ export type DetachedSpanOptions = Partial<SpanOptions> & {
75
+ traceId?: string;
76
+ };
77
+ export type DetachedGenerationOptions = Partial<GenerationOptions> & {
78
+ traceId?: string;
79
+ parentSpanId?: string | null;
80
+ };
81
+ export type DetachedToolOptions = Partial<ToolOptions> & {
82
+ traceId?: string;
83
+ parentSpanId?: string | null;
84
+ };
85
+ type SdkTraceSpanPayload = {
86
+ id?: string;
87
+ parent_id?: string | null;
88
+ name: string;
89
+ type: SpanType;
90
+ input?: unknown;
91
+ output?: unknown;
92
+ metadata?: Record<string, unknown>;
93
+ attributes?: Record<string, unknown>;
94
+ started_at?: string;
95
+ ended_at?: string | null;
96
+ duration_ms?: number;
97
+ status?: "OK" | "ERROR";
98
+ error?: string | null;
99
+ model?: string;
100
+ usage?: {
101
+ input_tokens?: number;
102
+ output_tokens?: number;
103
+ };
104
+ tool_name?: string;
105
+ };
106
+ type SdkTracePayload = {
107
+ project_id: string;
108
+ trace: {
109
+ id?: string;
110
+ name: string;
111
+ input?: unknown;
112
+ output?: unknown;
113
+ metadata?: Record<string, unknown>;
114
+ thread_id?: string;
115
+ user_id?: string;
116
+ environment?: string;
117
+ started_at: string;
118
+ ended_at?: string | null;
119
+ duration_ms?: number;
120
+ status?: "OK" | "ERROR";
121
+ error?: string | null;
122
+ spans: SdkTraceSpanPayload[];
123
+ };
124
+ replace?: boolean;
125
+ };
126
+ export declare class SpanHandle {
127
+ private readonly trace;
128
+ private readonly options;
129
+ readonly id: string;
130
+ private ended;
131
+ private readonly payload;
132
+ constructor(trace: TraceContext, options: SpanOptions, payload?: SdkTraceSpanPayload);
133
+ end(options?: Omit<SpanOptions, "id" | "name" | "type" | "startedAt">): void;
134
+ startSpan(name: string): SpanHandle;
135
+ startSpan(options: Omit<SpanOptions, "endedAt">): SpanHandle;
136
+ startGeneration(name: string): SpanHandle;
137
+ startGeneration(options: Omit<GenerationOptions, "endedAt" | "type">): SpanHandle;
138
+ startTool(name: string): SpanHandle;
139
+ startTool(options: Omit<ToolOptions, "endedAt" | "type">): SpanHandle;
140
+ recordSpan(name: string): SpanHandle;
141
+ recordSpan(options: SpanOptions): SpanHandle;
142
+ recordGeneration(options: string | GenerationOptions): void;
143
+ recordTool(options: string | ToolOptions): void;
144
+ /** @deprecated Use startSpan() or recordSpan(). */
145
+ span(name: string): SpanHandle;
146
+ span(options: SpanOptions): SpanHandle;
147
+ /** @deprecated Use recordGeneration() or startGeneration(). */
148
+ generation(options: string | GenerationOptions): void;
149
+ /** @deprecated Use recordTool() or startTool(). */
150
+ tool(options: string | ToolOptions): void;
151
+ }
152
+ export declare class NoopSpanHandle {
153
+ readonly id = "";
154
+ end(): void;
155
+ startSpan(): NoopSpanHandle;
156
+ startGeneration(): NoopSpanHandle;
157
+ startTool(): NoopSpanHandle;
158
+ recordSpan(): NoopSpanHandle;
159
+ recordGeneration(): void;
160
+ recordTool(): void;
161
+ span(): NoopSpanHandle;
162
+ generation(): void;
163
+ tool(): void;
164
+ }
165
+ export declare class TraceContext {
166
+ private readonly options;
167
+ private onChange?;
168
+ private readonly spans;
169
+ private traceOutput;
170
+ private traceError;
171
+ readonly id: string;
172
+ constructor(options: TraceOptions, onChange?: (() => void) | undefined);
173
+ input(value: unknown): void;
174
+ output(value: unknown): void;
175
+ duration(durationMs: number): void;
176
+ fail(error: unknown): void;
177
+ changed(): void;
178
+ setChangeHandler(onChange: () => void): void;
179
+ addSpan(options: SpanOptions): SdkTraceSpanPayload;
180
+ recordSpan(name: string): SpanHandle;
181
+ recordSpan(options: SpanOptions): SpanHandle;
182
+ recordGeneration(options: string | GenerationOptions): void;
183
+ recordTool(options: string | ToolOptions): void;
184
+ startSpan(name: string): SpanHandle;
185
+ startSpan(options: Omit<SpanOptions, "endedAt">): SpanHandle;
186
+ startGeneration(options: Omit<GenerationOptions, "endedAt" | "type">): SpanHandle;
187
+ startTool(options: Omit<ToolOptions, "endedAt" | "type">): SpanHandle;
188
+ /** @deprecated Use startSpan() or recordSpan(). */
189
+ span(name: string): SpanHandle;
190
+ span(options: SpanOptions): SpanHandle;
191
+ /** @deprecated Use recordGeneration() or startGeneration(). */
192
+ generation(options: string | GenerationOptions): void;
193
+ /** @deprecated Use recordTool() or startTool(). */
194
+ tool(options: string | ToolOptions): void;
195
+ toPayload(projectId: string, startedAt: Date, endedAt: Date, replace?: boolean): SdkTracePayload;
196
+ }
197
+ export declare class TraceHandle extends TraceContext {
198
+ private readonly flushFn;
199
+ private readonly startedAt;
200
+ private flushTimer;
201
+ private flushPromise;
202
+ constructor(options: TraceOptions, flushFn: (trace: TraceHandle, startedAt: Date, endedAt: Date) => Promise<void>, startedAt?: Date);
203
+ flush(): Promise<void>;
204
+ end(): Promise<void>;
205
+ end(output: unknown): Promise<void>;
206
+ end(options: TraceEndOptions): Promise<void>;
207
+ private scheduleFlush;
208
+ }
209
+ export declare class Lemma {
210
+ private readonly apiKey;
211
+ private readonly projectId;
212
+ private readonly baseUrl;
213
+ private readonly fetchImpl;
214
+ private readonly traces;
215
+ constructor(options?: LemmaClientOptions);
216
+ trace(): TraceHandle;
217
+ trace(options: TraceOptions | string): TraceHandle;
218
+ trace<T>(options: TraceOptions | string, fn: (trace: TraceContext) => T | Promise<T>): Promise<T>;
219
+ recordSpan(options: DetachedSpanOptions | string): SpanHandle | NoopSpanHandle;
220
+ recordGeneration(options: DetachedGenerationOptions | string): void;
221
+ recordTool(options: DetachedToolOptions | string): void;
222
+ startSpan(options: Omit<SpanOptions, "endedAt"> | DetachedSpanOptions): SpanHandle | NoopSpanHandle;
223
+ startGeneration(options: Omit<GenerationOptions, "endedAt" | "type"> | DetachedGenerationOptions): SpanHandle | NoopSpanHandle;
224
+ startTool(options: Omit<ToolOptions, "endedAt" | "type"> | DetachedToolOptions): SpanHandle | NoopSpanHandle;
225
+ /** @deprecated Use startSpan() or recordSpan(). */
226
+ span(options: DetachedSpanOptions | string): SpanHandle | NoopSpanHandle;
227
+ /** @deprecated Use recordGeneration() or startGeneration(). */
228
+ generation(options: DetachedGenerationOptions | string): void;
229
+ /** @deprecated Use recordTool() or startTool(). */
230
+ tool(options: DetachedToolOptions | string): void;
231
+ private traceFor;
232
+ private detachedTraceFor;
233
+ private flushTrace;
234
+ }
235
+ export declare function active(): TraceContext;
236
+ export {};
237
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}