{"version":3,"file":"index.mjs","sources":["../../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/langchain/callbacks.ts"],"sourcesContent":["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 { PostHog } from 'posthog-node'\nimport { withPrivacyMode, getModelParams, toContentString } from '../utils'\nimport { BaseCallbackHandler } from '@langchain/core/callbacks/base'\nimport { version } from '../../package.json'\nimport type { Serialized } from '@langchain/core/load/serializable'\nimport type { ChainValues } from '@langchain/core/utils/types'\nimport type { LLMResult } from '@langchain/core/outputs'\nimport type { AgentAction, AgentFinish } from '@langchain/core/agents'\nimport type { DocumentInterface } from '@langchain/core/documents'\nimport { ToolCall } from '@langchain/core/messages/tool'\nimport { BaseMessage } from '@langchain/core/messages'\nimport { sanitizeLangChain } from '../sanitization'\nimport { stringifyError } from '../serializeError'\nimport { warnIfPostHogAiGateway } from '../gatewayWarning'\n\ninterface SpanMetadata {\n  /** Name of the trace/span (e.g. chain name) */\n  name: string\n  /** Timestamp (in ms) when the run started */\n  startTime: number\n  /** Timestamp (in ms) when the run ended (if already finished) */\n  endTime?: number\n  /** The input state */\n  input?: any\n}\n\ninterface GenerationMetadata extends SpanMetadata {\n  /** Provider used (e.g. openai, anthropic) */\n  provider?: string\n  /** Model name used in the generation */\n  model?: string\n  /** The model parameters (temperature, max_tokens, etc.) */\n  modelParams?: Record<string, any>\n  /** The base URL—for example, the API base used */\n  baseUrl?: string\n  /** The tools used in the generation */\n  tools?: Record<string, any>\n}\n\n/** A run may either be a Span or a Generation */\ntype RunMetadata = SpanMetadata | GenerationMetadata\n\n/** Storage for run metadata */\ntype RunMetadataStorage = { [runId: string]: RunMetadata }\n\nexport class LangChainCallbackHandler extends BaseCallbackHandler {\n  public name = 'PosthogCallbackHandler'\n  private client: PostHog\n  private distinctId?: string | number\n  private traceId?: string | number\n  private properties: Record<string, any>\n  private privacyMode: boolean\n  private groups: Record<string, any>\n  private debug: boolean\n\n  private runs: RunMetadataStorage = {}\n  private parentTree: { [runId: string]: string } = {}\n\n  constructor(options: {\n    client: PostHog\n    distinctId?: string | number\n    traceId?: string | number\n    properties?: Record<string, any>\n    privacyMode?: boolean\n    groups?: Record<string, any>\n    debug?: boolean\n  }) {\n    if (!options.client) {\n      throw new Error('PostHog client is required')\n    }\n    super()\n    this.client = options.client\n    this.distinctId = options.distinctId\n    this.traceId = options.traceId\n    this.properties = options.properties || {}\n    this.privacyMode = options.privacyMode || false\n    this.groups = options.groups || {}\n    this.debug = options.debug || false\n  }\n\n  // ===== CALLBACK METHODS =====\n\n  public handleChainStart(\n    chain: Serialized,\n    inputs: ChainValues,\n    runId: string,\n    parentRunId?: string,\n    tags?: string[],\n    metadata?: Record<string, unknown>,\n    _runType?: string,\n    runName?: string\n  ): void {\n    this._logDebugEvent('on_chain_start', runId, parentRunId, { inputs, tags })\n    this._setParentOfRun(runId, parentRunId)\n    this._setTraceOrSpanMetadata(chain, inputs, runId, parentRunId, metadata, tags, runName)\n  }\n\n  public handleChainEnd(\n    outputs: ChainValues,\n    runId: string,\n    parentRunId?: string,\n    tags?: string[],\n    _kwargs?: { inputs?: Record<string, unknown> }\n  ): void {\n    this._logAndPopTraceOrSpan('on_chain_end', runId, parentRunId, { outputs, tags }, outputs)\n  }\n\n  public handleChainError(\n    error: Error,\n    runId: string,\n    parentRunId?: string,\n    tags?: string[],\n    _kwargs?: { inputs?: Record<string, unknown> }\n  ): void {\n    this._logAndPopTraceOrSpan('on_chain_error', runId, parentRunId, { error, tags }, error)\n  }\n\n  public handleChatModelStart(\n    serialized: Serialized,\n    messages: BaseMessage[][],\n    runId: string,\n    parentRunId?: string,\n    extraParams?: Record<string, unknown>,\n    tags?: string[],\n    metadata?: Record<string, unknown>,\n    runName?: string\n  ): void {\n    this._logDebugEvent('on_chat_model_start', runId, parentRunId, { messages, tags })\n    this._setParentOfRun(runId, parentRunId)\n    // Flatten the two-dimensional messages and convert each message to a plain object\n    const input = messages.flat().map((m) => this._convertMessageToDict(m))\n    this._setLLMMetadata(serialized, runId, input, metadata, extraParams, runName)\n  }\n\n  public handleLLMStart(\n    serialized: Serialized,\n    prompts: string[],\n    runId: string,\n    parentRunId?: string,\n    extraParams?: Record<string, unknown>,\n    tags?: string[],\n    metadata?: Record<string, unknown>,\n    runName?: string\n  ): void {\n    this._logDebugEvent('on_llm_start', runId, parentRunId, { prompts, tags })\n    this._setParentOfRun(runId, parentRunId)\n    this._setLLMMetadata(serialized, runId, prompts, metadata, extraParams, runName)\n  }\n\n  public handleLLMEnd(\n    output: LLMResult,\n    runId: string,\n    parentRunId?: string,\n    tags?: string[],\n    _extraParams?: Record<string, unknown>\n  ): void {\n    this._logAndPopGeneration('on_llm_end', runId, parentRunId, { output, tags }, output)\n  }\n\n  public handleLLMError(\n    err: Error,\n    runId: string,\n    parentRunId?: string,\n    tags?: string[],\n    _extraParams?: Record<string, unknown>\n  ): void {\n    this._logAndPopGeneration('on_llm_error', runId, parentRunId, { err, tags }, err)\n  }\n\n  public handleToolStart(\n    tool: Serialized,\n    input: string,\n    runId: string,\n    parentRunId?: string,\n    tags?: string[],\n    metadata?: Record<string, unknown>,\n    runName?: string\n  ): void {\n    this._logAndSetTraceOrSpan(\n      'on_tool_start',\n      tool,\n      input,\n      runId,\n      parentRunId,\n      { input, tags },\n      tags,\n      metadata,\n      runName\n    )\n  }\n\n  public handleToolEnd(output: any, runId: string, parentRunId?: string, tags?: string[]): void {\n    this._logAndPopTraceOrSpan('on_tool_end', runId, parentRunId, { output, tags }, output)\n  }\n\n  public handleToolError(err: Error, runId: string, parentRunId?: string, tags?: string[]): void {\n    this._logAndPopTraceOrSpan('on_tool_error', runId, parentRunId, { err, tags }, err)\n  }\n\n  public handleRetrieverStart(\n    retriever: Serialized,\n    query: string,\n    runId: string,\n    parentRunId?: string,\n    tags?: string[],\n    metadata?: Record<string, unknown>,\n    name?: string\n  ): void {\n    this._logAndSetTraceOrSpan(\n      'on_retriever_start',\n      retriever,\n      query,\n      runId,\n      parentRunId,\n      { query, tags },\n      tags,\n      metadata,\n      name\n    )\n  }\n\n  public handleRetrieverEnd(\n    documents: DocumentInterface[],\n    runId: string,\n    parentRunId?: string,\n    tags?: string[]\n  ): void {\n    this._logAndPopTraceOrSpan('on_retriever_end', runId, parentRunId, { documents, tags }, documents)\n  }\n\n  public handleRetrieverError(err: Error, runId: string, parentRunId?: string, tags?: string[]): void {\n    this._logAndPopTraceOrSpan('on_retriever_error', runId, parentRunId, { err, tags }, err)\n  }\n\n  public handleAgentAction(action: AgentAction, runId: string, parentRunId?: string, tags?: string[]): void {\n    this._logDebugEvent('on_agent_action', runId, parentRunId, { action, tags })\n    this._setParentOfRun(runId, parentRunId)\n    this._setTraceOrSpanMetadata(null, action, runId, parentRunId)\n  }\n\n  public handleAgentEnd(action: AgentFinish, runId: string, parentRunId?: string, tags?: string[]): void {\n    this._logDebugEvent('on_agent_finish', runId, parentRunId, { action, tags })\n    this._popRunAndCaptureTraceOrSpan(runId, parentRunId, action)\n  }\n\n  // ===== PRIVATE HELPERS =====\n\n  private _logAndSetTraceOrSpan(\n    eventName: string,\n    serialized: Serialized,\n    input: any,\n    runId: string,\n    parentRunId: string | undefined,\n    debugPayload: Record<string, unknown>,\n    tags?: string[],\n    metadata?: Record<string, unknown>,\n    runName?: string\n  ): void {\n    this._logDebugEvent(eventName, runId, parentRunId, debugPayload)\n    this._setParentOfRun(runId, parentRunId)\n    this._setTraceOrSpanMetadata(serialized, input, runId, parentRunId, metadata, tags, runName)\n  }\n\n  private _logAndPopTraceOrSpan(\n    eventName: string,\n    runId: string,\n    parentRunId: string | undefined,\n    debugPayload: Record<string, unknown>,\n    result: any\n  ): void {\n    this._logDebugEvent(eventName, runId, parentRunId, debugPayload)\n    this._popRunAndCaptureTraceOrSpan(runId, parentRunId, result)\n  }\n\n  private _logAndPopGeneration(\n    eventName: string,\n    runId: string,\n    parentRunId: string | undefined,\n    debugPayload: Record<string, unknown>,\n    result: LLMResult | Error\n  ): void {\n    this._logDebugEvent(eventName, runId, parentRunId, debugPayload)\n    this._popRunAndCaptureGeneration(runId, parentRunId, result)\n  }\n\n  private _setParentOfRun(runId: string, parentRunId?: string): void {\n    if (parentRunId) {\n      this.parentTree[runId] = parentRunId\n    }\n  }\n\n  private _popParentOfRun(runId: string): void {\n    delete this.parentTree[runId]\n  }\n\n  private _findRootRun(runId: string): string {\n    let id = runId\n    while (this.parentTree[id]) {\n      id = this.parentTree[id]\n    }\n    return id\n  }\n\n  private _setTraceOrSpanMetadata(\n    serialized: any,\n    input: any,\n    runId: string,\n    parentRunId?: string,\n    ...args: any[]\n  ): void {\n    // Use default names if not provided: if this is a top-level run, we mark it as a trace, otherwise as a span.\n    const defaultName = parentRunId ? 'span' : 'trace'\n    const runName = this._getLangchainRunName(serialized, ...args) || defaultName\n    this.runs[runId] = {\n      name: runName,\n      input,\n      startTime: Date.now(),\n    } as SpanMetadata\n  }\n\n  private _setLLMMetadata(\n    serialized: Serialized | null,\n    runId: string,\n    messages: any,\n    metadata?: any,\n    extraParams?: any,\n    runName?: string\n  ): void {\n    const runNameFound = this._getLangchainRunName(serialized, { extraParams, runName }) || 'generation'\n    const generation: GenerationMetadata = {\n      name: runNameFound,\n      input: sanitizeLangChain(messages),\n      startTime: Date.now(),\n    }\n    if (extraParams) {\n      generation.modelParams = getModelParams(extraParams.invocation_params)\n\n      if (extraParams.invocation_params && extraParams.invocation_params.tools) {\n        generation.tools = extraParams.invocation_params.tools\n      }\n    }\n    if (metadata) {\n      if (metadata.ls_model_name) {\n        generation.model = metadata.ls_model_name\n      }\n      if (metadata.ls_provider) {\n        generation.provider = metadata.ls_provider\n      }\n    }\n    if (serialized && 'kwargs' in serialized && serialized.kwargs.openai_api_base) {\n      generation.baseUrl = serialized.kwargs.openai_api_base\n    }\n    this.runs[runId] = generation\n  }\n\n  private _popRunMetadata(runId: string): RunMetadata | undefined {\n    const endTime = Date.now()\n    const run = this.runs[runId]\n    if (!run) {\n      console.warn(`No run metadata found for run ${runId}`)\n      return undefined\n    }\n    run.endTime = endTime\n    delete this.runs[runId]\n    return run\n  }\n\n  private _getTraceId(runId: string): string {\n    return this.traceId ? String(this.traceId) : this._findRootRun(runId)\n  }\n\n  private _getParentRunId(traceId: string, _runId: string, parentRunId?: string): string | undefined {\n    // Replace the parent-run if not found in our stored parent tree.\n    if (parentRunId && !this.parentTree[parentRunId]) {\n      return traceId\n    }\n    return parentRunId\n  }\n\n  private _popRunAndCaptureTraceOrSpan(\n    runId: string,\n    parentRunId: string | undefined,\n    outputs: ChainValues | DocumentInterface[] | AgentFinish | Error | any\n  ): void {\n    const traceId = this._getTraceId(runId)\n    this._popParentOfRun(runId)\n    const run = this._popRunMetadata(runId)\n    if (!run) {\n      return\n    }\n    if ('modelParams' in run) {\n      console.warn(`Run ${runId} is a generation, but attempted to be captured as a trace/span.`)\n      return\n    }\n    const actualParentRunId = this._getParentRunId(traceId, runId, parentRunId)\n    this._captureTraceOrSpan(traceId, runId, run as SpanMetadata, outputs, actualParentRunId)\n  }\n\n  private _captureTraceOrSpan(\n    traceId: string,\n    runId: string,\n    run: SpanMetadata,\n    outputs: ChainValues | DocumentInterface[] | AgentFinish | Error | any,\n    parentRunId?: string\n  ): void {\n    const eventName = parentRunId ? '$ai_span' : '$ai_trace'\n    const latency = run.endTime ? (run.endTime - run.startTime) / 1000 : 0\n    const eventProperties: Record<string, any> = {\n      $ai_lib: 'posthog-ai',\n      $ai_lib_version: version,\n      $ai_trace_id: traceId,\n      $ai_input_state: withPrivacyMode(this.client, this.privacyMode, run.input),\n      $ai_latency: latency,\n      $ai_span_name: run.name,\n      $ai_span_id: runId,\n      $ai_framework: 'langchain',\n    }\n    if (parentRunId) {\n      eventProperties['$ai_parent_id'] = parentRunId\n    }\n\n    Object.assign(eventProperties, this.properties)\n    if (!this.distinctId) {\n      eventProperties['$process_person_profile'] = false\n    }\n    if (outputs instanceof Error) {\n      eventProperties['$ai_error'] = stringifyError(outputs)\n      eventProperties['$ai_is_error'] = true\n    } else if (outputs !== undefined) {\n      eventProperties['$ai_output_state'] = withPrivacyMode(this.client, this.privacyMode, outputs)\n    }\n    this.client.capture({\n      distinctId: this.distinctId ? this.distinctId.toString() : runId,\n      event: eventName,\n      properties: eventProperties,\n      groups: this.groups,\n    })\n  }\n\n  private _popRunAndCaptureGeneration(\n    runId: string,\n    parentRunId: string | undefined,\n    response: LLMResult | Error\n  ): void {\n    const traceId = this._getTraceId(runId)\n    this._popParentOfRun(runId)\n    const run = this._popRunMetadata(runId)\n    if (!run || typeof run !== 'object' || !('modelParams' in run)) {\n      console.warn(`Run ${runId} is not a generation, but attempted to be captured as such.`)\n      return\n    }\n    const actualParentRunId = this._getParentRunId(traceId, runId, parentRunId)\n    this._captureGeneration(traceId, runId, run as GenerationMetadata, response, actualParentRunId)\n  }\n\n  private _captureGeneration(\n    traceId: string,\n    runId: string,\n    run: GenerationMetadata,\n    output: LLMResult | Error,\n    parentRunId?: string\n  ): void {\n    const latency = run.endTime ? (run.endTime - run.startTime) / 1000 : 0\n    warnIfPostHogAiGateway(run.baseUrl)\n    const eventProperties: Record<string, any> = {\n      $ai_lib: 'posthog-ai',\n      $ai_lib_version: version,\n      $ai_trace_id: traceId,\n      $ai_span_id: runId,\n      $ai_span_name: run.name,\n      $ai_parent_id: parentRunId,\n      $ai_provider: run.provider,\n      $ai_model: run.model,\n      $ai_model_parameters: run.modelParams,\n      $ai_input: withPrivacyMode(this.client, this.privacyMode, run.input),\n      $ai_http_status: 200,\n      $ai_latency: latency,\n      $ai_base_url: run.baseUrl,\n      $ai_framework: 'langchain',\n    }\n\n    if (run.tools) {\n      eventProperties['$ai_tools'] = run.tools\n    }\n\n    if (output instanceof Error) {\n      eventProperties['$ai_http_status'] = (output as any).status || 500\n      eventProperties['$ai_error'] = stringifyError(output)\n      eventProperties['$ai_is_error'] = true\n    } else {\n      // Handle token usage\n      const [inputTokens, outputTokens, additionalTokenData] = this.parseUsage(output, run.provider, run.model)\n      eventProperties['$ai_input_tokens'] = inputTokens\n      eventProperties['$ai_output_tokens'] = outputTokens\n\n      // Add additional token data to properties\n      if (additionalTokenData.cacheReadInputTokens) {\n        eventProperties['$ai_cache_read_input_tokens'] = additionalTokenData.cacheReadInputTokens\n      }\n      if (additionalTokenData.cacheWriteInputTokens) {\n        eventProperties['$ai_cache_creation_input_tokens'] = additionalTokenData.cacheWriteInputTokens\n      }\n      if (additionalTokenData.reasoningTokens) {\n        eventProperties['$ai_reasoning_tokens'] = additionalTokenData.reasoningTokens\n      }\n      if (additionalTokenData.webSearchCount !== undefined) {\n        eventProperties['$ai_web_search_count'] = additionalTokenData.webSearchCount\n      }\n\n      // Extract stop reason from generation info\n      const stopReason = this._extractStopReason(output)\n      if (stopReason) {\n        eventProperties['$ai_stop_reason'] = stopReason\n      }\n\n      // Handle generations/completions\n      let completions\n      if (output.generations && Array.isArray(output.generations)) {\n        const lastGeneration = output.generations[output.generations.length - 1]\n        if (Array.isArray(lastGeneration) && lastGeneration.length > 0) {\n          // Check if this is a ChatGeneration by looking at the first item\n          const isChatGeneration = 'message' in lastGeneration[0] && lastGeneration[0].message\n\n          if (isChatGeneration) {\n            // For ChatGeneration, convert messages to dict format\n            completions = lastGeneration.map((gen: any) => {\n              return this._convertMessageToDict(gen.message)\n            })\n          } else {\n            // For non-ChatGeneration, extract raw response\n            completions = lastGeneration.map((gen: any) => {\n              return this._extractRawResponse(gen)\n            })\n          }\n        }\n      }\n\n      if (completions) {\n        eventProperties['$ai_output_choices'] = withPrivacyMode(this.client, this.privacyMode, completions)\n      }\n    }\n\n    Object.assign(eventProperties, this.properties)\n    if (!this.distinctId) {\n      eventProperties['$process_person_profile'] = false\n    }\n\n    this.client.capture({\n      distinctId: this.distinctId ? this.distinctId.toString() : traceId,\n      event: '$ai_generation',\n      properties: eventProperties,\n      groups: this.groups,\n    })\n  }\n\n  private _logDebugEvent(eventName: string, runId: string, parentRunId: string | undefined, extra: any): void {\n    if (this.debug) {\n      console.log(`Event: ${eventName}, runId: ${runId}, parentRunId: ${parentRunId}, extra:`, extra)\n    }\n  }\n\n  private _getLangchainRunName(serialized: any, ...args: any): string | undefined {\n    if (args && args.length > 0) {\n      for (const arg of args) {\n        if (arg && typeof arg === 'object' && 'name' in arg) {\n          return arg.name\n        } else if (arg && typeof arg === 'object' && 'runName' in arg) {\n          return arg.runName\n        }\n      }\n    }\n\n    if (serialized && serialized.name) {\n      return serialized.name\n    }\n    if (serialized && serialized.id) {\n      return Array.isArray(serialized.id) ? serialized.id[serialized.id.length - 1] : serialized.id\n    }\n    return undefined\n  }\n\n  private _convertLcToolCallsToOai(toolCalls: ToolCall[]): Record<string, any>[] {\n    return toolCalls.map((toolCall: ToolCall) => ({\n      type: 'function',\n      id: toolCall.id,\n      function: {\n        name: toolCall.name,\n        arguments: JSON.stringify(toolCall.args),\n      },\n    }))\n  }\n\n  private _extractRawResponse(generation: any): any {\n    // Extract the response from the last response of the LLM call\n    // We return the text of the response if not empty\n    if (generation.text != null && generation.text.trim() !== '') {\n      return generation.text.trim()\n    } else if (generation.message) {\n      // Additional kwargs contains the response in case of tool usage\n      return generation.message.additional_kwargs || generation.message.additionalKwargs || {}\n    } else {\n      // Not tool usage, some LLM responses can be simply empty\n      return ''\n    }\n  }\n\n  private _convertMessageToDict(message: any): Record<string, any> {\n    let messageDict: Record<string, any> = {}\n\n    const messageType: string = message.getType()\n\n    switch (messageType) {\n      case 'human':\n        messageDict = { role: 'user', content: message.content }\n        break\n      case 'ai':\n        messageDict = { role: 'assistant', content: message.content }\n\n        if (message.tool_calls) {\n          messageDict.tool_calls = this._convertLcToolCallsToOai(message.tool_calls)\n        }\n\n        break\n      case 'system':\n        messageDict = { role: 'system', content: message.content }\n        break\n      case 'tool':\n        messageDict = { role: 'tool', content: message.content }\n        break\n      case 'function':\n        messageDict = { role: 'function', content: message.content }\n        break\n      default:\n        messageDict = { role: messageType, content: toContentString(message.content) }\n        break\n    }\n\n    if (message.additional_kwargs) {\n      messageDict = { ...messageDict, ...message.additional_kwargs }\n    }\n\n    // Sanitize the message content to redact base64 images\n    return sanitizeLangChain(messageDict) as Record<string, any>\n  }\n\n  private _extractStopReason(output: LLMResult): string | undefined {\n    if (!output.generations || !Array.isArray(output.generations)) {\n      return undefined\n    }\n    const lastGeneration = output.generations[output.generations.length - 1]\n    if (!Array.isArray(lastGeneration) || lastGeneration.length === 0) {\n      return undefined\n    }\n    const gen = lastGeneration[0]\n\n    // Check generationInfo for finish_reason (OpenAI format)\n    if (gen.generationInfo?.finish_reason) {\n      return String(gen.generationInfo.finish_reason)\n    }\n\n    // Check generationInfo for response_metadata.stop_reason (Anthropic format)\n    if (gen.generationInfo?.response_metadata?.stop_reason) {\n      return String(gen.generationInfo.response_metadata.stop_reason)\n    }\n\n    // Check message response_metadata for finish_reason (common LangChain format)\n    if (gen.generationInfo?.response_metadata?.finish_reason) {\n      return String(gen.generationInfo.response_metadata.finish_reason)\n    }\n\n    // Check for stop_reason directly in generationInfo\n    if (gen.generationInfo?.stop_reason) {\n      return String(gen.generationInfo.stop_reason)\n    }\n\n    return undefined\n  }\n\n  private _parseUsageModel(usage: any, provider?: string, model?: string): [number, number, Record<string, any>] {\n    const conversionList: Array<[string, 'input' | 'output']> = [\n      ['promptTokens', 'input'],\n      ['completionTokens', 'output'],\n      ['input_tokens', 'input'],\n      ['output_tokens', 'output'],\n      ['prompt_token_count', 'input'],\n      ['candidates_token_count', 'output'],\n      ['inputTokenCount', 'input'],\n      ['outputTokenCount', 'output'],\n      ['input_token_count', 'input'],\n      ['generated_token_count', 'output'],\n    ]\n\n    const parsedUsage = conversionList.reduce(\n      (acc: { input: number; output: number }, [modelKey, typeKey]) => {\n        const value = usage[modelKey]\n        if (value != null) {\n          const finalCount = Array.isArray(value)\n            ? value.reduce((sum: number, tokenCount: number) => sum + tokenCount, 0)\n            : value\n          acc[typeKey] = finalCount\n        }\n        return acc\n      },\n      { input: 0, output: 0 }\n    )\n\n    // Extract additional token details like cached tokens and reasoning tokens\n    const additionalTokenData: Record<string, any> = {}\n\n    // Check for cached tokens in various formats\n    if (usage.prompt_tokens_details?.cached_tokens != null) {\n      additionalTokenData.cacheReadInputTokens = usage.prompt_tokens_details.cached_tokens\n    } else if (usage.input_token_details?.cache_read != null) {\n      additionalTokenData.cacheReadInputTokens = usage.input_token_details.cache_read\n    } else if (usage.cachedPromptTokens != null) {\n      additionalTokenData.cacheReadInputTokens = usage.cachedPromptTokens\n    } else if (usage.cache_read_input_tokens != null) {\n      additionalTokenData.cacheReadInputTokens = usage.cache_read_input_tokens\n    }\n\n    // Check for cache write/creation tokens in various formats\n    if (usage.cache_creation_input_tokens != null) {\n      additionalTokenData.cacheWriteInputTokens = usage.cache_creation_input_tokens\n    } else if (usage.input_token_details?.cache_creation != null) {\n      additionalTokenData.cacheWriteInputTokens = usage.input_token_details.cache_creation\n    }\n\n    // Check for reasoning tokens in various formats\n    if (usage.completion_tokens_details?.reasoning_tokens != null) {\n      additionalTokenData.reasoningTokens = usage.completion_tokens_details.reasoning_tokens\n    } else if (usage.output_token_details?.reasoning != null) {\n      additionalTokenData.reasoningTokens = usage.output_token_details.reasoning\n    } else if (usage.reasoningTokens != null) {\n      additionalTokenData.reasoningTokens = usage.reasoningTokens\n    }\n\n    // Extract web search counts from various provider formats\n    let webSearchCount: number | undefined\n\n    // Priority 1: Exact Count\n    // Check Anthropic format (server_tool_use.web_search_requests)\n    if (usage.server_tool_use?.web_search_requests !== undefined) {\n      webSearchCount = usage.server_tool_use.web_search_requests\n    }\n    // Priority 2: Binary Detection (1 or 0)\n    // Check for citations array (Perplexity)\n    else if (usage.citations && Array.isArray(usage.citations) && usage.citations.length > 0) {\n      webSearchCount = 1\n    }\n    // Check for search_results array (Perplexity via OpenRouter)\n    else if (usage.search_results && Array.isArray(usage.search_results) && usage.search_results.length > 0) {\n      webSearchCount = 1\n    }\n    // Check for search_context_size (Perplexity via OpenRouter)\n    else if (usage.search_context_size) {\n      webSearchCount = 1\n    }\n    // Check for annotations with url_citation type\n    else if (usage.annotations && Array.isArray(usage.annotations)) {\n      const hasUrlCitation = usage.annotations.some((ann: unknown) => {\n        return ann && typeof ann === 'object' && 'type' in ann && ann.type === 'url_citation'\n      })\n\n      if (hasUrlCitation) {\n        webSearchCount = 1\n      }\n    }\n    // Check Gemini format (grounding metadata - binary 0 or 1)\n    else if (\n      usage.grounding_metadata?.grounding_support !== undefined ||\n      usage.grounding_metadata?.web_search_queries !== undefined\n    ) {\n      webSearchCount = 1\n    }\n\n    if (webSearchCount !== undefined) {\n      additionalTokenData.webSearchCount = webSearchCount\n    }\n\n    // For Anthropic providers, LangChain reports input_tokens as the sum of all input tokens.\n    // Our cost calculation expects them to be separate for Anthropic, so we subtract cache tokens.\n    // Both cache_read and cache_write tokens should be subtracted since Anthropic's raw API\n    // reports input_tokens as tokens NOT read from or used to create a cache.\n    // For other providers (OpenAI, etc.), input_tokens already excludes cache tokens as expected.\n    // Match logic consistent with plugin-server: exact match on provider OR substring match on model\n    let isAnthropic = false\n    if (provider && provider.toLowerCase() === 'anthropic') {\n      isAnthropic = true\n    } else if (model && model.toLowerCase().includes('anthropic')) {\n      isAnthropic = true\n    }\n\n    if (isAnthropic && parsedUsage.input) {\n      const cacheTokens =\n        (additionalTokenData.cacheReadInputTokens || 0) + (additionalTokenData.cacheWriteInputTokens || 0)\n      if (cacheTokens > 0) {\n        parsedUsage.input = Math.max(parsedUsage.input - cacheTokens, 0)\n      }\n    }\n\n    return [parsedUsage.input, parsedUsage.output, additionalTokenData]\n  }\n\n  private parseUsage(response: LLMResult, provider?: string, model?: string): [number, number, Record<string, any>] {\n    let llmUsage: [number, number, Record<string, any>] = [0, 0, {}]\n    const llmUsageKeys = ['token_usage', 'usage', 'tokenUsage']\n\n    if (response.llmOutput != null) {\n      const key = llmUsageKeys.find((k) => response.llmOutput?.[k] != null)\n      if (key) {\n        llmUsage = this._parseUsageModel(response.llmOutput[key], provider, model)\n      }\n    }\n\n    // If top-level usage info was not found, try checking the generations.\n    if (llmUsage[0] === 0 && llmUsage[1] === 0 && response.generations) {\n      for (const generation of response.generations) {\n        for (const genChunk of generation) {\n          // Check other paths for usage information\n          if (genChunk.generationInfo?.usage_metadata) {\n            llmUsage = this._parseUsageModel(genChunk.generationInfo.usage_metadata, provider, model)\n            return llmUsage\n          }\n\n          const messageChunk = genChunk.generationInfo ?? {}\n          const responseMetadata = messageChunk.response_metadata ?? {}\n          const chunkUsage =\n            responseMetadata['usage'] ??\n            responseMetadata['amazon-bedrock-invocationMetrics'] ??\n            messageChunk.usage_metadata\n          if (chunkUsage) {\n            llmUsage = this._parseUsageModel(chunkUsage, provider, model)\n            return llmUsage\n          }\n        }\n      }\n    }\n\n    return llmUsage\n  }\n}\n"],"names":["DATA_URL_PREFIX_RE","BASE64_ALPHABET_RE","Base64Recognizer","recognize","value","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","sanitizeLangChain","data","STRING_FORMAT","TextEncoder","TextDecoder","fatal","toContentString","content","JSON","stringify","String","getModelParams","params","modelParams","paramKeys","withPrivacyMode","client","privacyMode","input","privacy_mode","sanitizeValues","jsonSafe","parse","decode","encode","fromEntries","entries","DEFAULT_MAX_DEPTH","MAX_STACK_LINES","serializeError","depth","Error","name","message","stack","truncateStack","cause","stringifyError","error","lines","split","join","POSTHOG_AI_GATEWAY_HOSTS","GATEWAY_DOCS_URL","extractHost","baseURL","hasScheme","URL","hostname","isPostHogAiGatewayUrl","host","warnIfPostHogAiGateway","console","warn","LangChainCallbackHandler","BaseCallbackHandler","runs","parentTree","options","distinctId","traceId","properties","groups","debug","handleChainStart","chain","inputs","runId","parentRunId","tags","metadata","_runType","runName","_logDebugEvent","_setParentOfRun","_setTraceOrSpanMetadata","handleChainEnd","outputs","_kwargs","_logAndPopTraceOrSpan","handleChainError","handleChatModelStart","serialized","messages","extraParams","flat","m","_convertMessageToDict","_setLLMMetadata","handleLLMStart","prompts","handleLLMEnd","output","_extraParams","_logAndPopGeneration","handleLLMError","err","handleToolStart","tool","_logAndSetTraceOrSpan","handleToolEnd","handleToolError","handleRetrieverStart","retriever","query","handleRetrieverEnd","documents","handleRetrieverError","handleAgentAction","action","handleAgentEnd","_popRunAndCaptureTraceOrSpan","eventName","debugPayload","result","_popRunAndCaptureGeneration","_popParentOfRun","_findRootRun","id","args","defaultName","_getLangchainRunName","startTime","Date","now","runNameFound","generation","invocation_params","tools","ls_model_name","model","ls_provider","provider","kwargs","openai_api_base","baseUrl","_popRunMetadata","endTime","run","_getTraceId","_getParentRunId","_runId","actualParentRunId","_captureTraceOrSpan","latency","eventProperties","$ai_lib","$ai_lib_version","version","$ai_trace_id","$ai_input_state","$ai_latency","$ai_span_name","$ai_span_id","$ai_framework","assign","capture","toString","event","response","_captureGeneration","$ai_parent_id","$ai_provider","$ai_model","$ai_model_parameters","$ai_input","$ai_http_status","$ai_base_url","status","inputTokens","outputTokens","additionalTokenData","parseUsage","cacheReadInputTokens","cacheWriteInputTokens","reasoningTokens","webSearchCount","stopReason","_extractStopReason","completions","generations","lastGeneration","isChatGeneration","gen","_extractRawResponse","extra","log","arg","_convertLcToolCallsToOai","toolCalls","toolCall","function","arguments","text","trim","additional_kwargs","additionalKwargs","messageDict","messageType","getType","role","tool_calls","generationInfo","finish_reason","response_metadata","stop_reason","_parseUsageModel","usage","conversionList","parsedUsage","reduce","acc","modelKey","typeKey","finalCount","sum","tokenCount","prompt_tokens_details","cached_tokens","input_token_details","cache_read","cachedPromptTokens","cache_read_input_tokens","cache_creation_input_tokens","cache_creation","completion_tokens_details","reasoning_tokens","output_token_details","reasoning","server_tool_use","web_search_requests","citations","search_results","search_context_size","annotations","hasUrlCitation","some","ann","grounding_metadata","grounding_support","web_search_queries","isAnthropic","cacheTokens","Math","max","llmUsage","llmUsageKeys","llmOutput","find","genChunk","usage_metadata","messageChunk","responseMetadata","chunkUsage"],"mappings":"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"}