@posthog/ai 4.0.1 → 4.2.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.
@@ -2,6 +2,9 @@ import { experimental_wrapLanguageModel } from 'ai';
2
2
  import { v4 } from 'uuid';
3
3
  import { Buffer } from 'buffer';
4
4
 
5
+ // limit large outputs by truncating to 200kb (approx 200k bytes)
6
+ const MAX_OUTPUT_SIZE = 200000;
7
+ const STRING_FORMAT = 'utf8';
5
8
  const getModelParams = params => {
6
9
  if (!params) {
7
10
  return {};
@@ -18,13 +21,26 @@ const getModelParams = params => {
18
21
  const withPrivacyMode = (client, privacyMode, input) => {
19
22
  return client.privacy_mode || privacyMode ? null : input;
20
23
  };
24
+ const truncate = str => {
25
+ try {
26
+ const buffer = Buffer.from(str, STRING_FORMAT);
27
+ if (buffer.length <= MAX_OUTPUT_SIZE) {
28
+ return str;
29
+ }
30
+ const truncatedBuffer = buffer.slice(0, MAX_OUTPUT_SIZE);
31
+ return `${truncatedBuffer.toString(STRING_FORMAT)}... [truncated]`;
32
+ } catch (error) {
33
+ console.error('Error truncating, likely not a string');
34
+ return str;
35
+ }
36
+ };
21
37
  function sanitizeValues(obj) {
22
38
  if (obj === undefined || obj === null) {
23
39
  return obj;
24
40
  }
25
41
  const jsonSafe = JSON.parse(JSON.stringify(obj));
26
42
  if (typeof jsonSafe === 'string') {
27
- return Buffer.from(jsonSafe, 'utf8').toString('utf8');
43
+ return Buffer.from(jsonSafe, STRING_FORMAT).toString(STRING_FORMAT);
28
44
  } else if (Array.isArray(jsonSafe)) {
29
45
  return jsonSafe.map(sanitizeValues);
30
46
  } else if (jsonSafe && typeof jsonSafe === 'object') {
@@ -47,7 +63,8 @@ const sendEventToPosthog = ({
47
63
  usage = {},
48
64
  isError = false,
49
65
  error,
50
- tools
66
+ tools,
67
+ fullDebug = false
51
68
  }) => {
52
69
  if (client.capture) {
53
70
  // sanitize input and output for UTF-8 validity
@@ -82,32 +99,37 @@ const sendEventToPosthog = ({
82
99
  $ai_cache_creation_input_tokens: usage.cacheCreationInputTokens
83
100
  } : {})
84
101
  };
102
+ const properties = {
103
+ $ai_provider: params.posthogProviderOverride ?? provider,
104
+ $ai_model: params.posthogModelOverride ?? model,
105
+ $ai_model_parameters: getModelParams(params),
106
+ $ai_input: withPrivacyMode(client, params.posthogPrivacyMode ?? false, safeInput),
107
+ $ai_output_choices: withPrivacyMode(client, params.posthogPrivacyMode ?? false, safeOutput),
108
+ $ai_http_status: httpStatus,
109
+ $ai_input_tokens: usage.inputTokens ?? 0,
110
+ $ai_output_tokens: usage.outputTokens ?? 0,
111
+ ...additionalTokenValues,
112
+ $ai_latency: latency,
113
+ $ai_trace_id: traceId,
114
+ $ai_base_url: baseURL,
115
+ ...params.posthogProperties,
116
+ ...(distinctId ? {} : {
117
+ $process_person_profile: false
118
+ }),
119
+ ...(tools ? {
120
+ $ai_tools: tools
121
+ } : {}),
122
+ ...errorData,
123
+ ...costOverrideData
124
+ };
125
+ if (fullDebug) {
126
+ // @ts-ignore
127
+ console.log('Sending event to PostHog', properties);
128
+ }
85
129
  client.capture({
86
130
  distinctId: distinctId ?? traceId,
87
131
  event: '$ai_generation',
88
- properties: {
89
- $ai_provider: params.posthogProviderOverride ?? provider,
90
- $ai_model: params.posthogModelOverride ?? model,
91
- $ai_model_parameters: getModelParams(params),
92
- $ai_input: withPrivacyMode(client, params.posthogPrivacyMode ?? false, safeInput),
93
- $ai_output_choices: withPrivacyMode(client, params.posthogPrivacyMode ?? false, safeOutput),
94
- $ai_http_status: httpStatus,
95
- $ai_input_tokens: usage.inputTokens ?? 0,
96
- $ai_output_tokens: usage.outputTokens ?? 0,
97
- ...additionalTokenValues,
98
- $ai_latency: latency,
99
- $ai_trace_id: traceId,
100
- $ai_base_url: baseURL,
101
- ...params.posthogProperties,
102
- ...(distinctId ? {} : {
103
- $process_person_profile: false
104
- }),
105
- ...(tools ? {
106
- $ai_tools: tools
107
- } : {}),
108
- ...errorData,
109
- ...costOverrideData
110
- },
132
+ properties,
111
133
  groups: params.posthogGroups
112
134
  });
113
135
  }
@@ -125,14 +147,28 @@ const mapVercelParams = params => {
125
147
  };
126
148
  };
127
149
  const mapVercelPrompt = prompt => {
128
- return prompt.map(p => {
150
+ // normalize single inputs into an array of messages
151
+ let promptsArray;
152
+ if (typeof prompt === 'string') {
153
+ promptsArray = [{
154
+ role: 'user',
155
+ content: prompt
156
+ }];
157
+ } else if (!Array.isArray(prompt)) {
158
+ promptsArray = [prompt];
159
+ } else {
160
+ promptsArray = prompt;
161
+ }
162
+
163
+ // Map and truncate individual content
164
+ const inputs = promptsArray.map(p => {
129
165
  let content = {};
130
166
  if (Array.isArray(p.content)) {
131
167
  content = p.content.map(c => {
132
168
  if (c.type === 'text') {
133
169
  return {
134
170
  type: 'text',
135
- content: c.text
171
+ content: truncate(c.text)
136
172
  };
137
173
  } else if (c.type === 'image') {
138
174
  return {
@@ -178,7 +214,7 @@ const mapVercelPrompt = prompt => {
178
214
  } else {
179
215
  content = {
180
216
  type: 'text',
181
- text: p.content
217
+ text: truncate(p.content)
182
218
  };
183
219
  }
184
220
  return {
@@ -186,48 +222,85 @@ const mapVercelPrompt = prompt => {
186
222
  content
187
223
  };
188
224
  });
225
+ try {
226
+ // Trim the inputs array until its JSON size fits within MAX_OUTPUT_SIZE
227
+ let serialized = JSON.stringify(inputs);
228
+ while (Buffer.byteLength(serialized, 'utf8') > MAX_OUTPUT_SIZE && inputs.length > 0) {
229
+ // Remove oldest message
230
+ inputs.shift();
231
+ // add blank message to beginning of array
232
+ inputs.unshift({
233
+ role: 'assistant',
234
+ content: '[removed message due to size limit]'
235
+ });
236
+ serialized = JSON.stringify(inputs);
237
+ }
238
+ } catch (error) {
239
+ console.error('Error stringifying inputs');
240
+ return [{
241
+ role: 'posthog',
242
+ content: 'An error occurred while processing your request. Please try again.'
243
+ }];
244
+ }
245
+ return inputs;
189
246
  };
190
247
  const mapVercelOutput = result => {
248
+ // normalize string results to object
249
+ const normalizedResult = typeof result === 'string' ? {
250
+ text: result
251
+ } : result;
191
252
  const output = {
192
- ...(result.text ? {
193
- text: result.text
253
+ ...(normalizedResult.text ? {
254
+ text: normalizedResult.text
194
255
  } : {}),
195
- ...(result.object ? {
196
- object: result.object
256
+ ...(normalizedResult.object ? {
257
+ object: normalizedResult.object
197
258
  } : {}),
198
- ...(result.reasoning ? {
199
- reasoning: result.reasoning
259
+ ...(normalizedResult.reasoning ? {
260
+ reasoning: normalizedResult.reasoning
200
261
  } : {}),
201
- ...(result.response ? {
202
- response: result.response
262
+ ...(normalizedResult.response ? {
263
+ response: normalizedResult.response
203
264
  } : {}),
204
- ...(result.finishReason ? {
205
- finishReason: result.finishReason
265
+ ...(normalizedResult.finishReason ? {
266
+ finishReason: normalizedResult.finishReason
206
267
  } : {}),
207
- ...(result.usage ? {
208
- usage: result.usage
268
+ ...(normalizedResult.usage ? {
269
+ usage: normalizedResult.usage
209
270
  } : {}),
210
- ...(result.warnings ? {
211
- warnings: result.warnings
271
+ ...(normalizedResult.warnings ? {
272
+ warnings: normalizedResult.warnings
212
273
  } : {}),
213
- ...(result.providerMetadata ? {
214
- toolCalls: result.providerMetadata
274
+ ...(normalizedResult.providerMetadata ? {
275
+ toolCalls: normalizedResult.providerMetadata
276
+ } : {}),
277
+ ...(normalizedResult.files ? {
278
+ files: normalizedResult.files.map(file => ({
279
+ name: file.name,
280
+ size: file.size,
281
+ type: file.type
282
+ }))
215
283
  } : {})
216
284
  };
217
- // if text and no object or reasoning, return text
218
285
  if (output.text && !output.object && !output.reasoning) {
219
286
  return [{
220
- content: output.text,
287
+ content: truncate(output.text),
288
+ role: 'assistant'
289
+ }];
290
+ }
291
+ // otherwise stringify and truncate
292
+ try {
293
+ const jsonOutput = JSON.stringify(output);
294
+ return [{
295
+ content: truncate(jsonOutput),
221
296
  role: 'assistant'
222
297
  }];
298
+ } catch (error) {
299
+ console.error('Error stringifying output');
300
+ return [];
223
301
  }
224
- return [{
225
- content: JSON.stringify(output),
226
- role: 'assistant'
227
- }];
228
302
  };
229
303
  const extractProvider = model => {
230
- // vercel provider is in the format of provider.endpoint
231
304
  const provider = model.provider.toLowerCase();
232
305
  const providerName = provider.split('.')[0];
233
306
  return providerName;
@@ -283,7 +356,8 @@ const createInstrumentationMiddleware = (phClient, model, options) => {
283
356
  inputTokens: result.usage.promptTokens,
284
357
  outputTokens: result.usage.completionTokens,
285
358
  ...additionalTokenValues
286
- }
359
+ },
360
+ fullDebug: options.fullDebug
287
361
  });
288
362
  return result;
289
363
  } catch (error) {
@@ -305,7 +379,8 @@ const createInstrumentationMiddleware = (phClient, model, options) => {
305
379
  outputTokens: 0
306
380
  },
307
381
  isError: true,
308
- error: JSON.stringify(error)
382
+ error: truncate(JSON.stringify(error)),
383
+ fullDebug: options.fullDebug
309
384
  });
310
385
  throw error;
311
386
  }
@@ -371,7 +446,8 @@ const createInstrumentationMiddleware = (phClient, model, options) => {
371
446
  baseURL,
372
447
  params: mergedParams,
373
448
  httpStatus: 200,
374
- usage
449
+ usage,
450
+ fullDebug: options.fullDebug
375
451
  });
376
452
  }
377
453
  });
@@ -397,7 +473,8 @@ const createInstrumentationMiddleware = (phClient, model, options) => {
397
473
  outputTokens: 0
398
474
  },
399
475
  isError: true,
400
- error: JSON.stringify(error)
476
+ error: truncate(JSON.stringify(error)),
477
+ fullDebug: options.fullDebug
401
478
  });
402
479
  throw error;
403
480
  }
@@ -1 +1 @@
1
- {"version":3,"file":"index.esm.js","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'\n\ntype ChatCompletionCreateParamsBase = OpenAIOrignal.Chat.Completions.ChatCompletionCreateParams\ntype MessageCreateParams = AnthropicOriginal.Messages.MessageCreateParams\n\nexport interface MonitoringParams {\n posthogDistinctId?: string\n posthogTraceId?: string\n posthogProperties?: Record<string, any>\n posthogPrivacyMode?: boolean\n posthogGroups?: Record<string, any>\n posthogModelOverride?: string\n posthogProviderOverride?: string\n posthogCostOverride?: CostOverride\n}\n\nexport interface CostOverride {\n inputCost: number\n outputCost: number\n}\n\nexport const getModelParams = (\n params: ((ChatCompletionCreateParamsBase | MessageCreateParams) & MonitoringParams) | null\n): Record<string, any> => {\n if (!params) {\n return {}\n }\n const modelParams: Record<string, any> = {}\n const paramKeys = [\n 'temperature',\n 'max_tokens',\n 'max_completion_tokens',\n 'top_p',\n 'frequency_penalty',\n 'presence_penalty',\n 'n',\n 'stop',\n 'stream',\n 'streaming',\n ] as const\n\n for (const key of paramKeys) {\n if (key in params && (params as any)[key] !== undefined) {\n modelParams[key] = (params as any)[key]\n }\n }\n return modelParams\n}\n\n/**\n * Helper to format responses (non-streaming) for consumption, mirroring Python's openai vs. anthropic approach.\n */\nexport const formatResponse = (response: any, provider: string): Array<{ role: string; content: string }> => {\n if (!response) {\n return []\n }\n if (provider === 'anthropic') {\n return formatResponseAnthropic(response)\n } else if (provider === 'openai') {\n return formatResponseOpenAI(response)\n }\n return []\n}\n\nexport const formatResponseAnthropic = (response: any): Array<{ role: string; content: string }> => {\n // Example approach if \"response.content\" holds array of text segments, etc.\n const output: Array<{ role: string; content: string }> = []\n for (const choice of response.content ?? []) {\n if (choice?.text) {\n output.push({\n role: 'assistant',\n content: choice.text,\n })\n }\n }\n return output\n}\n\nexport const formatResponseOpenAI = (response: any): Array<{ role: string; content: string }> => {\n const output: Array<{ role: string; content: string }> = []\n for (const choice of response.choices ?? []) {\n if (choice.message?.content) {\n output.push({\n role: choice.message.role,\n content: choice.message.content,\n })\n }\n }\n return output\n}\n\nexport const mergeSystemPrompt = (params: MessageCreateParams & MonitoringParams, provider: string): any => {\n if (provider == 'anthropic') {\n const messages = params.messages || []\n if (!(params as any).system) {\n return messages\n }\n const systemMessage = (params as any).system\n return [{ role: 'system', content: systemMessage }, ...messages]\n }\n return params.messages\n}\n\nexport const withPrivacyMode = (client: PostHog, privacyMode: boolean, input: any): any => {\n return (client as any).privacy_mode || privacyMode ? null : input\n}\n\nexport type SendEventToPosthogParams = {\n client: PostHog\n distinctId?: string\n traceId: string\n model: string\n provider: string\n input: any\n output: any\n latency: number\n baseURL: string\n httpStatus: number\n usage?: {\n inputTokens?: number\n outputTokens?: number\n reasoningTokens?: any\n cacheReadInputTokens?: any\n cacheCreationInputTokens?: any\n }\n params: (ChatCompletionCreateParamsBase | MessageCreateParams) & MonitoringParams\n isError?: boolean\n error?: string\n tools?: any\n}\n\nfunction sanitizeValues(obj: any): any {\n if (obj === undefined || obj === null) {\n return obj\n }\n const jsonSafe = JSON.parse(JSON.stringify(obj))\n if (typeof jsonSafe === 'string') {\n return Buffer.from(jsonSafe, 'utf8').toString('utf8')\n } else if (Array.isArray(jsonSafe)) {\n return jsonSafe.map(sanitizeValues)\n } else if (jsonSafe && typeof jsonSafe === 'object') {\n return Object.fromEntries(Object.entries(jsonSafe).map(([k, v]) => [k, sanitizeValues(v)]))\n }\n return jsonSafe\n}\n\nexport const sendEventToPosthog = ({\n client,\n distinctId,\n traceId,\n model,\n provider,\n input,\n output,\n latency,\n baseURL,\n params,\n httpStatus = 200,\n usage = {},\n isError = false,\n error,\n tools,\n}: SendEventToPosthogParams): void => {\n if (client.capture) {\n // sanitize input and output for UTF-8 validity\n const safeInput = sanitizeValues(input)\n const safeOutput = sanitizeValues(output)\n const safeError = sanitizeValues(error)\n\n let errorData = {}\n if (isError) {\n errorData = {\n $ai_is_error: true,\n $ai_error: safeError,\n }\n }\n let costOverrideData = {}\n if (params.posthogCostOverride) {\n const inputCostUSD = (params.posthogCostOverride.inputCost ?? 0) * (usage.inputTokens ?? 0)\n const outputCostUSD = (params.posthogCostOverride.outputCost ?? 0) * (usage.outputTokens ?? 0)\n costOverrideData = {\n $ai_input_cost_usd: inputCostUSD,\n $ai_output_cost_usd: outputCostUSD,\n $ai_total_cost_usd: inputCostUSD + outputCostUSD,\n }\n }\n\n const additionalTokenValues = {\n ...(usage.reasoningTokens ? { $ai_reasoning_tokens: usage.reasoningTokens } : {}),\n ...(usage.cacheReadInputTokens ? { $ai_cache_read_input_tokens: usage.cacheReadInputTokens } : {}),\n ...(usage.cacheCreationInputTokens ? { $ai_cache_creation_input_tokens: usage.cacheCreationInputTokens } : {}),\n }\n\n client.capture({\n distinctId: distinctId ?? traceId,\n event: '$ai_generation',\n properties: {\n $ai_provider: params.posthogProviderOverride ?? provider,\n $ai_model: params.posthogModelOverride ?? model,\n $ai_model_parameters: getModelParams(params),\n $ai_input: withPrivacyMode(client, params.posthogPrivacyMode ?? false, safeInput),\n $ai_output_choices: withPrivacyMode(client, params.posthogPrivacyMode ?? false, safeOutput),\n $ai_http_status: httpStatus,\n $ai_input_tokens: usage.inputTokens ?? 0,\n $ai_output_tokens: usage.outputTokens ?? 0,\n ...additionalTokenValues,\n $ai_latency: latency,\n $ai_trace_id: traceId,\n $ai_base_url: baseURL,\n ...params.posthogProperties,\n ...(distinctId ? {} : { $process_person_profile: false }),\n ...(tools ? { $ai_tools: tools } : {}),\n ...errorData,\n ...costOverrideData,\n },\n groups: params.posthogGroups,\n })\n }\n}\n","import { 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","sanitizeValues","obj","jsonSafe","JSON","parse","stringify","Buffer","from","toString","Array","isArray","map","Object","fromEntries","entries","k","v","sendEventToPosthog","distinctId","traceId","model","provider","output","latency","baseURL","httpStatus","usage","isError","error","tools","capture","safeInput","safeOutput","safeError","errorData","$ai_is_error","$ai_error","costOverrideData","posthogCostOverride","inputCostUSD","inputCost","inputTokens","outputCostUSD","outputCost","outputTokens","$ai_input_cost_usd","$ai_output_cost_usd","$ai_total_cost_usd","additionalTokenValues","reasoningTokens","$ai_reasoning_tokens","cacheReadInputTokens","$ai_cache_read_input_tokens","cacheCreationInputTokens","$ai_cache_creation_input_tokens","event","properties","$ai_provider","posthogProviderOverride","$ai_model","posthogModelOverride","$ai_model_parameters","$ai_input","posthogPrivacyMode","$ai_output_choices","$ai_http_status","$ai_input_tokens","$ai_output_tokens","$ai_latency","$ai_trace_id","$ai_base_url","posthogProperties","$process_person_profile","$ai_tools","groups","posthogGroups","mapVercelParams","temperature","max_tokens","maxTokens","top_p","topP","frequency_penalty","frequencyPenalty","presence_penalty","presencePenalty","stop","stopSequences","stream","mapVercelPrompt","prompt","p","content","c","type","text","image","URL","mimeType","file","data","toolCallId","toolName","args","result","role","mapVercelOutput","object","reasoning","response","finishReason","warnings","providerMetadata","toolCalls","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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"}
1
+ {"version":3,"file":"index.esm.js","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'\n\ntype ChatCompletionCreateParamsBase = OpenAIOrignal.Chat.Completions.ChatCompletionCreateParams\ntype MessageCreateParams = AnthropicOriginal.Messages.MessageCreateParams\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 fullDebug?: boolean\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 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\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 fullDebug?: 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 = ({\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 fullDebug = false,\n}: SendEventToPosthogParams): void => {\n if (client.capture) {\n // sanitize input and output for UTF-8 validity\n const safeInput = sanitizeValues(input)\n const safeOutput = sanitizeValues(output)\n const safeError = sanitizeValues(error)\n\n let errorData = {}\n if (isError) {\n errorData = {\n $ai_is_error: true,\n $ai_error: safeError,\n }\n }\n let costOverrideData = {}\n if (params.posthogCostOverride) {\n const inputCostUSD = (params.posthogCostOverride.inputCost ?? 0) * (usage.inputTokens ?? 0)\n const outputCostUSD = (params.posthogCostOverride.outputCost ?? 0) * (usage.outputTokens ?? 0)\n costOverrideData = {\n $ai_input_cost_usd: inputCostUSD,\n $ai_output_cost_usd: outputCostUSD,\n $ai_total_cost_usd: inputCostUSD + outputCostUSD,\n }\n }\n\n const additionalTokenValues = {\n ...(usage.reasoningTokens ? { $ai_reasoning_tokens: usage.reasoningTokens } : {}),\n ...(usage.cacheReadInputTokens ? { $ai_cache_read_input_tokens: usage.cacheReadInputTokens } : {}),\n ...(usage.cacheCreationInputTokens ? { $ai_cache_creation_input_tokens: usage.cacheCreationInputTokens } : {}),\n }\n\n 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 if (fullDebug) {\n // @ts-ignore\n console.log('Sending event to PostHog', properties)\n }\n\n client.capture({\n distinctId: distinctId ?? traceId,\n event: '$ai_generation',\n properties,\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, truncate, MAX_OUTPUT_SIZE } 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 fullDebug?: 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 fullDebug?: 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_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 // normalize single inputs into an array of messages\n let promptsArray: any[]\n if (typeof prompt === 'string') {\n promptsArray = [{ role: 'user', content: prompt }]\n } else if (!Array.isArray(prompt)) {\n promptsArray = [prompt]\n } else {\n promptsArray = prompt\n }\n\n // Map and truncate individual content\n const inputs: PostHogInput[] = promptsArray.map((p) => {\n let content = {}\n if (Array.isArray(p.content)) {\n content = p.content.map((c: any) => {\n if (c.type === 'text') {\n return {\n type: 'text',\n content: truncate(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: truncate(p.content),\n }\n }\n return {\n role: p.role,\n content,\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 while (Buffer.byteLength(serialized, 'utf8') > MAX_OUTPUT_SIZE && inputs.length > 0) {\n // Remove oldest message\n inputs.shift()\n // add blank message to beginning of array\n inputs.unshift({ role: 'assistant', content: '[removed message due to size limit]' })\n serialized = JSON.stringify(inputs)\n }\n } catch (error) {\n console.error('Error stringifying inputs')\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 // normalize string results to object\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.reasoning ? { reasoning: normalizedResult.reasoning } : {}),\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: LanguageModelV1): 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: 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 fullDebug: options.fullDebug,\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: truncate(JSON.stringify(error)),\n fullDebug: options.fullDebug,\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 fullDebug: options.fullDebug,\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: truncate(JSON.stringify(error)),\n fullDebug: options.fullDebug,\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":["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","sanitizeValues","obj","jsonSafe","JSON","parse","stringify","Array","isArray","map","Object","fromEntries","entries","k","v","sendEventToPosthog","distinctId","traceId","model","provider","output","latency","baseURL","httpStatus","usage","isError","tools","fullDebug","capture","safeInput","safeOutput","safeError","errorData","$ai_is_error","$ai_error","costOverrideData","posthogCostOverride","inputCostUSD","inputCost","inputTokens","outputCostUSD","outputCost","outputTokens","$ai_input_cost_usd","$ai_output_cost_usd","$ai_total_cost_usd","additionalTokenValues","reasoningTokens","$ai_reasoning_tokens","cacheReadInputTokens","$ai_cache_read_input_tokens","cacheCreationInputTokens","$ai_cache_creation_input_tokens","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","log","event","groups","posthogGroups","mapVercelParams","temperature","max_tokens","maxTokens","top_p","topP","frequency_penalty","frequencyPenalty","presence_penalty","presencePenalty","stop","stopSequences","stream","mapVercelPrompt","prompt","promptsArray","role","content","inputs","p","c","type","text","image","URL","mimeType","file","data","toolCallId","toolName","args","result","serialized","byteLength","shift","unshift","mapVercelOutput","normalizedResult","object","reasoning","response","finishReason","warnings","providerMetadata","toolCalls","files","name","size","jsonOutput","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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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@posthog/ai",
3
- "version": "4.0.1",
3
+ "version": "4.2.0",
4
4
  "description": "PostHog Node.js AI integrations",
5
5
  "repository": {
6
6
  "type": "git",
package/src/utils.ts CHANGED
@@ -6,6 +6,10 @@ import AnthropicOriginal from '@anthropic-ai/sdk'
6
6
  type ChatCompletionCreateParamsBase = OpenAIOrignal.Chat.Completions.ChatCompletionCreateParams
7
7
  type MessageCreateParams = AnthropicOriginal.Messages.MessageCreateParams
8
8
 
9
+ // limit large outputs by truncating to 200kb (approx 200k bytes)
10
+ export const MAX_OUTPUT_SIZE = 200000
11
+ const STRING_FORMAT = 'utf8'
12
+
9
13
  export interface MonitoringParams {
10
14
  posthogDistinctId?: string
11
15
  posthogTraceId?: string
@@ -15,6 +19,7 @@ export interface MonitoringParams {
15
19
  posthogModelOverride?: string
16
20
  posthogProviderOverride?: string
17
21
  posthogCostOverride?: CostOverride
22
+ fullDebug?: boolean
18
23
  }
19
24
 
20
25
  export interface CostOverride {
@@ -108,6 +113,20 @@ export const withPrivacyMode = (client: PostHog, privacyMode: boolean, input: an
108
113
  return (client as any).privacy_mode || privacyMode ? null : input
109
114
  }
110
115
 
116
+ export const truncate = (str: string): string => {
117
+ try {
118
+ const buffer = Buffer.from(str, STRING_FORMAT)
119
+ if (buffer.length <= MAX_OUTPUT_SIZE) {
120
+ return str
121
+ }
122
+ const truncatedBuffer = buffer.slice(0, MAX_OUTPUT_SIZE)
123
+ return `${truncatedBuffer.toString(STRING_FORMAT)}... [truncated]`
124
+ } catch (error) {
125
+ console.error('Error truncating, likely not a string')
126
+ return str
127
+ }
128
+ }
129
+
111
130
  export type SendEventToPosthogParams = {
112
131
  client: PostHog
113
132
  distinctId?: string
@@ -130,6 +149,7 @@ export type SendEventToPosthogParams = {
130
149
  isError?: boolean
131
150
  error?: string
132
151
  tools?: any
152
+ fullDebug?: boolean
133
153
  }
134
154
 
135
155
  function sanitizeValues(obj: any): any {
@@ -138,7 +158,7 @@ function sanitizeValues(obj: any): any {
138
158
  }
139
159
  const jsonSafe = JSON.parse(JSON.stringify(obj))
140
160
  if (typeof jsonSafe === 'string') {
141
- return Buffer.from(jsonSafe, 'utf8').toString('utf8')
161
+ return Buffer.from(jsonSafe, STRING_FORMAT).toString(STRING_FORMAT)
142
162
  } else if (Array.isArray(jsonSafe)) {
143
163
  return jsonSafe.map(sanitizeValues)
144
164
  } else if (jsonSafe && typeof jsonSafe === 'object') {
@@ -163,6 +183,7 @@ export const sendEventToPosthog = ({
163
183
  isError = false,
164
184
  error,
165
185
  tools,
186
+ fullDebug = false,
166
187
  }: SendEventToPosthogParams): void => {
167
188
  if (client.capture) {
168
189
  // sanitize input and output for UTF-8 validity
@@ -194,28 +215,35 @@ export const sendEventToPosthog = ({
194
215
  ...(usage.cacheCreationInputTokens ? { $ai_cache_creation_input_tokens: usage.cacheCreationInputTokens } : {}),
195
216
  }
196
217
 
218
+ const properties = {
219
+ $ai_provider: params.posthogProviderOverride ?? provider,
220
+ $ai_model: params.posthogModelOverride ?? model,
221
+ $ai_model_parameters: getModelParams(params),
222
+ $ai_input: withPrivacyMode(client, params.posthogPrivacyMode ?? false, safeInput),
223
+ $ai_output_choices: withPrivacyMode(client, params.posthogPrivacyMode ?? false, safeOutput),
224
+ $ai_http_status: httpStatus,
225
+ $ai_input_tokens: usage.inputTokens ?? 0,
226
+ $ai_output_tokens: usage.outputTokens ?? 0,
227
+ ...additionalTokenValues,
228
+ $ai_latency: latency,
229
+ $ai_trace_id: traceId,
230
+ $ai_base_url: baseURL,
231
+ ...params.posthogProperties,
232
+ ...(distinctId ? {} : { $process_person_profile: false }),
233
+ ...(tools ? { $ai_tools: tools } : {}),
234
+ ...errorData,
235
+ ...costOverrideData,
236
+ }
237
+
238
+ if (fullDebug) {
239
+ // @ts-ignore
240
+ console.log('Sending event to PostHog', properties)
241
+ }
242
+
197
243
  client.capture({
198
244
  distinctId: distinctId ?? traceId,
199
245
  event: '$ai_generation',
200
- properties: {
201
- $ai_provider: params.posthogProviderOverride ?? provider,
202
- $ai_model: params.posthogModelOverride ?? model,
203
- $ai_model_parameters: getModelParams(params),
204
- $ai_input: withPrivacyMode(client, params.posthogPrivacyMode ?? false, safeInput),
205
- $ai_output_choices: withPrivacyMode(client, params.posthogPrivacyMode ?? false, safeOutput),
206
- $ai_http_status: httpStatus,
207
- $ai_input_tokens: usage.inputTokens ?? 0,
208
- $ai_output_tokens: usage.outputTokens ?? 0,
209
- ...additionalTokenValues,
210
- $ai_latency: latency,
211
- $ai_trace_id: traceId,
212
- $ai_base_url: baseURL,
213
- ...params.posthogProperties,
214
- ...(distinctId ? {} : { $process_person_profile: false }),
215
- ...(tools ? { $ai_tools: tools } : {}),
216
- ...errorData,
217
- ...costOverrideData,
218
- },
246
+ properties,
219
247
  groups: params.posthogGroups,
220
248
  })
221
249
  }