@posthog/ai 3.3.2 → 4.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +8 -0
- package/lib/anthropic/index.cjs.js +312 -0
- package/lib/anthropic/index.cjs.js.map +1 -0
- package/lib/anthropic/index.d.ts +45 -0
- package/lib/anthropic/index.esm.js +301 -0
- package/lib/anthropic/index.esm.js.map +1 -0
- package/lib/index.cjs.js +22 -3
- package/lib/index.cjs.js.map +1 -1
- package/lib/index.d.ts +2 -2
- package/lib/index.esm.js +22 -3
- package/lib/index.esm.js.map +1 -1
- package/lib/langchain/index.cjs.js +1004 -0
- package/lib/langchain/index.cjs.js.map +1 -0
- package/lib/langchain/index.d.ts +68 -0
- package/lib/langchain/index.esm.js +980 -0
- package/lib/langchain/index.esm.js.map +1 -0
- package/lib/openai/index.cjs.js +305 -0
- package/lib/openai/index.cjs.js.map +1 -0
- package/lib/openai/index.d.ts +49 -0
- package/lib/openai/index.esm.js +293 -0
- package/lib/openai/index.esm.js.map +1 -0
- package/lib/posthog-ai/src/anthropic/index.d.ts +1 -0
- package/lib/posthog-ai/src/langchain/index.d.ts +1 -0
- package/lib/posthog-ai/src/openai/index.d.ts +3 -2
- package/lib/posthog-ai/src/vercel/index.d.ts +1 -0
- package/lib/vercel/index.cjs.js +427 -0
- package/lib/vercel/index.cjs.js.map +1 -0
- package/lib/vercel/index.d.ts +21 -0
- package/lib/vercel/index.esm.js +423 -0
- package/lib/vercel/index.esm.js.map +1 -0
- package/package.json +28 -1
- package/src/anthropic/index.ts +2 -0
- package/src/langchain/index.ts +1 -0
- package/src/openai/index.ts +4 -2
- package/src/utils.ts +24 -3
- package/src/vercel/index.ts +1 -0
- package/tsconfig.json +1 -0
package/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,11 @@
|
|
|
1
|
+
# 4.0.1
|
|
2
|
+
|
|
3
|
+
- add new util to sanitize inputs, outputs and errors
|
|
4
|
+
|
|
5
|
+
# 4.0.0
|
|
6
|
+
|
|
7
|
+
- feat: separate out packages as separate exports so you can import { OpenAI } from @posthog/ai/openai and reduce import size
|
|
8
|
+
|
|
1
9
|
# 3.3.2 - 2025-03-25
|
|
2
10
|
|
|
3
11
|
- fix: langchain name mapping
|
|
@@ -0,0 +1,312 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, '__esModule', { value: true });
|
|
4
|
+
|
|
5
|
+
var AnthropicOriginal = require('@anthropic-ai/sdk');
|
|
6
|
+
var uuid = require('uuid');
|
|
7
|
+
var buffer = require('buffer');
|
|
8
|
+
|
|
9
|
+
function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
|
|
10
|
+
|
|
11
|
+
var AnthropicOriginal__default = /*#__PURE__*/_interopDefaultLegacy(AnthropicOriginal);
|
|
12
|
+
|
|
13
|
+
const getModelParams = params => {
|
|
14
|
+
if (!params) {
|
|
15
|
+
return {};
|
|
16
|
+
}
|
|
17
|
+
const modelParams = {};
|
|
18
|
+
const paramKeys = ['temperature', 'max_tokens', 'max_completion_tokens', 'top_p', 'frequency_penalty', 'presence_penalty', 'n', 'stop', 'stream', 'streaming'];
|
|
19
|
+
for (const key of paramKeys) {
|
|
20
|
+
if (key in params && params[key] !== undefined) {
|
|
21
|
+
modelParams[key] = params[key];
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
return modelParams;
|
|
25
|
+
};
|
|
26
|
+
const formatResponseAnthropic = response => {
|
|
27
|
+
// Example approach if "response.content" holds array of text segments, etc.
|
|
28
|
+
const output = [];
|
|
29
|
+
for (const choice of response.content ?? []) {
|
|
30
|
+
if (choice?.text) {
|
|
31
|
+
output.push({
|
|
32
|
+
role: 'assistant',
|
|
33
|
+
content: choice.text
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
return output;
|
|
38
|
+
};
|
|
39
|
+
const mergeSystemPrompt = (params, provider) => {
|
|
40
|
+
if (provider == 'anthropic') {
|
|
41
|
+
const messages = params.messages || [];
|
|
42
|
+
if (!params.system) {
|
|
43
|
+
return messages;
|
|
44
|
+
}
|
|
45
|
+
const systemMessage = params.system;
|
|
46
|
+
return [{
|
|
47
|
+
role: 'system',
|
|
48
|
+
content: systemMessage
|
|
49
|
+
}, ...messages];
|
|
50
|
+
}
|
|
51
|
+
return params.messages;
|
|
52
|
+
};
|
|
53
|
+
const withPrivacyMode = (client, privacyMode, input) => {
|
|
54
|
+
return client.privacy_mode || privacyMode ? null : input;
|
|
55
|
+
};
|
|
56
|
+
function sanitizeValues(obj) {
|
|
57
|
+
if (obj === undefined || obj === null) {
|
|
58
|
+
return obj;
|
|
59
|
+
}
|
|
60
|
+
const jsonSafe = JSON.parse(JSON.stringify(obj));
|
|
61
|
+
if (typeof jsonSafe === 'string') {
|
|
62
|
+
return buffer.Buffer.from(jsonSafe, 'utf8').toString('utf8');
|
|
63
|
+
} else if (Array.isArray(jsonSafe)) {
|
|
64
|
+
return jsonSafe.map(sanitizeValues);
|
|
65
|
+
} else if (jsonSafe && typeof jsonSafe === 'object') {
|
|
66
|
+
return Object.fromEntries(Object.entries(jsonSafe).map(([k, v]) => [k, sanitizeValues(v)]));
|
|
67
|
+
}
|
|
68
|
+
return jsonSafe;
|
|
69
|
+
}
|
|
70
|
+
const sendEventToPosthog = ({
|
|
71
|
+
client,
|
|
72
|
+
distinctId,
|
|
73
|
+
traceId,
|
|
74
|
+
model,
|
|
75
|
+
provider,
|
|
76
|
+
input,
|
|
77
|
+
output,
|
|
78
|
+
latency,
|
|
79
|
+
baseURL,
|
|
80
|
+
params,
|
|
81
|
+
httpStatus = 200,
|
|
82
|
+
usage = {},
|
|
83
|
+
isError = false,
|
|
84
|
+
error,
|
|
85
|
+
tools
|
|
86
|
+
}) => {
|
|
87
|
+
if (client.capture) {
|
|
88
|
+
// sanitize input and output for UTF-8 validity
|
|
89
|
+
const safeInput = sanitizeValues(input);
|
|
90
|
+
const safeOutput = sanitizeValues(output);
|
|
91
|
+
const safeError = sanitizeValues(error);
|
|
92
|
+
let errorData = {};
|
|
93
|
+
if (isError) {
|
|
94
|
+
errorData = {
|
|
95
|
+
$ai_is_error: true,
|
|
96
|
+
$ai_error: safeError
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
let costOverrideData = {};
|
|
100
|
+
if (params.posthogCostOverride) {
|
|
101
|
+
const inputCostUSD = (params.posthogCostOverride.inputCost ?? 0) * (usage.inputTokens ?? 0);
|
|
102
|
+
const outputCostUSD = (params.posthogCostOverride.outputCost ?? 0) * (usage.outputTokens ?? 0);
|
|
103
|
+
costOverrideData = {
|
|
104
|
+
$ai_input_cost_usd: inputCostUSD,
|
|
105
|
+
$ai_output_cost_usd: outputCostUSD,
|
|
106
|
+
$ai_total_cost_usd: inputCostUSD + outputCostUSD
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
const additionalTokenValues = {
|
|
110
|
+
...(usage.reasoningTokens ? {
|
|
111
|
+
$ai_reasoning_tokens: usage.reasoningTokens
|
|
112
|
+
} : {}),
|
|
113
|
+
...(usage.cacheReadInputTokens ? {
|
|
114
|
+
$ai_cache_read_input_tokens: usage.cacheReadInputTokens
|
|
115
|
+
} : {}),
|
|
116
|
+
...(usage.cacheCreationInputTokens ? {
|
|
117
|
+
$ai_cache_creation_input_tokens: usage.cacheCreationInputTokens
|
|
118
|
+
} : {})
|
|
119
|
+
};
|
|
120
|
+
client.capture({
|
|
121
|
+
distinctId: distinctId ?? traceId,
|
|
122
|
+
event: '$ai_generation',
|
|
123
|
+
properties: {
|
|
124
|
+
$ai_provider: params.posthogProviderOverride ?? provider,
|
|
125
|
+
$ai_model: params.posthogModelOverride ?? model,
|
|
126
|
+
$ai_model_parameters: getModelParams(params),
|
|
127
|
+
$ai_input: withPrivacyMode(client, params.posthogPrivacyMode ?? false, safeInput),
|
|
128
|
+
$ai_output_choices: withPrivacyMode(client, params.posthogPrivacyMode ?? false, safeOutput),
|
|
129
|
+
$ai_http_status: httpStatus,
|
|
130
|
+
$ai_input_tokens: usage.inputTokens ?? 0,
|
|
131
|
+
$ai_output_tokens: usage.outputTokens ?? 0,
|
|
132
|
+
...additionalTokenValues,
|
|
133
|
+
$ai_latency: latency,
|
|
134
|
+
$ai_trace_id: traceId,
|
|
135
|
+
$ai_base_url: baseURL,
|
|
136
|
+
...params.posthogProperties,
|
|
137
|
+
...(distinctId ? {} : {
|
|
138
|
+
$process_person_profile: false
|
|
139
|
+
}),
|
|
140
|
+
...(tools ? {
|
|
141
|
+
$ai_tools: tools
|
|
142
|
+
} : {}),
|
|
143
|
+
...errorData,
|
|
144
|
+
...costOverrideData
|
|
145
|
+
},
|
|
146
|
+
groups: params.posthogGroups
|
|
147
|
+
});
|
|
148
|
+
}
|
|
149
|
+
};
|
|
150
|
+
|
|
151
|
+
class PostHogAnthropic extends AnthropicOriginal__default["default"] {
|
|
152
|
+
constructor(config) {
|
|
153
|
+
const {
|
|
154
|
+
posthog,
|
|
155
|
+
...anthropicConfig
|
|
156
|
+
} = config;
|
|
157
|
+
super(anthropicConfig);
|
|
158
|
+
this.phClient = posthog;
|
|
159
|
+
this.messages = new WrappedMessages(this, this.phClient);
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
class WrappedMessages extends AnthropicOriginal__default["default"].Messages {
|
|
163
|
+
constructor(parentClient, phClient) {
|
|
164
|
+
super(parentClient);
|
|
165
|
+
this.phClient = phClient;
|
|
166
|
+
}
|
|
167
|
+
create(body, options) {
|
|
168
|
+
const {
|
|
169
|
+
posthogDistinctId,
|
|
170
|
+
posthogTraceId,
|
|
171
|
+
posthogProperties,
|
|
172
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
173
|
+
posthogPrivacyMode = false,
|
|
174
|
+
posthogGroups,
|
|
175
|
+
...anthropicParams
|
|
176
|
+
} = body;
|
|
177
|
+
const traceId = posthogTraceId ?? uuid.v4();
|
|
178
|
+
const startTime = Date.now();
|
|
179
|
+
const parentPromise = super.create(anthropicParams, options);
|
|
180
|
+
if (anthropicParams.stream) {
|
|
181
|
+
return parentPromise.then(value => {
|
|
182
|
+
let accumulatedContent = '';
|
|
183
|
+
const usage = {
|
|
184
|
+
inputTokens: 0,
|
|
185
|
+
outputTokens: 0,
|
|
186
|
+
cacheCreationInputTokens: 0,
|
|
187
|
+
cacheReadInputTokens: 0
|
|
188
|
+
};
|
|
189
|
+
if ('tee' in value) {
|
|
190
|
+
const [stream1, stream2] = value.tee();
|
|
191
|
+
(async () => {
|
|
192
|
+
try {
|
|
193
|
+
for await (const chunk of stream1) {
|
|
194
|
+
if ('delta' in chunk) {
|
|
195
|
+
if ('text' in chunk.delta) {
|
|
196
|
+
const delta = chunk?.delta?.text ?? '';
|
|
197
|
+
accumulatedContent += delta;
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
if (chunk.type == 'message_start') {
|
|
201
|
+
usage.inputTokens = chunk.message.usage.input_tokens ?? 0;
|
|
202
|
+
usage.cacheCreationInputTokens = chunk.message.usage.cache_creation_input_tokens ?? 0;
|
|
203
|
+
usage.cacheReadInputTokens = chunk.message.usage.cache_read_input_tokens ?? 0;
|
|
204
|
+
}
|
|
205
|
+
if ('usage' in chunk) {
|
|
206
|
+
usage.outputTokens = chunk.usage.output_tokens ?? 0;
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
const latency = (Date.now() - startTime) / 1000;
|
|
210
|
+
sendEventToPosthog({
|
|
211
|
+
client: this.phClient,
|
|
212
|
+
distinctId: posthogDistinctId ?? traceId,
|
|
213
|
+
traceId,
|
|
214
|
+
model: anthropicParams.model,
|
|
215
|
+
provider: 'anthropic',
|
|
216
|
+
input: mergeSystemPrompt(anthropicParams, 'anthropic'),
|
|
217
|
+
output: [{
|
|
218
|
+
content: accumulatedContent,
|
|
219
|
+
role: 'assistant'
|
|
220
|
+
}],
|
|
221
|
+
latency,
|
|
222
|
+
baseURL: this.baseURL ?? '',
|
|
223
|
+
params: body,
|
|
224
|
+
httpStatus: 200,
|
|
225
|
+
usage
|
|
226
|
+
});
|
|
227
|
+
} catch (error) {
|
|
228
|
+
// error handling
|
|
229
|
+
sendEventToPosthog({
|
|
230
|
+
client: this.phClient,
|
|
231
|
+
distinctId: posthogDistinctId ?? traceId,
|
|
232
|
+
traceId,
|
|
233
|
+
model: anthropicParams.model,
|
|
234
|
+
provider: 'anthropic',
|
|
235
|
+
input: mergeSystemPrompt(anthropicParams, 'anthropic'),
|
|
236
|
+
output: [],
|
|
237
|
+
latency: 0,
|
|
238
|
+
baseURL: this.baseURL ?? '',
|
|
239
|
+
params: body,
|
|
240
|
+
httpStatus: error?.status ? error.status : 500,
|
|
241
|
+
usage: {
|
|
242
|
+
inputTokens: 0,
|
|
243
|
+
outputTokens: 0
|
|
244
|
+
},
|
|
245
|
+
isError: true,
|
|
246
|
+
error: JSON.stringify(error)
|
|
247
|
+
});
|
|
248
|
+
}
|
|
249
|
+
})();
|
|
250
|
+
|
|
251
|
+
// Return the other stream to the user
|
|
252
|
+
return stream2;
|
|
253
|
+
}
|
|
254
|
+
return value;
|
|
255
|
+
});
|
|
256
|
+
} else {
|
|
257
|
+
const wrappedPromise = parentPromise.then(result => {
|
|
258
|
+
if ('content' in result) {
|
|
259
|
+
const latency = (Date.now() - startTime) / 1000;
|
|
260
|
+
sendEventToPosthog({
|
|
261
|
+
client: this.phClient,
|
|
262
|
+
distinctId: posthogDistinctId ?? traceId,
|
|
263
|
+
traceId,
|
|
264
|
+
model: anthropicParams.model,
|
|
265
|
+
provider: 'anthropic',
|
|
266
|
+
input: mergeSystemPrompt(anthropicParams, 'anthropic'),
|
|
267
|
+
output: formatResponseAnthropic(result),
|
|
268
|
+
latency,
|
|
269
|
+
baseURL: this.baseURL ?? '',
|
|
270
|
+
params: body,
|
|
271
|
+
httpStatus: 200,
|
|
272
|
+
usage: {
|
|
273
|
+
inputTokens: result.usage.input_tokens ?? 0,
|
|
274
|
+
outputTokens: result.usage.output_tokens ?? 0,
|
|
275
|
+
cacheCreationInputTokens: result.usage.cache_creation_input_tokens ?? 0,
|
|
276
|
+
cacheReadInputTokens: result.usage.cache_read_input_tokens ?? 0
|
|
277
|
+
}
|
|
278
|
+
});
|
|
279
|
+
}
|
|
280
|
+
return result;
|
|
281
|
+
}, error => {
|
|
282
|
+
sendEventToPosthog({
|
|
283
|
+
client: this.phClient,
|
|
284
|
+
distinctId: posthogDistinctId ?? traceId,
|
|
285
|
+
traceId,
|
|
286
|
+
model: anthropicParams.model,
|
|
287
|
+
provider: 'anthropic',
|
|
288
|
+
input: mergeSystemPrompt(anthropicParams, 'anthropic'),
|
|
289
|
+
output: [],
|
|
290
|
+
latency: 0,
|
|
291
|
+
baseURL: this.baseURL ?? '',
|
|
292
|
+
params: body,
|
|
293
|
+
httpStatus: error?.status ? error.status : 500,
|
|
294
|
+
usage: {
|
|
295
|
+
inputTokens: 0,
|
|
296
|
+
outputTokens: 0
|
|
297
|
+
},
|
|
298
|
+
isError: true,
|
|
299
|
+
error: JSON.stringify(error)
|
|
300
|
+
});
|
|
301
|
+
throw error;
|
|
302
|
+
});
|
|
303
|
+
return wrappedPromise;
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
exports.Anthropic = PostHogAnthropic;
|
|
309
|
+
exports.PostHogAnthropic = PostHogAnthropic;
|
|
310
|
+
exports.WrappedMessages = WrappedMessages;
|
|
311
|
+
exports["default"] = PostHogAnthropic;
|
|
312
|
+
//# sourceMappingURL=index.cjs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.cjs.js","sources":["../../src/utils.ts","../../src/anthropic/index.ts"],"sourcesContent":["import { PostHog } from 'posthog-node'\nimport { Buffer } from 'buffer'\nimport OpenAIOrignal from 'openai'\nimport AnthropicOriginal from '@anthropic-ai/sdk'\n\ntype ChatCompletionCreateParamsBase = OpenAIOrignal.Chat.Completions.ChatCompletionCreateParams\ntype MessageCreateParams = AnthropicOriginal.Messages.MessageCreateParams\n\nexport interface MonitoringParams {\n posthogDistinctId?: string\n posthogTraceId?: string\n posthogProperties?: Record<string, any>\n posthogPrivacyMode?: boolean\n posthogGroups?: Record<string, any>\n posthogModelOverride?: string\n posthogProviderOverride?: string\n posthogCostOverride?: CostOverride\n}\n\nexport interface CostOverride {\n inputCost: number\n outputCost: number\n}\n\nexport const getModelParams = (\n params: ((ChatCompletionCreateParamsBase | MessageCreateParams) & MonitoringParams) | null\n): Record<string, any> => {\n if (!params) {\n return {}\n }\n const modelParams: Record<string, any> = {}\n const paramKeys = [\n 'temperature',\n 'max_tokens',\n 'max_completion_tokens',\n 'top_p',\n 'frequency_penalty',\n 'presence_penalty',\n 'n',\n 'stop',\n 'stream',\n 'streaming',\n ] as const\n\n for (const key of paramKeys) {\n if (key in params && (params as any)[key] !== undefined) {\n modelParams[key] = (params as any)[key]\n }\n }\n return modelParams\n}\n\n/**\n * Helper to format responses (non-streaming) for consumption, mirroring Python's openai vs. anthropic approach.\n */\nexport const formatResponse = (response: any, provider: string): Array<{ role: string; content: string }> => {\n if (!response) {\n return []\n }\n if (provider === 'anthropic') {\n return formatResponseAnthropic(response)\n } else if (provider === 'openai') {\n return formatResponseOpenAI(response)\n }\n return []\n}\n\nexport const formatResponseAnthropic = (response: any): Array<{ role: string; content: string }> => {\n // Example approach if \"response.content\" holds array of text segments, etc.\n const output: Array<{ role: string; content: string }> = []\n for (const choice of response.content ?? []) {\n if (choice?.text) {\n output.push({\n role: 'assistant',\n content: choice.text,\n })\n }\n }\n return output\n}\n\nexport const formatResponseOpenAI = (response: any): Array<{ role: string; content: string }> => {\n const output: Array<{ role: string; content: string }> = []\n for (const choice of response.choices ?? []) {\n if (choice.message?.content) {\n output.push({\n role: choice.message.role,\n content: choice.message.content,\n })\n }\n }\n return output\n}\n\nexport const mergeSystemPrompt = (params: MessageCreateParams & MonitoringParams, provider: string): any => {\n if (provider == 'anthropic') {\n const messages = params.messages || []\n if (!(params as any).system) {\n return messages\n }\n const systemMessage = (params as any).system\n return [{ role: 'system', content: systemMessage }, ...messages]\n }\n return params.messages\n}\n\nexport const withPrivacyMode = (client: PostHog, privacyMode: boolean, input: any): any => {\n return (client as any).privacy_mode || privacyMode ? null : input\n}\n\nexport type SendEventToPosthogParams = {\n client: PostHog\n distinctId?: string\n traceId: string\n model: string\n provider: string\n input: any\n output: any\n latency: number\n baseURL: string\n httpStatus: number\n usage?: {\n inputTokens?: number\n outputTokens?: number\n reasoningTokens?: any\n cacheReadInputTokens?: any\n cacheCreationInputTokens?: any\n }\n params: (ChatCompletionCreateParamsBase | MessageCreateParams) & MonitoringParams\n isError?: boolean\n error?: string\n tools?: any\n}\n\nfunction sanitizeValues(obj: any): any {\n if (obj === undefined || obj === null) {\n return obj\n }\n const jsonSafe = JSON.parse(JSON.stringify(obj))\n if (typeof jsonSafe === 'string') {\n return Buffer.from(jsonSafe, 'utf8').toString('utf8')\n } else if (Array.isArray(jsonSafe)) {\n return jsonSafe.map(sanitizeValues)\n } else if (jsonSafe && typeof jsonSafe === 'object') {\n return Object.fromEntries(Object.entries(jsonSafe).map(([k, v]) => [k, sanitizeValues(v)]))\n }\n return jsonSafe\n}\n\nexport const sendEventToPosthog = ({\n client,\n distinctId,\n traceId,\n model,\n provider,\n input,\n output,\n latency,\n baseURL,\n params,\n httpStatus = 200,\n usage = {},\n isError = false,\n error,\n tools,\n}: SendEventToPosthogParams): void => {\n if (client.capture) {\n // sanitize input and output for UTF-8 validity\n const safeInput = sanitizeValues(input)\n const safeOutput = sanitizeValues(output)\n const safeError = sanitizeValues(error)\n\n let errorData = {}\n if (isError) {\n errorData = {\n $ai_is_error: true,\n $ai_error: safeError,\n }\n }\n let costOverrideData = {}\n if (params.posthogCostOverride) {\n const inputCostUSD = (params.posthogCostOverride.inputCost ?? 0) * (usage.inputTokens ?? 0)\n const outputCostUSD = (params.posthogCostOverride.outputCost ?? 0) * (usage.outputTokens ?? 0)\n costOverrideData = {\n $ai_input_cost_usd: inputCostUSD,\n $ai_output_cost_usd: outputCostUSD,\n $ai_total_cost_usd: inputCostUSD + outputCostUSD,\n }\n }\n\n const additionalTokenValues = {\n ...(usage.reasoningTokens ? { $ai_reasoning_tokens: usage.reasoningTokens } : {}),\n ...(usage.cacheReadInputTokens ? { $ai_cache_read_input_tokens: usage.cacheReadInputTokens } : {}),\n ...(usage.cacheCreationInputTokens ? { $ai_cache_creation_input_tokens: usage.cacheCreationInputTokens } : {}),\n }\n\n client.capture({\n distinctId: distinctId ?? traceId,\n event: '$ai_generation',\n properties: {\n $ai_provider: params.posthogProviderOverride ?? provider,\n $ai_model: params.posthogModelOverride ?? model,\n $ai_model_parameters: getModelParams(params),\n $ai_input: withPrivacyMode(client, params.posthogPrivacyMode ?? false, safeInput),\n $ai_output_choices: withPrivacyMode(client, params.posthogPrivacyMode ?? false, safeOutput),\n $ai_http_status: httpStatus,\n $ai_input_tokens: usage.inputTokens ?? 0,\n $ai_output_tokens: usage.outputTokens ?? 0,\n ...additionalTokenValues,\n $ai_latency: latency,\n $ai_trace_id: traceId,\n $ai_base_url: baseURL,\n ...params.posthogProperties,\n ...(distinctId ? {} : { $process_person_profile: false }),\n ...(tools ? { $ai_tools: tools } : {}),\n ...errorData,\n ...costOverrideData,\n },\n groups: params.posthogGroups,\n })\n }\n}\n","import AnthropicOriginal from '@anthropic-ai/sdk'\nimport { PostHog } from 'posthog-node'\nimport { v4 as uuidv4 } from 'uuid'\nimport { formatResponseAnthropic, mergeSystemPrompt, MonitoringParams, sendEventToPosthog } from '../utils'\n\ntype MessageCreateParamsNonStreaming = AnthropicOriginal.Messages.MessageCreateParamsNonStreaming\ntype MessageCreateParamsStreaming = AnthropicOriginal.Messages.MessageCreateParamsStreaming\ntype MessageCreateParams = AnthropicOriginal.Messages.MessageCreateParams\ntype Message = AnthropicOriginal.Messages.Message\ntype RawMessageStreamEvent = AnthropicOriginal.Messages.RawMessageStreamEvent\ntype MessageCreateParamsBase = AnthropicOriginal.Messages.MessageCreateParams\n\nimport type { APIPromise, RequestOptions } from '@anthropic-ai/sdk/core'\nimport type { Stream } from '@anthropic-ai/sdk/streaming'\n\ninterface MonitoringAnthropicConfig {\n apiKey: string\n posthog: PostHog\n baseURL?: string\n}\n\nexport class PostHogAnthropic extends AnthropicOriginal {\n private readonly phClient: PostHog\n public messages: WrappedMessages\n\n constructor(config: MonitoringAnthropicConfig) {\n const { posthog, ...anthropicConfig } = config\n super(anthropicConfig)\n this.phClient = posthog\n this.messages = new WrappedMessages(this, this.phClient)\n }\n}\n\nexport class WrappedMessages extends AnthropicOriginal.Messages {\n private readonly phClient: PostHog\n\n constructor(parentClient: PostHogAnthropic, phClient: PostHog) {\n super(parentClient)\n this.phClient = phClient\n }\n\n public create(body: MessageCreateParamsNonStreaming, options?: RequestOptions): APIPromise<Message>\n public create(\n body: MessageCreateParamsStreaming & MonitoringParams,\n options?: RequestOptions\n ): APIPromise<Stream<RawMessageStreamEvent>>\n public create(\n body: MessageCreateParamsBase & MonitoringParams,\n options?: RequestOptions\n ): APIPromise<Stream<RawMessageStreamEvent> | Message>\n public create(\n body: MessageCreateParams & MonitoringParams,\n options?: RequestOptions\n ): APIPromise<Message> | APIPromise<Stream<RawMessageStreamEvent>> {\n const {\n posthogDistinctId,\n posthogTraceId,\n posthogProperties,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n posthogPrivacyMode = false,\n posthogGroups,\n ...anthropicParams\n } = body\n\n const traceId = posthogTraceId ?? uuidv4()\n const startTime = Date.now()\n\n const parentPromise = super.create(anthropicParams, options)\n\n if (anthropicParams.stream) {\n return parentPromise.then((value) => {\n let accumulatedContent = ''\n const usage: {\n inputTokens: number\n outputTokens: number\n cacheCreationInputTokens?: number\n cacheReadInputTokens?: number\n } = {\n inputTokens: 0,\n outputTokens: 0,\n cacheCreationInputTokens: 0,\n cacheReadInputTokens: 0,\n }\n if ('tee' in value) {\n const [stream1, stream2] = value.tee()\n ;(async () => {\n try {\n for await (const chunk of stream1) {\n if ('delta' in chunk) {\n if ('text' in chunk.delta) {\n const delta = chunk?.delta?.text ?? ''\n accumulatedContent += delta\n }\n }\n if (chunk.type == 'message_start') {\n usage.inputTokens = chunk.message.usage.input_tokens ?? 0\n usage.cacheCreationInputTokens = chunk.message.usage.cache_creation_input_tokens ?? 0\n usage.cacheReadInputTokens = chunk.message.usage.cache_read_input_tokens ?? 0\n }\n if ('usage' in chunk) {\n usage.outputTokens = chunk.usage.output_tokens ?? 0\n }\n }\n const latency = (Date.now() - startTime) / 1000\n sendEventToPosthog({\n client: this.phClient,\n distinctId: posthogDistinctId ?? traceId,\n traceId,\n model: anthropicParams.model,\n provider: 'anthropic',\n input: mergeSystemPrompt(anthropicParams, 'anthropic'),\n output: [{ content: accumulatedContent, role: 'assistant' }],\n latency,\n baseURL: (this as any).baseURL ?? '',\n params: body,\n httpStatus: 200,\n usage,\n })\n } catch (error: any) {\n // error handling\n sendEventToPosthog({\n client: this.phClient,\n distinctId: posthogDistinctId ?? traceId,\n traceId,\n model: anthropicParams.model,\n provider: 'anthropic',\n input: mergeSystemPrompt(anthropicParams, 'anthropic'),\n output: [],\n latency: 0,\n baseURL: (this as any).baseURL ?? '',\n params: body,\n httpStatus: error?.status ? error.status : 500,\n usage: {\n inputTokens: 0,\n outputTokens: 0,\n },\n isError: true,\n error: JSON.stringify(error),\n })\n }\n })()\n\n // Return the other stream to the user\n return stream2\n }\n return value\n }) as APIPromise<Stream<RawMessageStreamEvent>>\n } else {\n const wrappedPromise = parentPromise.then(\n (result) => {\n if ('content' in result) {\n const latency = (Date.now() - startTime) / 1000\n sendEventToPosthog({\n client: this.phClient,\n distinctId: posthogDistinctId ?? traceId,\n traceId,\n model: anthropicParams.model,\n provider: 'anthropic',\n input: mergeSystemPrompt(anthropicParams, 'anthropic'),\n output: formatResponseAnthropic(result),\n latency,\n baseURL: (this as any).baseURL ?? '',\n params: body,\n httpStatus: 200,\n usage: {\n inputTokens: result.usage.input_tokens ?? 0,\n outputTokens: result.usage.output_tokens ?? 0,\n cacheCreationInputTokens: result.usage.cache_creation_input_tokens ?? 0,\n cacheReadInputTokens: result.usage.cache_read_input_tokens ?? 0,\n },\n })\n }\n return result\n },\n (error: any) => {\n sendEventToPosthog({\n client: this.phClient,\n distinctId: posthogDistinctId ?? traceId,\n traceId,\n model: anthropicParams.model,\n provider: 'anthropic',\n input: mergeSystemPrompt(anthropicParams, 'anthropic'),\n output: [],\n latency: 0,\n baseURL: (this as any).baseURL ?? '',\n params: body,\n httpStatus: error?.status ? error.status : 500,\n usage: {\n inputTokens: 0,\n outputTokens: 0,\n },\n isError: true,\n error: JSON.stringify(error),\n })\n throw error\n }\n ) as APIPromise<Message>\n\n return wrappedPromise\n }\n }\n}\n\nexport default PostHogAnthropic\n\nexport { PostHogAnthropic as Anthropic }\n"],"names":["getModelParams","params","modelParams","paramKeys","key","undefined","formatResponseAnthropic","response","output","choice","content","text","push","role","mergeSystemPrompt","provider","messages","system","systemMessage","withPrivacyMode","client","privacyMode","input","privacy_mode","sanitizeValues","obj","jsonSafe","JSON","parse","stringify","Buffer","from","toString","Array","isArray","map","Object","fromEntries","entries","k","v","sendEventToPosthog","distinctId","traceId","model","latency","baseURL","httpStatus","usage","isError","error","tools","capture","safeInput","safeOutput","safeError","errorData","$ai_is_error","$ai_error","costOverrideData","posthogCostOverride","inputCostUSD","inputCost","inputTokens","outputCostUSD","outputCost","outputTokens","$ai_input_cost_usd","$ai_output_cost_usd","$ai_total_cost_usd","additionalTokenValues","reasoningTokens","$ai_reasoning_tokens","cacheReadInputTokens","$ai_cache_read_input_tokens","cacheCreationInputTokens","$ai_cache_creation_input_tokens","event","properties","$ai_provider","posthogProviderOverride","$ai_model","posthogModelOverride","$ai_model_parameters","$ai_input","posthogPrivacyMode","$ai_output_choices","$ai_http_status","$ai_input_tokens","$ai_output_tokens","$ai_latency","$ai_trace_id","$ai_base_url","posthogProperties","$process_person_profile","$ai_tools","groups","posthogGroups","PostHogAnthropic","AnthropicOriginal","constructor","config","posthog","anthropicConfig","phClient","WrappedMessages","Messages","parentClient","create","body","options","posthogDistinctId","posthogTraceId","anthropicParams","uuidv4","startTime","Date","now","parentPromise","stream","then","value","accumulatedContent","stream1","stream2","tee","chunk","delta","type","message","input_tokens","cache_creation_input_tokens","cache_read_input_tokens","output_tokens","status","wrappedPromise","result"],"mappings":"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"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import AnthropicOriginal from '@anthropic-ai/sdk';
|
|
2
|
+
import { PostHog } from 'posthog-node';
|
|
3
|
+
import { RequestOptions, APIPromise } from '@anthropic-ai/sdk/core';
|
|
4
|
+
import { Stream } from '@anthropic-ai/sdk/streaming';
|
|
5
|
+
|
|
6
|
+
interface MonitoringParams {
|
|
7
|
+
posthogDistinctId?: string;
|
|
8
|
+
posthogTraceId?: string;
|
|
9
|
+
posthogProperties?: Record<string, any>;
|
|
10
|
+
posthogPrivacyMode?: boolean;
|
|
11
|
+
posthogGroups?: Record<string, any>;
|
|
12
|
+
posthogModelOverride?: string;
|
|
13
|
+
posthogProviderOverride?: string;
|
|
14
|
+
posthogCostOverride?: CostOverride;
|
|
15
|
+
}
|
|
16
|
+
interface CostOverride {
|
|
17
|
+
inputCost: number;
|
|
18
|
+
outputCost: number;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
type MessageCreateParamsNonStreaming = AnthropicOriginal.Messages.MessageCreateParamsNonStreaming;
|
|
22
|
+
type MessageCreateParamsStreaming = AnthropicOriginal.Messages.MessageCreateParamsStreaming;
|
|
23
|
+
type Message = AnthropicOriginal.Messages.Message;
|
|
24
|
+
type RawMessageStreamEvent = AnthropicOriginal.Messages.RawMessageStreamEvent;
|
|
25
|
+
type MessageCreateParamsBase = AnthropicOriginal.Messages.MessageCreateParams;
|
|
26
|
+
|
|
27
|
+
interface MonitoringAnthropicConfig {
|
|
28
|
+
apiKey: string;
|
|
29
|
+
posthog: PostHog;
|
|
30
|
+
baseURL?: string;
|
|
31
|
+
}
|
|
32
|
+
declare class PostHogAnthropic extends AnthropicOriginal {
|
|
33
|
+
private readonly phClient;
|
|
34
|
+
messages: WrappedMessages;
|
|
35
|
+
constructor(config: MonitoringAnthropicConfig);
|
|
36
|
+
}
|
|
37
|
+
declare class WrappedMessages extends AnthropicOriginal.Messages {
|
|
38
|
+
private readonly phClient;
|
|
39
|
+
constructor(parentClient: PostHogAnthropic, phClient: PostHog);
|
|
40
|
+
create(body: MessageCreateParamsNonStreaming, options?: RequestOptions): APIPromise<Message>;
|
|
41
|
+
create(body: MessageCreateParamsStreaming & MonitoringParams, options?: RequestOptions): APIPromise<Stream<RawMessageStreamEvent>>;
|
|
42
|
+
create(body: MessageCreateParamsBase & MonitoringParams, options?: RequestOptions): APIPromise<Stream<RawMessageStreamEvent> | Message>;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
export { PostHogAnthropic as Anthropic, PostHogAnthropic, WrappedMessages, PostHogAnthropic as default };
|