@respan/exporter-vercel 1.0.28

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 ADDED
@@ -0,0 +1,16 @@
1
+ # keywordsai-exporter-vercel
2
+
3
+ Keywords AI's integration with [Vercel AI SDK](https://github.com/vercel/ai)
4
+ ```
5
+ opentelemetry-exporter-myexporter
6
+ ├── src
7
+ │ └── index.ts
8
+ │ └── transform.ts
9
+ │ └── types.ts
10
+ │ └── my-trace-exporter.ts
11
+ │ └── my-metric-exporter.ts
12
+ └── test
13
+ └── transform.test.ts
14
+ └── my-trace-exporter.test.ts
15
+ └── my-metric-exporter.test.ts
16
+ ```
@@ -0,0 +1 @@
1
+ export * from "./logs.js";
@@ -0,0 +1,2 @@
1
+ export * from "./logs.js";
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/constants/index.ts"],"names":[],"mappings":"AAAA,cAAc,WAAW,CAAC"}
@@ -0,0 +1,2 @@
1
+ import { LogType } from "@respan/respan-sdk";
2
+ export declare const VERCEL_SPAN_TO_RESPAN_LOG_TYPE: Record<string, LogType>;
@@ -0,0 +1,38 @@
1
+ // Mapping from Vercel AI SDK span types to Respan log types
2
+ import { RespanLogType } from "@respan/respan-sdk";
3
+ export const VERCEL_SPAN_TO_RESPAN_LOG_TYPE = {
4
+ // Text generation spans
5
+ "ai.generateText": RespanLogType.TEXT,
6
+ "ai.generateText.doGenerate": RespanLogType.TEXT,
7
+ "ai.streamText": RespanLogType.TEXT,
8
+ "ai.streamText.doStream": RespanLogType.TEXT,
9
+ // Object generation spans
10
+ "ai.generateObject": RespanLogType.TEXT,
11
+ "ai.generateObject.doGenerate": RespanLogType.TEXT,
12
+ "ai.streamObject": RespanLogType.TEXT,
13
+ "ai.streamObject.doStream": RespanLogType.TEXT,
14
+ // Embedding spans
15
+ "ai.embed": RespanLogType.EMBEDDING,
16
+ "ai.embed.doEmbed": RespanLogType.EMBEDDING,
17
+ "ai.embedMany": RespanLogType.EMBEDDING,
18
+ "ai.embedMany.doEmbed": RespanLogType.EMBEDDING,
19
+ // Tool call spans
20
+ "ai.toolCall": RespanLogType.TOOL,
21
+ // Stream events
22
+ "ai.stream.firstChunk": RespanLogType.TEXT,
23
+ // Agents and workflows
24
+ "ai.agent": RespanLogType.AGENT,
25
+ "ai.workflow": RespanLogType.WORKFLOW,
26
+ "ai.agent.run": RespanLogType.AGENT,
27
+ "ai.agent.step": RespanLogType.TASK,
28
+ // Functions and handoffs
29
+ "ai.function": RespanLogType.FUNCTION,
30
+ "ai.handoff": RespanLogType.HANDOFF,
31
+ // Other spans that might appear
32
+ "ai.transcript": RespanLogType.TRANSCRIPTION,
33
+ "ai.speech": RespanLogType.SPEECH,
34
+ "ai.response": RespanLogType.RESPONSE,
35
+ // Default to UNKNOWN for unrecognized spans
36
+ default: RespanLogType.UNKNOWN,
37
+ };
38
+ //# sourceMappingURL=logs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logs.js","sourceRoot":"","sources":["../../src/constants/logs.ts"],"names":[],"mappings":"AAAA,4DAA4D;AAC5D,OAAO,EAAW,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAE5D,MAAM,CAAC,MAAM,8BAA8B,GAA4B;IACrE,wBAAwB;IACxB,iBAAiB,EAAE,aAAa,CAAC,IAAI;IACrC,4BAA4B,EAAE,aAAa,CAAC,IAAI;IAChD,eAAe,EAAE,aAAa,CAAC,IAAI;IACnC,wBAAwB,EAAE,aAAa,CAAC,IAAI;IAE5C,0BAA0B;IAC1B,mBAAmB,EAAE,aAAa,CAAC,IAAI;IACvC,8BAA8B,EAAE,aAAa,CAAC,IAAI;IAClD,iBAAiB,EAAE,aAAa,CAAC,IAAI;IACrC,0BAA0B,EAAE,aAAa,CAAC,IAAI;IAE9C,kBAAkB;IAClB,UAAU,EAAE,aAAa,CAAC,SAAS;IACnC,kBAAkB,EAAE,aAAa,CAAC,SAAS;IAC3C,cAAc,EAAE,aAAa,CAAC,SAAS;IACvC,sBAAsB,EAAE,aAAa,CAAC,SAAS;IAE/C,kBAAkB;IAClB,aAAa,EAAE,aAAa,CAAC,IAAI;IAEjC,gBAAgB;IAChB,sBAAsB,EAAE,aAAa,CAAC,IAAI;IAE1C,uBAAuB;IACvB,UAAU,EAAE,aAAa,CAAC,KAAK;IAC/B,aAAa,EAAE,aAAa,CAAC,QAAQ;IACrC,cAAc,EAAE,aAAa,CAAC,KAAK;IACnC,eAAe,EAAE,aAAa,CAAC,IAAI;IAEnC,yBAAyB;IACzB,aAAa,EAAE,aAAa,CAAC,QAAQ;IACrC,YAAY,EAAE,aAAa,CAAC,OAAO;IAEnC,gCAAgC;IAChC,eAAe,EAAE,aAAa,CAAC,aAAa;IAC5C,WAAW,EAAE,aAAa,CAAC,MAAM;IACjC,aAAa,EAAE,aAAa,CAAC,QAAQ;IAErC,4CAA4C;IAC5C,OAAO,EAAE,aAAa,CAAC,OAAO;CAC/B,CAAC"}
@@ -0,0 +1,2 @@
1
+ export { RespanExporter } from "./respan-vercel-trace-exporter.js";
2
+ export * from "./constants/index.js";
package/dist/index.js ADDED
@@ -0,0 +1,3 @@
1
+ export { RespanExporter } from "./respan-vercel-trace-exporter.js";
2
+ export * from "./constants/index.js";
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,mCAAmC,CAAC;AACnE,cAAc,sBAAsB,CAAC"}
@@ -0,0 +1,60 @@
1
+ import { ExportResult } from "@opentelemetry/core";
2
+ import { ReadableSpan, SpanExporter } from "@opentelemetry/sdk-trace-base";
3
+ /**
4
+ * This is a Vercel AI SDK trace exporter that sends traces to Respan.
5
+ * It is used to export traces from Vercel AI SDK to Respan.
6
+ * Next JS telemetry reference: https://vercel.com/docs/otel
7
+ * Langfuse integration: https://ai-sdk.dev/providers/observability/langfuse
8
+ * @param params - The parameters for the exporter.
9
+ * @param params.debug - Whether to enable debug mode.
10
+ * @param params.apiKey - The API key for the exporter.
11
+ * @param params.baseUrl - The base URL for the exporter.
12
+ *
13
+ * @example
14
+ * ```ts
15
+ * const exporter = new RespanExporter({
16
+ * apiKey: "your-api-key",
17
+ * baseUrl: "https://api.respan.co/api",
18
+ * });
19
+ */
20
+ export declare class RespanExporter implements SpanExporter {
21
+ private readonly debug;
22
+ private readonly apiKey;
23
+ private readonly baseUrl;
24
+ private readonly url;
25
+ private resolveURL;
26
+ constructor(params?: {
27
+ debug?: boolean;
28
+ apiKey?: string;
29
+ baseUrl?: string;
30
+ });
31
+ export(spans: ReadableSpan[], resultCallback: (result: ExportResult) => void): Promise<void>;
32
+ private createPayload;
33
+ private parseToolCalls;
34
+ private parseCompletionMessages;
35
+ private calculateLatency;
36
+ private sendToRespan;
37
+ private parseModel;
38
+ private parsePromptMessages;
39
+ private parsePromptTokens;
40
+ private parseCompletionTokens;
41
+ private parseTimeToFirstToken;
42
+ private parseCost;
43
+ private parseGenerationTime;
44
+ private parseTtft;
45
+ private parseWarnings;
46
+ private parseType;
47
+ private parseMetadata;
48
+ private isGenerationSpan;
49
+ private isAiSdkSpan;
50
+ private logDebug;
51
+ shutdown(): Promise<void>;
52
+ private compareHrTime;
53
+ private findRootSpan;
54
+ private formatTimestamp;
55
+ private parseToolChoice;
56
+ private parseTools;
57
+ private parseCustomerParams;
58
+ private parseLogType;
59
+ private deduplicateSpans;
60
+ }
@@ -0,0 +1,632 @@
1
+ import { ExportResultCode } from "@opentelemetry/core";
2
+ import { RespanPayloadSchema, } from "@respan/respan-sdk";
3
+ import { VERCEL_SPAN_TO_RESPAN_LOG_TYPE } from "./constants/index.js";
4
+ /**
5
+ * This is a Vercel AI SDK trace exporter that sends traces to Respan.
6
+ * It is used to export traces from Vercel AI SDK to Respan.
7
+ * Next JS telemetry reference: https://vercel.com/docs/otel
8
+ * Langfuse integration: https://ai-sdk.dev/providers/observability/langfuse
9
+ * @param params - The parameters for the exporter.
10
+ * @param params.debug - Whether to enable debug mode.
11
+ * @param params.apiKey - The API key for the exporter.
12
+ * @param params.baseUrl - The base URL for the exporter.
13
+ *
14
+ * @example
15
+ * ```ts
16
+ * const exporter = new RespanExporter({
17
+ * apiKey: "your-api-key",
18
+ * baseUrl: "https://api.respan.co/api",
19
+ * });
20
+ */
21
+ export class RespanExporter {
22
+ debug;
23
+ apiKey;
24
+ baseUrl;
25
+ url;
26
+ resolveURL(baseURL) {
27
+ if (!baseURL) {
28
+ return "https://api.respan.co/api/integrations/v1/traces/ingest";
29
+ }
30
+ if (baseURL.endsWith("/api")) {
31
+ return baseURL + "/integrations/v1/traces/ingest";
32
+ }
33
+ return baseURL + "/api/integrations/v1/traces/ingest";
34
+ }
35
+ constructor(params = {}) {
36
+ this.debug = params.debug ?? false;
37
+ this.apiKey = params.apiKey ?? (process.env.RESPAN_API_KEY || "");
38
+ if (!this.apiKey) {
39
+ throw new Error("RESPAN_API_KEY is required");
40
+ }
41
+ this.baseUrl = params.baseUrl ?? "https://api.respan.co/api";
42
+ this.url = this.resolveURL(this.baseUrl);
43
+ this.logDebug("RespanExporter initialized", {
44
+ url: this.url,
45
+ apiKey: this.apiKey.slice(0, 4) + "..." + this.apiKey.slice(-4),
46
+ baseUrl: this.baseUrl,
47
+ });
48
+ }
49
+ async export(spans, resultCallback) {
50
+ try {
51
+ const sortedSpans = spans
52
+ .slice()
53
+ .sort((a, b) => this.compareHrTime(a.startTime, b.startTime));
54
+ // Filter for AI SDK spans instead of just generation spans
55
+ const aiSdkSpans = sortedSpans.filter((span) => this.isAiSdkSpan(span));
56
+ if (aiSdkSpans.length === 0) {
57
+ this.logDebug("No AI SDK spans found");
58
+ resultCallback({ code: ExportResultCode.SUCCESS });
59
+ return;
60
+ }
61
+ // Deduplicate spans - prefer doStream/doGenerate over their parent spans
62
+ const deduplicatedSpans = this.deduplicateSpans(aiSdkSpans);
63
+ // const deduplicatedSpans = aiSdkSpans; // try keeping all spans for now
64
+ this.logDebug(`Filtered ${aiSdkSpans.length} spans to ${deduplicatedSpans.length} after deduplication`);
65
+ // Prepare all payloads
66
+ const allPayloads = [];
67
+ for (const span of deduplicatedSpans) {
68
+ try {
69
+ this.logDebug("Creating payload for span", span);
70
+ const rawPayload = await this.createPayload(span, sortedSpans);
71
+ try {
72
+ const validatedPayload = RespanPayloadSchema.parse(rawPayload);
73
+ allPayloads.push(validatedPayload);
74
+ }
75
+ catch (error) {
76
+ this.logDebug("Payload validation failed", error);
77
+ // If validation fails, include the raw payload in full_request
78
+ try {
79
+ const fallbackPayload = RespanPayloadSchema.parse({
80
+ ...rawPayload,
81
+ full_request: rawPayload,
82
+ });
83
+ allPayloads.push(fallbackPayload);
84
+ }
85
+ catch (fallbackError) {
86
+ this.logDebug("Fallback validation also failed", fallbackError);
87
+ // Last resort - create minimal valid payload with error info
88
+ const minimalPayload = RespanPayloadSchema.parse({
89
+ model: "unknown",
90
+ prompt_messages: [
91
+ { role: "system", content: "Error processing span" },
92
+ ],
93
+ prompt_tokens: 0,
94
+ timestamp: this.formatTimestamp(span.endTime),
95
+ customer_identifier: "default_user",
96
+ stream: false,
97
+ metadata: {
98
+ error: String(error),
99
+ span_id: span.spanContext().spanId,
100
+ trace_id: span.spanContext().traceId,
101
+ span_name: span.name,
102
+ },
103
+ });
104
+ allPayloads.push(minimalPayload);
105
+ }
106
+ }
107
+ }
108
+ catch (error) {
109
+ this.logDebug("Failed to create payload for span", error);
110
+ }
111
+ }
112
+ // Send all payloads in one request
113
+ if (allPayloads.length > 0) {
114
+ await this.sendToRespan(allPayloads);
115
+ }
116
+ resultCallback({ code: ExportResultCode.SUCCESS });
117
+ }
118
+ catch (err) {
119
+ this.logDebug("Export failed", err);
120
+ resultCallback({
121
+ code: ExportResultCode.FAILED,
122
+ error: err instanceof Error ? err : new Error(String(err)),
123
+ });
124
+ }
125
+ }
126
+ async createPayload(span, relatedSpans) {
127
+ const metadata = this.parseMetadata(span);
128
+ const isError = span.status.code !== 0;
129
+ const model = this.parseModel(span);
130
+ const toolCalls = this.parseToolCalls(span);
131
+ const messages = this.parseCompletionMessages(span, toolCalls);
132
+ const payload = {
133
+ model,
134
+ start_time: this.formatTimestamp(span.startTime),
135
+ timestamp: this.formatTimestamp(span.endTime),
136
+ prompt_messages: this.parsePromptMessages(span),
137
+ completion_message: messages[0],
138
+ customer_identifier: metadata.userId || "default_user",
139
+ thread_identifier: metadata.userId,
140
+ prompt_tokens: this.parsePromptTokens(span),
141
+ completion_tokens: this.parseCompletionTokens(span),
142
+ cost: this.parseCost(span),
143
+ generation_time: this.parseGenerationTime(span),
144
+ latency: this.calculateLatency(span),
145
+ ttft: this.parseTtft(span),
146
+ metadata: {
147
+ ...metadata,
148
+ span_type: span.name, // Add span type to metadata
149
+ },
150
+ ...(metadata.prompt_unit_price && {
151
+ prompt_unit_price: parseFloat(metadata.prompt_unit_price),
152
+ }),
153
+ ...(metadata.completion_unit_price && {
154
+ completion_unit_price: parseFloat(metadata.completion_unit_price),
155
+ }),
156
+ environment: process.env.NODE_ENV || "prod",
157
+ time_to_first_token: this.parseTimeToFirstToken(span),
158
+ trace_unique_id: span.spanContext().traceId,
159
+ span_unique_id: span.spanContext().spanId,
160
+ span_name: span.name,
161
+ span_parent_id: span.attributes["span.parent_id"]?.toString() ||
162
+ span.attributes["parentSpanId"]?.toString(),
163
+ span_path: span.attributes["ai.path"]?.toString(),
164
+ stream: span.name.includes("doStream"),
165
+ status_code: isError ? 500 : 200,
166
+ warnings: this.parseWarnings(span),
167
+ error_message: span.status.message || "",
168
+ type: this.parseType(span),
169
+ log_type: this.parseLogType(span),
170
+ is_test: process.env.NODE_ENV === "development",
171
+ posthog_integration: process.env.POSTHOG_API_KEY
172
+ ? {
173
+ posthog_api_key: process.env.POSTHOG_API_KEY,
174
+ posthog_base_url: "https://us.i.posthog.com",
175
+ }
176
+ : undefined,
177
+ tool_choice: this.parseToolChoice(span),
178
+ tools: this.parseTools(span),
179
+ tool_calls: toolCalls,
180
+ field_name: "data: ",
181
+ delimiter: "\n\n",
182
+ disable_log: false,
183
+ request_breakdown: false,
184
+ disable_fallback: false,
185
+ ...this.parseCustomerParams(span),
186
+ };
187
+ return payload;
188
+ }
189
+ // Helper method to parse tool calls from span attributes
190
+ parseToolCalls(span) {
191
+ try {
192
+ // Check for tool calls in various attribute formats
193
+ const toolCallAttributes = [
194
+ "ai.response.toolCalls",
195
+ "ai.toolCall",
196
+ "ai.toolCalls",
197
+ ];
198
+ // Try to find tool calls in any of the standard attribute locations
199
+ for (const attr of toolCallAttributes) {
200
+ if (span.attributes[attr]) {
201
+ const rawData = span.attributes[attr];
202
+ if (!rawData)
203
+ continue;
204
+ // Handle both string and object formats
205
+ let parsed;
206
+ try {
207
+ parsed =
208
+ typeof rawData === "string" ? JSON.parse(rawData) : rawData;
209
+ }
210
+ catch (e) {
211
+ this.logDebug(`Failed to parse ${attr}:`, e);
212
+ continue;
213
+ }
214
+ // Standardize to array
215
+ const toolCalls = Array.isArray(parsed) ? parsed : [parsed];
216
+ // Process each tool call with minimal transformation
217
+ return toolCalls.map((call) => {
218
+ // Ensure we have a valid object
219
+ if (!call || typeof call !== "object") {
220
+ return { type: "function" };
221
+ }
222
+ // Make a copy to avoid mutating the original
223
+ const result = { ...call };
224
+ // Ensure the object has a type
225
+ if (!result.type) {
226
+ result.type = "function";
227
+ }
228
+ // Handle ID normalization (only if needed)
229
+ if (!result.id && (result.toolCallId || result.tool_call_id)) {
230
+ result.id = result.toolCallId || result.tool_call_id;
231
+ }
232
+ return result;
233
+ });
234
+ }
235
+ }
236
+ // If we didn't find tool calls in the standard places, check for individual attributes
237
+ if (span.attributes["ai.toolCall.id"] ||
238
+ span.attributes["ai.toolCall.name"] ||
239
+ span.attributes["ai.toolCall.args"]) {
240
+ // Build a tool call object from individual attributes
241
+ const toolCall = { type: "function" };
242
+ // Copy all tool call attributes
243
+ for (const [key, value] of Object.entries(span.attributes)) {
244
+ if (key.startsWith("ai.toolCall.")) {
245
+ const propName = key.replace("ai.toolCall.", "");
246
+ toolCall[propName] = value;
247
+ }
248
+ }
249
+ return [toolCall];
250
+ }
251
+ return undefined;
252
+ }
253
+ catch (error) {
254
+ this.logDebug("Error parsing tool calls:", error);
255
+ return undefined;
256
+ }
257
+ }
258
+ parseCompletionMessages(span, toolCalls) {
259
+ let content = "";
260
+ if (span.attributes["ai.response.object"]) {
261
+ try {
262
+ const response = JSON.parse(String(span.attributes["ai.response.object"]));
263
+ content = String(response.response || "");
264
+ }
265
+ catch (error) {
266
+ this.logDebug("Error parsing ai.response.object:", error);
267
+ content = String(span.attributes["ai.response.text"] || "");
268
+ }
269
+ }
270
+ else {
271
+ content = String(span.attributes["ai.response.text"] || "");
272
+ }
273
+ const message = {
274
+ role: "assistant",
275
+ content,
276
+ ...(toolCalls && toolCalls.length > 0 && { tool_calls: toolCalls }),
277
+ };
278
+ // Check if there's a tool result to add as a separate message
279
+ const toolResults = [];
280
+ if (span.attributes["ai.toolCall.result"]) {
281
+ toolResults.push({
282
+ role: "tool",
283
+ tool_call_id: String(span.attributes["ai.toolCall.id"] || ""),
284
+ content: String(span.attributes["ai.toolCall.result"] || ""),
285
+ });
286
+ }
287
+ return toolResults.length > 0 ? [message, ...toolResults] : [message];
288
+ }
289
+ calculateLatency(span) {
290
+ return span.duration[0] / 1e9 + span.duration[1] / 1e9;
291
+ }
292
+ async sendToRespan(payloads) {
293
+ if (payloads.length === 0) {
294
+ this.logDebug("No payloads to send");
295
+ return;
296
+ }
297
+ try {
298
+ this.logDebug(`Sending ${payloads.length} payloads to Respan at ${this.url}`);
299
+ const response = await fetch(this.url, {
300
+ method: "POST",
301
+ headers: {
302
+ Authorization: `Bearer ${this.apiKey}`,
303
+ "Content-Type": "application/json",
304
+ },
305
+ body: JSON.stringify(payloads),
306
+ });
307
+ if (!response.ok) {
308
+ const text = await response.text();
309
+ this.logDebug("Failed to send to Respan", text);
310
+ throw new Error(`Failed to send to Respan: ${response.statusText}`);
311
+ }
312
+ else {
313
+ this.logDebug("Successfully sent payloads to Respan");
314
+ }
315
+ }
316
+ catch (error) {
317
+ this.logDebug("Error sending to Respan", error);
318
+ throw error;
319
+ }
320
+ }
321
+ parseModel(span) {
322
+ const model = String(span.attributes["ai.model.id"] || "unknown").toLowerCase();
323
+ if (model.includes("gemini-2.0-flash-001")) {
324
+ return "gemini/gemini-2.0-flash";
325
+ }
326
+ if (model.includes("gemini-2.0-pro")) {
327
+ return "gemini/gemini-2.0-pro-exp-02-05";
328
+ }
329
+ if (model.includes("claude-3-5-sonnet")) {
330
+ return "claude-3-5-sonnet-20241022";
331
+ }
332
+ if (model.includes("deepseek")) {
333
+ return "deepseek/" + model;
334
+ }
335
+ if (model.includes("o3-mini")) {
336
+ return "o3-mini";
337
+ }
338
+ return model;
339
+ }
340
+ parsePromptMessages(span) {
341
+ try {
342
+ const messages = span.attributes["ai.prompt.messages"];
343
+ const parsedMessages = messages ? JSON.parse(String(messages)) : [];
344
+ return RespanPayloadSchema.shape.prompt_messages.parse(parsedMessages);
345
+ }
346
+ catch (error) {
347
+ this.logDebug("Error parsing messages:", error);
348
+ return [
349
+ {
350
+ role: "user",
351
+ content: String(span.attributes["ai.prompt"] || ""),
352
+ },
353
+ ];
354
+ }
355
+ }
356
+ parsePromptTokens(span) {
357
+ return parseInt(String(span.attributes["gen_ai.usage.input_tokens"] ||
358
+ span.attributes["gen_ai.usage.prompt_tokens"] ||
359
+ "0"));
360
+ }
361
+ parseCompletionTokens(span) {
362
+ return parseInt(String(span.attributes["gen_ai.usage.output_tokens"] ||
363
+ span.attributes["gen_ai.usage.completion_tokens"] ||
364
+ "0"));
365
+ }
366
+ parseTimeToFirstToken(span) {
367
+ const msToFinish = span.attributes["ai.response.msToFinish"];
368
+ const sToFinish = msToFinish ? msToFinish / 1000 : 0;
369
+ return sToFinish;
370
+ }
371
+ parseCost(span) {
372
+ const cost = span.attributes["gen_ai.usage.cost"];
373
+ return cost ? parseFloat(String(cost)) : undefined;
374
+ }
375
+ parseGenerationTime(span) {
376
+ const generationTime = span.attributes["gen_ai.usage.generation_time"];
377
+ return generationTime ? parseFloat(String(generationTime)) : undefined;
378
+ }
379
+ parseTtft(span) {
380
+ const ttft = span.attributes["gen_ai.usage.ttft"];
381
+ return ttft ? parseFloat(String(ttft)) : undefined;
382
+ }
383
+ parseWarnings(span) {
384
+ const warnings = span.attributes["gen_ai.usage.warnings"];
385
+ return warnings ? String(warnings) : undefined;
386
+ }
387
+ parseType(span) {
388
+ const type = span.attributes["gen_ai.usage.type"];
389
+ return type ? type : undefined;
390
+ }
391
+ parseMetadata(span) {
392
+ return Object.entries(span.attributes)
393
+ .filter(([key]) => key.startsWith("ai.telemetry.metadata."))
394
+ .reduce((acc, [key, value]) => {
395
+ const cleanKey = key.replace("ai.telemetry.metadata.", "");
396
+ acc[cleanKey] = value?.toString();
397
+ return acc;
398
+ }, {});
399
+ }
400
+ isGenerationSpan(span) {
401
+ return ["doGenerate", "doStream"].some((part) => span.name.includes(part));
402
+ }
403
+ isAiSdkSpan(span) {
404
+ // Check if the span is from the Vercel AI SDK
405
+ return (
406
+ // Check for ai-related attributes
407
+ span.attributes["ai.sdk"] === true ||
408
+ span.name.includes("ai.") ||
409
+ // Check for other AI SDK related attributes
410
+ Object.keys(span.attributes).some((key) => key.startsWith("ai.") || key.startsWith("gen_ai.")));
411
+ }
412
+ logDebug(message, ...args) {
413
+ if (!this.debug)
414
+ return;
415
+ console.log(`[${new Date().toISOString()}] [RespanExporter] ${message}`, ...args);
416
+ }
417
+ async shutdown() {
418
+ // Nothing to clean up
419
+ }
420
+ compareHrTime(a, b) {
421
+ if (a[0] !== b[0])
422
+ return a[0] - b[0];
423
+ return a[1] - b[1];
424
+ }
425
+ findRootSpan(span, spans) {
426
+ const parentId = span.attributes["span.parent_id"]?.toString() ||
427
+ span.attributes["parentSpanId"]?.toString();
428
+ if (!parentId)
429
+ return span;
430
+ return spans.find((s) => s.spanContext().spanId === parentId);
431
+ }
432
+ formatTimestamp(hrTime) {
433
+ const epochMs = hrTime[0] * 1000 + hrTime[1] / 1e6;
434
+ return new Date(epochMs).toISOString();
435
+ }
436
+ parseToolChoice(span) {
437
+ try {
438
+ const toolChoice = span.attributes["gen_ai.usage.tool_choice"];
439
+ if (!toolChoice)
440
+ return undefined;
441
+ const parsed = JSON.parse(String(toolChoice));
442
+ return {
443
+ type: String(parsed.type),
444
+ function: {
445
+ name: String(parsed.function.name),
446
+ },
447
+ };
448
+ }
449
+ catch {
450
+ return undefined;
451
+ }
452
+ }
453
+ parseTools(span) {
454
+ try {
455
+ const tools = span.attributes["ai.prompt.tools"] || [];
456
+ const parsed = Array.isArray(tools) ? tools : [tools];
457
+ return parsed
458
+ .map((tool) => {
459
+ try {
460
+ return JSON.parse(String(tool));
461
+ }
462
+ catch {
463
+ return undefined;
464
+ }
465
+ })
466
+ .filter(Boolean)
467
+ .map((tool) => {
468
+ // Accept both nested and flat shapes; normalize to nested
469
+ if (tool && tool.type === "function") {
470
+ if (tool.function && typeof tool.function === "object")
471
+ return tool;
472
+ // Flat shape -> wrap
473
+ const { name, description, parameters, ...rest } = tool;
474
+ return {
475
+ ...rest,
476
+ type: "function",
477
+ function: {
478
+ name,
479
+ ...(description ? { description } : {}),
480
+ ...(parameters ? { parameters } : {}),
481
+ },
482
+ };
483
+ }
484
+ return tool;
485
+ });
486
+ }
487
+ catch {
488
+ return undefined;
489
+ }
490
+ }
491
+ parseCustomerParams(span) {
492
+ const customerParams = span.attributes["ai.telemetry.metadata.customer_params"];
493
+ if (customerParams) {
494
+ const parsed = JSON.parse(String(customerParams));
495
+ return {
496
+ customer_identifier: parsed.customer_identifier,
497
+ customer_email: parsed.customer_email,
498
+ customer_name: parsed.customer_name,
499
+ };
500
+ }
501
+ else {
502
+ const customerEmail = span.attributes["ai.telemetry.metadata.customer_email"];
503
+ const customerName = span.attributes["ai.telemetry.metadata.customer_name"];
504
+ const customerIdentifier = span.attributes["ai.telemetry.metadata.customer_identifier"];
505
+ if (!customerIdentifier)
506
+ return undefined;
507
+ else {
508
+ return {
509
+ customer_email: String(customerEmail || ""),
510
+ customer_name: String(customerName || ""),
511
+ customer_identifier: String(customerIdentifier),
512
+ };
513
+ }
514
+ }
515
+ }
516
+ parseLogType(span) {
517
+ // Try to match span name directly to a known type
518
+ const spanName = span.name;
519
+ // Check if span name is in our mapping
520
+ if (spanName in VERCEL_SPAN_TO_RESPAN_LOG_TYPE) {
521
+ return VERCEL_SPAN_TO_RESPAN_LOG_TYPE[spanName];
522
+ }
523
+ // For spans with operationId attribute, check for more specific mapping
524
+ const operationId = span.attributes["ai.operationId"]?.toString();
525
+ if (operationId && operationId in VERCEL_SPAN_TO_RESPAN_LOG_TYPE) {
526
+ return VERCEL_SPAN_TO_RESPAN_LOG_TYPE[operationId];
527
+ }
528
+ // Check for specific attributes that indicate the span type
529
+ // Check for embedding-related attributes
530
+ if (span.attributes["ai.embedding"] ||
531
+ span.attributes["ai.embeddings"] ||
532
+ spanName.includes("embed") ||
533
+ operationId?.includes("embed")) {
534
+ return "embedding";
535
+ }
536
+ // Check for tool-related attributes
537
+ if (span.attributes["ai.toolCall.id"] ||
538
+ span.attributes["ai.toolCall.name"] ||
539
+ span.attributes["ai.toolCall.args"] ||
540
+ span.attributes["ai.toolCall.result"] ||
541
+ span.attributes["ai.response.toolCalls"] ||
542
+ spanName.includes("tool") ||
543
+ operationId?.includes("tool")) {
544
+ return "tool";
545
+ }
546
+ // Check for agent-related attributes
547
+ if (span.attributes["ai.agent.id"] ||
548
+ spanName.includes("agent") ||
549
+ operationId?.includes("agent")) {
550
+ return "agent";
551
+ }
552
+ // Check for workflow-related attributes
553
+ if (span.attributes["ai.workflow.id"] ||
554
+ spanName.includes("workflow") ||
555
+ operationId?.includes("workflow")) {
556
+ return "workflow";
557
+ }
558
+ // Check for transcription-related attributes
559
+ if (span.attributes["ai.transcript"] ||
560
+ spanName.includes("transcript") ||
561
+ operationId?.includes("transcript")) {
562
+ return "transcription";
563
+ }
564
+ // Check for speech-related attributes
565
+ if (span.attributes["ai.speech"] ||
566
+ spanName.includes("speech") ||
567
+ operationId?.includes("speech")) {
568
+ return "speech";
569
+ }
570
+ // Default to TEXT for any generation-related spans
571
+ if (this.isGenerationSpan(span)) {
572
+ return "text";
573
+ }
574
+ // Fall back to unknown for anything else
575
+ return "unknown";
576
+ }
577
+ // Add a new method to deduplicate spans
578
+ deduplicateSpans(spans) {
579
+ // First, group spans by their trace ID
580
+ const traceGroups = {};
581
+ // Group spans by trace ID
582
+ for (const span of spans) {
583
+ const traceId = span.spanContext().traceId;
584
+ if (!traceGroups[traceId]) {
585
+ traceGroups[traceId] = [];
586
+ }
587
+ traceGroups[traceId].push(span);
588
+ }
589
+ const deduplicatedSpans = [];
590
+ // Process each trace group
591
+ Object.values(traceGroups).forEach((traceSpans) => {
592
+ // Group by base operation name
593
+ const operationGroups = {};
594
+ // Group spans by operation name (without .doStream or .doGenerate suffix)
595
+ for (const span of traceSpans) {
596
+ let opKey = span.name;
597
+ if (opKey.endsWith(".doStream")) {
598
+ opKey = opKey.replace(".doStream", "");
599
+ }
600
+ else if (opKey.endsWith(".doGenerate")) {
601
+ opKey = opKey.replace(".doGenerate", "");
602
+ }
603
+ if (!operationGroups[opKey]) {
604
+ operationGroups[opKey] = [];
605
+ }
606
+ operationGroups[opKey].push(span);
607
+ }
608
+ // Process each operation group
609
+ Object.values(operationGroups).forEach((opSpans) => {
610
+ // If we have multiple spans for the same operation, prefer the more detailed one
611
+ if (opSpans.length > 1) {
612
+ // Find doStream or doGenerate span
613
+ const detailedSpan = opSpans.find((s) => s.name.endsWith(".doStream") || s.name.endsWith(".doGenerate"));
614
+ if (detailedSpan) {
615
+ // Only use the detailed span
616
+ deduplicatedSpans.push(detailedSpan);
617
+ }
618
+ else {
619
+ // No detailed span found, keep all spans
620
+ deduplicatedSpans.push(...opSpans);
621
+ }
622
+ }
623
+ else {
624
+ // Only one span, keep it
625
+ deduplicatedSpans.push(opSpans[0]);
626
+ }
627
+ });
628
+ });
629
+ return deduplicatedSpans;
630
+ }
631
+ }
632
+ //# sourceMappingURL=respan-vercel-trace-exporter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"respan-vercel-trace-exporter.js","sourceRoot":"","sources":["../src/respan-vercel-trace-exporter.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,33 @@
1
+ {
2
+ "name": "@respan/exporter-vercel",
3
+ "type": "module",
4
+ "version": "1.0.28",
5
+ "packageManager": "yarn@4.9.2",
6
+ "main": "dist/index.js",
7
+ "types": "dist/index.d.ts",
8
+ "files": [
9
+ "dist",
10
+ "README.md",
11
+ "LICENSE"
12
+ ],
13
+ "repository": "https://github.com/respan-ai/respan-sdks.git",
14
+ "author": "Respan <team@respan.ai>",
15
+ "license": "Apache-2.0",
16
+ "scripts": {
17
+ "build": "tsc",
18
+ "publish": "yarn npm publish",
19
+ "release": "yarn build && yarn version patch && yarn publish"
20
+ },
21
+ "publishConfig": {
22
+ "access": "public"
23
+ },
24
+ "dependencies": {
25
+ "@respan/respan-sdk": "^1.0.0",
26
+ "@opentelemetry/api": "^1.9.0",
27
+ "@opentelemetry/core": "^2.0.1",
28
+ "@opentelemetry/sdk-trace-base": "^2.0.1"
29
+ },
30
+ "devDependencies": {
31
+ "@types/node": "^24.0.1"
32
+ }
33
+ }