@posthog/ai 8.4.0 → 8.4.2
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 +2 -2
- package/dist/anthropic/index.cjs.map +1 -1
- package/dist/anthropic/index.mjs +2 -2
- package/dist/anthropic/index.mjs.map +1 -1
- package/dist/gemini/index.cjs +2 -2
- package/dist/gemini/index.cjs.map +1 -1
- package/dist/gemini/index.mjs +2 -2
- package/dist/gemini/index.mjs.map +1 -1
- package/dist/index.cjs +2 -2
- package/dist/index.cjs.map +1 -1
- package/dist/index.mjs +2 -2
- package/dist/index.mjs.map +1 -1
- package/dist/langchain/index.cjs +4 -4
- package/dist/langchain/index.cjs.map +1 -1
- package/dist/langchain/index.mjs +4 -4
- package/dist/langchain/index.mjs.map +1 -1
- package/dist/openai/index.cjs +5 -2
- package/dist/openai/index.cjs.map +1 -1
- package/dist/openai/index.mjs +5 -2
- package/dist/openai/index.mjs.map +1 -1
- package/dist/openai-agents/index.cjs +1 -1
- package/dist/openai-agents/index.cjs.map +1 -1
- package/dist/openai-agents/index.mjs +1 -1
- package/dist/openai-agents/index.mjs.map +1 -1
- package/dist/vercel/index.cjs +2 -2
- package/dist/vercel/index.cjs.map +1 -1
- package/dist/vercel/index.mjs +2 -2
- package/dist/vercel/index.mjs.map +1 -1
- package/package.json +12 -12
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","sources":["../../src/sanitization/base64_recognizer.ts","../../src/sanitization/media_type_context.ts","../../src/sanitization/binary_content_redactor.ts","../../src/sanitization.ts","../../src/utils.ts","../../src/serializeError.ts","../../src/gatewayWarning.ts","../../src/langchain/callbacks.ts"],"sourcesContent":["const DATA_URL_PREFIX_RE = /^data:([^;,\\s]+)(?:;[^;,\\s]+)*;base64,/i\nconst BASE64_ALPHABET_RE = /^[A-Za-z0-9+/_=-]+$/\n\nexport type Base64Recognition = { kind: 'data-url'; mediaType: string } | { kind: 'raw' } | { kind: 'none' }\n\nexport class Base64Recognizer {\n recognize(value: string, minLength: number): Base64Recognition {\n const dataUrl = DATA_URL_PREFIX_RE.exec(value)\n if (dataUrl) return { kind: 'data-url', mediaType: dataUrl[1] }\n\n if (value.length < minLength) return { kind: 'none' }\n\n const confidencePrefix = value.slice(0, minLength)\n if (BASE64_ALPHABET_RE.test(confidencePrefix)) {\n return { kind: 'raw' }\n } else {\n return { kind: 'none' }\n }\n }\n}\n","const MIME_HINT_KEYS = ['mediaType', 'media_type', 'mimeType', 'mime_type'] as const\n\nconst STRONG_CONTEXT_KEYS = new Set([\n 'data',\n 'file_data',\n 'fileData',\n 'image_url',\n 'imageUrl',\n 'video_url',\n 'videoUrl',\n 'audio',\n 'audio_data',\n 'audioData',\n 'inline_data',\n 'inlineData',\n 'source',\n 'result',\n])\n\nconst STRONG_CONTEXT_TYPES = new Set([\n 'image',\n 'image_url',\n 'input_image',\n 'audio',\n 'input_audio',\n 'video',\n 'video_url',\n 'file',\n 'input_file',\n 'document',\n 'media',\n 'file-data',\n])\n\nconst FILE_FAMILY_TYPES = new Set(['file', 'input_file', 'document', 'media', 'file-data'])\n\nconst KNOWN_AUDIO_FORMATS = new Set(['wav', 'mp3', 'ogg', 'flac', 'm4a', 'aac', 'webm'])\n\nexport class MediaTypeContext {\n static readonly EMPTY = new MediaTypeContext(undefined, undefined)\n\n constructor(\n private readonly parent: Record<string, unknown> | undefined,\n private readonly key: string | undefined\n ) {}\n\n inferMediaType(): string | undefined {\n return (\n this.inferFromSiblingMime() ?? this.inferFromSiblingFormat() ?? this.inferFromParentType() ?? this.inferFromKey()\n )\n }\n\n inferFromSiblingMime(): string | undefined {\n if (!this.parent) return undefined\n for (const hint of MIME_HINT_KEYS) {\n const v = this.parent[hint]\n if (typeof v === 'string') return v\n }\n return undefined\n }\n\n inferFromSiblingFormat(): string | undefined {\n if (!this.parent) return undefined\n const fmt = this.parent.format\n if (typeof fmt === 'string' && KNOWN_AUDIO_FORMATS.has(fmt.toLowerCase())) {\n return `audio/${fmt.toLowerCase()}`\n }\n return undefined\n }\n\n inferFromParentType(): string | undefined {\n if (!this.parent) return undefined\n const t = this.parent.type\n if (typeof t !== 'string') return undefined\n if (t === 'image' || t === 'image_url' || t === 'input_image') return 'image'\n if (t === 'audio' || t === 'input_audio') return 'audio'\n if (t === 'video' || t === 'video_url') return 'video'\n if (FILE_FAMILY_TYPES.has(t)) return 'application/octet-stream'\n return undefined\n }\n\n inferFromKey(): string | undefined {\n if (!this.key) return undefined\n const key = this.key.toLowerCase()\n if (key.includes('audio')) return 'audio'\n if (key.includes('video')) return 'video'\n if (key.includes('image')) return 'image'\n if (key.includes('file') || key.includes('document')) return 'application/octet-stream'\n return undefined\n }\n\n signalsBinary(): boolean {\n if (this.parent) {\n for (const hint of MIME_HINT_KEYS) {\n if (typeof this.parent[hint] === 'string') return true\n }\n const fmt = this.parent.format\n if (typeof fmt === 'string' && KNOWN_AUDIO_FORMATS.has(fmt.toLowerCase())) return true\n const t = this.parent.type\n if (typeof t === 'string' && STRONG_CONTEXT_TYPES.has(t)) return true\n }\n if (this.key && STRONG_CONTEXT_KEYS.has(this.key)) return true\n return false\n }\n}\n","import { Base64Recognizer } from './base64_recognizer'\nimport { MediaTypeContext } from './media_type_context'\n\nconst STRONG_CONTEXT_MIN_LENGTH = 64\nconst WEAK_CONTEXT_MIN_LENGTH = 1024\n\nexport class BinaryContentRedactor {\n private visited: WeakSet<object> = new WeakSet()\n\n constructor(private readonly recognizer: Base64Recognizer = new Base64Recognizer()) {}\n\n redact<T>(value: T): T\n redact(value: unknown): unknown {\n if (this.isMultimodalEnabled()) return value\n this.visited = new WeakSet()\n return this.walk(value, MediaTypeContext.EMPTY)\n }\n\n private walk(value: unknown, ctx: MediaTypeContext): unknown {\n if (value === null || value === undefined) return value\n if (typeof value === 'string') return this.redactString(value, ctx)\n if (typeof value !== 'object') return value\n\n // Buffer extends Uint8Array, so this branch catches both.\n if (typeof Uint8Array !== 'undefined' && value instanceof Uint8Array) {\n return this.placeholderFor(ctx.inferMediaType())\n }\n\n if (this.visited.has(value)) return null\n this.visited.add(value)\n\n if (Array.isArray(value)) {\n return value.map((item) => this.walk(item, ctx))\n }\n\n const obj = value as Record<string, unknown>\n const out: Record<string, unknown> = {}\n for (const k of Object.keys(obj)) {\n out[k] = this.walk(obj[k], new MediaTypeContext(obj, k))\n }\n return out\n }\n\n private redactString(value: string, ctx: MediaTypeContext): string {\n const minLength = ctx.signalsBinary() ? STRONG_CONTEXT_MIN_LENGTH : WEAK_CONTEXT_MIN_LENGTH\n const recognition = this.recognizer.recognize(value, minLength)\n switch (recognition.kind) {\n case 'data-url':\n return this.placeholderFor(recognition.mediaType)\n case 'raw':\n return this.placeholderFor(ctx.inferMediaType())\n case 'none':\n return value\n }\n }\n\n private placeholderFor(mediaType?: string): string {\n if (!mediaType) return '[base64 redacted]'\n if (mediaType === 'application/octet-stream') return '[base64 file redacted]'\n return `[base64 ${mediaType} redacted]`\n }\n\n private isMultimodalEnabled(): boolean {\n const val = process.env._INTERNAL_LLMA_MULTIMODAL || ''\n return val.toLowerCase() === 'true' || val === '1' || val.toLowerCase() === 'yes'\n }\n}\n","import { BinaryContentRedactor } from './sanitization/binary_content_redactor'\n\nconst redactor = new BinaryContentRedactor()\n\nexport function redactBase64DataUrl(str: string): string\nexport function redactBase64DataUrl(str: unknown): unknown\nexport function redactBase64DataUrl(str: unknown): unknown {\n return redactor.redact(str)\n}\n\nexport const sanitizeOpenAI = (data: unknown): unknown => redactor.redact(data)\nexport const sanitizeOpenAIResponse = (data: unknown): unknown => redactor.redact(data)\nexport const sanitizeAnthropic = (data: unknown): unknown => redactor.redact(data)\nexport const sanitizeGemini = (data: unknown): unknown => redactor.redact(data)\nexport const sanitizeLangChain = (data: unknown): unknown => redactor.redact(data)\n","import { PostHog } from 'posthog-node'\nimport type OpenAIOrignal from 'openai'\nimport type AnthropicOriginal from '@anthropic-ai/sdk'\nimport type { ResponseCreateParamsWithTools } from 'openai/lib/ResponsesParser'\nimport type {\n FormattedMessage,\n FormattedContent,\n FormattedAudioContent,\n FormattedImageContent,\n FormattedDocumentContent,\n} from './types'\nimport { v4 as uuidv4 } from 'uuid'\nimport { isString } from './typeGuards'\nimport { redactBase64DataUrl } from './sanitization'\n\ntype ChatCompletionCreateParamsBase = OpenAIOrignal.Chat.Completions.ChatCompletionCreateParams\ntype MessageCreateParams = AnthropicOriginal.Messages.MessageCreateParams\ntype ResponseCreateParams = OpenAIOrignal.Responses.ResponseCreateParams\ntype EmbeddingCreateParams = OpenAIOrignal.EmbeddingCreateParams\ntype TranscriptionCreateParams = OpenAIOrignal.Audio.Transcriptions.TranscriptionCreateParams\n\nconst TOKEN_PROPERTY_KEYS = new Set([\n '$ai_input_tokens',\n '$ai_output_tokens',\n '$ai_cache_read_input_tokens',\n '$ai_cache_creation_input_tokens',\n '$ai_total_tokens',\n '$ai_reasoning_tokens',\n])\n\nexport function getTokensSource(posthogProperties?: Record<string, unknown>): string {\n if (posthogProperties && Object.keys(posthogProperties).some((key) => TOKEN_PROPERTY_KEYS.has(key))) {\n return 'passthrough'\n }\n return 'sdk'\n}\n\n// limit large outputs by truncating to 200kb (approx 200k bytes)\nexport const MAX_OUTPUT_SIZE = 200000\nconst STRING_FORMAT = 'utf8'\n\n// Reused across calls to avoid per-invocation allocation; truncate() runs\n// hundreds of times for prompts with many parts.\nconst sharedTextEncoder = new TextEncoder()\nconst sharedTextDecoder = new TextDecoder(STRING_FORMAT, { fatal: false })\n\nexport const utf8ByteLength = (str: string): number => sharedTextEncoder.encode(str).byteLength\n\n/**\n * Safely converts content to a string, preserving structure for objects/arrays.\n * - If content is already a string, returns it as-is\n * - If content is an object or array, stringifies it with JSON.stringify to preserve structure\n * - Otherwise, converts to string with String()\n *\n * This prevents the \"[object Object]\" bug when objects are naively converted to strings.\n *\n * @param content - The content to convert to a string\n * @returns A string representation that preserves structure for complex types\n */\nexport function toContentString(content: unknown): string {\n if (typeof content === 'string') {\n return content\n }\n if (content !== undefined && content !== null && typeof content === 'object') {\n try {\n return JSON.stringify(content)\n } catch {\n // Fallback for circular refs, BigInt, or objects with throwing toJSON\n return String(content)\n }\n }\n return String(content)\n}\n\nexport interface MonitoringEventPropertiesWithDefaults {\n distinctId?: string\n traceId: string\n properties?: Record<string, any>\n privacyMode: boolean\n groups?: Record<string, any>\n modelOverride?: string\n providerOverride?: string\n costOverride?: CostOverride\n captureImmediate?: boolean\n}\n\nexport type MonitoringEventProperties = Partial<MonitoringEventPropertiesWithDefaults>\n\nexport type MonitoringParams = {\n [K in keyof MonitoringEventProperties as `posthog${Capitalize<string & K>}`]: MonitoringEventProperties[K]\n}\n\nexport interface CostOverride {\n inputCost: number\n outputCost: number\n}\n\nexport const getModelParams = (\n params:\n | ((\n | ChatCompletionCreateParamsBase\n | MessageCreateParams\n | ResponseCreateParams\n | ResponseCreateParamsWithTools\n | EmbeddingCreateParams\n | TranscriptionCreateParams\n ) &\n MonitoringParams)\n | null\n): Record<string, any> => {\n if (!params) {\n return {}\n }\n const modelParams: Record<string, any> = {}\n const paramKeys = [\n 'temperature',\n 'max_tokens',\n 'max_completion_tokens',\n 'top_p',\n 'frequency_penalty',\n 'presence_penalty',\n 'n',\n 'stop',\n 'stream',\n 'streaming',\n 'language',\n 'response_format',\n 'timestamp_granularities',\n ] as const\n\n for (const key of paramKeys) {\n if (key in params && (params as any)[key] !== undefined) {\n modelParams[key] = (params as any)[key]\n }\n }\n return modelParams\n}\n\n/**\n * Helper to format responses (non-streaming) for consumption\n */\nexport const formatResponse = (response: any, provider: string): FormattedMessage[] => {\n if (!response) {\n return []\n }\n if (provider === 'anthropic') {\n return formatResponseAnthropic(response)\n } else if (provider === 'openai') {\n return formatResponseOpenAI(response)\n } else if (provider === 'gemini') {\n return formatResponseGemini(response)\n }\n return []\n}\n\nexport const formatResponseAnthropic = (response: any): FormattedMessage[] => {\n const output: FormattedMessage[] = []\n const content: FormattedContent = []\n\n for (const choice of response.content ?? []) {\n if (choice?.type === 'text' && choice?.text) {\n content.push({ type: 'text', text: choice.text })\n } else if (choice?.type === 'tool_use' && choice?.name && choice?.id) {\n content.push({\n type: 'function',\n id: choice.id,\n function: {\n name: choice.name,\n arguments: choice.input || {},\n },\n })\n }\n }\n\n if (content.length > 0) {\n output.push({\n role: 'assistant',\n content,\n })\n }\n\n return output\n}\n\nexport const formatResponseOpenAI = (response: any): FormattedMessage[] => {\n const output: FormattedMessage[] = []\n\n if (response.choices) {\n for (const choice of response.choices) {\n const content: FormattedContent = []\n let role = 'assistant'\n\n if (choice.message) {\n if (choice.message.role) {\n role = choice.message.role\n }\n\n if (choice.message.content) {\n content.push({ type: 'text', text: choice.message.content })\n }\n\n if (choice.message.tool_calls) {\n for (const toolCall of choice.message.tool_calls) {\n content.push({\n type: 'function',\n id: toolCall.id,\n function: {\n name: toolCall.function.name,\n arguments: toolCall.function.arguments,\n },\n })\n }\n }\n\n // Handle audio output (gpt-4o-audio-preview)\n if (choice.message.audio) {\n content.push({\n type: 'audio',\n ...choice.message.audio,\n })\n }\n }\n\n if (content.length > 0) {\n output.push({\n role,\n content,\n })\n }\n }\n }\n\n // Handle Responses API format\n if (response.output) {\n const content: FormattedContent = []\n let role = 'assistant'\n\n for (const item of response.output) {\n if (item.type === 'message') {\n role = item.role\n\n if (item.content && Array.isArray(item.content)) {\n for (const contentItem of item.content) {\n if (contentItem.type === 'output_text' && contentItem.text) {\n content.push({ type: 'text', text: contentItem.text })\n } else if (contentItem.text) {\n content.push({ type: 'text', text: contentItem.text })\n } else if (contentItem.type === 'input_image' && contentItem.image_url) {\n content.push({\n type: 'image',\n image: contentItem.image_url,\n })\n }\n }\n } else if (item.content) {\n content.push({ type: 'text', text: String(item.content) })\n }\n } else if (item.type === 'function_call') {\n content.push({\n type: 'function',\n id: item.call_id || item.id || '',\n function: {\n name: item.name,\n arguments: item.arguments || {},\n },\n })\n }\n }\n\n if (content.length > 0) {\n output.push({\n role,\n content,\n })\n }\n }\n\n return output\n}\n\nexport const buildInlineDataBlock = (\n mimeType: string,\n data: string\n): FormattedAudioContent | FormattedImageContent | FormattedDocumentContent => {\n if (mimeType.startsWith('audio/')) {\n return { type: 'audio', mime_type: mimeType, data }\n }\n if (mimeType.startsWith('image/')) {\n return { type: 'image', inline_data: { mime_type: mimeType, data } }\n }\n return { type: 'document', inline_data: { mime_type: mimeType, data } }\n}\n\nexport const formatResponseGemini = (response: any): FormattedMessage[] => {\n const output: FormattedMessage[] = []\n\n if (response.candidates && Array.isArray(response.candidates)) {\n for (const candidate of response.candidates) {\n if (candidate.content && candidate.content.parts) {\n const content: FormattedContent = []\n\n for (const part of candidate.content.parts) {\n if (part.text) {\n content.push({ type: 'text', text: part.text })\n } else if (part.functionCall) {\n content.push({\n type: 'function',\n function: {\n name: part.functionCall.name,\n arguments: part.functionCall.args,\n },\n })\n } else if (part.inlineData) {\n // Handle inline data (images, audio, documents)\n const mimeType = part.inlineData.mimeType || part.inlineData.mime_type || 'application/octet-stream'\n let data = part.inlineData.data\n\n // Handle binary data (Uint8Array/Buffer -> base64)\n if (data instanceof Uint8Array) {\n if (typeof Buffer !== 'undefined') {\n data = Buffer.from(data).toString('base64')\n } else {\n let binary = ''\n for (let i = 0; i < data.length; i++) {\n binary += String.fromCharCode(data[i])\n }\n data = btoa(binary)\n }\n }\n\n // Sanitize base64 data for images and other large inline data\n data = redactBase64DataUrl(data)\n\n content.push(buildInlineDataBlock(mimeType, data))\n }\n }\n\n if (content.length > 0) {\n output.push({\n role: 'assistant',\n content,\n })\n }\n } else if (candidate.text) {\n output.push({\n role: 'assistant',\n content: [{ type: 'text', text: candidate.text }],\n })\n }\n }\n } else if (response.text) {\n output.push({\n role: 'assistant',\n content: [{ type: 'text', text: response.text }],\n })\n }\n\n return output\n}\n\nexport const mergeSystemPrompt = (params: MessageCreateParams & MonitoringParams, provider: string): any => {\n if (provider == 'anthropic') {\n const messages = params.messages || []\n if (!(params as any).system) {\n return messages\n }\n const systemMessage = (params as any).system\n return [{ role: 'system', content: systemMessage }, ...messages]\n }\n return params.messages\n}\n\nexport const withPrivacyMode = (client: PostHog, privacyMode: boolean, input: any): any => {\n return (client as any).privacy_mode || privacyMode ? null : input\n}\n\nfunction toSafeString(input: unknown): string {\n if (input === undefined || input === null) {\n return ''\n }\n if (typeof input === 'string') {\n return input\n }\n try {\n return JSON.stringify(input)\n } catch {\n console.warn('Failed to stringify input', input)\n return ''\n }\n}\n\nexport const truncate = (input: unknown): string => {\n const str = toSafeString(input)\n if (str === '') {\n return ''\n }\n\n // Check if we need to truncate and ensure STRING_FORMAT is respected\n const buffer = sharedTextEncoder.encode(str)\n if (buffer.length <= MAX_OUTPUT_SIZE) {\n // Ensure STRING_FORMAT is respected\n return sharedTextDecoder.decode(buffer)\n }\n\n // Truncate the buffer and ensure a valid string is returned.\n // fatal: false means we get U+FFFD at the end if truncation broke the encoding.\n const truncatedBuffer = buffer.slice(0, MAX_OUTPUT_SIZE)\n let truncatedStr = sharedTextDecoder.decode(truncatedBuffer)\n if (truncatedStr.endsWith('\\uFFFD')) {\n truncatedStr = truncatedStr.slice(0, -1)\n }\n return `${truncatedStr}... [truncated]`\n}\n\n/**\n * Calculate web search count from raw API response.\n *\n * Uses a two-tier detection strategy:\n * Priority 1 (Exact Count): Count actual web search calls when available\n * Priority 2 (Binary Detection): Return 1 if web search indicators are present, 0 otherwise\n *\n * @param result - Raw API response from any provider (OpenAI, Perplexity, OpenRouter, Gemini, etc.)\n * @returns Number of web searches performed (exact count or binary 1/0)\n */\nexport function calculateWebSearchCount(result: unknown): number {\n if (!result || typeof result !== 'object') {\n return 0\n }\n\n // Priority 1: Exact Count\n // Check for OpenAI Responses API web_search_call items\n if ('output' in result && Array.isArray(result.output)) {\n let count = 0\n\n for (const item of result.output) {\n if (typeof item === 'object' && item !== null && 'type' in item && item.type === 'web_search_call') {\n count++\n }\n }\n\n if (count > 0) {\n return count\n }\n }\n\n // Priority 2: Binary Detection (1 or 0)\n\n // Check for citations at root level (Perplexity)\n if ('citations' in result && Array.isArray(result.citations) && result.citations.length > 0) {\n return 1\n }\n\n // Check for search_results at root level (Perplexity via OpenRouter)\n if ('search_results' in result && Array.isArray(result.search_results) && result.search_results.length > 0) {\n return 1\n }\n\n // Check for usage.search_context_size (Perplexity via OpenRouter)\n if ('usage' in result && typeof result.usage === 'object' && result.usage !== null) {\n if ('search_context_size' in result.usage && result.usage.search_context_size) {\n return 1\n }\n }\n\n // Check for annotations with url_citation in choices[].message or choices[].delta (OpenAI/Perplexity)\n if ('choices' in result && Array.isArray(result.choices)) {\n for (const choice of result.choices) {\n if (typeof choice === 'object' && choice !== null) {\n // Check both message (non-streaming) and delta (streaming) for annotations\n const content = ('message' in choice ? choice.message : null) || ('delta' in choice ? choice.delta : null)\n\n if (typeof content === 'object' && content !== null && 'annotations' in content) {\n const annotations = content.annotations\n\n if (Array.isArray(annotations)) {\n const hasUrlCitation = annotations.some((ann: unknown) => {\n return typeof ann === 'object' && ann !== null && 'type' in ann && ann.type === 'url_citation'\n })\n\n if (hasUrlCitation) {\n return 1\n }\n }\n }\n }\n }\n }\n\n // Check for annotations in output[].content[] (OpenAI Responses API)\n if ('output' in result && Array.isArray(result.output)) {\n for (const item of result.output) {\n if (typeof item === 'object' && item !== null && 'content' in item) {\n const content = item.content\n\n if (Array.isArray(content)) {\n for (const contentItem of content) {\n if (typeof contentItem === 'object' && contentItem !== null && 'annotations' in contentItem) {\n const annotations = contentItem.annotations\n\n if (Array.isArray(annotations)) {\n const hasUrlCitation = annotations.some((ann: unknown) => {\n return typeof ann === 'object' && ann !== null && 'type' in ann && ann.type === 'url_citation'\n })\n\n if (hasUrlCitation) {\n return 1\n }\n }\n }\n }\n }\n }\n }\n }\n\n // Check for grounding_metadata (Gemini)\n if ('candidates' in result && Array.isArray(result.candidates)) {\n for (const candidate of result.candidates) {\n if (\n typeof candidate === 'object' &&\n candidate !== null &&\n 'grounding_metadata' in candidate &&\n candidate.grounding_metadata\n ) {\n return 1\n }\n }\n }\n\n return 0\n}\n\n/**\n * Extract available tool calls from the request parameters.\n * These are the tools provided to the LLM, not the tool calls in the response.\n */\nexport const extractAvailableToolCalls = (provider: string, params: any): unknown[] | null => {\n if (provider === 'anthropic') {\n if (params.tools) {\n return params.tools\n }\n\n return null\n } else if (provider === 'gemini') {\n if (params.config && params.config.tools) {\n return params.config.tools\n }\n\n return null\n } else if (provider === 'openai') {\n if (params.tools) {\n return params.tools\n }\n\n return null\n } else if (provider === 'vercel') {\n if (params.tools) {\n return params.tools\n }\n\n return null\n }\n\n return null\n}\n\nexport enum AIEvent {\n Generation = '$ai_generation',\n Embedding = '$ai_embedding',\n}\n\nexport function sanitizeValues(obj: any): any {\n if (obj === undefined || obj === null) {\n return obj\n }\n const jsonSafe = JSON.parse(JSON.stringify(obj))\n if (typeof jsonSafe === 'string') {\n // Sanitize lone surrogates by round-tripping through UTF-8\n return new TextDecoder().decode(new TextEncoder().encode(jsonSafe))\n } else if (Array.isArray(jsonSafe)) {\n return jsonSafe.map(sanitizeValues)\n } else if (jsonSafe && typeof jsonSafe === 'object') {\n return Object.fromEntries(Object.entries(jsonSafe).map(([k, v]) => [k, sanitizeValues(v)]))\n }\n return jsonSafe\n}\n\nconst POSTHOG_PARAMS_MAP: Record<keyof MonitoringParams, string> = {\n posthogDistinctId: 'distinctId',\n posthogTraceId: 'traceId',\n posthogProperties: 'properties',\n posthogPrivacyMode: 'privacyMode',\n posthogGroups: 'groups',\n posthogModelOverride: 'modelOverride',\n posthogProviderOverride: 'providerOverride',\n posthogCostOverride: 'costOverride',\n posthogCaptureImmediate: 'captureImmediate',\n}\n\nexport function extractPosthogParams<T>(body: T & MonitoringParams): {\n providerParams: T\n posthogParams: MonitoringEventPropertiesWithDefaults\n} {\n const providerParams: Record<string, unknown> = {}\n const posthogParams: Record<string, unknown> = {}\n\n for (const [key, value] of Object.entries(body)) {\n if (POSTHOG_PARAMS_MAP[key as keyof MonitoringParams]) {\n posthogParams[POSTHOG_PARAMS_MAP[key as keyof MonitoringParams]] = value\n } else if (key.startsWith('posthog')) {\n console.warn(`Unknown Posthog parameter ${key}`)\n } else {\n providerParams[key] = value\n }\n }\n\n return {\n providerParams: providerParams as T,\n posthogParams: addDefaults(posthogParams),\n }\n}\n\nfunction addDefaults(params: MonitoringEventProperties): MonitoringEventPropertiesWithDefaults {\n return {\n ...params,\n privacyMode: params.privacyMode ?? false,\n traceId: params.traceId ?? uuidv4(),\n }\n}\n\nexport function formatOpenAIResponsesInput(input: unknown, instructions?: string | null): FormattedMessage[] {\n const messages: FormattedMessage[] = []\n\n if (instructions) {\n messages.push({\n role: 'system',\n content: instructions,\n })\n }\n\n if (Array.isArray(input)) {\n for (const item of input) {\n if (typeof item === 'string') {\n messages.push({ role: 'user', content: item })\n } else if (item && typeof item === 'object') {\n const obj = item as Record<string, unknown>\n const role = isString(obj.role) ? obj.role : 'user'\n\n // Handle content properly - preserve structure for objects/arrays\n const content = obj.content ?? obj.text ?? item\n messages.push({ role, content: toContentString(content) })\n } else {\n messages.push({ role: 'user', content: toContentString(item) })\n }\n }\n } else if (typeof input === 'string') {\n messages.push({ role: 'user', content: input })\n } else if (input) {\n messages.push({ role: 'user', content: toContentString(input) })\n }\n\n return messages\n}\n","import { sanitizeValues } from './utils'\n\nconst DEFAULT_MAX_DEPTH = 3\nconst MAX_STACK_LINES = 20\n\nexport function serializeError(value: unknown, depth = DEFAULT_MAX_DEPTH): unknown {\n if (depth < 0 || value === null || typeof value !== 'object') {\n return value\n }\n if (value instanceof Error) {\n const out: Record<string, unknown> = {\n name: value.name,\n message: value.message,\n stack: truncateStack(value.stack),\n }\n for (const key of Object.keys(value)) {\n out[key] = serializeError((value as unknown as Record<string, unknown>)[key], depth - 1)\n }\n if (value.cause !== undefined) {\n out.cause = serializeError(value.cause, depth - 1)\n }\n return out\n }\n if (Array.isArray(value)) {\n return value.map((item) => serializeError(item, depth - 1))\n }\n return value\n}\n\nexport function stringifyError(error: unknown): string {\n try {\n return JSON.stringify(sanitizeValues(serializeError(error)))\n } catch {\n if (error instanceof Error) {\n return JSON.stringify({ name: error.name, message: error.message })\n }\n return JSON.stringify({ message: String(error) })\n }\n}\n\nfunction truncateStack(stack: string | undefined): string | undefined {\n if (!stack) {\n return stack\n }\n const lines = stack.split('\\n')\n if (lines.length <= MAX_STACK_LINES) {\n return stack\n }\n return [...lines.slice(0, MAX_STACK_LINES), '... (truncated)'].join('\\n')\n}\n","// Warn when a wrapper's base_url points at the PostHog AI Gateway: the gateway\n// emits its own $ai_generation, so each call would be captured (and, for billable\n// products, billed) twice. We only warn — the wrapper's event carries data the\n// gateway never sees (groups, custom properties, trace hierarchy).\n\n// Keep in sync with the gateway's deployed hosts (see services/llm-gateway in the\n// main repo). gateway.us.posthog.com is live today; the rest are listed ahead of\n// any traffic moving to them.\nexport const POSTHOG_AI_GATEWAY_HOSTS: readonly string[] = [\n 'gateway.posthog.com',\n 'gateway.us.posthog.com',\n 'gateway.eu.posthog.com',\n 'ai-gateway.us.posthog.com',\n 'ai-gateway.eu.posthog.com',\n]\n\n// Swap for the dedicated AI Gateway page once it ships.\nconst GATEWAY_DOCS_URL = 'https://posthog.com/docs/ai-observability'\n\nconst extractHost = (baseURL: string): string | undefined => {\n try {\n // Tolerate bare hosts that omit a scheme, e.g. \"gateway.us.posthog.com/v1\".\n const hasScheme = /^[a-z][a-z0-9+.-]*:\\/\\//i.test(baseURL)\n return new URL(hasScheme ? baseURL : `https://${baseURL}`).hostname.toLowerCase()\n } catch {\n return undefined\n }\n}\n\nexport const isPostHogAiGatewayUrl = (baseURL: string | undefined | null): boolean => {\n if (!baseURL) {\n return false\n }\n const host = extractHost(baseURL)\n return host !== undefined && POSTHOG_AI_GATEWAY_HOSTS.includes(host)\n}\n\n// Warns on every gateway call by design: the misconfiguration is impossible to\n// miss that way, and a doubled bill is worse than noisy logs.\nexport const warnIfPostHogAiGateway = (baseURL: string | undefined | null): void => {\n if (!isPostHogAiGatewayUrl(baseURL)) {\n return\n }\n console.warn(\n '[PostHog] The PostHog AI wrapper is pointed at the PostHog AI Gateway. ' +\n 'Both capture $ai_generation, so every call is double-counted and double-billed. ' +\n `Use one or the other — see ${GATEWAY_DOCS_URL}.`\n )\n}\n\n// OTel spans don't pass through captureAiGeneration, so detect the gateway from\n// the span's host/URL attributes instead. These follow the GenAI / HTTP semantic\n// conventions: `server.address` is a bare host, `url.full` a full URL, both of\n// which isPostHogAiGatewayUrl accepts.\nconst OTEL_GATEWAY_URL_ATTRIBUTES = ['server.address', 'url.full'] as const\n\nexport const warnIfPostHogAiGatewayOtelAttributes = (attributes: Record<string, unknown> | undefined): void => {\n if (!attributes) {\n return\n }\n for (const key of OTEL_GATEWAY_URL_ATTRIBUTES) {\n const value = attributes[key]\n if (typeof value === 'string' && isPostHogAiGatewayUrl(value)) {\n warnIfPostHogAiGateway(value)\n return\n }\n }\n}\n","import { PostHog } from 'posthog-node'\nimport { withPrivacyMode, getModelParams, toContentString } from '../utils'\nimport { BaseCallbackHandler } from '@langchain/core/callbacks/base'\nimport { version } from '../../package.json'\nimport type { Serialized } from '@langchain/core/load/serializable'\nimport type { ChainValues } from '@langchain/core/utils/types'\nimport type { LLMResult } from '@langchain/core/outputs'\nimport type { AgentAction, AgentFinish } from '@langchain/core/agents'\nimport type { DocumentInterface } from '@langchain/core/documents'\nimport { ToolCall } from '@langchain/core/messages/tool'\nimport { BaseMessage } from '@langchain/core/messages'\nimport { sanitizeLangChain } from '../sanitization'\nimport { stringifyError } from '../serializeError'\nimport { warnIfPostHogAiGateway } from '../gatewayWarning'\n\ninterface SpanMetadata {\n /** Name of the trace/span (e.g. chain name) */\n name: string\n /** Timestamp (in ms) when the run started */\n startTime: number\n /** Timestamp (in ms) when the run ended (if already finished) */\n endTime?: number\n /** The input state */\n input?: any\n}\n\ninterface GenerationMetadata extends SpanMetadata {\n /** Provider used (e.g. openai, anthropic) */\n provider?: string\n /** Model name used in the generation */\n model?: string\n /** The model parameters (temperature, max_tokens, etc.) */\n modelParams?: Record<string, any>\n /** The base URL—for example, the API base used */\n baseUrl?: string\n /** The tools used in the generation */\n tools?: Record<string, any>\n}\n\n/** A run may either be a Span or a Generation */\ntype RunMetadata = SpanMetadata | GenerationMetadata\n\n/** Storage for run metadata */\ntype RunMetadataStorage = { [runId: string]: RunMetadata }\n\nexport class LangChainCallbackHandler extends BaseCallbackHandler {\n public name = 'PosthogCallbackHandler'\n private client: PostHog\n private distinctId?: string | number\n private traceId?: string | number\n private properties: Record<string, any>\n private privacyMode: boolean\n private groups: Record<string, any>\n private debug: boolean\n\n private runs: RunMetadataStorage = {}\n private parentTree: { [runId: string]: string } = {}\n\n constructor(options: {\n client: PostHog\n distinctId?: string | number\n traceId?: string | number\n properties?: Record<string, any>\n privacyMode?: boolean\n groups?: Record<string, any>\n debug?: boolean\n }) {\n if (!options.client) {\n throw new Error('PostHog client is required')\n }\n super()\n this.client = options.client\n this.distinctId = options.distinctId\n this.traceId = options.traceId\n this.properties = options.properties || {}\n this.privacyMode = options.privacyMode || false\n this.groups = options.groups || {}\n this.debug = options.debug || false\n }\n\n // ===== CALLBACK METHODS =====\n\n public handleChainStart(\n chain: Serialized,\n inputs: ChainValues,\n runId: string,\n parentRunId?: string,\n tags?: string[],\n metadata?: Record<string, unknown>,\n _runType?: string,\n runName?: string\n ): void {\n this._logDebugEvent('on_chain_start', runId, parentRunId, { inputs, tags })\n this._setParentOfRun(runId, parentRunId)\n this._setTraceOrSpanMetadata(chain, inputs, runId, parentRunId, metadata, tags, runName)\n }\n\n public handleChainEnd(\n outputs: ChainValues,\n runId: string,\n parentRunId?: string,\n tags?: string[],\n _kwargs?: { inputs?: Record<string, unknown> }\n ): void {\n this._logAndPopTraceOrSpan('on_chain_end', runId, parentRunId, { outputs, tags }, outputs)\n }\n\n public handleChainError(\n error: Error,\n runId: string,\n parentRunId?: string,\n tags?: string[],\n _kwargs?: { inputs?: Record<string, unknown> }\n ): void {\n this._logAndPopTraceOrSpan('on_chain_error', runId, parentRunId, { error, tags }, error)\n }\n\n public handleChatModelStart(\n serialized: Serialized,\n messages: BaseMessage[][],\n runId: string,\n parentRunId?: string,\n extraParams?: Record<string, unknown>,\n tags?: string[],\n metadata?: Record<string, unknown>,\n runName?: string\n ): void {\n this._logDebugEvent('on_chat_model_start', runId, parentRunId, { messages, tags })\n this._setParentOfRun(runId, parentRunId)\n // Flatten the two-dimensional messages and convert each message to a plain object\n const input = messages.flat().map((m) => this._convertMessageToDict(m))\n this._setLLMMetadata(serialized, runId, input, metadata, extraParams, runName)\n }\n\n public handleLLMStart(\n serialized: Serialized,\n prompts: string[],\n runId: string,\n parentRunId?: string,\n extraParams?: Record<string, unknown>,\n tags?: string[],\n metadata?: Record<string, unknown>,\n runName?: string\n ): void {\n this._logDebugEvent('on_llm_start', runId, parentRunId, { prompts, tags })\n this._setParentOfRun(runId, parentRunId)\n this._setLLMMetadata(serialized, runId, prompts, metadata, extraParams, runName)\n }\n\n public handleLLMEnd(\n output: LLMResult,\n runId: string,\n parentRunId?: string,\n tags?: string[],\n _extraParams?: Record<string, unknown>\n ): void {\n this._logAndPopGeneration('on_llm_end', runId, parentRunId, { output, tags }, output)\n }\n\n public handleLLMError(\n err: Error,\n runId: string,\n parentRunId?: string,\n tags?: string[],\n _extraParams?: Record<string, unknown>\n ): void {\n this._logAndPopGeneration('on_llm_error', runId, parentRunId, { err, tags }, err)\n }\n\n public handleToolStart(\n tool: Serialized,\n input: string,\n runId: string,\n parentRunId?: string,\n tags?: string[],\n metadata?: Record<string, unknown>,\n runName?: string\n ): void {\n this._logAndSetTraceOrSpan(\n 'on_tool_start',\n tool,\n input,\n runId,\n parentRunId,\n { input, tags },\n tags,\n metadata,\n runName\n )\n }\n\n public handleToolEnd(output: any, runId: string, parentRunId?: string, tags?: string[]): void {\n this._logAndPopTraceOrSpan('on_tool_end', runId, parentRunId, { output, tags }, output)\n }\n\n public handleToolError(err: Error, runId: string, parentRunId?: string, tags?: string[]): void {\n this._logAndPopTraceOrSpan('on_tool_error', runId, parentRunId, { err, tags }, err)\n }\n\n public handleRetrieverStart(\n retriever: Serialized,\n query: string,\n runId: string,\n parentRunId?: string,\n tags?: string[],\n metadata?: Record<string, unknown>,\n name?: string\n ): void {\n this._logAndSetTraceOrSpan(\n 'on_retriever_start',\n retriever,\n query,\n runId,\n parentRunId,\n { query, tags },\n tags,\n metadata,\n name\n )\n }\n\n public handleRetrieverEnd(\n documents: DocumentInterface[],\n runId: string,\n parentRunId?: string,\n tags?: string[]\n ): void {\n this._logAndPopTraceOrSpan('on_retriever_end', runId, parentRunId, { documents, tags }, documents)\n }\n\n public handleRetrieverError(err: Error, runId: string, parentRunId?: string, tags?: string[]): void {\n this._logAndPopTraceOrSpan('on_retriever_error', runId, parentRunId, { err, tags }, err)\n }\n\n public handleAgentAction(action: AgentAction, runId: string, parentRunId?: string, tags?: string[]): void {\n this._logDebugEvent('on_agent_action', runId, parentRunId, { action, tags })\n this._setParentOfRun(runId, parentRunId)\n this._setTraceOrSpanMetadata(null, action, runId, parentRunId)\n }\n\n public handleAgentEnd(action: AgentFinish, runId: string, parentRunId?: string, tags?: string[]): void {\n this._logDebugEvent('on_agent_finish', runId, parentRunId, { action, tags })\n this._popRunAndCaptureTraceOrSpan(runId, parentRunId, action)\n }\n\n // ===== PRIVATE HELPERS =====\n\n private _logAndSetTraceOrSpan(\n eventName: string,\n serialized: Serialized,\n input: any,\n runId: string,\n parentRunId: string | undefined,\n debugPayload: Record<string, unknown>,\n tags?: string[],\n metadata?: Record<string, unknown>,\n runName?: string\n ): void {\n this._logDebugEvent(eventName, runId, parentRunId, debugPayload)\n this._setParentOfRun(runId, parentRunId)\n this._setTraceOrSpanMetadata(serialized, input, runId, parentRunId, metadata, tags, runName)\n }\n\n private _logAndPopTraceOrSpan(\n eventName: string,\n runId: string,\n parentRunId: string | undefined,\n debugPayload: Record<string, unknown>,\n result: any\n ): void {\n this._logDebugEvent(eventName, runId, parentRunId, debugPayload)\n this._popRunAndCaptureTraceOrSpan(runId, parentRunId, result)\n }\n\n private _logAndPopGeneration(\n eventName: string,\n runId: string,\n parentRunId: string | undefined,\n debugPayload: Record<string, unknown>,\n result: LLMResult | Error\n ): void {\n this._logDebugEvent(eventName, runId, parentRunId, debugPayload)\n this._popRunAndCaptureGeneration(runId, parentRunId, result)\n }\n\n private _setParentOfRun(runId: string, parentRunId?: string): void {\n if (parentRunId) {\n this.parentTree[runId] = parentRunId\n }\n }\n\n private _popParentOfRun(runId: string): void {\n delete this.parentTree[runId]\n }\n\n private _findRootRun(runId: string): string {\n let id = runId\n while (this.parentTree[id]) {\n id = this.parentTree[id]\n }\n return id\n }\n\n private _setTraceOrSpanMetadata(\n serialized: any,\n input: any,\n runId: string,\n parentRunId?: string,\n ...args: any[]\n ): void {\n // Use default names if not provided: if this is a top-level run, we mark it as a trace, otherwise as a span.\n const defaultName = parentRunId ? 'span' : 'trace'\n const runName = this._getLangchainRunName(serialized, ...args) || defaultName\n this.runs[runId] = {\n name: runName,\n input,\n startTime: Date.now(),\n } as SpanMetadata\n }\n\n private _setLLMMetadata(\n serialized: Serialized | null,\n runId: string,\n messages: any,\n metadata?: any,\n extraParams?: any,\n runName?: string\n ): void {\n const runNameFound = this._getLangchainRunName(serialized, { extraParams, runName }) || 'generation'\n const generation: GenerationMetadata = {\n name: runNameFound,\n input: sanitizeLangChain(messages),\n startTime: Date.now(),\n }\n if (extraParams) {\n generation.modelParams = getModelParams(extraParams.invocation_params)\n\n if (extraParams.invocation_params && extraParams.invocation_params.tools) {\n generation.tools = extraParams.invocation_params.tools\n }\n }\n if (metadata) {\n if (metadata.ls_model_name) {\n generation.model = metadata.ls_model_name\n }\n if (metadata.ls_provider) {\n generation.provider = metadata.ls_provider\n }\n }\n if (serialized && 'kwargs' in serialized && serialized.kwargs.openai_api_base) {\n generation.baseUrl = serialized.kwargs.openai_api_base\n }\n this.runs[runId] = generation\n }\n\n private _popRunMetadata(runId: string): RunMetadata | undefined {\n const endTime = Date.now()\n const run = this.runs[runId]\n if (!run) {\n console.warn(`No run metadata found for run ${runId}`)\n return undefined\n }\n run.endTime = endTime\n delete this.runs[runId]\n return run\n }\n\n private _getTraceId(runId: string): string {\n return this.traceId ? String(this.traceId) : this._findRootRun(runId)\n }\n\n private _getParentRunId(traceId: string, _runId: string, parentRunId?: string): string | undefined {\n // Replace the parent-run if not found in our stored parent tree.\n if (parentRunId && !this.parentTree[parentRunId]) {\n return traceId\n }\n return parentRunId\n }\n\n private _popRunAndCaptureTraceOrSpan(\n runId: string,\n parentRunId: string | undefined,\n outputs: ChainValues | DocumentInterface[] | AgentFinish | Error | any\n ): void {\n const traceId = this._getTraceId(runId)\n this._popParentOfRun(runId)\n const run = this._popRunMetadata(runId)\n if (!run) {\n return\n }\n if ('modelParams' in run) {\n console.warn(`Run ${runId} is a generation, but attempted to be captured as a trace/span.`)\n return\n }\n const actualParentRunId = this._getParentRunId(traceId, runId, parentRunId)\n this._captureTraceOrSpan(traceId, runId, run as SpanMetadata, outputs, actualParentRunId)\n }\n\n private _captureTraceOrSpan(\n traceId: string,\n runId: string,\n run: SpanMetadata,\n outputs: ChainValues | DocumentInterface[] | AgentFinish | Error | any,\n parentRunId?: string\n ): void {\n const eventName = parentRunId ? '$ai_span' : '$ai_trace'\n const latency = run.endTime ? (run.endTime - run.startTime) / 1000 : 0\n const eventProperties: Record<string, any> = {\n $ai_lib: 'posthog-ai',\n $ai_lib_version: version,\n $ai_trace_id: traceId,\n $ai_input_state: withPrivacyMode(this.client, this.privacyMode, run.input),\n $ai_latency: latency,\n $ai_span_name: run.name,\n $ai_span_id: runId,\n $ai_framework: 'langchain',\n }\n if (parentRunId) {\n eventProperties['$ai_parent_id'] = parentRunId\n }\n\n Object.assign(eventProperties, this.properties)\n if (!this.distinctId) {\n eventProperties['$process_person_profile'] = false\n }\n if (outputs instanceof Error) {\n eventProperties['$ai_error'] = stringifyError(outputs)\n eventProperties['$ai_is_error'] = true\n } else if (outputs !== undefined) {\n eventProperties['$ai_output_state'] = withPrivacyMode(this.client, this.privacyMode, outputs)\n }\n this.client.capture({\n distinctId: this.distinctId ? this.distinctId.toString() : runId,\n event: eventName,\n properties: eventProperties,\n groups: this.groups,\n })\n }\n\n private _popRunAndCaptureGeneration(\n runId: string,\n parentRunId: string | undefined,\n response: LLMResult | Error\n ): void {\n const traceId = this._getTraceId(runId)\n this._popParentOfRun(runId)\n const run = this._popRunMetadata(runId)\n if (!run || typeof run !== 'object' || !('modelParams' in run)) {\n console.warn(`Run ${runId} is not a generation, but attempted to be captured as such.`)\n return\n }\n const actualParentRunId = this._getParentRunId(traceId, runId, parentRunId)\n this._captureGeneration(traceId, runId, run as GenerationMetadata, response, actualParentRunId)\n }\n\n private _captureGeneration(\n traceId: string,\n runId: string,\n run: GenerationMetadata,\n output: LLMResult | Error,\n parentRunId?: string\n ): void {\n const latency = run.endTime ? (run.endTime - run.startTime) / 1000 : 0\n warnIfPostHogAiGateway(run.baseUrl)\n const eventProperties: Record<string, any> = {\n $ai_lib: 'posthog-ai',\n $ai_lib_version: version,\n $ai_trace_id: traceId,\n $ai_span_id: runId,\n $ai_span_name: run.name,\n $ai_parent_id: parentRunId,\n $ai_provider: run.provider,\n $ai_model: run.model,\n $ai_model_parameters: run.modelParams,\n $ai_input: withPrivacyMode(this.client, this.privacyMode, run.input),\n $ai_http_status: 200,\n $ai_latency: latency,\n $ai_base_url: run.baseUrl,\n $ai_framework: 'langchain',\n }\n\n if (run.tools) {\n eventProperties['$ai_tools'] = run.tools\n }\n\n if (output instanceof Error) {\n eventProperties['$ai_http_status'] = (output as any).status || 500\n eventProperties['$ai_error'] = stringifyError(output)\n eventProperties['$ai_is_error'] = true\n } else {\n // Handle token usage\n const [inputTokens, outputTokens, additionalTokenData] = this.parseUsage(output, run.provider, run.model)\n eventProperties['$ai_input_tokens'] = inputTokens\n eventProperties['$ai_output_tokens'] = outputTokens\n\n // Add additional token data to properties\n if (additionalTokenData.cacheReadInputTokens) {\n eventProperties['$ai_cache_read_input_tokens'] = additionalTokenData.cacheReadInputTokens\n }\n if (additionalTokenData.cacheWriteInputTokens) {\n eventProperties['$ai_cache_creation_input_tokens'] = additionalTokenData.cacheWriteInputTokens\n }\n if (additionalTokenData.reasoningTokens) {\n eventProperties['$ai_reasoning_tokens'] = additionalTokenData.reasoningTokens\n }\n if (additionalTokenData.webSearchCount !== undefined) {\n eventProperties['$ai_web_search_count'] = additionalTokenData.webSearchCount\n }\n\n // Extract stop reason from generation info\n const stopReason = this._extractStopReason(output)\n if (stopReason) {\n eventProperties['$ai_stop_reason'] = stopReason\n }\n\n // Handle generations/completions\n let completions\n if (output.generations && Array.isArray(output.generations)) {\n const lastGeneration = output.generations[output.generations.length - 1]\n if (Array.isArray(lastGeneration) && lastGeneration.length > 0) {\n // Check if this is a ChatGeneration by looking at the first item\n const isChatGeneration = 'message' in lastGeneration[0] && lastGeneration[0].message\n\n if (isChatGeneration) {\n // For ChatGeneration, convert messages to dict format\n completions = lastGeneration.map((gen: any) => {\n return this._convertMessageToDict(gen.message)\n })\n } else {\n // For non-ChatGeneration, extract raw response\n completions = lastGeneration.map((gen: any) => {\n return this._extractRawResponse(gen)\n })\n }\n }\n }\n\n if (completions) {\n eventProperties['$ai_output_choices'] = withPrivacyMode(this.client, this.privacyMode, completions)\n }\n }\n\n Object.assign(eventProperties, this.properties)\n if (!this.distinctId) {\n eventProperties['$process_person_profile'] = false\n }\n\n this.client.capture({\n distinctId: this.distinctId ? this.distinctId.toString() : traceId,\n event: '$ai_generation',\n properties: eventProperties,\n groups: this.groups,\n })\n }\n\n private _logDebugEvent(eventName: string, runId: string, parentRunId: string | undefined, extra: any): void {\n if (this.debug) {\n console.log(`Event: ${eventName}, runId: ${runId}, parentRunId: ${parentRunId}, extra:`, extra)\n }\n }\n\n private _getLangchainRunName(serialized: any, ...args: any): string | undefined {\n if (args && args.length > 0) {\n for (const arg of args) {\n if (arg && typeof arg === 'object' && 'name' in arg) {\n return arg.name\n } else if (arg && typeof arg === 'object' && 'runName' in arg) {\n return arg.runName\n }\n }\n }\n\n if (serialized && serialized.name) {\n return serialized.name\n }\n if (serialized && serialized.id) {\n return Array.isArray(serialized.id) ? serialized.id[serialized.id.length - 1] : serialized.id\n }\n return undefined\n }\n\n private _convertLcToolCallsToOai(toolCalls: ToolCall[]): Record<string, any>[] {\n return toolCalls.map((toolCall: ToolCall) => ({\n type: 'function',\n id: toolCall.id,\n function: {\n name: toolCall.name,\n arguments: JSON.stringify(toolCall.args),\n },\n }))\n }\n\n private _extractRawResponse(generation: any): any {\n // Extract the response from the last response of the LLM call\n // We return the text of the response if not empty\n if (generation.text != null && generation.text.trim() !== '') {\n return generation.text.trim()\n } else if (generation.message) {\n // Additional kwargs contains the response in case of tool usage\n return generation.message.additional_kwargs || generation.message.additionalKwargs || {}\n } else {\n // Not tool usage, some LLM responses can be simply empty\n return ''\n }\n }\n\n private _convertMessageToDict(message: any): Record<string, any> {\n let messageDict: Record<string, any> = {}\n\n const messageType: string = message.getType()\n\n switch (messageType) {\n case 'human':\n messageDict = { role: 'user', content: message.content }\n break\n case 'ai':\n messageDict = { role: 'assistant', content: message.content }\n\n if (message.tool_calls) {\n messageDict.tool_calls = this._convertLcToolCallsToOai(message.tool_calls)\n }\n\n break\n case 'system':\n messageDict = { role: 'system', content: message.content }\n break\n case 'tool':\n messageDict = { role: 'tool', content: message.content }\n break\n case 'function':\n messageDict = { role: 'function', content: message.content }\n break\n default:\n messageDict = { role: messageType, content: toContentString(message.content) }\n break\n }\n\n if (message.additional_kwargs) {\n messageDict = { ...messageDict, ...message.additional_kwargs }\n }\n\n // Sanitize the message content to redact base64 images\n return sanitizeLangChain(messageDict) as Record<string, any>\n }\n\n private _extractStopReason(output: LLMResult): string | undefined {\n if (!output.generations || !Array.isArray(output.generations)) {\n return undefined\n }\n const lastGeneration = output.generations[output.generations.length - 1]\n if (!Array.isArray(lastGeneration) || lastGeneration.length === 0) {\n return undefined\n }\n const gen = lastGeneration[0]\n\n // Check generationInfo for finish_reason (OpenAI format)\n if (gen.generationInfo?.finish_reason) {\n return String(gen.generationInfo.finish_reason)\n }\n\n // Check generationInfo for response_metadata.stop_reason (Anthropic format)\n if (gen.generationInfo?.response_metadata?.stop_reason) {\n return String(gen.generationInfo.response_metadata.stop_reason)\n }\n\n // Check message response_metadata for finish_reason (common LangChain format)\n if (gen.generationInfo?.response_metadata?.finish_reason) {\n return String(gen.generationInfo.response_metadata.finish_reason)\n }\n\n // Check for stop_reason directly in generationInfo\n if (gen.generationInfo?.stop_reason) {\n return String(gen.generationInfo.stop_reason)\n }\n\n return undefined\n }\n\n private _parseUsageModel(usage: any, provider?: string, model?: string): [number, number, Record<string, any>] {\n const conversionList: Array<[string, 'input' | 'output']> = [\n ['promptTokens', 'input'],\n ['completionTokens', 'output'],\n ['input_tokens', 'input'],\n ['output_tokens', 'output'],\n ['prompt_token_count', 'input'],\n ['candidates_token_count', 'output'],\n ['inputTokenCount', 'input'],\n ['outputTokenCount', 'output'],\n ['input_token_count', 'input'],\n ['generated_token_count', 'output'],\n ]\n\n const parsedUsage = conversionList.reduce(\n (acc: { input: number; output: number }, [modelKey, typeKey]) => {\n const value = usage[modelKey]\n if (value != null) {\n const finalCount = Array.isArray(value)\n ? value.reduce((sum: number, tokenCount: number) => sum + tokenCount, 0)\n : value\n acc[typeKey] = finalCount\n }\n return acc\n },\n { input: 0, output: 0 }\n )\n\n // Extract additional token details like cached tokens and reasoning tokens\n const additionalTokenData: Record<string, any> = {}\n\n // Check for cached tokens in various formats\n if (usage.prompt_tokens_details?.cached_tokens != null) {\n additionalTokenData.cacheReadInputTokens = usage.prompt_tokens_details.cached_tokens\n } else if (usage.input_token_details?.cache_read != null) {\n additionalTokenData.cacheReadInputTokens = usage.input_token_details.cache_read\n } else if (usage.cachedPromptTokens != null) {\n additionalTokenData.cacheReadInputTokens = usage.cachedPromptTokens\n } else if (usage.cache_read_input_tokens != null) {\n additionalTokenData.cacheReadInputTokens = usage.cache_read_input_tokens\n }\n\n // Check for cache write/creation tokens in various formats\n if (usage.cache_creation_input_tokens != null) {\n additionalTokenData.cacheWriteInputTokens = usage.cache_creation_input_tokens\n } else if (usage.input_token_details?.cache_creation != null) {\n additionalTokenData.cacheWriteInputTokens = usage.input_token_details.cache_creation\n }\n\n // Check for reasoning tokens in various formats\n if (usage.completion_tokens_details?.reasoning_tokens != null) {\n additionalTokenData.reasoningTokens = usage.completion_tokens_details.reasoning_tokens\n } else if (usage.output_token_details?.reasoning != null) {\n additionalTokenData.reasoningTokens = usage.output_token_details.reasoning\n } else if (usage.reasoningTokens != null) {\n additionalTokenData.reasoningTokens = usage.reasoningTokens\n }\n\n // Extract web search counts from various provider formats\n let webSearchCount: number | undefined\n\n // Priority 1: Exact Count\n // Check Anthropic format (server_tool_use.web_search_requests)\n if (usage.server_tool_use?.web_search_requests !== undefined) {\n webSearchCount = usage.server_tool_use.web_search_requests\n }\n // Priority 2: Binary Detection (1 or 0)\n // Check for citations array (Perplexity)\n else if (usage.citations && Array.isArray(usage.citations) && usage.citations.length > 0) {\n webSearchCount = 1\n }\n // Check for search_results array (Perplexity via OpenRouter)\n else if (usage.search_results && Array.isArray(usage.search_results) && usage.search_results.length > 0) {\n webSearchCount = 1\n }\n // Check for search_context_size (Perplexity via OpenRouter)\n else if (usage.search_context_size) {\n webSearchCount = 1\n }\n // Check for annotations with url_citation type\n else if (usage.annotations && Array.isArray(usage.annotations)) {\n const hasUrlCitation = usage.annotations.some((ann: unknown) => {\n return ann && typeof ann === 'object' && 'type' in ann && ann.type === 'url_citation'\n })\n\n if (hasUrlCitation) {\n webSearchCount = 1\n }\n }\n // Check Gemini format (grounding metadata - binary 0 or 1)\n else if (\n usage.grounding_metadata?.grounding_support !== undefined ||\n usage.grounding_metadata?.web_search_queries !== undefined\n ) {\n webSearchCount = 1\n }\n\n if (webSearchCount !== undefined) {\n additionalTokenData.webSearchCount = webSearchCount\n }\n\n // For Anthropic providers, LangChain reports input_tokens as the sum of all input tokens.\n // Our cost calculation expects them to be separate for Anthropic, so we subtract cache tokens.\n // Both cache_read and cache_write tokens should be subtracted since Anthropic's raw API\n // reports input_tokens as tokens NOT read from or used to create a cache.\n // For other providers (OpenAI, etc.), input_tokens already excludes cache tokens as expected.\n // Match logic consistent with plugin-server: exact match on provider OR substring match on model\n let isAnthropic = false\n if (provider && provider.toLowerCase() === 'anthropic') {\n isAnthropic = true\n } else if (model && model.toLowerCase().includes('anthropic')) {\n isAnthropic = true\n }\n\n if (isAnthropic && parsedUsage.input) {\n const cacheTokens =\n (additionalTokenData.cacheReadInputTokens || 0) + (additionalTokenData.cacheWriteInputTokens || 0)\n if (cacheTokens > 0) {\n parsedUsage.input = Math.max(parsedUsage.input - cacheTokens, 0)\n }\n }\n\n return [parsedUsage.input, parsedUsage.output, additionalTokenData]\n }\n\n private parseUsage(response: LLMResult, provider?: string, model?: string): [number, number, Record<string, any>] {\n let llmUsage: [number, number, Record<string, any>] = [0, 0, {}]\n const llmUsageKeys = ['token_usage', 'usage', 'tokenUsage']\n\n if (response.llmOutput != null) {\n const key = llmUsageKeys.find((k) => response.llmOutput?.[k] != null)\n if (key) {\n llmUsage = this._parseUsageModel(response.llmOutput[key], provider, model)\n }\n }\n\n // If top-level usage info was not found, try checking the generations.\n if (llmUsage[0] === 0 && llmUsage[1] === 0 && response.generations) {\n for (const generation of response.generations) {\n for (const genChunk of generation) {\n // Check other paths for usage information\n if (genChunk.generationInfo?.usage_metadata) {\n llmUsage = this._parseUsageModel(genChunk.generationInfo.usage_metadata, provider, model)\n return llmUsage\n }\n\n const messageChunk = genChunk.generationInfo ?? {}\n const responseMetadata = messageChunk.response_metadata ?? {}\n const chunkUsage =\n responseMetadata['usage'] ??\n responseMetadata['amazon-bedrock-invocationMetrics'] ??\n messageChunk.usage_metadata\n if (chunkUsage) {\n llmUsage = this._parseUsageModel(chunkUsage, provider, model)\n return llmUsage\n }\n }\n }\n }\n\n return llmUsage\n }\n}\n"],"names":["DATA_URL_PREFIX_RE","BASE64_ALPHABET_RE","Base64Recognizer","recognize","value","minLength","dataUrl","exec","kind","mediaType","length","confidencePrefix","slice","test","MIME_HINT_KEYS","STRONG_CONTEXT_KEYS","Set","STRONG_CONTEXT_TYPES","FILE_FAMILY_TYPES","KNOWN_AUDIO_FORMATS","MediaTypeContext","EMPTY","undefined","constructor","parent","key","inferMediaType","inferFromSiblingMime","inferFromSiblingFormat","inferFromParentType","inferFromKey","hint","v","fmt","format","has","toLowerCase","t","type","includes","signalsBinary","STRONG_CONTEXT_MIN_LENGTH","WEAK_CONTEXT_MIN_LENGTH","BinaryContentRedactor","visited","WeakSet","recognizer","redact","isMultimodalEnabled","walk","ctx","redactString","Uint8Array","placeholderFor","add","Array","isArray","map","item","obj","out","k","Object","keys","recognition","val","process","env","_INTERNAL_LLMA_MULTIMODAL","redactor","sanitizeLangChain","data","STRING_FORMAT","TextEncoder","TextDecoder","fatal","toContentString","content","JSON","stringify","String","getModelParams","params","modelParams","paramKeys","withPrivacyMode","client","privacyMode","input","privacy_mode","sanitizeValues","jsonSafe","parse","decode","encode","fromEntries","entries","DEFAULT_MAX_DEPTH","MAX_STACK_LINES","serializeError","depth","Error","name","message","stack","truncateStack","cause","stringifyError","error","lines","split","join","POSTHOG_AI_GATEWAY_HOSTS","GATEWAY_DOCS_URL","extractHost","baseURL","hasScheme","URL","hostname","isPostHogAiGatewayUrl","host","warnIfPostHogAiGateway","console","warn","LangChainCallbackHandler","BaseCallbackHandler","runs","parentTree","options","distinctId","traceId","properties","groups","debug","handleChainStart","chain","inputs","runId","parentRunId","tags","metadata","_runType","runName","_logDebugEvent","_setParentOfRun","_setTraceOrSpanMetadata","handleChainEnd","outputs","_kwargs","_logAndPopTraceOrSpan","handleChainError","handleChatModelStart","serialized","messages","extraParams","flat","m","_convertMessageToDict","_setLLMMetadata","handleLLMStart","prompts","handleLLMEnd","output","_extraParams","_logAndPopGeneration","handleLLMError","err","handleToolStart","tool","_logAndSetTraceOrSpan","handleToolEnd","handleToolError","handleRetrieverStart","retriever","query","handleRetrieverEnd","documents","handleRetrieverError","handleAgentAction","action","handleAgentEnd","_popRunAndCaptureTraceOrSpan","eventName","debugPayload","result","_popRunAndCaptureGeneration","_popParentOfRun","_findRootRun","id","args","defaultName","_getLangchainRunName","startTime","Date","now","runNameFound","generation","invocation_params","tools","ls_model_name","model","ls_provider","provider","kwargs","openai_api_base","baseUrl","_popRunMetadata","endTime","run","_getTraceId","_getParentRunId","_runId","actualParentRunId","_captureTraceOrSpan","latency","eventProperties","$ai_lib","$ai_lib_version","version","$ai_trace_id","$ai_input_state","$ai_latency","$ai_span_name","$ai_span_id","$ai_framework","assign","capture","toString","event","response","_captureGeneration","$ai_parent_id","$ai_provider","$ai_model","$ai_model_parameters","$ai_input","$ai_http_status","$ai_base_url","status","inputTokens","outputTokens","additionalTokenData","parseUsage","cacheReadInputTokens","cacheWriteInputTokens","reasoningTokens","webSearchCount","stopReason","_extractStopReason","completions","generations","lastGeneration","isChatGeneration","gen","_extractRawResponse","extra","log","arg","_convertLcToolCallsToOai","toolCalls","toolCall","function","arguments","text","trim","additional_kwargs","additionalKwargs","messageDict","messageType","getType","role","tool_calls","generationInfo","finish_reason","response_metadata","stop_reason","_parseUsageModel","usage","conversionList","parsedUsage","reduce","acc","modelKey","typeKey","finalCount","sum","tokenCount","prompt_tokens_details","cached_tokens","input_token_details","cache_read","cachedPromptTokens","cache_read_input_tokens","cache_creation_input_tokens","cache_creation","completion_tokens_details","reasoning_tokens","output_token_details","reasoning","server_tool_use","web_search_requests","citations","search_results","search_context_size","annotations","hasUrlCitation","some","ann","grounding_metadata","grounding_support","web_search_queries","isAnthropic","cacheTokens","Math","max","llmUsage","llmUsageKeys","llmOutput","find","genChunk","usage_metadata","messageChunk","responseMetadata","chunkUsage"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.mjs","sources":["../../src/sanitization/base64_recognizer.ts","../../src/sanitization/media_type_context.ts","../../src/sanitization/binary_content_redactor.ts","../../src/sanitization.ts","../../src/utils.ts","../../src/serializeError.ts","../../src/gatewayWarning.ts","../../src/langchain/callbacks.ts"],"sourcesContent":["const DATA_URL_PREFIX_RE = /^data:([^;,\\s]+)(?:;[^;,\\s]+)*;base64,/i\nconst BASE64_ALPHABET_RE = /^[A-Za-z0-9+/_=-]+$/\n\nexport type Base64Recognition = { kind: 'data-url'; mediaType: string } | { kind: 'raw' } | { kind: 'none' }\n\nexport class Base64Recognizer {\n recognize(value: string, minLength: number): Base64Recognition {\n const dataUrl = DATA_URL_PREFIX_RE.exec(value)\n if (dataUrl) return { kind: 'data-url', mediaType: dataUrl[1] }\n\n if (value.length < minLength) return { kind: 'none' }\n\n const confidencePrefix = value.slice(0, minLength)\n if (BASE64_ALPHABET_RE.test(confidencePrefix)) {\n return { kind: 'raw' }\n } else {\n return { kind: 'none' }\n }\n }\n}\n","const MIME_HINT_KEYS = ['mediaType', 'media_type', 'mimeType', 'mime_type'] as const\n\nconst STRONG_CONTEXT_KEYS = new Set([\n 'data',\n 'file_data',\n 'fileData',\n 'image_url',\n 'imageUrl',\n 'video_url',\n 'videoUrl',\n 'audio',\n 'audio_data',\n 'audioData',\n 'inline_data',\n 'inlineData',\n 'source',\n 'result',\n])\n\nconst STRONG_CONTEXT_TYPES = new Set([\n 'image',\n 'image_url',\n 'input_image',\n 'audio',\n 'input_audio',\n 'video',\n 'video_url',\n 'file',\n 'input_file',\n 'document',\n 'media',\n 'file-data',\n])\n\nconst FILE_FAMILY_TYPES = new Set(['file', 'input_file', 'document', 'media', 'file-data'])\n\nconst KNOWN_AUDIO_FORMATS = new Set(['wav', 'mp3', 'ogg', 'flac', 'm4a', 'aac', 'webm'])\n\nexport class MediaTypeContext {\n static readonly EMPTY = new MediaTypeContext(undefined, undefined)\n\n constructor(\n private readonly parent: Record<string, unknown> | undefined,\n private readonly key: string | undefined\n ) {}\n\n inferMediaType(): string | undefined {\n return (\n this.inferFromSiblingMime() ?? this.inferFromSiblingFormat() ?? this.inferFromParentType() ?? this.inferFromKey()\n )\n }\n\n inferFromSiblingMime(): string | undefined {\n if (!this.parent) return undefined\n for (const hint of MIME_HINT_KEYS) {\n const v = this.parent[hint]\n if (typeof v === 'string') return v\n }\n return undefined\n }\n\n inferFromSiblingFormat(): string | undefined {\n if (!this.parent) return undefined\n const fmt = this.parent.format\n if (typeof fmt === 'string' && KNOWN_AUDIO_FORMATS.has(fmt.toLowerCase())) {\n return `audio/${fmt.toLowerCase()}`\n }\n return undefined\n }\n\n inferFromParentType(): string | undefined {\n if (!this.parent) return undefined\n const t = this.parent.type\n if (typeof t !== 'string') return undefined\n if (t === 'image' || t === 'image_url' || t === 'input_image') return 'image'\n if (t === 'audio' || t === 'input_audio') return 'audio'\n if (t === 'video' || t === 'video_url') return 'video'\n if (FILE_FAMILY_TYPES.has(t)) return 'application/octet-stream'\n return undefined\n }\n\n inferFromKey(): string | undefined {\n if (!this.key) return undefined\n const key = this.key.toLowerCase()\n if (key.includes('audio')) return 'audio'\n if (key.includes('video')) return 'video'\n if (key.includes('image')) return 'image'\n if (key.includes('file') || key.includes('document')) return 'application/octet-stream'\n return undefined\n }\n\n signalsBinary(): boolean {\n if (this.parent) {\n for (const hint of MIME_HINT_KEYS) {\n if (typeof this.parent[hint] === 'string') return true\n }\n const fmt = this.parent.format\n if (typeof fmt === 'string' && KNOWN_AUDIO_FORMATS.has(fmt.toLowerCase())) return true\n const t = this.parent.type\n if (typeof t === 'string' && STRONG_CONTEXT_TYPES.has(t)) return true\n }\n if (this.key && STRONG_CONTEXT_KEYS.has(this.key)) return true\n return false\n }\n}\n","import { Base64Recognizer } from './base64_recognizer'\nimport { MediaTypeContext } from './media_type_context'\n\nconst STRONG_CONTEXT_MIN_LENGTH = 64\nconst WEAK_CONTEXT_MIN_LENGTH = 1024\n\nexport class BinaryContentRedactor {\n private visited: WeakSet<object> = new WeakSet()\n\n constructor(private readonly recognizer: Base64Recognizer = new Base64Recognizer()) {}\n\n redact<T>(value: T): T\n redact(value: unknown): unknown {\n if (this.isMultimodalEnabled()) return value\n this.visited = new WeakSet()\n return this.walk(value, MediaTypeContext.EMPTY)\n }\n\n private walk(value: unknown, ctx: MediaTypeContext): unknown {\n if (value === null || value === undefined) return value\n if (typeof value === 'string') return this.redactString(value, ctx)\n if (typeof value !== 'object') return value\n\n // Buffer extends Uint8Array, so this branch catches both.\n if (typeof Uint8Array !== 'undefined' && value instanceof Uint8Array) {\n return this.placeholderFor(ctx.inferMediaType())\n }\n\n if (this.visited.has(value)) return null\n this.visited.add(value)\n\n if (Array.isArray(value)) {\n return value.map((item) => this.walk(item, ctx))\n }\n\n const obj = value as Record<string, unknown>\n const out: Record<string, unknown> = {}\n for (const k of Object.keys(obj)) {\n out[k] = this.walk(obj[k], new MediaTypeContext(obj, k))\n }\n return out\n }\n\n private redactString(value: string, ctx: MediaTypeContext): string {\n const minLength = ctx.signalsBinary() ? STRONG_CONTEXT_MIN_LENGTH : WEAK_CONTEXT_MIN_LENGTH\n const recognition = this.recognizer.recognize(value, minLength)\n switch (recognition.kind) {\n case 'data-url':\n return this.placeholderFor(recognition.mediaType)\n case 'raw':\n return this.placeholderFor(ctx.inferMediaType())\n case 'none':\n return value\n }\n }\n\n private placeholderFor(mediaType?: string): string {\n if (!mediaType) return '[base64 redacted]'\n if (mediaType === 'application/octet-stream') return '[base64 file redacted]'\n return `[base64 ${mediaType} redacted]`\n }\n\n private isMultimodalEnabled(): boolean {\n const val = process.env._INTERNAL_LLMA_MULTIMODAL || ''\n return val.toLowerCase() === 'true' || val === '1' || val.toLowerCase() === 'yes'\n }\n}\n","import { BinaryContentRedactor } from './sanitization/binary_content_redactor'\n\nconst redactor = new BinaryContentRedactor()\n\nexport function redactBase64DataUrl(str: string): string\nexport function redactBase64DataUrl(str: unknown): unknown\nexport function redactBase64DataUrl(str: unknown): unknown {\n return redactor.redact(str)\n}\n\nexport const sanitizeOpenAI = (data: unknown): unknown => redactor.redact(data)\nexport const sanitizeOpenAIResponse = (data: unknown): unknown => redactor.redact(data)\nexport const sanitizeAnthropic = (data: unknown): unknown => redactor.redact(data)\nexport const sanitizeGemini = (data: unknown): unknown => redactor.redact(data)\nexport const sanitizeLangChain = (data: unknown): unknown => redactor.redact(data)\n","import { PostHog } from 'posthog-node'\nimport type OpenAIOrignal from 'openai'\nimport type AnthropicOriginal from '@anthropic-ai/sdk'\nimport type { ResponseCreateParamsWithTools } from 'openai/lib/ResponsesParser'\nimport type {\n FormattedMessage,\n FormattedContent,\n FormattedAudioContent,\n FormattedImageContent,\n FormattedDocumentContent,\n} from './types'\nimport { v4 as uuidv4 } from 'uuid'\nimport { isString } from './typeGuards'\nimport { redactBase64DataUrl } from './sanitization'\n\ntype ChatCompletionCreateParamsBase = OpenAIOrignal.Chat.Completions.ChatCompletionCreateParams\ntype MessageCreateParams = AnthropicOriginal.Messages.MessageCreateParams\ntype ResponseCreateParams = OpenAIOrignal.Responses.ResponseCreateParams\ntype EmbeddingCreateParams = OpenAIOrignal.EmbeddingCreateParams\ntype TranscriptionCreateParams = OpenAIOrignal.Audio.Transcriptions.TranscriptionCreateParams\n\nconst TOKEN_PROPERTY_KEYS = new Set([\n '$ai_input_tokens',\n '$ai_output_tokens',\n '$ai_cache_read_input_tokens',\n '$ai_cache_creation_input_tokens',\n '$ai_total_tokens',\n '$ai_reasoning_tokens',\n])\n\nexport function getTokensSource(posthogProperties?: Record<string, unknown>): string {\n if (posthogProperties && Object.keys(posthogProperties).some((key) => TOKEN_PROPERTY_KEYS.has(key))) {\n return 'passthrough'\n }\n return 'sdk'\n}\n\n// limit large outputs by truncating to 200kb (approx 200k bytes)\nexport const MAX_OUTPUT_SIZE = 200000\nconst STRING_FORMAT = 'utf8'\n\n// Reused across calls to avoid per-invocation allocation; truncate() runs\n// hundreds of times for prompts with many parts.\nconst sharedTextEncoder = new TextEncoder()\nconst sharedTextDecoder = new TextDecoder(STRING_FORMAT, { fatal: false })\n\nexport const utf8ByteLength = (str: string): number => sharedTextEncoder.encode(str).byteLength\n\n/**\n * Safely converts content to a string, preserving structure for objects/arrays.\n * - If content is already a string, returns it as-is\n * - If content is an object or array, stringifies it with JSON.stringify to preserve structure\n * - Otherwise, converts to string with String()\n *\n * This prevents the \"[object Object]\" bug when objects are naively converted to strings.\n *\n * @param content - The content to convert to a string\n * @returns A string representation that preserves structure for complex types\n */\nexport function toContentString(content: unknown): string {\n if (typeof content === 'string') {\n return content\n }\n if (content !== undefined && content !== null && typeof content === 'object') {\n try {\n return JSON.stringify(content)\n } catch {\n // Fallback for circular refs, BigInt, or objects with throwing toJSON\n return String(content)\n }\n }\n return String(content)\n}\n\nexport interface MonitoringEventPropertiesWithDefaults {\n distinctId?: string\n traceId: string\n properties?: Record<string, any>\n privacyMode: boolean\n groups?: Record<string, any>\n modelOverride?: string\n providerOverride?: string\n costOverride?: CostOverride\n captureImmediate?: boolean\n}\n\nexport type MonitoringEventProperties = Partial<MonitoringEventPropertiesWithDefaults>\n\nexport type MonitoringParams = {\n [K in keyof MonitoringEventProperties as `posthog${Capitalize<string & K>}`]: MonitoringEventProperties[K]\n}\n\nexport interface CostOverride {\n inputCost: number\n outputCost: number\n}\n\nexport const getModelParams = (\n params:\n | ((\n | ChatCompletionCreateParamsBase\n | MessageCreateParams\n | ResponseCreateParams\n | ResponseCreateParamsWithTools\n | EmbeddingCreateParams\n | TranscriptionCreateParams\n ) &\n MonitoringParams)\n | null\n): Record<string, any> => {\n if (!params) {\n return {}\n }\n const modelParams: Record<string, any> = {}\n const paramKeys = [\n 'temperature',\n 'max_tokens',\n 'max_completion_tokens',\n 'top_p',\n 'frequency_penalty',\n 'presence_penalty',\n 'n',\n 'stop',\n 'stream',\n 'streaming',\n 'language',\n 'response_format',\n 'timestamp_granularities',\n 'service_tier',\n ] as const\n\n for (const key of paramKeys) {\n if (key in params && (params as any)[key] !== undefined) {\n modelParams[key] = (params as any)[key]\n }\n }\n return modelParams\n}\n\n/**\n * Helper to format responses (non-streaming) for consumption\n */\nexport const formatResponse = (response: any, provider: string): FormattedMessage[] => {\n if (!response) {\n return []\n }\n if (provider === 'anthropic') {\n return formatResponseAnthropic(response)\n } else if (provider === 'openai') {\n return formatResponseOpenAI(response)\n } else if (provider === 'gemini') {\n return formatResponseGemini(response)\n }\n return []\n}\n\nexport const formatResponseAnthropic = (response: any): FormattedMessage[] => {\n const output: FormattedMessage[] = []\n const content: FormattedContent = []\n\n for (const choice of response.content ?? []) {\n if (choice?.type === 'text' && choice?.text) {\n content.push({ type: 'text', text: choice.text })\n } else if (choice?.type === 'tool_use' && choice?.name && choice?.id) {\n content.push({\n type: 'function',\n id: choice.id,\n function: {\n name: choice.name,\n arguments: choice.input || {},\n },\n })\n }\n }\n\n if (content.length > 0) {\n output.push({\n role: 'assistant',\n content,\n })\n }\n\n return output\n}\n\nexport const formatResponseOpenAI = (response: any): FormattedMessage[] => {\n const output: FormattedMessage[] = []\n\n if (response.choices) {\n for (const choice of response.choices) {\n const content: FormattedContent = []\n let role = 'assistant'\n\n if (choice.message) {\n if (choice.message.role) {\n role = choice.message.role\n }\n\n if (choice.message.content) {\n content.push({ type: 'text', text: choice.message.content })\n }\n\n if (choice.message.tool_calls) {\n for (const toolCall of choice.message.tool_calls) {\n content.push({\n type: 'function',\n id: toolCall.id,\n function: {\n name: toolCall.function.name,\n arguments: toolCall.function.arguments,\n },\n })\n }\n }\n\n // Handle audio output (gpt-4o-audio-preview)\n if (choice.message.audio) {\n content.push({\n type: 'audio',\n ...choice.message.audio,\n })\n }\n }\n\n if (content.length > 0) {\n output.push({\n role,\n content,\n })\n }\n }\n }\n\n // Handle Responses API format\n if (response.output) {\n const content: FormattedContent = []\n let role = 'assistant'\n\n for (const item of response.output) {\n if (item.type === 'message') {\n role = item.role\n\n if (item.content && Array.isArray(item.content)) {\n for (const contentItem of item.content) {\n if (contentItem.type === 'output_text' && contentItem.text) {\n content.push({ type: 'text', text: contentItem.text })\n } else if (contentItem.text) {\n content.push({ type: 'text', text: contentItem.text })\n } else if (contentItem.type === 'input_image' && contentItem.image_url) {\n content.push({\n type: 'image',\n image: contentItem.image_url,\n })\n }\n }\n } else if (item.content) {\n content.push({ type: 'text', text: String(item.content) })\n }\n } else if (item.type === 'function_call') {\n content.push({\n type: 'function',\n id: item.call_id || item.id || '',\n function: {\n name: item.name,\n arguments: item.arguments || {},\n },\n })\n }\n }\n\n if (content.length > 0) {\n output.push({\n role,\n content,\n })\n }\n }\n\n return output\n}\n\nexport const buildInlineDataBlock = (\n mimeType: string,\n data: string\n): FormattedAudioContent | FormattedImageContent | FormattedDocumentContent => {\n if (mimeType.startsWith('audio/')) {\n return { type: 'audio', mime_type: mimeType, data }\n }\n if (mimeType.startsWith('image/')) {\n return { type: 'image', inline_data: { mime_type: mimeType, data } }\n }\n return { type: 'document', inline_data: { mime_type: mimeType, data } }\n}\n\nexport const formatResponseGemini = (response: any): FormattedMessage[] => {\n const output: FormattedMessage[] = []\n\n if (response.candidates && Array.isArray(response.candidates)) {\n for (const candidate of response.candidates) {\n if (candidate.content && candidate.content.parts) {\n const content: FormattedContent = []\n\n for (const part of candidate.content.parts) {\n if (part.text) {\n content.push({ type: 'text', text: part.text })\n } else if (part.functionCall) {\n content.push({\n type: 'function',\n function: {\n name: part.functionCall.name,\n arguments: part.functionCall.args,\n },\n })\n } else if (part.inlineData) {\n // Handle inline data (images, audio, documents)\n const mimeType = part.inlineData.mimeType || part.inlineData.mime_type || 'application/octet-stream'\n let data = part.inlineData.data\n\n // Handle binary data (Uint8Array/Buffer -> base64)\n if (data instanceof Uint8Array) {\n if (typeof Buffer !== 'undefined') {\n data = Buffer.from(data).toString('base64')\n } else {\n let binary = ''\n for (let i = 0; i < data.length; i++) {\n binary += String.fromCharCode(data[i])\n }\n data = btoa(binary)\n }\n }\n\n // Sanitize base64 data for images and other large inline data\n data = redactBase64DataUrl(data)\n\n content.push(buildInlineDataBlock(mimeType, data))\n }\n }\n\n if (content.length > 0) {\n output.push({\n role: 'assistant',\n content,\n })\n }\n } else if (candidate.text) {\n output.push({\n role: 'assistant',\n content: [{ type: 'text', text: candidate.text }],\n })\n }\n }\n } else if (response.text) {\n output.push({\n role: 'assistant',\n content: [{ type: 'text', text: response.text }],\n })\n }\n\n return output\n}\n\nexport const mergeSystemPrompt = (params: MessageCreateParams & MonitoringParams, provider: string): any => {\n if (provider == 'anthropic') {\n const messages = params.messages || []\n if (!(params as any).system) {\n return messages\n }\n const systemMessage = (params as any).system\n return [{ role: 'system', content: systemMessage }, ...messages]\n }\n return params.messages\n}\n\nexport const withPrivacyMode = (client: PostHog, privacyMode: boolean, input: any): any => {\n return (client as any).privacy_mode || privacyMode ? null : input\n}\n\nfunction toSafeString(input: unknown): string {\n if (input === undefined || input === null) {\n return ''\n }\n if (typeof input === 'string') {\n return input\n }\n try {\n return JSON.stringify(input)\n } catch {\n console.warn('Failed to stringify input', input)\n return ''\n }\n}\n\nexport const truncate = (input: unknown): string => {\n const str = toSafeString(input)\n if (str === '') {\n return ''\n }\n\n // Check if we need to truncate and ensure STRING_FORMAT is respected\n const buffer = sharedTextEncoder.encode(str)\n if (buffer.length <= MAX_OUTPUT_SIZE) {\n // Ensure STRING_FORMAT is respected\n return sharedTextDecoder.decode(buffer)\n }\n\n // Truncate the buffer and ensure a valid string is returned.\n // fatal: false means we get U+FFFD at the end if truncation broke the encoding.\n const truncatedBuffer = buffer.slice(0, MAX_OUTPUT_SIZE)\n let truncatedStr = sharedTextDecoder.decode(truncatedBuffer)\n if (truncatedStr.endsWith('\\uFFFD')) {\n truncatedStr = truncatedStr.slice(0, -1)\n }\n return `${truncatedStr}... [truncated]`\n}\n\n/**\n * Calculate web search count from raw API response.\n *\n * Uses a two-tier detection strategy:\n * Priority 1 (Exact Count): Count actual web search calls when available\n * Priority 2 (Binary Detection): Return 1 if web search indicators are present, 0 otherwise\n *\n * @param result - Raw API response from any provider (OpenAI, Perplexity, OpenRouter, Gemini, etc.)\n * @returns Number of web searches performed (exact count or binary 1/0)\n */\nexport function calculateWebSearchCount(result: unknown): number {\n if (!result || typeof result !== 'object') {\n return 0\n }\n\n // Priority 1: Exact Count\n // Check for OpenAI Responses API web_search_call items\n if ('output' in result && Array.isArray(result.output)) {\n let count = 0\n\n for (const item of result.output) {\n if (typeof item === 'object' && item !== null && 'type' in item && item.type === 'web_search_call') {\n count++\n }\n }\n\n if (count > 0) {\n return count\n }\n }\n\n // Priority 2: Binary Detection (1 or 0)\n\n // Check for citations at root level (Perplexity)\n if ('citations' in result && Array.isArray(result.citations) && result.citations.length > 0) {\n return 1\n }\n\n // Check for search_results at root level (Perplexity via OpenRouter)\n if ('search_results' in result && Array.isArray(result.search_results) && result.search_results.length > 0) {\n return 1\n }\n\n // Check for usage.search_context_size (Perplexity via OpenRouter)\n if ('usage' in result && typeof result.usage === 'object' && result.usage !== null) {\n if ('search_context_size' in result.usage && result.usage.search_context_size) {\n return 1\n }\n }\n\n // Check for annotations with url_citation in choices[].message or choices[].delta (OpenAI/Perplexity)\n if ('choices' in result && Array.isArray(result.choices)) {\n for (const choice of result.choices) {\n if (typeof choice === 'object' && choice !== null) {\n // Check both message (non-streaming) and delta (streaming) for annotations\n const content = ('message' in choice ? choice.message : null) || ('delta' in choice ? choice.delta : null)\n\n if (typeof content === 'object' && content !== null && 'annotations' in content) {\n const annotations = content.annotations\n\n if (Array.isArray(annotations)) {\n const hasUrlCitation = annotations.some((ann: unknown) => {\n return typeof ann === 'object' && ann !== null && 'type' in ann && ann.type === 'url_citation'\n })\n\n if (hasUrlCitation) {\n return 1\n }\n }\n }\n }\n }\n }\n\n // Check for annotations in output[].content[] (OpenAI Responses API)\n if ('output' in result && Array.isArray(result.output)) {\n for (const item of result.output) {\n if (typeof item === 'object' && item !== null && 'content' in item) {\n const content = item.content\n\n if (Array.isArray(content)) {\n for (const contentItem of content) {\n if (typeof contentItem === 'object' && contentItem !== null && 'annotations' in contentItem) {\n const annotations = contentItem.annotations\n\n if (Array.isArray(annotations)) {\n const hasUrlCitation = annotations.some((ann: unknown) => {\n return typeof ann === 'object' && ann !== null && 'type' in ann && ann.type === 'url_citation'\n })\n\n if (hasUrlCitation) {\n return 1\n }\n }\n }\n }\n }\n }\n }\n }\n\n // Check for grounding_metadata (Gemini)\n if ('candidates' in result && Array.isArray(result.candidates)) {\n for (const candidate of result.candidates) {\n if (\n typeof candidate === 'object' &&\n candidate !== null &&\n 'grounding_metadata' in candidate &&\n candidate.grounding_metadata\n ) {\n return 1\n }\n }\n }\n\n return 0\n}\n\n/**\n * Extract available tool calls from the request parameters.\n * These are the tools provided to the LLM, not the tool calls in the response.\n */\nexport const extractAvailableToolCalls = (provider: string, params: any): unknown[] | null => {\n if (provider === 'anthropic') {\n if (params.tools) {\n return params.tools\n }\n\n return null\n } else if (provider === 'gemini') {\n if (params.config && params.config.tools) {\n return params.config.tools\n }\n\n return null\n } else if (provider === 'openai') {\n if (params.tools) {\n return params.tools\n }\n\n return null\n } else if (provider === 'vercel') {\n if (params.tools) {\n return params.tools\n }\n\n return null\n }\n\n return null\n}\n\nexport enum AIEvent {\n Generation = '$ai_generation',\n Embedding = '$ai_embedding',\n}\n\nexport function sanitizeValues(obj: any): any {\n if (obj === undefined || obj === null) {\n return obj\n }\n const jsonSafe = JSON.parse(JSON.stringify(obj))\n if (typeof jsonSafe === 'string') {\n // Sanitize lone surrogates by round-tripping through UTF-8\n return new TextDecoder().decode(new TextEncoder().encode(jsonSafe))\n } else if (Array.isArray(jsonSafe)) {\n return jsonSafe.map(sanitizeValues)\n } else if (jsonSafe && typeof jsonSafe === 'object') {\n return Object.fromEntries(Object.entries(jsonSafe).map(([k, v]) => [k, sanitizeValues(v)]))\n }\n return jsonSafe\n}\n\nconst POSTHOG_PARAMS_MAP: Record<keyof MonitoringParams, string> = {\n posthogDistinctId: 'distinctId',\n posthogTraceId: 'traceId',\n posthogProperties: 'properties',\n posthogPrivacyMode: 'privacyMode',\n posthogGroups: 'groups',\n posthogModelOverride: 'modelOverride',\n posthogProviderOverride: 'providerOverride',\n posthogCostOverride: 'costOverride',\n posthogCaptureImmediate: 'captureImmediate',\n}\n\nexport function extractPosthogParams<T>(body: T & MonitoringParams): {\n providerParams: T\n posthogParams: MonitoringEventPropertiesWithDefaults\n} {\n const providerParams: Record<string, unknown> = {}\n const posthogParams: Record<string, unknown> = {}\n\n for (const [key, value] of Object.entries(body)) {\n if (POSTHOG_PARAMS_MAP[key as keyof MonitoringParams]) {\n posthogParams[POSTHOG_PARAMS_MAP[key as keyof MonitoringParams]] = value\n } else if (key.startsWith('posthog')) {\n console.warn(`Unknown Posthog parameter ${key}`)\n } else {\n providerParams[key] = value\n }\n }\n\n return {\n providerParams: providerParams as T,\n posthogParams: addDefaults(posthogParams),\n }\n}\n\nfunction addDefaults(params: MonitoringEventProperties): MonitoringEventPropertiesWithDefaults {\n return {\n ...params,\n privacyMode: params.privacyMode ?? false,\n traceId: params.traceId ?? uuidv4(),\n }\n}\n\nexport function formatOpenAIResponsesInput(input: unknown, instructions?: string | null): FormattedMessage[] {\n const messages: FormattedMessage[] = []\n\n if (instructions) {\n messages.push({\n role: 'system',\n content: instructions,\n })\n }\n\n if (Array.isArray(input)) {\n for (const item of input) {\n if (typeof item === 'string') {\n messages.push({ role: 'user', content: item })\n } else if (item && typeof item === 'object') {\n const obj = item as Record<string, unknown>\n const role = isString(obj.role) ? obj.role : 'user'\n\n // Handle content properly - preserve structure for objects/arrays\n const content = obj.content ?? obj.text ?? item\n messages.push({ role, content: toContentString(content) })\n } else {\n messages.push({ role: 'user', content: toContentString(item) })\n }\n }\n } else if (typeof input === 'string') {\n messages.push({ role: 'user', content: input })\n } else if (input) {\n messages.push({ role: 'user', content: toContentString(input) })\n }\n\n return messages\n}\n","import { sanitizeValues } from './utils'\n\nconst DEFAULT_MAX_DEPTH = 3\nconst MAX_STACK_LINES = 20\n\nexport function serializeError(value: unknown, depth = DEFAULT_MAX_DEPTH): unknown {\n if (depth < 0 || value === null || typeof value !== 'object') {\n return value\n }\n if (value instanceof Error) {\n const out: Record<string, unknown> = {\n name: value.name,\n message: value.message,\n stack: truncateStack(value.stack),\n }\n for (const key of Object.keys(value)) {\n out[key] = serializeError((value as unknown as Record<string, unknown>)[key], depth - 1)\n }\n if (value.cause !== undefined) {\n out.cause = serializeError(value.cause, depth - 1)\n }\n return out\n }\n if (Array.isArray(value)) {\n return value.map((item) => serializeError(item, depth - 1))\n }\n return value\n}\n\nexport function stringifyError(error: unknown): string {\n try {\n return JSON.stringify(sanitizeValues(serializeError(error)))\n } catch {\n if (error instanceof Error) {\n return JSON.stringify({ name: error.name, message: error.message })\n }\n return JSON.stringify({ message: String(error) })\n }\n}\n\nfunction truncateStack(stack: string | undefined): string | undefined {\n if (!stack) {\n return stack\n }\n const lines = stack.split('\\n')\n if (lines.length <= MAX_STACK_LINES) {\n return stack\n }\n return [...lines.slice(0, MAX_STACK_LINES), '... (truncated)'].join('\\n')\n}\n","// Warn when a wrapper's base_url points at the PostHog AI Gateway: the gateway\n// emits its own $ai_generation, so each call would be captured (and, for billable\n// products, billed) twice. We only warn — the wrapper's event carries data the\n// gateway never sees (groups, custom properties, trace hierarchy).\n\n// Keep in sync with the gateway's deployed hosts (see services/llm-gateway in the\n// main repo). gateway.us.posthog.com is live today; the rest are listed ahead of\n// any traffic moving to them.\nexport const POSTHOG_AI_GATEWAY_HOSTS: readonly string[] = [\n 'gateway.posthog.com',\n 'gateway.us.posthog.com',\n 'gateway.eu.posthog.com',\n 'ai-gateway.us.posthog.com',\n 'ai-gateway.eu.posthog.com',\n]\n\n// Swap for the dedicated AI Gateway page once it ships.\nconst GATEWAY_DOCS_URL = 'https://posthog.com/docs/ai-observability'\n\nconst extractHost = (baseURL: string): string | undefined => {\n try {\n // Tolerate bare hosts that omit a scheme, e.g. \"gateway.us.posthog.com/v1\".\n const hasScheme = /^[a-z][a-z0-9+.-]*:\\/\\//i.test(baseURL)\n return new URL(hasScheme ? baseURL : `https://${baseURL}`).hostname.toLowerCase()\n } catch {\n return undefined\n }\n}\n\nexport const isPostHogAiGatewayUrl = (baseURL: string | undefined | null): boolean => {\n if (!baseURL) {\n return false\n }\n const host = extractHost(baseURL)\n return host !== undefined && POSTHOG_AI_GATEWAY_HOSTS.includes(host)\n}\n\n// Warns on every gateway call by design: the misconfiguration is impossible to\n// miss that way, and a doubled bill is worse than noisy logs.\nexport const warnIfPostHogAiGateway = (baseURL: string | undefined | null): void => {\n if (!isPostHogAiGatewayUrl(baseURL)) {\n return\n }\n console.warn(\n '[PostHog] The PostHog AI wrapper is pointed at the PostHog AI Gateway. ' +\n 'Both capture $ai_generation, so every call is double-counted and double-billed. ' +\n `Use one or the other — see ${GATEWAY_DOCS_URL}.`\n )\n}\n\n// OTel spans don't pass through captureAiGeneration, so detect the gateway from\n// the span's host/URL attributes instead. These follow the GenAI / HTTP semantic\n// conventions: `server.address` is a bare host, `url.full` a full URL, both of\n// which isPostHogAiGatewayUrl accepts.\nconst OTEL_GATEWAY_URL_ATTRIBUTES = ['server.address', 'url.full'] as const\n\nexport const warnIfPostHogAiGatewayOtelAttributes = (attributes: Record<string, unknown> | undefined): void => {\n if (!attributes) {\n return\n }\n for (const key of OTEL_GATEWAY_URL_ATTRIBUTES) {\n const value = attributes[key]\n if (typeof value === 'string' && isPostHogAiGatewayUrl(value)) {\n warnIfPostHogAiGateway(value)\n return\n }\n }\n}\n","import { PostHog } from 'posthog-node'\nimport { withPrivacyMode, getModelParams, toContentString } from '../utils'\nimport { BaseCallbackHandler } from '@langchain/core/callbacks/base'\nimport { version } from '../../package.json'\nimport type { Serialized } from '@langchain/core/load/serializable'\nimport type { ChainValues } from '@langchain/core/utils/types'\nimport type { LLMResult } from '@langchain/core/outputs'\nimport type { AgentAction, AgentFinish } from '@langchain/core/agents'\nimport type { DocumentInterface } from '@langchain/core/documents'\nimport { ToolCall } from '@langchain/core/messages/tool'\nimport { BaseMessage } from '@langchain/core/messages'\nimport { sanitizeLangChain } from '../sanitization'\nimport { stringifyError } from '../serializeError'\nimport { warnIfPostHogAiGateway } from '../gatewayWarning'\n\ninterface SpanMetadata {\n /** Name of the trace/span (e.g. chain name) */\n name: string\n /** Timestamp (in ms) when the run started */\n startTime: number\n /** Timestamp (in ms) when the run ended (if already finished) */\n endTime?: number\n /** The input state */\n input?: any\n}\n\ninterface GenerationMetadata extends SpanMetadata {\n /** Provider used (e.g. openai, anthropic) */\n provider?: string\n /** Model name used in the generation */\n model?: string\n /** The model parameters (temperature, max_tokens, etc.) */\n modelParams?: Record<string, any>\n /** The base URL—for example, the API base used */\n baseUrl?: string\n /** The tools used in the generation */\n tools?: Record<string, any>\n}\n\n/** A run may either be a Span or a Generation */\ntype RunMetadata = SpanMetadata | GenerationMetadata\n\n/** Storage for run metadata */\ntype RunMetadataStorage = { [runId: string]: RunMetadata }\n\nexport class LangChainCallbackHandler extends BaseCallbackHandler {\n public name = 'PosthogCallbackHandler'\n private client: PostHog\n private distinctId?: string | number\n private traceId?: string | number\n private properties: Record<string, any>\n private privacyMode: boolean\n private groups: Record<string, any>\n private debug: boolean\n\n private runs: RunMetadataStorage = {}\n private parentTree: { [runId: string]: string } = {}\n\n constructor(options: {\n client: PostHog\n distinctId?: string | number\n traceId?: string | number\n properties?: Record<string, any>\n privacyMode?: boolean\n groups?: Record<string, any>\n debug?: boolean\n }) {\n if (!options.client) {\n throw new Error('PostHog client is required')\n }\n super()\n this.client = options.client\n this.distinctId = options.distinctId\n this.traceId = options.traceId\n this.properties = options.properties || {}\n this.privacyMode = options.privacyMode || false\n this.groups = options.groups || {}\n this.debug = options.debug || false\n }\n\n // ===== CALLBACK METHODS =====\n\n public handleChainStart(\n chain: Serialized,\n inputs: ChainValues,\n runId: string,\n parentRunId?: string,\n tags?: string[],\n metadata?: Record<string, unknown>,\n _runType?: string,\n runName?: string\n ): void {\n this._logDebugEvent('on_chain_start', runId, parentRunId, { inputs, tags })\n this._setParentOfRun(runId, parentRunId)\n this._setTraceOrSpanMetadata(chain, inputs, runId, parentRunId, metadata, tags, runName)\n }\n\n public handleChainEnd(\n outputs: ChainValues,\n runId: string,\n parentRunId?: string,\n tags?: string[],\n _kwargs?: { inputs?: Record<string, unknown> }\n ): void {\n this._logAndPopTraceOrSpan('on_chain_end', runId, parentRunId, { outputs, tags }, outputs)\n }\n\n public handleChainError(\n error: Error,\n runId: string,\n parentRunId?: string,\n tags?: string[],\n _kwargs?: { inputs?: Record<string, unknown> }\n ): void {\n this._logAndPopTraceOrSpan('on_chain_error', runId, parentRunId, { error, tags }, error)\n }\n\n public handleChatModelStart(\n serialized: Serialized,\n messages: BaseMessage[][],\n runId: string,\n parentRunId?: string,\n extraParams?: Record<string, unknown>,\n tags?: string[],\n metadata?: Record<string, unknown>,\n runName?: string\n ): void {\n this._logDebugEvent('on_chat_model_start', runId, parentRunId, { messages, tags })\n this._setParentOfRun(runId, parentRunId)\n // Flatten the two-dimensional messages and convert each message to a plain object\n const input = messages.flat().map((m) => this._convertMessageToDict(m))\n this._setLLMMetadata(serialized, runId, input, metadata, extraParams, runName)\n }\n\n public handleLLMStart(\n serialized: Serialized,\n prompts: string[],\n runId: string,\n parentRunId?: string,\n extraParams?: Record<string, unknown>,\n tags?: string[],\n metadata?: Record<string, unknown>,\n runName?: string\n ): void {\n this._logDebugEvent('on_llm_start', runId, parentRunId, { prompts, tags })\n this._setParentOfRun(runId, parentRunId)\n this._setLLMMetadata(serialized, runId, prompts, metadata, extraParams, runName)\n }\n\n public handleLLMEnd(\n output: LLMResult,\n runId: string,\n parentRunId?: string,\n tags?: string[],\n _extraParams?: Record<string, unknown>\n ): void {\n this._logAndPopGeneration('on_llm_end', runId, parentRunId, { output, tags }, output)\n }\n\n public handleLLMError(\n err: Error,\n runId: string,\n parentRunId?: string,\n tags?: string[],\n _extraParams?: Record<string, unknown>\n ): void {\n this._logAndPopGeneration('on_llm_error', runId, parentRunId, { err, tags }, err)\n }\n\n public handleToolStart(\n tool: Serialized,\n input: string,\n runId: string,\n parentRunId?: string,\n tags?: string[],\n metadata?: Record<string, unknown>,\n runName?: string\n ): void {\n this._logAndSetTraceOrSpan(\n 'on_tool_start',\n tool,\n input,\n runId,\n parentRunId,\n { input, tags },\n tags,\n metadata,\n runName\n )\n }\n\n public handleToolEnd(output: any, runId: string, parentRunId?: string, tags?: string[]): void {\n this._logAndPopTraceOrSpan('on_tool_end', runId, parentRunId, { output, tags }, output)\n }\n\n public handleToolError(err: Error, runId: string, parentRunId?: string, tags?: string[]): void {\n this._logAndPopTraceOrSpan('on_tool_error', runId, parentRunId, { err, tags }, err)\n }\n\n public handleRetrieverStart(\n retriever: Serialized,\n query: string,\n runId: string,\n parentRunId?: string,\n tags?: string[],\n metadata?: Record<string, unknown>,\n name?: string\n ): void {\n this._logAndSetTraceOrSpan(\n 'on_retriever_start',\n retriever,\n query,\n runId,\n parentRunId,\n { query, tags },\n tags,\n metadata,\n name\n )\n }\n\n public handleRetrieverEnd(\n documents: DocumentInterface[],\n runId: string,\n parentRunId?: string,\n tags?: string[]\n ): void {\n this._logAndPopTraceOrSpan('on_retriever_end', runId, parentRunId, { documents, tags }, documents)\n }\n\n public handleRetrieverError(err: Error, runId: string, parentRunId?: string, tags?: string[]): void {\n this._logAndPopTraceOrSpan('on_retriever_error', runId, parentRunId, { err, tags }, err)\n }\n\n public handleAgentAction(action: AgentAction, runId: string, parentRunId?: string, tags?: string[]): void {\n this._logDebugEvent('on_agent_action', runId, parentRunId, { action, tags })\n this._setParentOfRun(runId, parentRunId)\n this._setTraceOrSpanMetadata(null, action, runId, parentRunId)\n }\n\n public handleAgentEnd(action: AgentFinish, runId: string, parentRunId?: string, tags?: string[]): void {\n this._logDebugEvent('on_agent_finish', runId, parentRunId, { action, tags })\n this._popRunAndCaptureTraceOrSpan(runId, parentRunId, action)\n }\n\n // ===== PRIVATE HELPERS =====\n\n private _logAndSetTraceOrSpan(\n eventName: string,\n serialized: Serialized,\n input: any,\n runId: string,\n parentRunId: string | undefined,\n debugPayload: Record<string, unknown>,\n tags?: string[],\n metadata?: Record<string, unknown>,\n runName?: string\n ): void {\n this._logDebugEvent(eventName, runId, parentRunId, debugPayload)\n this._setParentOfRun(runId, parentRunId)\n this._setTraceOrSpanMetadata(serialized, input, runId, parentRunId, metadata, tags, runName)\n }\n\n private _logAndPopTraceOrSpan(\n eventName: string,\n runId: string,\n parentRunId: string | undefined,\n debugPayload: Record<string, unknown>,\n result: any\n ): void {\n this._logDebugEvent(eventName, runId, parentRunId, debugPayload)\n this._popRunAndCaptureTraceOrSpan(runId, parentRunId, result)\n }\n\n private _logAndPopGeneration(\n eventName: string,\n runId: string,\n parentRunId: string | undefined,\n debugPayload: Record<string, unknown>,\n result: LLMResult | Error\n ): void {\n this._logDebugEvent(eventName, runId, parentRunId, debugPayload)\n this._popRunAndCaptureGeneration(runId, parentRunId, result)\n }\n\n private _setParentOfRun(runId: string, parentRunId?: string): void {\n if (parentRunId) {\n this.parentTree[runId] = parentRunId\n }\n }\n\n private _popParentOfRun(runId: string): void {\n delete this.parentTree[runId]\n }\n\n private _findRootRun(runId: string): string {\n let id = runId\n while (this.parentTree[id]) {\n id = this.parentTree[id]\n }\n return id\n }\n\n private _setTraceOrSpanMetadata(\n serialized: any,\n input: any,\n runId: string,\n parentRunId?: string,\n ...args: any[]\n ): void {\n // Use default names if not provided: if this is a top-level run, we mark it as a trace, otherwise as a span.\n const defaultName = parentRunId ? 'span' : 'trace'\n const runName = this._getLangchainRunName(serialized, ...args) || defaultName\n this.runs[runId] = {\n name: runName,\n input,\n startTime: Date.now(),\n }\n }\n\n private _setLLMMetadata(\n serialized: Serialized | null,\n runId: string,\n messages: any,\n metadata?: any,\n extraParams?: any,\n runName?: string\n ): void {\n const runNameFound = this._getLangchainRunName(serialized, { extraParams, runName }) || 'generation'\n const generation: GenerationMetadata = {\n name: runNameFound,\n input: sanitizeLangChain(messages),\n startTime: Date.now(),\n }\n if (extraParams) {\n generation.modelParams = getModelParams(extraParams.invocation_params)\n\n if (extraParams.invocation_params && extraParams.invocation_params.tools) {\n generation.tools = extraParams.invocation_params.tools\n }\n }\n if (metadata) {\n if (metadata.ls_model_name) {\n generation.model = metadata.ls_model_name\n }\n if (metadata.ls_provider) {\n generation.provider = metadata.ls_provider\n }\n }\n if (serialized && 'kwargs' in serialized && serialized.kwargs.openai_api_base) {\n generation.baseUrl = serialized.kwargs.openai_api_base\n }\n this.runs[runId] = generation\n }\n\n private _popRunMetadata(runId: string): RunMetadata | undefined {\n const endTime = Date.now()\n const run = this.runs[runId]\n if (!run) {\n console.warn(`No run metadata found for run ${runId}`)\n return undefined\n }\n run.endTime = endTime\n delete this.runs[runId]\n return run\n }\n\n private _getTraceId(runId: string): string {\n return this.traceId ? String(this.traceId) : this._findRootRun(runId)\n }\n\n private _getParentRunId(traceId: string, _runId: string, parentRunId?: string): string | undefined {\n // Replace the parent-run if not found in our stored parent tree.\n if (parentRunId && !this.parentTree[parentRunId]) {\n return traceId\n }\n return parentRunId\n }\n\n private _popRunAndCaptureTraceOrSpan(\n runId: string,\n parentRunId: string | undefined,\n outputs: ChainValues | DocumentInterface[] | AgentFinish | Error | any\n ): void {\n const traceId = this._getTraceId(runId)\n this._popParentOfRun(runId)\n const run = this._popRunMetadata(runId)\n if (!run) {\n return\n }\n if ('modelParams' in run) {\n console.warn(`Run ${runId} is a generation, but attempted to be captured as a trace/span.`)\n return\n }\n const actualParentRunId = this._getParentRunId(traceId, runId, parentRunId)\n this._captureTraceOrSpan(traceId, runId, run as SpanMetadata, outputs, actualParentRunId)\n }\n\n private _captureTraceOrSpan(\n traceId: string,\n runId: string,\n run: SpanMetadata,\n outputs: ChainValues | DocumentInterface[] | AgentFinish | Error | any,\n parentRunId?: string\n ): void {\n const eventName = parentRunId ? '$ai_span' : '$ai_trace'\n const latency = run.endTime ? (run.endTime - run.startTime) / 1000 : 0\n const eventProperties: Record<string, any> = {\n $ai_lib: 'posthog-ai',\n $ai_lib_version: version,\n $ai_trace_id: traceId,\n $ai_input_state: withPrivacyMode(this.client, this.privacyMode, sanitizeLangChain(run.input)),\n $ai_latency: latency,\n $ai_span_name: run.name,\n $ai_span_id: runId,\n $ai_framework: 'langchain',\n }\n if (parentRunId) {\n eventProperties['$ai_parent_id'] = parentRunId\n }\n\n Object.assign(eventProperties, this.properties)\n if (!this.distinctId) {\n eventProperties['$process_person_profile'] = false\n }\n if (outputs instanceof Error) {\n eventProperties['$ai_error'] = stringifyError(outputs)\n eventProperties['$ai_is_error'] = true\n } else if (outputs !== undefined) {\n eventProperties['$ai_output_state'] = withPrivacyMode(this.client, this.privacyMode, sanitizeLangChain(outputs))\n }\n this.client.capture({\n distinctId: this.distinctId ? this.distinctId.toString() : runId,\n event: eventName,\n properties: eventProperties,\n groups: this.groups,\n })\n }\n\n private _popRunAndCaptureGeneration(\n runId: string,\n parentRunId: string | undefined,\n response: LLMResult | Error\n ): void {\n const traceId = this._getTraceId(runId)\n this._popParentOfRun(runId)\n const run = this._popRunMetadata(runId)\n if (!run || typeof run !== 'object' || !('modelParams' in run)) {\n console.warn(`Run ${runId} is not a generation, but attempted to be captured as such.`)\n return\n }\n const actualParentRunId = this._getParentRunId(traceId, runId, parentRunId)\n this._captureGeneration(traceId, runId, run as GenerationMetadata, response, actualParentRunId)\n }\n\n private _captureGeneration(\n traceId: string,\n runId: string,\n run: GenerationMetadata,\n output: LLMResult | Error,\n parentRunId?: string\n ): void {\n const latency = run.endTime ? (run.endTime - run.startTime) / 1000 : 0\n warnIfPostHogAiGateway(run.baseUrl)\n const eventProperties: Record<string, any> = {\n $ai_lib: 'posthog-ai',\n $ai_lib_version: version,\n $ai_trace_id: traceId,\n $ai_span_id: runId,\n $ai_span_name: run.name,\n $ai_parent_id: parentRunId,\n $ai_provider: run.provider,\n $ai_model: run.model,\n $ai_model_parameters: run.modelParams,\n $ai_input: withPrivacyMode(this.client, this.privacyMode, run.input),\n $ai_http_status: 200,\n $ai_latency: latency,\n $ai_base_url: run.baseUrl,\n $ai_framework: 'langchain',\n }\n\n if (run.tools) {\n eventProperties['$ai_tools'] = run.tools\n }\n\n if (output instanceof Error) {\n eventProperties['$ai_http_status'] = (output as any).status || 500\n eventProperties['$ai_error'] = stringifyError(output)\n eventProperties['$ai_is_error'] = true\n } else {\n // Handle token usage\n const [inputTokens, outputTokens, additionalTokenData] = this.parseUsage(output, run.provider, run.model)\n eventProperties['$ai_input_tokens'] = inputTokens\n eventProperties['$ai_output_tokens'] = outputTokens\n\n // Add additional token data to properties\n if (additionalTokenData.cacheReadInputTokens) {\n eventProperties['$ai_cache_read_input_tokens'] = additionalTokenData.cacheReadInputTokens\n }\n if (additionalTokenData.cacheWriteInputTokens) {\n eventProperties['$ai_cache_creation_input_tokens'] = additionalTokenData.cacheWriteInputTokens\n }\n if (additionalTokenData.reasoningTokens) {\n eventProperties['$ai_reasoning_tokens'] = additionalTokenData.reasoningTokens\n }\n if (additionalTokenData.webSearchCount !== undefined) {\n eventProperties['$ai_web_search_count'] = additionalTokenData.webSearchCount\n }\n\n // Extract stop reason from generation info\n const stopReason = this._extractStopReason(output)\n if (stopReason) {\n eventProperties['$ai_stop_reason'] = stopReason\n }\n\n // Handle generations/completions\n let completions\n if (output.generations && Array.isArray(output.generations)) {\n const lastGeneration = output.generations[output.generations.length - 1]\n if (Array.isArray(lastGeneration) && lastGeneration.length > 0) {\n // Check if this is a ChatGeneration by looking at the first item\n const isChatGeneration = 'message' in lastGeneration[0] && lastGeneration[0].message\n\n if (isChatGeneration) {\n // For ChatGeneration, convert messages to dict format\n completions = lastGeneration.map((gen: any) => {\n return this._convertMessageToDict(gen.message)\n })\n } else {\n // For non-ChatGeneration, extract raw response\n completions = lastGeneration.map((gen: any) => {\n return this._extractRawResponse(gen)\n })\n }\n }\n }\n\n if (completions) {\n eventProperties['$ai_output_choices'] = withPrivacyMode(this.client, this.privacyMode, completions)\n }\n }\n\n Object.assign(eventProperties, this.properties)\n if (!this.distinctId) {\n eventProperties['$process_person_profile'] = false\n }\n\n this.client.capture({\n distinctId: this.distinctId ? this.distinctId.toString() : traceId,\n event: '$ai_generation',\n properties: eventProperties,\n groups: this.groups,\n })\n }\n\n private _logDebugEvent(eventName: string, runId: string, parentRunId: string | undefined, extra: any): void {\n if (this.debug) {\n console.log(`Event: ${eventName}, runId: ${runId}, parentRunId: ${parentRunId}, extra:`, extra)\n }\n }\n\n private _getLangchainRunName(serialized: any, ...args: any): string | undefined {\n if (args && args.length > 0) {\n for (const arg of args) {\n if (arg && typeof arg === 'object' && 'name' in arg) {\n return arg.name\n } else if (arg && typeof arg === 'object' && 'runName' in arg) {\n return arg.runName\n }\n }\n }\n\n if (serialized && serialized.name) {\n return serialized.name\n }\n if (serialized && serialized.id) {\n return Array.isArray(serialized.id) ? serialized.id[serialized.id.length - 1] : serialized.id\n }\n return undefined\n }\n\n private _convertLcToolCallsToOai(toolCalls: ToolCall[]): Record<string, any>[] {\n return toolCalls.map((toolCall: ToolCall) => ({\n type: 'function',\n id: toolCall.id,\n function: {\n name: toolCall.name,\n arguments: JSON.stringify(toolCall.args),\n },\n }))\n }\n\n private _extractRawResponse(generation: any): any {\n // Extract the response from the last response of the LLM call\n // We return the text of the response if not empty\n if (generation.text != null && generation.text.trim() !== '') {\n return generation.text.trim()\n } else if (generation.message) {\n // Additional kwargs contains the response in case of tool usage\n return generation.message.additional_kwargs || generation.message.additionalKwargs || {}\n } else {\n // Not tool usage, some LLM responses can be simply empty\n return ''\n }\n }\n\n private _convertMessageToDict(message: any): Record<string, any> {\n let messageDict: Record<string, any> = {}\n\n const messageType: string = message.getType()\n\n switch (messageType) {\n case 'human':\n messageDict = { role: 'user', content: message.content }\n break\n case 'ai':\n messageDict = { role: 'assistant', content: message.content }\n\n if (message.tool_calls) {\n messageDict.tool_calls = this._convertLcToolCallsToOai(message.tool_calls)\n }\n\n break\n case 'system':\n messageDict = { role: 'system', content: message.content }\n break\n case 'tool':\n messageDict = { role: 'tool', content: message.content }\n break\n case 'function':\n messageDict = { role: 'function', content: message.content }\n break\n default:\n messageDict = { role: messageType, content: toContentString(message.content) }\n break\n }\n\n if (message.additional_kwargs) {\n messageDict = { ...messageDict, ...message.additional_kwargs }\n }\n\n // Sanitize the message content to redact base64 images\n return sanitizeLangChain(messageDict) as Record<string, any>\n }\n\n private _extractStopReason(output: LLMResult): string | undefined {\n if (!output.generations || !Array.isArray(output.generations)) {\n return undefined\n }\n const lastGeneration = output.generations[output.generations.length - 1]\n if (!Array.isArray(lastGeneration) || lastGeneration.length === 0) {\n return undefined\n }\n const gen = lastGeneration[0]\n\n // Check generationInfo for finish_reason (OpenAI format)\n if (gen.generationInfo?.finish_reason) {\n return String(gen.generationInfo.finish_reason)\n }\n\n // Check generationInfo for response_metadata.stop_reason (Anthropic format)\n if (gen.generationInfo?.response_metadata?.stop_reason) {\n return String(gen.generationInfo.response_metadata.stop_reason)\n }\n\n // Check message response_metadata for finish_reason (common LangChain format)\n if (gen.generationInfo?.response_metadata?.finish_reason) {\n return String(gen.generationInfo.response_metadata.finish_reason)\n }\n\n // Check for stop_reason directly in generationInfo\n if (gen.generationInfo?.stop_reason) {\n return String(gen.generationInfo.stop_reason)\n }\n\n return undefined\n }\n\n private _parseUsageModel(usage: any, provider?: string, model?: string): [number, number, Record<string, any>] {\n const conversionList: Array<[string, 'input' | 'output']> = [\n ['promptTokens', 'input'],\n ['completionTokens', 'output'],\n ['input_tokens', 'input'],\n ['output_tokens', 'output'],\n ['prompt_token_count', 'input'],\n ['candidates_token_count', 'output'],\n ['inputTokenCount', 'input'],\n ['outputTokenCount', 'output'],\n ['input_token_count', 'input'],\n ['generated_token_count', 'output'],\n ]\n\n const parsedUsage = conversionList.reduce(\n (acc: { input: number; output: number }, [modelKey, typeKey]) => {\n const value = usage[modelKey]\n if (value != null) {\n const finalCount = Array.isArray(value)\n ? value.reduce((sum: number, tokenCount: number) => sum + tokenCount, 0)\n : value\n acc[typeKey] = finalCount\n }\n return acc\n },\n { input: 0, output: 0 }\n )\n\n // Extract additional token details like cached tokens and reasoning tokens\n const additionalTokenData: Record<string, any> = {}\n\n // Check for cached tokens in various formats\n if (usage.prompt_tokens_details?.cached_tokens != null) {\n additionalTokenData.cacheReadInputTokens = usage.prompt_tokens_details.cached_tokens\n } else if (usage.input_token_details?.cache_read != null) {\n additionalTokenData.cacheReadInputTokens = usage.input_token_details.cache_read\n } else if (usage.cachedPromptTokens != null) {\n additionalTokenData.cacheReadInputTokens = usage.cachedPromptTokens\n } else if (usage.cache_read_input_tokens != null) {\n additionalTokenData.cacheReadInputTokens = usage.cache_read_input_tokens\n }\n\n // Check for cache write/creation tokens in various formats\n if (usage.cache_creation_input_tokens != null) {\n additionalTokenData.cacheWriteInputTokens = usage.cache_creation_input_tokens\n } else if (usage.input_token_details?.cache_creation != null) {\n additionalTokenData.cacheWriteInputTokens = usage.input_token_details.cache_creation\n }\n\n // Check for reasoning tokens in various formats\n if (usage.completion_tokens_details?.reasoning_tokens != null) {\n additionalTokenData.reasoningTokens = usage.completion_tokens_details.reasoning_tokens\n } else if (usage.output_token_details?.reasoning != null) {\n additionalTokenData.reasoningTokens = usage.output_token_details.reasoning\n } else if (usage.reasoningTokens != null) {\n additionalTokenData.reasoningTokens = usage.reasoningTokens\n }\n\n // Extract web search counts from various provider formats\n let webSearchCount: number | undefined\n\n // Priority 1: Exact Count\n // Check Anthropic format (server_tool_use.web_search_requests)\n if (usage.server_tool_use?.web_search_requests !== undefined) {\n webSearchCount = usage.server_tool_use.web_search_requests\n }\n // Priority 2: Binary Detection (1 or 0)\n // Check for citations array (Perplexity)\n else if (usage.citations && Array.isArray(usage.citations) && usage.citations.length > 0) {\n webSearchCount = 1\n }\n // Check for search_results array (Perplexity via OpenRouter)\n else if (usage.search_results && Array.isArray(usage.search_results) && usage.search_results.length > 0) {\n webSearchCount = 1\n }\n // Check for search_context_size (Perplexity via OpenRouter)\n else if (usage.search_context_size) {\n webSearchCount = 1\n }\n // Check for annotations with url_citation type\n else if (usage.annotations && Array.isArray(usage.annotations)) {\n const hasUrlCitation = usage.annotations.some((ann: unknown) => {\n return ann && typeof ann === 'object' && 'type' in ann && ann.type === 'url_citation'\n })\n\n if (hasUrlCitation) {\n webSearchCount = 1\n }\n }\n // Check Gemini format (grounding metadata - binary 0 or 1)\n else if (\n usage.grounding_metadata?.grounding_support !== undefined ||\n usage.grounding_metadata?.web_search_queries !== undefined\n ) {\n webSearchCount = 1\n }\n\n if (webSearchCount !== undefined) {\n additionalTokenData.webSearchCount = webSearchCount\n }\n\n // For Anthropic providers, LangChain reports input_tokens as the sum of all input tokens.\n // Our cost calculation expects them to be separate for Anthropic, so we subtract cache tokens.\n // Both cache_read and cache_write tokens should be subtracted since Anthropic's raw API\n // reports input_tokens as tokens NOT read from or used to create a cache.\n // For other providers (OpenAI, etc.), input_tokens already excludes cache tokens as expected.\n // Match logic consistent with plugin-server: exact match on provider OR substring match on model\n let isAnthropic = false\n if (provider && provider.toLowerCase() === 'anthropic') {\n isAnthropic = true\n } else if (model && model.toLowerCase().includes('anthropic')) {\n isAnthropic = true\n }\n\n if (isAnthropic && parsedUsage.input) {\n const cacheTokens =\n (additionalTokenData.cacheReadInputTokens || 0) + (additionalTokenData.cacheWriteInputTokens || 0)\n if (cacheTokens > 0) {\n parsedUsage.input = Math.max(parsedUsage.input - cacheTokens, 0)\n }\n }\n\n return [parsedUsage.input, parsedUsage.output, additionalTokenData]\n }\n\n private parseUsage(response: LLMResult, provider?: string, model?: string): [number, number, Record<string, any>] {\n let llmUsage: [number, number, Record<string, any>] = [0, 0, {}]\n const llmUsageKeys = ['token_usage', 'usage', 'tokenUsage']\n\n if (response.llmOutput != null) {\n const key = llmUsageKeys.find((k) => response.llmOutput?.[k] != null)\n if (key) {\n llmUsage = this._parseUsageModel(response.llmOutput[key], provider, model)\n }\n }\n\n // If top-level usage info was not found, try checking the generations.\n if (llmUsage[0] === 0 && llmUsage[1] === 0 && response.generations) {\n for (const generation of response.generations) {\n for (const genChunk of generation) {\n // Check other paths for usage information\n if (genChunk.generationInfo?.usage_metadata) {\n llmUsage = this._parseUsageModel(genChunk.generationInfo.usage_metadata, provider, model)\n return llmUsage\n }\n\n const messageChunk = genChunk.generationInfo ?? {}\n const responseMetadata = messageChunk.response_metadata ?? {}\n const chunkUsage =\n responseMetadata['usage'] ??\n responseMetadata['amazon-bedrock-invocationMetrics'] ??\n messageChunk.usage_metadata\n if (chunkUsage) {\n llmUsage = this._parseUsageModel(chunkUsage, provider, model)\n return llmUsage\n }\n }\n }\n }\n\n return llmUsage\n }\n}\n"],"names":["DATA_URL_PREFIX_RE","BASE64_ALPHABET_RE","Base64Recognizer","recognize","value","minLength","dataUrl","exec","kind","mediaType","length","confidencePrefix","slice","test","MIME_HINT_KEYS","STRONG_CONTEXT_KEYS","Set","STRONG_CONTEXT_TYPES","FILE_FAMILY_TYPES","KNOWN_AUDIO_FORMATS","MediaTypeContext","EMPTY","undefined","constructor","parent","key","inferMediaType","inferFromSiblingMime","inferFromSiblingFormat","inferFromParentType","inferFromKey","hint","v","fmt","format","has","toLowerCase","t","type","includes","signalsBinary","STRONG_CONTEXT_MIN_LENGTH","WEAK_CONTEXT_MIN_LENGTH","BinaryContentRedactor","visited","WeakSet","recognizer","redact","isMultimodalEnabled","walk","ctx","redactString","Uint8Array","placeholderFor","add","Array","isArray","map","item","obj","out","k","Object","keys","recognition","val","process","env","_INTERNAL_LLMA_MULTIMODAL","redactor","sanitizeLangChain","data","STRING_FORMAT","TextEncoder","TextDecoder","fatal","toContentString","content","JSON","stringify","String","getModelParams","params","modelParams","paramKeys","withPrivacyMode","client","privacyMode","input","privacy_mode","sanitizeValues","jsonSafe","parse","decode","encode","fromEntries","entries","DEFAULT_MAX_DEPTH","MAX_STACK_LINES","serializeError","depth","Error","name","message","stack","truncateStack","cause","stringifyError","error","lines","split","join","POSTHOG_AI_GATEWAY_HOSTS","GATEWAY_DOCS_URL","extractHost","baseURL","hasScheme","URL","hostname","isPostHogAiGatewayUrl","host","warnIfPostHogAiGateway","console","warn","LangChainCallbackHandler","BaseCallbackHandler","runs","parentTree","options","distinctId","traceId","properties","groups","debug","handleChainStart","chain","inputs","runId","parentRunId","tags","metadata","_runType","runName","_logDebugEvent","_setParentOfRun","_setTraceOrSpanMetadata","handleChainEnd","outputs","_kwargs","_logAndPopTraceOrSpan","handleChainError","handleChatModelStart","serialized","messages","extraParams","flat","m","_convertMessageToDict","_setLLMMetadata","handleLLMStart","prompts","handleLLMEnd","output","_extraParams","_logAndPopGeneration","handleLLMError","err","handleToolStart","tool","_logAndSetTraceOrSpan","handleToolEnd","handleToolError","handleRetrieverStart","retriever","query","handleRetrieverEnd","documents","handleRetrieverError","handleAgentAction","action","handleAgentEnd","_popRunAndCaptureTraceOrSpan","eventName","debugPayload","result","_popRunAndCaptureGeneration","_popParentOfRun","_findRootRun","id","args","defaultName","_getLangchainRunName","startTime","Date","now","runNameFound","generation","invocation_params","tools","ls_model_name","model","ls_provider","provider","kwargs","openai_api_base","baseUrl","_popRunMetadata","endTime","run","_getTraceId","_getParentRunId","_runId","actualParentRunId","_captureTraceOrSpan","latency","eventProperties","$ai_lib","$ai_lib_version","version","$ai_trace_id","$ai_input_state","$ai_latency","$ai_span_name","$ai_span_id","$ai_framework","assign","capture","toString","event","response","_captureGeneration","$ai_parent_id","$ai_provider","$ai_model","$ai_model_parameters","$ai_input","$ai_http_status","$ai_base_url","status","inputTokens","outputTokens","additionalTokenData","parseUsage","cacheReadInputTokens","cacheWriteInputTokens","reasoningTokens","webSearchCount","stopReason","_extractStopReason","completions","generations","lastGeneration","isChatGeneration","gen","_extractRawResponse","extra","log","arg","_convertLcToolCallsToOai","toolCalls","toolCall","function","arguments","text","trim","additional_kwargs","additionalKwargs","messageDict","messageType","getType","role","tool_calls","generationInfo","finish_reason","response_metadata","stop_reason","_parseUsageModel","usage","conversionList","parsedUsage","reduce","acc","modelKey","typeKey","finalCount","sum","tokenCount","prompt_tokens_details","cached_tokens","input_token_details","cache_read","cachedPromptTokens","cache_read_input_tokens","cache_creation_input_tokens","cache_creation","completion_tokens_details","reasoning_tokens","output_token_details","reasoning","server_tool_use","web_search_requests","citations","search_results","search_context_size","annotations","hasUrlCitation","some","ann","grounding_metadata","grounding_support","web_search_queries","isAnthropic","cacheTokens","Math","max","llmUsage","llmUsageKeys","llmOutput","find","genChunk","usage_metadata","messageChunk","responseMetadata","chunkUsage"],"mappings":"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"}
|
package/dist/openai/index.cjs
CHANGED
|
@@ -207,7 +207,7 @@ const getModelParams = params => {
|
|
|
207
207
|
return {};
|
|
208
208
|
}
|
|
209
209
|
const modelParams = {};
|
|
210
|
-
const paramKeys = ['temperature', 'max_tokens', 'max_completion_tokens', 'top_p', 'frequency_penalty', 'presence_penalty', 'n', 'stop', 'stream', 'streaming', 'language', 'response_format', 'timestamp_granularities'];
|
|
210
|
+
const paramKeys = ['temperature', 'max_tokens', 'max_completion_tokens', 'top_p', 'frequency_penalty', 'presence_penalty', 'n', 'stop', 'stream', 'streaming', 'language', 'response_format', 'timestamp_granularities', 'service_tier'];
|
|
211
211
|
for (const key of paramKeys) {
|
|
212
212
|
if (key in params && params[key] !== undefined) {
|
|
213
213
|
modelParams[key] = params[key];
|
|
@@ -534,7 +534,7 @@ function formatOpenAIResponsesInput(input, instructions) {
|
|
|
534
534
|
return messages;
|
|
535
535
|
}
|
|
536
536
|
|
|
537
|
-
var version = "8.4.
|
|
537
|
+
var version = "8.4.2";
|
|
538
538
|
|
|
539
539
|
const DEFAULT_MAX_DEPTH = 3;
|
|
540
540
|
const MAX_STACK_LINES = 20;
|
|
@@ -1394,6 +1394,9 @@ function preserveAPIPromiseHelpers(parentPromise, wrappedPromise) {
|
|
|
1394
1394
|
if (typeof parentPromise.withResponse === 'function') {
|
|
1395
1395
|
apiPromise.withResponse = async () => {
|
|
1396
1396
|
const [response, data] = await Promise.all([parentPromise.withResponse(), wrappedPromise]);
|
|
1397
|
+
// swaps the `data` payload inside the SDK's generic withResponse shape; the compiler
|
|
1398
|
+
// cannot relate the Input- and Output-instantiated conditional types
|
|
1399
|
+
// eslint-disable-next-line @typescript-eslint/consistent-type-assertions
|
|
1397
1400
|
return {
|
|
1398
1401
|
...response,
|
|
1399
1402
|
data
|