@posthog/ai 5.0.1 → 5.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","sources":["../../src/utils.ts","../../src/vercel/middleware.ts"],"sourcesContent":["import { PostHog } from 'posthog-node'\nimport { Buffer } from 'buffer'\nimport OpenAIOrignal from 'openai'\nimport AnthropicOriginal from '@anthropic-ai/sdk'\n\ntype ChatCompletionCreateParamsBase = OpenAIOrignal.Chat.Completions.ChatCompletionCreateParams\ntype MessageCreateParams = AnthropicOriginal.Messages.MessageCreateParams\n\n// limit large outputs by truncating to 200kb (approx 200k bytes)\nexport const MAX_OUTPUT_SIZE = 200000\nconst STRING_FORMAT = 'utf8'\n\nexport interface MonitoringParams {\n posthogDistinctId?: string\n posthogTraceId?: string\n posthogProperties?: Record<string, any>\n posthogPrivacyMode?: boolean\n posthogGroups?: Record<string, any>\n posthogModelOverride?: string\n posthogProviderOverride?: string\n posthogCostOverride?: CostOverride\n posthogCaptureImmediate?: boolean\n}\n\nexport interface CostOverride {\n inputCost: number\n outputCost: number\n}\n\nexport const getModelParams = (\n params: ((ChatCompletionCreateParamsBase | MessageCreateParams) & MonitoringParams) | 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 ] 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, mirroring Python's openai vs. anthropic approach.\n */\nexport const formatResponse = (response: any, provider: string): Array<{ role: string; content: string }> => {\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): Array<{ role: string; content: string }> => {\n // Example approach if \"response.content\" holds array of text segments, etc.\n const output: Array<{ role: string; content: string }> = []\n for (const choice of response.content ?? []) {\n if (choice?.text) {\n output.push({\n role: 'assistant',\n content: choice.text,\n })\n }\n }\n return output\n}\n\nexport const formatResponseOpenAI = (response: any): Array<{ role: string; content: string }> => {\n const output: Array<{ role: string; content: string }> = []\n for (const choice of response.choices ?? []) {\n if (choice.message?.content) {\n output.push({\n role: choice.message.role,\n content: choice.message.content,\n })\n }\n }\n return output\n}\n\nexport const formatResponseGemini = (response: any): Array<{ role: string; content: string }> => {\n const output: Array<{ role: string; content: string }> = []\n\n if (response.text) {\n output.push({\n role: 'assistant',\n content: response.text,\n })\n return output\n }\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 text = candidate.content.parts\n .filter((part: any) => part.text)\n .map((part: any) => part.text)\n .join('')\n if (text) {\n output.push({\n role: 'assistant',\n content: text,\n })\n }\n }\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\nexport const truncate = (str: string): string => {\n try {\n const buffer = Buffer.from(str, STRING_FORMAT)\n if (buffer.length <= MAX_OUTPUT_SIZE) {\n return str\n }\n const truncatedBuffer = buffer.slice(0, MAX_OUTPUT_SIZE)\n return `${truncatedBuffer.toString(STRING_FORMAT)}... [truncated]`\n } catch (error) {\n console.error('Error truncating, likely not a string')\n return str\n }\n}\n\nexport type SendEventToPosthogParams = {\n client: PostHog\n distinctId?: string\n traceId: string\n model: string\n provider: string\n input: any\n output: any\n latency: number\n baseURL: string\n httpStatus: number\n usage?: {\n inputTokens?: number\n outputTokens?: number\n reasoningTokens?: any\n cacheReadInputTokens?: any\n cacheCreationInputTokens?: any\n }\n params: (ChatCompletionCreateParamsBase | MessageCreateParams) & MonitoringParams\n isError?: boolean\n error?: string\n tools?: any\n captureImmediate?: boolean\n}\n\nfunction sanitizeValues(obj: any): any {\n if (obj === undefined || obj === null) {\n return obj\n }\n const jsonSafe = JSON.parse(JSON.stringify(obj))\n if (typeof jsonSafe === 'string') {\n return Buffer.from(jsonSafe, STRING_FORMAT).toString(STRING_FORMAT)\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\nexport const sendEventToPosthog = async ({\n client,\n distinctId,\n traceId,\n model,\n provider,\n input,\n output,\n latency,\n baseURL,\n params,\n httpStatus = 200,\n usage = {},\n isError = false,\n error,\n tools,\n captureImmediate = false,\n}: SendEventToPosthogParams): Promise<void> => {\n if (!client.capture) {\n return Promise.resolve()\n }\n // sanitize input and output for UTF-8 validity\n const safeInput = sanitizeValues(input)\n const safeOutput = sanitizeValues(output)\n const safeError = sanitizeValues(error)\n\n let errorData = {}\n if (isError) {\n errorData = {\n $ai_is_error: true,\n $ai_error: safeError,\n }\n }\n let costOverrideData = {}\n if (params.posthogCostOverride) {\n const inputCostUSD = (params.posthogCostOverride.inputCost ?? 0) * (usage.inputTokens ?? 0)\n const outputCostUSD = (params.posthogCostOverride.outputCost ?? 0) * (usage.outputTokens ?? 0)\n costOverrideData = {\n $ai_input_cost_usd: inputCostUSD,\n $ai_output_cost_usd: outputCostUSD,\n $ai_total_cost_usd: inputCostUSD + outputCostUSD,\n }\n }\n\n const additionalTokenValues = {\n ...(usage.reasoningTokens ? { $ai_reasoning_tokens: usage.reasoningTokens } : {}),\n ...(usage.cacheReadInputTokens ? { $ai_cache_read_input_tokens: usage.cacheReadInputTokens } : {}),\n ...(usage.cacheCreationInputTokens ? { $ai_cache_creation_input_tokens: usage.cacheCreationInputTokens } : {}),\n }\n\n const properties = {\n $ai_provider: params.posthogProviderOverride ?? provider,\n $ai_model: params.posthogModelOverride ?? model,\n $ai_model_parameters: getModelParams(params),\n $ai_input: withPrivacyMode(client, params.posthogPrivacyMode ?? false, safeInput),\n $ai_output_choices: withPrivacyMode(client, params.posthogPrivacyMode ?? false, safeOutput),\n $ai_http_status: httpStatus,\n $ai_input_tokens: usage.inputTokens ?? 0,\n $ai_output_tokens: usage.outputTokens ?? 0,\n ...additionalTokenValues,\n $ai_latency: latency,\n $ai_trace_id: traceId,\n $ai_base_url: baseURL,\n ...params.posthogProperties,\n ...(distinctId ? {} : { $process_person_profile: false }),\n ...(tools ? { $ai_tools: tools } : {}),\n ...errorData,\n ...costOverrideData,\n }\n\n const event = {\n distinctId: distinctId ?? traceId,\n event: '$ai_generation',\n properties,\n groups: params.posthogGroups,\n }\n\n if (captureImmediate) {\n // await capture promise to send single event in serverless environments\n await client.captureImmediate(event)\n } else {\n client.capture(event)\n }\n}\n","import { experimental_wrapLanguageModel as wrapLanguageModel } from 'ai'\nimport type { LanguageModelV1, LanguageModelV1Middleware, LanguageModelV1Prompt, LanguageModelV1StreamPart } from 'ai'\nimport { v4 as uuidv4 } from 'uuid'\nimport { PostHog } from 'posthog-node'\nimport { CostOverride, sendEventToPosthog, truncate, MAX_OUTPUT_SIZE } from '../utils'\nimport { Buffer } from 'buffer'\n\ninterface ClientOptions {\n posthogDistinctId?: string\n posthogTraceId?: string\n posthogProperties?: Record<string, any>\n posthogPrivacyMode?: boolean\n posthogGroups?: Record<string, any>\n posthogModelOverride?: string\n posthogProviderOverride?: string\n posthogCostOverride?: CostOverride\n posthogCaptureImmediate?: boolean\n}\n\ninterface CreateInstrumentationMiddlewareOptions {\n posthogDistinctId: string\n posthogTraceId: string\n posthogProperties?: Record<string, any>\n posthogPrivacyMode?: boolean\n posthogGroups?: Record<string, any>\n posthogModelOverride?: string\n posthogProviderOverride?: string\n posthogCostOverride?: CostOverride\n posthogCaptureImmediate?: boolean\n}\n\ninterface PostHogInput {\n role: string\n type?: string\n content?:\n | string\n | {\n [key: string]: any\n }\n}\n\nconst mapVercelParams = (params: any): Record<string, any> => {\n return {\n temperature: params.temperature,\n max_tokens: params.maxTokens,\n top_p: params.topP,\n frequency_penalty: params.frequencyPenalty,\n presence_penalty: params.presencePenalty,\n stop: params.stopSequences,\n stream: params.stream,\n }\n}\n\nconst mapVercelPrompt = (prompt: LanguageModelV1Prompt): PostHogInput[] => {\n // normalize single inputs into an array of messages\n let promptsArray: any[]\n if (typeof prompt === 'string') {\n promptsArray = [{ role: 'user', content: prompt }]\n } else if (!Array.isArray(prompt)) {\n promptsArray = [prompt]\n } else {\n promptsArray = prompt\n }\n\n // Map and truncate individual content\n const inputs: PostHogInput[] = promptsArray.map((p) => {\n let content = {}\n if (Array.isArray(p.content)) {\n content = p.content.map((c: any) => {\n if (c.type === 'text') {\n return {\n type: 'text',\n content: truncate(c.text),\n }\n } else if (c.type === 'image') {\n return {\n type: 'image',\n content: {\n // if image is a url use it, or use \"none supported\"\n image: c.image instanceof URL ? c.image.toString() : 'raw images not supported',\n mimeType: c.mimeType,\n },\n }\n } else if (c.type === 'file') {\n return {\n type: 'file',\n content: {\n file: c.data instanceof URL ? c.data.toString() : 'raw files not supported',\n mimeType: c.mimeType,\n },\n }\n } else if (c.type === 'tool-call') {\n return {\n type: 'tool-call',\n content: {\n toolCallId: c.toolCallId,\n toolName: c.toolName,\n args: c.args,\n },\n }\n } else if (c.type === 'tool-result') {\n return {\n type: 'tool-result',\n content: {\n toolCallId: c.toolCallId,\n toolName: c.toolName,\n result: c.result,\n isError: c.isError,\n },\n }\n }\n return {\n content: '',\n }\n })\n } else {\n content = {\n type: 'text',\n text: truncate(p.content),\n }\n }\n return {\n role: p.role,\n content,\n }\n })\n try {\n // Trim the inputs array until its JSON size fits within MAX_OUTPUT_SIZE\n let serialized = JSON.stringify(inputs)\n let removedCount = 0\n // We need to keep track of the initial size of the inputs array because we're going to be mutating it\n const initialSize = inputs.length\n for (let i = 0; i < initialSize && Buffer.byteLength(serialized, 'utf8') > MAX_OUTPUT_SIZE; i++) {\n inputs.shift()\n removedCount++\n serialized = JSON.stringify(inputs)\n }\n if (removedCount > 0) {\n // Add one placeholder to indicate how many were removed\n inputs.unshift({\n role: 'posthog',\n content: `[${removedCount} message${removedCount === 1 ? '' : 's'} removed due to size limit]`,\n })\n }\n } catch (error) {\n console.error('Error stringifying inputs', error)\n return [{ role: 'posthog', content: 'An error occurred while processing your request. Please try again.' }]\n }\n return inputs\n}\n\nconst mapVercelOutput = (result: any): PostHogInput[] => {\n // normalize string results to object\n const normalizedResult = typeof result === 'string' ? { text: result } : result\n const output = {\n ...(normalizedResult.text ? { text: normalizedResult.text } : {}),\n ...(normalizedResult.object ? { object: normalizedResult.object } : {}),\n ...(normalizedResult.reasoning ? { reasoning: normalizedResult.reasoning } : {}),\n ...(normalizedResult.response ? { response: normalizedResult.response } : {}),\n ...(normalizedResult.finishReason ? { finishReason: normalizedResult.finishReason } : {}),\n ...(normalizedResult.usage ? { usage: normalizedResult.usage } : {}),\n ...(normalizedResult.warnings ? { warnings: normalizedResult.warnings } : {}),\n ...(normalizedResult.providerMetadata ? { toolCalls: normalizedResult.providerMetadata } : {}),\n ...(normalizedResult.files\n ? {\n files: normalizedResult.files.map((file: any) => ({\n name: file.name,\n size: file.size,\n type: file.type,\n })),\n }\n : {}),\n }\n if (output.text && !output.object && !output.reasoning) {\n return [{ content: truncate(output.text as string), role: 'assistant' }]\n }\n // otherwise stringify and truncate\n try {\n const jsonOutput = JSON.stringify(output)\n return [{ content: truncate(jsonOutput), role: 'assistant' }]\n } catch (error) {\n console.error('Error stringifying output')\n return []\n }\n}\n\nconst extractProvider = (model: LanguageModelV1): string => {\n const provider = model.provider.toLowerCase()\n const providerName = provider.split('.')[0]\n return providerName\n}\n\nexport const createInstrumentationMiddleware = (\n phClient: PostHog,\n model: LanguageModelV1,\n options: CreateInstrumentationMiddlewareOptions\n): LanguageModelV1Middleware => {\n const middleware: LanguageModelV1Middleware = {\n wrapGenerate: async ({ doGenerate, params }) => {\n const startTime = Date.now()\n const mergedParams = {\n ...options,\n ...mapVercelParams(params),\n }\n try {\n const result = await doGenerate()\n const latency = (Date.now() - startTime) / 1000\n const modelId =\n options.posthogModelOverride ?? (result.response?.modelId ? result.response.modelId : model.modelId)\n const provider = options.posthogProviderOverride ?? extractProvider(model)\n const baseURL = '' // cannot currently get baseURL from vercel\n const content = mapVercelOutput(result)\n // let tools = result.toolCalls\n const providerMetadata = result.providerMetadata\n const additionalTokenValues = {\n ...(providerMetadata?.openai?.reasoningTokens\n ? { reasoningTokens: providerMetadata.openai.reasoningTokens }\n : {}),\n ...(providerMetadata?.openai?.cachedPromptTokens\n ? { cacheReadInputTokens: providerMetadata.openai.cachedPromptTokens }\n : {}),\n ...(providerMetadata?.anthropic\n ? {\n cacheReadInputTokens: providerMetadata.anthropic.cacheReadInputTokens,\n cacheCreationInputTokens: providerMetadata.anthropic.cacheCreationInputTokens,\n }\n : {}),\n }\n await sendEventToPosthog({\n client: phClient,\n distinctId: options.posthogDistinctId,\n traceId: options.posthogTraceId,\n model: modelId,\n provider: provider,\n input: options.posthogPrivacyMode ? '' : mapVercelPrompt(params.prompt),\n output: [{ content, role: 'assistant' }],\n latency,\n baseURL,\n params: mergedParams as any,\n httpStatus: 200,\n usage: {\n inputTokens: result.usage.promptTokens,\n outputTokens: result.usage.completionTokens,\n ...additionalTokenValues,\n },\n captureImmediate: options.posthogCaptureImmediate,\n })\n\n return result\n } catch (error: any) {\n const modelId = model.modelId\n await sendEventToPosthog({\n client: phClient,\n distinctId: options.posthogDistinctId,\n traceId: options.posthogTraceId,\n model: modelId,\n provider: model.provider,\n input: options.posthogPrivacyMode ? '' : mapVercelPrompt(params.prompt),\n output: [],\n latency: 0,\n baseURL: '',\n params: mergedParams as any,\n httpStatus: error?.status ? error.status : 500,\n usage: {\n inputTokens: 0,\n outputTokens: 0,\n },\n isError: true,\n error: truncate(JSON.stringify(error)),\n captureImmediate: options.posthogCaptureImmediate,\n })\n throw error\n }\n },\n\n wrapStream: async ({ doStream, params }) => {\n const startTime = Date.now()\n let generatedText = ''\n let usage: {\n inputTokens?: number\n outputTokens?: number\n reasoningTokens?: any\n cacheReadInputTokens?: any\n cacheCreationInputTokens?: any\n } = {}\n const mergedParams = {\n ...options,\n ...mapVercelParams(params),\n }\n\n const modelId = options.posthogModelOverride ?? model.modelId\n const provider = options.posthogProviderOverride ?? extractProvider(model)\n const baseURL = '' // cannot currently get baseURL from vercel\n try {\n const { stream, ...rest } = await doStream()\n const transformStream = new TransformStream<LanguageModelV1StreamPart, LanguageModelV1StreamPart>({\n transform(chunk, controller) {\n if (chunk.type === 'text-delta') {\n generatedText += chunk.textDelta\n }\n if (chunk.type === 'finish') {\n usage = {\n inputTokens: chunk.usage?.promptTokens,\n outputTokens: chunk.usage?.completionTokens,\n }\n if (chunk.providerMetadata?.openai?.reasoningTokens) {\n usage.reasoningTokens = chunk.providerMetadata.openai.reasoningTokens\n }\n if (chunk.providerMetadata?.openai?.cachedPromptTokens) {\n usage.cacheReadInputTokens = chunk.providerMetadata.openai.cachedPromptTokens\n }\n if (chunk.providerMetadata?.anthropic?.cacheReadInputTokens) {\n usage.cacheReadInputTokens = chunk.providerMetadata.anthropic.cacheReadInputTokens\n }\n if (chunk.providerMetadata?.anthropic?.cacheCreationInputTokens) {\n usage.cacheCreationInputTokens = chunk.providerMetadata.anthropic.cacheCreationInputTokens\n }\n }\n controller.enqueue(chunk)\n },\n\n flush: async () => {\n const latency = (Date.now() - startTime) / 1000\n await sendEventToPosthog({\n client: phClient,\n distinctId: options.posthogDistinctId,\n traceId: options.posthogTraceId,\n model: modelId,\n provider: provider,\n input: options.posthogPrivacyMode ? '' : mapVercelPrompt(params.prompt),\n output: [{ content: generatedText, role: 'assistant' }],\n latency,\n baseURL,\n params: mergedParams as any,\n httpStatus: 200,\n usage,\n captureImmediate: options.posthogCaptureImmediate,\n })\n },\n })\n\n return {\n stream: stream.pipeThrough(transformStream),\n ...rest,\n }\n } catch (error: any) {\n await sendEventToPosthog({\n client: phClient,\n distinctId: options.posthogDistinctId,\n traceId: options.posthogTraceId,\n model: modelId,\n provider: provider,\n input: options.posthogPrivacyMode ? '' : mapVercelPrompt(params.prompt),\n output: [],\n latency: 0,\n baseURL: '',\n params: mergedParams as any,\n httpStatus: error?.status ? error.status : 500,\n usage: {\n inputTokens: 0,\n outputTokens: 0,\n },\n isError: true,\n error: truncate(JSON.stringify(error)),\n captureImmediate: options.posthogCaptureImmediate,\n })\n throw error\n }\n },\n }\n\n return middleware\n}\n\nexport const wrapVercelLanguageModel = (\n model: LanguageModelV1,\n phClient: PostHog,\n options: ClientOptions\n): LanguageModelV1 => {\n const traceId = options.posthogTraceId ?? uuidv4()\n const middleware = createInstrumentationMiddleware(phClient, model, {\n ...options,\n posthogTraceId: traceId,\n posthogDistinctId: options.posthogDistinctId ?? traceId,\n })\n\n const wrappedModel = wrapLanguageModel({\n model,\n middleware,\n })\n\n return wrappedModel\n}\n"],"names":["MAX_OUTPUT_SIZE","STRING_FORMAT","getModelParams","params","modelParams","paramKeys","key","undefined","withPrivacyMode","client","privacyMode","input","privacy_mode","truncate","str","buffer","Buffer","from","length","truncatedBuffer","slice","toString","error","console","sanitizeValues","obj","jsonSafe","JSON","parse","stringify","Array","isArray","map","Object","fromEntries","entries","k","v","sendEventToPosthog","distinctId","traceId","model","provider","output","latency","baseURL","httpStatus","usage","isError","tools","captureImmediate","capture","Promise","resolve","safeInput","safeOutput","safeError","errorData","$ai_is_error","$ai_error","costOverrideData","posthogCostOverride","inputCostUSD","inputCost","inputTokens","outputCostUSD","outputCost","outputTokens","$ai_input_cost_usd","$ai_output_cost_usd","$ai_total_cost_usd","additionalTokenValues","reasoningTokens","$ai_reasoning_tokens","cacheReadInputTokens","$ai_cache_read_input_tokens","cacheCreationInputTokens","$ai_cache_creation_input_tokens","properties","$ai_provider","posthogProviderOverride","$ai_model","posthogModelOverride","$ai_model_parameters","$ai_input","posthogPrivacyMode","$ai_output_choices","$ai_http_status","$ai_input_tokens","$ai_output_tokens","$ai_latency","$ai_trace_id","$ai_base_url","posthogProperties","$process_person_profile","$ai_tools","event","groups","posthogGroups","mapVercelParams","temperature","max_tokens","maxTokens","top_p","topP","frequency_penalty","frequencyPenalty","presence_penalty","presencePenalty","stop","stopSequences","stream","mapVercelPrompt","prompt","promptsArray","role","content","inputs","p","c","type","text","image","URL","mimeType","file","data","toolCallId","toolName","args","result","serialized","removedCount","initialSize","i","byteLength","shift","unshift","mapVercelOutput","normalizedResult","object","reasoning","response","finishReason","warnings","providerMetadata","toolCalls","files","name","size","jsonOutput","extractProvider","toLowerCase","providerName","split","createInstrumentationMiddleware","phClient","options","middleware","wrapGenerate","doGenerate","startTime","Date","now","mergedParams","modelId","openai","cachedPromptTokens","anthropic","posthogDistinctId","posthogTraceId","promptTokens","completionTokens","posthogCaptureImmediate","status","wrapStream","doStream","generatedText","rest","transformStream","TransformStream","transform","chunk","controller","textDelta","enqueue","flush","pipeThrough","wrapVercelLanguageModel","uuidv4","wrappedModel","wrapLanguageModel"],"mappings":"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"}
1
+ {"version":3,"file":"index.mjs","sources":["../../src/utils.ts","../../src/vercel/middleware.ts"],"sourcesContent":["import { PostHog } from 'posthog-node'\nimport { Buffer } from 'buffer'\nimport OpenAIOrignal from 'openai'\nimport AnthropicOriginal from '@anthropic-ai/sdk'\n\ntype ChatCompletionCreateParamsBase = OpenAIOrignal.Chat.Completions.ChatCompletionCreateParams\ntype MessageCreateParams = AnthropicOriginal.Messages.MessageCreateParams\ntype ResponseCreateParams = OpenAIOrignal.Responses.ResponseCreateParams\n\n// limit large outputs by truncating to 200kb (approx 200k bytes)\nexport const MAX_OUTPUT_SIZE = 200000\nconst STRING_FORMAT = 'utf8'\n\nexport interface MonitoringParams {\n posthogDistinctId?: string\n posthogTraceId?: string\n posthogProperties?: Record<string, any>\n posthogPrivacyMode?: boolean\n posthogGroups?: Record<string, any>\n posthogModelOverride?: string\n posthogProviderOverride?: string\n posthogCostOverride?: CostOverride\n posthogCaptureImmediate?: boolean\n}\n\nexport interface CostOverride {\n inputCost: number\n outputCost: number\n}\n\nexport const getModelParams = (\n params: ((ChatCompletionCreateParamsBase | MessageCreateParams | ResponseCreateParams) & MonitoringParams) | 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 ] 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, mirroring Python's openai vs. anthropic approach.\n */\nexport const formatResponse = (response: any, provider: string): Array<{ role: string; content: string }> => {\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): Array<{ role: string; content: string }> => {\n // Example approach if \"response.content\" holds array of text segments, etc.\n const output: Array<{ role: string; content: string }> = []\n for (const choice of response.content ?? []) {\n if (choice?.text) {\n output.push({\n role: 'assistant',\n content: choice.text,\n })\n }\n }\n return output\n}\n\nexport const formatResponseOpenAI = (response: any): Array<{ role: string; content: string }> => {\n const output: Array<{ role: string; content: string }> = []\n for (const choice of response.choices ?? []) {\n if (choice.message?.content) {\n output.push({\n role: choice.message.role,\n content: choice.message.content,\n })\n }\n }\n return output\n}\n\nexport const formatResponseGemini = (response: any): Array<{ role: string; content: string }> => {\n const output: Array<{ role: string; content: string }> = []\n\n if (response.text) {\n output.push({\n role: 'assistant',\n content: response.text,\n })\n return output\n }\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 text = candidate.content.parts\n .filter((part: any) => part.text)\n .map((part: any) => part.text)\n .join('')\n if (text) {\n output.push({\n role: 'assistant',\n content: text,\n })\n }\n }\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\nexport const truncate = (str: string): string => {\n try {\n const buffer = Buffer.from(str, STRING_FORMAT)\n if (buffer.length <= MAX_OUTPUT_SIZE) {\n return str\n }\n const truncatedBuffer = buffer.slice(0, MAX_OUTPUT_SIZE)\n return `${truncatedBuffer.toString(STRING_FORMAT)}... [truncated]`\n } catch (error) {\n console.error('Error truncating, likely not a string')\n return str\n }\n}\n\nexport type SendEventToPosthogParams = {\n client: PostHog\n distinctId?: string\n traceId: string\n model: string\n provider: string\n input: any\n output: any\n latency: number\n baseURL: string\n httpStatus: number\n usage?: {\n inputTokens?: number\n outputTokens?: number\n reasoningTokens?: any\n cacheReadInputTokens?: any\n cacheCreationInputTokens?: any\n }\n params: (ChatCompletionCreateParamsBase | MessageCreateParams | ResponseCreateParams) & MonitoringParams\n isError?: boolean\n error?: string\n tools?: any\n captureImmediate?: boolean\n}\n\nfunction sanitizeValues(obj: any): any {\n if (obj === undefined || obj === null) {\n return obj\n }\n const jsonSafe = JSON.parse(JSON.stringify(obj))\n if (typeof jsonSafe === 'string') {\n return Buffer.from(jsonSafe, STRING_FORMAT).toString(STRING_FORMAT)\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\nexport const sendEventToPosthog = async ({\n client,\n distinctId,\n traceId,\n model,\n provider,\n input,\n output,\n latency,\n baseURL,\n params,\n httpStatus = 200,\n usage = {},\n isError = false,\n error,\n tools,\n captureImmediate = false,\n}: SendEventToPosthogParams): Promise<void> => {\n if (!client.capture) {\n return Promise.resolve()\n }\n // sanitize input and output for UTF-8 validity\n const safeInput = sanitizeValues(input)\n const safeOutput = sanitizeValues(output)\n const safeError = sanitizeValues(error)\n\n let errorData = {}\n if (isError) {\n errorData = {\n $ai_is_error: true,\n $ai_error: safeError,\n }\n }\n let costOverrideData = {}\n if (params.posthogCostOverride) {\n const inputCostUSD = (params.posthogCostOverride.inputCost ?? 0) * (usage.inputTokens ?? 0)\n const outputCostUSD = (params.posthogCostOverride.outputCost ?? 0) * (usage.outputTokens ?? 0)\n costOverrideData = {\n $ai_input_cost_usd: inputCostUSD,\n $ai_output_cost_usd: outputCostUSD,\n $ai_total_cost_usd: inputCostUSD + outputCostUSD,\n }\n }\n\n const additionalTokenValues = {\n ...(usage.reasoningTokens ? { $ai_reasoning_tokens: usage.reasoningTokens } : {}),\n ...(usage.cacheReadInputTokens ? { $ai_cache_read_input_tokens: usage.cacheReadInputTokens } : {}),\n ...(usage.cacheCreationInputTokens ? { $ai_cache_creation_input_tokens: usage.cacheCreationInputTokens } : {}),\n }\n\n const properties = {\n $ai_provider: params.posthogProviderOverride ?? provider,\n $ai_model: params.posthogModelOverride ?? model,\n $ai_model_parameters: getModelParams(params),\n $ai_input: withPrivacyMode(client, params.posthogPrivacyMode ?? false, safeInput),\n $ai_output_choices: withPrivacyMode(client, params.posthogPrivacyMode ?? false, safeOutput),\n $ai_http_status: httpStatus,\n $ai_input_tokens: usage.inputTokens ?? 0,\n $ai_output_tokens: usage.outputTokens ?? 0,\n ...additionalTokenValues,\n $ai_latency: latency,\n $ai_trace_id: traceId,\n $ai_base_url: baseURL,\n ...params.posthogProperties,\n ...(distinctId ? {} : { $process_person_profile: false }),\n ...(tools ? { $ai_tools: tools } : {}),\n ...errorData,\n ...costOverrideData,\n }\n\n const event = {\n distinctId: distinctId ?? traceId,\n event: '$ai_generation',\n properties,\n groups: params.posthogGroups,\n }\n\n if (captureImmediate) {\n // await capture promise to send single event in serverless environments\n await client.captureImmediate(event)\n } else {\n client.capture(event)\n }\n}\n","import { experimental_wrapLanguageModel as wrapLanguageModel } from 'ai'\nimport type { LanguageModelV1, LanguageModelV1Middleware, LanguageModelV1Prompt, LanguageModelV1StreamPart } from 'ai'\nimport { v4 as uuidv4 } from 'uuid'\nimport { PostHog } from 'posthog-node'\nimport { CostOverride, sendEventToPosthog, truncate, MAX_OUTPUT_SIZE } from '../utils'\nimport { Buffer } from 'buffer'\n\ninterface ClientOptions {\n posthogDistinctId?: string\n posthogTraceId?: string\n posthogProperties?: Record<string, any>\n posthogPrivacyMode?: boolean\n posthogGroups?: Record<string, any>\n posthogModelOverride?: string\n posthogProviderOverride?: string\n posthogCostOverride?: CostOverride\n posthogCaptureImmediate?: boolean\n}\n\ninterface CreateInstrumentationMiddlewareOptions {\n posthogDistinctId: string\n posthogTraceId: string\n posthogProperties?: Record<string, any>\n posthogPrivacyMode?: boolean\n posthogGroups?: Record<string, any>\n posthogModelOverride?: string\n posthogProviderOverride?: string\n posthogCostOverride?: CostOverride\n posthogCaptureImmediate?: boolean\n}\n\ninterface PostHogInput {\n role: string\n type?: string\n content?:\n | string\n | {\n [key: string]: any\n }\n}\n\nconst mapVercelParams = (params: any): Record<string, any> => {\n return {\n temperature: params.temperature,\n max_tokens: params.maxTokens,\n top_p: params.topP,\n frequency_penalty: params.frequencyPenalty,\n presence_penalty: params.presencePenalty,\n stop: params.stopSequences,\n stream: params.stream,\n }\n}\n\nconst mapVercelPrompt = (prompt: LanguageModelV1Prompt): PostHogInput[] => {\n // normalize single inputs into an array of messages\n let promptsArray: any[]\n if (typeof prompt === 'string') {\n promptsArray = [{ role: 'user', content: prompt }]\n } else if (!Array.isArray(prompt)) {\n promptsArray = [prompt]\n } else {\n promptsArray = prompt\n }\n\n // Map and truncate individual content\n const inputs: PostHogInput[] = promptsArray.map((p) => {\n let content = {}\n if (Array.isArray(p.content)) {\n content = p.content.map((c: any) => {\n if (c.type === 'text') {\n return {\n type: 'text',\n content: truncate(c.text),\n }\n } else if (c.type === 'image') {\n return {\n type: 'image',\n content: {\n // if image is a url use it, or use \"none supported\"\n image: c.image instanceof URL ? c.image.toString() : 'raw images not supported',\n mimeType: c.mimeType,\n },\n }\n } else if (c.type === 'file') {\n return {\n type: 'file',\n content: {\n file: c.data instanceof URL ? c.data.toString() : 'raw files not supported',\n mimeType: c.mimeType,\n },\n }\n } else if (c.type === 'tool-call') {\n return {\n type: 'tool-call',\n content: {\n toolCallId: c.toolCallId,\n toolName: c.toolName,\n args: c.args,\n },\n }\n } else if (c.type === 'tool-result') {\n return {\n type: 'tool-result',\n content: {\n toolCallId: c.toolCallId,\n toolName: c.toolName,\n result: c.result,\n isError: c.isError,\n },\n }\n }\n return {\n content: '',\n }\n })\n } else {\n content = {\n type: 'text',\n text: truncate(p.content),\n }\n }\n return {\n role: p.role,\n content,\n }\n })\n try {\n // Trim the inputs array until its JSON size fits within MAX_OUTPUT_SIZE\n let serialized = JSON.stringify(inputs)\n let removedCount = 0\n // We need to keep track of the initial size of the inputs array because we're going to be mutating it\n const initialSize = inputs.length\n for (let i = 0; i < initialSize && Buffer.byteLength(serialized, 'utf8') > MAX_OUTPUT_SIZE; i++) {\n inputs.shift()\n removedCount++\n serialized = JSON.stringify(inputs)\n }\n if (removedCount > 0) {\n // Add one placeholder to indicate how many were removed\n inputs.unshift({\n role: 'posthog',\n content: `[${removedCount} message${removedCount === 1 ? '' : 's'} removed due to size limit]`,\n })\n }\n } catch (error) {\n console.error('Error stringifying inputs', error)\n return [{ role: 'posthog', content: 'An error occurred while processing your request. Please try again.' }]\n }\n return inputs\n}\n\nconst mapVercelOutput = (result: any): PostHogInput[] => {\n // normalize string results to object\n const normalizedResult = typeof result === 'string' ? { text: result } : result\n const output = {\n ...(normalizedResult.text ? { text: normalizedResult.text } : {}),\n ...(normalizedResult.object ? { object: normalizedResult.object } : {}),\n ...(normalizedResult.reasoning ? { reasoning: normalizedResult.reasoning } : {}),\n ...(normalizedResult.response ? { response: normalizedResult.response } : {}),\n ...(normalizedResult.finishReason ? { finishReason: normalizedResult.finishReason } : {}),\n ...(normalizedResult.usage ? { usage: normalizedResult.usage } : {}),\n ...(normalizedResult.warnings ? { warnings: normalizedResult.warnings } : {}),\n ...(normalizedResult.providerMetadata ? { toolCalls: normalizedResult.providerMetadata } : {}),\n ...(normalizedResult.files\n ? {\n files: normalizedResult.files.map((file: any) => ({\n name: file.name,\n size: file.size,\n type: file.type,\n })),\n }\n : {}),\n }\n if (output.text && !output.object && !output.reasoning) {\n return [{ content: truncate(output.text as string), role: 'assistant' }]\n }\n // otherwise stringify and truncate\n try {\n const jsonOutput = JSON.stringify(output)\n return [{ content: truncate(jsonOutput), role: 'assistant' }]\n } catch (error) {\n console.error('Error stringifying output')\n return []\n }\n}\n\nconst extractProvider = (model: LanguageModelV1): string => {\n const provider = model.provider.toLowerCase()\n const providerName = provider.split('.')[0]\n return providerName\n}\n\nexport const createInstrumentationMiddleware = (\n phClient: PostHog,\n model: LanguageModelV1,\n options: CreateInstrumentationMiddlewareOptions\n): LanguageModelV1Middleware => {\n const middleware: LanguageModelV1Middleware = {\n wrapGenerate: async ({ doGenerate, params }) => {\n const startTime = Date.now()\n const mergedParams = {\n ...options,\n ...mapVercelParams(params),\n }\n try {\n const result = await doGenerate()\n const latency = (Date.now() - startTime) / 1000\n const modelId =\n options.posthogModelOverride ?? (result.response?.modelId ? result.response.modelId : model.modelId)\n const provider = options.posthogProviderOverride ?? extractProvider(model)\n const baseURL = '' // cannot currently get baseURL from vercel\n const content = mapVercelOutput(result)\n // let tools = result.toolCalls\n const providerMetadata = result.providerMetadata\n const additionalTokenValues = {\n ...(providerMetadata?.openai?.reasoningTokens\n ? { reasoningTokens: providerMetadata.openai.reasoningTokens }\n : {}),\n ...(providerMetadata?.openai?.cachedPromptTokens\n ? { cacheReadInputTokens: providerMetadata.openai.cachedPromptTokens }\n : {}),\n ...(providerMetadata?.anthropic\n ? {\n cacheReadInputTokens: providerMetadata.anthropic.cacheReadInputTokens,\n cacheCreationInputTokens: providerMetadata.anthropic.cacheCreationInputTokens,\n }\n : {}),\n }\n await sendEventToPosthog({\n client: phClient,\n distinctId: options.posthogDistinctId,\n traceId: options.posthogTraceId,\n model: modelId,\n provider: provider,\n input: options.posthogPrivacyMode ? '' : mapVercelPrompt(params.prompt),\n output: [{ content, role: 'assistant' }],\n latency,\n baseURL,\n params: mergedParams as any,\n httpStatus: 200,\n usage: {\n inputTokens: result.usage.promptTokens,\n outputTokens: result.usage.completionTokens,\n ...additionalTokenValues,\n },\n captureImmediate: options.posthogCaptureImmediate,\n })\n\n return result\n } catch (error: any) {\n const modelId = model.modelId\n await sendEventToPosthog({\n client: phClient,\n distinctId: options.posthogDistinctId,\n traceId: options.posthogTraceId,\n model: modelId,\n provider: model.provider,\n input: options.posthogPrivacyMode ? '' : mapVercelPrompt(params.prompt),\n output: [],\n latency: 0,\n baseURL: '',\n params: mergedParams as any,\n httpStatus: error?.status ? error.status : 500,\n usage: {\n inputTokens: 0,\n outputTokens: 0,\n },\n isError: true,\n error: truncate(JSON.stringify(error)),\n captureImmediate: options.posthogCaptureImmediate,\n })\n throw error\n }\n },\n\n wrapStream: async ({ doStream, params }) => {\n const startTime = Date.now()\n let generatedText = ''\n let usage: {\n inputTokens?: number\n outputTokens?: number\n reasoningTokens?: any\n cacheReadInputTokens?: any\n cacheCreationInputTokens?: any\n } = {}\n const mergedParams = {\n ...options,\n ...mapVercelParams(params),\n }\n\n const modelId = options.posthogModelOverride ?? model.modelId\n const provider = options.posthogProviderOverride ?? extractProvider(model)\n const baseURL = '' // cannot currently get baseURL from vercel\n try {\n const { stream, ...rest } = await doStream()\n const transformStream = new TransformStream<LanguageModelV1StreamPart, LanguageModelV1StreamPart>({\n transform(chunk, controller) {\n if (chunk.type === 'text-delta') {\n generatedText += chunk.textDelta\n }\n if (chunk.type === 'finish') {\n usage = {\n inputTokens: chunk.usage?.promptTokens,\n outputTokens: chunk.usage?.completionTokens,\n }\n if (chunk.providerMetadata?.openai?.reasoningTokens) {\n usage.reasoningTokens = chunk.providerMetadata.openai.reasoningTokens\n }\n if (chunk.providerMetadata?.openai?.cachedPromptTokens) {\n usage.cacheReadInputTokens = chunk.providerMetadata.openai.cachedPromptTokens\n }\n if (chunk.providerMetadata?.anthropic?.cacheReadInputTokens) {\n usage.cacheReadInputTokens = chunk.providerMetadata.anthropic.cacheReadInputTokens\n }\n if (chunk.providerMetadata?.anthropic?.cacheCreationInputTokens) {\n usage.cacheCreationInputTokens = chunk.providerMetadata.anthropic.cacheCreationInputTokens\n }\n }\n controller.enqueue(chunk)\n },\n\n flush: async () => {\n const latency = (Date.now() - startTime) / 1000\n await sendEventToPosthog({\n client: phClient,\n distinctId: options.posthogDistinctId,\n traceId: options.posthogTraceId,\n model: modelId,\n provider: provider,\n input: options.posthogPrivacyMode ? '' : mapVercelPrompt(params.prompt),\n output: [{ content: generatedText, role: 'assistant' }],\n latency,\n baseURL,\n params: mergedParams as any,\n httpStatus: 200,\n usage,\n captureImmediate: options.posthogCaptureImmediate,\n })\n },\n })\n\n return {\n stream: stream.pipeThrough(transformStream),\n ...rest,\n }\n } catch (error: any) {\n await sendEventToPosthog({\n client: phClient,\n distinctId: options.posthogDistinctId,\n traceId: options.posthogTraceId,\n model: modelId,\n provider: provider,\n input: options.posthogPrivacyMode ? '' : mapVercelPrompt(params.prompt),\n output: [],\n latency: 0,\n baseURL: '',\n params: mergedParams as any,\n httpStatus: error?.status ? error.status : 500,\n usage: {\n inputTokens: 0,\n outputTokens: 0,\n },\n isError: true,\n error: truncate(JSON.stringify(error)),\n captureImmediate: options.posthogCaptureImmediate,\n })\n throw error\n }\n },\n }\n\n return middleware\n}\n\nexport const wrapVercelLanguageModel = (\n model: LanguageModelV1,\n phClient: PostHog,\n options: ClientOptions\n): LanguageModelV1 => {\n const traceId = options.posthogTraceId ?? uuidv4()\n const middleware = createInstrumentationMiddleware(phClient, model, {\n ...options,\n posthogTraceId: traceId,\n posthogDistinctId: options.posthogDistinctId ?? traceId,\n })\n\n const wrappedModel = wrapLanguageModel({\n model,\n middleware,\n })\n\n return wrappedModel\n}\n"],"names":["MAX_OUTPUT_SIZE","STRING_FORMAT","getModelParams","params","modelParams","paramKeys","key","undefined","withPrivacyMode","client","privacyMode","input","privacy_mode","truncate","str","buffer","Buffer","from","length","truncatedBuffer","slice","toString","error","console","sanitizeValues","obj","jsonSafe","JSON","parse","stringify","Array","isArray","map","Object","fromEntries","entries","k","v","sendEventToPosthog","distinctId","traceId","model","provider","output","latency","baseURL","httpStatus","usage","isError","tools","captureImmediate","capture","Promise","resolve","safeInput","safeOutput","safeError","errorData","$ai_is_error","$ai_error","costOverrideData","posthogCostOverride","inputCostUSD","inputCost","inputTokens","outputCostUSD","outputCost","outputTokens","$ai_input_cost_usd","$ai_output_cost_usd","$ai_total_cost_usd","additionalTokenValues","reasoningTokens","$ai_reasoning_tokens","cacheReadInputTokens","$ai_cache_read_input_tokens","cacheCreationInputTokens","$ai_cache_creation_input_tokens","properties","$ai_provider","posthogProviderOverride","$ai_model","posthogModelOverride","$ai_model_parameters","$ai_input","posthogPrivacyMode","$ai_output_choices","$ai_http_status","$ai_input_tokens","$ai_output_tokens","$ai_latency","$ai_trace_id","$ai_base_url","posthogProperties","$process_person_profile","$ai_tools","event","groups","posthogGroups","mapVercelParams","temperature","max_tokens","maxTokens","top_p","topP","frequency_penalty","frequencyPenalty","presence_penalty","presencePenalty","stop","stopSequences","stream","mapVercelPrompt","prompt","promptsArray","role","content","inputs","p","c","type","text","image","URL","mimeType","file","data","toolCallId","toolName","args","result","serialized","removedCount","initialSize","i","byteLength","shift","unshift","mapVercelOutput","normalizedResult","object","reasoning","response","finishReason","warnings","providerMetadata","toolCalls","files","name","size","jsonOutput","extractProvider","toLowerCase","providerName","split","createInstrumentationMiddleware","phClient","options","middleware","wrapGenerate","doGenerate","startTime","Date","now","mergedParams","modelId","openai","cachedPromptTokens","anthropic","posthogDistinctId","posthogTraceId","promptTokens","completionTokens","posthogCaptureImmediate","status","wrapStream","doStream","generatedText","rest","transformStream","TransformStream","transform","chunk","controller","textDelta","enqueue","flush","pipeThrough","wrapVercelLanguageModel","uuidv4","wrappedModel","wrapLanguageModel"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@posthog/ai",
3
- "version": "5.0.1",
3
+ "version": "5.1.0",
4
4
  "description": "PostHog Node.js AI integrations",
5
5
  "repository": {
6
6
  "type": "git",
@@ -35,7 +35,7 @@
35
35
  "@langchain/core": "^0.3.37",
36
36
  "ai": "^4.1.0",
37
37
  "langchain": "^0.3.15",
38
- "openai": "^4.0.0",
38
+ "openai": "^5.0.0",
39
39
  "uuid": "^11.0.5",
40
40
  "zod": "^3.24.1"
41
41
  },
@@ -2,14 +2,18 @@ import OpenAIOrignal, { AzureOpenAI } from 'openai'
2
2
  import { PostHog } from 'posthog-node'
3
3
  import { v4 as uuidv4 } from 'uuid'
4
4
  import { formatResponseOpenAI, MonitoringParams, sendEventToPosthog } from '../utils'
5
+ import type { APIPromise } from 'openai'
6
+ import type { Stream } from 'openai/streaming'
7
+ import type { ParsedResponse } from 'openai/resources/responses/responses'
5
8
 
6
9
  type ChatCompletion = OpenAIOrignal.ChatCompletion
7
10
  type ChatCompletionChunk = OpenAIOrignal.ChatCompletionChunk
8
11
  type ChatCompletionCreateParamsBase = OpenAIOrignal.Chat.Completions.ChatCompletionCreateParams
9
12
  type ChatCompletionCreateParamsNonStreaming = OpenAIOrignal.Chat.Completions.ChatCompletionCreateParamsNonStreaming
10
13
  type ChatCompletionCreateParamsStreaming = OpenAIOrignal.Chat.Completions.ChatCompletionCreateParamsStreaming
11
- import type { APIPromise, RequestOptions } from 'openai/core'
12
- import type { Stream } from 'openai/streaming'
14
+ type ResponsesCreateParamsBase = OpenAIOrignal.Responses.ResponseCreateParams
15
+ type ResponsesCreateParamsNonStreaming = OpenAIOrignal.Responses.ResponseCreateParamsNonStreaming
16
+ type ResponsesCreateParamsStreaming = OpenAIOrignal.Responses.ResponseCreateParamsStreaming
13
17
 
14
18
  interface MonitoringOpenAIConfig {
15
19
  apiKey: string
@@ -17,6 +21,8 @@ interface MonitoringOpenAIConfig {
17
21
  baseURL?: string
18
22
  }
19
23
 
24
+ type RequestOptions = Record<string, any>
25
+
20
26
  export class PostHogAzureOpenAI extends AzureOpenAI {
21
27
  private readonly phClient: PostHog
22
28
  public chat: WrappedChat
@@ -82,32 +88,30 @@ export class WrappedCompletions extends AzureOpenAI.Chat.Completions {
82
88
 
83
89
  const traceId = posthogTraceId ?? uuidv4()
84
90
  const startTime = Date.now()
91
+
85
92
  const parentPromise = super.create(openAIParams, options)
86
93
 
87
94
  if (openAIParams.stream) {
88
95
  return parentPromise.then((value) => {
89
- let accumulatedContent = ''
90
- let usage: {
91
- inputTokens: number
92
- outputTokens: number
93
- reasoningTokens?: number
94
- cacheReadInputTokens?: number
95
- } = {
96
- inputTokens: 0,
97
- outputTokens: 0,
98
- }
99
- let model = openAIParams.model
100
96
  if ('tee' in value) {
101
97
  const [stream1, stream2] = value.tee()
102
98
  ;(async () => {
103
99
  try {
100
+ let accumulatedContent = ''
101
+ let usage: {
102
+ inputTokens?: number
103
+ outputTokens?: number
104
+ reasoningTokens?: number
105
+ cacheReadInputTokens?: number
106
+ } = {
107
+ inputTokens: 0,
108
+ outputTokens: 0,
109
+ }
110
+
104
111
  for await (const chunk of stream1) {
105
112
  const delta = chunk?.choices?.[0]?.delta?.content ?? ''
106
113
  accumulatedContent += delta
107
114
  if (chunk.usage) {
108
- if (chunk.model != model) {
109
- model = chunk.model
110
- }
111
115
  usage = {
112
116
  inputTokens: chunk.usage.prompt_tokens ?? 0,
113
117
  outputTokens: chunk.usage.completion_tokens ?? 0,
@@ -116,12 +120,13 @@ export class WrappedCompletions extends AzureOpenAI.Chat.Completions {
116
120
  }
117
121
  }
118
122
  }
123
+
119
124
  const latency = (Date.now() - startTime) / 1000
120
125
  await sendEventToPosthog({
121
126
  client: this.phClient,
122
127
  distinctId: posthogDistinctId ?? traceId,
123
128
  traceId,
124
- model,
129
+ model: openAIParams.model,
125
130
  provider: 'azure',
126
131
  input: openAIParams.messages,
127
132
  output: [{ content: accumulatedContent, role: 'assistant' }],
@@ -133,23 +138,19 @@ export class WrappedCompletions extends AzureOpenAI.Chat.Completions {
133
138
  captureImmediate: posthogCaptureImmediate,
134
139
  })
135
140
  } catch (error: any) {
136
- // error handling
137
141
  await sendEventToPosthog({
138
142
  client: this.phClient,
139
143
  distinctId: posthogDistinctId ?? traceId,
140
144
  traceId,
141
- model,
145
+ model: openAIParams.model,
142
146
  provider: 'azure',
143
147
  input: openAIParams.messages,
144
- output: JSON.stringify(error),
148
+ output: [],
145
149
  latency: 0,
146
150
  baseURL: (this as any).baseURL ?? '',
147
151
  params: body,
148
152
  httpStatus: error?.status ? error.status : 500,
149
- usage: {
150
- inputTokens: 0,
151
- outputTokens: 0,
152
- },
153
+ usage: { inputTokens: 0, outputTokens: 0 },
153
154
  isError: true,
154
155
  error: JSON.stringify(error),
155
156
  captureImmediate: posthogCaptureImmediate,
@@ -167,15 +168,11 @@ export class WrappedCompletions extends AzureOpenAI.Chat.Completions {
167
168
  async (result) => {
168
169
  if ('choices' in result) {
169
170
  const latency = (Date.now() - startTime) / 1000
170
- let model = openAIParams.model
171
- if (result.model != model) {
172
- model = result.model
173
- }
174
171
  await sendEventToPosthog({
175
172
  client: this.phClient,
176
173
  distinctId: posthogDistinctId ?? traceId,
177
174
  traceId,
178
- model,
175
+ model: openAIParams.model,
179
176
  provider: 'azure',
180
177
  input: openAIParams.messages,
181
178
  output: formatResponseOpenAI(result),
@@ -224,4 +221,261 @@ export class WrappedCompletions extends AzureOpenAI.Chat.Completions {
224
221
  }
225
222
  }
226
223
 
224
+ export class WrappedResponses extends AzureOpenAI.Responses {
225
+ private readonly phClient: PostHog
226
+
227
+ constructor(client: AzureOpenAI, phClient: PostHog) {
228
+ super(client)
229
+ this.phClient = phClient
230
+ }
231
+
232
+ // --- Overload #1: Non-streaming
233
+ public create(
234
+ body: ResponsesCreateParamsNonStreaming & MonitoringParams,
235
+ options?: RequestOptions
236
+ ): APIPromise<OpenAIOrignal.Responses.Response>
237
+
238
+ // --- Overload #2: Streaming
239
+ public create(
240
+ body: ResponsesCreateParamsStreaming & MonitoringParams,
241
+ options?: RequestOptions
242
+ ): APIPromise<Stream<OpenAIOrignal.Responses.ResponseStreamEvent>>
243
+
244
+ // --- Overload #3: Generic base
245
+ public create(
246
+ body: ResponsesCreateParamsBase & MonitoringParams,
247
+ options?: RequestOptions
248
+ ): APIPromise<OpenAIOrignal.Responses.Response | Stream<OpenAIOrignal.Responses.ResponseStreamEvent>>
249
+
250
+ // --- Implementation Signature
251
+ public create(
252
+ body: ResponsesCreateParamsBase & MonitoringParams,
253
+ options?: RequestOptions
254
+ ): APIPromise<OpenAIOrignal.Responses.Response | Stream<OpenAIOrignal.Responses.ResponseStreamEvent>> {
255
+ const {
256
+ posthogDistinctId,
257
+ posthogTraceId,
258
+ posthogProperties,
259
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
260
+ posthogPrivacyMode = false,
261
+ posthogGroups,
262
+ posthogCaptureImmediate,
263
+ ...openAIParams
264
+ } = body
265
+
266
+ const traceId = posthogTraceId ?? uuidv4()
267
+ const startTime = Date.now()
268
+
269
+ const parentPromise = super.create(openAIParams, options)
270
+
271
+ if (openAIParams.stream) {
272
+ return parentPromise.then((value) => {
273
+ if ('tee' in value && typeof (value as any).tee === 'function') {
274
+ const [stream1, stream2] = (value as any).tee()
275
+ ;(async () => {
276
+ try {
277
+ let finalContent: any[] = []
278
+ let usage: {
279
+ inputTokens?: number
280
+ outputTokens?: number
281
+ reasoningTokens?: number
282
+ cacheReadInputTokens?: number
283
+ } = {
284
+ inputTokens: 0,
285
+ outputTokens: 0,
286
+ }
287
+
288
+ for await (const chunk of stream1) {
289
+ if (
290
+ chunk.type === 'response.completed' &&
291
+ 'response' in chunk &&
292
+ chunk.response?.output &&
293
+ chunk.response.output.length > 0
294
+ ) {
295
+ finalContent = chunk.response.output
296
+ }
297
+ if ('usage' in chunk && chunk.usage) {
298
+ usage = {
299
+ inputTokens: chunk.usage.input_tokens ?? 0,
300
+ outputTokens: chunk.usage.output_tokens ?? 0,
301
+ reasoningTokens: chunk.usage.output_tokens_details?.reasoning_tokens ?? 0,
302
+ cacheReadInputTokens: chunk.usage.input_tokens_details?.cached_tokens ?? 0,
303
+ }
304
+ }
305
+ }
306
+
307
+ const latency = (Date.now() - startTime) / 1000
308
+ await sendEventToPosthog({
309
+ client: this.phClient,
310
+ distinctId: posthogDistinctId ?? traceId,
311
+ traceId,
312
+ model: openAIParams.model,
313
+ provider: 'azure',
314
+ input: openAIParams.input,
315
+ output: finalContent,
316
+ latency,
317
+ baseURL: (this as any).baseURL ?? '',
318
+ params: body,
319
+ httpStatus: 200,
320
+ usage,
321
+ captureImmediate: posthogCaptureImmediate,
322
+ })
323
+ } catch (error: any) {
324
+ await sendEventToPosthog({
325
+ client: this.phClient,
326
+ distinctId: posthogDistinctId ?? traceId,
327
+ traceId,
328
+ model: openAIParams.model,
329
+ provider: 'azure',
330
+ input: openAIParams.input,
331
+ output: [],
332
+ latency: 0,
333
+ baseURL: (this as any).baseURL ?? '',
334
+ params: body,
335
+ httpStatus: error?.status ? error.status : 500,
336
+ usage: { inputTokens: 0, outputTokens: 0 },
337
+ isError: true,
338
+ error: JSON.stringify(error),
339
+ captureImmediate: posthogCaptureImmediate,
340
+ })
341
+ }
342
+ })()
343
+
344
+ return stream2
345
+ }
346
+ return value
347
+ }) as APIPromise<Stream<OpenAIOrignal.Responses.ResponseStreamEvent>>
348
+ } else {
349
+ const wrappedPromise = parentPromise.then(
350
+ async (result) => {
351
+ if ('output' in result) {
352
+ const latency = (Date.now() - startTime) / 1000
353
+ await sendEventToPosthog({
354
+ client: this.phClient,
355
+ distinctId: posthogDistinctId ?? traceId,
356
+ traceId,
357
+ model: openAIParams.model,
358
+ provider: 'azure',
359
+ input: openAIParams.input,
360
+ output: result.output,
361
+ latency,
362
+ baseURL: (this as any).baseURL ?? '',
363
+ params: body,
364
+ httpStatus: 200,
365
+ usage: {
366
+ inputTokens: result.usage?.input_tokens ?? 0,
367
+ outputTokens: result.usage?.output_tokens ?? 0,
368
+ reasoningTokens: result.usage?.output_tokens_details?.reasoning_tokens ?? 0,
369
+ cacheReadInputTokens: result.usage?.input_tokens_details?.cached_tokens ?? 0,
370
+ },
371
+ captureImmediate: posthogCaptureImmediate,
372
+ })
373
+ }
374
+ return result
375
+ },
376
+ async (error: any) => {
377
+ await sendEventToPosthog({
378
+ client: this.phClient,
379
+ distinctId: posthogDistinctId ?? traceId,
380
+ traceId,
381
+ model: openAIParams.model,
382
+ provider: 'azure',
383
+ input: openAIParams.input,
384
+ output: [],
385
+ latency: 0,
386
+ baseURL: (this as any).baseURL ?? '',
387
+ params: body,
388
+ httpStatus: error?.status ? error.status : 500,
389
+ usage: {
390
+ inputTokens: 0,
391
+ outputTokens: 0,
392
+ },
393
+ isError: true,
394
+ error: JSON.stringify(error),
395
+ captureImmediate: posthogCaptureImmediate,
396
+ })
397
+ throw error
398
+ }
399
+ ) as APIPromise<OpenAIOrignal.Responses.Response>
400
+
401
+ return wrappedPromise
402
+ }
403
+ }
404
+
405
+ public parse<Params extends OpenAIOrignal.Responses.ResponseCreateParams, ParsedT = any>(
406
+ body: Params & MonitoringParams,
407
+ options?: RequestOptions
408
+ ): APIPromise<ParsedResponse<ParsedT>> {
409
+ const {
410
+ posthogDistinctId,
411
+ posthogTraceId,
412
+ posthogProperties,
413
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
414
+ posthogPrivacyMode = false,
415
+ posthogGroups,
416
+ posthogCaptureImmediate,
417
+ ...openAIParams
418
+ } = body
419
+
420
+ const traceId = posthogTraceId ?? uuidv4()
421
+ const startTime = Date.now()
422
+
423
+ const parentPromise = super.parse(openAIParams, options)
424
+
425
+ const wrappedPromise = parentPromise.then(
426
+ async (result) => {
427
+ const latency = (Date.now() - startTime) / 1000
428
+ await sendEventToPosthog({
429
+ client: this.phClient,
430
+ distinctId: posthogDistinctId ?? traceId,
431
+ traceId,
432
+ model: openAIParams.model,
433
+ provider: 'azure',
434
+ input: openAIParams.input,
435
+ output: result.output,
436
+ latency,
437
+ baseURL: (this as any).baseURL ?? '',
438
+ params: body,
439
+ httpStatus: 200,
440
+ usage: {
441
+ inputTokens: result.usage?.input_tokens ?? 0,
442
+ outputTokens: result.usage?.output_tokens ?? 0,
443
+ reasoningTokens: result.usage?.output_tokens_details?.reasoning_tokens ?? 0,
444
+ cacheReadInputTokens: result.usage?.input_tokens_details?.cached_tokens ?? 0,
445
+ },
446
+ captureImmediate: posthogCaptureImmediate,
447
+ })
448
+ return result
449
+ },
450
+ async (error: any) => {
451
+ await sendEventToPosthog({
452
+ client: this.phClient,
453
+ distinctId: posthogDistinctId ?? traceId,
454
+ traceId,
455
+ model: openAIParams.model,
456
+ provider: 'azure',
457
+ input: openAIParams.input,
458
+ output: [],
459
+ latency: 0,
460
+ baseURL: (this as any).baseURL ?? '',
461
+ params: body,
462
+ httpStatus: error?.status ? error.status : 500,
463
+ usage: {
464
+ inputTokens: 0,
465
+ outputTokens: 0,
466
+ },
467
+ isError: true,
468
+ error: JSON.stringify(error),
469
+ captureImmediate: posthogCaptureImmediate,
470
+ })
471
+ throw error
472
+ }
473
+ )
474
+
475
+ return wrappedPromise as APIPromise<ParsedResponse<ParsedT>>
476
+ }
477
+ }
478
+
227
479
  export default PostHogAzureOpenAI
480
+
481
+ export { PostHogAzureOpenAI as OpenAI }