@posthog/ai 3.3.1 → 4.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +8 -0
- package/lib/anthropic/index.cjs.js +293 -0
- package/lib/anthropic/index.cjs.js.map +1 -0
- package/lib/anthropic/index.d.ts +45 -0
- package/lib/anthropic/index.esm.js +282 -0
- package/lib/anthropic/index.esm.js.map +1 -0
- package/lib/index.cjs.js +36 -8
- package/lib/index.cjs.js.map +1 -1
- package/lib/index.d.ts +2 -2
- package/lib/index.esm.js +36 -8
- package/lib/index.esm.js.map +1 -1
- package/lib/langchain/index.cjs.js +1003 -0
- package/lib/langchain/index.cjs.js.map +1 -0
- package/lib/langchain/index.d.ts +68 -0
- package/lib/langchain/index.esm.js +979 -0
- package/lib/langchain/index.esm.js.map +1 -0
- package/lib/openai/index.cjs.js +286 -0
- package/lib/openai/index.cjs.js.map +1 -0
- package/lib/openai/index.d.ts +49 -0
- package/lib/openai/index.esm.js +274 -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 +408 -0
- package/lib/vercel/index.cjs.js.map +1 -0
- package/lib/vercel/index.d.ts +21 -0
- package/lib/vercel/index.esm.js +404 -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/callbacks.ts +39 -7
- package/src/langchain/index.ts +1 -0
- package/src/openai/index.ts +4 -2
- package/src/utils.ts +1 -1
- package/src/vercel/index.ts +1 -0
- package/src/vercel/middleware.ts +4 -4
- package/tsconfig.json +1 -0
|
@@ -0,0 +1,408 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, '__esModule', { value: true });
|
|
4
|
+
|
|
5
|
+
var ai = require('ai');
|
|
6
|
+
var uuid = require('uuid');
|
|
7
|
+
|
|
8
|
+
const getModelParams = params => {
|
|
9
|
+
if (!params) {
|
|
10
|
+
return {};
|
|
11
|
+
}
|
|
12
|
+
const modelParams = {};
|
|
13
|
+
const paramKeys = ['temperature', 'max_tokens', 'max_completion_tokens', 'top_p', 'frequency_penalty', 'presence_penalty', 'n', 'stop', 'stream', 'streaming'];
|
|
14
|
+
for (const key of paramKeys) {
|
|
15
|
+
if (key in params && params[key] !== undefined) {
|
|
16
|
+
modelParams[key] = params[key];
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
return modelParams;
|
|
20
|
+
};
|
|
21
|
+
const withPrivacyMode = (client, privacyMode, input) => {
|
|
22
|
+
return client.privacy_mode || privacyMode ? null : input;
|
|
23
|
+
};
|
|
24
|
+
const sendEventToPosthog = ({
|
|
25
|
+
client,
|
|
26
|
+
distinctId,
|
|
27
|
+
traceId,
|
|
28
|
+
model,
|
|
29
|
+
provider,
|
|
30
|
+
input,
|
|
31
|
+
output,
|
|
32
|
+
latency,
|
|
33
|
+
baseURL,
|
|
34
|
+
params,
|
|
35
|
+
httpStatus = 200,
|
|
36
|
+
usage = {},
|
|
37
|
+
isError = false,
|
|
38
|
+
error,
|
|
39
|
+
tools
|
|
40
|
+
}) => {
|
|
41
|
+
if (client.capture) {
|
|
42
|
+
let errorData = {};
|
|
43
|
+
if (isError) {
|
|
44
|
+
errorData = {
|
|
45
|
+
$ai_is_error: true,
|
|
46
|
+
$ai_error: error
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
let costOverrideData = {};
|
|
50
|
+
if (params.posthogCostOverride) {
|
|
51
|
+
const inputCostUSD = (params.posthogCostOverride.inputCost ?? 0) * (usage.inputTokens ?? 0);
|
|
52
|
+
const outputCostUSD = (params.posthogCostOverride.outputCost ?? 0) * (usage.outputTokens ?? 0);
|
|
53
|
+
costOverrideData = {
|
|
54
|
+
$ai_input_cost_usd: inputCostUSD,
|
|
55
|
+
$ai_output_cost_usd: outputCostUSD,
|
|
56
|
+
$ai_total_cost_usd: inputCostUSD + outputCostUSD
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
const additionalTokenValues = {
|
|
60
|
+
...(usage.reasoningTokens ? {
|
|
61
|
+
$ai_reasoning_tokens: usage.reasoningTokens
|
|
62
|
+
} : {}),
|
|
63
|
+
...(usage.cacheReadInputTokens ? {
|
|
64
|
+
$ai_cache_read_input_tokens: usage.cacheReadInputTokens
|
|
65
|
+
} : {}),
|
|
66
|
+
...(usage.cacheCreationInputTokens ? {
|
|
67
|
+
$ai_cache_creation_input_tokens: usage.cacheCreationInputTokens
|
|
68
|
+
} : {})
|
|
69
|
+
};
|
|
70
|
+
client.capture({
|
|
71
|
+
distinctId: distinctId ?? traceId,
|
|
72
|
+
event: '$ai_generation',
|
|
73
|
+
properties: {
|
|
74
|
+
$ai_provider: params.posthogProviderOverride ?? provider,
|
|
75
|
+
$ai_model: params.posthogModelOverride ?? model,
|
|
76
|
+
$ai_model_parameters: getModelParams(params),
|
|
77
|
+
$ai_input: withPrivacyMode(client, params.posthogPrivacyMode ?? false, input),
|
|
78
|
+
$ai_output_choices: withPrivacyMode(client, params.posthogPrivacyMode ?? false, output),
|
|
79
|
+
$ai_http_status: httpStatus,
|
|
80
|
+
$ai_input_tokens: usage.inputTokens ?? 0,
|
|
81
|
+
$ai_output_tokens: usage.outputTokens ?? 0,
|
|
82
|
+
...additionalTokenValues,
|
|
83
|
+
$ai_latency: latency,
|
|
84
|
+
$ai_trace_id: traceId,
|
|
85
|
+
$ai_base_url: baseURL,
|
|
86
|
+
...params.posthogProperties,
|
|
87
|
+
...(distinctId ? {} : {
|
|
88
|
+
$process_person_profile: false
|
|
89
|
+
}),
|
|
90
|
+
...(tools ? {
|
|
91
|
+
$ai_tools: tools
|
|
92
|
+
} : {}),
|
|
93
|
+
...errorData,
|
|
94
|
+
...costOverrideData
|
|
95
|
+
},
|
|
96
|
+
groups: params.posthogGroups
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
};
|
|
100
|
+
|
|
101
|
+
const mapVercelParams = params => {
|
|
102
|
+
return {
|
|
103
|
+
temperature: params.temperature,
|
|
104
|
+
max_tokens: params.maxTokens,
|
|
105
|
+
top_p: params.topP,
|
|
106
|
+
frequency_penalty: params.frequencyPenalty,
|
|
107
|
+
presence_penalty: params.presencePenalty,
|
|
108
|
+
stop: params.stopSequences,
|
|
109
|
+
stream: params.stream
|
|
110
|
+
};
|
|
111
|
+
};
|
|
112
|
+
const mapVercelPrompt = prompt => {
|
|
113
|
+
return prompt.map(p => {
|
|
114
|
+
let content = {};
|
|
115
|
+
if (Array.isArray(p.content)) {
|
|
116
|
+
content = p.content.map(c => {
|
|
117
|
+
if (c.type === 'text') {
|
|
118
|
+
return {
|
|
119
|
+
type: 'text',
|
|
120
|
+
content: c.text
|
|
121
|
+
};
|
|
122
|
+
} else if (c.type === 'image') {
|
|
123
|
+
return {
|
|
124
|
+
type: 'image',
|
|
125
|
+
content: {
|
|
126
|
+
// if image is a url use it, or use "none supported"
|
|
127
|
+
image: c.image instanceof URL ? c.image.toString() : 'raw images not supported',
|
|
128
|
+
mimeType: c.mimeType
|
|
129
|
+
}
|
|
130
|
+
};
|
|
131
|
+
} else if (c.type === 'file') {
|
|
132
|
+
return {
|
|
133
|
+
type: 'file',
|
|
134
|
+
content: {
|
|
135
|
+
file: c.data instanceof URL ? c.data.toString() : 'raw files not supported',
|
|
136
|
+
mimeType: c.mimeType
|
|
137
|
+
}
|
|
138
|
+
};
|
|
139
|
+
} else if (c.type === 'tool-call') {
|
|
140
|
+
return {
|
|
141
|
+
type: 'tool-call',
|
|
142
|
+
content: {
|
|
143
|
+
toolCallId: c.toolCallId,
|
|
144
|
+
toolName: c.toolName,
|
|
145
|
+
args: c.args
|
|
146
|
+
}
|
|
147
|
+
};
|
|
148
|
+
} else if (c.type === 'tool-result') {
|
|
149
|
+
return {
|
|
150
|
+
type: 'tool-result',
|
|
151
|
+
content: {
|
|
152
|
+
toolCallId: c.toolCallId,
|
|
153
|
+
toolName: c.toolName,
|
|
154
|
+
result: c.result,
|
|
155
|
+
isError: c.isError
|
|
156
|
+
}
|
|
157
|
+
};
|
|
158
|
+
}
|
|
159
|
+
return {
|
|
160
|
+
content: ''
|
|
161
|
+
};
|
|
162
|
+
});
|
|
163
|
+
} else {
|
|
164
|
+
content = {
|
|
165
|
+
type: 'text',
|
|
166
|
+
text: p.content
|
|
167
|
+
};
|
|
168
|
+
}
|
|
169
|
+
return {
|
|
170
|
+
role: p.role,
|
|
171
|
+
content
|
|
172
|
+
};
|
|
173
|
+
});
|
|
174
|
+
};
|
|
175
|
+
const mapVercelOutput = result => {
|
|
176
|
+
const output = {
|
|
177
|
+
...(result.text ? {
|
|
178
|
+
text: result.text
|
|
179
|
+
} : {}),
|
|
180
|
+
...(result.object ? {
|
|
181
|
+
object: result.object
|
|
182
|
+
} : {}),
|
|
183
|
+
...(result.reasoning ? {
|
|
184
|
+
reasoning: result.reasoning
|
|
185
|
+
} : {}),
|
|
186
|
+
...(result.response ? {
|
|
187
|
+
response: result.response
|
|
188
|
+
} : {}),
|
|
189
|
+
...(result.finishReason ? {
|
|
190
|
+
finishReason: result.finishReason
|
|
191
|
+
} : {}),
|
|
192
|
+
...(result.usage ? {
|
|
193
|
+
usage: result.usage
|
|
194
|
+
} : {}),
|
|
195
|
+
...(result.warnings ? {
|
|
196
|
+
warnings: result.warnings
|
|
197
|
+
} : {}),
|
|
198
|
+
...(result.providerMetadata ? {
|
|
199
|
+
toolCalls: result.providerMetadata
|
|
200
|
+
} : {})
|
|
201
|
+
};
|
|
202
|
+
// if text and no object or reasoning, return text
|
|
203
|
+
if (output.text && !output.object && !output.reasoning) {
|
|
204
|
+
return [{
|
|
205
|
+
content: output.text,
|
|
206
|
+
role: 'assistant'
|
|
207
|
+
}];
|
|
208
|
+
}
|
|
209
|
+
return [{
|
|
210
|
+
content: JSON.stringify(output),
|
|
211
|
+
role: 'assistant'
|
|
212
|
+
}];
|
|
213
|
+
};
|
|
214
|
+
const extractProvider = model => {
|
|
215
|
+
// vercel provider is in the format of provider.endpoint
|
|
216
|
+
const provider = model.provider.toLowerCase();
|
|
217
|
+
const providerName = provider.split('.')[0];
|
|
218
|
+
return providerName;
|
|
219
|
+
};
|
|
220
|
+
const createInstrumentationMiddleware = (phClient, model, options) => {
|
|
221
|
+
const middleware = {
|
|
222
|
+
wrapGenerate: async ({
|
|
223
|
+
doGenerate,
|
|
224
|
+
params
|
|
225
|
+
}) => {
|
|
226
|
+
const startTime = Date.now();
|
|
227
|
+
const mergedParams = {
|
|
228
|
+
...options,
|
|
229
|
+
...mapVercelParams(params)
|
|
230
|
+
};
|
|
231
|
+
try {
|
|
232
|
+
const result = await doGenerate();
|
|
233
|
+
const latency = (Date.now() - startTime) / 1000;
|
|
234
|
+
const modelId = options.posthogModelOverride ?? (result.response?.modelId ? result.response.modelId : model.modelId);
|
|
235
|
+
const provider = options.posthogProviderOverride ?? extractProvider(model);
|
|
236
|
+
const baseURL = ''; // cannot currently get baseURL from vercel
|
|
237
|
+
const content = mapVercelOutput(result);
|
|
238
|
+
// let tools = result.toolCalls
|
|
239
|
+
const providerMetadata = result.providerMetadata;
|
|
240
|
+
const additionalTokenValues = {
|
|
241
|
+
...(providerMetadata?.openai?.reasoningTokens ? {
|
|
242
|
+
reasoningTokens: providerMetadata.openai.reasoningTokens
|
|
243
|
+
} : {}),
|
|
244
|
+
...(providerMetadata?.openai?.cachedPromptTokens ? {
|
|
245
|
+
cacheReadInputTokens: providerMetadata.openai.cachedPromptTokens
|
|
246
|
+
} : {}),
|
|
247
|
+
...(providerMetadata?.anthropic ? {
|
|
248
|
+
cacheReadInputTokens: providerMetadata.anthropic.cacheReadInputTokens,
|
|
249
|
+
cacheCreationInputTokens: providerMetadata.anthropic.cacheCreationInputTokens
|
|
250
|
+
} : {})
|
|
251
|
+
};
|
|
252
|
+
sendEventToPosthog({
|
|
253
|
+
client: phClient,
|
|
254
|
+
distinctId: options.posthogDistinctId,
|
|
255
|
+
traceId: options.posthogTraceId,
|
|
256
|
+
model: modelId,
|
|
257
|
+
provider: provider,
|
|
258
|
+
input: options.posthogPrivacyMode ? '' : mapVercelPrompt(params.prompt),
|
|
259
|
+
output: [{
|
|
260
|
+
content,
|
|
261
|
+
role: 'assistant'
|
|
262
|
+
}],
|
|
263
|
+
latency,
|
|
264
|
+
baseURL,
|
|
265
|
+
params: mergedParams,
|
|
266
|
+
httpStatus: 200,
|
|
267
|
+
usage: {
|
|
268
|
+
inputTokens: result.usage.promptTokens,
|
|
269
|
+
outputTokens: result.usage.completionTokens,
|
|
270
|
+
...additionalTokenValues
|
|
271
|
+
}
|
|
272
|
+
});
|
|
273
|
+
return result;
|
|
274
|
+
} catch (error) {
|
|
275
|
+
const modelId = model.modelId;
|
|
276
|
+
sendEventToPosthog({
|
|
277
|
+
client: phClient,
|
|
278
|
+
distinctId: options.posthogDistinctId,
|
|
279
|
+
traceId: options.posthogTraceId,
|
|
280
|
+
model: modelId,
|
|
281
|
+
provider: model.provider,
|
|
282
|
+
input: options.posthogPrivacyMode ? '' : mapVercelPrompt(params.prompt),
|
|
283
|
+
output: [],
|
|
284
|
+
latency: 0,
|
|
285
|
+
baseURL: '',
|
|
286
|
+
params: mergedParams,
|
|
287
|
+
httpStatus: error?.status ? error.status : 500,
|
|
288
|
+
usage: {
|
|
289
|
+
inputTokens: 0,
|
|
290
|
+
outputTokens: 0
|
|
291
|
+
},
|
|
292
|
+
isError: true,
|
|
293
|
+
error: JSON.stringify(error)
|
|
294
|
+
});
|
|
295
|
+
throw error;
|
|
296
|
+
}
|
|
297
|
+
},
|
|
298
|
+
wrapStream: async ({
|
|
299
|
+
doStream,
|
|
300
|
+
params
|
|
301
|
+
}) => {
|
|
302
|
+
const startTime = Date.now();
|
|
303
|
+
let generatedText = '';
|
|
304
|
+
let usage = {};
|
|
305
|
+
const mergedParams = {
|
|
306
|
+
...options,
|
|
307
|
+
...mapVercelParams(params)
|
|
308
|
+
};
|
|
309
|
+
const modelId = options.posthogModelOverride ?? model.modelId;
|
|
310
|
+
const provider = options.posthogProviderOverride ?? extractProvider(model);
|
|
311
|
+
const baseURL = ''; // cannot currently get baseURL from vercel
|
|
312
|
+
try {
|
|
313
|
+
const {
|
|
314
|
+
stream,
|
|
315
|
+
...rest
|
|
316
|
+
} = await doStream();
|
|
317
|
+
const transformStream = new TransformStream({
|
|
318
|
+
transform(chunk, controller) {
|
|
319
|
+
if (chunk.type === 'text-delta') {
|
|
320
|
+
generatedText += chunk.textDelta;
|
|
321
|
+
}
|
|
322
|
+
if (chunk.type === 'finish') {
|
|
323
|
+
usage = {
|
|
324
|
+
inputTokens: chunk.usage?.promptTokens,
|
|
325
|
+
outputTokens: chunk.usage?.completionTokens
|
|
326
|
+
};
|
|
327
|
+
if (chunk.providerMetadata?.openai?.reasoningTokens) {
|
|
328
|
+
usage.reasoningTokens = chunk.providerMetadata.openai.reasoningTokens;
|
|
329
|
+
}
|
|
330
|
+
if (chunk.providerMetadata?.openai?.cachedPromptTokens) {
|
|
331
|
+
usage.cacheReadInputTokens = chunk.providerMetadata.openai.cachedPromptTokens;
|
|
332
|
+
}
|
|
333
|
+
if (chunk.providerMetadata?.anthropic?.cacheReadInputTokens) {
|
|
334
|
+
usage.cacheReadInputTokens = chunk.providerMetadata.anthropic.cacheReadInputTokens;
|
|
335
|
+
}
|
|
336
|
+
if (chunk.providerMetadata?.anthropic?.cacheCreationInputTokens) {
|
|
337
|
+
usage.cacheCreationInputTokens = chunk.providerMetadata.anthropic.cacheCreationInputTokens;
|
|
338
|
+
}
|
|
339
|
+
}
|
|
340
|
+
controller.enqueue(chunk);
|
|
341
|
+
},
|
|
342
|
+
flush() {
|
|
343
|
+
const latency = (Date.now() - startTime) / 1000;
|
|
344
|
+
sendEventToPosthog({
|
|
345
|
+
client: phClient,
|
|
346
|
+
distinctId: options.posthogDistinctId,
|
|
347
|
+
traceId: options.posthogTraceId,
|
|
348
|
+
model: modelId,
|
|
349
|
+
provider: provider,
|
|
350
|
+
input: options.posthogPrivacyMode ? '' : mapVercelPrompt(params.prompt),
|
|
351
|
+
output: [{
|
|
352
|
+
content: generatedText,
|
|
353
|
+
role: 'assistant'
|
|
354
|
+
}],
|
|
355
|
+
latency,
|
|
356
|
+
baseURL,
|
|
357
|
+
params: mergedParams,
|
|
358
|
+
httpStatus: 200,
|
|
359
|
+
usage
|
|
360
|
+
});
|
|
361
|
+
}
|
|
362
|
+
});
|
|
363
|
+
return {
|
|
364
|
+
stream: stream.pipeThrough(transformStream),
|
|
365
|
+
...rest
|
|
366
|
+
};
|
|
367
|
+
} catch (error) {
|
|
368
|
+
sendEventToPosthog({
|
|
369
|
+
client: phClient,
|
|
370
|
+
distinctId: options.posthogDistinctId,
|
|
371
|
+
traceId: options.posthogTraceId,
|
|
372
|
+
model: modelId,
|
|
373
|
+
provider: provider,
|
|
374
|
+
input: options.posthogPrivacyMode ? '' : mapVercelPrompt(params.prompt),
|
|
375
|
+
output: [],
|
|
376
|
+
latency: 0,
|
|
377
|
+
baseURL: '',
|
|
378
|
+
params: mergedParams,
|
|
379
|
+
httpStatus: error?.status ? error.status : 500,
|
|
380
|
+
usage: {
|
|
381
|
+
inputTokens: 0,
|
|
382
|
+
outputTokens: 0
|
|
383
|
+
},
|
|
384
|
+
isError: true,
|
|
385
|
+
error: JSON.stringify(error)
|
|
386
|
+
});
|
|
387
|
+
throw error;
|
|
388
|
+
}
|
|
389
|
+
}
|
|
390
|
+
};
|
|
391
|
+
return middleware;
|
|
392
|
+
};
|
|
393
|
+
const wrapVercelLanguageModel = (model, phClient, options) => {
|
|
394
|
+
const traceId = options.posthogTraceId ?? uuid.v4();
|
|
395
|
+
const middleware = createInstrumentationMiddleware(phClient, model, {
|
|
396
|
+
...options,
|
|
397
|
+
posthogTraceId: traceId,
|
|
398
|
+
posthogDistinctId: options.posthogDistinctId ?? traceId
|
|
399
|
+
});
|
|
400
|
+
const wrappedModel = ai.experimental_wrapLanguageModel({
|
|
401
|
+
model,
|
|
402
|
+
middleware
|
|
403
|
+
});
|
|
404
|
+
return wrappedModel;
|
|
405
|
+
};
|
|
406
|
+
|
|
407
|
+
exports.withTracing = wrapVercelLanguageModel;
|
|
408
|
+
//# sourceMappingURL=index.cjs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.cjs.js","sources":["../../src/utils.ts","../../src/vercel/middleware.ts"],"sourcesContent":["import { PostHog } from 'posthog-node'\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\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 let errorData = {}\n if (isError) {\n errorData = {\n $ai_is_error: true,\n $ai_error: error,\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, input),\n $ai_output_choices: withPrivacyMode(client, params.posthogPrivacyMode ?? false, output),\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 { experimental_wrapLanguageModel as wrapLanguageModel } from 'ai'\nimport type { LanguageModelV1, LanguageModelV1Middleware, LanguageModelV1Prompt, LanguageModelV1StreamPart } from 'ai'\nimport { v4 as uuidv4 } from 'uuid'\nimport { PostHog } from 'posthog-node'\nimport { CostOverride, sendEventToPosthog } from '../utils'\n\ninterface ClientOptions {\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\ninterface CreateInstrumentationMiddlewareOptions {\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\ninterface PostHogInput {\n role: string\n type?: string\n content?:\n | string\n | {\n [key: string]: any\n }\n}\n\nconst mapVercelParams = (params: any): Record<string, any> => {\n return {\n temperature: params.temperature,\n max_tokens: params.maxTokens,\n top_p: params.topP,\n frequency_penalty: params.frequencyPenalty,\n presence_penalty: params.presencePenalty,\n stop: params.stopSequences,\n stream: params.stream,\n }\n}\n\nconst mapVercelPrompt = (prompt: LanguageModelV1Prompt): PostHogInput[] => {\n return prompt.map((p) => {\n let content = {}\n if (Array.isArray(p.content)) {\n content = p.content.map((c) => {\n if (c.type === 'text') {\n return {\n type: 'text',\n content: c.text,\n }\n } else if (c.type === 'image') {\n return {\n type: 'image',\n content: {\n // if image is a url use it, or use \"none supported\"\n image: c.image instanceof URL ? c.image.toString() : 'raw images not supported',\n mimeType: c.mimeType,\n },\n }\n } else if (c.type === 'file') {\n return {\n type: 'file',\n content: {\n file: c.data instanceof URL ? c.data.toString() : 'raw files not supported',\n mimeType: c.mimeType,\n },\n }\n } else if (c.type === 'tool-call') {\n return {\n type: 'tool-call',\n content: {\n toolCallId: c.toolCallId,\n toolName: c.toolName,\n args: c.args,\n },\n }\n } else if (c.type === 'tool-result') {\n return {\n type: 'tool-result',\n content: {\n toolCallId: c.toolCallId,\n toolName: c.toolName,\n result: c.result,\n isError: c.isError,\n },\n }\n }\n return {\n content: '',\n }\n })\n } else {\n content = {\n type: 'text',\n text: p.content,\n }\n }\n return {\n role: p.role,\n content,\n }\n })\n}\n\nconst mapVercelOutput = (result: any): PostHogInput[] => {\n const output = {\n ...(result.text ? { text: result.text } : {}),\n ...(result.object ? { object: result.object } : {}),\n ...(result.reasoning ? { reasoning: result.reasoning } : {}),\n ...(result.response ? { response: result.response } : {}),\n ...(result.finishReason ? { finishReason: result.finishReason } : {}),\n ...(result.usage ? { usage: result.usage } : {}),\n ...(result.warnings ? { warnings: result.warnings } : {}),\n ...(result.providerMetadata ? { toolCalls: result.providerMetadata } : {}),\n }\n // if text and no object or reasoning, return text\n if (output.text && !output.object && !output.reasoning) {\n return [{ content: output.text, role: 'assistant' }]\n }\n return [{ content: JSON.stringify(output), role: 'assistant' }]\n}\n\nconst extractProvider = (model: LanguageModelV1): string => {\n // vercel provider is in the format of provider.endpoint\n const provider = model.provider.toLowerCase()\n const providerName = provider.split('.')[0]\n return providerName\n}\n\nexport const createInstrumentationMiddleware = (\n phClient: PostHog,\n model: LanguageModelV1,\n options: CreateInstrumentationMiddlewareOptions\n): LanguageModelV1Middleware => {\n const middleware: LanguageModelV1Middleware = {\n wrapGenerate: async ({ doGenerate, params }) => {\n const startTime = Date.now()\n const mergedParams = {\n ...options,\n ...mapVercelParams(params),\n }\n try {\n const result = await doGenerate()\n const latency = (Date.now() - startTime) / 1000\n const modelId =\n options.posthogModelOverride ?? (result.response?.modelId ? result.response.modelId : model.modelId)\n const provider = options.posthogProviderOverride ?? extractProvider(model)\n const baseURL = '' // cannot currently get baseURL from vercel\n const content = mapVercelOutput(result)\n // let tools = result.toolCalls\n const providerMetadata = result.providerMetadata\n const additionalTokenValues = {\n ...(providerMetadata?.openai?.reasoningTokens\n ? { reasoningTokens: providerMetadata.openai.reasoningTokens }\n : {}),\n ...(providerMetadata?.openai?.cachedPromptTokens\n ? { cacheReadInputTokens: providerMetadata.openai.cachedPromptTokens }\n : {}),\n ...(providerMetadata?.anthropic\n ? {\n cacheReadInputTokens: providerMetadata.anthropic.cacheReadInputTokens,\n cacheCreationInputTokens: providerMetadata.anthropic.cacheCreationInputTokens,\n }\n : {}),\n }\n sendEventToPosthog({\n client: phClient,\n distinctId: options.posthogDistinctId,\n traceId: options.posthogTraceId,\n model: modelId,\n provider: provider,\n input: options.posthogPrivacyMode ? '' : mapVercelPrompt(params.prompt),\n output: [{ content, role: 'assistant' }],\n latency,\n baseURL,\n params: mergedParams as any,\n httpStatus: 200,\n usage: {\n inputTokens: result.usage.promptTokens,\n outputTokens: result.usage.completionTokens,\n ...additionalTokenValues,\n },\n })\n\n return result\n } catch (error: any) {\n const modelId = model.modelId\n sendEventToPosthog({\n client: phClient,\n distinctId: options.posthogDistinctId,\n traceId: options.posthogTraceId,\n model: modelId,\n provider: model.provider,\n input: options.posthogPrivacyMode ? '' : mapVercelPrompt(params.prompt),\n output: [],\n latency: 0,\n baseURL: '',\n params: mergedParams as any,\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 },\n\n wrapStream: async ({ doStream, params }) => {\n const startTime = Date.now()\n let generatedText = ''\n let usage: {\n inputTokens?: number\n outputTokens?: number\n reasoningTokens?: any\n cacheReadInputTokens?: any\n cacheCreationInputTokens?: any\n } = {}\n const mergedParams = {\n ...options,\n ...mapVercelParams(params),\n }\n\n const modelId = options.posthogModelOverride ?? model.modelId\n const provider = options.posthogProviderOverride ?? extractProvider(model)\n const baseURL = '' // cannot currently get baseURL from vercel\n try {\n const { stream, ...rest } = await doStream()\n const transformStream = new TransformStream<LanguageModelV1StreamPart, LanguageModelV1StreamPart>({\n transform(chunk, controller) {\n if (chunk.type === 'text-delta') {\n generatedText += chunk.textDelta\n }\n if (chunk.type === 'finish') {\n usage = {\n inputTokens: chunk.usage?.promptTokens,\n outputTokens: chunk.usage?.completionTokens,\n }\n if (chunk.providerMetadata?.openai?.reasoningTokens) {\n usage.reasoningTokens = chunk.providerMetadata.openai.reasoningTokens\n }\n if (chunk.providerMetadata?.openai?.cachedPromptTokens) {\n usage.cacheReadInputTokens = chunk.providerMetadata.openai.cachedPromptTokens\n }\n if (chunk.providerMetadata?.anthropic?.cacheReadInputTokens) {\n usage.cacheReadInputTokens = chunk.providerMetadata.anthropic.cacheReadInputTokens\n }\n if (chunk.providerMetadata?.anthropic?.cacheCreationInputTokens) {\n usage.cacheCreationInputTokens = chunk.providerMetadata.anthropic.cacheCreationInputTokens\n }\n }\n controller.enqueue(chunk)\n },\n\n flush() {\n const latency = (Date.now() - startTime) / 1000\n sendEventToPosthog({\n client: phClient,\n distinctId: options.posthogDistinctId,\n traceId: options.posthogTraceId,\n model: modelId,\n provider: provider,\n input: options.posthogPrivacyMode ? '' : mapVercelPrompt(params.prompt),\n output: [{ content: generatedText, role: 'assistant' }],\n latency,\n baseURL,\n params: mergedParams as any,\n httpStatus: 200,\n usage,\n })\n },\n })\n\n return {\n stream: stream.pipeThrough(transformStream),\n ...rest,\n }\n } catch (error: any) {\n sendEventToPosthog({\n client: phClient,\n distinctId: options.posthogDistinctId,\n traceId: options.posthogTraceId,\n model: modelId,\n provider: provider,\n input: options.posthogPrivacyMode ? '' : mapVercelPrompt(params.prompt),\n output: [],\n latency: 0,\n baseURL: '',\n params: mergedParams as any,\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 },\n }\n\n return middleware\n}\n\nexport const wrapVercelLanguageModel = (\n model: LanguageModelV1,\n phClient: PostHog,\n options: ClientOptions\n): LanguageModelV1 => {\n const traceId = options.posthogTraceId ?? uuidv4()\n const middleware = createInstrumentationMiddleware(phClient, model, {\n ...options,\n posthogTraceId: traceId,\n posthogDistinctId: options.posthogDistinctId ?? traceId,\n })\n\n const wrappedModel = wrapLanguageModel({\n model,\n middleware,\n })\n\n return wrappedModel\n}\n"],"names":["getModelParams","params","modelParams","paramKeys","key","undefined","withPrivacyMode","client","privacyMode","input","privacy_mode","sendEventToPosthog","distinctId","traceId","model","provider","output","latency","baseURL","httpStatus","usage","isError","error","tools","capture","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","mapVercelParams","temperature","max_tokens","maxTokens","top_p","topP","frequency_penalty","frequencyPenalty","presence_penalty","presencePenalty","stop","stopSequences","stream","mapVercelPrompt","prompt","map","p","content","Array","isArray","c","type","text","image","URL","toString","mimeType","file","data","toolCallId","toolName","args","result","role","mapVercelOutput","object","reasoning","response","finishReason","warnings","providerMetadata","toolCalls","JSON","stringify","extractProvider","toLowerCase","providerName","split","createInstrumentationMiddleware","phClient","options","middleware","wrapGenerate","doGenerate","startTime","Date","now","mergedParams","modelId","openai","cachedPromptTokens","anthropic","posthogDistinctId","posthogTraceId","promptTokens","completionTokens","status","wrapStream","doStream","generatedText","rest","transformStream","TransformStream","transform","chunk","controller","textDelta","enqueue","flush","pipeThrough","wrapVercelLanguageModel","uuidv4","wrappedModel","wrapLanguageModel"],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { LanguageModelV1 } from 'ai';
|
|
2
|
+
import { PostHog } from 'posthog-node';
|
|
3
|
+
|
|
4
|
+
interface CostOverride {
|
|
5
|
+
inputCost: number;
|
|
6
|
+
outputCost: number;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
interface ClientOptions {
|
|
10
|
+
posthogDistinctId?: string;
|
|
11
|
+
posthogTraceId?: string;
|
|
12
|
+
posthogProperties?: Record<string, any>;
|
|
13
|
+
posthogPrivacyMode?: boolean;
|
|
14
|
+
posthogGroups?: Record<string, any>;
|
|
15
|
+
posthogModelOverride?: string;
|
|
16
|
+
posthogProviderOverride?: string;
|
|
17
|
+
posthogCostOverride?: CostOverride;
|
|
18
|
+
}
|
|
19
|
+
declare const wrapVercelLanguageModel: (model: LanguageModelV1, phClient: PostHog, options: ClientOptions) => LanguageModelV1;
|
|
20
|
+
|
|
21
|
+
export { wrapVercelLanguageModel as withTracing };
|