@countly/ai-sdk-vercel 0.0.3

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,70 @@
1
+ # @countly/ai-sdk-vercel
2
+
3
+ > Countly AI observability adapter for the [Vercel AI SDK](https://github.com/vercel/ai).
4
+
5
+ Part of the [Countly AI SDK](https://github.com/Countly/countly-ai-sdk) — provider-agnostic LLM observability for every AI stack.
6
+
7
+ ## Install
8
+
9
+ ```bash
10
+ npm install @countly/ai-sdk-vercel
11
+ ```
12
+
13
+ `@countly/ai-sdk-core` is pulled in automatically.
14
+
15
+ ## Peer dependency
16
+
17
+ ```
18
+ ai >= 4.0.0
19
+ ```
20
+
21
+ ## Quick Start
22
+
23
+ ```typescript
24
+ import { countlyTelemetry } from "@countly/ai-sdk-vercel";
25
+ import { generateText } from "ai";
26
+ import { openai } from "@ai-sdk/openai";
27
+ import { AsyncLocalStorage } from "node:async_hooks";
28
+
29
+ const userStore = new AsyncLocalStorage<{ userId: string }>();
30
+
31
+ app.use((req, res, next) => {
32
+ userStore.run({ userId: req.user.id }, next);
33
+ });
34
+
35
+ const telemetry = countlyTelemetry({
36
+ appKey: "YOUR_APP_KEY",
37
+ url: "https://your-countly-server.com",
38
+ getDeviceId: () => userStore.getStore()?.userId,
39
+ });
40
+
41
+ const { text } = await generateText({
42
+ model: openai("gpt-4o"),
43
+ prompt: "Explain quantum computing",
44
+ experimental_telemetry: { integrations: [telemetry] },
45
+ });
46
+ ```
47
+
48
+ ## What's captured
49
+
50
+ - Token usage (input, output, reasoning, cached) — uses `totalUsage` to aggregate multi-step calls when available
51
+ - Model, provider, finish reason
52
+ - Latency (total)
53
+ - Tool calls and results
54
+ - Reasoning text (when the model returns it)
55
+ - Error tracking
56
+
57
+ ## Flush before shutdown
58
+
59
+ ```typescript
60
+ await telemetry.flush(); // send buffered events
61
+ await telemetry.shutdown(); // flush + stop the transport
62
+ ```
63
+
64
+ ## Full documentation
65
+
66
+ See the [Countly AI SDK repository](https://github.com/Countly/countly-ai-sdk) for the unified data model, observability levels, cost calculation, privacy controls, and Countly plugin integration (Drill, Funnels, Cohorts, APM, Crash Analytics).
67
+
68
+ ## License
69
+
70
+ MIT
@@ -0,0 +1,64 @@
1
+ import { type CountlyAIConfig } from "@countly/ai-sdk-core";
2
+ /**
3
+ * The shape our factory returns. Consumers pass it into
4
+ * `experimental_telemetry: { integrations: [telemetry] }`.
5
+ *
6
+ * Matches the AI SDK `Telemetry` interface (callback-based).
7
+ */
8
+ export interface CountlyTelemetryIntegration {
9
+ onStart?: (event: any) => void;
10
+ onStepFinish?: (event: any) => void;
11
+ onFinish?: (event: any) => void;
12
+ onError?: (error: unknown) => void;
13
+ /** Flush pending events. */
14
+ flush(): Promise<void>;
15
+ /** Shutdown transport. */
16
+ shutdown(): Promise<void>;
17
+ }
18
+ /**
19
+ * Creates a Countly telemetry integration for the Vercel AI SDK (v4+).
20
+ *
21
+ * @example
22
+ * ```ts
23
+ * import { countlyTelemetry } from "@countly/ai-sdk-vercel";
24
+ * import { generateText } from "ai";
25
+ *
26
+ * const telemetry = countlyTelemetry({
27
+ * appKey: "YOUR_APP_KEY",
28
+ * url: "https://your-countly.com",
29
+ * });
30
+ *
31
+ * const { text } = await generateText({
32
+ * model: openai("gpt-4o"),
33
+ * prompt: "Hello",
34
+ * experimental_telemetry: { integrations: [telemetry] },
35
+ * });
36
+ * ```
37
+ */
38
+ export declare function countlyTelemetry(userConfig: CountlyAIConfig): CountlyTelemetryIntegration;
39
+ /**
40
+ * Class-based wrapper around `countlyTelemetry()`.
41
+ * Provides the same Telemetry integration via a class constructor.
42
+ */
43
+ export declare class CountlyTelemetry {
44
+ private readonly integration;
45
+ constructor(userConfig: CountlyAIConfig);
46
+ /** Returns the integration object for use with AI SDK. */
47
+ asIntegration(): CountlyTelemetryIntegration;
48
+ flush(): Promise<void>;
49
+ shutdown(): Promise<void>;
50
+ }
51
+ /**
52
+ * @deprecated The AI SDK no longer uses OTel SpanProcessor.
53
+ * Use `countlyTelemetry()` or `CountlyTelemetry` instead.
54
+ *
55
+ * This class is a no-op stub kept for backward compatibility.
56
+ */
57
+ export declare class CountlySpanProcessor {
58
+ constructor(_userConfig: CountlyAIConfig);
59
+ onStart(_span: any, _parentContext?: any): void;
60
+ onEnd(_span: any): void;
61
+ forceFlush(): Promise<void>;
62
+ shutdown(): Promise<void>;
63
+ }
64
+ //# sourceMappingURL=adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../src/adapter.ts"],"names":[],"mappings":"AAAA,OAAO,EAKL,KAAK,eAAe,EAKrB,MAAM,sBAAsB,CAAC;AAqD9B;;;;;GAKG;AACH,MAAM,WAAW,2BAA2B;IAC1C,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,KAAK,IAAI,CAAC;IAC/B,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,KAAK,IAAI,CAAC;IACpC,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,KAAK,IAAI,CAAC;IAChC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;IACnC,4BAA4B;IAC5B,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACvB,0BAA0B;IAC1B,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CAC3B;AAyED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,gBAAgB,CAC9B,UAAU,EAAE,eAAe,GAC1B,2BAA2B,CAmF7B;AAMD;;;GAGG;AACH,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,QAAQ,CAAC,WAAW,CAA8B;gBAE9C,UAAU,EAAE,eAAe;IAIvC,0DAA0D;IAC1D,aAAa,IAAI,2BAA2B;IAItC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAItB,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;CAGhC;AAMD;;;;;GAKG;AACH,qBAAa,oBAAoB;gBACnB,WAAW,EAAE,eAAe;IAQxC,OAAO,CAAC,KAAK,EAAE,GAAG,EAAE,cAAc,CAAC,EAAE,GAAG,GAAG,IAAI;IAC/C,KAAK,CAAC,KAAK,EAAE,GAAG,GAAG,IAAI;IACjB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAC3B,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;CAChC"}
@@ -0,0 +1,196 @@
1
+ import { resolveConfig, createTransport, buildAllEvents, generatePromptId, } from "@countly/ai-sdk-core";
2
+ // ---------------------------------------------------------------------------
3
+ // Helpers
4
+ // ---------------------------------------------------------------------------
5
+ function mapToolCalls(toolCalls) {
6
+ if (!toolCalls || toolCalls.length === 0)
7
+ return undefined;
8
+ return toolCalls.map((tc) => ({
9
+ name: tc.toolName ?? "unknown",
10
+ type: "function_call",
11
+ arguments: tc.input,
12
+ }));
13
+ }
14
+ function mapEventToExtraction(event, durationMs = 0) {
15
+ const usage = event.usage ?? {};
16
+ const inputTokens = usage.inputTokens ?? 0;
17
+ const outputTokens = usage.outputTokens ?? 0;
18
+ const cacheRead = usage.inputTokenDetails?.cacheReadTokens ??
19
+ usage.cachedInputTokens;
20
+ const cacheWrite = usage.inputTokenDetails?.cacheWriteTokens;
21
+ const reasoning = usage.outputTokenDetails?.reasoningTokens ??
22
+ usage.reasoningTokens;
23
+ // Provider-specific orphan fields → metadata bag.
24
+ const ev = event;
25
+ const meta = {};
26
+ if (ev.experimental_providerMetadata)
27
+ meta.experimental_providerMetadata = ev.experimental_providerMetadata;
28
+ if (ev.providerMetadata)
29
+ meta.providerMetadata = ev.providerMetadata;
30
+ if (ev.toolResults && ev.toolResults.length > 0)
31
+ meta.tool_results = ev.toolResults;
32
+ if (Array.isArray(ev.steps) && ev.steps.length > 0)
33
+ meta.steps_count = ev.steps.length;
34
+ if (ev.warnings && ev.warnings.length > 0)
35
+ meta.warnings = ev.warnings;
36
+ if (ev.sources && ev.sources.length > 0)
37
+ meta.sources = ev.sources;
38
+ if (ev.files && ev.files.length > 0)
39
+ meta.files = ev.files;
40
+ // Response identity: AI SDK returns nested response object on finish events.
41
+ const resp = ev.response ?? {};
42
+ return {
43
+ model: event.model?.modelId ?? "unknown",
44
+ provider: event.model?.provider ?? "unknown",
45
+ usage_input: inputTokens,
46
+ usage_output: outputTokens,
47
+ usage_total: inputTokens + outputTokens,
48
+ ...(reasoning !== undefined && { usage_reasoning: reasoning }),
49
+ ...(cacheRead !== undefined && { usage_cache_read: cacheRead }),
50
+ ...(cacheWrite !== undefined && { usage_cache_write: cacheWrite }),
51
+ finish_reason: event.finishReason ?? undefined,
52
+ tools: mapToolCalls(event.toolCalls),
53
+ text_output: event.text || undefined,
54
+ ...(event.reasoningText ? { text_reasoning: event.reasoningText } : {}),
55
+ latency_total: durationMs,
56
+ status: "success",
57
+ ...(resp.id && { response_id: String(resp.id) }),
58
+ ...(resp.modelId && { response_model: String(resp.modelId) }),
59
+ ...(Array.isArray(ev.steps) && ev.steps.length > 0 && { step_count: ev.steps.length }),
60
+ ...(Object.keys(meta).length > 0 && { provider_metadata: meta }),
61
+ };
62
+ }
63
+ // ---------------------------------------------------------------------------
64
+ // Factory
65
+ // ---------------------------------------------------------------------------
66
+ /**
67
+ * Creates a Countly telemetry integration for the Vercel AI SDK (v4+).
68
+ *
69
+ * @example
70
+ * ```ts
71
+ * import { countlyTelemetry } from "@countly/ai-sdk-vercel";
72
+ * import { generateText } from "ai";
73
+ *
74
+ * const telemetry = countlyTelemetry({
75
+ * appKey: "YOUR_APP_KEY",
76
+ * url: "https://your-countly.com",
77
+ * });
78
+ *
79
+ * const { text } = await generateText({
80
+ * model: openai("gpt-4o"),
81
+ * prompt: "Hello",
82
+ * experimental_telemetry: { integrations: [telemetry] },
83
+ * });
84
+ * ```
85
+ */
86
+ export function countlyTelemetry(userConfig) {
87
+ const config = resolveConfig(userConfig);
88
+ const transport = createTransport(config);
89
+ // Track start timestamps per callId for latency calculation
90
+ const callStartTimes = new Map();
91
+ const integration = {
92
+ onStart(event) {
93
+ if (event.callId) {
94
+ callStartTimes.set(event.callId, Date.now());
95
+ }
96
+ },
97
+ onStepFinish(event) {
98
+ // We let onFinish handle the top-level reporting.
99
+ // onStepFinish can be used for per-step granularity in the future.
100
+ },
101
+ onFinish(event) {
102
+ const startTime = event.callId
103
+ ? callStartTimes.get(event.callId)
104
+ : undefined;
105
+ const durationMs = startTime ? Date.now() - startTime : 0;
106
+ // Clean up
107
+ if (event.callId) {
108
+ callStartTimes.delete(event.callId);
109
+ }
110
+ // Use totalUsage if available (aggregated across all steps),
111
+ // otherwise fall back to the event's per-step usage.
112
+ const effectiveEvent = event.totalUsage
113
+ ? { ...event, usage: event.totalUsage }
114
+ : event;
115
+ const raw = mapEventToExtraction(effectiveEvent, durationMs);
116
+ const context = {
117
+ prompt_id: generatePromptId(),
118
+ sdk_adapter: "ai-sdk",
119
+ };
120
+ const events = buildAllEvents(raw, config, context);
121
+ if (events.length > 0) {
122
+ transport.enqueue(events);
123
+ }
124
+ transport.reportTrace(raw, context);
125
+ transport.reportUserData(raw);
126
+ },
127
+ onError(error) {
128
+ const raw = {
129
+ model: "unknown",
130
+ provider: "unknown",
131
+ usage_input: 0,
132
+ usage_output: 0,
133
+ usage_total: 0,
134
+ latency_total: 0,
135
+ status: "error",
136
+ error: error instanceof Error ? error.message : String(error),
137
+ };
138
+ const context = {
139
+ prompt_id: generatePromptId(),
140
+ sdk_adapter: "ai-sdk",
141
+ };
142
+ transport.reportError(raw.error, raw);
143
+ },
144
+ async flush() {
145
+ await transport.flush();
146
+ },
147
+ async shutdown() {
148
+ await transport.shutdown();
149
+ },
150
+ };
151
+ return integration;
152
+ }
153
+ // ---------------------------------------------------------------------------
154
+ // Class wrapper (alternative API)
155
+ // ---------------------------------------------------------------------------
156
+ /**
157
+ * Class-based wrapper around `countlyTelemetry()`.
158
+ * Provides the same Telemetry integration via a class constructor.
159
+ */
160
+ export class CountlyTelemetry {
161
+ integration;
162
+ constructor(userConfig) {
163
+ this.integration = countlyTelemetry(userConfig);
164
+ }
165
+ /** Returns the integration object for use with AI SDK. */
166
+ asIntegration() {
167
+ return this.integration;
168
+ }
169
+ async flush() {
170
+ await this.integration.flush();
171
+ }
172
+ async shutdown() {
173
+ await this.integration.shutdown();
174
+ }
175
+ }
176
+ // ---------------------------------------------------------------------------
177
+ // Deprecated: backward compatibility
178
+ // ---------------------------------------------------------------------------
179
+ /**
180
+ * @deprecated The AI SDK no longer uses OTel SpanProcessor.
181
+ * Use `countlyTelemetry()` or `CountlyTelemetry` instead.
182
+ *
183
+ * This class is a no-op stub kept for backward compatibility.
184
+ */
185
+ export class CountlySpanProcessor {
186
+ constructor(_userConfig) {
187
+ console.warn("[@countly/ai-sdk-vercel] CountlySpanProcessor is deprecated. " +
188
+ "The Vercel AI SDK no longer uses OTel SpanProcessor. " +
189
+ "Use countlyTelemetry() instead.");
190
+ }
191
+ onStart(_span, _parentContext) { }
192
+ onEnd(_span) { }
193
+ async forceFlush() { }
194
+ async shutdown() { }
195
+ }
196
+ //# sourceMappingURL=adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapter.js","sourceRoot":"","sources":["../src/adapter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export { countlyTelemetry, CountlyTelemetry, CountlySpanProcessor, } from "./adapter";
2
+ export type { CountlyTelemetryIntegration } from "./adapter";
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,gBAAgB,EAChB,gBAAgB,EAChB,oBAAoB,GACrB,MAAM,WAAW,CAAC;AACnB,YAAY,EAAE,2BAA2B,EAAE,MAAM,WAAW,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,2 @@
1
+ export { countlyTelemetry, CountlyTelemetry, CountlySpanProcessor, } from "./adapter";
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,gBAAgB,EAChB,gBAAgB,EAChB,oBAAoB,GACrB,MAAM,WAAW,CAAC"}
package/package.json ADDED
@@ -0,0 +1,39 @@
1
+ {
2
+ "name": "@countly/ai-sdk-vercel",
3
+ "version": "0.0.3",
4
+ "description": "Countly AI observability adapter for Vercel AI SDK",
5
+ "type": "module",
6
+ "exports": {
7
+ ".": {
8
+ "import": "./dist/index.js",
9
+ "types": "./dist/index.d.ts"
10
+ }
11
+ },
12
+ "files": [
13
+ "dist"
14
+ ],
15
+ "publishConfig": {
16
+ "access": "public"
17
+ },
18
+ "dependencies": {
19
+ "@countly/ai-sdk-core": "0.0.3"
20
+ },
21
+ "peerDependencies": {
22
+ "ai": ">=4.0.0"
23
+ },
24
+ "peerDependenciesMeta": {
25
+ "ai": {
26
+ "optional": false
27
+ }
28
+ },
29
+ "devDependencies": {
30
+ "typescript": "^5.8.3",
31
+ "@countly/ai-sdk-tsconfig": "0.0.0"
32
+ },
33
+ "scripts": {
34
+ "build": "tsc --project tsconfig.build.json",
35
+ "dev": "tsc --project tsconfig.build.json --watch",
36
+ "lint": "tsc --noEmit",
37
+ "test": "vitest run"
38
+ }
39
+ }