{"version":3,"file":"index.cjs","sources":["../../src/typeGuards.ts","../../src/sanitization/base64_recognizer.ts","../../src/sanitization/media_type_context.ts","../../src/sanitization/binary_content_redactor.ts","../../src/sanitization.ts","../../src/utils.ts","../../src/serializeError.ts","../../src/captureAiGeneration.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","const DATA_URL_PREFIX_RE = /^data:([^;,\\s]+)(?:;[^;,\\s]+)*;base64,/i\nconst BASE64_ALPHABET_RE = /^[A-Za-z0-9+/_=-]+$/\n\nexport type Base64Recognition = { kind: 'data-url'; mediaType: string } | { kind: 'raw' } | { kind: 'none' }\n\nexport class Base64Recognizer {\n  recognize(value: string, minLength: number): Base64Recognition {\n    const dataUrl = DATA_URL_PREFIX_RE.exec(value)\n    if (dataUrl) return { kind: 'data-url', mediaType: dataUrl[1] }\n\n    if (value.length < minLength) return { kind: 'none' }\n\n    const confidencePrefix = value.slice(0, minLength)\n    if (BASE64_ALPHABET_RE.test(confidencePrefix)) {\n      return { kind: 'raw' }\n    } else {\n      return { kind: 'none' }\n    }\n  }\n}\n","const MIME_HINT_KEYS = ['mediaType', 'media_type', 'mimeType', 'mime_type'] as const\n\nconst STRONG_CONTEXT_KEYS = new Set([\n  'data',\n  'file_data',\n  'fileData',\n  'image_url',\n  'imageUrl',\n  'video_url',\n  'videoUrl',\n  'audio',\n  'audio_data',\n  'audioData',\n  'inline_data',\n  'inlineData',\n  'source',\n  'result',\n])\n\nconst STRONG_CONTEXT_TYPES = new Set([\n  'image',\n  'image_url',\n  'input_image',\n  'audio',\n  'input_audio',\n  'video',\n  'video_url',\n  'file',\n  'input_file',\n  'document',\n  'media',\n  'file-data',\n])\n\nconst FILE_FAMILY_TYPES = new Set(['file', 'input_file', 'document', 'media', 'file-data'])\n\nconst KNOWN_AUDIO_FORMATS = new Set(['wav', 'mp3', 'ogg', 'flac', 'm4a', 'aac', 'webm'])\n\nexport class MediaTypeContext {\n  static readonly EMPTY = new MediaTypeContext(undefined, undefined)\n\n  constructor(\n    private readonly parent: Record<string, unknown> | undefined,\n    private readonly key: string | undefined\n  ) {}\n\n  inferMediaType(): string | undefined {\n    return (\n      this.inferFromSiblingMime() ?? this.inferFromSiblingFormat() ?? this.inferFromParentType() ?? this.inferFromKey()\n    )\n  }\n\n  inferFromSiblingMime(): string | undefined {\n    if (!this.parent) return undefined\n    for (const hint of MIME_HINT_KEYS) {\n      const v = this.parent[hint]\n      if (typeof v === 'string') return v\n    }\n    return undefined\n  }\n\n  inferFromSiblingFormat(): string | undefined {\n    if (!this.parent) return undefined\n    const fmt = this.parent.format\n    if (typeof fmt === 'string' && KNOWN_AUDIO_FORMATS.has(fmt.toLowerCase())) {\n      return `audio/${fmt.toLowerCase()}`\n    }\n    return undefined\n  }\n\n  inferFromParentType(): string | undefined {\n    if (!this.parent) return undefined\n    const t = this.parent.type\n    if (typeof t !== 'string') return undefined\n    if (t === 'image' || t === 'image_url' || t === 'input_image') return 'image'\n    if (t === 'audio' || t === 'input_audio') return 'audio'\n    if (t === 'video' || t === 'video_url') return 'video'\n    if (FILE_FAMILY_TYPES.has(t)) return 'application/octet-stream'\n    return undefined\n  }\n\n  inferFromKey(): string | undefined {\n    if (!this.key) return undefined\n    const key = this.key.toLowerCase()\n    if (key.includes('audio')) return 'audio'\n    if (key.includes('video')) return 'video'\n    if (key.includes('image')) return 'image'\n    if (key.includes('file') || key.includes('document')) return 'application/octet-stream'\n    return undefined\n  }\n\n  signalsBinary(): boolean {\n    if (this.parent) {\n      for (const hint of MIME_HINT_KEYS) {\n        if (typeof this.parent[hint] === 'string') return true\n      }\n      const fmt = this.parent.format\n      if (typeof fmt === 'string' && KNOWN_AUDIO_FORMATS.has(fmt.toLowerCase())) return true\n      const t = this.parent.type\n      if (typeof t === 'string' && STRONG_CONTEXT_TYPES.has(t)) return true\n    }\n    if (this.key && STRONG_CONTEXT_KEYS.has(this.key)) return true\n    return false\n  }\n}\n","import { Base64Recognizer } from './base64_recognizer'\nimport { MediaTypeContext } from './media_type_context'\n\nconst STRONG_CONTEXT_MIN_LENGTH = 64\nconst WEAK_CONTEXT_MIN_LENGTH = 1024\n\nexport class BinaryContentRedactor {\n  private visited: WeakSet<object> = new WeakSet()\n\n  constructor(private readonly recognizer: Base64Recognizer = new Base64Recognizer()) {}\n\n  redact<T>(value: T): T\n  redact(value: unknown): unknown {\n    if (this.isMultimodalEnabled()) return value\n    this.visited = new WeakSet()\n    return this.walk(value, MediaTypeContext.EMPTY)\n  }\n\n  private walk(value: unknown, ctx: MediaTypeContext): unknown {\n    if (value === null || value === undefined) return value\n    if (typeof value === 'string') return this.redactString(value, ctx)\n    if (typeof value !== 'object') return value\n\n    // Buffer extends Uint8Array, so this branch catches both.\n    if (typeof Uint8Array !== 'undefined' && value instanceof Uint8Array) {\n      return this.placeholderFor(ctx.inferMediaType())\n    }\n\n    if (this.visited.has(value)) return null\n    this.visited.add(value)\n\n    if (Array.isArray(value)) {\n      return value.map((item) => this.walk(item, ctx))\n    }\n\n    const obj = value as Record<string, unknown>\n    const out: Record<string, unknown> = {}\n    for (const k of Object.keys(obj)) {\n      out[k] = this.walk(obj[k], new MediaTypeContext(obj, k))\n    }\n    return out\n  }\n\n  private redactString(value: string, ctx: MediaTypeContext): string {\n    const minLength = ctx.signalsBinary() ? STRONG_CONTEXT_MIN_LENGTH : WEAK_CONTEXT_MIN_LENGTH\n    const recognition = this.recognizer.recognize(value, minLength)\n    switch (recognition.kind) {\n      case 'data-url':\n        return this.placeholderFor(recognition.mediaType)\n      case 'raw':\n        return this.placeholderFor(ctx.inferMediaType())\n      case 'none':\n        return value\n    }\n  }\n\n  private placeholderFor(mediaType?: string): string {\n    if (!mediaType) return '[base64 redacted]'\n    if (mediaType === 'application/octet-stream') return '[base64 file redacted]'\n    return `[base64 ${mediaType} redacted]`\n  }\n\n  private isMultimodalEnabled(): boolean {\n    const val = process.env._INTERNAL_LLMA_MULTIMODAL || ''\n    return val.toLowerCase() === 'true' || val === '1' || val.toLowerCase() === 'yes'\n  }\n}\n","import { BinaryContentRedactor } from './sanitization/binary_content_redactor'\n\nconst redactor = new BinaryContentRedactor()\n\nexport function redactBase64DataUrl(str: string): string\nexport function redactBase64DataUrl(str: unknown): unknown\nexport function redactBase64DataUrl(str: unknown): unknown {\n  return redactor.redact(str)\n}\n\nexport const sanitizeOpenAI = (data: unknown): unknown => redactor.redact(data)\nexport const sanitizeOpenAIResponse = (data: unknown): unknown => redactor.redact(data)\nexport const sanitizeAnthropic = (data: unknown): unknown => redactor.redact(data)\nexport const sanitizeGemini = (data: unknown): unknown => redactor.redact(data)\nexport const sanitizeLangChain = (data: unknown): unknown => redactor.redact(data)\n","import { PostHog } from 'posthog-node'\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 {\n  FormattedMessage,\n  FormattedContent,\n  FormattedAudioContent,\n  FormattedImageContent,\n  FormattedDocumentContent,\n} from './types'\nimport { v4 as uuidv4 } from 'uuid'\nimport { isString } from './typeGuards'\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\nconst TOKEN_PROPERTY_KEYS = new Set([\n  '$ai_input_tokens',\n  '$ai_output_tokens',\n  '$ai_cache_read_input_tokens',\n  '$ai_cache_creation_input_tokens',\n  '$ai_total_tokens',\n  '$ai_reasoning_tokens',\n])\n\nexport function getTokensSource(posthogProperties?: Record<string, unknown>): string {\n  if (posthogProperties && Object.keys(posthogProperties).some((key) => TOKEN_PROPERTY_KEYS.has(key))) {\n    return 'passthrough'\n  }\n  return 'sdk'\n}\n\n// limit large outputs by truncating to 200kb (approx 200k bytes)\nexport const MAX_OUTPUT_SIZE = 200000\nconst STRING_FORMAT = 'utf8'\n\n// Reused across calls to avoid per-invocation allocation; truncate() runs\n// hundreds of times for prompts with many parts.\nconst sharedTextEncoder = new TextEncoder()\nconst sharedTextDecoder = new TextDecoder(STRING_FORMAT, { fatal: false })\n\nexport const utf8ByteLength = (str: string): number => sharedTextEncoder.encode(str).byteLength\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 buildInlineDataBlock = (\n  mimeType: string,\n  data: string\n): FormattedAudioContent | FormattedImageContent | FormattedDocumentContent => {\n  if (mimeType.startsWith('audio/')) {\n    return { type: 'audio', mime_type: mimeType, data }\n  }\n  if (mimeType.startsWith('image/')) {\n    return { type: 'image', inline_data: { mime_type: mimeType, data } }\n  }\n  return { type: 'document', inline_data: { mime_type: mimeType, data } }\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 inline data (images, audio, documents)\n            const mimeType = part.inlineData.mimeType || part.inlineData.mime_type || 'application/octet-stream'\n            let data = part.inlineData.data\n\n            // Handle binary data (Uint8Array/Buffer -> base64)\n            if (data instanceof Uint8Array) {\n              if (typeof Buffer !== 'undefined') {\n                data = Buffer.from(data).toString('base64')\n              } else {\n                let binary = ''\n                for (let i = 0; i < data.length; i++) {\n                  binary += String.fromCharCode(data[i])\n                }\n                data = btoa(binary)\n              }\n            }\n\n            // Sanitize base64 data for images and other large inline data\n            data = redactBase64DataUrl(data)\n\n            content.push(buildInlineDataBlock(mimeType, data))\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 buffer = sharedTextEncoder.encode(str)\n  if (buffer.length <= MAX_OUTPUT_SIZE) {\n    // Ensure STRING_FORMAT is respected\n    return sharedTextDecoder.decode(buffer)\n  }\n\n  // Truncate the buffer and ensure a valid string is returned.\n  // fatal: false means we get U+FFFD at the end if truncation broke the encoding.\n  const truncatedBuffer = buffer.slice(0, MAX_OUTPUT_SIZE)\n  let truncatedStr = sharedTextDecoder.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 function 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    // Sanitize lone surrogates by round-tripping through UTF-8\n    return new TextDecoder().decode(new TextEncoder().encode(jsonSafe))\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 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 { sanitizeValues } from './utils'\n\nconst DEFAULT_MAX_DEPTH = 3\nconst MAX_STACK_LINES = 20\n\nexport function serializeError(value: unknown, depth = DEFAULT_MAX_DEPTH): unknown {\n  if (depth < 0 || value === null || typeof value !== 'object') {\n    return value\n  }\n  if (value instanceof Error) {\n    const out: Record<string, unknown> = {\n      name: value.name,\n      message: value.message,\n      stack: truncateStack(value.stack),\n    }\n    for (const key of Object.keys(value)) {\n      out[key] = serializeError((value as unknown as Record<string, unknown>)[key], depth - 1)\n    }\n    if (value.cause !== undefined) {\n      out.cause = serializeError(value.cause, depth - 1)\n    }\n    return out\n  }\n  if (Array.isArray(value)) {\n    return value.map((item) => serializeError(item, depth - 1))\n  }\n  return value\n}\n\nexport function stringifyError(error: unknown): string {\n  try {\n    return JSON.stringify(sanitizeValues(serializeError(error)))\n  } catch {\n    if (error instanceof Error) {\n      return JSON.stringify({ name: error.name, message: error.message })\n    }\n    return JSON.stringify({ message: String(error) })\n  }\n}\n\nfunction truncateStack(stack: string | undefined): string | undefined {\n  if (!stack) {\n    return stack\n  }\n  const lines = stack.split('\\n')\n  if (lines.length <= MAX_STACK_LINES) {\n    return stack\n  }\n  return [...lines.slice(0, MAX_STACK_LINES), '... (truncated)'].join('\\n')\n}\n","import { EventMessage, PostHog } from 'posthog-node'\nimport type { ChatCompletionTool } from 'openai/resources/chat/completions'\nimport type { Tool as GeminiTool } from '@google/genai'\nimport AnthropicOriginal from '@anthropic-ai/sdk'\nimport { v4 as uuidv4 } from 'uuid'\nimport { uuidv7, ErrorTracking as CoreErrorTracking } from '@posthog/core'\nimport { version } from '../package.json'\nimport type { TokenUsage } from './types'\nimport { stringifyError } from './serializeError'\nimport { AIEvent, CostOverride, getTokensSource, sanitizeValues, withPrivacyMode } from './utils'\n\ntype AnthropicTool = AnthropicOriginal.Tool\n\n/**\n * Options for `captureAiGeneration`. Mirrors the `$ai_generation` event shape\n * directly so that any caller — first-party SDK wrappers and external code\n * alike — produces an identical event.\n */\nexport interface CaptureAiGenerationOptions {\n  distinctId?: string\n  /** Auto-generated when omitted. */\n  traceId?: string\n  /** Defaults to `$ai_generation`. */\n  eventType?: AIEvent\n\n  /** Required for the event to be useful, but accepted as optional so SDK wrappers can pass through whatever they detect. */\n  model?: string\n  provider: string\n  input: unknown\n  output: unknown\n\n  /** Maps to `$ai_model_parameters` (temperature, max_tokens, top_p, …). */\n  modelParameters?: Record<string, unknown>\n\n  baseURL?: string\n  httpStatus?: number\n  /** Wall-clock latency in seconds. */\n  latency?: number\n  /** Time from request start to the first streamed token, in seconds. */\n  timeToFirstToken?: number\n\n  usage?: TokenUsage\n\n  /** Extra event properties merged into the captured event. */\n  properties?: Record<string, unknown>\n  /** Mapping of group type to group id, matching `EventMessage.groups`. */\n  groups?: Record<string, string | number>\n  privacyMode?: boolean\n\n  /**\n   * For SDK wrappers: overrides the auto-detected model. External callers\n   * should pass `model` directly instead.\n   */\n  modelOverride?: string\n  /**\n   * For SDK wrappers: overrides the auto-detected provider. External callers\n   * should pass `provider` directly instead.\n   */\n  providerOverride?: string\n  costOverride?: CostOverride\n\n  tools?: ChatCompletionTool[] | AnthropicTool[] | GeminiTool[] | null\n  stopReason?: string\n  /** When set, the event is captured as an error. */\n  error?: unknown\n\n  /** Awaits delivery instead of batching. Useful in serverless environments. */\n  captureImmediate?: boolean\n}\n\n/**\n * Capture an `$ai_generation` (or `$ai_embedding`) event to PostHog.\n *\n * This is the canonical primitive that every `@posthog/ai` wrapper\n * (`withTracing`, `OpenAI`, `Anthropic`, `GoogleGenAI`, …) funnels through, so\n * external code can use it directly to instrument LLM calls made through\n * arbitrary clients (Cloudflare Workers AI, custom HTTP, etc.) and get the\n * same events the SDK wrappers produce.\n *\n * When `error` is set, the event is captured as an error. If the error is an\n * object, it is mutated in place to set `__posthog_previously_captured_error`\n * so callers can re-throw the original error reference safely.\n */\nexport const captureAiGeneration = async (client: PostHog, options: CaptureAiGenerationOptions): Promise<void> => {\n  if (!client.capture) {\n    return\n  }\n\n  const traceId = options.traceId ?? uuidv4()\n  const eventType = options.eventType ?? AIEvent.Generation\n  const privacyMode = options.privacyMode ?? false\n  const usage = options.usage ?? {}\n\n  const safeInput = sanitizeValues(options.input)\n  const safeOutput = sanitizeValues(options.output)\n\n  let httpStatus = options.httpStatus\n  let errorData: Record<string, unknown> = {}\n  if (options.error) {\n    if (httpStatus === undefined) {\n      if (typeof options.error === 'object' && 'status' in options.error && typeof options.error.status === 'number') {\n        httpStatus = options.error.status\n      } else {\n        httpStatus = 500\n      }\n    }\n\n    let exceptionId: string | undefined\n    if (client.options?.enableExceptionAutocapture) {\n      exceptionId = uuidv7()\n      client.captureException(options.error, undefined, { $ai_trace_id: traceId }, exceptionId)\n      if (typeof options.error === 'object') {\n        ;(options.error as CoreErrorTracking.PreviouslyCapturedError).__posthog_previously_captured_error = true\n      }\n    }\n\n    errorData = {\n      $ai_is_error: true,\n      $ai_error: stringifyError(options.error),\n      $exception_event_id: exceptionId,\n    }\n  }\n  httpStatus = httpStatus ?? 200\n\n  let costOverrideData: Record<string, number> = {}\n  if (options.costOverride) {\n    const inputCostUSD = (options.costOverride.inputCost ?? 0) * (usage.inputTokens ?? 0)\n    const outputCostUSD = (options.costOverride.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: Record<string, unknown> = {\n    $ai_lib: 'posthog-ai',\n    $ai_lib_version: version,\n    $ai_provider: options.providerOverride ?? options.provider,\n    $ai_model: options.modelOverride ?? options.model,\n    $ai_model_parameters: options.modelParameters ?? {},\n    $ai_input: withPrivacyMode(client, privacyMode, safeInput),\n    $ai_output_choices: withPrivacyMode(client, privacyMode, 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: options.latency ?? 0,\n    ...(options.timeToFirstToken !== undefined ? { $ai_time_to_first_token: options.timeToFirstToken } : {}),\n    $ai_trace_id: traceId,\n    $ai_base_url: options.baseURL ?? '',\n    ...options.properties,\n    $ai_tokens_source: getTokensSource(options.properties),\n    ...(options.distinctId ? {} : { $process_person_profile: false }),\n    ...(options.stopReason ? { $ai_stop_reason: options.stopReason } : {}),\n    ...(options.tools ? { $ai_tools: options.tools } : {}),\n    ...errorData,\n    ...costOverrideData,\n  }\n\n  const event: EventMessage = {\n    distinctId: options.distinctId ?? traceId,\n    event: eventType,\n    properties,\n    groups: options.groups,\n  }\n\n  if (options.captureImmediate) {\n    await client.captureImmediate(event)\n  } else {\n    client.capture(event)\n  }\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  truncate,\n  MAX_OUTPUT_SIZE,\n  utf8ByteLength,\n  extractAvailableToolCalls,\n  toContentString,\n  calculateWebSearchCount,\n  getModelParams,\n} from '../utils'\nimport { captureAiGeneration } from '../captureAiGeneration'\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 serialized JSON size fits within MAX_OUTPUT_SIZE.\n    // Pre-compute each message's byte size once so we can shift by accumulated budget\n    // in a single linear pass, instead of re-stringifying the whole array per iteration.\n    const messageSizes = inputs.map((m) => utf8ByteLength(JSON.stringify(m)))\n    // Account for the surrounding `[` `]` plus a comma between each pair of elements.\n    let totalBytes = 2 + Math.max(0, messageSizes.length - 1)\n    for (const size of messageSizes) {\n      totalBytes += size\n    }\n    let removedCount = 0\n    while (totalBytes > MAX_OUTPUT_SIZE && removedCount < messageSizes.length) {\n      totalBytes -= messageSizes[removedCount]\n      // Each removed message past the first also drops the comma that joined it.\n      if (removedCount < messageSizes.length - 1) {\n        totalBytes -= 1\n      }\n      removedCount++\n    }\n    if (removedCount > 0) {\n      inputs.splice(0, removedCount)\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      const toolCall = item as { input?: unknown; args?: unknown; arguments?: unknown }\n      const rawArgs = toolCall.input ?? toolCall.args ?? toolCall.arguments ?? {}\n      return {\n        type: 'tool-call',\n        id: item.toolCallId,\n        function: {\n          name: item.toolName,\n          arguments: typeof rawArgs === 'string' ? rawArgs : JSON.stringify(rawArgs),\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// 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// Helper to extract cache write tokens from V3 (usage.inputTokens.cacheWrite). Providers like\n// Amazon Bedrock populate this standardized field instead of providerMetadata.anthropic.\nconst extractCacheWriteTokens = (usage: Record<string, unknown>): unknown => {\n  if (\n    'inputTokens' in usage &&\n    usage.inputTokens &&\n    typeof usage.inputTokens === 'object' &&\n    'cacheWrite' in usage.inputTokens\n  ) {\n    return (usage.inputTokens as { cacheWrite: unknown }).cacheWrite\n  }\n  return undefined\n}\n\n// Extract additional token values from provider metadata, with a V3 standardized fallback\n// (e.g. Amazon Bedrock exposes cache write tokens via usage.inputTokens.cacheWrite rather\n// than providerMetadata.anthropic.cacheCreationInputTokens). A cacheWrite of 0 is treated\n// as absent so we preserve the pre-fallback event shape on providers that simply omit the\n// field — consumers downstream saw `$ai_cache_creation_input_tokens` missing, not 0.\nconst extractAdditionalTokenValues = (providerMetadata: unknown, usage: 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  if (usage && typeof usage === 'object') {\n    const cacheWrite = extractCacheWriteTokens(usage as Record<string, unknown>)\n    if (typeof cacheWrite === 'number' && cacheWrite > 0) {\n      return { cacheCreationInputTokens: cacheWrite }\n    }\n  }\n  return {}\n}\n\n// Detects Anthropic Claude regardless of host (direct Anthropic, Amazon Bedrock, Google Vertex, etc.).\n// The server applies exclusive cache token accounting based on the model name, so any Claude model\n// needs its V3 input tokens adjusted to exclude cache tokens — not just those routed through a\n// provider whose name contains \"anthropic\". Accepts the resolved modelId string (not the raw model)\n// so it sees the same id the server does after posthogModelOverride / response.modelId fallbacks.\nconst isAnthropicClaudeModel = (modelId: string, provider: string): boolean => {\n  if (provider.toLowerCase().includes('anthropic')) {\n    return true\n  }\n  return /claude|anthropic/i.test(modelId)\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  modelId: string,\n  provider: string,\n  usage: { inputTokens?: number; cacheReadInputTokens?: unknown; cacheCreationInputTokens?: unknown }\n): void => {\n  if (isV3Model(model) && isAnthropicClaudeModel(modelId, provider)) {\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/**\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  // Shared `captureAiGeneration` options for every call site in this wrapper.\n  const baseOptions = {\n    distinctId: mergedOptions.posthogDistinctId,\n    traceId,\n    properties: mergedOptions.posthogProperties,\n    groups: mergedOptions.posthogGroups,\n    privacyMode: mergedOptions.posthogPrivacyMode,\n    modelOverride: mergedOptions.posthogModelOverride,\n    providerOverride: mergedOptions.posthogProviderOverride,\n    costOverride: mergedOptions.posthogCostOverride,\n    captureImmediate: mergedOptions.posthogCaptureImmediate,\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          // result.content is undefined when the model returns only tool calls with no text output\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, result.usage)\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, modelId, provider, usage)\n\n          // Extract finish reason - V2 returns a string, V3 returns an object with .unified\n          const rawFinishReason = result.finishReason\n          const finishReasonStr =\n            typeof rawFinishReason === 'string'\n              ? rawFinishReason\n              : rawFinishReason && typeof rawFinishReason === 'object' && 'unified' in rawFinishReason\n                ? String(rawFinishReason.unified)\n                : undefined\n\n          await captureAiGeneration(phClient, {\n            ...baseOptions,\n            model: modelId,\n            provider: provider,\n            input: mergedOptions.posthogPrivacyMode ? '' : mapVercelPrompt(params.prompt as LanguageModelPrompt),\n            output: content,\n            latency,\n            baseURL,\n            modelParameters: getModelParams(mergedParams as any),\n            httpStatus: 200,\n            usage,\n            stopReason: finishReasonStr,\n            tools: availableTools,\n          })\n\n          return result\n        } catch (error: unknown) {\n          const modelId = model.modelId\n          await captureAiGeneration(phClient, {\n            ...baseOptions,\n            model: modelId,\n            provider: model.provider,\n            input: mergedOptions.posthogPrivacyMode ? '' : mapVercelPrompt(params.prompt as LanguageModelPrompt),\n            output: [],\n            latency: 0,\n            baseURL: '',\n            modelParameters: getModelParams(mergedParams as any),\n            usage: {\n              inputTokens: 0,\n              outputTokens: 0,\n            },\n            error: error,\n            tools: availableTools,\n          })\n          throw error\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 stopReason: string | undefined\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 chunkUsage = (chunk.usage as Record<string, unknown>) || {}\n                const additionalTokenValues = extractAdditionalTokenValues(providerMetadata, chunkUsage)\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                // Extract finish reason - V2 returns a string, V3 returns an object with .unified\n                const rawFinishReason = chunk.finishReason\n                if (typeof rawFinishReason === 'string') {\n                  stopReason = rawFinishReason\n                } else if (rawFinishReason && typeof rawFinishReason === 'object' && 'unified' in rawFinishReason) {\n                  stopReason = String(rawFinishReason.unified)\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, modelId, provider, finalUsage)\n\n              await captureAiGeneration(phClient, {\n                ...baseOptions,\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                modelParameters: getModelParams(mergedParams as any),\n                httpStatus: 200,\n                usage: finalUsage,\n                stopReason,\n                tools: availableTools,\n              })\n            },\n          })\n\n          return {\n            stream: stream.pipeThrough(transformStream),\n            ...rest,\n          }\n        } catch (error: unknown) {\n          await captureAiGeneration(phClient, {\n            ...baseOptions,\n            model: modelId,\n            provider: provider,\n            input: mergedOptions.posthogPrivacyMode ? '' : mapVercelPrompt(params.prompt as LanguageModelPrompt),\n            output: [],\n            latency: 0,\n            baseURL: '',\n            modelParameters: getModelParams(mergedParams as any),\n            usage: {\n              inputTokens: 0,\n              outputTokens: 0,\n            },\n            error: error,\n            tools: availableTools,\n          })\n          throw error\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","DATA_URL_PREFIX_RE","BASE64_ALPHABET_RE","Base64Recognizer","recognize","minLength","dataUrl","exec","kind","mediaType","length","confidencePrefix","slice","test","MIME_HINT_KEYS","STRONG_CONTEXT_KEYS","Set","STRONG_CONTEXT_TYPES","FILE_FAMILY_TYPES","KNOWN_AUDIO_FORMATS","MediaTypeContext","EMPTY","undefined","constructor","parent","key","inferMediaType","inferFromSiblingMime","inferFromSiblingFormat","inferFromParentType","inferFromKey","hint","v","fmt","format","has","toLowerCase","t","type","includes","signalsBinary","STRONG_CONTEXT_MIN_LENGTH","WEAK_CONTEXT_MIN_LENGTH","BinaryContentRedactor","visited","WeakSet","recognizer","redact","isMultimodalEnabled","walk","ctx","redactString","Uint8Array","placeholderFor","add","Array","isArray","map","item","obj","out","k","Object","keys","recognition","val","process","env","_INTERNAL_LLMA_MULTIMODAL","redactor","redactBase64DataUrl","str","TOKEN_PROPERTY_KEYS","getTokensSource","posthogProperties","some","MAX_OUTPUT_SIZE","STRING_FORMAT","sharedTextEncoder","TextEncoder","sharedTextDecoder","TextDecoder","fatal","utf8ByteLength","encode","byteLength","toContentString","content","JSON","stringify","String","getModelParams","params","modelParams","paramKeys","withPrivacyMode","client","privacyMode","input","privacy_mode","toSafeString","console","warn","truncate","buffer","decode","truncatedBuffer","truncatedStr","endsWith","calculateWebSearchCount","result","output","count","citations","search_results","usage","search_context_size","choices","choice","message","delta","annotations","hasUrlCitation","ann","contentItem","candidates","candidate","grounding_metadata","extractAvailableToolCalls","provider","tools","AIEvent","sanitizeValues","jsonSafe","parse","fromEntries","entries","DEFAULT_MAX_DEPTH","MAX_STACK_LINES","serializeError","depth","Error","name","stack","truncateStack","cause","stringifyError","error","lines","split","join","captureAiGeneration","options","capture","traceId","uuidv4","eventType","Generation","safeInput","safeOutput","httpStatus","errorData","status","exceptionId","enableExceptionAutocapture","uuidv7","captureException","$ai_trace_id","__posthog_previously_captured_error","$ai_is_error","$ai_error","$exception_event_id","costOverrideData","costOverride","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","properties","$ai_lib","$ai_lib_version","version","$ai_provider","providerOverride","$ai_model","modelOverride","model","$ai_model_parameters","modelParameters","$ai_input","$ai_output_choices","$ai_http_status","$ai_input_tokens","$ai_output_tokens","$ai_latency","latency","timeToFirstToken","$ai_time_to_first_token","$ai_base_url","baseURL","$ai_tokens_source","distinctId","$process_person_profile","stopReason","$ai_stop_reason","$ai_tools","event","groups","captureImmediate","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","URL","toString","file","reasoning","toolCallId","toolName","isError","messageSizes","m","totalBytes","Math","max","size","removedCount","splice","unshift","mapVercelOutput","toolCall","rawArgs","args","arguments","id","function","sourceType","url","title","jsonOutput","extractProvider","providerName","extractWebSearchCount","providerMetadata","anthropic","serverToolUse","server_tool_use","web_search_requests","extractTokenCount","total","extractReasoningTokens","extractCacheReadTokens","cachedInputTokens","cacheRead","extractCacheWriteTokens","cacheWrite","extractAdditionalTokenValues","isAnthropicClaudeModel","modelId","adjustAnthropicV3CacheTokens","cacheReadTokens","cacheWriteTokens","cacheTokens","wrapVercelLanguageModel","phClient","posthogTraceId","mergedOptions","posthogDistinctId","$ai_framework","$ai_framework_version","baseOptions","posthogGroups","posthogPrivacyMode","posthogModelOverride","posthogProviderOverride","posthogCostOverride","posthogCaptureImmediate","wrappedModel","create","doGenerate","startTime","Date","now","mergedParams","availableTools","response","usageObj","rawUsageData","responseBody","body","rawResponse","usageMetadata","rawFinishReason","finishReason","finishReasonStr","unified","prompt","writable","configurable","enumerable","doStream","firstTokenTime","generatedText","reasoningText","toolCallsInProgress","Map","rest","transformStream","TransformStream","transform","chunk","controller","set","get","chunkUsage","enqueue","flush","push","values","finalUsage","pipeThrough"],"mappings":"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"}