{"version":3,"file":"index.mjs","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/gatewayWarning.ts","../../src/captureAiGeneration.ts","../../src/gemini/index.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 type OpenAIOrignal from 'openai'\nimport type AnthropicOriginal from '@anthropic-ai/sdk'\nimport type { ResponseCreateParamsWithTools } from 'openai/lib/ResponsesParser'\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\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 = (provider: string, params: any): unknown[] | 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","// Warn when a wrapper's base_url points at the PostHog AI Gateway: the gateway\n// emits its own $ai_generation, so each call would be captured (and, for billable\n// products, billed) twice. We only warn — the wrapper's event carries data the\n// gateway never sees (groups, custom properties, trace hierarchy).\n\n// Keep in sync with the gateway's deployed hosts (see services/llm-gateway in the\n// main repo). gateway.us.posthog.com is live today; the rest are listed ahead of\n// any traffic moving to them.\nexport const POSTHOG_AI_GATEWAY_HOSTS: readonly string[] = [\n  'gateway.posthog.com',\n  'gateway.us.posthog.com',\n  'gateway.eu.posthog.com',\n  'ai-gateway.us.posthog.com',\n  'ai-gateway.eu.posthog.com',\n]\n\n// Swap for the dedicated AI Gateway page once it ships.\nconst GATEWAY_DOCS_URL = 'https://posthog.com/docs/ai-observability'\n\nconst extractHost = (baseURL: string): string | undefined => {\n  try {\n    // Tolerate bare hosts that omit a scheme, e.g. \"gateway.us.posthog.com/v1\".\n    const hasScheme = /^[a-z][a-z0-9+.-]*:\\/\\//i.test(baseURL)\n    return new URL(hasScheme ? baseURL : `https://${baseURL}`).hostname.toLowerCase()\n  } catch {\n    return undefined\n  }\n}\n\nexport const isPostHogAiGatewayUrl = (baseURL: string | undefined | null): boolean => {\n  if (!baseURL) {\n    return false\n  }\n  const host = extractHost(baseURL)\n  return host !== undefined && POSTHOG_AI_GATEWAY_HOSTS.includes(host)\n}\n\n// Warns on every gateway call by design: the misconfiguration is impossible to\n// miss that way, and a doubled bill is worse than noisy logs.\nexport const warnIfPostHogAiGateway = (baseURL: string | undefined | null): void => {\n  if (!isPostHogAiGatewayUrl(baseURL)) {\n    return\n  }\n  console.warn(\n    '[PostHog] The PostHog AI wrapper is pointed at the PostHog AI Gateway. ' +\n      'Both capture $ai_generation, so every call is double-counted and double-billed. ' +\n      `Use one or the other — see ${GATEWAY_DOCS_URL}.`\n  )\n}\n\n// OTel spans don't pass through captureAiGeneration, so detect the gateway from\n// the span's host/URL attributes instead. These follow the GenAI / HTTP semantic\n// conventions: `server.address` is a bare host, `url.full` a full URL, both of\n// which isPostHogAiGatewayUrl accepts.\nconst OTEL_GATEWAY_URL_ATTRIBUTES = ['server.address', 'url.full'] as const\n\nexport const warnIfPostHogAiGatewayOtelAttributes = (attributes: Record<string, unknown> | undefined): void => {\n  if (!attributes) {\n    return\n  }\n  for (const key of OTEL_GATEWAY_URL_ATTRIBUTES) {\n    const value = attributes[key]\n    if (typeof value === 'string' && isPostHogAiGatewayUrl(value)) {\n      warnIfPostHogAiGateway(value)\n      return\n    }\n  }\n}\n","import { EventMessage, PostHog } from 'posthog-node'\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'\nimport { warnIfPostHogAiGateway } from './gatewayWarning'\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?: unknown[] | null\n  stopReason?: string\n\n  /**\n   * Provider-assigned ID for the generation (e.g. OpenAI's `chatcmpl-…` /\n   * `resp_…`). Maps to `$ai_completion_id`. Response IDs generalize across\n   * providers, so this lives in the shared schema rather than under\n   * `providerMetadata`.\n   */\n  completionId?: string\n  /**\n   * Provider-specific response metadata that has no place in the shared,\n   * provider-agnostic `$ai_*` schema (e.g. OpenAI's `system_fingerprint` and\n   * `request_id`). Maps to `$ai_provider_metadata`; omitted when empty.\n   */\n  providerMetadata?: Record<string, unknown>\n\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  warnIfPostHogAiGateway(options.baseURL)\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    ...(options.completionId ? { $ai_completion_id: options.completionId } : {}),\n    ...(options.providerMetadata && Object.keys(options.providerMetadata).length > 0\n      ? { $ai_provider_metadata: options.providerMetadata }\n      : {}),\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 {\n  GoogleGenAI,\n  GenerateContentResponse as GeminiResponse,\n  GenerateContentParameters,\n  EmbedContentParameters,\n  EmbedContentResponse,\n  Part,\n  GenerateContentResponseUsageMetadata,\n} from '@google/genai'\nimport type { GoogleGenAIOptions } from '@google/genai'\nimport { PostHog } from 'posthog-node'\nimport {\n  AIEvent,\n  MonitoringParams,\n  extractAvailableToolCalls,\n  formatResponseGemini,\n  extractPosthogParams,\n  toContentString,\n  withPrivacyMode,\n  buildInlineDataBlock,\n  getModelParams,\n} from '../utils'\nimport { captureAiGeneration } from '../captureAiGeneration'\nimport { sanitizeGemini } from '../sanitization'\nimport type { TokenUsage, FormattedContent, FormattedContentItem, FormattedMessage } from '../types'\nimport { isString } from '../typeGuards'\n\ninterface MonitoringGeminiConfig extends GoogleGenAIOptions {\n  posthog: PostHog\n}\n\nexport class PostHogGoogleGenAI {\n  private readonly phClient: PostHog\n  private readonly client: GoogleGenAI\n  public models: WrappedModels\n\n  constructor(config: MonitoringGeminiConfig) {\n    const { posthog, ...geminiConfig } = config\n    this.phClient = posthog\n    this.client = new GoogleGenAI(geminiConfig)\n    this.models = new WrappedModels(this.client, this.phClient)\n  }\n}\n\nexport class WrappedModels {\n  private readonly phClient: PostHog\n  private readonly client: GoogleGenAI\n\n  constructor(client: GoogleGenAI, phClient: PostHog) {\n    this.client = client\n    this.phClient = phClient\n  }\n\n  public async generateContent(params: GenerateContentParameters & MonitoringParams): Promise<GeminiResponse> {\n    const { providerParams: geminiParams, posthogParams } = extractPosthogParams(params)\n    const startTime = Date.now()\n\n    try {\n      const response = await this.client.models.generateContent(geminiParams as GenerateContentParameters)\n      const latency = (Date.now() - startTime) / 1000\n\n      const availableTools = extractAvailableToolCalls('gemini', geminiParams)\n\n      const metadata = response.usageMetadata\n      const finishReason = response.candidates?.[0]?.finishReason\n      await captureAiGeneration(this.phClient, {\n        ...posthogParams,\n        model: geminiParams.model,\n        provider: 'gemini',\n        input: this.formatInputForPostHog(geminiParams),\n        output: formatResponseGemini(response),\n        latency,\n        baseURL: 'https://generativelanguage.googleapis.com',\n        modelParameters: getModelParams(params as GenerateContentParameters & MonitoringParams),\n        httpStatus: 200,\n        usage: {\n          inputTokens: metadata?.promptTokenCount ?? 0,\n          outputTokens: metadata?.candidatesTokenCount ?? 0,\n          reasoningTokens:\n            (metadata as GenerateContentResponseUsageMetadata & { thoughtsTokenCount?: number })?.thoughtsTokenCount ??\n            0,\n          cacheReadInputTokens: metadata?.cachedContentTokenCount ?? 0,\n          webSearchCount: calculateGoogleWebSearchCount(response),\n          rawUsage: metadata,\n        },\n        stopReason: finishReason ?? undefined,\n        tools: availableTools,\n      })\n\n      return response\n    } catch (error: unknown) {\n      const latency = (Date.now() - startTime) / 1000\n      await captureAiGeneration(this.phClient, {\n        ...posthogParams,\n        model: geminiParams.model,\n        provider: 'gemini',\n        input: this.formatInputForPostHog(geminiParams),\n        output: [],\n        latency,\n        baseURL: 'https://generativelanguage.googleapis.com',\n        modelParameters: getModelParams(params as GenerateContentParameters & MonitoringParams),\n        usage: {\n          inputTokens: 0,\n          outputTokens: 0,\n        },\n        error,\n      })\n      throw error\n    }\n  }\n\n  public async *generateContentStream(\n    params: GenerateContentParameters & MonitoringParams\n  ): AsyncGenerator<GeminiResponse, void, unknown> {\n    const { providerParams: geminiParams, posthogParams } = extractPosthogParams(params)\n    const startTime = Date.now()\n    const accumulatedContent: FormattedContent = []\n    let firstTokenTime: number | undefined\n    let stopReason: string | undefined\n    let usage: TokenUsage = {\n      inputTokens: 0,\n      outputTokens: 0,\n      webSearchCount: 0,\n      rawUsage: undefined,\n    }\n\n    try {\n      const stream = await this.client.models.generateContentStream(geminiParams as GenerateContentParameters)\n\n      for await (const chunk of stream) {\n        // Track first token time when we get text content\n        if (firstTokenTime === undefined && chunk.text) {\n          firstTokenTime = Date.now()\n        }\n        const chunkWebSearchCount = calculateGoogleWebSearchCount(chunk)\n        if (chunkWebSearchCount > 0 && chunkWebSearchCount > (usage.webSearchCount ?? 0)) {\n          usage.webSearchCount = chunkWebSearchCount\n        }\n\n        // Handle text content\n        if (chunk.text) {\n          // Find if we already have a text item to append to\n          let lastTextItem: FormattedContentItem | undefined\n          for (let i = accumulatedContent.length - 1; i >= 0; i--) {\n            if (accumulatedContent[i].type === 'text') {\n              lastTextItem = accumulatedContent[i]\n              break\n            }\n          }\n\n          if (lastTextItem && lastTextItem.type === 'text') {\n            lastTextItem.text += chunk.text\n          } else {\n            accumulatedContent.push({ type: 'text', text: chunk.text })\n          }\n        }\n\n        // Track finish reason from candidates\n        if (chunk.candidates?.[0]?.finishReason) {\n          stopReason = chunk.candidates[0].finishReason\n        }\n\n        // Handle function calls from candidates\n        if (chunk.candidates && Array.isArray(chunk.candidates)) {\n          for (const candidate of chunk.candidates) {\n            if (candidate.content && candidate.content.parts) {\n              for (const part of candidate.content.parts) {\n                // Type-safe check for functionCall\n                if ('functionCall' in part) {\n                  if (firstTokenTime === undefined) {\n                    firstTokenTime = Date.now()\n                  }\n                  const funcCall = (part as Part & { functionCall?: { name?: string; args?: unknown } }).functionCall\n                  if (funcCall?.name) {\n                    accumulatedContent.push({\n                      type: 'function',\n                      function: {\n                        name: funcCall.name,\n                        arguments: funcCall.args || {},\n                      },\n                    })\n                  }\n                }\n              }\n            }\n          }\n        }\n\n        // Update usage metadata - handle both old and new field names\n        if (chunk.usageMetadata) {\n          const metadata = chunk.usageMetadata as GenerateContentResponseUsageMetadata\n          usage = {\n            inputTokens: metadata.promptTokenCount ?? 0,\n            outputTokens: metadata.candidatesTokenCount ?? 0,\n            reasoningTokens:\n              (metadata as GenerateContentResponseUsageMetadata & { thoughtsTokenCount?: number }).thoughtsTokenCount ??\n              0,\n            cacheReadInputTokens: metadata.cachedContentTokenCount ?? 0,\n            webSearchCount: usage.webSearchCount,\n            rawUsage: metadata,\n          }\n        }\n        yield chunk\n      }\n\n      const latency = (Date.now() - startTime) / 1000\n      const timeToFirstToken = firstTokenTime !== undefined ? (firstTokenTime - startTime) / 1000 : undefined\n\n      const availableTools = extractAvailableToolCalls('gemini', geminiParams)\n\n      // Format output similar to formatResponseGemini\n      const output = accumulatedContent.length > 0 ? [{ role: 'assistant', content: accumulatedContent }] : []\n\n      await captureAiGeneration(this.phClient, {\n        ...posthogParams,\n        model: geminiParams.model,\n        provider: 'gemini',\n        input: this.formatInputForPostHog(geminiParams),\n        output,\n        latency,\n        timeToFirstToken,\n        baseURL: 'https://generativelanguage.googleapis.com',\n        modelParameters: getModelParams(params as GenerateContentParameters & MonitoringParams),\n        httpStatus: 200,\n        usage: {\n          ...usage,\n          webSearchCount: usage.webSearchCount,\n          rawUsage: usage.rawUsage,\n        },\n        stopReason,\n        tools: availableTools,\n      })\n    } catch (error: unknown) {\n      const latency = (Date.now() - startTime) / 1000\n      await captureAiGeneration(this.phClient, {\n        ...posthogParams,\n        model: geminiParams.model,\n        provider: 'gemini',\n        input: this.formatInputForPostHog(geminiParams),\n        output: [],\n        latency,\n        baseURL: 'https://generativelanguage.googleapis.com',\n        modelParameters: getModelParams(params as GenerateContentParameters & MonitoringParams),\n        usage: {\n          inputTokens: 0,\n          outputTokens: 0,\n        },\n        error,\n      })\n      throw error\n    }\n  }\n\n  public async embedContent(params: EmbedContentParameters & MonitoringParams): Promise<EmbedContentResponse> {\n    const { providerParams: geminiParams, posthogParams } = extractPosthogParams(params)\n    const startTime = Date.now()\n\n    try {\n      const response = await this.client.models.embedContent(geminiParams as EmbedContentParameters)\n      const latency = (Date.now() - startTime) / 1000\n\n      const inputTokens = extractEmbeddingTokenCount(response)\n\n      await captureAiGeneration(this.phClient, {\n        ...posthogParams,\n        eventType: AIEvent.Embedding,\n        model: geminiParams.model,\n        provider: 'gemini',\n        input: withPrivacyMode(this.phClient, posthogParams.privacyMode ?? false, geminiParams.contents),\n        output: null,\n        latency,\n        baseURL: 'https://generativelanguage.googleapis.com',\n        modelParameters: getModelParams(params as EmbedContentParameters & MonitoringParams),\n        httpStatus: 200,\n        usage: {\n          inputTokens,\n        },\n      })\n\n      return response\n    } catch (error: unknown) {\n      const latency = (Date.now() - startTime) / 1000\n      await captureAiGeneration(this.phClient, {\n        ...posthogParams,\n        eventType: AIEvent.Embedding,\n        model: geminiParams.model,\n        provider: 'gemini',\n        input: withPrivacyMode(this.phClient, posthogParams.privacyMode ?? false, geminiParams.contents),\n        output: null,\n        latency,\n        baseURL: 'https://generativelanguage.googleapis.com',\n        modelParameters: getModelParams(params as EmbedContentParameters & MonitoringParams),\n        usage: {\n          inputTokens: 0,\n        },\n        error,\n      })\n      throw error\n    }\n  }\n\n  private formatPartsAsContentBlocks(parts: unknown[]): FormattedContent {\n    const blocks: FormattedContent = []\n\n    for (const part of parts) {\n      // Handle dict/object with text field\n      if (part && typeof part === 'object' && 'text' in part && part.text) {\n        blocks.push({ type: 'text', text: String(part.text) })\n      }\n      // Handle string parts\n      else if (typeof part === 'string') {\n        blocks.push({ type: 'text', text: part })\n      }\n      // Handle inlineData (images, audio, PDFs)\n      else if (part && typeof part === 'object' && 'inlineData' in part) {\n        const inlineData = (part as any).inlineData\n        const mimeType = inlineData.mimeType || inlineData.mime_type || 'application/octet-stream'\n        blocks.push(buildInlineDataBlock(mimeType, inlineData.data))\n      }\n    }\n\n    return blocks\n  }\n\n  private formatInput(contents: unknown): FormattedMessage[] {\n    if (typeof contents === 'string') {\n      return [{ role: 'user', content: contents }]\n    }\n\n    if (Array.isArray(contents)) {\n      return contents.map((item) => {\n        if (typeof item === 'string') {\n          return { role: 'user', content: item }\n        }\n\n        if (item && typeof item === 'object') {\n          const obj = item as Record<string, unknown>\n          if ('text' in obj && obj.text) {\n            return { role: isString(obj.role) ? obj.role : 'user', content: obj.text }\n          }\n\n          if ('content' in obj && obj.content) {\n            // If content is a list, format it as content blocks\n            if (Array.isArray(obj.content)) {\n              const contentBlocks = this.formatPartsAsContentBlocks(obj.content)\n              return { role: isString(obj.role) ? obj.role : 'user', content: contentBlocks }\n            }\n            return { role: isString(obj.role) ? obj.role : 'user', content: obj.content }\n          }\n\n          if ('parts' in obj && Array.isArray(obj.parts)) {\n            const contentBlocks = this.formatPartsAsContentBlocks(obj.parts)\n            return {\n              role: isString(obj.role) ? obj.role : 'user',\n              content: contentBlocks,\n            }\n          }\n        }\n\n        return { role: 'user', content: toContentString(item) }\n      })\n    }\n\n    if (contents && typeof contents === 'object') {\n      const obj = contents as Record<string, unknown>\n      if ('text' in obj && obj.text) {\n        return [{ role: 'user', content: obj.text }]\n      }\n\n      if ('content' in obj && obj.content) {\n        return [{ role: 'user', content: obj.content }]\n      }\n    }\n\n    return [{ role: 'user', content: toContentString(contents) }]\n  }\n\n  private extractSystemInstruction(params: GenerateContentParameters): string | null {\n    if (!params || typeof params !== 'object' || !params.config) {\n      return null\n    }\n    const config = params.config as any\n    if (!('systemInstruction' in config)) {\n      return null\n    }\n    const systemInstruction = config.systemInstruction\n    if (typeof systemInstruction === 'string') {\n      return systemInstruction\n    }\n    if (systemInstruction && typeof systemInstruction === 'object' && 'text' in systemInstruction) {\n      return systemInstruction.text\n    }\n    if (\n      systemInstruction &&\n      typeof systemInstruction === 'object' &&\n      'parts' in systemInstruction &&\n      Array.isArray(systemInstruction.parts)\n    ) {\n      for (const part of systemInstruction.parts) {\n        if (part && typeof part === 'object' && 'text' in part && typeof part.text === 'string') {\n          return part.text\n        }\n      }\n    }\n    if (Array.isArray(systemInstruction)) {\n      for (const part of systemInstruction) {\n        if (typeof part === 'string') {\n          return part\n        }\n        if (part && typeof part === 'object' && 'text' in part && typeof part.text === 'string') {\n          return part.text\n        }\n      }\n    }\n    return null\n  }\n\n  private formatInputForPostHog(params: GenerateContentParameters): FormattedMessage[] {\n    const sanitized = sanitizeGemini(params.contents)\n    const messages = this.formatInput(sanitized)\n\n    const systemInstruction = this.extractSystemInstruction(params)\n\n    if (systemInstruction) {\n      const hasSystemMessage = messages.some((msg: FormattedMessage) => msg.role === 'system')\n\n      if (!hasSystemMessage) {\n        return [{ role: 'system', content: systemInstruction }, ...messages]\n      }\n    }\n\n    return messages\n  }\n}\n\n/**\n * Extract total token count from a Gemini embed_content response.\n * Token counts are only available per-embedding via Vertex AI's statistics.tokenCount.\n * Returns 0 if no token counts are available.\n */\nfunction extractEmbeddingTokenCount(response: EmbedContentResponse): number {\n  let total = 0\n  if (response.embeddings) {\n    for (const embedding of response.embeddings) {\n      if (embedding.statistics?.tokenCount != null) {\n        total += embedding.statistics.tokenCount\n      }\n    }\n  }\n  return total\n}\n\n/**\n * Detect if Google Search grounding was used in the response.\n * Gemini bills per request that uses grounding, not per individual query.\n * Returns 1 if grounding was used, 0 otherwise.\n */\nfunction calculateGoogleWebSearchCount(response: unknown): number {\n  if (!response || typeof response !== 'object' || !('candidates' in response)) {\n    return 0\n  }\n\n  const candidates = response.candidates\n\n  if (!Array.isArray(candidates)) {\n    return 0\n  }\n\n  const hasGrounding = candidates.some((candidate: unknown) => {\n    if (!candidate || typeof candidate !== 'object') {\n      return false\n    }\n\n    // Check for grounding metadata\n    if ('groundingMetadata' in candidate && candidate.groundingMetadata) {\n      const metadata = candidate.groundingMetadata as any\n\n      if (typeof metadata === 'object') {\n        // Check if web_search_queries exists and is non-empty\n        if (\n          'webSearchQueries' in metadata &&\n          Array.isArray(metadata.webSearchQueries) &&\n          metadata.webSearchQueries.length > 0\n        ) {\n          return true\n        }\n\n        // Check if grounding_chunks exists and is non-empty\n        if (\n          'groundingChunks' in metadata &&\n          Array.isArray(metadata.groundingChunks) &&\n          metadata.groundingChunks.length > 0\n        ) {\n          return true\n        }\n      }\n    }\n\n    // Check for google search in function calls\n    if ('content' in candidate && candidate.content && typeof candidate.content === 'object') {\n      const content = candidate.content\n\n      if ('parts' in content && Array.isArray(content.parts)) {\n        return content.parts.some((part: unknown) => {\n          if (!part || typeof part !== 'object' || !('functionCall' in part)) {\n            return false\n          }\n\n          const functionCall = part.functionCall\n\n          if (\n            functionCall &&\n            typeof functionCall === 'object' &&\n            'name' in functionCall &&\n            typeof functionCall.name === 'string'\n          ) {\n            return functionCall.name.includes('google_search') || functionCall.name.includes('grounding')\n          }\n\n          return false\n        })\n      }\n    }\n\n    return false\n  })\n\n  return hasGrounding ? 1 : 0\n}\n\nexport default PostHogGoogleGenAI\nexport { PostHogGoogleGenAI as Gemini }\nexport { PostHogGoogleGenAI as GoogleGenAI }\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","sanitizeGemini","data","TOKEN_PROPERTY_KEYS","getTokensSource","posthogProperties","some","STRING_FORMAT","TextEncoder","TextDecoder","fatal","toContentString","content","JSON","stringify","String","getModelParams","params","modelParams","paramKeys","buildInlineDataBlock","mimeType","startsWith","mime_type","inline_data","formatResponseGemini","response","output","candidates","candidate","parts","part","text","push","functionCall","function","name","arguments","args","inlineData","Buffer","from","toString","binary","i","fromCharCode","btoa","role","withPrivacyMode","client","privacyMode","input","privacy_mode","extractAvailableToolCalls","provider","config","tools","AIEvent","sanitizeValues","jsonSafe","parse","decode","encode","fromEntries","entries","POSTHOG_PARAMS_MAP","posthogDistinctId","posthogTraceId","posthogPrivacyMode","posthogGroups","posthogModelOverride","posthogProviderOverride","posthogCostOverride","posthogCaptureImmediate","extractPosthogParams","body","providerParams","posthogParams","console","warn","addDefaults","traceId","uuidv4","DEFAULT_MAX_DEPTH","MAX_STACK_LINES","serializeError","depth","Error","message","stack","truncateStack","cause","stringifyError","error","lines","split","join","POSTHOG_AI_GATEWAY_HOSTS","GATEWAY_DOCS_URL","extractHost","baseURL","hasScheme","URL","hostname","isPostHogAiGatewayUrl","host","warnIfPostHogAiGateway","captureAiGeneration","options","capture","eventType","Generation","usage","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","$ai_tokens_source","distinctId","$process_person_profile","stopReason","$ai_stop_reason","$ai_tools","completionId","$ai_completion_id","providerMetadata","$ai_provider_metadata","event","groups","captureImmediate","PostHogGoogleGenAI","posthog","geminiConfig","phClient","GoogleGenAI","models","WrappedModels","generateContent","geminiParams","startTime","Date","now","availableTools","metadata","usageMetadata","finishReason","formatInputForPostHog","promptTokenCount","candidatesTokenCount","thoughtsTokenCount","cachedContentTokenCount","calculateGoogleWebSearchCount","generateContentStream","accumulatedContent","firstTokenTime","stream","chunk","chunkWebSearchCount","lastTextItem","funcCall","embedContent","extractEmbeddingTokenCount","Embedding","contents","formatPartsAsContentBlocks","blocks","formatInput","contentBlocks","extractSystemInstruction","systemInstruction","sanitized","messages","hasSystemMessage","msg","total","embeddings","embedding","statistics","tokenCount","hasGrounding","groundingMetadata","webSearchQueries","groundingChunks"],"mappings":"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"}