@posthog/ai 6.0.0 → 6.1.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/dist/gemini/index.cjs +6 -2
- package/dist/gemini/index.cjs.map +1 -1
- package/dist/gemini/index.d.ts +2 -0
- package/dist/gemini/index.mjs +6 -2
- package/dist/gemini/index.mjs.map +1 -1
- package/dist/index.cjs +103 -93
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.mjs +103 -93
- package/dist/index.mjs.map +1 -1
- package/dist/vercel/index.cjs +98 -91
- package/dist/vercel/index.cjs.map +1 -1
- package/dist/vercel/index.mjs +98 -91
- package/dist/vercel/index.mjs.map +1 -1
- package/package.json +1 -1
package/dist/vercel/index.mjs
CHANGED
|
@@ -256,77 +256,75 @@ const mapVercelPrompt = messages => {
|
|
|
256
256
|
return inputs;
|
|
257
257
|
};
|
|
258
258
|
const mapVercelOutput = result => {
|
|
259
|
-
const content =
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
id: toolCall.toolCallId,
|
|
259
|
+
const content = result.map(item => {
|
|
260
|
+
if (item.type === 'text') {
|
|
261
|
+
return {
|
|
262
|
+
type: 'text',
|
|
263
|
+
text: truncate(item.text)
|
|
264
|
+
};
|
|
265
|
+
}
|
|
266
|
+
if (item.type === 'tool-call') {
|
|
267
|
+
return {
|
|
268
|
+
type: 'tool-call',
|
|
269
|
+
id: item.toolCallId,
|
|
271
270
|
function: {
|
|
272
|
-
name:
|
|
273
|
-
arguments:
|
|
271
|
+
name: item.toolName,
|
|
272
|
+
arguments: item.args || JSON.stringify(item.arguments || {})
|
|
274
273
|
}
|
|
275
|
-
}
|
|
274
|
+
};
|
|
276
275
|
}
|
|
277
|
-
|
|
276
|
+
if (item.type === 'reasoning') {
|
|
277
|
+
return {
|
|
278
|
+
type: 'reasoning',
|
|
279
|
+
text: truncate(item.text)
|
|
280
|
+
};
|
|
281
|
+
}
|
|
282
|
+
if (item.type === 'file') {
|
|
283
|
+
// Handle files similar to input mapping - avoid large base64 data
|
|
284
|
+
let fileData;
|
|
285
|
+
if (item.data instanceof URL) {
|
|
286
|
+
fileData = item.data.toString();
|
|
287
|
+
} else if (typeof item.data === 'string') {
|
|
288
|
+
// Check if it's base64 data and potentially large
|
|
289
|
+
if (item.data.startsWith('data:') || item.data.length > 1000) {
|
|
290
|
+
fileData = `[${item.mediaType} file - ${item.data.length} bytes]`;
|
|
291
|
+
} else {
|
|
292
|
+
fileData = item.data;
|
|
293
|
+
}
|
|
294
|
+
} else {
|
|
295
|
+
fileData = `[binary ${item.mediaType} file]`;
|
|
296
|
+
}
|
|
297
|
+
return {
|
|
298
|
+
type: 'file',
|
|
299
|
+
name: 'generated_file',
|
|
300
|
+
mediaType: item.mediaType,
|
|
301
|
+
data: fileData
|
|
302
|
+
};
|
|
303
|
+
}
|
|
304
|
+
if (item.type === 'source') {
|
|
305
|
+
return {
|
|
306
|
+
type: 'source',
|
|
307
|
+
sourceType: item.sourceType,
|
|
308
|
+
id: item.id,
|
|
309
|
+
url: item.url || '',
|
|
310
|
+
title: item.title || ''
|
|
311
|
+
};
|
|
312
|
+
}
|
|
313
|
+
// Fallback for unknown types - try to extract text if possible
|
|
314
|
+
return {
|
|
315
|
+
type: 'text',
|
|
316
|
+
text: truncate(JSON.stringify(item))
|
|
317
|
+
};
|
|
318
|
+
});
|
|
278
319
|
if (content.length > 0) {
|
|
279
320
|
return [{
|
|
280
321
|
role: 'assistant',
|
|
281
322
|
content: content.length === 1 && content[0].type === 'text' ? content[0].text : content
|
|
282
323
|
}];
|
|
283
324
|
}
|
|
284
|
-
// Fallback to original behavior for other result types TODO: check if we can remove this
|
|
285
|
-
const normalizedResult = typeof result === 'string' ? {
|
|
286
|
-
text: result
|
|
287
|
-
} : result;
|
|
288
|
-
const output = {
|
|
289
|
-
...(normalizedResult.text ? {
|
|
290
|
-
text: normalizedResult.text
|
|
291
|
-
} : {}),
|
|
292
|
-
...(normalizedResult.object ? {
|
|
293
|
-
object: normalizedResult.object
|
|
294
|
-
} : {}),
|
|
295
|
-
...(normalizedResult.reasoningText ? {
|
|
296
|
-
reasoning: normalizedResult.reasoningText
|
|
297
|
-
} : {}),
|
|
298
|
-
...(normalizedResult.response ? {
|
|
299
|
-
response: normalizedResult.response
|
|
300
|
-
} : {}),
|
|
301
|
-
...(normalizedResult.finishReason ? {
|
|
302
|
-
finishReason: normalizedResult.finishReason
|
|
303
|
-
} : {}),
|
|
304
|
-
...(normalizedResult.usage ? {
|
|
305
|
-
usage: normalizedResult.usage
|
|
306
|
-
} : {}),
|
|
307
|
-
...(normalizedResult.warnings ? {
|
|
308
|
-
warnings: normalizedResult.warnings
|
|
309
|
-
} : {}),
|
|
310
|
-
...(normalizedResult.providerMetadata ? {
|
|
311
|
-
toolCalls: normalizedResult.providerMetadata
|
|
312
|
-
} : {}),
|
|
313
|
-
...(normalizedResult.files ? {
|
|
314
|
-
files: normalizedResult.files.map(file => ({
|
|
315
|
-
name: file.name,
|
|
316
|
-
size: file.size,
|
|
317
|
-
type: file.type
|
|
318
|
-
}))
|
|
319
|
-
} : {})
|
|
320
|
-
};
|
|
321
|
-
if (output.text && !output.object && !output.reasoning) {
|
|
322
|
-
return [{
|
|
323
|
-
content: truncate(output.text),
|
|
324
|
-
role: 'assistant'
|
|
325
|
-
}];
|
|
326
|
-
}
|
|
327
325
|
// otherwise stringify and truncate
|
|
328
326
|
try {
|
|
329
|
-
const jsonOutput = JSON.stringify(
|
|
327
|
+
const jsonOutput = JSON.stringify(result);
|
|
330
328
|
return [{
|
|
331
329
|
content: truncate(jsonOutput),
|
|
332
330
|
role: 'assistant'
|
|
@@ -358,21 +356,21 @@ const createInstrumentationMiddleware = (phClient, model, options) => {
|
|
|
358
356
|
const modelId = options.posthogModelOverride ?? (result.response?.modelId ? result.response.modelId : model.modelId);
|
|
359
357
|
const provider = options.posthogProviderOverride ?? extractProvider(model);
|
|
360
358
|
const baseURL = ''; // cannot currently get baseURL from vercel
|
|
361
|
-
const content = mapVercelOutput(result);
|
|
359
|
+
const content = mapVercelOutput(result.content);
|
|
362
360
|
const latency = (Date.now() - startTime) / 1000;
|
|
363
361
|
const providerMetadata = result.providerMetadata;
|
|
364
362
|
const additionalTokenValues = {
|
|
365
|
-
...(providerMetadata?.openai?.reasoningTokens ? {
|
|
366
|
-
reasoningTokens: providerMetadata.openai.reasoningTokens
|
|
367
|
-
} : {}),
|
|
368
|
-
...(providerMetadata?.openai?.cachedPromptTokens ? {
|
|
369
|
-
cacheReadInputTokens: providerMetadata.openai.cachedPromptTokens
|
|
370
|
-
} : {}),
|
|
371
363
|
...(providerMetadata?.anthropic ? {
|
|
372
|
-
cacheReadInputTokens: providerMetadata.anthropic.cacheReadInputTokens,
|
|
373
364
|
cacheCreationInputTokens: providerMetadata.anthropic.cacheCreationInputTokens
|
|
374
365
|
} : {})
|
|
375
366
|
};
|
|
367
|
+
const usage = {
|
|
368
|
+
inputTokens: result.usage.inputTokens,
|
|
369
|
+
outputTokens: result.usage.outputTokens,
|
|
370
|
+
reasoningTokens: result.usage.reasoningTokens,
|
|
371
|
+
cacheReadInputTokens: result.usage.cachedInputTokens,
|
|
372
|
+
...additionalTokenValues
|
|
373
|
+
};
|
|
376
374
|
await sendEventToPosthog({
|
|
377
375
|
client: phClient,
|
|
378
376
|
distinctId: options.posthogDistinctId,
|
|
@@ -385,11 +383,7 @@ const createInstrumentationMiddleware = (phClient, model, options) => {
|
|
|
385
383
|
baseURL,
|
|
386
384
|
params: mergedParams,
|
|
387
385
|
httpStatus: 200,
|
|
388
|
-
usage
|
|
389
|
-
inputTokens: result.usage.inputTokens,
|
|
390
|
-
outputTokens: result.usage.outputTokens,
|
|
391
|
-
...additionalTokenValues
|
|
392
|
-
},
|
|
386
|
+
usage,
|
|
393
387
|
tools: availableTools,
|
|
394
388
|
captureImmediate: options.posthogCaptureImmediate
|
|
395
389
|
});
|
|
@@ -452,28 +446,44 @@ const createInstrumentationMiddleware = (phClient, model, options) => {
|
|
|
452
446
|
reasoningText += chunk.delta; // New in v5
|
|
453
447
|
}
|
|
454
448
|
if (chunk.type === 'finish') {
|
|
449
|
+
const providerMetadata = chunk.providerMetadata;
|
|
450
|
+
const additionalTokenValues = {
|
|
451
|
+
...(providerMetadata?.anthropic ? {
|
|
452
|
+
cacheCreationInputTokens: providerMetadata.anthropic.cacheCreationInputTokens
|
|
453
|
+
} : {})
|
|
454
|
+
};
|
|
455
455
|
usage = {
|
|
456
456
|
inputTokens: chunk.usage?.inputTokens,
|
|
457
|
-
outputTokens: chunk.usage?.outputTokens
|
|
457
|
+
outputTokens: chunk.usage?.outputTokens,
|
|
458
|
+
reasoningTokens: chunk.usage?.reasoningTokens,
|
|
459
|
+
cacheReadInputTokens: chunk.usage?.cachedInputTokens,
|
|
460
|
+
...additionalTokenValues
|
|
458
461
|
};
|
|
459
|
-
if (chunk.providerMetadata?.openai?.reasoningTokens) {
|
|
460
|
-
usage.reasoningTokens = chunk.providerMetadata.openai.reasoningTokens;
|
|
461
|
-
}
|
|
462
|
-
if (chunk.providerMetadata?.openai?.cachedPromptTokens) {
|
|
463
|
-
usage.cacheReadInputTokens = chunk.providerMetadata.openai.cachedPromptTokens;
|
|
464
|
-
}
|
|
465
|
-
if (chunk.providerMetadata?.anthropic?.cacheReadInputTokens) {
|
|
466
|
-
usage.cacheReadInputTokens = chunk.providerMetadata.anthropic.cacheReadInputTokens;
|
|
467
|
-
}
|
|
468
|
-
if (chunk.providerMetadata?.anthropic?.cacheCreationInputTokens) {
|
|
469
|
-
usage.cacheCreationInputTokens = chunk.providerMetadata.anthropic.cacheCreationInputTokens;
|
|
470
|
-
}
|
|
471
462
|
}
|
|
472
463
|
controller.enqueue(chunk);
|
|
473
464
|
},
|
|
474
465
|
flush: async () => {
|
|
475
466
|
const latency = (Date.now() - startTime) / 1000;
|
|
476
|
-
|
|
467
|
+
// Build content array similar to mapVercelOutput structure
|
|
468
|
+
const content = [];
|
|
469
|
+
if (reasoningText) {
|
|
470
|
+
content.push({
|
|
471
|
+
type: 'reasoning',
|
|
472
|
+
text: truncate(reasoningText)
|
|
473
|
+
});
|
|
474
|
+
}
|
|
475
|
+
if (generatedText) {
|
|
476
|
+
content.push({
|
|
477
|
+
type: 'text',
|
|
478
|
+
text: truncate(generatedText)
|
|
479
|
+
});
|
|
480
|
+
}
|
|
481
|
+
|
|
482
|
+
// Structure output like mapVercelOutput does
|
|
483
|
+
const output = content.length > 0 ? [{
|
|
484
|
+
role: 'assistant',
|
|
485
|
+
content: content.length === 1 && content[0].type === 'text' ? content[0].text : content
|
|
486
|
+
}] : [];
|
|
477
487
|
await sendEventToPosthog({
|
|
478
488
|
client: phClient,
|
|
479
489
|
distinctId: options.posthogDistinctId,
|
|
@@ -481,10 +491,7 @@ const createInstrumentationMiddleware = (phClient, model, options) => {
|
|
|
481
491
|
model: modelId,
|
|
482
492
|
provider: provider,
|
|
483
493
|
input: options.posthogPrivacyMode ? '' : mapVercelPrompt(params.prompt),
|
|
484
|
-
output:
|
|
485
|
-
content: outputContent,
|
|
486
|
-
role: 'assistant'
|
|
487
|
-
}],
|
|
494
|
+
output: output,
|
|
488
495
|
latency,
|
|
489
496
|
baseURL,
|
|
490
497
|
params: mergedParams,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","sources":["../../src/utils.ts","../../src/vercel/middleware.ts"],"sourcesContent":["import { PostHog } from 'posthog-node'\nimport { Buffer } from 'buffer'\nimport OpenAIOrignal from 'openai'\nimport AnthropicOriginal from '@anthropic-ai/sdk'\nimport type { ChatCompletionTool } from 'openai/resources/chat/completions'\nimport type { Tool as GeminiTool } from '@google/genai'\nimport type { FormattedMessage, FormattedContent, TokenUsage } from './types'\n\ntype ChatCompletionCreateParamsBase = OpenAIOrignal.Chat.Completions.ChatCompletionCreateParams\ntype MessageCreateParams = AnthropicOriginal.Messages.MessageCreateParams\ntype ResponseCreateParams = OpenAIOrignal.Responses.ResponseCreateParams\ntype AnthropicTool = AnthropicOriginal.Tool\n\n// limit large outputs by truncating to 200kb (approx 200k bytes)\nexport const MAX_OUTPUT_SIZE = 200000\nconst STRING_FORMAT = 'utf8'\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 posthogCaptureImmediate?: boolean\n}\n\nexport interface CostOverride {\n inputCost: number\n outputCost: number\n}\n\nexport const getModelParams = (\n params: ((ChatCompletionCreateParamsBase | MessageCreateParams | ResponseCreateParams) & 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): FormattedMessage[] => {\n if (!response) {\n return []\n }\n if (provider === 'anthropic') {\n return formatResponseAnthropic(response)\n } else if (provider === 'openai') {\n return formatResponseOpenAI(response)\n } else if (provider === 'gemini') {\n return formatResponseGemini(response)\n }\n return []\n}\n\nexport const formatResponseAnthropic = (response: any): FormattedMessage[] => {\n const output: FormattedMessage[] = []\n const content: FormattedContent = []\n\n for (const choice of response.content ?? []) {\n if (choice?.type === 'text' && choice?.text) {\n content.push({ type: 'text', text: choice.text })\n } else if (choice?.type === 'tool_use' && choice?.name && choice?.id) {\n content.push({\n type: 'function',\n id: choice.id,\n function: {\n name: choice.name,\n arguments: choice.input || {},\n },\n })\n }\n }\n\n if (content.length > 0) {\n output.push({\n role: 'assistant',\n content,\n })\n }\n\n return output\n}\n\nexport const formatResponseOpenAI = (response: any): FormattedMessage[] => {\n const output: FormattedMessage[] = []\n\n if (response.choices) {\n for (const choice of response.choices) {\n const content: FormattedContent = []\n let role = 'assistant'\n\n if (choice.message) {\n if (choice.message.role) {\n role = choice.message.role\n }\n\n if (choice.message.content) {\n content.push({ type: 'text', text: choice.message.content })\n }\n\n if (choice.message.tool_calls) {\n for (const toolCall of choice.message.tool_calls) {\n content.push({\n type: 'function',\n id: toolCall.id,\n function: {\n name: toolCall.function.name,\n arguments: toolCall.function.arguments,\n },\n })\n }\n }\n }\n\n if (content.length > 0) {\n output.push({\n role,\n content,\n })\n }\n }\n }\n\n // Handle Responses API format\n if (response.output) {\n const content: FormattedContent = []\n let role = 'assistant'\n\n for (const item of response.output) {\n if (item.type === 'message') {\n role = item.role\n\n if (item.content && Array.isArray(item.content)) {\n for (const contentItem of item.content) {\n if (contentItem.type === 'output_text' && contentItem.text) {\n content.push({ type: 'text', text: contentItem.text })\n } else if (contentItem.text) {\n content.push({ type: 'text', text: contentItem.text })\n } else if (contentItem.type === 'input_image' && contentItem.image_url) {\n content.push({\n type: 'image',\n image: contentItem.image_url,\n })\n }\n }\n } else if (item.content) {\n content.push({ type: 'text', text: String(item.content) })\n }\n } else if (item.type === 'function_call') {\n content.push({\n type: 'function',\n id: item.call_id || item.id || '',\n function: {\n name: item.name,\n arguments: item.arguments || {},\n },\n })\n }\n }\n\n if (content.length > 0) {\n output.push({\n role,\n content,\n })\n }\n }\n\n return output\n}\n\nexport const formatResponseGemini = (response: any): FormattedMessage[] => {\n const output: FormattedMessage[] = []\n\n if (response.candidates && Array.isArray(response.candidates)) {\n for (const candidate of response.candidates) {\n if (candidate.content && candidate.content.parts) {\n const content: FormattedContent = []\n\n for (const part of candidate.content.parts) {\n if (part.text) {\n content.push({ type: 'text', text: part.text })\n } else if (part.functionCall) {\n content.push({\n type: 'function',\n function: {\n name: part.functionCall.name,\n arguments: part.functionCall.args,\n },\n })\n }\n }\n\n if (content.length > 0) {\n output.push({\n role: 'assistant',\n content,\n })\n }\n } else if (candidate.text) {\n output.push({\n role: 'assistant',\n content: [{ type: 'text', text: candidate.text }],\n })\n }\n }\n } else if (response.text) {\n output.push({\n role: 'assistant',\n content: [{ type: 'text', text: response.text }],\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 const truncate = (str: string): string => {\n try {\n const buffer = Buffer.from(str, STRING_FORMAT)\n if (buffer.length <= MAX_OUTPUT_SIZE) {\n return str\n }\n const truncatedBuffer = buffer.slice(0, MAX_OUTPUT_SIZE)\n return `${truncatedBuffer.toString(STRING_FORMAT)}... [truncated]`\n } catch (error) {\n console.error('Error truncating, likely not a string')\n return str\n }\n}\n\n/**\n * Extract available tool calls from the request parameters.\n * These are the tools provided to the LLM, not the tool calls in the response.\n */\nexport const extractAvailableToolCalls = (\n provider: string,\n params: any\n): ChatCompletionTool[] | AnthropicTool[] | GeminiTool[] | null => {\n if (provider === 'anthropic') {\n if (params.tools) {\n return params.tools\n }\n\n return null\n } else if (provider === 'gemini') {\n if (params.config && params.config.tools) {\n return params.config.tools\n }\n\n return null\n } else if (provider === 'openai') {\n if (params.tools) {\n return params.tools\n }\n\n return null\n } else if (provider === 'vercel') {\n // Vercel AI SDK stores tools in params.mode.tools when mode type is 'regular'\n if (params.mode?.type === 'regular' && params.mode.tools) {\n return params.mode.tools\n }\n\n return null\n }\n\n return null\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?: TokenUsage\n params: (ChatCompletionCreateParamsBase | MessageCreateParams | ResponseCreateParams) & MonitoringParams\n isError?: boolean\n error?: string\n tools?: ChatCompletionTool[] | AnthropicTool[] | GeminiTool[] | null\n captureImmediate?: boolean\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, STRING_FORMAT).toString(STRING_FORMAT)\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 = async ({\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 captureImmediate = false,\n}: SendEventToPosthogParams): Promise<void> => {\n if (!client.capture) {\n return Promise.resolve()\n }\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 const 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\n const event = {\n distinctId: distinctId ?? traceId,\n event: '$ai_generation',\n properties,\n groups: params.posthogGroups,\n }\n\n if (captureImmediate) {\n // await capture promise to send single event in serverless environments\n await client.captureImmediate(event)\n } else {\n client.capture(event)\n }\n}\n","import { wrapLanguageModel } from 'ai'\nimport type {\n LanguageModelV2,\n LanguageModelV2Middleware,\n LanguageModelV2Prompt,\n LanguageModelV2StreamPart,\n} from '@ai-sdk/provider'\nimport { v4 as uuidv4 } from 'uuid'\nimport { PostHog } from 'posthog-node'\nimport { CostOverride, sendEventToPosthog, truncate, MAX_OUTPUT_SIZE, extractAvailableToolCalls } from '../utils'\nimport { Buffer } from 'buffer'\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 posthogCaptureImmediate?: boolean\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 posthogCaptureImmediate?: boolean\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_output_tokens: params.maxOutputTokens,\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 = (messages: LanguageModelV2Prompt): PostHogInput[] => {\n // Map and truncate individual content\n const inputs: PostHogInput[] = messages.map((message) => {\n let content: any\n\n // Handle system role which has string content\n if (message.role === 'system') {\n content = [\n {\n type: 'text',\n text: truncate(String(message.content)),\n },\n ]\n } else {\n // Handle other roles which have array content\n if (Array.isArray(message.content)) {\n content = message.content.map((c: any) => {\n if (c.type === 'text') {\n return {\n type: 'text',\n text: truncate(c.text),\n }\n } else if (c.type === 'file') {\n return {\n type: 'file',\n file: c.data instanceof URL ? c.data.toString() : 'raw files not supported',\n mediaType: c.mediaType,\n }\n } else if (c.type === 'reasoning') {\n return {\n type: 'reasoning',\n text: truncate(c.reasoning),\n }\n } else if (c.type === 'tool-call') {\n return {\n type: 'tool-call',\n toolCallId: c.toolCallId,\n toolName: c.toolName,\n input: c.input,\n }\n } else if (c.type === 'tool-result') {\n return {\n type: 'tool-result',\n toolCallId: c.toolCallId,\n toolName: c.toolName,\n output: c.output,\n isError: c.isError,\n }\n }\n return {\n type: 'text',\n text: '',\n }\n })\n } else {\n // Fallback for non-array content\n content = [\n {\n type: 'text',\n text: truncate(String(message.content)),\n },\n ]\n }\n }\n\n return {\n role: message.role,\n content,\n }\n })\n\n try {\n // Trim the inputs array until its JSON size fits within MAX_OUTPUT_SIZE\n let serialized = JSON.stringify(inputs)\n let removedCount = 0\n // We need to keep track of the initial size of the inputs array because we're going to be mutating it\n const initialSize = inputs.length\n for (let i = 0; i < initialSize && Buffer.byteLength(serialized, 'utf8') > MAX_OUTPUT_SIZE; i++) {\n inputs.shift()\n removedCount++\n serialized = JSON.stringify(inputs)\n }\n if (removedCount > 0) {\n // Add one placeholder to indicate how many were removed\n inputs.unshift({\n role: 'posthog',\n content: `[${removedCount} message${removedCount === 1 ? '' : 's'} removed due to size limit]`,\n })\n }\n } catch (error) {\n console.error('Error stringifying inputs', error)\n return [{ role: 'posthog', content: 'An error occurred while processing your request. Please try again.' }]\n }\n return inputs\n}\n\nconst mapVercelOutput = (result: any): PostHogInput[] => {\n const content: any[] = []\n\n if (result.text) {\n content.push({ type: 'text', text: truncate(result.text) })\n }\n\n if (result.toolCalls && Array.isArray(result.toolCalls)) {\n for (const toolCall of result.toolCalls) {\n content.push({\n type: 'function',\n id: toolCall.toolCallId,\n function: {\n name: toolCall.toolName,\n arguments: typeof toolCall.args === 'string' ? toolCall.args : JSON.stringify(toolCall.args),\n },\n })\n }\n }\n\n if (content.length > 0) {\n return [\n {\n role: 'assistant',\n content: content.length === 1 && content[0].type === 'text' ? content[0].text : content,\n },\n ]\n }\n // Fallback to original behavior for other result types TODO: check if we can remove this\n const normalizedResult = typeof result === 'string' ? { text: result } : result\n const output = {\n ...(normalizedResult.text ? { text: normalizedResult.text } : {}),\n ...(normalizedResult.object ? { object: normalizedResult.object } : {}),\n ...(normalizedResult.reasoningText ? { reasoning: normalizedResult.reasoningText } : {}),\n ...(normalizedResult.response ? { response: normalizedResult.response } : {}),\n ...(normalizedResult.finishReason ? { finishReason: normalizedResult.finishReason } : {}),\n ...(normalizedResult.usage ? { usage: normalizedResult.usage } : {}),\n ...(normalizedResult.warnings ? { warnings: normalizedResult.warnings } : {}),\n ...(normalizedResult.providerMetadata ? { toolCalls: normalizedResult.providerMetadata } : {}),\n ...(normalizedResult.files\n ? {\n files: normalizedResult.files.map((file: any) => ({\n name: file.name,\n size: file.size,\n type: file.type,\n })),\n }\n : {}),\n }\n if (output.text && !output.object && !output.reasoning) {\n return [{ content: truncate(output.text as string), role: 'assistant' }]\n }\n // otherwise stringify and truncate\n try {\n const jsonOutput = JSON.stringify(output)\n return [{ content: truncate(jsonOutput), role: 'assistant' }]\n } catch (error) {\n console.error('Error stringifying output')\n return []\n }\n}\n\nconst extractProvider = (model: LanguageModelV2): string => {\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: LanguageModelV2,\n options: CreateInstrumentationMiddlewareOptions\n): LanguageModelV2Middleware => {\n const middleware: LanguageModelV2Middleware = {\n wrapGenerate: async ({ doGenerate, params }) => {\n const startTime = Date.now()\n const mergedParams = {\n ...options,\n ...mapVercelParams(params),\n }\n const availableTools = extractAvailableToolCalls('vercel', params)\n\n try {\n const result = await doGenerate()\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 const latency = (Date.now() - startTime) / 1000\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 await sendEventToPosthog({\n client: phClient,\n distinctId: options.posthogDistinctId,\n traceId: options.posthogTraceId ?? uuidv4(),\n model: modelId,\n provider: provider,\n input: options.posthogPrivacyMode ? '' : mapVercelPrompt(params.prompt),\n output: content,\n latency,\n baseURL,\n params: mergedParams as any,\n httpStatus: 200,\n usage: {\n inputTokens: result.usage.inputTokens,\n outputTokens: result.usage.outputTokens,\n ...additionalTokenValues,\n },\n tools: availableTools,\n captureImmediate: options.posthogCaptureImmediate,\n })\n\n return result\n } catch (error: any) {\n const modelId = model.modelId\n await sendEventToPosthog({\n client: phClient,\n distinctId: options.posthogDistinctId,\n traceId: options.posthogTraceId ?? uuidv4(),\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: truncate(JSON.stringify(error)),\n tools: availableTools,\n captureImmediate: options.posthogCaptureImmediate,\n })\n throw error\n }\n },\n\n wrapStream: async ({ doStream, params }) => {\n const startTime = Date.now()\n let generatedText = ''\n let reasoningText = ''\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 availableTools = extractAvailableToolCalls('vercel', params)\n const baseURL = '' // cannot currently get baseURL from vercel\n\n try {\n const { stream, ...rest } = await doStream()\n const transformStream = new TransformStream<LanguageModelV2StreamPart, LanguageModelV2StreamPart>({\n transform(chunk, controller) {\n // Handle new v5 streaming patterns\n if (chunk.type === 'text-delta') {\n generatedText += chunk.delta\n }\n if (chunk.type === 'reasoning-delta') {\n reasoningText += chunk.delta // New in v5\n }\n if (chunk.type === 'finish') {\n usage = {\n inputTokens: chunk.usage?.inputTokens,\n outputTokens: chunk.usage?.outputTokens,\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: async () => {\n const latency = (Date.now() - startTime) / 1000\n const outputContent = reasoningText ? `${reasoningText}\\n\\n${generatedText}` : generatedText\n await sendEventToPosthog({\n client: phClient,\n distinctId: options.posthogDistinctId,\n traceId: options.posthogTraceId ?? uuidv4(),\n model: modelId,\n provider: provider,\n input: options.posthogPrivacyMode ? '' : mapVercelPrompt(params.prompt),\n output: [{ content: outputContent, role: 'assistant' }],\n latency,\n baseURL,\n params: mergedParams as any,\n httpStatus: 200,\n usage,\n tools: availableTools,\n captureImmediate: options.posthogCaptureImmediate,\n })\n },\n })\n\n return {\n stream: stream.pipeThrough(transformStream),\n ...rest,\n }\n } catch (error: any) {\n await sendEventToPosthog({\n client: phClient,\n distinctId: options.posthogDistinctId,\n traceId: options.posthogTraceId ?? uuidv4(),\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: truncate(JSON.stringify(error)),\n tools: availableTools,\n captureImmediate: options.posthogCaptureImmediate,\n })\n throw error\n }\n },\n }\n\n return middleware\n}\n\nexport const wrapVercelLanguageModel = (\n model: LanguageModelV2,\n phClient: PostHog,\n options: ClientOptions\n): LanguageModelV2 => {\n const traceId = options.posthogTraceId ?? uuidv4()\n const middleware = createInstrumentationMiddleware(phClient, model, {\n ...options,\n posthogTraceId: traceId,\n posthogDistinctId: options.posthogDistinctId,\n })\n\n const wrappedModel = wrapLanguageModel({\n model,\n middleware,\n })\n\n return wrappedModel\n}\n"],"names":["MAX_OUTPUT_SIZE","STRING_FORMAT","getModelParams","params","modelParams","paramKeys","key","undefined","withPrivacyMode","client","privacyMode","input","privacy_mode","truncate","str","buffer","Buffer","from","length","truncatedBuffer","slice","toString","error","console","extractAvailableToolCalls","provider","mode","type","tools","sanitizeValues","obj","jsonSafe","JSON","parse","stringify","Array","isArray","map","Object","fromEntries","entries","k","v","sendEventToPosthog","distinctId","traceId","model","output","latency","baseURL","httpStatus","usage","isError","captureImmediate","capture","Promise","resolve","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","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","event","groups","posthogGroups","mapVercelParams","temperature","max_output_tokens","maxOutputTokens","top_p","topP","frequency_penalty","frequencyPenalty","presence_penalty","presencePenalty","stop","stopSequences","stream","mapVercelPrompt","messages","inputs","message","content","role","text","String","c","file","data","URL","mediaType","reasoning","toolCallId","toolName","serialized","removedCount","initialSize","i","byteLength","shift","unshift","mapVercelOutput","result","push","toolCalls","toolCall","id","function","name","arguments","args","normalizedResult","object","reasoningText","response","finishReason","warnings","providerMetadata","files","size","jsonOutput","extractProvider","toLowerCase","providerName","split","createInstrumentationMiddleware","phClient","options","middleware","wrapGenerate","doGenerate","startTime","Date","now","mergedParams","availableTools","modelId","openai","cachedPromptTokens","anthropic","posthogDistinctId","posthogTraceId","uuidv4","prompt","posthogCaptureImmediate","status","wrapStream","doStream","generatedText","rest","transformStream","TransformStream","transform","chunk","controller","delta","enqueue","flush","outputContent","pipeThrough","wrapVercelLanguageModel","wrappedModel","wrapLanguageModel"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.mjs","sources":["../../src/utils.ts","../../src/vercel/middleware.ts"],"sourcesContent":["import { PostHog } from 'posthog-node'\nimport { Buffer } from 'buffer'\nimport OpenAIOrignal from 'openai'\nimport AnthropicOriginal from '@anthropic-ai/sdk'\nimport type { ChatCompletionTool } from 'openai/resources/chat/completions'\nimport type { Tool as GeminiTool } from '@google/genai'\nimport type { FormattedMessage, FormattedContent, TokenUsage } from './types'\n\ntype ChatCompletionCreateParamsBase = OpenAIOrignal.Chat.Completions.ChatCompletionCreateParams\ntype MessageCreateParams = AnthropicOriginal.Messages.MessageCreateParams\ntype ResponseCreateParams = OpenAIOrignal.Responses.ResponseCreateParams\ntype AnthropicTool = AnthropicOriginal.Tool\n\n// limit large outputs by truncating to 200kb (approx 200k bytes)\nexport const MAX_OUTPUT_SIZE = 200000\nconst STRING_FORMAT = 'utf8'\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 posthogCaptureImmediate?: boolean\n}\n\nexport interface CostOverride {\n inputCost: number\n outputCost: number\n}\n\nexport const getModelParams = (\n params: ((ChatCompletionCreateParamsBase | MessageCreateParams | ResponseCreateParams) & 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): FormattedMessage[] => {\n if (!response) {\n return []\n }\n if (provider === 'anthropic') {\n return formatResponseAnthropic(response)\n } else if (provider === 'openai') {\n return formatResponseOpenAI(response)\n } else if (provider === 'gemini') {\n return formatResponseGemini(response)\n }\n return []\n}\n\nexport const formatResponseAnthropic = (response: any): FormattedMessage[] => {\n const output: FormattedMessage[] = []\n const content: FormattedContent = []\n\n for (const choice of response.content ?? []) {\n if (choice?.type === 'text' && choice?.text) {\n content.push({ type: 'text', text: choice.text })\n } else if (choice?.type === 'tool_use' && choice?.name && choice?.id) {\n content.push({\n type: 'function',\n id: choice.id,\n function: {\n name: choice.name,\n arguments: choice.input || {},\n },\n })\n }\n }\n\n if (content.length > 0) {\n output.push({\n role: 'assistant',\n content,\n })\n }\n\n return output\n}\n\nexport const formatResponseOpenAI = (response: any): FormattedMessage[] => {\n const output: FormattedMessage[] = []\n\n if (response.choices) {\n for (const choice of response.choices) {\n const content: FormattedContent = []\n let role = 'assistant'\n\n if (choice.message) {\n if (choice.message.role) {\n role = choice.message.role\n }\n\n if (choice.message.content) {\n content.push({ type: 'text', text: choice.message.content })\n }\n\n if (choice.message.tool_calls) {\n for (const toolCall of choice.message.tool_calls) {\n content.push({\n type: 'function',\n id: toolCall.id,\n function: {\n name: toolCall.function.name,\n arguments: toolCall.function.arguments,\n },\n })\n }\n }\n }\n\n if (content.length > 0) {\n output.push({\n role,\n content,\n })\n }\n }\n }\n\n // Handle Responses API format\n if (response.output) {\n const content: FormattedContent = []\n let role = 'assistant'\n\n for (const item of response.output) {\n if (item.type === 'message') {\n role = item.role\n\n if (item.content && Array.isArray(item.content)) {\n for (const contentItem of item.content) {\n if (contentItem.type === 'output_text' && contentItem.text) {\n content.push({ type: 'text', text: contentItem.text })\n } else if (contentItem.text) {\n content.push({ type: 'text', text: contentItem.text })\n } else if (contentItem.type === 'input_image' && contentItem.image_url) {\n content.push({\n type: 'image',\n image: contentItem.image_url,\n })\n }\n }\n } else if (item.content) {\n content.push({ type: 'text', text: String(item.content) })\n }\n } else if (item.type === 'function_call') {\n content.push({\n type: 'function',\n id: item.call_id || item.id || '',\n function: {\n name: item.name,\n arguments: item.arguments || {},\n },\n })\n }\n }\n\n if (content.length > 0) {\n output.push({\n role,\n content,\n })\n }\n }\n\n return output\n}\n\nexport const formatResponseGemini = (response: any): FormattedMessage[] => {\n const output: FormattedMessage[] = []\n\n if (response.candidates && Array.isArray(response.candidates)) {\n for (const candidate of response.candidates) {\n if (candidate.content && candidate.content.parts) {\n const content: FormattedContent = []\n\n for (const part of candidate.content.parts) {\n if (part.text) {\n content.push({ type: 'text', text: part.text })\n } else if (part.functionCall) {\n content.push({\n type: 'function',\n function: {\n name: part.functionCall.name,\n arguments: part.functionCall.args,\n },\n })\n }\n }\n\n if (content.length > 0) {\n output.push({\n role: 'assistant',\n content,\n })\n }\n } else if (candidate.text) {\n output.push({\n role: 'assistant',\n content: [{ type: 'text', text: candidate.text }],\n })\n }\n }\n } else if (response.text) {\n output.push({\n role: 'assistant',\n content: [{ type: 'text', text: response.text }],\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 const truncate = (str: string): string => {\n try {\n const buffer = Buffer.from(str, STRING_FORMAT)\n if (buffer.length <= MAX_OUTPUT_SIZE) {\n return str\n }\n const truncatedBuffer = buffer.slice(0, MAX_OUTPUT_SIZE)\n return `${truncatedBuffer.toString(STRING_FORMAT)}... [truncated]`\n } catch (error) {\n console.error('Error truncating, likely not a string')\n return str\n }\n}\n\n/**\n * Extract available tool calls from the request parameters.\n * These are the tools provided to the LLM, not the tool calls in the response.\n */\nexport const extractAvailableToolCalls = (\n provider: string,\n params: any\n): ChatCompletionTool[] | AnthropicTool[] | GeminiTool[] | null => {\n if (provider === 'anthropic') {\n if (params.tools) {\n return params.tools\n }\n\n return null\n } else if (provider === 'gemini') {\n if (params.config && params.config.tools) {\n return params.config.tools\n }\n\n return null\n } else if (provider === 'openai') {\n if (params.tools) {\n return params.tools\n }\n\n return null\n } else if (provider === 'vercel') {\n // Vercel AI SDK stores tools in params.mode.tools when mode type is 'regular'\n if (params.mode?.type === 'regular' && params.mode.tools) {\n return params.mode.tools\n }\n\n return null\n }\n\n return null\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?: TokenUsage\n params: (ChatCompletionCreateParamsBase | MessageCreateParams | ResponseCreateParams) & MonitoringParams\n isError?: boolean\n error?: string\n tools?: ChatCompletionTool[] | AnthropicTool[] | GeminiTool[] | null\n captureImmediate?: boolean\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, STRING_FORMAT).toString(STRING_FORMAT)\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 = async ({\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 captureImmediate = false,\n}: SendEventToPosthogParams): Promise<void> => {\n if (!client.capture) {\n return Promise.resolve()\n }\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 const 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\n const event = {\n distinctId: distinctId ?? traceId,\n event: '$ai_generation',\n properties,\n groups: params.posthogGroups,\n }\n\n if (captureImmediate) {\n // await capture promise to send single event in serverless environments\n await client.captureImmediate(event)\n } else {\n client.capture(event)\n }\n}\n","import { wrapLanguageModel } from 'ai'\nimport type {\n LanguageModelV2,\n LanguageModelV2Content,\n LanguageModelV2Middleware,\n LanguageModelV2Prompt,\n LanguageModelV2StreamPart,\n} from '@ai-sdk/provider'\nimport { v4 as uuidv4 } from 'uuid'\nimport { PostHog } from 'posthog-node'\nimport { CostOverride, sendEventToPosthog, truncate, MAX_OUTPUT_SIZE, extractAvailableToolCalls } from '../utils'\nimport { Buffer } from 'buffer'\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 posthogCaptureImmediate?: boolean\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 posthogCaptureImmediate?: boolean\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_output_tokens: params.maxOutputTokens,\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 = (messages: LanguageModelV2Prompt): PostHogInput[] => {\n // Map and truncate individual content\n const inputs: PostHogInput[] = messages.map((message) => {\n let content: any\n\n // Handle system role which has string content\n if (message.role === 'system') {\n content = [\n {\n type: 'text',\n text: truncate(String(message.content)),\n },\n ]\n } else {\n // Handle other roles which have array content\n if (Array.isArray(message.content)) {\n content = message.content.map((c: any) => {\n if (c.type === 'text') {\n return {\n type: 'text',\n text: truncate(c.text),\n }\n } else if (c.type === 'file') {\n return {\n type: 'file',\n file: c.data instanceof URL ? c.data.toString() : 'raw files not supported',\n mediaType: c.mediaType,\n }\n } else if (c.type === 'reasoning') {\n return {\n type: 'reasoning',\n text: truncate(c.reasoning),\n }\n } else if (c.type === 'tool-call') {\n return {\n type: 'tool-call',\n toolCallId: c.toolCallId,\n toolName: c.toolName,\n input: c.input,\n }\n } else if (c.type === 'tool-result') {\n return {\n type: 'tool-result',\n toolCallId: c.toolCallId,\n toolName: c.toolName,\n output: c.output,\n isError: c.isError,\n }\n }\n return {\n type: 'text',\n text: '',\n }\n })\n } else {\n // Fallback for non-array content\n content = [\n {\n type: 'text',\n text: truncate(String(message.content)),\n },\n ]\n }\n }\n\n return {\n role: message.role,\n content,\n }\n })\n\n try {\n // Trim the inputs array until its JSON size fits within MAX_OUTPUT_SIZE\n let serialized = JSON.stringify(inputs)\n let removedCount = 0\n // We need to keep track of the initial size of the inputs array because we're going to be mutating it\n const initialSize = inputs.length\n for (let i = 0; i < initialSize && Buffer.byteLength(serialized, 'utf8') > MAX_OUTPUT_SIZE; i++) {\n inputs.shift()\n removedCount++\n serialized = JSON.stringify(inputs)\n }\n if (removedCount > 0) {\n // Add one placeholder to indicate how many were removed\n inputs.unshift({\n role: 'posthog',\n content: `[${removedCount} message${removedCount === 1 ? '' : 's'} removed due to size limit]`,\n })\n }\n } catch (error) {\n console.error('Error stringifying inputs', error)\n return [{ role: 'posthog', content: 'An error occurred while processing your request. Please try again.' }]\n }\n return inputs\n}\n\nconst mapVercelOutput = (result: LanguageModelV2Content[]): PostHogInput[] => {\n const content: any[] = result.map((item) => {\n if (item.type === 'text') {\n return { type: 'text', text: truncate(item.text) }\n }\n if (item.type === 'tool-call') {\n return {\n type: 'tool-call',\n id: item.toolCallId,\n function: {\n name: item.toolName,\n arguments: (item as any).args || JSON.stringify((item as any).arguments || {}),\n },\n }\n }\n if (item.type === 'reasoning') {\n return { type: 'reasoning', text: truncate(item.text) }\n }\n if (item.type === 'file') {\n // Handle files similar to input mapping - avoid large base64 data\n let fileData: string\n if (item.data instanceof URL) {\n fileData = item.data.toString()\n } else if (typeof item.data === 'string') {\n // Check if it's base64 data and potentially large\n if (item.data.startsWith('data:') || item.data.length > 1000) {\n fileData = `[${item.mediaType} file - ${item.data.length} bytes]`\n } else {\n fileData = item.data\n }\n } else {\n fileData = `[binary ${item.mediaType} file]`\n }\n\n return {\n type: 'file',\n name: 'generated_file',\n mediaType: item.mediaType,\n data: fileData,\n }\n }\n if (item.type === 'source') {\n return {\n type: 'source',\n sourceType: item.sourceType,\n id: item.id,\n url: (item as any).url || '',\n title: item.title || '',\n }\n }\n // Fallback for unknown types - try to extract text if possible\n return { type: 'text', text: truncate(JSON.stringify(item)) }\n })\n\n if (content.length > 0) {\n return [\n {\n role: 'assistant',\n content: content.length === 1 && content[0].type === 'text' ? content[0].text : content,\n },\n ]\n }\n // otherwise stringify and truncate\n try {\n const jsonOutput = JSON.stringify(result)\n return [{ content: truncate(jsonOutput), role: 'assistant' }]\n } catch (error) {\n console.error('Error stringifying output')\n return []\n }\n}\n\nconst extractProvider = (model: LanguageModelV2): string => {\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: LanguageModelV2,\n options: CreateInstrumentationMiddlewareOptions\n): LanguageModelV2Middleware => {\n const middleware: LanguageModelV2Middleware = {\n wrapGenerate: async ({ doGenerate, params }) => {\n const startTime = Date.now()\n const mergedParams = {\n ...options,\n ...mapVercelParams(params),\n }\n const availableTools = extractAvailableToolCalls('vercel', params)\n\n try {\n const result = await doGenerate()\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.content)\n const latency = (Date.now() - startTime) / 1000\n const providerMetadata = result.providerMetadata\n const additionalTokenValues = {\n ...(providerMetadata?.anthropic\n ? {\n cacheCreationInputTokens: providerMetadata.anthropic.cacheCreationInputTokens,\n }\n : {}),\n }\n const usage = {\n inputTokens: result.usage.inputTokens,\n outputTokens: result.usage.outputTokens,\n reasoningTokens: result.usage.reasoningTokens,\n cacheReadInputTokens: result.usage.cachedInputTokens,\n ...additionalTokenValues,\n }\n await sendEventToPosthog({\n client: phClient,\n distinctId: options.posthogDistinctId,\n traceId: options.posthogTraceId ?? uuidv4(),\n model: modelId,\n provider: provider,\n input: options.posthogPrivacyMode ? '' : mapVercelPrompt(params.prompt),\n output: content,\n latency,\n baseURL,\n params: mergedParams as any,\n httpStatus: 200,\n usage,\n tools: availableTools,\n captureImmediate: options.posthogCaptureImmediate,\n })\n\n return result\n } catch (error: any) {\n const modelId = model.modelId\n await sendEventToPosthog({\n client: phClient,\n distinctId: options.posthogDistinctId,\n traceId: options.posthogTraceId ?? uuidv4(),\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: truncate(JSON.stringify(error)),\n tools: availableTools,\n captureImmediate: options.posthogCaptureImmediate,\n })\n throw error\n }\n },\n\n wrapStream: async ({ doStream, params }) => {\n const startTime = Date.now()\n let generatedText = ''\n let reasoningText = ''\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 availableTools = extractAvailableToolCalls('vercel', params)\n const baseURL = '' // cannot currently get baseURL from vercel\n\n try {\n const { stream, ...rest } = await doStream()\n const transformStream = new TransformStream<LanguageModelV2StreamPart, LanguageModelV2StreamPart>({\n transform(chunk, controller) {\n // Handle new v5 streaming patterns\n if (chunk.type === 'text-delta') {\n generatedText += chunk.delta\n }\n if (chunk.type === 'reasoning-delta') {\n reasoningText += chunk.delta // New in v5\n }\n if (chunk.type === 'finish') {\n const providerMetadata = chunk.providerMetadata\n const additionalTokenValues = {\n ...(providerMetadata?.anthropic\n ? {\n cacheCreationInputTokens: providerMetadata.anthropic.cacheCreationInputTokens,\n }\n : {}),\n }\n usage = {\n inputTokens: chunk.usage?.inputTokens,\n outputTokens: chunk.usage?.outputTokens,\n reasoningTokens: chunk.usage?.reasoningTokens,\n cacheReadInputTokens: chunk.usage?.cachedInputTokens,\n ...additionalTokenValues,\n }\n }\n controller.enqueue(chunk)\n },\n\n flush: async () => {\n const latency = (Date.now() - startTime) / 1000\n // Build content array similar to mapVercelOutput structure\n const content = []\n if (reasoningText) {\n content.push({ type: 'reasoning', text: truncate(reasoningText) })\n }\n if (generatedText) {\n content.push({ type: 'text', text: truncate(generatedText) })\n }\n\n // Structure output like mapVercelOutput does\n const output =\n content.length > 0\n ? [\n {\n role: 'assistant',\n content: content.length === 1 && content[0].type === 'text' ? content[0].text : content,\n },\n ]\n : []\n\n await sendEventToPosthog({\n client: phClient,\n distinctId: options.posthogDistinctId,\n traceId: options.posthogTraceId ?? uuidv4(),\n model: modelId,\n provider: provider,\n input: options.posthogPrivacyMode ? '' : mapVercelPrompt(params.prompt),\n output: output,\n latency,\n baseURL,\n params: mergedParams as any,\n httpStatus: 200,\n usage,\n tools: availableTools,\n captureImmediate: options.posthogCaptureImmediate,\n })\n },\n })\n\n return {\n stream: stream.pipeThrough(transformStream),\n ...rest,\n }\n } catch (error: any) {\n await sendEventToPosthog({\n client: phClient,\n distinctId: options.posthogDistinctId,\n traceId: options.posthogTraceId ?? uuidv4(),\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: truncate(JSON.stringify(error)),\n tools: availableTools,\n captureImmediate: options.posthogCaptureImmediate,\n })\n throw error\n }\n },\n }\n\n return middleware\n}\n\nexport const wrapVercelLanguageModel = (\n model: LanguageModelV2,\n phClient: PostHog,\n options: ClientOptions\n): LanguageModelV2 => {\n const traceId = options.posthogTraceId ?? uuidv4()\n const middleware = createInstrumentationMiddleware(phClient, model, {\n ...options,\n posthogTraceId: traceId,\n posthogDistinctId: options.posthogDistinctId,\n })\n\n const wrappedModel = wrapLanguageModel({\n model,\n middleware,\n })\n\n return wrappedModel\n}\n"],"names":["MAX_OUTPUT_SIZE","STRING_FORMAT","getModelParams","params","modelParams","paramKeys","key","undefined","withPrivacyMode","client","privacyMode","input","privacy_mode","truncate","str","buffer","Buffer","from","length","truncatedBuffer","slice","toString","error","console","extractAvailableToolCalls","provider","mode","type","tools","sanitizeValues","obj","jsonSafe","JSON","parse","stringify","Array","isArray","map","Object","fromEntries","entries","k","v","sendEventToPosthog","distinctId","traceId","model","output","latency","baseURL","httpStatus","usage","isError","captureImmediate","capture","Promise","resolve","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","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","event","groups","posthogGroups","mapVercelParams","temperature","max_output_tokens","maxOutputTokens","top_p","topP","frequency_penalty","frequencyPenalty","presence_penalty","presencePenalty","stop","stopSequences","stream","mapVercelPrompt","messages","inputs","message","content","role","text","String","c","file","data","URL","mediaType","reasoning","toolCallId","toolName","serialized","removedCount","initialSize","i","byteLength","shift","unshift","mapVercelOutput","result","item","id","function","name","arguments","args","fileData","startsWith","sourceType","url","title","jsonOutput","extractProvider","toLowerCase","providerName","split","createInstrumentationMiddleware","phClient","options","middleware","wrapGenerate","doGenerate","startTime","Date","now","mergedParams","availableTools","modelId","response","providerMetadata","anthropic","cachedInputTokens","posthogDistinctId","posthogTraceId","uuidv4","prompt","posthogCaptureImmediate","status","wrapStream","doStream","generatedText","reasoningText","rest","transformStream","TransformStream","transform","chunk","controller","delta","enqueue","flush","push","pipeThrough","wrapVercelLanguageModel","wrappedModel","wrapLanguageModel"],"mappings":"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"}
|