@countly/ai-sdk-anthropic 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 +91 -0
- package/dist/adapter.d.ts +25 -0
- package/dist/adapter.d.ts.map +1 -0
- package/dist/adapter.js +417 -0
- package/dist/adapter.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -0
- package/package.json +39 -0
package/README.md
ADDED
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
# @countly/ai-sdk-anthropic
|
|
2
|
+
|
|
3
|
+
> Countly AI observability adapter for the [Anthropic TypeScript SDK](https://github.com/anthropics/anthropic-sdk-typescript).
|
|
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-anthropic
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
`@countly/ai-sdk-core` is pulled in automatically.
|
|
14
|
+
|
|
15
|
+
## Peer dependency
|
|
16
|
+
|
|
17
|
+
```
|
|
18
|
+
@anthropic-ai/sdk >= 0.30.0
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
## Quick Start
|
|
22
|
+
|
|
23
|
+
```typescript
|
|
24
|
+
import Anthropic from "@anthropic-ai/sdk";
|
|
25
|
+
import { observeAnthropic } from "@countly/ai-sdk-anthropic";
|
|
26
|
+
import { AsyncLocalStorage } from "node:async_hooks";
|
|
27
|
+
|
|
28
|
+
const userStore = new AsyncLocalStorage<{ userId: string }>();
|
|
29
|
+
|
|
30
|
+
app.use((req, res, next) => {
|
|
31
|
+
userStore.run({ userId: req.user.id }, next);
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
const anthropic = observeAnthropic(new Anthropic(), {
|
|
35
|
+
appKey: "YOUR_APP_KEY",
|
|
36
|
+
url: "https://your-countly-server.com",
|
|
37
|
+
getDeviceId: () => userStore.getStore()?.userId,
|
|
38
|
+
observabilityLevel: 1,
|
|
39
|
+
tags: ["chatbot", "customer-support"],
|
|
40
|
+
environment: "production",
|
|
41
|
+
});
|
|
42
|
+
|
|
43
|
+
const message = await anthropic.messages.create({
|
|
44
|
+
model: "claude-sonnet-4-20250514",
|
|
45
|
+
max_tokens: 1024,
|
|
46
|
+
messages: [{ role: "user", content: "Hello" }],
|
|
47
|
+
});
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
## Streaming
|
|
51
|
+
|
|
52
|
+
```typescript
|
|
53
|
+
const stream = anthropic.messages.stream({
|
|
54
|
+
model: "claude-sonnet-4-20250514",
|
|
55
|
+
max_tokens: 1024,
|
|
56
|
+
messages: [{ role: "user", content: "Hello" }],
|
|
57
|
+
});
|
|
58
|
+
|
|
59
|
+
const finalMessage = await stream.finalMessage();
|
|
60
|
+
// Events reported automatically after stream completes
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
## What's captured
|
|
64
|
+
|
|
65
|
+
- Token usage (input, output, cache read, cache write)
|
|
66
|
+
- Cost (computed from model pricing)
|
|
67
|
+
- Latency (total + TTFT for streaming)
|
|
68
|
+
- Tool use blocks (name, arguments)
|
|
69
|
+
- Error tracking with categorization
|
|
70
|
+
- APM traces, per-user aggregation
|
|
71
|
+
|
|
72
|
+
## Configuration
|
|
73
|
+
|
|
74
|
+
| Field | Default | Description |
|
|
75
|
+
|-------|---------|-------------|
|
|
76
|
+
| `appKey` | *required* | Countly app key |
|
|
77
|
+
| `url` | *required* | Countly server URL |
|
|
78
|
+
| `getDeviceId` | — | Per-request user ID resolver (called at event enqueue time) |
|
|
79
|
+
| `deviceId` | — | Static device ID (fallback) |
|
|
80
|
+
| `observabilityLevel` | `0` | `0` = metrics only, `1` = + tool calls, `2` = + text previews |
|
|
81
|
+
| `tags` | `[]` | Labels for cost attribution |
|
|
82
|
+
| `environment` | `"production"` | Environment tag |
|
|
83
|
+
| `costModel` | — | Custom pricing overrides |
|
|
84
|
+
|
|
85
|
+
## Full documentation
|
|
86
|
+
|
|
87
|
+
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).
|
|
88
|
+
|
|
89
|
+
## License
|
|
90
|
+
|
|
91
|
+
MIT
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { type CountlyAIConfig } from "@countly/ai-sdk-core";
|
|
2
|
+
export interface CountlyAnthropicOptions extends CountlyAIConfig {
|
|
3
|
+
}
|
|
4
|
+
/**
|
|
5
|
+
* Wraps an Anthropic client with Countly AI observability.
|
|
6
|
+
*
|
|
7
|
+
* Uses JS Proxy to intercept `client.messages.create()` and `client.messages.stream()` calls
|
|
8
|
+
* and automatically track LLM interactions, token usage, costs, and latency.
|
|
9
|
+
*
|
|
10
|
+
* @example
|
|
11
|
+
* ```ts
|
|
12
|
+
* import Anthropic from "@anthropic-ai/sdk";
|
|
13
|
+
* import { observeAnthropic } from "@countly/ai-sdk-anthropic";
|
|
14
|
+
*
|
|
15
|
+
* const client = observeAnthropic(new Anthropic(), {
|
|
16
|
+
* appKey: "YOUR_APP_KEY",
|
|
17
|
+
* url: "https://your-countly-server.com",
|
|
18
|
+
* });
|
|
19
|
+
*
|
|
20
|
+
* // Use client as normal — all calls are automatically tracked
|
|
21
|
+
* const response = await client.messages.create({ ... });
|
|
22
|
+
* ```
|
|
23
|
+
*/
|
|
24
|
+
export declare function observeAnthropic<T>(client: T, options: CountlyAIConfig): T;
|
|
25
|
+
//# sourceMappingURL=adapter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../src/adapter.ts"],"names":[],"mappings":"AAAA,OAAO,EAML,KAAK,eAAe,EAKrB,MAAM,sBAAsB,CAAC;AAM9B,MAAM,WAAW,uBAAwB,SAAQ,eAAe;CAAG;AAkdnE;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,OAAO,EAAE,eAAe,GAAG,CAAC,CAa1E"}
|
package/dist/adapter.js
ADDED
|
@@ -0,0 +1,417 @@
|
|
|
1
|
+
import { resolveConfig, createTransport, buildAllEvents, generatePromptId, } from "@countly/ai-sdk-core";
|
|
2
|
+
function extractTextInput(params) {
|
|
3
|
+
if (!params?.messages)
|
|
4
|
+
return undefined;
|
|
5
|
+
const messages = params.messages;
|
|
6
|
+
const last = messages[messages.length - 1];
|
|
7
|
+
if (!last)
|
|
8
|
+
return undefined;
|
|
9
|
+
if (typeof last.content === "string")
|
|
10
|
+
return last.content;
|
|
11
|
+
if (Array.isArray(last.content)) {
|
|
12
|
+
return last.content
|
|
13
|
+
.filter((b) => b.type === "text")
|
|
14
|
+
.map((b) => b.text)
|
|
15
|
+
.join("");
|
|
16
|
+
}
|
|
17
|
+
return undefined;
|
|
18
|
+
}
|
|
19
|
+
function extractFromMessage(message) {
|
|
20
|
+
// Anthropic reports input_tokens EXCLUDING cache tokens, unlike OpenAI/Gemini
|
|
21
|
+
// where the input count already includes cache-read. Fold cache-read into
|
|
22
|
+
// usage_input so the SDK's cost contract (cache-read is a subset of input,
|
|
23
|
+
// billed at the discounted rate) holds uniformly across providers. Cache
|
|
24
|
+
// creation stays separate (usage_cache_write, premium rate).
|
|
25
|
+
const cacheRead = message.usage?.cache_read_input_tokens ?? 0;
|
|
26
|
+
const inputTokens = (message.usage?.input_tokens ?? 0) + cacheRead;
|
|
27
|
+
const outputTokens = message.usage?.output_tokens ?? 0;
|
|
28
|
+
const contentBlocks = message.content ?? [];
|
|
29
|
+
const toolBlocks = contentBlocks.filter((b) => b.type === "tool_use");
|
|
30
|
+
const tools = toolBlocks.map((b) => ({
|
|
31
|
+
name: b.name ?? "unknown",
|
|
32
|
+
type: "function_call",
|
|
33
|
+
arguments: b.input ?? undefined,
|
|
34
|
+
}));
|
|
35
|
+
const textOutput = contentBlocks
|
|
36
|
+
.filter((b) => b.type === "text")
|
|
37
|
+
.map((b) => b.text)
|
|
38
|
+
.join("");
|
|
39
|
+
// Provider-specific orphan fields → metadata bag.
|
|
40
|
+
const meta = {};
|
|
41
|
+
const m = message;
|
|
42
|
+
if (m.stop_sequence)
|
|
43
|
+
meta.stop_sequence = m.stop_sequence;
|
|
44
|
+
if (m.container)
|
|
45
|
+
meta.container = m.container;
|
|
46
|
+
const u = message.usage;
|
|
47
|
+
if (u?.server_tool_use)
|
|
48
|
+
meta.server_tool_use = u.server_tool_use;
|
|
49
|
+
if (u?.cache_creation)
|
|
50
|
+
meta.cache_creation = u.cache_creation;
|
|
51
|
+
if (u?.service_tier)
|
|
52
|
+
meta.service_tier = u.service_tier;
|
|
53
|
+
if (u?.inference_geo)
|
|
54
|
+
meta.inference_geo = u.inference_geo;
|
|
55
|
+
return {
|
|
56
|
+
model: message.model ?? "unknown",
|
|
57
|
+
provider: "anthropic",
|
|
58
|
+
usage_input: inputTokens,
|
|
59
|
+
usage_output: outputTokens,
|
|
60
|
+
usage_total: inputTokens + outputTokens,
|
|
61
|
+
usage_cache_read: message.usage?.cache_read_input_tokens,
|
|
62
|
+
usage_cache_write: message.usage?.cache_creation_input_tokens,
|
|
63
|
+
finish_reason: message.stop_reason ?? undefined,
|
|
64
|
+
tools: tools.length > 0 ? tools : undefined,
|
|
65
|
+
text_output: textOutput || undefined,
|
|
66
|
+
latency_total: 0, // filled by caller
|
|
67
|
+
status: "success",
|
|
68
|
+
...(m.id && { response_id: String(m.id) }),
|
|
69
|
+
...(message.model && { response_model: String(message.model) }),
|
|
70
|
+
...(Object.keys(meta).length > 0 && { provider_metadata: meta }),
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
function createMessagesProxy(messages, config, transport) {
|
|
74
|
+
return new Proxy(messages, {
|
|
75
|
+
get(target, prop, receiver) {
|
|
76
|
+
if (prop === "create") {
|
|
77
|
+
return createInterceptedCreate(target, config, transport);
|
|
78
|
+
}
|
|
79
|
+
if (prop === "stream") {
|
|
80
|
+
return createInterceptedStream(target, config, transport);
|
|
81
|
+
}
|
|
82
|
+
return Reflect.get(target, prop, receiver);
|
|
83
|
+
},
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
function createInterceptedCreate(messages, config, transport) {
|
|
87
|
+
const originalCreate = messages.create.bind(messages);
|
|
88
|
+
return async function interceptedCreate(...args) {
|
|
89
|
+
if (config.disabled) {
|
|
90
|
+
return originalCreate(...args);
|
|
91
|
+
}
|
|
92
|
+
const promptId = generatePromptId();
|
|
93
|
+
const params = args[0] ?? {};
|
|
94
|
+
const textInput = extractTextInput(params);
|
|
95
|
+
const isStream = params.stream === true;
|
|
96
|
+
const startTime = performance.now();
|
|
97
|
+
try {
|
|
98
|
+
const result = await originalCreate(...args);
|
|
99
|
+
if (isStream) {
|
|
100
|
+
// When stream: true is passed to create(), Anthropic SDK returns
|
|
101
|
+
// an async iterable of events. Wrap it to collect data.
|
|
102
|
+
return wrapStreamIterable(result, config, transport, promptId, textInput, startTime, params.model);
|
|
103
|
+
}
|
|
104
|
+
// Non-streaming response
|
|
105
|
+
const endTime = performance.now();
|
|
106
|
+
const raw = extractFromMessage(result);
|
|
107
|
+
raw.latency_total = Math.round(endTime - startTime);
|
|
108
|
+
raw.model_requested = params.model;
|
|
109
|
+
raw.config_temperature = params.temperature;
|
|
110
|
+
raw.config_top_p = params.top_p;
|
|
111
|
+
raw.config_max_tokens = params.max_tokens;
|
|
112
|
+
raw.config_stream = isStream;
|
|
113
|
+
if (config.observabilityLevel === 2 && textInput) {
|
|
114
|
+
raw.text_input = textInput;
|
|
115
|
+
}
|
|
116
|
+
const eventContext = { prompt_id: promptId, sdk_adapter: "anthropic" };
|
|
117
|
+
const events = buildAllEvents(raw, config, eventContext);
|
|
118
|
+
transport.enqueue(events);
|
|
119
|
+
transport.reportTrace(raw, eventContext);
|
|
120
|
+
transport.reportUserData(raw);
|
|
121
|
+
return result;
|
|
122
|
+
}
|
|
123
|
+
catch (error) {
|
|
124
|
+
const endTime = performance.now();
|
|
125
|
+
const raw = {
|
|
126
|
+
model: params.model ?? "unknown",
|
|
127
|
+
model_requested: params.model,
|
|
128
|
+
provider: "anthropic",
|
|
129
|
+
usage_input: 0,
|
|
130
|
+
usage_output: 0,
|
|
131
|
+
usage_total: 0,
|
|
132
|
+
latency_total: Math.round(endTime - startTime),
|
|
133
|
+
config_temperature: params.temperature,
|
|
134
|
+
config_top_p: params.top_p,
|
|
135
|
+
config_max_tokens: params.max_tokens,
|
|
136
|
+
config_stream: isStream,
|
|
137
|
+
status: "error",
|
|
138
|
+
error: error?.message ?? String(error),
|
|
139
|
+
};
|
|
140
|
+
if (config.observabilityLevel === 2 && textInput) {
|
|
141
|
+
raw.text_input = textInput;
|
|
142
|
+
}
|
|
143
|
+
const eventContext = { prompt_id: promptId, sdk_adapter: "anthropic" };
|
|
144
|
+
const events = buildAllEvents(raw, config, eventContext);
|
|
145
|
+
transport.enqueue(events);
|
|
146
|
+
transport.reportError(error, raw);
|
|
147
|
+
throw error;
|
|
148
|
+
}
|
|
149
|
+
};
|
|
150
|
+
}
|
|
151
|
+
function createInterceptedStream(messages, config, transport) {
|
|
152
|
+
const originalStream = messages.stream.bind(messages);
|
|
153
|
+
return function interceptedStream(...args) {
|
|
154
|
+
if (config.disabled) {
|
|
155
|
+
return originalStream(...args);
|
|
156
|
+
}
|
|
157
|
+
const promptId = generatePromptId();
|
|
158
|
+
const params = args[0] ?? {};
|
|
159
|
+
const textInput = extractTextInput(params);
|
|
160
|
+
const startTime = performance.now();
|
|
161
|
+
// Anthropic's messages.stream() returns a MessageStream object.
|
|
162
|
+
// We wrap it using a Proxy to intercept finalMessage() and the async iterator.
|
|
163
|
+
const stream = originalStream(...args);
|
|
164
|
+
return wrapMessageStream(stream, config, transport, promptId, textInput, startTime, params.model);
|
|
165
|
+
};
|
|
166
|
+
}
|
|
167
|
+
function wrapMessageStream(stream, config, transport, promptId, textInput, startTime, modelHint) {
|
|
168
|
+
let reported = false;
|
|
169
|
+
function reportFromMessage(message) {
|
|
170
|
+
if (reported)
|
|
171
|
+
return;
|
|
172
|
+
reported = true;
|
|
173
|
+
const endTime = performance.now();
|
|
174
|
+
const raw = extractFromMessage(message);
|
|
175
|
+
raw.latency_total = Math.round(endTime - startTime);
|
|
176
|
+
raw.config_stream = true;
|
|
177
|
+
if (config.observabilityLevel === 2 && textInput) {
|
|
178
|
+
raw.text_input = textInput;
|
|
179
|
+
}
|
|
180
|
+
const eventContext = { prompt_id: promptId, sdk_adapter: "anthropic" };
|
|
181
|
+
const events = buildAllEvents(raw, config, eventContext);
|
|
182
|
+
transport.enqueue(events);
|
|
183
|
+
transport.reportTrace(raw, eventContext);
|
|
184
|
+
transport.reportUserData(raw);
|
|
185
|
+
}
|
|
186
|
+
function reportError(error) {
|
|
187
|
+
if (reported)
|
|
188
|
+
return;
|
|
189
|
+
reported = true;
|
|
190
|
+
const endTime = performance.now();
|
|
191
|
+
const raw = {
|
|
192
|
+
model: modelHint ?? "unknown",
|
|
193
|
+
provider: "anthropic",
|
|
194
|
+
usage_input: 0,
|
|
195
|
+
usage_output: 0,
|
|
196
|
+
usage_total: 0,
|
|
197
|
+
latency_total: Math.round(endTime - startTime),
|
|
198
|
+
config_stream: true,
|
|
199
|
+
status: "error",
|
|
200
|
+
error: error?.message ?? String(error),
|
|
201
|
+
};
|
|
202
|
+
if (config.observabilityLevel === 2 && textInput) {
|
|
203
|
+
raw.text_input = textInput;
|
|
204
|
+
}
|
|
205
|
+
const eventContext = { prompt_id: promptId, sdk_adapter: "anthropic" };
|
|
206
|
+
const events = buildAllEvents(raw, config, eventContext);
|
|
207
|
+
transport.enqueue(events);
|
|
208
|
+
transport.reportError(error, raw);
|
|
209
|
+
}
|
|
210
|
+
const proxy = new Proxy(stream, {
|
|
211
|
+
get(target, prop, receiver) {
|
|
212
|
+
if (prop === "finalMessage") {
|
|
213
|
+
const originalFinalMessage = Reflect.get(target, prop, receiver);
|
|
214
|
+
if (typeof originalFinalMessage === "function") {
|
|
215
|
+
return async function wrappedFinalMessage(...fmArgs) {
|
|
216
|
+
try {
|
|
217
|
+
const message = await originalFinalMessage.apply(target, fmArgs);
|
|
218
|
+
reportFromMessage(message);
|
|
219
|
+
return message;
|
|
220
|
+
}
|
|
221
|
+
catch (error) {
|
|
222
|
+
reportError(error);
|
|
223
|
+
throw error;
|
|
224
|
+
}
|
|
225
|
+
};
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
// Intercept on() to capture the 'finalMessage', 'error', and 'abort' events.
|
|
229
|
+
// Return the proxy (not target) so chained .on() calls stay intercepted.
|
|
230
|
+
if (prop === "on") {
|
|
231
|
+
const originalOn = Reflect.get(target, prop, receiver);
|
|
232
|
+
if (typeof originalOn === "function") {
|
|
233
|
+
return function wrappedOn(event, callback, ...rest) {
|
|
234
|
+
if (event === "finalMessage") {
|
|
235
|
+
const wrappedCallback = (message) => {
|
|
236
|
+
reportFromMessage(message);
|
|
237
|
+
return callback(message);
|
|
238
|
+
};
|
|
239
|
+
originalOn.call(target, event, wrappedCallback, ...rest);
|
|
240
|
+
return proxy;
|
|
241
|
+
}
|
|
242
|
+
if (event === "error") {
|
|
243
|
+
const wrappedCallback = (error) => {
|
|
244
|
+
reportError(error);
|
|
245
|
+
return callback(error);
|
|
246
|
+
};
|
|
247
|
+
originalOn.call(target, event, wrappedCallback, ...rest);
|
|
248
|
+
return proxy;
|
|
249
|
+
}
|
|
250
|
+
if (event === "abort") {
|
|
251
|
+
const wrappedCallback = (error) => {
|
|
252
|
+
reportError(error ?? new Error("Request aborted"));
|
|
253
|
+
return callback(error);
|
|
254
|
+
};
|
|
255
|
+
originalOn.call(target, event, wrappedCallback, ...rest);
|
|
256
|
+
return proxy;
|
|
257
|
+
}
|
|
258
|
+
originalOn.call(target, event, callback, ...rest);
|
|
259
|
+
return proxy;
|
|
260
|
+
};
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
// Wrap the async iterator to capture when stream ends
|
|
264
|
+
if (prop === Symbol.asyncIterator) {
|
|
265
|
+
const originalIterator = Reflect.get(target, prop, receiver);
|
|
266
|
+
if (typeof originalIterator === "function") {
|
|
267
|
+
return function wrappedAsyncIterator() {
|
|
268
|
+
const iterator = originalIterator.call(target);
|
|
269
|
+
return {
|
|
270
|
+
async next() {
|
|
271
|
+
const result = await iterator.next();
|
|
272
|
+
if (result.done) {
|
|
273
|
+
// Try to extract final message from the stream
|
|
274
|
+
try {
|
|
275
|
+
if (typeof target.finalMessage === "function") {
|
|
276
|
+
const message = await target.finalMessage();
|
|
277
|
+
reportFromMessage(message);
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
catch {
|
|
281
|
+
// finalMessage may not be available; ignore
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
return result;
|
|
285
|
+
},
|
|
286
|
+
return: iterator.return?.bind(iterator),
|
|
287
|
+
throw: iterator.throw?.bind(iterator),
|
|
288
|
+
};
|
|
289
|
+
};
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
return Reflect.get(target, prop, receiver);
|
|
293
|
+
},
|
|
294
|
+
});
|
|
295
|
+
return proxy;
|
|
296
|
+
}
|
|
297
|
+
async function* wrapStreamIterable(stream, config, transport, promptId, textInput, startTime, modelHint) {
|
|
298
|
+
// If the stream object has a finalMessage method (Anthropic stream helper),
|
|
299
|
+
// we can use that for extraction
|
|
300
|
+
const streamObj = stream;
|
|
301
|
+
let firstChunkTime;
|
|
302
|
+
try {
|
|
303
|
+
for await (const event of stream) {
|
|
304
|
+
if (firstChunkTime === undefined) {
|
|
305
|
+
firstChunkTime = performance.now();
|
|
306
|
+
}
|
|
307
|
+
yield event;
|
|
308
|
+
}
|
|
309
|
+
// After stream completes, try to get finalMessage
|
|
310
|
+
if (typeof streamObj.finalMessage === "function") {
|
|
311
|
+
try {
|
|
312
|
+
const message = await streamObj.finalMessage();
|
|
313
|
+
const endTime = performance.now();
|
|
314
|
+
const raw = extractFromMessage(message);
|
|
315
|
+
raw.latency_total = Math.round(endTime - startTime);
|
|
316
|
+
if (firstChunkTime !== undefined) {
|
|
317
|
+
raw.latency_ttft = Math.round(firstChunkTime - startTime);
|
|
318
|
+
}
|
|
319
|
+
raw.config_stream = true;
|
|
320
|
+
if (config.observabilityLevel === 2 && textInput) {
|
|
321
|
+
raw.text_input = textInput;
|
|
322
|
+
}
|
|
323
|
+
const eventContext = { prompt_id: promptId, sdk_adapter: "anthropic" };
|
|
324
|
+
const events = buildAllEvents(raw, config, eventContext);
|
|
325
|
+
transport.enqueue(events);
|
|
326
|
+
transport.reportTrace(raw, eventContext);
|
|
327
|
+
transport.reportUserData(raw);
|
|
328
|
+
return;
|
|
329
|
+
}
|
|
330
|
+
catch {
|
|
331
|
+
// Fall through to basic reporting
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
// Basic reporting when finalMessage is not available
|
|
335
|
+
const endTime = performance.now();
|
|
336
|
+
const raw = {
|
|
337
|
+
model: modelHint ?? "unknown",
|
|
338
|
+
provider: "anthropic",
|
|
339
|
+
usage_input: 0,
|
|
340
|
+
usage_output: 0,
|
|
341
|
+
usage_total: 0,
|
|
342
|
+
latency_total: Math.round(endTime - startTime),
|
|
343
|
+
config_stream: true,
|
|
344
|
+
status: "success",
|
|
345
|
+
};
|
|
346
|
+
if (firstChunkTime !== undefined) {
|
|
347
|
+
raw.latency_ttft = Math.round(firstChunkTime - startTime);
|
|
348
|
+
}
|
|
349
|
+
if (config.observabilityLevel === 2 && textInput) {
|
|
350
|
+
raw.text_input = textInput;
|
|
351
|
+
}
|
|
352
|
+
const eventContext = { prompt_id: promptId, sdk_adapter: "anthropic" };
|
|
353
|
+
const events = buildAllEvents(raw, config, eventContext);
|
|
354
|
+
transport.enqueue(events);
|
|
355
|
+
transport.reportTrace(raw, eventContext);
|
|
356
|
+
transport.reportUserData(raw);
|
|
357
|
+
}
|
|
358
|
+
catch (error) {
|
|
359
|
+
const endTime = performance.now();
|
|
360
|
+
const raw = {
|
|
361
|
+
model: modelHint ?? "unknown",
|
|
362
|
+
provider: "anthropic",
|
|
363
|
+
usage_input: 0,
|
|
364
|
+
usage_output: 0,
|
|
365
|
+
usage_total: 0,
|
|
366
|
+
latency_total: Math.round(endTime - startTime),
|
|
367
|
+
config_stream: true,
|
|
368
|
+
status: "error",
|
|
369
|
+
error: error?.message ?? String(error),
|
|
370
|
+
};
|
|
371
|
+
if (firstChunkTime !== undefined) {
|
|
372
|
+
raw.latency_ttft = Math.round(firstChunkTime - startTime);
|
|
373
|
+
}
|
|
374
|
+
if (config.observabilityLevel === 2 && textInput) {
|
|
375
|
+
raw.text_input = textInput;
|
|
376
|
+
}
|
|
377
|
+
const eventContext = { prompt_id: promptId, sdk_adapter: "anthropic" };
|
|
378
|
+
const events = buildAllEvents(raw, config, eventContext);
|
|
379
|
+
transport.enqueue(events);
|
|
380
|
+
transport.reportError(error, raw);
|
|
381
|
+
throw error;
|
|
382
|
+
}
|
|
383
|
+
}
|
|
384
|
+
/**
|
|
385
|
+
* Wraps an Anthropic client with Countly AI observability.
|
|
386
|
+
*
|
|
387
|
+
* Uses JS Proxy to intercept `client.messages.create()` and `client.messages.stream()` calls
|
|
388
|
+
* and automatically track LLM interactions, token usage, costs, and latency.
|
|
389
|
+
*
|
|
390
|
+
* @example
|
|
391
|
+
* ```ts
|
|
392
|
+
* import Anthropic from "@anthropic-ai/sdk";
|
|
393
|
+
* import { observeAnthropic } from "@countly/ai-sdk-anthropic";
|
|
394
|
+
*
|
|
395
|
+
* const client = observeAnthropic(new Anthropic(), {
|
|
396
|
+
* appKey: "YOUR_APP_KEY",
|
|
397
|
+
* url: "https://your-countly-server.com",
|
|
398
|
+
* });
|
|
399
|
+
*
|
|
400
|
+
* // Use client as normal — all calls are automatically tracked
|
|
401
|
+
* const response = await client.messages.create({ ... });
|
|
402
|
+
* ```
|
|
403
|
+
*/
|
|
404
|
+
export function observeAnthropic(client, options) {
|
|
405
|
+
const config = resolveConfig(options);
|
|
406
|
+
const transport = createTransport(config);
|
|
407
|
+
return new Proxy(client, {
|
|
408
|
+
get(target, prop, receiver) {
|
|
409
|
+
if (prop === "messages") {
|
|
410
|
+
const messages = Reflect.get(target, prop, receiver);
|
|
411
|
+
return createMessagesProxy(messages, config, transport);
|
|
412
|
+
}
|
|
413
|
+
return Reflect.get(target, prop, receiver);
|
|
414
|
+
},
|
|
415
|
+
});
|
|
416
|
+
}
|
|
417
|
+
//# sourceMappingURL=adapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adapter.js","sourceRoot":"","sources":["../src/adapter.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,aAAa,EACb,eAAe,EACf,cAAc,EACd,gBAAgB,GAOjB,MAAM,sBAAsB,CAAC;AAQ9B,SAAS,gBAAgB,CAAC,MAAW;IACnC,IAAI,CAAC,MAAM,EAAE,QAAQ;QAAE,OAAO,SAAS,CAAC;IACxC,MAAM,QAAQ,GAAU,MAAM,CAAC,QAAQ,CAAC;IACxC,MAAM,IAAI,GAAG,QAAQ,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAC3C,IAAI,CAAC,IAAI;QAAE,OAAO,SAAS,CAAC;IAC5B,IAAI,OAAO,IAAI,CAAC,OAAO,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC,OAAO,CAAC;IAC1D,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QAChC,OAAO,IAAI,CAAC,OAAO;aAChB,MAAM,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC;aACrC,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;aACvB,IAAI,CAAC,EAAE,CAAC,CAAC;IACd,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,kBAAkB,CAAC,OAAyB;IACnD,8EAA8E;IAC9E,0EAA0E;IAC1E,2EAA2E;IAC3E,yEAAyE;IACzE,6DAA6D;IAC7D,MAAM,SAAS,GAAG,OAAO,CAAC,KAAK,EAAE,uBAAuB,IAAI,CAAC,CAAC;IAC9D,MAAM,WAAW,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,YAAY,IAAI,CAAC,CAAC,GAAG,SAAS,CAAC;IACnE,MAAM,YAAY,GAAG,OAAO,CAAC,KAAK,EAAE,aAAa,IAAI,CAAC,CAAC;IAEvD,MAAM,aAAa,GAAU,OAAO,CAAC,OAAO,IAAI,EAAE,CAAC;IAEnD,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CACrC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,UAAU,CAClC,CAAC;IACF,MAAM,KAAK,GAAkB,UAAU,CAAC,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC;QACvD,IAAI,EAAE,CAAC,CAAC,IAAI,IAAI,SAAS;QACzB,IAAI,EAAE,eAAwB;QAC9B,SAAS,EAAE,CAAC,CAAC,KAAK,IAAI,SAAS;KAChC,CAAC,CAAC,CAAC;IAEJ,MAAM,UAAU,GAAG,aAAa;SAC7B,MAAM,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC;SACrC,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;SACvB,IAAI,CAAC,EAAE,CAAC,CAAC;IAEZ,kDAAkD;IAClD,MAAM,IAAI,GAA4B,EAAE,CAAC;IACzC,MAAM,CAAC,GAAG,OAAc,CAAC;IACzB,IAAI,CAAC,CAAC,aAAa;QAAE,IAAI,CAAC,aAAa,GAAG,CAAC,CAAC,aAAa,CAAC;IAC1D,IAAI,CAAC,CAAC,SAAS;QAAE,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC,SAAS,CAAC;IAC9C,MAAM,CAAC,GAAG,OAAO,CAAC,KAAY,CAAC;IAC/B,IAAI,CAAC,EAAE,eAAe;QAAE,IAAI,CAAC,eAAe,GAAG,CAAC,CAAC,eAAe,CAAC;IACjE,IAAI,CAAC,EAAE,cAAc;QAAE,IAAI,CAAC,cAAc,GAAG,CAAC,CAAC,cAAc,CAAC;IAC9D,IAAI,CAAC,EAAE,YAAY;QAAE,IAAI,CAAC,YAAY,GAAG,CAAC,CAAC,YAAY,CAAC;IACxD,IAAI,CAAC,EAAE,aAAa;QAAE,IAAI,CAAC,aAAa,GAAG,CAAC,CAAC,aAAa,CAAC;IAE3D,OAAO;QACL,KAAK,EAAE,OAAO,CAAC,KAAK,IAAI,SAAS;QACjC,QAAQ,EAAE,WAAW;QACrB,WAAW,EAAE,WAAW;QACxB,YAAY,EAAE,YAAY;QAC1B,WAAW,EAAE,WAAW,GAAG,YAAY;QACvC,gBAAgB,EAAE,OAAO,CAAC,KAAK,EAAE,uBAAuB;QACxD,iBAAiB,EAAE,OAAO,CAAC,KAAK,EAAE,2BAA2B;QAC7D,aAAa,EAAE,OAAO,CAAC,WAAW,IAAI,SAAS;QAC/C,KAAK,EAAE,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS;QAC3C,WAAW,EAAE,UAAU,IAAI,SAAS;QACpC,aAAa,EAAE,CAAC,EAAE,mBAAmB;QACrC,MAAM,EAAE,SAAS;QACjB,GAAG,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;QAC1C,GAAG,CAAC,OAAO,CAAC,KAAK,IAAI,EAAE,cAAc,EAAE,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QAC/D,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,iBAAiB,EAAE,IAAI,EAAE,CAAC;KACjE,CAAC;AACJ,CAAC;AAED,SAAS,mBAAmB,CAC1B,QAAa,EACb,MAAsB,EACtB,SAAoB;IAEpB,OAAO,IAAI,KAAK,CAAC,QAAQ,EAAE;QACzB,GAAG,CAAC,MAAM,EAAE,IAAI,EAAE,QAAQ;YACxB,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;gBACtB,OAAO,uBAAuB,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC;YAC5D,CAAC;YACD,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;gBACtB,OAAO,uBAAuB,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC;YAC5D,CAAC;YACD,OAAO,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC;QAC7C,CAAC;KACF,CAAC,CAAC;AACL,CAAC;AAED,SAAS,uBAAuB,CAC9B,QAAa,EACb,MAAsB,EACtB,SAAoB;IAEpB,MAAM,cAAc,GAAG,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAEtD,OAAO,KAAK,UAAU,iBAAiB,CAAC,GAAG,IAAW;QACpD,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;YACpB,OAAO,cAAc,CAAC,GAAG,IAAI,CAAC,CAAC;QACjC,CAAC;QAED,MAAM,QAAQ,GAAG,gBAAgB,EAAE,CAAC;QACpC,MAAM,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAC7B,MAAM,SAAS,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC;QAC3C,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,KAAK,IAAI,CAAC;QACxC,MAAM,SAAS,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;QAEpC,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,GAAG,IAAI,CAAC,CAAC;YAE7C,IAAI,QAAQ,EAAE,CAAC;gBACb,iEAAiE;gBACjE,wDAAwD;gBACxD,OAAO,kBAAkB,CACvB,MAAM,EACN,MAAM,EACN,SAAS,EACT,QAAQ,EACR,SAAS,EACT,SAAS,EACT,MAAM,CAAC,KAAK,CACb,CAAC;YACJ,CAAC;YAED,yBAAyB;YACzB,MAAM,OAAO,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;YAClC,MAAM,GAAG,GAAG,kBAAkB,CAAC,MAAM,CAAC,CAAC;YACvC,GAAG,CAAC,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,SAAS,CAAC,CAAC;YACpD,GAAG,CAAC,eAAe,GAAG,MAAM,CAAC,KAAK,CAAC;YACnC,GAAG,CAAC,kBAAkB,GAAG,MAAM,CAAC,WAAW,CAAC;YAC5C,GAAG,CAAC,YAAY,GAAG,MAAM,CAAC,KAAK,CAAC;YAChC,GAAG,CAAC,iBAAiB,GAAG,MAAM,CAAC,UAAU,CAAC;YAC1C,GAAG,CAAC,aAAa,GAAG,QAAQ,CAAC;YAE7B,IAAI,MAAM,CAAC,kBAAkB,KAAK,CAAC,IAAI,SAAS,EAAE,CAAC;gBACjD,GAAG,CAAC,UAAU,GAAG,SAAS,CAAC;YAC7B,CAAC;YAED,MAAM,YAAY,GAAG,EAAE,SAAS,EAAE,QAAQ,EAAE,WAAW,EAAE,WAAW,EAAE,CAAC;YACvE,MAAM,MAAM,GAAG,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,YAAY,CAAC,CAAC;YACzD,SAAS,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;YAC1B,SAAS,CAAC,WAAW,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;YACzC,SAAS,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC;YAE9B,OAAO,MAAM,CAAC;QAChB,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,MAAM,OAAO,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;YAClC,MAAM,GAAG,GAAwB;gBAC/B,KAAK,EAAE,MAAM,CAAC,KAAK,IAAI,SAAS;gBAChC,eAAe,EAAE,MAAM,CAAC,KAAK;gBAC7B,QAAQ,EAAE,WAAW;gBACrB,WAAW,EAAE,CAAC;gBACd,YAAY,EAAE,CAAC;gBACf,WAAW,EAAE,CAAC;gBACd,aAAa,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,SAAS,CAAC;gBAC9C,kBAAkB,EAAE,MAAM,CAAC,WAAW;gBACtC,YAAY,EAAE,MAAM,CAAC,KAAK;gBAC1B,iBAAiB,EAAE,MAAM,CAAC,UAAU;gBACpC,aAAa,EAAE,QAAQ;gBACvB,MAAM,EAAE,OAAO;gBACf,KAAK,EAAE,KAAK,EAAE,OAAO,IAAI,MAAM,CAAC,KAAK,CAAC;aACvC,CAAC;YAEF,IAAI,MAAM,CAAC,kBAAkB,KAAK,CAAC,IAAI,SAAS,EAAE,CAAC;gBACjD,GAAG,CAAC,UAAU,GAAG,SAAS,CAAC;YAC7B,CAAC;YAED,MAAM,YAAY,GAAG,EAAE,SAAS,EAAE,QAAQ,EAAE,WAAW,EAAE,WAAW,EAAE,CAAC;YACvE,MAAM,MAAM,GAAG,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,YAAY,CAAC,CAAC;YACzD,SAAS,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;YAC1B,SAAS,CAAC,WAAW,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;YAElC,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC,CAAC;AACJ,CAAC;AAED,SAAS,uBAAuB,CAC9B,QAAa,EACb,MAAsB,EACtB,SAAoB;IAEpB,MAAM,cAAc,GAAG,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAEtD,OAAO,SAAS,iBAAiB,CAAC,GAAG,IAAW;QAC9C,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;YACpB,OAAO,cAAc,CAAC,GAAG,IAAI,CAAC,CAAC;QACjC,CAAC;QAED,MAAM,QAAQ,GAAG,gBAAgB,EAAE,CAAC;QACpC,MAAM,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAC7B,MAAM,SAAS,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC;QAC3C,MAAM,SAAS,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;QAEpC,gEAAgE;QAChE,+EAA+E;QAC/E,MAAM,MAAM,GAAG,cAAc,CAAC,GAAG,IAAI,CAAC,CAAC;QAEvC,OAAO,iBAAiB,CACtB,MAAM,EACN,MAAM,EACN,SAAS,EACT,QAAQ,EACR,SAAS,EACT,SAAS,EACT,MAAM,CAAC,KAAK,CACb,CAAC;IACJ,CAAC,CAAC;AACJ,CAAC;AAED,SAAS,iBAAiB,CACxB,MAAqB,EACrB,MAAsB,EACtB,SAAoB,EACpB,QAAgB,EAChB,SAA6B,EAC7B,SAAiB,EACjB,SAA6B;IAE7B,IAAI,QAAQ,GAAG,KAAK,CAAC;IAErB,SAAS,iBAAiB,CAAC,OAAyB;QAClD,IAAI,QAAQ;YAAE,OAAO;QACrB,QAAQ,GAAG,IAAI,CAAC;QAEhB,MAAM,OAAO,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;QAClC,MAAM,GAAG,GAAG,kBAAkB,CAAC,OAAO,CAAC,CAAC;QACxC,GAAG,CAAC,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,SAAS,CAAC,CAAC;QACpD,GAAG,CAAC,aAAa,GAAG,IAAI,CAAC;QAEzB,IAAI,MAAM,CAAC,kBAAkB,KAAK,CAAC,IAAI,SAAS,EAAE,CAAC;YACjD,GAAG,CAAC,UAAU,GAAG,SAAS,CAAC;QAC7B,CAAC;QAED,MAAM,YAAY,GAAG,EAAE,SAAS,EAAE,QAAQ,EAAE,WAAW,EAAE,WAAW,EAAE,CAAC;QACvE,MAAM,MAAM,GAAG,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,YAAY,CAAC,CAAC;QACzD,SAAS,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAC1B,SAAS,CAAC,WAAW,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;QACzC,SAAS,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC;IAChC,CAAC;IAED,SAAS,WAAW,CAAC,KAAU;QAC7B,IAAI,QAAQ;YAAE,OAAO;QACrB,QAAQ,GAAG,IAAI,CAAC;QAEhB,MAAM,OAAO,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;QAClC,MAAM,GAAG,GAAwB;YAC/B,KAAK,EAAE,SAAS,IAAI,SAAS;YAC7B,QAAQ,EAAE,WAAW;YACrB,WAAW,EAAE,CAAC;YACd,YAAY,EAAE,CAAC;YACf,WAAW,EAAE,CAAC;YACd,aAAa,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,SAAS,CAAC;YAC9C,aAAa,EAAE,IAAI;YACnB,MAAM,EAAE,OAAO;YACf,KAAK,EAAE,KAAK,EAAE,OAAO,IAAI,MAAM,CAAC,KAAK,CAAC;SACvC,CAAC;QAEF,IAAI,MAAM,CAAC,kBAAkB,KAAK,CAAC,IAAI,SAAS,EAAE,CAAC;YACjD,GAAG,CAAC,UAAU,GAAG,SAAS,CAAC;QAC7B,CAAC;QAED,MAAM,YAAY,GAAG,EAAE,SAAS,EAAE,QAAQ,EAAE,WAAW,EAAE,WAAW,EAAE,CAAC;QACvE,MAAM,MAAM,GAAG,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,YAAY,CAAC,CAAC;QACzD,SAAS,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAC1B,SAAS,CAAC,WAAW,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IACpC,CAAC;IAED,MAAM,KAAK,GAAkB,IAAI,KAAK,CAAC,MAAM,EAAE;QAC7C,GAAG,CAAC,MAAM,EAAE,IAAI,EAAE,QAAQ;YACxB,IAAI,IAAI,KAAK,cAAc,EAAE,CAAC;gBAC5B,MAAM,oBAAoB,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC;gBACjE,IAAI,OAAO,oBAAoB,KAAK,UAAU,EAAE,CAAC;oBAC/C,OAAO,KAAK,UAAU,mBAAmB,CAAC,GAAG,MAAa;wBACxD,IAAI,CAAC;4BACH,MAAM,OAAO,GAAG,MAAM,oBAAoB,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;4BACjE,iBAAiB,CAAC,OAAO,CAAC,CAAC;4BAC3B,OAAO,OAAO,CAAC;wBACjB,CAAC;wBAAC,OAAO,KAAK,EAAE,CAAC;4BACf,WAAW,CAAC,KAAK,CAAC,CAAC;4BACnB,MAAM,KAAK,CAAC;wBACd,CAAC;oBACH,CAAC,CAAC;gBACJ,CAAC;YACH,CAAC;YAED,6EAA6E;YAC7E,yEAAyE;YACzE,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;gBAClB,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC;gBACvD,IAAI,OAAO,UAAU,KAAK,UAAU,EAAE,CAAC;oBACrC,OAAO,SAAS,SAAS,CAAC,KAAa,EAAE,QAAa,EAAE,GAAG,IAAW;wBACpE,IAAI,KAAK,KAAK,cAAc,EAAE,CAAC;4BAC7B,MAAM,eAAe,GAAG,CAAC,OAAyB,EAAE,EAAE;gCACpD,iBAAiB,CAAC,OAAO,CAAC,CAAC;gCAC3B,OAAO,QAAQ,CAAC,OAAO,CAAC,CAAC;4BAC3B,CAAC,CAAC;4BACF,UAAU,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,eAAe,EAAE,GAAG,IAAI,CAAC,CAAC;4BACzD,OAAO,KAAK,CAAC;wBACf,CAAC;wBACD,IAAI,KAAK,KAAK,OAAO,EAAE,CAAC;4BACtB,MAAM,eAAe,GAAG,CAAC,KAAU,EAAE,EAAE;gCACrC,WAAW,CAAC,KAAK,CAAC,CAAC;gCACnB,OAAO,QAAQ,CAAC,KAAK,CAAC,CAAC;4BACzB,CAAC,CAAC;4BACF,UAAU,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,eAAe,EAAE,GAAG,IAAI,CAAC,CAAC;4BACzD,OAAO,KAAK,CAAC;wBACf,CAAC;wBACD,IAAI,KAAK,KAAK,OAAO,EAAE,CAAC;4BACtB,MAAM,eAAe,GAAG,CAAC,KAAU,EAAE,EAAE;gCACrC,WAAW,CAAC,KAAK,IAAI,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAAC,CAAC;gCACnD,OAAO,QAAQ,CAAC,KAAK,CAAC,CAAC;4BACzB,CAAC,CAAC;4BACF,UAAU,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,eAAe,EAAE,GAAG,IAAI,CAAC,CAAC;4BACzD,OAAO,KAAK,CAAC;wBACf,CAAC;wBACD,UAAU,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,IAAI,CAAC,CAAC;wBAClD,OAAO,KAAK,CAAC;oBACf,CAAC,CAAC;gBACJ,CAAC;YACH,CAAC;YAED,sDAAsD;YACtD,IAAI,IAAI,KAAK,MAAM,CAAC,aAAa,EAAE,CAAC;gBAClC,MAAM,gBAAgB,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC;gBAC7D,IAAI,OAAO,gBAAgB,KAAK,UAAU,EAAE,CAAC;oBAC3C,OAAO,SAAS,oBAAoB;wBAClC,MAAM,QAAQ,GAAG,gBAAgB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;wBAC/C,OAAO;4BACL,KAAK,CAAC,IAAI;gCACR,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;gCACrC,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;oCAChB,+CAA+C;oCAC/C,IAAI,CAAC;wCACH,IAAI,OAAO,MAAM,CAAC,YAAY,KAAK,UAAU,EAAE,CAAC;4CAC9C,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,YAAY,EAAE,CAAC;4CAC5C,iBAAiB,CAAC,OAAO,CAAC,CAAC;wCAC7B,CAAC;oCACH,CAAC;oCAAC,MAAM,CAAC;wCACP,4CAA4C;oCAC9C,CAAC;gCACH,CAAC;gCACD,OAAO,MAAM,CAAC;4BAChB,CAAC;4BACD,MAAM,EAAE,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC;4BACvC,KAAK,EAAE,QAAQ,CAAC,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC;yBACtC,CAAC;oBACJ,CAAC,CAAC;gBACJ,CAAC;YACH,CAAC;YAED,OAAO,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC;QAC7C,CAAC;KACF,CAAC,CAAC;IAEH,OAAO,KAAK,CAAC;AACf,CAAC;AAED,KAAK,SAAS,CAAC,CAAC,kBAAkB,CAChC,MAA0B,EAC1B,MAAsB,EACtB,SAAoB,EACpB,QAAgB,EAChB,SAA6B,EAC7B,SAAiB,EACjB,SAA6B;IAE7B,4EAA4E;IAC5E,iCAAiC;IACjC,MAAM,SAAS,GAAG,MAAa,CAAC;IAChC,IAAI,cAAkC,CAAC;IAEvC,IAAI,CAAC;QACH,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YACjC,IAAI,cAAc,KAAK,SAAS,EAAE,CAAC;gBACjC,cAAc,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;YACrC,CAAC;YACD,MAAM,KAAK,CAAC;QACd,CAAC;QAED,kDAAkD;QAClD,IAAI,OAAO,SAAS,CAAC,YAAY,KAAK,UAAU,EAAE,CAAC;YACjD,IAAI,CAAC;gBACH,MAAM,OAAO,GAAG,MAAM,SAAS,CAAC,YAAY,EAAE,CAAC;gBAC/C,MAAM,OAAO,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;gBAClC,MAAM,GAAG,GAAG,kBAAkB,CAAC,OAAO,CAAC,CAAC;gBACxC,GAAG,CAAC,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,SAAS,CAAC,CAAC;gBACpD,IAAI,cAAc,KAAK,SAAS,EAAE,CAAC;oBACjC,GAAG,CAAC,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,GAAG,SAAS,CAAC,CAAC;gBAC5D,CAAC;gBACD,GAAG,CAAC,aAAa,GAAG,IAAI,CAAC;gBAEzB,IAAI,MAAM,CAAC,kBAAkB,KAAK,CAAC,IAAI,SAAS,EAAE,CAAC;oBACjD,GAAG,CAAC,UAAU,GAAG,SAAS,CAAC;gBAC7B,CAAC;gBAED,MAAM,YAAY,GAAG,EAAE,SAAS,EAAE,QAAQ,EAAE,WAAW,EAAE,WAAW,EAAE,CAAC;gBACvE,MAAM,MAAM,GAAG,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,YAAY,CAAC,CAAC;gBACzD,SAAS,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;gBAC1B,SAAS,CAAC,WAAW,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;gBACzC,SAAS,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC;gBAC9B,OAAO;YACT,CAAC;YAAC,MAAM,CAAC;gBACP,kCAAkC;YACpC,CAAC;QACH,CAAC;QAED,qDAAqD;QACrD,MAAM,OAAO,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;QAClC,MAAM,GAAG,GAAwB;YAC/B,KAAK,EAAE,SAAS,IAAI,SAAS;YAC7B,QAAQ,EAAE,WAAW;YACrB,WAAW,EAAE,CAAC;YACd,YAAY,EAAE,CAAC;YACf,WAAW,EAAE,CAAC;YACd,aAAa,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,SAAS,CAAC;YAC9C,aAAa,EAAE,IAAI;YACnB,MAAM,EAAE,SAAS;SAClB,CAAC;QAEF,IAAI,cAAc,KAAK,SAAS,EAAE,CAAC;YACjC,GAAG,CAAC,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,GAAG,SAAS,CAAC,CAAC;QAC5D,CAAC;QAED,IAAI,MAAM,CAAC,kBAAkB,KAAK,CAAC,IAAI,SAAS,EAAE,CAAC;YACjD,GAAG,CAAC,UAAU,GAAG,SAAS,CAAC;QAC7B,CAAC;QAED,MAAM,YAAY,GAAG,EAAE,SAAS,EAAE,QAAQ,EAAE,WAAW,EAAE,WAAW,EAAE,CAAC;QACvE,MAAM,MAAM,GAAG,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,YAAY,CAAC,CAAC;QACzD,SAAS,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAC1B,SAAS,CAAC,WAAW,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;QACzC,SAAS,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC;IAChC,CAAC;IAAC,OAAO,KAAU,EAAE,CAAC;QACpB,MAAM,OAAO,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;QAClC,MAAM,GAAG,GAAwB;YAC/B,KAAK,EAAE,SAAS,IAAI,SAAS;YAC7B,QAAQ,EAAE,WAAW;YACrB,WAAW,EAAE,CAAC;YACd,YAAY,EAAE,CAAC;YACf,WAAW,EAAE,CAAC;YACd,aAAa,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,SAAS,CAAC;YAC9C,aAAa,EAAE,IAAI;YACnB,MAAM,EAAE,OAAO;YACf,KAAK,EAAE,KAAK,EAAE,OAAO,IAAI,MAAM,CAAC,KAAK,CAAC;SACvC,CAAC;QAEF,IAAI,cAAc,KAAK,SAAS,EAAE,CAAC;YACjC,GAAG,CAAC,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,GAAG,SAAS,CAAC,CAAC;QAC5D,CAAC;QAED,IAAI,MAAM,CAAC,kBAAkB,KAAK,CAAC,IAAI,SAAS,EAAE,CAAC;YACjD,GAAG,CAAC,UAAU,GAAG,SAAS,CAAC;QAC7B,CAAC;QAED,MAAM,YAAY,GAAG,EAAE,SAAS,EAAE,QAAQ,EAAE,WAAW,EAAE,WAAW,EAAE,CAAC;QACvE,MAAM,MAAM,GAAG,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,YAAY,CAAC,CAAC;QACzD,SAAS,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAC1B,SAAS,CAAC,WAAW,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QAElC,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,UAAU,gBAAgB,CAAI,MAAS,EAAE,OAAwB;IACrE,MAAM,MAAM,GAAG,aAAa,CAAC,OAAO,CAAC,CAAC;IACtC,MAAM,SAAS,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC;IAE1C,OAAO,IAAI,KAAK,CAAC,MAAa,EAAE;QAC9B,GAAG,CAAC,MAAM,EAAE,IAAI,EAAE,QAAQ;YACxB,IAAI,IAAI,KAAK,UAAU,EAAE,CAAC;gBACxB,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC;gBACrD,OAAO,mBAAmB,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC;YAC1D,CAAC;YACD,OAAO,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC;QAC7C,CAAC;KACF,CAAM,CAAC;AACV,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAC7C,YAAY,EAAE,uBAAuB,EAAE,MAAM,WAAW,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@countly/ai-sdk-anthropic",
|
|
3
|
+
"version": "0.0.3",
|
|
4
|
+
"description": "Countly AI observability adapter for Anthropic 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
|
+
"peerDependencies": {
|
|
19
|
+
"@anthropic-ai/sdk": ">=0.30.0"
|
|
20
|
+
},
|
|
21
|
+
"peerDependenciesMeta": {
|
|
22
|
+
"@anthropic-ai/sdk": {
|
|
23
|
+
"optional": false
|
|
24
|
+
}
|
|
25
|
+
},
|
|
26
|
+
"dependencies": {
|
|
27
|
+
"@countly/ai-sdk-core": "0.0.3"
|
|
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
|
+
}
|