@posthog/ai 7.9.1 → 7.9.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","sources":["../../src/typeGuards.ts","../../src/sanitization.ts","../../src/utils.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","import { isString, isObject } from './typeGuards'\n\nconst REDACTED_IMAGE_PLACEHOLDER = '[base64 image redacted]'\n\n// ============================================\n// Multimodal Feature Toggle\n// ============================================\n\nconst isMultimodalEnabled = (): boolean => {\n const val = process.env._INTERNAL_LLMA_MULTIMODAL || ''\n return val.toLowerCase() === 'true' || val === '1' || val.toLowerCase() === 'yes'\n}\n\n// ============================================\n// Base64 Detection Helpers\n// ============================================\n\nconst isBase64DataUrl = (str: string): boolean => {\n return /^data:([^;]+);base64,/.test(str)\n}\n\nconst isValidUrl = (str: string): boolean => {\n try {\n new URL(str)\n return true\n } catch {\n // Not an absolute URL, check if it's a relative URL or path\n return str.startsWith('/') || str.startsWith('./') || str.startsWith('../')\n }\n}\n\nconst isRawBase64 = (str: string): boolean => {\n // Skip if it's a valid URL or path\n if (isValidUrl(str)) {\n return false\n }\n\n // Check if it's a valid base64 string\n // Base64 images are typically at least a few hundred chars, but we'll be conservative\n return str.length > 20 && /^[A-Za-z0-9+/]+=*$/.test(str)\n}\n\nexport function redactBase64DataUrl(str: string): string\nexport function redactBase64DataUrl(str: unknown): unknown\nexport function redactBase64DataUrl(str: unknown): unknown {\n if (isMultimodalEnabled()) return str\n if (!isString(str)) return str\n\n // Check for data URL format\n if (isBase64DataUrl(str)) {\n return REDACTED_IMAGE_PLACEHOLDER\n }\n\n // Check for raw base64 (Vercel sends raw base64 for inline images)\n if (isRawBase64(str)) {\n return REDACTED_IMAGE_PLACEHOLDER\n }\n\n return str\n}\n\n// ============================================\n// Common Message Processing\n// ============================================\n\ntype ContentTransformer = (item: unknown) => unknown\n\nconst processMessages = (messages: unknown, transformContent: ContentTransformer): unknown => {\n if (!messages) return messages\n\n const processContent = (content: unknown): unknown => {\n if (typeof content === 'string') return content\n\n if (!content) return content\n\n if (Array.isArray(content)) {\n return content.map(transformContent)\n }\n\n // Handle single object content\n return transformContent(content)\n }\n\n const processMessage = (msg: unknown): unknown => {\n if (!isObject(msg) || !('content' in msg)) return msg\n return { ...msg, content: processContent(msg.content) }\n }\n\n // Handle both arrays and single messages\n if (Array.isArray(messages)) {\n return messages.map(processMessage)\n }\n\n return processMessage(messages)\n}\n\n// ============================================\n// Provider-Specific Image Sanitizers\n// ============================================\n\nconst sanitizeOpenAIImage = (item: unknown): unknown => {\n if (!isObject(item)) return item\n\n // Handle image_url format\n if (item.type === 'image_url' && 'image_url' in item && isObject(item.image_url) && 'url' in item.image_url) {\n return {\n ...item,\n image_url: {\n ...item.image_url,\n url: redactBase64DataUrl(item.image_url.url),\n },\n }\n }\n\n // Handle audio format\n if (item.type === 'audio' && 'data' in item) {\n if (isMultimodalEnabled()) return item\n return { ...item, data: REDACTED_IMAGE_PLACEHOLDER }\n }\n\n return item\n}\n\nconst sanitizeOpenAIResponseImage = (item: unknown): unknown => {\n if (!isObject(item)) return item\n\n // Handle input_image format\n if (item.type === 'input_image' && 'image_url' in item) {\n return {\n ...item,\n image_url: redactBase64DataUrl(item.image_url),\n }\n }\n\n return item\n}\n\nconst sanitizeAnthropicImage = (item: unknown): unknown => {\n if (isMultimodalEnabled()) return item\n if (!isObject(item)) return item\n\n // Handle Anthropic's image and document formats (same structure, different type field)\n if (\n (item.type === 'image' || item.type === 'document') &&\n 'source' in item &&\n isObject(item.source) &&\n item.source.type === 'base64' &&\n 'data' in item.source\n ) {\n return {\n ...item,\n source: {\n ...item.source,\n data: REDACTED_IMAGE_PLACEHOLDER,\n },\n }\n }\n\n return item\n}\n\nconst sanitizeGeminiPart = (part: unknown): unknown => {\n if (isMultimodalEnabled()) return part\n if (!isObject(part)) return part\n\n // Handle Gemini's inline data format (images, audio, PDFs all use inlineData)\n if ('inlineData' in part && isObject(part.inlineData) && 'data' in part.inlineData) {\n return {\n ...part,\n inlineData: {\n ...part.inlineData,\n data: REDACTED_IMAGE_PLACEHOLDER,\n },\n }\n }\n\n return part\n}\n\nconst processGeminiItem = (item: unknown): unknown => {\n if (!isObject(item)) return item\n\n // If it has parts, process them\n if ('parts' in item && item.parts) {\n const parts = Array.isArray(item.parts) ? item.parts.map(sanitizeGeminiPart) : sanitizeGeminiPart(item.parts)\n\n return { ...item, parts }\n }\n\n return item\n}\n\nconst sanitizeLangChainImage = (item: unknown): unknown => {\n if (!isObject(item)) return item\n\n // OpenAI style\n if (item.type === 'image_url' && 'image_url' in item && isObject(item.image_url) && 'url' in item.image_url) {\n return {\n ...item,\n image_url: {\n ...item.image_url,\n url: redactBase64DataUrl(item.image_url.url),\n },\n }\n }\n\n // Direct image with data field\n if (item.type === 'image' && 'data' in item) {\n return { ...item, data: redactBase64DataUrl(item.data) }\n }\n\n // Anthropic style\n if (item.type === 'image' && 'source' in item && isObject(item.source) && 'data' in item.source) {\n if (isMultimodalEnabled()) return item\n return {\n ...item,\n source: {\n ...item.source,\n data: redactBase64DataUrl(item.source.data),\n },\n }\n }\n\n // Google style\n if (item.type === 'media' && 'data' in item) {\n return { ...item, data: redactBase64DataUrl(item.data) }\n }\n\n return item\n}\n\n// Export individual sanitizers for tree-shaking\nexport const sanitizeOpenAI = (data: unknown): unknown => {\n return processMessages(data, sanitizeOpenAIImage)\n}\n\nexport const sanitizeOpenAIResponse = (data: unknown): unknown => {\n return processMessages(data, sanitizeOpenAIResponseImage)\n}\n\nexport const sanitizeAnthropic = (data: unknown): unknown => {\n return processMessages(data, sanitizeAnthropicImage)\n}\n\nexport const sanitizeGemini = (data: unknown): unknown => {\n // Gemini has a different structure with 'parts' directly on items instead of 'content'\n // So we need custom processing instead of using processMessages\n if (!data) return data\n\n if (Array.isArray(data)) {\n return data.map(processGeminiItem)\n }\n\n return processGeminiItem(data)\n}\n\nexport const sanitizeLangChain = (data: unknown): unknown => {\n return processMessages(data, sanitizeLangChainImage)\n}\n","import { EventMessage, PostHog } from 'posthog-node'\nimport OpenAIOrignal from 'openai'\nimport AnthropicOriginal from '@anthropic-ai/sdk'\nimport type { ChatCompletionTool } from 'openai/resources/chat/completions'\nimport type { ResponseCreateParamsWithTools } from 'openai/lib/ResponsesParser'\nimport type { Tool as GeminiTool } from '@google/genai'\nimport type { FormattedMessage, FormattedContent, TokenUsage } from './types'\nimport { version } from '../package.json'\nimport { v4 as uuidv4 } from 'uuid'\nimport { isString } from './typeGuards'\nimport { uuidv7, ErrorTracking as CoreErrorTracking } from '@posthog/core'\nimport { redactBase64DataUrl } from './sanitization'\n\ntype ChatCompletionCreateParamsBase = OpenAIOrignal.Chat.Completions.ChatCompletionCreateParams\ntype MessageCreateParams = AnthropicOriginal.Messages.MessageCreateParams\ntype ResponseCreateParams = OpenAIOrignal.Responses.ResponseCreateParams\ntype EmbeddingCreateParams = OpenAIOrignal.EmbeddingCreateParams\ntype TranscriptionCreateParams = OpenAIOrignal.Audio.Transcriptions.TranscriptionCreateParams\ntype AnthropicTool = AnthropicOriginal.Tool\n\n// limit large outputs by truncating to 200kb (approx 200k bytes)\nexport const MAX_OUTPUT_SIZE = 200000\nconst STRING_FORMAT = 'utf8'\n\n/**\n * Safely converts content to a string, preserving structure for objects/arrays.\n * - If content is already a string, returns it as-is\n * - If content is an object or array, stringifies it with JSON.stringify to preserve structure\n * - Otherwise, converts to string with String()\n *\n * This prevents the \"[object Object]\" bug when objects are naively converted to strings.\n *\n * @param content - The content to convert to a string\n * @returns A string representation that preserves structure for complex types\n */\nexport function toContentString(content: unknown): string {\n if (typeof content === 'string') {\n return content\n }\n if (content !== undefined && content !== null && typeof content === 'object') {\n try {\n return JSON.stringify(content)\n } catch {\n // Fallback for circular refs, BigInt, or objects with throwing toJSON\n return String(content)\n }\n }\n return String(content)\n}\n\nexport interface MonitoringEventPropertiesWithDefaults {\n distinctId?: string\n traceId: string\n properties?: Record<string, any>\n privacyMode: boolean\n groups?: Record<string, any>\n modelOverride?: string\n providerOverride?: string\n costOverride?: CostOverride\n captureImmediate?: boolean\n}\n\nexport type MonitoringEventProperties = Partial<MonitoringEventPropertiesWithDefaults>\n\nexport type MonitoringParams = {\n [K in keyof MonitoringEventProperties as `posthog${Capitalize<string & K>}`]: MonitoringEventProperties[K]\n}\n\nexport interface CostOverride {\n inputCost: number\n outputCost: number\n}\n\nexport const getModelParams = (\n params:\n | ((\n | ChatCompletionCreateParamsBase\n | MessageCreateParams\n | ResponseCreateParams\n | ResponseCreateParamsWithTools\n | EmbeddingCreateParams\n | TranscriptionCreateParams\n ) &\n MonitoringParams)\n | null\n): Record<string, any> => {\n if (!params) {\n return {}\n }\n const modelParams: Record<string, any> = {}\n const paramKeys = [\n 'temperature',\n 'max_tokens',\n 'max_completion_tokens',\n 'top_p',\n 'frequency_penalty',\n 'presence_penalty',\n 'n',\n 'stop',\n 'stream',\n 'streaming',\n 'language',\n 'response_format',\n 'timestamp_granularities',\n ] as const\n\n for (const key of paramKeys) {\n if (key in params && (params as any)[key] !== undefined) {\n modelParams[key] = (params as any)[key]\n }\n }\n return modelParams\n}\n\n/**\n * Helper to format responses (non-streaming) for consumption\n */\nexport const formatResponse = (response: any, provider: string): FormattedMessage[] => {\n if (!response) {\n return []\n }\n if (provider === 'anthropic') {\n return formatResponseAnthropic(response)\n } else if (provider === 'openai') {\n return formatResponseOpenAI(response)\n } else if (provider === 'gemini') {\n return formatResponseGemini(response)\n }\n return []\n}\n\nexport const formatResponseAnthropic = (response: any): FormattedMessage[] => {\n const output: FormattedMessage[] = []\n const content: FormattedContent = []\n\n for (const choice of response.content ?? []) {\n if (choice?.type === 'text' && choice?.text) {\n content.push({ type: 'text', text: choice.text })\n } else if (choice?.type === 'tool_use' && choice?.name && choice?.id) {\n content.push({\n type: 'function',\n id: choice.id,\n function: {\n name: choice.name,\n arguments: choice.input || {},\n },\n })\n }\n }\n\n if (content.length > 0) {\n output.push({\n role: 'assistant',\n content,\n })\n }\n\n return output\n}\n\nexport const formatResponseOpenAI = (response: any): FormattedMessage[] => {\n const output: FormattedMessage[] = []\n\n if (response.choices) {\n for (const choice of response.choices) {\n const content: FormattedContent = []\n let role = 'assistant'\n\n if (choice.message) {\n if (choice.message.role) {\n role = choice.message.role\n }\n\n if (choice.message.content) {\n content.push({ type: 'text', text: choice.message.content })\n }\n\n if (choice.message.tool_calls) {\n for (const toolCall of choice.message.tool_calls) {\n content.push({\n type: 'function',\n id: toolCall.id,\n function: {\n name: toolCall.function.name,\n arguments: toolCall.function.arguments,\n },\n })\n }\n }\n\n // Handle audio output (gpt-4o-audio-preview)\n if (choice.message.audio) {\n content.push({\n type: 'audio',\n ...choice.message.audio,\n })\n }\n }\n\n if (content.length > 0) {\n output.push({\n role,\n content,\n })\n }\n }\n }\n\n // Handle Responses API format\n if (response.output) {\n const content: FormattedContent = []\n let role = 'assistant'\n\n for (const item of response.output) {\n if (item.type === 'message') {\n role = item.role\n\n if (item.content && Array.isArray(item.content)) {\n for (const contentItem of item.content) {\n if (contentItem.type === 'output_text' && contentItem.text) {\n content.push({ type: 'text', text: contentItem.text })\n } else if (contentItem.text) {\n content.push({ type: 'text', text: contentItem.text })\n } else if (contentItem.type === 'input_image' && contentItem.image_url) {\n content.push({\n type: 'image',\n image: contentItem.image_url,\n })\n }\n }\n } else if (item.content) {\n content.push({ type: 'text', text: String(item.content) })\n }\n } else if (item.type === 'function_call') {\n content.push({\n type: 'function',\n id: item.call_id || item.id || '',\n function: {\n name: item.name,\n arguments: item.arguments || {},\n },\n })\n }\n }\n\n if (content.length > 0) {\n output.push({\n role,\n content,\n })\n }\n }\n\n return output\n}\n\nexport const formatResponseGemini = (response: any): FormattedMessage[] => {\n const output: FormattedMessage[] = []\n\n if (response.candidates && Array.isArray(response.candidates)) {\n for (const candidate of response.candidates) {\n if (candidate.content && candidate.content.parts) {\n const content: FormattedContent = []\n\n for (const part of candidate.content.parts) {\n if (part.text) {\n content.push({ type: 'text', text: part.text })\n } else if (part.functionCall) {\n content.push({\n type: 'function',\n function: {\n name: part.functionCall.name,\n arguments: part.functionCall.args,\n },\n })\n } else if (part.inlineData) {\n // Handle audio/media inline data\n const mimeType = part.inlineData.mimeType || 'audio/pcm'\n let data = part.inlineData.data\n\n // Handle binary data (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({\n type: 'audio',\n mime_type: mimeType,\n data: data,\n })\n }\n }\n\n if (content.length > 0) {\n output.push({\n role: 'assistant',\n content,\n })\n }\n } else if (candidate.text) {\n output.push({\n role: 'assistant',\n content: [{ type: 'text', text: candidate.text }],\n })\n }\n }\n } else if (response.text) {\n output.push({\n role: 'assistant',\n content: [{ type: 'text', text: response.text }],\n })\n }\n\n return output\n}\n\nexport const mergeSystemPrompt = (params: MessageCreateParams & MonitoringParams, provider: string): any => {\n if (provider == 'anthropic') {\n const messages = params.messages || []\n if (!(params as any).system) {\n return messages\n }\n const systemMessage = (params as any).system\n return [{ role: 'system', content: systemMessage }, ...messages]\n }\n return params.messages\n}\n\nexport const withPrivacyMode = (client: PostHog, privacyMode: boolean, input: any): any => {\n return (client as any).privacy_mode || privacyMode ? null : input\n}\n\nfunction toSafeString(input: unknown): string {\n if (input === undefined || input === null) {\n return ''\n }\n if (typeof input === 'string') {\n return input\n }\n try {\n return JSON.stringify(input)\n } catch {\n console.warn('Failed to stringify input', input)\n return ''\n }\n}\n\nexport const truncate = (input: unknown): string => {\n const str = toSafeString(input)\n if (str === '') {\n return ''\n }\n\n // Check if we need to truncate and ensure STRING_FORMAT is respected\n const encoder = new TextEncoder()\n const buffer = encoder.encode(str)\n if (buffer.length <= MAX_OUTPUT_SIZE) {\n // Ensure STRING_FORMAT is respected\n return new TextDecoder(STRING_FORMAT).decode(buffer)\n }\n\n // Truncate the buffer and ensure a valid string is returned\n const truncatedBuffer = buffer.slice(0, MAX_OUTPUT_SIZE)\n // fatal: false means we get U+FFFD at the end if truncation broke the encoding\n const decoder = new TextDecoder(STRING_FORMAT, { fatal: false })\n let truncatedStr = decoder.decode(truncatedBuffer)\n if (truncatedStr.endsWith('\\uFFFD')) {\n truncatedStr = truncatedStr.slice(0, -1)\n }\n return `${truncatedStr}... [truncated]`\n}\n\n/**\n * Calculate web search count from raw API response.\n *\n * Uses a two-tier detection strategy:\n * Priority 1 (Exact Count): Count actual web search calls when available\n * Priority 2 (Binary Detection): Return 1 if web search indicators are present, 0 otherwise\n *\n * @param result - Raw API response from any provider (OpenAI, Perplexity, OpenRouter, Gemini, etc.)\n * @returns Number of web searches performed (exact count or binary 1/0)\n */\nexport function calculateWebSearchCount(result: unknown): number {\n if (!result || typeof result !== 'object') {\n return 0\n }\n\n // Priority 1: Exact Count\n // Check for OpenAI Responses API web_search_call items\n if ('output' in result && Array.isArray(result.output)) {\n let count = 0\n\n for (const item of result.output) {\n if (typeof item === 'object' && item !== null && 'type' in item && item.type === 'web_search_call') {\n count++\n }\n }\n\n if (count > 0) {\n return count\n }\n }\n\n // Priority 2: Binary Detection (1 or 0)\n\n // Check for citations at root level (Perplexity)\n if ('citations' in result && Array.isArray(result.citations) && result.citations.length > 0) {\n return 1\n }\n\n // Check for search_results at root level (Perplexity via OpenRouter)\n if ('search_results' in result && Array.isArray(result.search_results) && result.search_results.length > 0) {\n return 1\n }\n\n // Check for usage.search_context_size (Perplexity via OpenRouter)\n if ('usage' in result && typeof result.usage === 'object' && result.usage !== null) {\n if ('search_context_size' in result.usage && result.usage.search_context_size) {\n return 1\n }\n }\n\n // Check for annotations with url_citation in choices[].message or choices[].delta (OpenAI/Perplexity)\n if ('choices' in result && Array.isArray(result.choices)) {\n for (const choice of result.choices) {\n if (typeof choice === 'object' && choice !== null) {\n // Check both message (non-streaming) and delta (streaming) for annotations\n const content = ('message' in choice ? choice.message : null) || ('delta' in choice ? choice.delta : null)\n\n if (typeof content === 'object' && content !== null && 'annotations' in content) {\n const annotations = content.annotations\n\n if (Array.isArray(annotations)) {\n const hasUrlCitation = annotations.some((ann: unknown) => {\n return typeof ann === 'object' && ann !== null && 'type' in ann && ann.type === 'url_citation'\n })\n\n if (hasUrlCitation) {\n return 1\n }\n }\n }\n }\n }\n }\n\n // Check for annotations in output[].content[] (OpenAI Responses API)\n if ('output' in result && Array.isArray(result.output)) {\n for (const item of result.output) {\n if (typeof item === 'object' && item !== null && 'content' in item) {\n const content = item.content\n\n if (Array.isArray(content)) {\n for (const contentItem of content) {\n if (typeof contentItem === 'object' && contentItem !== null && 'annotations' in contentItem) {\n const annotations = contentItem.annotations\n\n if (Array.isArray(annotations)) {\n const hasUrlCitation = annotations.some((ann: unknown) => {\n return typeof ann === 'object' && ann !== null && 'type' in ann && ann.type === 'url_citation'\n })\n\n if (hasUrlCitation) {\n return 1\n }\n }\n }\n }\n }\n }\n }\n }\n\n // Check for grounding_metadata (Gemini)\n if ('candidates' in result && Array.isArray(result.candidates)) {\n for (const candidate of result.candidates) {\n if (\n typeof candidate === 'object' &&\n candidate !== null &&\n 'grounding_metadata' in candidate &&\n candidate.grounding_metadata\n ) {\n return 1\n }\n }\n }\n\n return 0\n}\n\n/**\n * Extract available tool calls from the request parameters.\n * These are the tools provided to the LLM, not the tool calls in the response.\n */\nexport const extractAvailableToolCalls = (\n provider: string,\n params: any\n): ChatCompletionTool[] | AnthropicTool[] | GeminiTool[] | null => {\n if (provider === 'anthropic') {\n if (params.tools) {\n return params.tools\n }\n\n return null\n } else if (provider === 'gemini') {\n if (params.config && params.config.tools) {\n return params.config.tools\n }\n\n return null\n } else if (provider === 'openai') {\n if (params.tools) {\n return params.tools\n }\n\n return null\n } else if (provider === 'vercel') {\n if (params.tools) {\n return params.tools\n }\n\n return null\n }\n\n return null\n}\n\nexport enum AIEvent {\n Generation = '$ai_generation',\n Embedding = '$ai_embedding',\n}\n\nexport type SendEventToPosthogParams = {\n client: PostHog\n eventType?: AIEvent\n distinctId?: string\n traceId: string\n model?: string\n provider: string\n input: any\n output: any\n latency: number\n timeToFirstToken?: number\n baseURL: string\n httpStatus: number\n usage?: TokenUsage\n params: (\n | ChatCompletionCreateParamsBase\n | MessageCreateParams\n | ResponseCreateParams\n | ResponseCreateParamsWithTools\n | EmbeddingCreateParams\n | TranscriptionCreateParams\n ) &\n MonitoringParams\n error?: unknown\n exceptionId?: string\n tools?: ChatCompletionTool[] | AnthropicTool[] | GeminiTool[] | null\n captureImmediate?: boolean\n}\n\nfunction sanitizeValues(obj: any): any {\n if (obj === undefined || obj === null) {\n return obj\n }\n const jsonSafe = JSON.parse(JSON.stringify(obj))\n if (typeof jsonSafe === 'string') {\n // 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 const sendEventWithErrorToPosthog = async ({\n client,\n traceId,\n error,\n ...args\n}: Omit<SendEventToPosthogParams, 'error' | 'httpStatus'> &\n Required<Pick<SendEventToPosthogParams, 'error'>>): Promise<unknown> => {\n const httpStatus =\n error && typeof error === 'object' && 'status' in error ? ((error as { status?: number }).status ?? 500) : 500\n\n const properties = { client, traceId, httpStatus, error: JSON.stringify(error), ...args }\n const enrichedError = error as CoreErrorTracking.PreviouslyCapturedError\n\n if (client.options?.enableExceptionAutocapture) {\n // assign a uuid that can be used to link the trace and exception events\n const exceptionId = uuidv7()\n client.captureException(error, undefined, { $ai_trace_id: traceId }, exceptionId)\n enrichedError.__posthog_previously_captured_error = true\n properties.exceptionId = exceptionId\n }\n\n await sendEventToPosthog(properties)\n\n return enrichedError\n}\n\nexport const sendEventToPosthog = async ({\n client,\n eventType = AIEvent.Generation,\n distinctId,\n traceId,\n model,\n provider,\n input,\n output,\n latency,\n timeToFirstToken,\n baseURL,\n params,\n httpStatus = 200,\n usage = {},\n error,\n exceptionId,\n tools,\n captureImmediate = false,\n}: SendEventToPosthogParams): Promise<void> => {\n if (!client.capture) {\n return Promise.resolve()\n }\n // sanitize input and output for UTF-8 validity\n const safeInput = sanitizeValues(input)\n const safeOutput = sanitizeValues(output)\n const safeError = sanitizeValues(error)\n\n let errorData = {}\n if (error) {\n errorData = {\n $ai_is_error: true,\n $ai_error: safeError,\n $exception_event_id: exceptionId,\n }\n }\n let costOverrideData = {}\n if (params.posthogCostOverride) {\n const inputCostUSD = (params.posthogCostOverride.inputCost ?? 0) * (usage.inputTokens ?? 0)\n const outputCostUSD = (params.posthogCostOverride.outputCost ?? 0) * (usage.outputTokens ?? 0)\n costOverrideData = {\n $ai_input_cost_usd: inputCostUSD,\n $ai_output_cost_usd: outputCostUSD,\n $ai_total_cost_usd: inputCostUSD + outputCostUSD,\n }\n }\n\n const additionalTokenValues = {\n ...(usage.reasoningTokens ? { $ai_reasoning_tokens: usage.reasoningTokens } : {}),\n ...(usage.cacheReadInputTokens ? { $ai_cache_read_input_tokens: usage.cacheReadInputTokens } : {}),\n ...(usage.cacheCreationInputTokens ? { $ai_cache_creation_input_tokens: usage.cacheCreationInputTokens } : {}),\n ...(usage.webSearchCount ? { $ai_web_search_count: usage.webSearchCount } : {}),\n ...(usage.rawUsage ? { $ai_usage: usage.rawUsage } : {}),\n }\n\n const properties = {\n $ai_lib: 'posthog-ai',\n $ai_lib_version: version,\n $ai_provider: params.posthogProviderOverride ?? provider,\n $ai_model: params.posthogModelOverride ?? model,\n $ai_model_parameters: getModelParams(params),\n $ai_input: withPrivacyMode(client, params.posthogPrivacyMode ?? false, safeInput),\n $ai_output_choices: withPrivacyMode(client, params.posthogPrivacyMode ?? false, safeOutput),\n $ai_http_status: httpStatus,\n $ai_input_tokens: usage.inputTokens ?? 0,\n ...(usage.outputTokens !== undefined ? { $ai_output_tokens: usage.outputTokens } : {}),\n ...additionalTokenValues,\n $ai_latency: latency,\n ...(timeToFirstToken !== undefined ? { $ai_time_to_first_token: timeToFirstToken } : {}),\n $ai_trace_id: traceId,\n $ai_base_url: baseURL,\n ...params.posthogProperties,\n ...(distinctId ? {} : { $process_person_profile: false }),\n ...(tools ? { $ai_tools: tools } : {}),\n ...errorData,\n ...costOverrideData,\n }\n\n const event: EventMessage = {\n distinctId: distinctId ?? traceId,\n event: eventType,\n properties,\n groups: params.posthogGroups,\n }\n\n if (captureImmediate) {\n // await capture promise to send single event in serverless environments\n await client.captureImmediate(event)\n } else {\n client.capture(event)\n }\n\n return Promise.resolve()\n}\n\nexport function formatOpenAIResponsesInput(input: unknown, instructions?: string | null): FormattedMessage[] {\n const messages: FormattedMessage[] = []\n\n if (instructions) {\n messages.push({\n role: 'system',\n content: instructions,\n })\n }\n\n if (Array.isArray(input)) {\n for (const item of input) {\n if (typeof item === 'string') {\n messages.push({ role: 'user', content: item })\n } else if (item && typeof item === 'object') {\n const obj = item as Record<string, unknown>\n const role = isString(obj.role) ? obj.role : 'user'\n\n // Handle content properly - preserve structure for objects/arrays\n const content = obj.content ?? obj.text ?? item\n messages.push({ role, content: toContentString(content) })\n } else {\n messages.push({ role: 'user', content: toContentString(item) })\n }\n }\n } else if (typeof input === 'string') {\n messages.push({ role: 'user', content: input })\n } else if (input) {\n messages.push({ role: 'user', content: toContentString(input) })\n }\n\n return messages\n}\n","import {\n GoogleGenAI,\n GenerateContentResponse as GeminiResponse,\n GenerateContentParameters,\n Part,\n GenerateContentResponseUsageMetadata,\n} from '@google/genai'\nimport type { GoogleGenAIOptions } from '@google/genai'\nimport { PostHog } from 'posthog-node'\nimport {\n MonitoringParams,\n sendEventToPosthog,\n extractAvailableToolCalls,\n formatResponseGemini,\n extractPosthogParams,\n toContentString,\n sendEventWithErrorToPosthog,\n} from '../utils'\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 await sendEventToPosthog({\n client: 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 params: 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 tools: availableTools,\n })\n\n return response\n } catch (error: unknown) {\n const latency = (Date.now() - startTime) / 1000\n const enrichedError = await sendEventWithErrorToPosthog({\n client: 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 params: params as GenerateContentParameters & MonitoringParams,\n usage: {\n inputTokens: 0,\n outputTokens: 0,\n },\n error: error,\n })\n throw enrichedError\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 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 // 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 sendEventToPosthog({\n client: 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 params: params as GenerateContentParameters & MonitoringParams,\n httpStatus: 200,\n usage: {\n ...usage,\n webSearchCount: usage.webSearchCount,\n rawUsage: usage.rawUsage,\n },\n tools: availableTools,\n })\n } catch (error: unknown) {\n const latency = (Date.now() - startTime) / 1000\n const enrichedError = await sendEventWithErrorToPosthog({\n client: 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 params: params as GenerateContentParameters & MonitoringParams,\n usage: {\n inputTokens: 0,\n outputTokens: 0,\n },\n error: error,\n })\n throw enrichedError\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 || ''\n const contentType = mimeType.startsWith('image/') ? 'image' : 'document'\n\n blocks.push({\n type: contentType,\n inline_data: {\n data: inlineData.data,\n mime_type: mimeType,\n },\n } as FormattedContentItem)\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 * 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 }\n"],"names":["isString","value","isObject","Array","isArray","REDACTED_IMAGE_PLACEHOLDER","isMultimodalEnabled","val","process","env","_INTERNAL_LLMA_MULTIMODAL","toLowerCase","isBase64DataUrl","str","test","isValidUrl","URL","startsWith","isRawBase64","length","redactBase64DataUrl","sanitizeGeminiPart","part","inlineData","data","processGeminiItem","item","parts","map","sanitizeGemini","toContentString","content","undefined","JSON","stringify","String","getModelParams","params","modelParams","paramKeys","key","formatResponseGemini","response","output","candidates","candidate","text","push","type","functionCall","function","name","arguments","args","mimeType","Uint8Array","Buffer","from","toString","binary","i","fromCharCode","btoa","mime_type","role","withPrivacyMode","client","privacyMode","input","privacy_mode","extractAvailableToolCalls","provider","config","tools","AIEvent","sanitizeValues","obj","jsonSafe","parse","TextDecoder","decode","TextEncoder","encode","Object","fromEntries","entries","k","v","POSTHOG_PARAMS_MAP","posthogDistinctId","posthogTraceId","posthogProperties","posthogPrivacyMode","posthogGroups","posthogModelOverride","posthogProviderOverride","posthogCostOverride","posthogCaptureImmediate","extractPosthogParams","body","providerParams","posthogParams","console","warn","addDefaults","traceId","uuidv4","sendEventWithErrorToPosthog","error","httpStatus","status","properties","enrichedError","options","enableExceptionAutocapture","exceptionId","uuidv7","captureException","$ai_trace_id","__posthog_previously_captured_error","sendEventToPosthog","eventType","Generation","distinctId","model","latency","timeToFirstToken","baseURL","usage","captureImmediate","capture","Promise","resolve","safeInput","safeOutput","safeError","errorData","$ai_is_error","$ai_error","$exception_event_id","costOverrideData","inputCostUSD","inputCost","inputTokens","outputCostUSD","outputCost","outputTokens","$ai_input_cost_usd","$ai_output_cost_usd","$ai_total_cost_usd","additionalTokenValues","reasoningTokens","$ai_reasoning_tokens","cacheReadInputTokens","$ai_cache_read_input_tokens","cacheCreationInputTokens","$ai_cache_creation_input_tokens","webSearchCount","$ai_web_search_count","rawUsage","$ai_usage","$ai_lib","$ai_lib_version","version","$ai_provider","$ai_model","$ai_model_parameters","$ai_input","$ai_output_choices","$ai_http_status","$ai_input_tokens","$ai_output_tokens","$ai_latency","$ai_time_to_first_token","$ai_base_url","$process_person_profile","$ai_tools","event","groups","PostHogGoogleGenAI","constructor","posthog","geminiConfig","phClient","GoogleGenAI","models","WrappedModels","generateContent","geminiParams","startTime","Date","now","availableTools","metadata","usageMetadata","formatInputForPostHog","promptTokenCount","candidatesTokenCount","thoughtsTokenCount","cachedContentTokenCount","calculateGoogleWebSearchCount","generateContentStream","accumulatedContent","firstTokenTime","stream","chunk","chunkWebSearchCount","lastTextItem","funcCall","formatPartsAsContentBlocks","blocks","contentType","inline_data","formatInput","contents","contentBlocks","extractSystemInstruction","systemInstruction","sanitized","messages","hasSystemMessage","some","msg","hasGrounding","groundingMetadata","webSearchQueries","groundingChunks","includes"],"mappings":"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"}
1
+ {"version":3,"file":"index.mjs","sources":["../../src/typeGuards.ts","../../src/sanitization.ts","../../src/utils.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","import { isString, isObject } from './typeGuards'\n\nconst REDACTED_IMAGE_PLACEHOLDER = '[base64 image redacted]'\n\n// ============================================\n// Multimodal Feature Toggle\n// ============================================\n\nconst isMultimodalEnabled = (): boolean => {\n const val = process.env._INTERNAL_LLMA_MULTIMODAL || ''\n return val.toLowerCase() === 'true' || val === '1' || val.toLowerCase() === 'yes'\n}\n\n// ============================================\n// Base64 Detection Helpers\n// ============================================\n\nconst isBase64DataUrl = (str: string): boolean => {\n return /^data:([^;]+);base64,/.test(str)\n}\n\nconst isValidUrl = (str: string): boolean => {\n try {\n new URL(str)\n return true\n } catch {\n // Not an absolute URL, check if it's a relative URL or path\n return str.startsWith('/') || str.startsWith('./') || str.startsWith('../')\n }\n}\n\nconst isRawBase64 = (str: string): boolean => {\n // Skip if it's a valid URL or path\n if (isValidUrl(str)) {\n return false\n }\n\n // Check if it's a valid base64 string\n // Base64 images are typically at least a few hundred chars, but we'll be conservative\n return str.length > 20 && /^[A-Za-z0-9+/]+=*$/.test(str)\n}\n\nexport function redactBase64DataUrl(str: string): string\nexport function redactBase64DataUrl(str: unknown): unknown\nexport function redactBase64DataUrl(str: unknown): unknown {\n if (isMultimodalEnabled()) return str\n if (!isString(str)) return str\n\n // Check for data URL format\n if (isBase64DataUrl(str)) {\n return REDACTED_IMAGE_PLACEHOLDER\n }\n\n // Check for raw base64 (Vercel sends raw base64 for inline images)\n if (isRawBase64(str)) {\n return REDACTED_IMAGE_PLACEHOLDER\n }\n\n return str\n}\n\n// ============================================\n// Common Message Processing\n// ============================================\n\ntype ContentTransformer = (item: unknown) => unknown\n\nconst processMessages = (messages: unknown, transformContent: ContentTransformer): unknown => {\n if (!messages) return messages\n\n const processContent = (content: unknown): unknown => {\n if (typeof content === 'string') return content\n\n if (!content) return content\n\n if (Array.isArray(content)) {\n return content.map(transformContent)\n }\n\n // Handle single object content\n return transformContent(content)\n }\n\n const processMessage = (msg: unknown): unknown => {\n if (!isObject(msg) || !('content' in msg)) return msg\n return { ...msg, content: processContent(msg.content) }\n }\n\n // Handle both arrays and single messages\n if (Array.isArray(messages)) {\n return messages.map(processMessage)\n }\n\n return processMessage(messages)\n}\n\n// ============================================\n// Provider-Specific Image Sanitizers\n// ============================================\n\nconst sanitizeOpenAIImage = (item: unknown): unknown => {\n if (!isObject(item)) return item\n\n // Handle image_url format\n if (item.type === 'image_url' && 'image_url' in item && isObject(item.image_url) && 'url' in item.image_url) {\n return {\n ...item,\n image_url: {\n ...item.image_url,\n url: redactBase64DataUrl(item.image_url.url),\n },\n }\n }\n\n // Handle audio format\n if (item.type === 'audio' && 'data' in item) {\n if (isMultimodalEnabled()) return item\n return { ...item, data: REDACTED_IMAGE_PLACEHOLDER }\n }\n\n return item\n}\n\nconst sanitizeOpenAIResponseImage = (item: unknown): unknown => {\n if (!isObject(item)) return item\n\n // Handle input_image format\n if (item.type === 'input_image' && 'image_url' in item) {\n return {\n ...item,\n image_url: redactBase64DataUrl(item.image_url),\n }\n }\n\n return item\n}\n\nconst sanitizeAnthropicImage = (item: unknown): unknown => {\n if (isMultimodalEnabled()) return item\n if (!isObject(item)) return item\n\n // Handle Anthropic's image and document formats (same structure, different type field)\n if (\n (item.type === 'image' || item.type === 'document') &&\n 'source' in item &&\n isObject(item.source) &&\n item.source.type === 'base64' &&\n 'data' in item.source\n ) {\n return {\n ...item,\n source: {\n ...item.source,\n data: REDACTED_IMAGE_PLACEHOLDER,\n },\n }\n }\n\n return item\n}\n\nconst sanitizeGeminiPart = (part: unknown): unknown => {\n if (isMultimodalEnabled()) return part\n if (!isObject(part)) return part\n\n // Handle Gemini's inline data format (images, audio, PDFs all use inlineData)\n if ('inlineData' in part && isObject(part.inlineData) && 'data' in part.inlineData) {\n return {\n ...part,\n inlineData: {\n ...part.inlineData,\n data: REDACTED_IMAGE_PLACEHOLDER,\n },\n }\n }\n\n return part\n}\n\nconst processGeminiItem = (item: unknown): unknown => {\n if (!isObject(item)) return item\n\n // If it has parts, process them\n if ('parts' in item && item.parts) {\n const parts = Array.isArray(item.parts) ? item.parts.map(sanitizeGeminiPart) : sanitizeGeminiPart(item.parts)\n\n return { ...item, parts }\n }\n\n return item\n}\n\nconst sanitizeLangChainImage = (item: unknown): unknown => {\n if (!isObject(item)) return item\n\n // OpenAI style\n if (item.type === 'image_url' && 'image_url' in item && isObject(item.image_url) && 'url' in item.image_url) {\n return {\n ...item,\n image_url: {\n ...item.image_url,\n url: redactBase64DataUrl(item.image_url.url),\n },\n }\n }\n\n // Direct image with data field\n if (item.type === 'image' && 'data' in item) {\n return { ...item, data: redactBase64DataUrl(item.data) }\n }\n\n // Anthropic style\n if (item.type === 'image' && 'source' in item && isObject(item.source) && 'data' in item.source) {\n if (isMultimodalEnabled()) return item\n return {\n ...item,\n source: {\n ...item.source,\n data: redactBase64DataUrl(item.source.data),\n },\n }\n }\n\n // Google style\n if (item.type === 'media' && 'data' in item) {\n return { ...item, data: redactBase64DataUrl(item.data) }\n }\n\n return item\n}\n\n// Export individual sanitizers for tree-shaking\nexport const sanitizeOpenAI = (data: unknown): unknown => {\n return processMessages(data, sanitizeOpenAIImage)\n}\n\nexport const sanitizeOpenAIResponse = (data: unknown): unknown => {\n return processMessages(data, sanitizeOpenAIResponseImage)\n}\n\nexport const sanitizeAnthropic = (data: unknown): unknown => {\n return processMessages(data, sanitizeAnthropicImage)\n}\n\nexport const sanitizeGemini = (data: unknown): unknown => {\n // Gemini has a different structure with 'parts' directly on items instead of 'content'\n // So we need custom processing instead of using processMessages\n if (!data) return data\n\n if (Array.isArray(data)) {\n return data.map(processGeminiItem)\n }\n\n return processGeminiItem(data)\n}\n\nexport const sanitizeLangChain = (data: unknown): unknown => {\n return processMessages(data, sanitizeLangChainImage)\n}\n","import { EventMessage, PostHog } from 'posthog-node'\nimport OpenAIOrignal from 'openai'\nimport AnthropicOriginal from '@anthropic-ai/sdk'\nimport type { ChatCompletionTool } from 'openai/resources/chat/completions'\nimport type { ResponseCreateParamsWithTools } from 'openai/lib/ResponsesParser'\nimport type { Tool as GeminiTool } from '@google/genai'\nimport type { FormattedMessage, FormattedContent, TokenUsage } from './types'\nimport { version } from '../package.json'\nimport { v4 as uuidv4 } from 'uuid'\nimport { isString } from './typeGuards'\nimport { uuidv7, ErrorTracking as CoreErrorTracking } from '@posthog/core'\nimport { redactBase64DataUrl } from './sanitization'\n\ntype ChatCompletionCreateParamsBase = OpenAIOrignal.Chat.Completions.ChatCompletionCreateParams\ntype MessageCreateParams = AnthropicOriginal.Messages.MessageCreateParams\ntype ResponseCreateParams = OpenAIOrignal.Responses.ResponseCreateParams\ntype EmbeddingCreateParams = OpenAIOrignal.EmbeddingCreateParams\ntype TranscriptionCreateParams = OpenAIOrignal.Audio.Transcriptions.TranscriptionCreateParams\ntype AnthropicTool = AnthropicOriginal.Tool\n\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/**\n * Safely converts content to a string, preserving structure for objects/arrays.\n * - If content is already a string, returns it as-is\n * - If content is an object or array, stringifies it with JSON.stringify to preserve structure\n * - Otherwise, converts to string with String()\n *\n * This prevents the \"[object Object]\" bug when objects are naively converted to strings.\n *\n * @param content - The content to convert to a string\n * @returns A string representation that preserves structure for complex types\n */\nexport function toContentString(content: unknown): string {\n if (typeof content === 'string') {\n return content\n }\n if (content !== undefined && content !== null && typeof content === 'object') {\n try {\n return JSON.stringify(content)\n } catch {\n // Fallback for circular refs, BigInt, or objects with throwing toJSON\n return String(content)\n }\n }\n return String(content)\n}\n\nexport interface MonitoringEventPropertiesWithDefaults {\n distinctId?: string\n traceId: string\n properties?: Record<string, any>\n privacyMode: boolean\n groups?: Record<string, any>\n modelOverride?: string\n providerOverride?: string\n costOverride?: CostOverride\n captureImmediate?: boolean\n}\n\nexport type MonitoringEventProperties = Partial<MonitoringEventPropertiesWithDefaults>\n\nexport type MonitoringParams = {\n [K in keyof MonitoringEventProperties as `posthog${Capitalize<string & K>}`]: MonitoringEventProperties[K]\n}\n\nexport interface CostOverride {\n inputCost: number\n outputCost: number\n}\n\nexport const getModelParams = (\n params:\n | ((\n | ChatCompletionCreateParamsBase\n | MessageCreateParams\n | ResponseCreateParams\n | ResponseCreateParamsWithTools\n | EmbeddingCreateParams\n | TranscriptionCreateParams\n ) &\n MonitoringParams)\n | null\n): Record<string, any> => {\n if (!params) {\n return {}\n }\n const modelParams: Record<string, any> = {}\n const paramKeys = [\n 'temperature',\n 'max_tokens',\n 'max_completion_tokens',\n 'top_p',\n 'frequency_penalty',\n 'presence_penalty',\n 'n',\n 'stop',\n 'stream',\n 'streaming',\n 'language',\n 'response_format',\n 'timestamp_granularities',\n ] as const\n\n for (const key of paramKeys) {\n if (key in params && (params as any)[key] !== undefined) {\n modelParams[key] = (params as any)[key]\n }\n }\n return modelParams\n}\n\n/**\n * Helper to format responses (non-streaming) for consumption\n */\nexport const formatResponse = (response: any, provider: string): FormattedMessage[] => {\n if (!response) {\n return []\n }\n if (provider === 'anthropic') {\n return formatResponseAnthropic(response)\n } else if (provider === 'openai') {\n return formatResponseOpenAI(response)\n } else if (provider === 'gemini') {\n return formatResponseGemini(response)\n }\n return []\n}\n\nexport const formatResponseAnthropic = (response: any): FormattedMessage[] => {\n const output: FormattedMessage[] = []\n const content: FormattedContent = []\n\n for (const choice of response.content ?? []) {\n if (choice?.type === 'text' && choice?.text) {\n content.push({ type: 'text', text: choice.text })\n } else if (choice?.type === 'tool_use' && choice?.name && choice?.id) {\n content.push({\n type: 'function',\n id: choice.id,\n function: {\n name: choice.name,\n arguments: choice.input || {},\n },\n })\n }\n }\n\n if (content.length > 0) {\n output.push({\n role: 'assistant',\n content,\n })\n }\n\n return output\n}\n\nexport const formatResponseOpenAI = (response: any): FormattedMessage[] => {\n const output: FormattedMessage[] = []\n\n if (response.choices) {\n for (const choice of response.choices) {\n const content: FormattedContent = []\n let role = 'assistant'\n\n if (choice.message) {\n if (choice.message.role) {\n role = choice.message.role\n }\n\n if (choice.message.content) {\n content.push({ type: 'text', text: choice.message.content })\n }\n\n if (choice.message.tool_calls) {\n for (const toolCall of choice.message.tool_calls) {\n content.push({\n type: 'function',\n id: toolCall.id,\n function: {\n name: toolCall.function.name,\n arguments: toolCall.function.arguments,\n },\n })\n }\n }\n\n // Handle audio output (gpt-4o-audio-preview)\n if (choice.message.audio) {\n content.push({\n type: 'audio',\n ...choice.message.audio,\n })\n }\n }\n\n if (content.length > 0) {\n output.push({\n role,\n content,\n })\n }\n }\n }\n\n // Handle Responses API format\n if (response.output) {\n const content: FormattedContent = []\n let role = 'assistant'\n\n for (const item of response.output) {\n if (item.type === 'message') {\n role = item.role\n\n if (item.content && Array.isArray(item.content)) {\n for (const contentItem of item.content) {\n if (contentItem.type === 'output_text' && contentItem.text) {\n content.push({ type: 'text', text: contentItem.text })\n } else if (contentItem.text) {\n content.push({ type: 'text', text: contentItem.text })\n } else if (contentItem.type === 'input_image' && contentItem.image_url) {\n content.push({\n type: 'image',\n image: contentItem.image_url,\n })\n }\n }\n } else if (item.content) {\n content.push({ type: 'text', text: String(item.content) })\n }\n } else if (item.type === 'function_call') {\n content.push({\n type: 'function',\n id: item.call_id || item.id || '',\n function: {\n name: item.name,\n arguments: item.arguments || {},\n },\n })\n }\n }\n\n if (content.length > 0) {\n output.push({\n role,\n content,\n })\n }\n }\n\n return output\n}\n\nexport const formatResponseGemini = (response: any): FormattedMessage[] => {\n const output: FormattedMessage[] = []\n\n if (response.candidates && Array.isArray(response.candidates)) {\n for (const candidate of response.candidates) {\n if (candidate.content && candidate.content.parts) {\n const content: FormattedContent = []\n\n for (const part of candidate.content.parts) {\n if (part.text) {\n content.push({ type: 'text', text: part.text })\n } else if (part.functionCall) {\n content.push({\n type: 'function',\n function: {\n name: part.functionCall.name,\n arguments: part.functionCall.args,\n },\n })\n } else if (part.inlineData) {\n // Handle audio/media inline data\n const mimeType = part.inlineData.mimeType || 'audio/pcm'\n let data = part.inlineData.data\n\n // Handle binary data (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({\n type: 'audio',\n mime_type: mimeType,\n data: data,\n })\n }\n }\n\n if (content.length > 0) {\n output.push({\n role: 'assistant',\n content,\n })\n }\n } else if (candidate.text) {\n output.push({\n role: 'assistant',\n content: [{ type: 'text', text: candidate.text }],\n })\n }\n }\n } else if (response.text) {\n output.push({\n role: 'assistant',\n content: [{ type: 'text', text: response.text }],\n })\n }\n\n return output\n}\n\nexport const mergeSystemPrompt = (params: MessageCreateParams & MonitoringParams, provider: string): any => {\n if (provider == 'anthropic') {\n const messages = params.messages || []\n if (!(params as any).system) {\n return messages\n }\n const systemMessage = (params as any).system\n return [{ role: 'system', content: systemMessage }, ...messages]\n }\n return params.messages\n}\n\nexport const withPrivacyMode = (client: PostHog, privacyMode: boolean, input: any): any => {\n return (client as any).privacy_mode || privacyMode ? null : input\n}\n\nfunction toSafeString(input: unknown): string {\n if (input === undefined || input === null) {\n return ''\n }\n if (typeof input === 'string') {\n return input\n }\n try {\n return JSON.stringify(input)\n } catch {\n console.warn('Failed to stringify input', input)\n return ''\n }\n}\n\nexport const truncate = (input: unknown): string => {\n const str = toSafeString(input)\n if (str === '') {\n return ''\n }\n\n // Check if we need to truncate and ensure STRING_FORMAT is respected\n const encoder = new TextEncoder()\n const buffer = encoder.encode(str)\n if (buffer.length <= MAX_OUTPUT_SIZE) {\n // Ensure STRING_FORMAT is respected\n return new TextDecoder(STRING_FORMAT).decode(buffer)\n }\n\n // Truncate the buffer and ensure a valid string is returned\n const truncatedBuffer = buffer.slice(0, MAX_OUTPUT_SIZE)\n // fatal: false means we get U+FFFD at the end if truncation broke the encoding\n const decoder = new TextDecoder(STRING_FORMAT, { fatal: false })\n let truncatedStr = decoder.decode(truncatedBuffer)\n if (truncatedStr.endsWith('\\uFFFD')) {\n truncatedStr = truncatedStr.slice(0, -1)\n }\n return `${truncatedStr}... [truncated]`\n}\n\n/**\n * Calculate web search count from raw API response.\n *\n * Uses a two-tier detection strategy:\n * Priority 1 (Exact Count): Count actual web search calls when available\n * Priority 2 (Binary Detection): Return 1 if web search indicators are present, 0 otherwise\n *\n * @param result - Raw API response from any provider (OpenAI, Perplexity, OpenRouter, Gemini, etc.)\n * @returns Number of web searches performed (exact count or binary 1/0)\n */\nexport function calculateWebSearchCount(result: unknown): number {\n if (!result || typeof result !== 'object') {\n return 0\n }\n\n // Priority 1: Exact Count\n // Check for OpenAI Responses API web_search_call items\n if ('output' in result && Array.isArray(result.output)) {\n let count = 0\n\n for (const item of result.output) {\n if (typeof item === 'object' && item !== null && 'type' in item && item.type === 'web_search_call') {\n count++\n }\n }\n\n if (count > 0) {\n return count\n }\n }\n\n // Priority 2: Binary Detection (1 or 0)\n\n // Check for citations at root level (Perplexity)\n if ('citations' in result && Array.isArray(result.citations) && result.citations.length > 0) {\n return 1\n }\n\n // Check for search_results at root level (Perplexity via OpenRouter)\n if ('search_results' in result && Array.isArray(result.search_results) && result.search_results.length > 0) {\n return 1\n }\n\n // Check for usage.search_context_size (Perplexity via OpenRouter)\n if ('usage' in result && typeof result.usage === 'object' && result.usage !== null) {\n if ('search_context_size' in result.usage && result.usage.search_context_size) {\n return 1\n }\n }\n\n // Check for annotations with url_citation in choices[].message or choices[].delta (OpenAI/Perplexity)\n if ('choices' in result && Array.isArray(result.choices)) {\n for (const choice of result.choices) {\n if (typeof choice === 'object' && choice !== null) {\n // Check both message (non-streaming) and delta (streaming) for annotations\n const content = ('message' in choice ? choice.message : null) || ('delta' in choice ? choice.delta : null)\n\n if (typeof content === 'object' && content !== null && 'annotations' in content) {\n const annotations = content.annotations\n\n if (Array.isArray(annotations)) {\n const hasUrlCitation = annotations.some((ann: unknown) => {\n return typeof ann === 'object' && ann !== null && 'type' in ann && ann.type === 'url_citation'\n })\n\n if (hasUrlCitation) {\n return 1\n }\n }\n }\n }\n }\n }\n\n // Check for annotations in output[].content[] (OpenAI Responses API)\n if ('output' in result && Array.isArray(result.output)) {\n for (const item of result.output) {\n if (typeof item === 'object' && item !== null && 'content' in item) {\n const content = item.content\n\n if (Array.isArray(content)) {\n for (const contentItem of content) {\n if (typeof contentItem === 'object' && contentItem !== null && 'annotations' in contentItem) {\n const annotations = contentItem.annotations\n\n if (Array.isArray(annotations)) {\n const hasUrlCitation = annotations.some((ann: unknown) => {\n return typeof ann === 'object' && ann !== null && 'type' in ann && ann.type === 'url_citation'\n })\n\n if (hasUrlCitation) {\n return 1\n }\n }\n }\n }\n }\n }\n }\n }\n\n // Check for grounding_metadata (Gemini)\n if ('candidates' in result && Array.isArray(result.candidates)) {\n for (const candidate of result.candidates) {\n if (\n typeof candidate === 'object' &&\n candidate !== null &&\n 'grounding_metadata' in candidate &&\n candidate.grounding_metadata\n ) {\n return 1\n }\n }\n }\n\n return 0\n}\n\n/**\n * Extract available tool calls from the request parameters.\n * These are the tools provided to the LLM, not the tool calls in the response.\n */\nexport const extractAvailableToolCalls = (\n provider: string,\n params: any\n): ChatCompletionTool[] | AnthropicTool[] | GeminiTool[] | null => {\n if (provider === 'anthropic') {\n if (params.tools) {\n return params.tools\n }\n\n return null\n } else if (provider === 'gemini') {\n if (params.config && params.config.tools) {\n return params.config.tools\n }\n\n return null\n } else if (provider === 'openai') {\n if (params.tools) {\n return params.tools\n }\n\n return null\n } else if (provider === 'vercel') {\n if (params.tools) {\n return params.tools\n }\n\n return null\n }\n\n return null\n}\n\nexport enum AIEvent {\n Generation = '$ai_generation',\n Embedding = '$ai_embedding',\n}\n\nexport type SendEventToPosthogParams = {\n client: PostHog\n eventType?: AIEvent\n distinctId?: string\n traceId: string\n model?: string\n provider: string\n input: any\n output: any\n latency: number\n timeToFirstToken?: number\n baseURL: string\n httpStatus: number\n usage?: TokenUsage\n params: (\n | ChatCompletionCreateParamsBase\n | MessageCreateParams\n | ResponseCreateParams\n | ResponseCreateParamsWithTools\n | EmbeddingCreateParams\n | TranscriptionCreateParams\n ) &\n MonitoringParams\n error?: unknown\n exceptionId?: string\n tools?: ChatCompletionTool[] | AnthropicTool[] | GeminiTool[] | null\n captureImmediate?: boolean\n}\n\nfunction sanitizeValues(obj: any): any {\n if (obj === undefined || obj === null) {\n return obj\n }\n const jsonSafe = JSON.parse(JSON.stringify(obj))\n if (typeof jsonSafe === 'string') {\n // 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 const sendEventWithErrorToPosthog = async ({\n client,\n traceId,\n error,\n ...args\n}: Omit<SendEventToPosthogParams, 'error' | 'httpStatus'> &\n Required<Pick<SendEventToPosthogParams, 'error'>>): Promise<unknown> => {\n const httpStatus =\n error && typeof error === 'object' && 'status' in error ? ((error as { status?: number }).status ?? 500) : 500\n\n const properties = { client, traceId, httpStatus, error: JSON.stringify(error), ...args }\n const enrichedError = error as CoreErrorTracking.PreviouslyCapturedError\n\n if (client.options?.enableExceptionAutocapture) {\n // assign a uuid that can be used to link the trace and exception events\n const exceptionId = uuidv7()\n client.captureException(error, undefined, { $ai_trace_id: traceId }, exceptionId)\n enrichedError.__posthog_previously_captured_error = true\n properties.exceptionId = exceptionId\n }\n\n await sendEventToPosthog(properties)\n\n return enrichedError\n}\n\nexport const sendEventToPosthog = async ({\n client,\n eventType = AIEvent.Generation,\n distinctId,\n traceId,\n model,\n provider,\n input,\n output,\n latency,\n timeToFirstToken,\n baseURL,\n params,\n httpStatus = 200,\n usage = {},\n error,\n exceptionId,\n tools,\n captureImmediate = false,\n}: SendEventToPosthogParams): Promise<void> => {\n if (!client.capture) {\n return Promise.resolve()\n }\n // sanitize input and output for UTF-8 validity\n const safeInput = sanitizeValues(input)\n const safeOutput = sanitizeValues(output)\n const safeError = sanitizeValues(error)\n\n let errorData = {}\n if (error) {\n errorData = {\n $ai_is_error: true,\n $ai_error: safeError,\n $exception_event_id: exceptionId,\n }\n }\n let costOverrideData = {}\n if (params.posthogCostOverride) {\n const inputCostUSD = (params.posthogCostOverride.inputCost ?? 0) * (usage.inputTokens ?? 0)\n const outputCostUSD = (params.posthogCostOverride.outputCost ?? 0) * (usage.outputTokens ?? 0)\n costOverrideData = {\n $ai_input_cost_usd: inputCostUSD,\n $ai_output_cost_usd: outputCostUSD,\n $ai_total_cost_usd: inputCostUSD + outputCostUSD,\n }\n }\n\n const additionalTokenValues = {\n ...(usage.reasoningTokens ? { $ai_reasoning_tokens: usage.reasoningTokens } : {}),\n ...(usage.cacheReadInputTokens ? { $ai_cache_read_input_tokens: usage.cacheReadInputTokens } : {}),\n ...(usage.cacheCreationInputTokens ? { $ai_cache_creation_input_tokens: usage.cacheCreationInputTokens } : {}),\n ...(usage.webSearchCount ? { $ai_web_search_count: usage.webSearchCount } : {}),\n ...(usage.rawUsage ? { $ai_usage: usage.rawUsage } : {}),\n }\n\n const properties = {\n $ai_lib: 'posthog-ai',\n $ai_lib_version: version,\n $ai_provider: params.posthogProviderOverride ?? provider,\n $ai_model: params.posthogModelOverride ?? model,\n $ai_model_parameters: getModelParams(params),\n $ai_input: withPrivacyMode(client, params.posthogPrivacyMode ?? false, safeInput),\n $ai_output_choices: withPrivacyMode(client, params.posthogPrivacyMode ?? false, safeOutput),\n $ai_http_status: httpStatus,\n $ai_input_tokens: usage.inputTokens ?? 0,\n ...(usage.outputTokens !== undefined ? { $ai_output_tokens: usage.outputTokens } : {}),\n ...additionalTokenValues,\n $ai_latency: latency,\n ...(timeToFirstToken !== undefined ? { $ai_time_to_first_token: timeToFirstToken } : {}),\n $ai_trace_id: traceId,\n $ai_base_url: baseURL,\n ...params.posthogProperties,\n $ai_tokens_source: getTokensSource(params.posthogProperties),\n ...(distinctId ? {} : { $process_person_profile: false }),\n ...(tools ? { $ai_tools: tools } : {}),\n ...errorData,\n ...costOverrideData,\n }\n\n const event: EventMessage = {\n distinctId: distinctId ?? traceId,\n event: eventType,\n properties,\n groups: params.posthogGroups,\n }\n\n if (captureImmediate) {\n // await capture promise to send single event in serverless environments\n await client.captureImmediate(event)\n } else {\n client.capture(event)\n }\n\n return Promise.resolve()\n}\n\nexport function formatOpenAIResponsesInput(input: unknown, instructions?: string | null): FormattedMessage[] {\n const messages: FormattedMessage[] = []\n\n if (instructions) {\n messages.push({\n role: 'system',\n content: instructions,\n })\n }\n\n if (Array.isArray(input)) {\n for (const item of input) {\n if (typeof item === 'string') {\n messages.push({ role: 'user', content: item })\n } else if (item && typeof item === 'object') {\n const obj = item as Record<string, unknown>\n const role = isString(obj.role) ? obj.role : 'user'\n\n // Handle content properly - preserve structure for objects/arrays\n const content = obj.content ?? obj.text ?? item\n messages.push({ role, content: toContentString(content) })\n } else {\n messages.push({ role: 'user', content: toContentString(item) })\n }\n }\n } else if (typeof input === 'string') {\n messages.push({ role: 'user', content: input })\n } else if (input) {\n messages.push({ role: 'user', content: toContentString(input) })\n }\n\n return messages\n}\n","import {\n GoogleGenAI,\n GenerateContentResponse as GeminiResponse,\n GenerateContentParameters,\n Part,\n GenerateContentResponseUsageMetadata,\n} from '@google/genai'\nimport type { GoogleGenAIOptions } from '@google/genai'\nimport { PostHog } from 'posthog-node'\nimport {\n MonitoringParams,\n sendEventToPosthog,\n extractAvailableToolCalls,\n formatResponseGemini,\n extractPosthogParams,\n toContentString,\n sendEventWithErrorToPosthog,\n} from '../utils'\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 await sendEventToPosthog({\n client: 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 params: 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 tools: availableTools,\n })\n\n return response\n } catch (error: unknown) {\n const latency = (Date.now() - startTime) / 1000\n const enrichedError = await sendEventWithErrorToPosthog({\n client: 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 params: params as GenerateContentParameters & MonitoringParams,\n usage: {\n inputTokens: 0,\n outputTokens: 0,\n },\n error: error,\n })\n throw enrichedError\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 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 // 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 sendEventToPosthog({\n client: 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 params: params as GenerateContentParameters & MonitoringParams,\n httpStatus: 200,\n usage: {\n ...usage,\n webSearchCount: usage.webSearchCount,\n rawUsage: usage.rawUsage,\n },\n tools: availableTools,\n })\n } catch (error: unknown) {\n const latency = (Date.now() - startTime) / 1000\n const enrichedError = await sendEventWithErrorToPosthog({\n client: 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 params: params as GenerateContentParameters & MonitoringParams,\n usage: {\n inputTokens: 0,\n outputTokens: 0,\n },\n error: error,\n })\n throw enrichedError\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 || ''\n const contentType = mimeType.startsWith('image/') ? 'image' : 'document'\n\n blocks.push({\n type: contentType,\n inline_data: {\n data: inlineData.data,\n mime_type: mimeType,\n },\n } as FormattedContentItem)\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 * 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 }\n"],"names":["isString","value","isObject","Array","isArray","REDACTED_IMAGE_PLACEHOLDER","isMultimodalEnabled","val","process","env","_INTERNAL_LLMA_MULTIMODAL","toLowerCase","isBase64DataUrl","str","test","isValidUrl","URL","startsWith","isRawBase64","length","redactBase64DataUrl","sanitizeGeminiPart","part","inlineData","data","processGeminiItem","item","parts","map","sanitizeGemini","TOKEN_PROPERTY_KEYS","Set","getTokensSource","posthogProperties","Object","keys","some","key","has","toContentString","content","undefined","JSON","stringify","String","getModelParams","params","modelParams","paramKeys","formatResponseGemini","response","output","candidates","candidate","text","push","type","functionCall","function","name","arguments","args","mimeType","Uint8Array","Buffer","from","toString","binary","i","fromCharCode","btoa","mime_type","role","withPrivacyMode","client","privacyMode","input","privacy_mode","extractAvailableToolCalls","provider","config","tools","AIEvent","sanitizeValues","obj","jsonSafe","parse","TextDecoder","decode","TextEncoder","encode","fromEntries","entries","k","v","POSTHOG_PARAMS_MAP","posthogDistinctId","posthogTraceId","posthogPrivacyMode","posthogGroups","posthogModelOverride","posthogProviderOverride","posthogCostOverride","posthogCaptureImmediate","extractPosthogParams","body","providerParams","posthogParams","console","warn","addDefaults","traceId","uuidv4","sendEventWithErrorToPosthog","error","httpStatus","status","properties","enrichedError","options","enableExceptionAutocapture","exceptionId","uuidv7","captureException","$ai_trace_id","__posthog_previously_captured_error","sendEventToPosthog","eventType","Generation","distinctId","model","latency","timeToFirstToken","baseURL","usage","captureImmediate","capture","Promise","resolve","safeInput","safeOutput","safeError","errorData","$ai_is_error","$ai_error","$exception_event_id","costOverrideData","inputCostUSD","inputCost","inputTokens","outputCostUSD","outputCost","outputTokens","$ai_input_cost_usd","$ai_output_cost_usd","$ai_total_cost_usd","additionalTokenValues","reasoningTokens","$ai_reasoning_tokens","cacheReadInputTokens","$ai_cache_read_input_tokens","cacheCreationInputTokens","$ai_cache_creation_input_tokens","webSearchCount","$ai_web_search_count","rawUsage","$ai_usage","$ai_lib","$ai_lib_version","version","$ai_provider","$ai_model","$ai_model_parameters","$ai_input","$ai_output_choices","$ai_http_status","$ai_input_tokens","$ai_output_tokens","$ai_latency","$ai_time_to_first_token","$ai_base_url","$ai_tokens_source","$process_person_profile","$ai_tools","event","groups","PostHogGoogleGenAI","constructor","posthog","geminiConfig","phClient","GoogleGenAI","models","WrappedModels","generateContent","geminiParams","startTime","Date","now","availableTools","metadata","usageMetadata","formatInputForPostHog","promptTokenCount","candidatesTokenCount","thoughtsTokenCount","cachedContentTokenCount","calculateGoogleWebSearchCount","generateContentStream","accumulatedContent","firstTokenTime","stream","chunk","chunkWebSearchCount","lastTextItem","funcCall","formatPartsAsContentBlocks","blocks","contentType","inline_data","formatInput","contents","contentBlocks","extractSystemInstruction","systemInstruction","sanitized","messages","hasSystemMessage","msg","hasGrounding","groundingMetadata","webSearchQueries","groundingChunks","includes"],"mappings":"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"}
package/dist/index.cjs CHANGED
@@ -29,7 +29,7 @@ function _interopNamespace(e) {
29
29
  var uuid__namespace = /*#__PURE__*/_interopNamespace(uuid);
30
30
  var AnthropicOriginal__default = /*#__PURE__*/_interopDefault(AnthropicOriginal);
31
31
 
32
- var version = "7.9.1";
32
+ var version = "7.9.3";
33
33
 
34
34
  // Type guards for safer type checking
35
35
  const isString = value => {
@@ -248,6 +248,13 @@ const sanitizeLangChain = data => {
248
248
  return processMessages(data, sanitizeLangChainImage);
249
249
  };
250
250
 
251
+ const TOKEN_PROPERTY_KEYS = new Set(['$ai_input_tokens', '$ai_output_tokens', '$ai_cache_read_input_tokens', '$ai_cache_creation_input_tokens', '$ai_total_tokens', '$ai_reasoning_tokens']);
252
+ function getTokensSource(posthogProperties) {
253
+ if (posthogProperties && Object.keys(posthogProperties).some(key => TOKEN_PROPERTY_KEYS.has(key))) {
254
+ return 'passthrough';
255
+ }
256
+ return 'sdk';
257
+ }
251
258
  // limit large outputs by truncating to 200kb (approx 200k bytes)
252
259
  const MAX_OUTPUT_SIZE = 200000;
253
260
  const STRING_FORMAT = 'utf8';
@@ -827,6 +834,7 @@ const sendEventToPosthog = async ({
827
834
  $ai_trace_id: traceId,
828
835
  $ai_base_url: baseURL,
829
836
  ...params.posthogProperties,
837
+ $ai_tokens_source: getTokensSource(params.posthogProperties),
830
838
  ...(distinctId ? {} : {
831
839
  $process_person_profile: false
832
840
  }),
@@ -4107,15 +4115,6 @@ function calculateGoogleWebSearchCount(response) {
4107
4115
  return hasGrounding ? 1 : 0;
4108
4116
  }
4109
4117
 
4110
- //#region rolldown:runtime
4111
- var __defProp = Object.defineProperty;
4112
- var __export = (target, all) => {
4113
- for (var name in all) __defProp(target, name, {
4114
- get: all[name],
4115
- enumerable: true
4116
- });
4117
- };
4118
-
4119
4118
  function getDefaultExportFromCjs (x) {
4120
4119
  return x && x.__esModule && Object.prototype.hasOwnProperty.call(x, 'default') ? x['default'] : x;
4121
4120
  }
@@ -4359,12 +4358,6 @@ function escapeIfNeeded(value, pathSet = /* @__PURE__ */ new WeakSet()) {
4359
4358
  return value;
4360
4359
  }
4361
4360
 
4362
- //#region src/load/serializable.ts
4363
- var serializable_exports = {};
4364
- __export(serializable_exports, {
4365
- Serializable: () => Serializable,
4366
- get_lc_unique_name: () => get_lc_unique_name
4367
- });
4368
4361
  function shallowCopy(obj) {
4369
4362
  return Array.isArray(obj) ? [...obj] : { ...obj };
4370
4363
  }
@@ -4392,8 +4385,7 @@ function replaceSecrets(root, secretsMap) {
4392
4385
  */
4393
4386
  function get_lc_unique_name(serializableClass) {
4394
4387
  const parentClass = Object.getPrototypeOf(serializableClass);
4395
- const lcNameIsSubclassed = typeof serializableClass.lc_name === "function" && (typeof parentClass.lc_name !== "function" || serializableClass.lc_name() !== parentClass.lc_name());
4396
- if (lcNameIsSubclassed) return serializableClass.lc_name();
4388
+ if (typeof serializableClass.lc_name === "function" && (typeof parentClass.lc_name !== "function" || serializableClass.lc_name() !== parentClass.lc_name())) return serializableClass.lc_name();
4397
4389
  else return serializableClass.name;
4398
4390
  }
4399
4391
  var Serializable = class Serializable {
@@ -4419,34 +4411,26 @@ var Serializable = class Serializable {
4419
4411
  * Keys are paths to the secret in constructor args, e.g. "foo.bar.baz".
4420
4412
  * Values are the secret ids, which will be used when deserializing.
4421
4413
  */
4422
- get lc_secrets() {
4423
- return void 0;
4424
- }
4414
+ get lc_secrets() {}
4425
4415
  /**
4426
4416
  * A map of additional attributes to merge with constructor args.
4427
4417
  * Keys are the attribute names, e.g. "foo".
4428
4418
  * Values are the attribute values, which will be serialized.
4429
4419
  * These attributes need to be accepted by the constructor as arguments.
4430
4420
  */
4431
- get lc_attributes() {
4432
- return void 0;
4433
- }
4421
+ get lc_attributes() {}
4434
4422
  /**
4435
4423
  * A map of aliases for constructor args.
4436
4424
  * Keys are the attribute names, e.g. "foo".
4437
4425
  * Values are the alias that will replace the key in serialization.
4438
4426
  * This is used to eg. make argument names match Python.
4439
4427
  */
4440
- get lc_aliases() {
4441
- return void 0;
4442
- }
4428
+ get lc_aliases() {}
4443
4429
  /**
4444
4430
  * A manual list of keys that should be serialized.
4445
4431
  * If not overridden, all fields passed into the constructor will be serialized.
4446
4432
  */
4447
- get lc_serializable_keys() {
4448
- return void 0;
4449
- }
4433
+ get lc_serializable_keys() {}
4450
4434
  constructor(kwargs, ..._args) {
4451
4435
  if (this.lc_serializable_keys !== void 0) this.lc_kwargs = Object.fromEntries(Object.entries(kwargs || {}).filter(([key]) => this.lc_serializable_keys?.includes(key)));
4452
4436
  else this.lc_kwargs = kwargs ?? {};
@@ -4484,8 +4468,7 @@ var Serializable = class Serializable {
4484
4468
  const pathSet = /* @__PURE__ */ new WeakSet();
4485
4469
  pathSet.add(this);
4486
4470
  for (const [key, value] of Object.entries(kwargs)) escapedKwargs[key] = escapeIfNeeded(value, pathSet);
4487
- const kwargsWithSecrets = Object.keys(secrets).length ? replaceSecrets(escapedKwargs, secrets) : escapedKwargs;
4488
- const processedKwargs = mapKeys(kwargsWithSecrets, keyToJson, aliases);
4471
+ const processedKwargs = mapKeys(Object.keys(secrets).length ? replaceSecrets(escapedKwargs, secrets) : escapedKwargs, keyToJson, aliases);
4489
4472
  return {
4490
4473
  lc: 1,
4491
4474
  type: "constructor",
@@ -4502,70 +4485,23 @@ var Serializable = class Serializable {
4502
4485
  }
4503
4486
  };
4504
4487
 
4505
- //#region src/utils/env.ts
4506
- var env_exports = {};
4507
- __export(env_exports, {
4508
- getEnv: () => getEnv,
4509
- getEnvironmentVariable: () => getEnvironmentVariable,
4510
- getRuntimeEnvironment: () => getRuntimeEnvironment,
4511
- isBrowser: () => isBrowser,
4512
- isDeno: () => isDeno,
4513
- isJsDom: () => isJsDom,
4514
- isNode: () => isNode,
4515
- isWebWorker: () => isWebWorker
4516
- });
4517
- const isBrowser = () => typeof window !== "undefined" && typeof window.document !== "undefined";
4518
- const isWebWorker = () => typeof globalThis === "object" && globalThis.constructor && globalThis.constructor.name === "DedicatedWorkerGlobalScope";
4519
- const isJsDom = () => typeof window !== "undefined" && window.name === "nodejs" || typeof navigator !== "undefined" && navigator.userAgent.includes("jsdom");
4520
4488
  const isDeno = () => typeof Deno !== "undefined";
4521
- const isNode = () => typeof process !== "undefined" && typeof process.versions !== "undefined" && typeof process.versions.node !== "undefined" && !isDeno();
4522
- const getEnv = () => {
4523
- let env;
4524
- if (isBrowser()) env = "browser";
4525
- else if (isNode()) env = "node";
4526
- else if (isWebWorker()) env = "webworker";
4527
- else if (isJsDom()) env = "jsdom";
4528
- else if (isDeno()) env = "deno";
4529
- else env = "other";
4530
- return env;
4531
- };
4532
- let runtimeEnvironment;
4533
- function getRuntimeEnvironment() {
4534
- if (runtimeEnvironment === void 0) {
4535
- const env = getEnv();
4536
- runtimeEnvironment = {
4537
- library: "langchain-js",
4538
- runtime: env
4539
- };
4540
- }
4541
- return runtimeEnvironment;
4542
- }
4543
4489
  function getEnvironmentVariable(name) {
4544
4490
  try {
4545
4491
  if (typeof process !== "undefined") return process.env?.[name];
4546
4492
  else if (isDeno()) return Deno?.env.get(name);
4547
- else return void 0;
4493
+ else return;
4548
4494
  } catch {
4549
- return void 0;
4495
+ return;
4550
4496
  }
4551
4497
  }
4552
4498
 
4553
- //#region src/callbacks/base.ts
4554
- var base_exports = {};
4555
- __export(base_exports, {
4556
- BaseCallbackHandler: () => BaseCallbackHandler,
4557
- callbackHandlerPrefersStreaming: () => callbackHandlerPrefersStreaming,
4558
- isBaseCallbackHandler: () => isBaseCallbackHandler
4559
- });
4560
4499
  /**
4561
4500
  * Abstract class that provides a set of optional methods that can be
4562
4501
  * overridden in derived classes to handle various events during the
4563
4502
  * execution of a LangChain application.
4564
4503
  */
4565
4504
  var BaseCallbackHandlerMethodsClass = class {};
4566
- function callbackHandlerPrefersStreaming(x) {
4567
- return "lc_prefer_streaming" in x && x.lc_prefer_streaming;
4568
- }
4569
4505
  /**
4570
4506
  * Abstract base class for creating callback handlers in the LangChain
4571
4507
  * framework. It provides a set of optional methods that can be overridden
@@ -4581,18 +4517,10 @@ var BaseCallbackHandler = class extends BaseCallbackHandlerMethodsClass {
4581
4517
  this.name
4582
4518
  ];
4583
4519
  }
4584
- get lc_secrets() {
4585
- return void 0;
4586
- }
4587
- get lc_attributes() {
4588
- return void 0;
4589
- }
4590
- get lc_aliases() {
4591
- return void 0;
4592
- }
4593
- get lc_serializable_keys() {
4594
- return void 0;
4595
- }
4520
+ get lc_secrets() {}
4521
+ get lc_attributes() {}
4522
+ get lc_aliases() {}
4523
+ get lc_serializable_keys() {}
4596
4524
  /**
4597
4525
  * The name of the serializable. Override to provide an alias or
4598
4526
  * to preserve the serialized module name in minified environments.
@@ -4649,10 +4577,6 @@ var BaseCallbackHandler = class extends BaseCallbackHandlerMethodsClass {
4649
4577
  return new Handler();
4650
4578
  }
4651
4579
  };
4652
- const isBaseCallbackHandler = (x) => {
4653
- const callbackHandler = x;
4654
- return callbackHandler !== void 0 && typeof callbackHandler.copy === "function" && typeof callbackHandler.name === "string" && typeof callbackHandler.awaitHandlers === "boolean";
4655
- };
4656
4580
 
4657
4581
  class LangChainCallbackHandler extends BaseCallbackHandler {
4658
4582
  constructor(options) {