@posthog/ai 7.7.0 → 7.8.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.
@@ -4,7 +4,7 @@ var uuid = require('uuid');
4
4
  var buffer = require('buffer');
5
5
  var core = require('@posthog/core');
6
6
 
7
- var version = "7.7.0";
7
+ var version = "7.8.0";
8
8
 
9
9
  // Type guards for safer type checking
10
10
 
@@ -323,6 +323,7 @@ const sendEventToPosthog = async ({
323
323
  input,
324
324
  output,
325
325
  latency,
326
+ timeToFirstToken,
326
327
  baseURL,
327
328
  params,
328
329
  httpStatus = 200,
@@ -389,6 +390,9 @@ const sendEventToPosthog = async ({
389
390
  } : {}),
390
391
  ...additionalTokenValues,
391
392
  $ai_latency: latency,
393
+ ...(timeToFirstToken !== undefined ? {
394
+ $ai_time_to_first_token: timeToFirstToken
395
+ } : {}),
392
396
  $ai_trace_id: traceId,
393
397
  $ai_base_url: baseURL,
394
398
  ...params.posthogProperties,
@@ -818,6 +822,7 @@ const wrapVercelLanguageModel = (model, phClient, options) => {
818
822
  doStream: {
819
823
  value: async params => {
820
824
  const startTime = Date.now();
825
+ let firstTokenTime;
821
826
  let generatedText = '';
822
827
  let reasoningText = '';
823
828
  let usage = {};
@@ -842,14 +847,23 @@ const wrapVercelLanguageModel = (model, phClient, options) => {
842
847
  transform(chunk, controller) {
843
848
  // Handle streaming patterns - compatible with both V2 and V3
844
849
  if (chunk.type === 'text-delta') {
850
+ if (firstTokenTime === undefined) {
851
+ firstTokenTime = Date.now();
852
+ }
845
853
  generatedText += chunk.delta;
846
854
  }
847
855
  if (chunk.type === 'reasoning-delta') {
856
+ if (firstTokenTime === undefined) {
857
+ firstTokenTime = Date.now();
858
+ }
848
859
  reasoningText += chunk.delta;
849
860
  }
850
861
 
851
862
  // Handle tool call chunks
852
863
  if (chunk.type === 'tool-input-start') {
864
+ if (firstTokenTime === undefined) {
865
+ firstTokenTime = Date.now();
866
+ }
853
867
  // Initialize a new tool call
854
868
  toolCallsInProgress.set(chunk.id, {
855
869
  toolCallId: chunk.id,
@@ -868,6 +882,9 @@ const wrapVercelLanguageModel = (model, phClient, options) => {
868
882
  // Tool call is complete, keep it in the map for final processing
869
883
  }
870
884
  if (chunk.type === 'tool-call') {
885
+ if (firstTokenTime === undefined) {
886
+ firstTokenTime = Date.now();
887
+ }
871
888
  // Direct tool call chunk (complete tool call)
872
889
  toolCallsInProgress.set(chunk.toolCallId, {
873
890
  toolCallId: chunk.toolCallId,
@@ -891,6 +908,7 @@ const wrapVercelLanguageModel = (model, phClient, options) => {
891
908
  },
892
909
  flush: async () => {
893
910
  const latency = (Date.now() - startTime) / 1000;
911
+ const timeToFirstToken = firstTokenTime !== undefined ? (firstTokenTime - startTime) / 1000 : undefined;
894
912
  // Build content array similar to mapVercelOutput structure
895
913
  const content = [];
896
914
  if (reasoningText) {
@@ -946,6 +964,7 @@ const wrapVercelLanguageModel = (model, phClient, options) => {
946
964
  input: mergedOptions.posthogPrivacyMode ? '' : mapVercelPrompt(params.prompt),
947
965
  output: output,
948
966
  latency,
967
+ timeToFirstToken,
949
968
  baseURL,
950
969
  params: mergedParams,
951
970
  httpStatus: 200,
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","sources":["../../src/typeGuards.ts","../../src/sanitization.ts","../../src/utils.ts","../../src/vercel/middleware.ts"],"sourcesContent":["// Type guards for safer type checking\n\nexport const isString = (value: unknown): value is string => {\n return typeof value === 'string'\n}\n\nexport const isObject = (value: unknown): value is Record<string, unknown> => {\n return value !== null && typeof value === 'object' && !Array.isArray(value)\n}\n","import { isString, isObject } from './typeGuards'\n\nconst REDACTED_IMAGE_PLACEHOLDER = '[base64 image redacted]'\n\n// ============================================\n// Multimodal Feature Toggle\n// ============================================\n\nconst isMultimodalEnabled = (): boolean => {\n const val = process.env._INTERNAL_LLMA_MULTIMODAL || ''\n return val.toLowerCase() === 'true' || val === '1' || val.toLowerCase() === 'yes'\n}\n\n// ============================================\n// Base64 Detection Helpers\n// ============================================\n\nconst isBase64DataUrl = (str: string): boolean => {\n return /^data:([^;]+);base64,/.test(str)\n}\n\nconst isValidUrl = (str: string): boolean => {\n try {\n new URL(str)\n return true\n } catch {\n // Not an absolute URL, check if it's a relative URL or path\n return str.startsWith('/') || str.startsWith('./') || str.startsWith('../')\n }\n}\n\nconst isRawBase64 = (str: string): boolean => {\n // Skip if it's a valid URL or path\n if (isValidUrl(str)) {\n return false\n }\n\n // Check if it's a valid base64 string\n // Base64 images are typically at least a few hundred chars, but we'll be conservative\n return str.length > 20 && /^[A-Za-z0-9+/]+=*$/.test(str)\n}\n\nexport function redactBase64DataUrl(str: string): string\nexport function redactBase64DataUrl(str: unknown): unknown\nexport function redactBase64DataUrl(str: unknown): unknown {\n if (isMultimodalEnabled()) return str\n if (!isString(str)) return str\n\n // Check for data URL format\n if (isBase64DataUrl(str)) {\n return REDACTED_IMAGE_PLACEHOLDER\n }\n\n // Check for raw base64 (Vercel sends raw base64 for inline images)\n if (isRawBase64(str)) {\n return REDACTED_IMAGE_PLACEHOLDER\n }\n\n return str\n}\n\n// ============================================\n// Common Message Processing\n// ============================================\n\ntype ContentTransformer = (item: unknown) => unknown\n\nconst processMessages = (messages: unknown, transformContent: ContentTransformer): unknown => {\n if (!messages) return messages\n\n const processContent = (content: unknown): unknown => {\n if (typeof content === 'string') return content\n\n if (!content) return content\n\n if (Array.isArray(content)) {\n return content.map(transformContent)\n }\n\n // Handle single object content\n return transformContent(content)\n }\n\n const processMessage = (msg: unknown): unknown => {\n if (!isObject(msg) || !('content' in msg)) return msg\n return { ...msg, content: processContent(msg.content) }\n }\n\n // Handle both arrays and single messages\n if (Array.isArray(messages)) {\n return messages.map(processMessage)\n }\n\n return processMessage(messages)\n}\n\n// ============================================\n// Provider-Specific Image Sanitizers\n// ============================================\n\nconst sanitizeOpenAIImage = (item: unknown): unknown => {\n if (!isObject(item)) return item\n\n // Handle image_url format\n if (item.type === 'image_url' && 'image_url' in item && isObject(item.image_url) && 'url' in item.image_url) {\n return {\n ...item,\n image_url: {\n ...item.image_url,\n url: redactBase64DataUrl(item.image_url.url),\n },\n }\n }\n\n // Handle audio format\n if (item.type === 'audio' && 'data' in item) {\n if (isMultimodalEnabled()) return item\n return { ...item, data: REDACTED_IMAGE_PLACEHOLDER }\n }\n\n return item\n}\n\nconst sanitizeOpenAIResponseImage = (item: unknown): unknown => {\n if (!isObject(item)) return item\n\n // Handle input_image format\n if (item.type === 'input_image' && 'image_url' in item) {\n return {\n ...item,\n image_url: redactBase64DataUrl(item.image_url),\n }\n }\n\n return item\n}\n\nconst sanitizeAnthropicImage = (item: unknown): unknown => {\n if (isMultimodalEnabled()) return item\n if (!isObject(item)) return item\n\n // Handle Anthropic's image and document formats (same structure, different type field)\n if (\n (item.type === 'image' || item.type === 'document') &&\n 'source' in item &&\n isObject(item.source) &&\n item.source.type === 'base64' &&\n 'data' in item.source\n ) {\n return {\n ...item,\n source: {\n ...item.source,\n data: REDACTED_IMAGE_PLACEHOLDER,\n },\n }\n }\n\n return item\n}\n\nconst sanitizeGeminiPart = (part: unknown): unknown => {\n if (isMultimodalEnabled()) return part\n if (!isObject(part)) return part\n\n // Handle Gemini's inline data format (images, audio, PDFs all use inlineData)\n if ('inlineData' in part && isObject(part.inlineData) && 'data' in part.inlineData) {\n return {\n ...part,\n inlineData: {\n ...part.inlineData,\n data: REDACTED_IMAGE_PLACEHOLDER,\n },\n }\n }\n\n return part\n}\n\nconst processGeminiItem = (item: unknown): unknown => {\n if (!isObject(item)) return item\n\n // If it has parts, process them\n if ('parts' in item && item.parts) {\n const parts = Array.isArray(item.parts) ? item.parts.map(sanitizeGeminiPart) : sanitizeGeminiPart(item.parts)\n\n return { ...item, parts }\n }\n\n return item\n}\n\nconst sanitizeLangChainImage = (item: unknown): unknown => {\n if (!isObject(item)) return item\n\n // OpenAI style\n if (item.type === 'image_url' && 'image_url' in item && isObject(item.image_url) && 'url' in item.image_url) {\n return {\n ...item,\n image_url: {\n ...item.image_url,\n url: redactBase64DataUrl(item.image_url.url),\n },\n }\n }\n\n // Direct image with data field\n if (item.type === 'image' && 'data' in item) {\n return { ...item, data: redactBase64DataUrl(item.data) }\n }\n\n // Anthropic style\n if (item.type === 'image' && 'source' in item && isObject(item.source) && 'data' in item.source) {\n if (isMultimodalEnabled()) return item\n return {\n ...item,\n source: {\n ...item.source,\n data: redactBase64DataUrl(item.source.data),\n },\n }\n }\n\n // Google style\n if (item.type === 'media' && 'data' in item) {\n return { ...item, data: redactBase64DataUrl(item.data) }\n }\n\n return item\n}\n\n// Export individual sanitizers for tree-shaking\nexport const sanitizeOpenAI = (data: unknown): unknown => {\n return processMessages(data, sanitizeOpenAIImage)\n}\n\nexport const sanitizeOpenAIResponse = (data: unknown): unknown => {\n return processMessages(data, sanitizeOpenAIResponseImage)\n}\n\nexport const sanitizeAnthropic = (data: unknown): unknown => {\n return processMessages(data, sanitizeAnthropicImage)\n}\n\nexport const sanitizeGemini = (data: unknown): unknown => {\n // Gemini has a different structure with 'parts' directly on items instead of 'content'\n // So we need custom processing instead of using processMessages\n if (!data) return data\n\n if (Array.isArray(data)) {\n return data.map(processGeminiItem)\n }\n\n return processGeminiItem(data)\n}\n\nexport const sanitizeLangChain = (data: unknown): unknown => {\n return processMessages(data, sanitizeLangChainImage)\n}\n","import { EventMessage, 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 { ResponseCreateParamsWithTools } from 'openai/lib/ResponsesParser'\nimport type { Tool as GeminiTool } from '@google/genai'\nimport type { FormattedMessage, FormattedContent, TokenUsage } from './types'\nimport { version } from '../package.json'\nimport { v4 as uuidv4 } from 'uuid'\nimport { isString } from './typeGuards'\nimport { uuidv7, ErrorTracking as CoreErrorTracking } from '@posthog/core'\nimport { redactBase64DataUrl } from './sanitization'\n\ntype ChatCompletionCreateParamsBase = OpenAIOrignal.Chat.Completions.ChatCompletionCreateParams\ntype MessageCreateParams = AnthropicOriginal.Messages.MessageCreateParams\ntype ResponseCreateParams = OpenAIOrignal.Responses.ResponseCreateParams\ntype EmbeddingCreateParams = OpenAIOrignal.EmbeddingCreateParams\ntype TranscriptionCreateParams = OpenAIOrignal.Audio.Transcriptions.TranscriptionCreateParams\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\n/**\n * Safely converts content to a string, preserving structure for objects/arrays.\n * - If content is already a string, returns it as-is\n * - If content is an object or array, stringifies it with JSON.stringify to preserve structure\n * - Otherwise, converts to string with String()\n *\n * This prevents the \"[object Object]\" bug when objects are naively converted to strings.\n *\n * @param content - The content to convert to a string\n * @returns A string representation that preserves structure for complex types\n */\nexport function toContentString(content: unknown): string {\n if (typeof content === 'string') {\n return content\n }\n if (content !== undefined && content !== null && typeof content === 'object') {\n try {\n return JSON.stringify(content)\n } catch {\n // Fallback for circular refs, BigInt, or objects with throwing toJSON\n return String(content)\n }\n }\n return String(content)\n}\n\nexport interface MonitoringEventPropertiesWithDefaults {\n distinctId?: string\n traceId: string\n properties?: Record<string, any>\n privacyMode: boolean\n groups?: Record<string, any>\n modelOverride?: string\n providerOverride?: string\n costOverride?: CostOverride\n captureImmediate?: boolean\n}\n\nexport type MonitoringEventProperties = Partial<MonitoringEventPropertiesWithDefaults>\n\nexport type MonitoringParams = {\n [K in keyof MonitoringEventProperties as `posthog${Capitalize<string & K>}`]: MonitoringEventProperties[K]\n}\n\nexport interface CostOverride {\n inputCost: number\n outputCost: number\n}\n\nexport const getModelParams = (\n params:\n | ((\n | ChatCompletionCreateParamsBase\n | MessageCreateParams\n | ResponseCreateParams\n | ResponseCreateParamsWithTools\n | EmbeddingCreateParams\n | TranscriptionCreateParams\n ) &\n MonitoringParams)\n | 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 'language',\n 'response_format',\n 'timestamp_granularities',\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\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 // Handle audio output (gpt-4o-audio-preview)\n if (choice.message.audio) {\n content.push({\n type: 'audio',\n ...choice.message.audio,\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 } else if (part.inlineData) {\n // Handle audio/media inline data\n const mimeType = part.inlineData.mimeType || 'audio/pcm'\n let data = part.inlineData.data\n\n // Handle binary data (Buffer/Uint8Array -> base64)\n if (data instanceof Uint8Array || Buffer.isBuffer(data)) {\n data = Buffer.from(data).toString('base64')\n }\n\n // Sanitize base64 data for images and other large inline data\n data = redactBase64DataUrl(data)\n\n content.push({\n type: 'audio',\n mime_type: mimeType,\n data: data,\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\nfunction toSafeString(input: unknown): string {\n if (input === undefined || input === null) {\n return ''\n }\n if (typeof input === 'string') {\n return input\n }\n try {\n return JSON.stringify(input)\n } catch {\n console.warn('Failed to stringify input', input)\n return ''\n }\n}\n\nexport const truncate = (input: unknown): string => {\n const str = toSafeString(input)\n if (str === '') {\n return ''\n }\n\n // Check if we need to truncate and ensure STRING_FORMAT is respected\n const encoder = new TextEncoder()\n const buffer = encoder.encode(str)\n if (buffer.length <= MAX_OUTPUT_SIZE) {\n // Ensure STRING_FORMAT is respected\n return new TextDecoder(STRING_FORMAT).decode(buffer)\n }\n\n // Truncate the buffer and ensure a valid string is returned\n const truncatedBuffer = buffer.slice(0, MAX_OUTPUT_SIZE)\n // fatal: false means we get U+FFFD at the end if truncation broke the encoding\n const decoder = new TextDecoder(STRING_FORMAT, { fatal: false })\n let truncatedStr = decoder.decode(truncatedBuffer)\n if (truncatedStr.endsWith('\\uFFFD')) {\n truncatedStr = truncatedStr.slice(0, -1)\n }\n return `${truncatedStr}... [truncated]`\n}\n\n/**\n * Calculate web search count from raw API response.\n *\n * Uses a two-tier detection strategy:\n * Priority 1 (Exact Count): Count actual web search calls when available\n * Priority 2 (Binary Detection): Return 1 if web search indicators are present, 0 otherwise\n *\n * @param result - Raw API response from any provider (OpenAI, Perplexity, OpenRouter, Gemini, etc.)\n * @returns Number of web searches performed (exact count or binary 1/0)\n */\nexport function calculateWebSearchCount(result: unknown): number {\n if (!result || typeof result !== 'object') {\n return 0\n }\n\n // Priority 1: Exact Count\n // Check for OpenAI Responses API web_search_call items\n if ('output' in result && Array.isArray(result.output)) {\n let count = 0\n\n for (const item of result.output) {\n if (typeof item === 'object' && item !== null && 'type' in item && item.type === 'web_search_call') {\n count++\n }\n }\n\n if (count > 0) {\n return count\n }\n }\n\n // Priority 2: Binary Detection (1 or 0)\n\n // Check for citations at root level (Perplexity)\n if ('citations' in result && Array.isArray(result.citations) && result.citations.length > 0) {\n return 1\n }\n\n // Check for search_results at root level (Perplexity via OpenRouter)\n if ('search_results' in result && Array.isArray(result.search_results) && result.search_results.length > 0) {\n return 1\n }\n\n // Check for usage.search_context_size (Perplexity via OpenRouter)\n if ('usage' in result && typeof result.usage === 'object' && result.usage !== null) {\n if ('search_context_size' in result.usage && result.usage.search_context_size) {\n return 1\n }\n }\n\n // Check for annotations with url_citation in choices[].message or choices[].delta (OpenAI/Perplexity)\n if ('choices' in result && Array.isArray(result.choices)) {\n for (const choice of result.choices) {\n if (typeof choice === 'object' && choice !== null) {\n // Check both message (non-streaming) and delta (streaming) for annotations\n const content = ('message' in choice ? choice.message : null) || ('delta' in choice ? choice.delta : null)\n\n if (typeof content === 'object' && content !== null && 'annotations' in content) {\n const annotations = content.annotations\n\n if (Array.isArray(annotations)) {\n const hasUrlCitation = annotations.some((ann: unknown) => {\n return typeof ann === 'object' && ann !== null && 'type' in ann && ann.type === 'url_citation'\n })\n\n if (hasUrlCitation) {\n return 1\n }\n }\n }\n }\n }\n }\n\n // Check for annotations in output[].content[] (OpenAI Responses API)\n if ('output' in result && Array.isArray(result.output)) {\n for (const item of result.output) {\n if (typeof item === 'object' && item !== null && 'content' in item) {\n const content = item.content\n\n if (Array.isArray(content)) {\n for (const contentItem of content) {\n if (typeof contentItem === 'object' && contentItem !== null && 'annotations' in contentItem) {\n const annotations = contentItem.annotations\n\n if (Array.isArray(annotations)) {\n const hasUrlCitation = annotations.some((ann: unknown) => {\n return typeof ann === 'object' && ann !== null && 'type' in ann && ann.type === 'url_citation'\n })\n\n if (hasUrlCitation) {\n return 1\n }\n }\n }\n }\n }\n }\n }\n }\n\n // Check for grounding_metadata (Gemini)\n if ('candidates' in result && Array.isArray(result.candidates)) {\n for (const candidate of result.candidates) {\n if (\n typeof candidate === 'object' &&\n candidate !== null &&\n 'grounding_metadata' in candidate &&\n candidate.grounding_metadata\n ) {\n return 1\n }\n }\n }\n\n return 0\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 if (params.tools) {\n return params.tools\n }\n\n return null\n }\n\n return null\n}\n\nexport enum AIEvent {\n Generation = '$ai_generation',\n Embedding = '$ai_embedding',\n}\n\nexport type SendEventToPosthogParams = {\n client: PostHog\n eventType?: AIEvent\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: (\n | ChatCompletionCreateParamsBase\n | MessageCreateParams\n | ResponseCreateParams\n | ResponseCreateParamsWithTools\n | EmbeddingCreateParams\n | TranscriptionCreateParams\n ) &\n MonitoringParams\n error?: unknown\n exceptionId?: 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\nconst POSTHOG_PARAMS_MAP: Record<keyof MonitoringParams, string> = {\n posthogDistinctId: 'distinctId',\n posthogTraceId: 'traceId',\n posthogProperties: 'properties',\n posthogPrivacyMode: 'privacyMode',\n posthogGroups: 'groups',\n posthogModelOverride: 'modelOverride',\n posthogProviderOverride: 'providerOverride',\n posthogCostOverride: 'costOverride',\n posthogCaptureImmediate: 'captureImmediate',\n}\n\nexport function extractPosthogParams<T>(body: T & MonitoringParams): {\n providerParams: T\n posthogParams: MonitoringEventPropertiesWithDefaults\n} {\n const providerParams: Record<string, unknown> = {}\n const posthogParams: Record<string, unknown> = {}\n\n for (const [key, value] of Object.entries(body)) {\n if (POSTHOG_PARAMS_MAP[key as keyof MonitoringParams]) {\n posthogParams[POSTHOG_PARAMS_MAP[key as keyof MonitoringParams]] = value\n } else if (key.startsWith('posthog')) {\n console.warn(`Unknown Posthog parameter ${key}`)\n } else {\n providerParams[key] = value\n }\n }\n\n return {\n providerParams: providerParams as T,\n posthogParams: addDefaults(posthogParams),\n }\n}\n\nfunction addDefaults(params: MonitoringEventProperties): MonitoringEventPropertiesWithDefaults {\n return {\n ...params,\n privacyMode: params.privacyMode ?? false,\n traceId: params.traceId ?? uuidv4(),\n }\n}\n\nexport const sendEventWithErrorToPosthog = async ({\n client,\n traceId,\n error,\n ...args\n}: Omit<SendEventToPosthogParams, 'error' | 'httpStatus'> &\n Required<Pick<SendEventToPosthogParams, 'error'>>): Promise<unknown> => {\n const httpStatus =\n error && typeof error === 'object' && 'status' in error ? ((error as { status?: number }).status ?? 500) : 500\n\n const properties = { client, traceId, httpStatus, error: JSON.stringify(error), ...args }\n const enrichedError = error as CoreErrorTracking.PreviouslyCapturedError\n\n if (client.options?.enableExceptionAutocapture) {\n // assign a uuid that can be used to link the trace and exception events\n const exceptionId = uuidv7()\n client.captureException(error, undefined, { $ai_trace_id: traceId }, exceptionId)\n enrichedError.__posthog_previously_captured_error = true\n properties.exceptionId = exceptionId\n }\n\n await sendEventToPosthog(properties)\n\n return enrichedError\n}\n\nexport const sendEventToPosthog = async ({\n client,\n eventType = AIEvent.Generation,\n distinctId,\n traceId,\n model,\n provider,\n input,\n output,\n latency,\n baseURL,\n params,\n httpStatus = 200,\n usage = {},\n error,\n exceptionId,\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 (error) {\n errorData = {\n $ai_is_error: true,\n $ai_error: safeError,\n $exception_event_id: exceptionId,\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 ...(usage.webSearchCount ? { $ai_web_search_count: usage.webSearchCount } : {}),\n ...(usage.rawUsage ? { $ai_usage: usage.rawUsage } : {}),\n }\n\n const properties = {\n $ai_lib: 'posthog-ai',\n $ai_lib_version: version,\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 ...(usage.outputTokens !== undefined ? { $ai_output_tokens: usage.outputTokens } : {}),\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: EventMessage = {\n distinctId: distinctId ?? traceId,\n event: eventType,\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 return Promise.resolve()\n}\n\nexport function formatOpenAIResponsesInput(input: unknown, instructions?: string | null): FormattedMessage[] {\n const messages: FormattedMessage[] = []\n\n if (instructions) {\n messages.push({\n role: 'system',\n content: instructions,\n })\n }\n\n if (Array.isArray(input)) {\n for (const item of input) {\n if (typeof item === 'string') {\n messages.push({ role: 'user', content: item })\n } else if (item && typeof item === 'object') {\n const obj = item as Record<string, unknown>\n const role = isString(obj.role) ? obj.role : 'user'\n\n // Handle content properly - preserve structure for objects/arrays\n const content = obj.content ?? obj.text ?? item\n messages.push({ role, content: toContentString(content) })\n } else {\n messages.push({ role: 'user', content: toContentString(item) })\n }\n }\n } else if (typeof input === 'string') {\n messages.push({ role: 'user', content: input })\n } else if (input) {\n messages.push({ role: 'user', content: toContentString(input) })\n }\n\n return messages\n}\n","import type {\n LanguageModelV2,\n LanguageModelV2CallOptions,\n LanguageModelV2Content,\n LanguageModelV2Prompt,\n LanguageModelV2StreamPart,\n LanguageModelV3,\n LanguageModelV3CallOptions,\n LanguageModelV3Content,\n LanguageModelV3Prompt,\n LanguageModelV3StreamPart,\n} from '@ai-sdk/provider'\nimport { v4 as uuidv4 } from 'uuid'\nimport { PostHog } from 'posthog-node'\nimport {\n CostOverride,\n sendEventToPosthog,\n truncate,\n MAX_OUTPUT_SIZE,\n extractAvailableToolCalls,\n toContentString,\n calculateWebSearchCount,\n sendEventWithErrorToPosthog,\n} from '../utils'\nimport { Buffer } from 'buffer'\nimport { redactBase64DataUrl } from '../sanitization'\nimport { isString } from '../typeGuards'\n\n// Union types for dual version support\ntype LanguageModel = LanguageModelV2 | LanguageModelV3\ntype LanguageModelCallOptions = LanguageModelV2CallOptions | LanguageModelV3CallOptions\ntype LanguageModelPrompt = LanguageModelV2Prompt | LanguageModelV3Prompt\ntype LanguageModelContent = LanguageModelV2Content | LanguageModelV3Content\ntype LanguageModelStreamPart = LanguageModelV2StreamPart | LanguageModelV3StreamPart\n\n// Type guards\nfunction isV3Model(model: LanguageModel): model is LanguageModelV3 {\n return model.specificationVersion === 'v3'\n}\n\nfunction isV2Model(model: LanguageModel): model is LanguageModelV2 {\n return model.specificationVersion === 'v2'\n}\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 PostHogInput {\n role: string\n type?: string\n content?:\n | string\n | {\n [key: string]: any\n }\n}\n\n// Content types for the output array\ntype OutputContentItem =\n | { type: 'text'; text: string }\n | { type: 'reasoning'; text: string }\n | { type: 'tool-call'; id: string; function: { name: string; arguments: string } }\n | { type: 'file'; name: string; mediaType: string; data: string }\n | { type: 'source'; sourceType: string; id: string; url: string; title: string }\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: LanguageModelPrompt): 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(toContentString(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 // For file type, check if it's a data URL and redact if needed\n let fileData: string\n\n const contentData: unknown = c.data\n\n if (contentData instanceof URL) {\n fileData = contentData.toString()\n } else if (isString(contentData)) {\n // Redact base64 data URLs and raw base64 to prevent oversized events\n fileData = redactBase64DataUrl(contentData)\n } else {\n fileData = 'raw files not supported'\n }\n\n return {\n type: 'file',\n file: fileData,\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(toContentString(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: LanguageModelContent[]): PostHogInput[] => {\n const content: OutputContentItem[] = 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 fileData = redactBase64DataUrl(item.data)\n\n // If not redacted and still large, replace with size indicator\n if (fileData === item.data && item.data.length > 1000) {\n fileData = `[${item.mediaType} file - ${item.data.length} bytes]`\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 {\n console.error('Error stringifying output')\n return []\n }\n}\n\nconst extractProvider = (model: LanguageModel): string => {\n const provider = model.provider.toLowerCase()\n const providerName = provider.split('.')[0]\n return providerName\n}\n\n// Extract web search count from provider metadata (works for both V2 and V3)\nconst extractWebSearchCount = (providerMetadata: unknown, usage: any): number => {\n // Try Anthropic-specific extraction\n if (\n providerMetadata &&\n typeof providerMetadata === 'object' &&\n 'anthropic' in providerMetadata &&\n providerMetadata.anthropic &&\n typeof providerMetadata.anthropic === 'object' &&\n 'server_tool_use' in providerMetadata.anthropic\n ) {\n const serverToolUse = providerMetadata.anthropic.server_tool_use\n if (\n serverToolUse &&\n typeof serverToolUse === 'object' &&\n 'web_search_requests' in serverToolUse &&\n typeof serverToolUse.web_search_requests === 'number'\n ) {\n return serverToolUse.web_search_requests\n }\n }\n\n // Fall back to generic calculation\n return calculateWebSearchCount({\n usage,\n providerMetadata,\n })\n}\n\n// Extract additional token values from provider metadata\nconst extractAdditionalTokenValues = (providerMetadata: unknown): Record<string, any> => {\n if (\n providerMetadata &&\n typeof providerMetadata === 'object' &&\n 'anthropic' in providerMetadata &&\n providerMetadata.anthropic &&\n typeof providerMetadata.anthropic === 'object' &&\n 'cacheCreationInputTokens' in providerMetadata.anthropic\n ) {\n return {\n cacheCreationInputTokens: providerMetadata.anthropic.cacheCreationInputTokens,\n }\n }\n return {}\n}\n\n// For Anthropic providers in V3, inputTokens.total is the sum of all tokens (uncached + cache read + cache write).\n// Our cost calculation expects inputTokens to be only the uncached portion for Anthropic.\n// This helper subtracts cache tokens from inputTokens for Anthropic V3 models.\nconst adjustAnthropicV3CacheTokens = (\n model: LanguageModel,\n provider: string,\n usage: { inputTokens?: number; cacheReadInputTokens?: unknown; cacheCreationInputTokens?: unknown }\n): void => {\n if (isV3Model(model) && provider.toLowerCase().includes('anthropic')) {\n const cacheReadTokens = (usage.cacheReadInputTokens as number) || 0\n const cacheWriteTokens = (usage.cacheCreationInputTokens as number) || 0\n const cacheTokens = cacheReadTokens + cacheWriteTokens\n if (usage.inputTokens && cacheTokens > 0) {\n usage.inputTokens = Math.max(usage.inputTokens - cacheTokens, 0)\n }\n }\n}\n\n// Helper to extract numeric token value from V2 (number) or V3 (object with .total) usage formats\nconst extractTokenCount = (value: unknown): number | undefined => {\n if (typeof value === 'number') {\n return value\n }\n if (\n value &&\n typeof value === 'object' &&\n 'total' in value &&\n typeof (value as { total: unknown }).total === 'number'\n ) {\n return (value as { total: number }).total\n }\n return undefined\n}\n\n// Helper to extract reasoning tokens from V2 (usage.reasoningTokens) or V3 (usage.outputTokens.reasoning)\nconst extractReasoningTokens = (usage: Record<string, unknown>): unknown => {\n // V2 style: top-level reasoningTokens\n if ('reasoningTokens' in usage) {\n return usage.reasoningTokens\n }\n // V3 style: nested in outputTokens.reasoning\n if (\n 'outputTokens' in usage &&\n usage.outputTokens &&\n typeof usage.outputTokens === 'object' &&\n 'reasoning' in usage.outputTokens\n ) {\n return (usage.outputTokens as { reasoning: unknown }).reasoning\n }\n return undefined\n}\n\n// Helper to extract cached input tokens from V2 (usage.cachedInputTokens) or V3 (usage.inputTokens.cacheRead)\nconst extractCacheReadTokens = (usage: Record<string, unknown>): unknown => {\n // V2 style: top-level cachedInputTokens\n if ('cachedInputTokens' in usage) {\n return usage.cachedInputTokens\n }\n // V3 style: nested in inputTokens.cacheRead\n if (\n 'inputTokens' in usage &&\n usage.inputTokens &&\n typeof usage.inputTokens === 'object' &&\n 'cacheRead' in usage.inputTokens\n ) {\n return (usage.inputTokens as { cacheRead: unknown }).cacheRead\n }\n return undefined\n}\n\n/**\n * Wraps a Vercel AI SDK language model (V2 or V3) with PostHog tracing.\n * Automatically detects the model version and applies appropriate instrumentation.\n */\nexport const wrapVercelLanguageModel = <T extends LanguageModel>(\n model: T,\n phClient: PostHog,\n options: ClientOptions\n): T => {\n const traceId = options.posthogTraceId ?? uuidv4()\n const mergedOptions = {\n ...options,\n posthogTraceId: traceId,\n posthogDistinctId: options.posthogDistinctId,\n posthogProperties: {\n ...options.posthogProperties,\n $ai_framework: 'vercel',\n $ai_framework_version: model.specificationVersion === 'v3' ? '6' : '5',\n },\n }\n\n // Create wrapped model using Object.create to preserve the prototype chain\n // This automatically inherits all properties (including getters) from the model\n const wrappedModel = Object.create(model, {\n doGenerate: {\n value: async (params: LanguageModelCallOptions) => {\n const startTime = Date.now()\n const mergedParams = {\n ...mergedOptions,\n ...mapVercelParams(params),\n }\n const availableTools = extractAvailableToolCalls('vercel', params)\n\n try {\n const result = await model.doGenerate(params as any)\n const modelId =\n mergedOptions.posthogModelOverride ?? (result.response?.modelId ? result.response.modelId : model.modelId)\n const provider = mergedOptions.posthogProviderOverride ?? extractProvider(model)\n const baseURL = '' // cannot currently get baseURL from vercel\n const content = mapVercelOutput(result.content as LanguageModelContent[])\n const latency = (Date.now() - startTime) / 1000\n const providerMetadata = result.providerMetadata\n const additionalTokenValues = extractAdditionalTokenValues(providerMetadata)\n\n const webSearchCount = extractWebSearchCount(providerMetadata, result.usage)\n\n // V2 usage has simple numbers, V3 has objects with .total - normalize both\n const usageObj = result.usage as Record<string, unknown>\n\n // Extract raw response for providers that include detailed usage metadata\n // For Gemini, candidatesTokensDetails is in result.response.body.usageMetadata\n const rawUsageData: Record<string, unknown> = {\n usage: result.usage,\n providerMetadata,\n }\n\n // Include response body usageMetadata if it contains detailed token breakdown (e.g., candidatesTokensDetails)\n if (result.response && typeof result.response === 'object') {\n const responseBody = result.response.body\n if (responseBody && typeof responseBody === 'object' && 'usageMetadata' in responseBody) {\n rawUsageData.rawResponse = {\n usageMetadata: responseBody.usageMetadata,\n }\n }\n }\n\n const usage = {\n inputTokens: extractTokenCount(result.usage.inputTokens),\n outputTokens: extractTokenCount(result.usage.outputTokens),\n reasoningTokens: extractReasoningTokens(usageObj),\n cacheReadInputTokens: extractCacheReadTokens(usageObj),\n webSearchCount,\n ...additionalTokenValues,\n rawUsage: rawUsageData,\n }\n\n adjustAnthropicV3CacheTokens(model, provider, usage)\n\n await sendEventToPosthog({\n client: phClient,\n distinctId: mergedOptions.posthogDistinctId,\n traceId: mergedOptions.posthogTraceId ?? uuidv4(),\n model: modelId,\n provider: provider,\n input: mergedOptions.posthogPrivacyMode ? '' : mapVercelPrompt(params.prompt as LanguageModelPrompt),\n output: content,\n latency,\n baseURL,\n params: mergedParams as any,\n httpStatus: 200,\n usage,\n tools: availableTools,\n captureImmediate: mergedOptions.posthogCaptureImmediate,\n })\n\n return result\n } catch (error: unknown) {\n const modelId = model.modelId\n const enrichedError = await sendEventWithErrorToPosthog({\n client: phClient,\n distinctId: mergedOptions.posthogDistinctId,\n traceId: mergedOptions.posthogTraceId ?? uuidv4(),\n model: modelId,\n provider: model.provider,\n input: mergedOptions.posthogPrivacyMode ? '' : mapVercelPrompt(params.prompt as LanguageModelPrompt),\n output: [],\n latency: 0,\n baseURL: '',\n params: mergedParams as any,\n usage: {\n inputTokens: 0,\n outputTokens: 0,\n },\n error: error,\n tools: availableTools,\n captureImmediate: mergedOptions.posthogCaptureImmediate,\n })\n throw enrichedError\n }\n },\n writable: true,\n configurable: true,\n enumerable: false,\n },\n doStream: {\n value: async (params: LanguageModelCallOptions) => {\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 let providerMetadata: unknown = undefined\n const mergedParams = {\n ...mergedOptions,\n ...mapVercelParams(params),\n }\n\n const modelId = mergedOptions.posthogModelOverride ?? model.modelId\n const provider = mergedOptions.posthogProviderOverride ?? extractProvider(model)\n const availableTools = extractAvailableToolCalls('vercel', params)\n const baseURL = '' // cannot currently get baseURL from vercel\n\n // Map to track in-progress tool calls\n const toolCallsInProgress = new Map<\n string,\n {\n toolCallId: string\n toolName: string\n input: string\n }\n >()\n\n try {\n const { stream, ...rest } = await model.doStream(params as any)\n const transformStream = new TransformStream<LanguageModelStreamPart, LanguageModelStreamPart>({\n transform(chunk, controller) {\n // Handle streaming patterns - compatible with both V2 and V3\n if (chunk.type === 'text-delta') {\n generatedText += chunk.delta\n }\n if (chunk.type === 'reasoning-delta') {\n reasoningText += chunk.delta\n }\n\n // Handle tool call chunks\n if (chunk.type === 'tool-input-start') {\n // Initialize a new tool call\n toolCallsInProgress.set(chunk.id, {\n toolCallId: chunk.id,\n toolName: chunk.toolName,\n input: '',\n })\n }\n if (chunk.type === 'tool-input-delta') {\n // Accumulate tool call arguments\n const toolCall = toolCallsInProgress.get(chunk.id)\n if (toolCall) {\n toolCall.input += chunk.delta\n }\n }\n if (chunk.type === 'tool-input-end') {\n // Tool call is complete, keep it in the map for final processing\n }\n if (chunk.type === 'tool-call') {\n // Direct tool call chunk (complete tool call)\n toolCallsInProgress.set(chunk.toolCallId, {\n toolCallId: chunk.toolCallId,\n toolName: chunk.toolName,\n input: chunk.input,\n })\n }\n\n if (chunk.type === 'finish') {\n providerMetadata = chunk.providerMetadata\n const additionalTokenValues = extractAdditionalTokenValues(providerMetadata)\n const chunkUsage = (chunk.usage as Record<string, unknown>) || {}\n usage = {\n inputTokens: extractTokenCount(chunk.usage?.inputTokens),\n outputTokens: extractTokenCount(chunk.usage?.outputTokens),\n reasoningTokens: extractReasoningTokens(chunkUsage),\n cacheReadInputTokens: extractCacheReadTokens(chunkUsage),\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: OutputContentItem[] = []\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 // Add completed tool calls to content\n for (const toolCall of toolCallsInProgress.values()) {\n if (toolCall.toolName) {\n content.push({\n type: 'tool-call',\n id: toolCall.toolCallId,\n function: {\n name: toolCall.toolName,\n arguments: toolCall.input,\n },\n })\n }\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 const webSearchCount = extractWebSearchCount(providerMetadata, usage)\n\n // Update usage with web search count and raw metadata\n const finalUsage = {\n ...usage,\n webSearchCount,\n rawUsage: { usage, providerMetadata },\n }\n\n adjustAnthropicV3CacheTokens(model, provider, finalUsage)\n\n await sendEventToPosthog({\n client: phClient,\n distinctId: mergedOptions.posthogDistinctId,\n traceId: mergedOptions.posthogTraceId ?? uuidv4(),\n model: modelId,\n provider: provider,\n input: mergedOptions.posthogPrivacyMode ? '' : mapVercelPrompt(params.prompt as LanguageModelPrompt),\n output: output,\n latency,\n baseURL,\n params: mergedParams as any,\n httpStatus: 200,\n usage: finalUsage,\n tools: availableTools,\n captureImmediate: mergedOptions.posthogCaptureImmediate,\n })\n },\n })\n\n return {\n stream: stream.pipeThrough(transformStream),\n ...rest,\n }\n } catch (error: unknown) {\n const enrichedError = await sendEventWithErrorToPosthog({\n client: phClient,\n distinctId: mergedOptions.posthogDistinctId,\n traceId: mergedOptions.posthogTraceId ?? uuidv4(),\n model: modelId,\n provider: provider,\n input: mergedOptions.posthogPrivacyMode ? '' : mapVercelPrompt(params.prompt as LanguageModelPrompt),\n output: [],\n latency: 0,\n baseURL: '',\n params: mergedParams as any,\n usage: {\n inputTokens: 0,\n outputTokens: 0,\n },\n error: error,\n tools: availableTools,\n captureImmediate: mergedOptions.posthogCaptureImmediate,\n })\n throw enrichedError\n }\n },\n writable: true,\n configurable: true,\n enumerable: false,\n },\n }) as T\n\n return wrappedModel\n}\n\n// Export type guards for external use\nexport { isV2Model, isV3Model }\nexport type { LanguageModel, ClientOptions }\n"],"names":["isString","value","REDACTED_IMAGE_PLACEHOLDER","isMultimodalEnabled","val","process","env","_INTERNAL_LLMA_MULTIMODAL","toLowerCase","isBase64DataUrl","str","test","isValidUrl","URL","startsWith","isRawBase64","length","redactBase64DataUrl","MAX_OUTPUT_SIZE","STRING_FORMAT","toContentString","content","undefined","JSON","stringify","String","getModelParams","params","modelParams","paramKeys","key","withPrivacyMode","client","privacyMode","input","privacy_mode","toSafeString","console","warn","truncate","encoder","TextEncoder","buffer","encode","TextDecoder","decode","truncatedBuffer","slice","decoder","fatal","truncatedStr","endsWith","calculateWebSearchCount","result","Array","isArray","output","count","item","type","citations","search_results","usage","search_context_size","choices","choice","message","delta","annotations","hasUrlCitation","some","ann","contentItem","candidates","candidate","grounding_metadata","extractAvailableToolCalls","provider","tools","AIEvent","sanitizeValues","obj","jsonSafe","parse","Buffer","from","toString","map","Object","fromEntries","entries","k","v","sendEventWithErrorToPosthog","traceId","error","args","httpStatus","status","properties","enrichedError","options","enableExceptionAutocapture","exceptionId","uuidv7","captureException","$ai_trace_id","__posthog_previously_captured_error","sendEventToPosthog","eventType","Generation","distinctId","model","latency","baseURL","captureImmediate","capture","Promise","resolve","safeInput","safeOutput","safeError","errorData","$ai_is_error","$ai_error","$exception_event_id","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","webSearchCount","$ai_web_search_count","rawUsage","$ai_usage","$ai_lib","$ai_lib_version","version","$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_base_url","posthogProperties","$process_person_profile","$ai_tools","event","groups","posthogGroups","isV3Model","specificationVersion","mapVercelParams","temperature","max_output_tokens","maxOutputTokens","top_p","topP","frequency_penalty","frequencyPenalty","presence_penalty","presencePenalty","stop","stopSequences","stream","mapVercelPrompt","messages","inputs","role","text","c","fileData","contentData","data","file","mediaType","reasoning","toolCallId","toolName","isError","serialized","removedCount","initialSize","i","byteLength","shift","unshift","mapVercelOutput","id","function","name","arguments","sourceType","url","title","jsonOutput","extractProvider","providerName","split","extractWebSearchCount","providerMetadata","anthropic","serverToolUse","server_tool_use","web_search_requests","extractAdditionalTokenValues","adjustAnthropicV3CacheTokens","includes","cacheReadTokens","cacheWriteTokens","cacheTokens","Math","max","extractTokenCount","total","extractReasoningTokens","extractCacheReadTokens","cachedInputTokens","cacheRead","wrapVercelLanguageModel","phClient","posthogTraceId","uuidv4","mergedOptions","posthogDistinctId","$ai_framework","$ai_framework_version","wrappedModel","create","doGenerate","startTime","Date","now","mergedParams","availableTools","modelId","response","usageObj","rawUsageData","responseBody","body","rawResponse","usageMetadata","prompt","posthogCaptureImmediate","writable","configurable","enumerable","doStream","generatedText","reasoningText","toolCallsInProgress","Map","rest","transformStream","TransformStream","transform","chunk","controller","set","toolCall","get","chunkUsage","enqueue","flush","push","values","finalUsage","pipeThrough"],"mappings":"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"}
1
+ {"version":3,"file":"index.cjs","sources":["../../src/typeGuards.ts","../../src/sanitization.ts","../../src/utils.ts","../../src/vercel/middleware.ts"],"sourcesContent":["// Type guards for safer type checking\n\nexport const isString = (value: unknown): value is string => {\n return typeof value === 'string'\n}\n\nexport const isObject = (value: unknown): value is Record<string, unknown> => {\n return value !== null && typeof value === 'object' && !Array.isArray(value)\n}\n","import { isString, isObject } from './typeGuards'\n\nconst REDACTED_IMAGE_PLACEHOLDER = '[base64 image redacted]'\n\n// ============================================\n// Multimodal Feature Toggle\n// ============================================\n\nconst isMultimodalEnabled = (): boolean => {\n const val = process.env._INTERNAL_LLMA_MULTIMODAL || ''\n return val.toLowerCase() === 'true' || val === '1' || val.toLowerCase() === 'yes'\n}\n\n// ============================================\n// Base64 Detection Helpers\n// ============================================\n\nconst isBase64DataUrl = (str: string): boolean => {\n return /^data:([^;]+);base64,/.test(str)\n}\n\nconst isValidUrl = (str: string): boolean => {\n try {\n new URL(str)\n return true\n } catch {\n // Not an absolute URL, check if it's a relative URL or path\n return str.startsWith('/') || str.startsWith('./') || str.startsWith('../')\n }\n}\n\nconst isRawBase64 = (str: string): boolean => {\n // Skip if it's a valid URL or path\n if (isValidUrl(str)) {\n return false\n }\n\n // Check if it's a valid base64 string\n // Base64 images are typically at least a few hundred chars, but we'll be conservative\n return str.length > 20 && /^[A-Za-z0-9+/]+=*$/.test(str)\n}\n\nexport function redactBase64DataUrl(str: string): string\nexport function redactBase64DataUrl(str: unknown): unknown\nexport function redactBase64DataUrl(str: unknown): unknown {\n if (isMultimodalEnabled()) return str\n if (!isString(str)) return str\n\n // Check for data URL format\n if (isBase64DataUrl(str)) {\n return REDACTED_IMAGE_PLACEHOLDER\n }\n\n // Check for raw base64 (Vercel sends raw base64 for inline images)\n if (isRawBase64(str)) {\n return REDACTED_IMAGE_PLACEHOLDER\n }\n\n return str\n}\n\n// ============================================\n// Common Message Processing\n// ============================================\n\ntype ContentTransformer = (item: unknown) => unknown\n\nconst processMessages = (messages: unknown, transformContent: ContentTransformer): unknown => {\n if (!messages) return messages\n\n const processContent = (content: unknown): unknown => {\n if (typeof content === 'string') return content\n\n if (!content) return content\n\n if (Array.isArray(content)) {\n return content.map(transformContent)\n }\n\n // Handle single object content\n return transformContent(content)\n }\n\n const processMessage = (msg: unknown): unknown => {\n if (!isObject(msg) || !('content' in msg)) return msg\n return { ...msg, content: processContent(msg.content) }\n }\n\n // Handle both arrays and single messages\n if (Array.isArray(messages)) {\n return messages.map(processMessage)\n }\n\n return processMessage(messages)\n}\n\n// ============================================\n// Provider-Specific Image Sanitizers\n// ============================================\n\nconst sanitizeOpenAIImage = (item: unknown): unknown => {\n if (!isObject(item)) return item\n\n // Handle image_url format\n if (item.type === 'image_url' && 'image_url' in item && isObject(item.image_url) && 'url' in item.image_url) {\n return {\n ...item,\n image_url: {\n ...item.image_url,\n url: redactBase64DataUrl(item.image_url.url),\n },\n }\n }\n\n // Handle audio format\n if (item.type === 'audio' && 'data' in item) {\n if (isMultimodalEnabled()) return item\n return { ...item, data: REDACTED_IMAGE_PLACEHOLDER }\n }\n\n return item\n}\n\nconst sanitizeOpenAIResponseImage = (item: unknown): unknown => {\n if (!isObject(item)) return item\n\n // Handle input_image format\n if (item.type === 'input_image' && 'image_url' in item) {\n return {\n ...item,\n image_url: redactBase64DataUrl(item.image_url),\n }\n }\n\n return item\n}\n\nconst sanitizeAnthropicImage = (item: unknown): unknown => {\n if (isMultimodalEnabled()) return item\n if (!isObject(item)) return item\n\n // Handle Anthropic's image and document formats (same structure, different type field)\n if (\n (item.type === 'image' || item.type === 'document') &&\n 'source' in item &&\n isObject(item.source) &&\n item.source.type === 'base64' &&\n 'data' in item.source\n ) {\n return {\n ...item,\n source: {\n ...item.source,\n data: REDACTED_IMAGE_PLACEHOLDER,\n },\n }\n }\n\n return item\n}\n\nconst sanitizeGeminiPart = (part: unknown): unknown => {\n if (isMultimodalEnabled()) return part\n if (!isObject(part)) return part\n\n // Handle Gemini's inline data format (images, audio, PDFs all use inlineData)\n if ('inlineData' in part && isObject(part.inlineData) && 'data' in part.inlineData) {\n return {\n ...part,\n inlineData: {\n ...part.inlineData,\n data: REDACTED_IMAGE_PLACEHOLDER,\n },\n }\n }\n\n return part\n}\n\nconst processGeminiItem = (item: unknown): unknown => {\n if (!isObject(item)) return item\n\n // If it has parts, process them\n if ('parts' in item && item.parts) {\n const parts = Array.isArray(item.parts) ? item.parts.map(sanitizeGeminiPart) : sanitizeGeminiPart(item.parts)\n\n return { ...item, parts }\n }\n\n return item\n}\n\nconst sanitizeLangChainImage = (item: unknown): unknown => {\n if (!isObject(item)) return item\n\n // OpenAI style\n if (item.type === 'image_url' && 'image_url' in item && isObject(item.image_url) && 'url' in item.image_url) {\n return {\n ...item,\n image_url: {\n ...item.image_url,\n url: redactBase64DataUrl(item.image_url.url),\n },\n }\n }\n\n // Direct image with data field\n if (item.type === 'image' && 'data' in item) {\n return { ...item, data: redactBase64DataUrl(item.data) }\n }\n\n // Anthropic style\n if (item.type === 'image' && 'source' in item && isObject(item.source) && 'data' in item.source) {\n if (isMultimodalEnabled()) return item\n return {\n ...item,\n source: {\n ...item.source,\n data: redactBase64DataUrl(item.source.data),\n },\n }\n }\n\n // Google style\n if (item.type === 'media' && 'data' in item) {\n return { ...item, data: redactBase64DataUrl(item.data) }\n }\n\n return item\n}\n\n// Export individual sanitizers for tree-shaking\nexport const sanitizeOpenAI = (data: unknown): unknown => {\n return processMessages(data, sanitizeOpenAIImage)\n}\n\nexport const sanitizeOpenAIResponse = (data: unknown): unknown => {\n return processMessages(data, sanitizeOpenAIResponseImage)\n}\n\nexport const sanitizeAnthropic = (data: unknown): unknown => {\n return processMessages(data, sanitizeAnthropicImage)\n}\n\nexport const sanitizeGemini = (data: unknown): unknown => {\n // Gemini has a different structure with 'parts' directly on items instead of 'content'\n // So we need custom processing instead of using processMessages\n if (!data) return data\n\n if (Array.isArray(data)) {\n return data.map(processGeminiItem)\n }\n\n return processGeminiItem(data)\n}\n\nexport const sanitizeLangChain = (data: unknown): unknown => {\n return processMessages(data, sanitizeLangChainImage)\n}\n","import { EventMessage, 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 { ResponseCreateParamsWithTools } from 'openai/lib/ResponsesParser'\nimport type { Tool as GeminiTool } from '@google/genai'\nimport type { FormattedMessage, FormattedContent, TokenUsage } from './types'\nimport { version } from '../package.json'\nimport { v4 as uuidv4 } from 'uuid'\nimport { isString } from './typeGuards'\nimport { uuidv7, ErrorTracking as CoreErrorTracking } from '@posthog/core'\nimport { redactBase64DataUrl } from './sanitization'\n\ntype ChatCompletionCreateParamsBase = OpenAIOrignal.Chat.Completions.ChatCompletionCreateParams\ntype MessageCreateParams = AnthropicOriginal.Messages.MessageCreateParams\ntype ResponseCreateParams = OpenAIOrignal.Responses.ResponseCreateParams\ntype EmbeddingCreateParams = OpenAIOrignal.EmbeddingCreateParams\ntype TranscriptionCreateParams = OpenAIOrignal.Audio.Transcriptions.TranscriptionCreateParams\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\n/**\n * Safely converts content to a string, preserving structure for objects/arrays.\n * - If content is already a string, returns it as-is\n * - If content is an object or array, stringifies it with JSON.stringify to preserve structure\n * - Otherwise, converts to string with String()\n *\n * This prevents the \"[object Object]\" bug when objects are naively converted to strings.\n *\n * @param content - The content to convert to a string\n * @returns A string representation that preserves structure for complex types\n */\nexport function toContentString(content: unknown): string {\n if (typeof content === 'string') {\n return content\n }\n if (content !== undefined && content !== null && typeof content === 'object') {\n try {\n return JSON.stringify(content)\n } catch {\n // Fallback for circular refs, BigInt, or objects with throwing toJSON\n return String(content)\n }\n }\n return String(content)\n}\n\nexport interface MonitoringEventPropertiesWithDefaults {\n distinctId?: string\n traceId: string\n properties?: Record<string, any>\n privacyMode: boolean\n groups?: Record<string, any>\n modelOverride?: string\n providerOverride?: string\n costOverride?: CostOverride\n captureImmediate?: boolean\n}\n\nexport type MonitoringEventProperties = Partial<MonitoringEventPropertiesWithDefaults>\n\nexport type MonitoringParams = {\n [K in keyof MonitoringEventProperties as `posthog${Capitalize<string & K>}`]: MonitoringEventProperties[K]\n}\n\nexport interface CostOverride {\n inputCost: number\n outputCost: number\n}\n\nexport const getModelParams = (\n params:\n | ((\n | ChatCompletionCreateParamsBase\n | MessageCreateParams\n | ResponseCreateParams\n | ResponseCreateParamsWithTools\n | EmbeddingCreateParams\n | TranscriptionCreateParams\n ) &\n MonitoringParams)\n | 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 'language',\n 'response_format',\n 'timestamp_granularities',\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\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 // Handle audio output (gpt-4o-audio-preview)\n if (choice.message.audio) {\n content.push({\n type: 'audio',\n ...choice.message.audio,\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 } else if (part.inlineData) {\n // Handle audio/media inline data\n const mimeType = part.inlineData.mimeType || 'audio/pcm'\n let data = part.inlineData.data\n\n // Handle binary data (Buffer/Uint8Array -> base64)\n if (data instanceof Uint8Array || Buffer.isBuffer(data)) {\n data = Buffer.from(data).toString('base64')\n }\n\n // Sanitize base64 data for images and other large inline data\n data = redactBase64DataUrl(data)\n\n content.push({\n type: 'audio',\n mime_type: mimeType,\n data: data,\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\nfunction toSafeString(input: unknown): string {\n if (input === undefined || input === null) {\n return ''\n }\n if (typeof input === 'string') {\n return input\n }\n try {\n return JSON.stringify(input)\n } catch {\n console.warn('Failed to stringify input', input)\n return ''\n }\n}\n\nexport const truncate = (input: unknown): string => {\n const str = toSafeString(input)\n if (str === '') {\n return ''\n }\n\n // Check if we need to truncate and ensure STRING_FORMAT is respected\n const encoder = new TextEncoder()\n const buffer = encoder.encode(str)\n if (buffer.length <= MAX_OUTPUT_SIZE) {\n // Ensure STRING_FORMAT is respected\n return new TextDecoder(STRING_FORMAT).decode(buffer)\n }\n\n // Truncate the buffer and ensure a valid string is returned\n const truncatedBuffer = buffer.slice(0, MAX_OUTPUT_SIZE)\n // fatal: false means we get U+FFFD at the end if truncation broke the encoding\n const decoder = new TextDecoder(STRING_FORMAT, { fatal: false })\n let truncatedStr = decoder.decode(truncatedBuffer)\n if (truncatedStr.endsWith('\\uFFFD')) {\n truncatedStr = truncatedStr.slice(0, -1)\n }\n return `${truncatedStr}... [truncated]`\n}\n\n/**\n * Calculate web search count from raw API response.\n *\n * Uses a two-tier detection strategy:\n * Priority 1 (Exact Count): Count actual web search calls when available\n * Priority 2 (Binary Detection): Return 1 if web search indicators are present, 0 otherwise\n *\n * @param result - Raw API response from any provider (OpenAI, Perplexity, OpenRouter, Gemini, etc.)\n * @returns Number of web searches performed (exact count or binary 1/0)\n */\nexport function calculateWebSearchCount(result: unknown): number {\n if (!result || typeof result !== 'object') {\n return 0\n }\n\n // Priority 1: Exact Count\n // Check for OpenAI Responses API web_search_call items\n if ('output' in result && Array.isArray(result.output)) {\n let count = 0\n\n for (const item of result.output) {\n if (typeof item === 'object' && item !== null && 'type' in item && item.type === 'web_search_call') {\n count++\n }\n }\n\n if (count > 0) {\n return count\n }\n }\n\n // Priority 2: Binary Detection (1 or 0)\n\n // Check for citations at root level (Perplexity)\n if ('citations' in result && Array.isArray(result.citations) && result.citations.length > 0) {\n return 1\n }\n\n // Check for search_results at root level (Perplexity via OpenRouter)\n if ('search_results' in result && Array.isArray(result.search_results) && result.search_results.length > 0) {\n return 1\n }\n\n // Check for usage.search_context_size (Perplexity via OpenRouter)\n if ('usage' in result && typeof result.usage === 'object' && result.usage !== null) {\n if ('search_context_size' in result.usage && result.usage.search_context_size) {\n return 1\n }\n }\n\n // Check for annotations with url_citation in choices[].message or choices[].delta (OpenAI/Perplexity)\n if ('choices' in result && Array.isArray(result.choices)) {\n for (const choice of result.choices) {\n if (typeof choice === 'object' && choice !== null) {\n // Check both message (non-streaming) and delta (streaming) for annotations\n const content = ('message' in choice ? choice.message : null) || ('delta' in choice ? choice.delta : null)\n\n if (typeof content === 'object' && content !== null && 'annotations' in content) {\n const annotations = content.annotations\n\n if (Array.isArray(annotations)) {\n const hasUrlCitation = annotations.some((ann: unknown) => {\n return typeof ann === 'object' && ann !== null && 'type' in ann && ann.type === 'url_citation'\n })\n\n if (hasUrlCitation) {\n return 1\n }\n }\n }\n }\n }\n }\n\n // Check for annotations in output[].content[] (OpenAI Responses API)\n if ('output' in result && Array.isArray(result.output)) {\n for (const item of result.output) {\n if (typeof item === 'object' && item !== null && 'content' in item) {\n const content = item.content\n\n if (Array.isArray(content)) {\n for (const contentItem of content) {\n if (typeof contentItem === 'object' && contentItem !== null && 'annotations' in contentItem) {\n const annotations = contentItem.annotations\n\n if (Array.isArray(annotations)) {\n const hasUrlCitation = annotations.some((ann: unknown) => {\n return typeof ann === 'object' && ann !== null && 'type' in ann && ann.type === 'url_citation'\n })\n\n if (hasUrlCitation) {\n return 1\n }\n }\n }\n }\n }\n }\n }\n }\n\n // Check for grounding_metadata (Gemini)\n if ('candidates' in result && Array.isArray(result.candidates)) {\n for (const candidate of result.candidates) {\n if (\n typeof candidate === 'object' &&\n candidate !== null &&\n 'grounding_metadata' in candidate &&\n candidate.grounding_metadata\n ) {\n return 1\n }\n }\n }\n\n return 0\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 if (params.tools) {\n return params.tools\n }\n\n return null\n }\n\n return null\n}\n\nexport enum AIEvent {\n Generation = '$ai_generation',\n Embedding = '$ai_embedding',\n}\n\nexport type SendEventToPosthogParams = {\n client: PostHog\n eventType?: AIEvent\n distinctId?: string\n traceId: string\n model?: string\n provider: string\n input: any\n output: any\n latency: number\n timeToFirstToken?: number\n baseURL: string\n httpStatus: number\n usage?: TokenUsage\n params: (\n | ChatCompletionCreateParamsBase\n | MessageCreateParams\n | ResponseCreateParams\n | ResponseCreateParamsWithTools\n | EmbeddingCreateParams\n | TranscriptionCreateParams\n ) &\n MonitoringParams\n error?: unknown\n exceptionId?: 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\nconst POSTHOG_PARAMS_MAP: Record<keyof MonitoringParams, string> = {\n posthogDistinctId: 'distinctId',\n posthogTraceId: 'traceId',\n posthogProperties: 'properties',\n posthogPrivacyMode: 'privacyMode',\n posthogGroups: 'groups',\n posthogModelOverride: 'modelOverride',\n posthogProviderOverride: 'providerOverride',\n posthogCostOverride: 'costOverride',\n posthogCaptureImmediate: 'captureImmediate',\n}\n\nexport function extractPosthogParams<T>(body: T & MonitoringParams): {\n providerParams: T\n posthogParams: MonitoringEventPropertiesWithDefaults\n} {\n const providerParams: Record<string, unknown> = {}\n const posthogParams: Record<string, unknown> = {}\n\n for (const [key, value] of Object.entries(body)) {\n if (POSTHOG_PARAMS_MAP[key as keyof MonitoringParams]) {\n posthogParams[POSTHOG_PARAMS_MAP[key as keyof MonitoringParams]] = value\n } else if (key.startsWith('posthog')) {\n console.warn(`Unknown Posthog parameter ${key}`)\n } else {\n providerParams[key] = value\n }\n }\n\n return {\n providerParams: providerParams as T,\n posthogParams: addDefaults(posthogParams),\n }\n}\n\nfunction addDefaults(params: MonitoringEventProperties): MonitoringEventPropertiesWithDefaults {\n return {\n ...params,\n privacyMode: params.privacyMode ?? false,\n traceId: params.traceId ?? uuidv4(),\n }\n}\n\nexport const sendEventWithErrorToPosthog = async ({\n client,\n traceId,\n error,\n ...args\n}: Omit<SendEventToPosthogParams, 'error' | 'httpStatus'> &\n Required<Pick<SendEventToPosthogParams, 'error'>>): Promise<unknown> => {\n const httpStatus =\n error && typeof error === 'object' && 'status' in error ? ((error as { status?: number }).status ?? 500) : 500\n\n const properties = { client, traceId, httpStatus, error: JSON.stringify(error), ...args }\n const enrichedError = error as CoreErrorTracking.PreviouslyCapturedError\n\n if (client.options?.enableExceptionAutocapture) {\n // assign a uuid that can be used to link the trace and exception events\n const exceptionId = uuidv7()\n client.captureException(error, undefined, { $ai_trace_id: traceId }, exceptionId)\n enrichedError.__posthog_previously_captured_error = true\n properties.exceptionId = exceptionId\n }\n\n await sendEventToPosthog(properties)\n\n return enrichedError\n}\n\nexport const sendEventToPosthog = async ({\n client,\n eventType = AIEvent.Generation,\n distinctId,\n traceId,\n model,\n provider,\n input,\n output,\n latency,\n timeToFirstToken,\n baseURL,\n params,\n httpStatus = 200,\n usage = {},\n error,\n exceptionId,\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 (error) {\n errorData = {\n $ai_is_error: true,\n $ai_error: safeError,\n $exception_event_id: exceptionId,\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 ...(usage.webSearchCount ? { $ai_web_search_count: usage.webSearchCount } : {}),\n ...(usage.rawUsage ? { $ai_usage: usage.rawUsage } : {}),\n }\n\n const properties = {\n $ai_lib: 'posthog-ai',\n $ai_lib_version: version,\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 ...(usage.outputTokens !== undefined ? { $ai_output_tokens: usage.outputTokens } : {}),\n ...additionalTokenValues,\n $ai_latency: latency,\n ...(timeToFirstToken !== undefined ? { $ai_time_to_first_token: timeToFirstToken } : {}),\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: EventMessage = {\n distinctId: distinctId ?? traceId,\n event: eventType,\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 return Promise.resolve()\n}\n\nexport function formatOpenAIResponsesInput(input: unknown, instructions?: string | null): FormattedMessage[] {\n const messages: FormattedMessage[] = []\n\n if (instructions) {\n messages.push({\n role: 'system',\n content: instructions,\n })\n }\n\n if (Array.isArray(input)) {\n for (const item of input) {\n if (typeof item === 'string') {\n messages.push({ role: 'user', content: item })\n } else if (item && typeof item === 'object') {\n const obj = item as Record<string, unknown>\n const role = isString(obj.role) ? obj.role : 'user'\n\n // Handle content properly - preserve structure for objects/arrays\n const content = obj.content ?? obj.text ?? item\n messages.push({ role, content: toContentString(content) })\n } else {\n messages.push({ role: 'user', content: toContentString(item) })\n }\n }\n } else if (typeof input === 'string') {\n messages.push({ role: 'user', content: input })\n } else if (input) {\n messages.push({ role: 'user', content: toContentString(input) })\n }\n\n return messages\n}\n","import type {\n LanguageModelV2,\n LanguageModelV2CallOptions,\n LanguageModelV2Content,\n LanguageModelV2Prompt,\n LanguageModelV2StreamPart,\n LanguageModelV3,\n LanguageModelV3CallOptions,\n LanguageModelV3Content,\n LanguageModelV3Prompt,\n LanguageModelV3StreamPart,\n} from '@ai-sdk/provider'\nimport { v4 as uuidv4 } from 'uuid'\nimport { PostHog } from 'posthog-node'\nimport {\n CostOverride,\n sendEventToPosthog,\n truncate,\n MAX_OUTPUT_SIZE,\n extractAvailableToolCalls,\n toContentString,\n calculateWebSearchCount,\n sendEventWithErrorToPosthog,\n} from '../utils'\nimport { Buffer } from 'buffer'\nimport { redactBase64DataUrl } from '../sanitization'\nimport { isString } from '../typeGuards'\n\n// Union types for dual version support\ntype LanguageModel = LanguageModelV2 | LanguageModelV3\ntype LanguageModelCallOptions = LanguageModelV2CallOptions | LanguageModelV3CallOptions\ntype LanguageModelPrompt = LanguageModelV2Prompt | LanguageModelV3Prompt\ntype LanguageModelContent = LanguageModelV2Content | LanguageModelV3Content\ntype LanguageModelStreamPart = LanguageModelV2StreamPart | LanguageModelV3StreamPart\n\n// Type guards\nfunction isV3Model(model: LanguageModel): model is LanguageModelV3 {\n return model.specificationVersion === 'v3'\n}\n\nfunction isV2Model(model: LanguageModel): model is LanguageModelV2 {\n return model.specificationVersion === 'v2'\n}\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 PostHogInput {\n role: string\n type?: string\n content?:\n | string\n | {\n [key: string]: any\n }\n}\n\n// Content types for the output array\ntype OutputContentItem =\n | { type: 'text'; text: string }\n | { type: 'reasoning'; text: string }\n | { type: 'tool-call'; id: string; function: { name: string; arguments: string } }\n | { type: 'file'; name: string; mediaType: string; data: string }\n | { type: 'source'; sourceType: string; id: string; url: string; title: string }\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: LanguageModelPrompt): 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(toContentString(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 // For file type, check if it's a data URL and redact if needed\n let fileData: string\n\n const contentData: unknown = c.data\n\n if (contentData instanceof URL) {\n fileData = contentData.toString()\n } else if (isString(contentData)) {\n // Redact base64 data URLs and raw base64 to prevent oversized events\n fileData = redactBase64DataUrl(contentData)\n } else {\n fileData = 'raw files not supported'\n }\n\n return {\n type: 'file',\n file: fileData,\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(toContentString(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: LanguageModelContent[]): PostHogInput[] => {\n const content: OutputContentItem[] = 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 fileData = redactBase64DataUrl(item.data)\n\n // If not redacted and still large, replace with size indicator\n if (fileData === item.data && item.data.length > 1000) {\n fileData = `[${item.mediaType} file - ${item.data.length} bytes]`\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 {\n console.error('Error stringifying output')\n return []\n }\n}\n\nconst extractProvider = (model: LanguageModel): string => {\n const provider = model.provider.toLowerCase()\n const providerName = provider.split('.')[0]\n return providerName\n}\n\n// Extract web search count from provider metadata (works for both V2 and V3)\nconst extractWebSearchCount = (providerMetadata: unknown, usage: any): number => {\n // Try Anthropic-specific extraction\n if (\n providerMetadata &&\n typeof providerMetadata === 'object' &&\n 'anthropic' in providerMetadata &&\n providerMetadata.anthropic &&\n typeof providerMetadata.anthropic === 'object' &&\n 'server_tool_use' in providerMetadata.anthropic\n ) {\n const serverToolUse = providerMetadata.anthropic.server_tool_use\n if (\n serverToolUse &&\n typeof serverToolUse === 'object' &&\n 'web_search_requests' in serverToolUse &&\n typeof serverToolUse.web_search_requests === 'number'\n ) {\n return serverToolUse.web_search_requests\n }\n }\n\n // Fall back to generic calculation\n return calculateWebSearchCount({\n usage,\n providerMetadata,\n })\n}\n\n// Extract additional token values from provider metadata\nconst extractAdditionalTokenValues = (providerMetadata: unknown): Record<string, any> => {\n if (\n providerMetadata &&\n typeof providerMetadata === 'object' &&\n 'anthropic' in providerMetadata &&\n providerMetadata.anthropic &&\n typeof providerMetadata.anthropic === 'object' &&\n 'cacheCreationInputTokens' in providerMetadata.anthropic\n ) {\n return {\n cacheCreationInputTokens: providerMetadata.anthropic.cacheCreationInputTokens,\n }\n }\n return {}\n}\n\n// For Anthropic providers in V3, inputTokens.total is the sum of all tokens (uncached + cache read + cache write).\n// Our cost calculation expects inputTokens to be only the uncached portion for Anthropic.\n// This helper subtracts cache tokens from inputTokens for Anthropic V3 models.\nconst adjustAnthropicV3CacheTokens = (\n model: LanguageModel,\n provider: string,\n usage: { inputTokens?: number; cacheReadInputTokens?: unknown; cacheCreationInputTokens?: unknown }\n): void => {\n if (isV3Model(model) && provider.toLowerCase().includes('anthropic')) {\n const cacheReadTokens = (usage.cacheReadInputTokens as number) || 0\n const cacheWriteTokens = (usage.cacheCreationInputTokens as number) || 0\n const cacheTokens = cacheReadTokens + cacheWriteTokens\n if (usage.inputTokens && cacheTokens > 0) {\n usage.inputTokens = Math.max(usage.inputTokens - cacheTokens, 0)\n }\n }\n}\n\n// Helper to extract numeric token value from V2 (number) or V3 (object with .total) usage formats\nconst extractTokenCount = (value: unknown): number | undefined => {\n if (typeof value === 'number') {\n return value\n }\n if (\n value &&\n typeof value === 'object' &&\n 'total' in value &&\n typeof (value as { total: unknown }).total === 'number'\n ) {\n return (value as { total: number }).total\n }\n return undefined\n}\n\n// Helper to extract reasoning tokens from V2 (usage.reasoningTokens) or V3 (usage.outputTokens.reasoning)\nconst extractReasoningTokens = (usage: Record<string, unknown>): unknown => {\n // V2 style: top-level reasoningTokens\n if ('reasoningTokens' in usage) {\n return usage.reasoningTokens\n }\n // V3 style: nested in outputTokens.reasoning\n if (\n 'outputTokens' in usage &&\n usage.outputTokens &&\n typeof usage.outputTokens === 'object' &&\n 'reasoning' in usage.outputTokens\n ) {\n return (usage.outputTokens as { reasoning: unknown }).reasoning\n }\n return undefined\n}\n\n// Helper to extract cached input tokens from V2 (usage.cachedInputTokens) or V3 (usage.inputTokens.cacheRead)\nconst extractCacheReadTokens = (usage: Record<string, unknown>): unknown => {\n // V2 style: top-level cachedInputTokens\n if ('cachedInputTokens' in usage) {\n return usage.cachedInputTokens\n }\n // V3 style: nested in inputTokens.cacheRead\n if (\n 'inputTokens' in usage &&\n usage.inputTokens &&\n typeof usage.inputTokens === 'object' &&\n 'cacheRead' in usage.inputTokens\n ) {\n return (usage.inputTokens as { cacheRead: unknown }).cacheRead\n }\n return undefined\n}\n\n/**\n * Wraps a Vercel AI SDK language model (V2 or V3) with PostHog tracing.\n * Automatically detects the model version and applies appropriate instrumentation.\n */\nexport const wrapVercelLanguageModel = <T extends LanguageModel>(\n model: T,\n phClient: PostHog,\n options: ClientOptions\n): T => {\n const traceId = options.posthogTraceId ?? uuidv4()\n const mergedOptions = {\n ...options,\n posthogTraceId: traceId,\n posthogDistinctId: options.posthogDistinctId,\n posthogProperties: {\n ...options.posthogProperties,\n $ai_framework: 'vercel',\n $ai_framework_version: model.specificationVersion === 'v3' ? '6' : '5',\n },\n }\n\n // Create wrapped model using Object.create to preserve the prototype chain\n // This automatically inherits all properties (including getters) from the model\n const wrappedModel = Object.create(model, {\n doGenerate: {\n value: async (params: LanguageModelCallOptions) => {\n const startTime = Date.now()\n const mergedParams = {\n ...mergedOptions,\n ...mapVercelParams(params),\n }\n const availableTools = extractAvailableToolCalls('vercel', params)\n\n try {\n const result = await model.doGenerate(params as any)\n const modelId =\n mergedOptions.posthogModelOverride ?? (result.response?.modelId ? result.response.modelId : model.modelId)\n const provider = mergedOptions.posthogProviderOverride ?? extractProvider(model)\n const baseURL = '' // cannot currently get baseURL from vercel\n const content = mapVercelOutput(result.content as LanguageModelContent[])\n const latency = (Date.now() - startTime) / 1000\n const providerMetadata = result.providerMetadata\n const additionalTokenValues = extractAdditionalTokenValues(providerMetadata)\n\n const webSearchCount = extractWebSearchCount(providerMetadata, result.usage)\n\n // V2 usage has simple numbers, V3 has objects with .total - normalize both\n const usageObj = result.usage as Record<string, unknown>\n\n // Extract raw response for providers that include detailed usage metadata\n // For Gemini, candidatesTokensDetails is in result.response.body.usageMetadata\n const rawUsageData: Record<string, unknown> = {\n usage: result.usage,\n providerMetadata,\n }\n\n // Include response body usageMetadata if it contains detailed token breakdown (e.g., candidatesTokensDetails)\n if (result.response && typeof result.response === 'object') {\n const responseBody = result.response.body\n if (responseBody && typeof responseBody === 'object' && 'usageMetadata' in responseBody) {\n rawUsageData.rawResponse = {\n usageMetadata: responseBody.usageMetadata,\n }\n }\n }\n\n const usage = {\n inputTokens: extractTokenCount(result.usage.inputTokens),\n outputTokens: extractTokenCount(result.usage.outputTokens),\n reasoningTokens: extractReasoningTokens(usageObj),\n cacheReadInputTokens: extractCacheReadTokens(usageObj),\n webSearchCount,\n ...additionalTokenValues,\n rawUsage: rawUsageData,\n }\n\n adjustAnthropicV3CacheTokens(model, provider, usage)\n\n await sendEventToPosthog({\n client: phClient,\n distinctId: mergedOptions.posthogDistinctId,\n traceId: mergedOptions.posthogTraceId ?? uuidv4(),\n model: modelId,\n provider: provider,\n input: mergedOptions.posthogPrivacyMode ? '' : mapVercelPrompt(params.prompt as LanguageModelPrompt),\n output: content,\n latency,\n baseURL,\n params: mergedParams as any,\n httpStatus: 200,\n usage,\n tools: availableTools,\n captureImmediate: mergedOptions.posthogCaptureImmediate,\n })\n\n return result\n } catch (error: unknown) {\n const modelId = model.modelId\n const enrichedError = await sendEventWithErrorToPosthog({\n client: phClient,\n distinctId: mergedOptions.posthogDistinctId,\n traceId: mergedOptions.posthogTraceId ?? uuidv4(),\n model: modelId,\n provider: model.provider,\n input: mergedOptions.posthogPrivacyMode ? '' : mapVercelPrompt(params.prompt as LanguageModelPrompt),\n output: [],\n latency: 0,\n baseURL: '',\n params: mergedParams as any,\n usage: {\n inputTokens: 0,\n outputTokens: 0,\n },\n error: error,\n tools: availableTools,\n captureImmediate: mergedOptions.posthogCaptureImmediate,\n })\n throw enrichedError\n }\n },\n writable: true,\n configurable: true,\n enumerable: false,\n },\n doStream: {\n value: async (params: LanguageModelCallOptions) => {\n const startTime = Date.now()\n let firstTokenTime: number | undefined\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 let providerMetadata: unknown = undefined\n const mergedParams = {\n ...mergedOptions,\n ...mapVercelParams(params),\n }\n\n const modelId = mergedOptions.posthogModelOverride ?? model.modelId\n const provider = mergedOptions.posthogProviderOverride ?? extractProvider(model)\n const availableTools = extractAvailableToolCalls('vercel', params)\n const baseURL = '' // cannot currently get baseURL from vercel\n\n // Map to track in-progress tool calls\n const toolCallsInProgress = new Map<\n string,\n {\n toolCallId: string\n toolName: string\n input: string\n }\n >()\n\n try {\n const { stream, ...rest } = await model.doStream(params as any)\n const transformStream = new TransformStream<LanguageModelStreamPart, LanguageModelStreamPart>({\n transform(chunk, controller) {\n // Handle streaming patterns - compatible with both V2 and V3\n if (chunk.type === 'text-delta') {\n if (firstTokenTime === undefined) {\n firstTokenTime = Date.now()\n }\n generatedText += chunk.delta\n }\n if (chunk.type === 'reasoning-delta') {\n if (firstTokenTime === undefined) {\n firstTokenTime = Date.now()\n }\n reasoningText += chunk.delta\n }\n\n // Handle tool call chunks\n if (chunk.type === 'tool-input-start') {\n if (firstTokenTime === undefined) {\n firstTokenTime = Date.now()\n }\n // Initialize a new tool call\n toolCallsInProgress.set(chunk.id, {\n toolCallId: chunk.id,\n toolName: chunk.toolName,\n input: '',\n })\n }\n if (chunk.type === 'tool-input-delta') {\n // Accumulate tool call arguments\n const toolCall = toolCallsInProgress.get(chunk.id)\n if (toolCall) {\n toolCall.input += chunk.delta\n }\n }\n if (chunk.type === 'tool-input-end') {\n // Tool call is complete, keep it in the map for final processing\n }\n if (chunk.type === 'tool-call') {\n if (firstTokenTime === undefined) {\n firstTokenTime = Date.now()\n }\n // Direct tool call chunk (complete tool call)\n toolCallsInProgress.set(chunk.toolCallId, {\n toolCallId: chunk.toolCallId,\n toolName: chunk.toolName,\n input: chunk.input,\n })\n }\n\n if (chunk.type === 'finish') {\n providerMetadata = chunk.providerMetadata\n const additionalTokenValues = extractAdditionalTokenValues(providerMetadata)\n const chunkUsage = (chunk.usage as Record<string, unknown>) || {}\n usage = {\n inputTokens: extractTokenCount(chunk.usage?.inputTokens),\n outputTokens: extractTokenCount(chunk.usage?.outputTokens),\n reasoningTokens: extractReasoningTokens(chunkUsage),\n cacheReadInputTokens: extractCacheReadTokens(chunkUsage),\n ...additionalTokenValues,\n }\n }\n controller.enqueue(chunk)\n },\n\n flush: async () => {\n const latency = (Date.now() - startTime) / 1000\n const timeToFirstToken = firstTokenTime !== undefined ? (firstTokenTime - startTime) / 1000 : undefined\n // Build content array similar to mapVercelOutput structure\n const content: OutputContentItem[] = []\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 // Add completed tool calls to content\n for (const toolCall of toolCallsInProgress.values()) {\n if (toolCall.toolName) {\n content.push({\n type: 'tool-call',\n id: toolCall.toolCallId,\n function: {\n name: toolCall.toolName,\n arguments: toolCall.input,\n },\n })\n }\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 const webSearchCount = extractWebSearchCount(providerMetadata, usage)\n\n // Update usage with web search count and raw metadata\n const finalUsage = {\n ...usage,\n webSearchCount,\n rawUsage: { usage, providerMetadata },\n }\n\n adjustAnthropicV3CacheTokens(model, provider, finalUsage)\n\n await sendEventToPosthog({\n client: phClient,\n distinctId: mergedOptions.posthogDistinctId,\n traceId: mergedOptions.posthogTraceId ?? uuidv4(),\n model: modelId,\n provider: provider,\n input: mergedOptions.posthogPrivacyMode ? '' : mapVercelPrompt(params.prompt as LanguageModelPrompt),\n output: output,\n latency,\n timeToFirstToken,\n baseURL,\n params: mergedParams as any,\n httpStatus: 200,\n usage: finalUsage,\n tools: availableTools,\n captureImmediate: mergedOptions.posthogCaptureImmediate,\n })\n },\n })\n\n return {\n stream: stream.pipeThrough(transformStream),\n ...rest,\n }\n } catch (error: unknown) {\n const enrichedError = await sendEventWithErrorToPosthog({\n client: phClient,\n distinctId: mergedOptions.posthogDistinctId,\n traceId: mergedOptions.posthogTraceId ?? uuidv4(),\n model: modelId,\n provider: provider,\n input: mergedOptions.posthogPrivacyMode ? '' : mapVercelPrompt(params.prompt as LanguageModelPrompt),\n output: [],\n latency: 0,\n baseURL: '',\n params: mergedParams as any,\n usage: {\n inputTokens: 0,\n outputTokens: 0,\n },\n error: error,\n tools: availableTools,\n captureImmediate: mergedOptions.posthogCaptureImmediate,\n })\n throw enrichedError\n }\n },\n writable: true,\n configurable: true,\n enumerable: false,\n },\n }) as T\n\n return wrappedModel\n}\n\n// Export type guards for external use\nexport { isV2Model, isV3Model }\nexport type { LanguageModel, ClientOptions }\n"],"names":["isString","value","REDACTED_IMAGE_PLACEHOLDER","isMultimodalEnabled","val","process","env","_INTERNAL_LLMA_MULTIMODAL","toLowerCase","isBase64DataUrl","str","test","isValidUrl","URL","startsWith","isRawBase64","length","redactBase64DataUrl","MAX_OUTPUT_SIZE","STRING_FORMAT","toContentString","content","undefined","JSON","stringify","String","getModelParams","params","modelParams","paramKeys","key","withPrivacyMode","client","privacyMode","input","privacy_mode","toSafeString","console","warn","truncate","encoder","TextEncoder","buffer","encode","TextDecoder","decode","truncatedBuffer","slice","decoder","fatal","truncatedStr","endsWith","calculateWebSearchCount","result","Array","isArray","output","count","item","type","citations","search_results","usage","search_context_size","choices","choice","message","delta","annotations","hasUrlCitation","some","ann","contentItem","candidates","candidate","grounding_metadata","extractAvailableToolCalls","provider","tools","AIEvent","sanitizeValues","obj","jsonSafe","parse","Buffer","from","toString","map","Object","fromEntries","entries","k","v","sendEventWithErrorToPosthog","traceId","error","args","httpStatus","status","properties","enrichedError","options","enableExceptionAutocapture","exceptionId","uuidv7","captureException","$ai_trace_id","__posthog_previously_captured_error","sendEventToPosthog","eventType","Generation","distinctId","model","latency","timeToFirstToken","baseURL","captureImmediate","capture","Promise","resolve","safeInput","safeOutput","safeError","errorData","$ai_is_error","$ai_error","$exception_event_id","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","webSearchCount","$ai_web_search_count","rawUsage","$ai_usage","$ai_lib","$ai_lib_version","version","$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_time_to_first_token","$ai_base_url","posthogProperties","$process_person_profile","$ai_tools","event","groups","posthogGroups","isV3Model","specificationVersion","mapVercelParams","temperature","max_output_tokens","maxOutputTokens","top_p","topP","frequency_penalty","frequencyPenalty","presence_penalty","presencePenalty","stop","stopSequences","stream","mapVercelPrompt","messages","inputs","role","text","c","fileData","contentData","data","file","mediaType","reasoning","toolCallId","toolName","isError","serialized","removedCount","initialSize","i","byteLength","shift","unshift","mapVercelOutput","id","function","name","arguments","sourceType","url","title","jsonOutput","extractProvider","providerName","split","extractWebSearchCount","providerMetadata","anthropic","serverToolUse","server_tool_use","web_search_requests","extractAdditionalTokenValues","adjustAnthropicV3CacheTokens","includes","cacheReadTokens","cacheWriteTokens","cacheTokens","Math","max","extractTokenCount","total","extractReasoningTokens","extractCacheReadTokens","cachedInputTokens","cacheRead","wrapVercelLanguageModel","phClient","posthogTraceId","uuidv4","mergedOptions","posthogDistinctId","$ai_framework","$ai_framework_version","wrappedModel","create","doGenerate","startTime","Date","now","mergedParams","availableTools","modelId","response","usageObj","rawUsageData","responseBody","body","rawResponse","usageMetadata","prompt","posthogCaptureImmediate","writable","configurable","enumerable","doStream","firstTokenTime","generatedText","reasoningText","toolCallsInProgress","Map","rest","transformStream","TransformStream","transform","chunk","controller","set","toolCall","get","chunkUsage","enqueue","flush","push","values","finalUsage","pipeThrough"],"mappings":"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"}