@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.
- package/dist/anthropic/index.cjs +9 -1
- package/dist/anthropic/index.cjs.map +1 -1
- package/dist/anthropic/index.mjs +9 -1
- package/dist/anthropic/index.mjs.map +1 -1
- package/dist/gemini/index.cjs +10 -1
- package/dist/gemini/index.cjs.map +1 -1
- package/dist/gemini/index.mjs +10 -1
- package/dist/gemini/index.mjs.map +1 -1
- package/dist/index.cjs +21 -97
- package/dist/index.cjs.map +1 -1
- package/dist/index.mjs +21 -97
- package/dist/index.mjs.map +1 -1
- package/dist/langchain/index.cjs +13 -97
- package/dist/langchain/index.cjs.map +1 -1
- package/dist/langchain/index.mjs +13 -97
- package/dist/langchain/index.mjs.map +1 -1
- package/dist/openai/index.cjs +10 -1
- package/dist/openai/index.cjs.map +1 -1
- package/dist/openai/index.mjs +10 -1
- package/dist/openai/index.mjs.map +1 -1
- package/dist/otel/index.cjs +10 -1
- package/dist/otel/index.cjs.map +1 -1
- package/dist/otel/index.mjs +10 -1
- package/dist/otel/index.mjs.map +1 -1
- package/dist/vercel/index.cjs +10 -1
- package/dist/vercel/index.cjs.map +1 -1
- package/dist/vercel/index.mjs +10 -1
- package/dist/vercel/index.mjs.map +1 -1
- package/package.json +3 -3
|
@@ -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.
|
|
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
|
-
|
|
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
|
|
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
|
|
4493
|
+
else return;
|
|
4548
4494
|
} catch {
|
|
4549
|
-
return
|
|
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
|
-
|
|
4586
|
-
}
|
|
4587
|
-
get
|
|
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) {
|