@posthog/ai 5.2.3 → 6.0.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.
- package/dist/anthropic/index.cjs +37 -5
- package/dist/anthropic/index.cjs.map +1 -1
- package/dist/anthropic/index.mjs +37 -5
- package/dist/anthropic/index.mjs.map +1 -1
- package/dist/gemini/index.cjs +67 -25
- package/dist/gemini/index.cjs.map +1 -1
- package/dist/gemini/index.d.ts +0 -1
- package/dist/gemini/index.mjs +67 -25
- package/dist/gemini/index.mjs.map +1 -1
- package/dist/index.cjs +329 -123
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +3 -3
- package/dist/index.mjs +330 -124
- package/dist/index.mjs.map +1 -1
- package/dist/langchain/index.cjs +29 -9
- package/dist/langchain/index.cjs.map +1 -1
- package/dist/langchain/index.d.ts +1 -0
- package/dist/langchain/index.mjs +29 -9
- package/dist/langchain/index.mjs.map +1 -1
- package/dist/openai/index.cjs +106 -5
- package/dist/openai/index.cjs.map +1 -1
- package/dist/openai/index.mjs +106 -5
- package/dist/openai/index.mjs.map +1 -1
- package/dist/vercel/index.cjs +117 -80
- package/dist/vercel/index.cjs.map +1 -1
- package/dist/vercel/index.d.ts +2 -2
- package/dist/vercel/index.mjs +118 -81
- package/dist/vercel/index.mjs.map +1 -1
- package/package.json +6 -5
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","sources":["../../src/utils.ts","../../src/openai/index.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 { OpenAI as OpenAIOrignal, ClientOptions } from 'openai'\nimport { PostHog } from 'posthog-node'\nimport { v4 as uuidv4 } from 'uuid'\nimport { formatResponseOpenAI, MonitoringParams, sendEventToPosthog } from '../utils'\nimport type { APIPromise } from 'openai'\nimport type { Stream } from 'openai/streaming'\nimport type { ParsedResponse } from 'openai/resources/responses/responses'\n\nconst Chat = OpenAIOrignal.Chat\nconst Completions = Chat.Completions\nconst Responses = OpenAIOrignal.Responses\n\ntype ChatCompletion = OpenAIOrignal.ChatCompletion\ntype ChatCompletionChunk = OpenAIOrignal.ChatCompletionChunk\ntype ChatCompletionCreateParamsBase = OpenAIOrignal.Chat.Completions.ChatCompletionCreateParams\ntype ChatCompletionCreateParamsNonStreaming = OpenAIOrignal.Chat.Completions.ChatCompletionCreateParamsNonStreaming\ntype ChatCompletionCreateParamsStreaming = OpenAIOrignal.Chat.Completions.ChatCompletionCreateParamsStreaming\ntype ResponsesCreateParamsBase = OpenAIOrignal.Responses.ResponseCreateParams\ntype ResponsesCreateParamsNonStreaming = OpenAIOrignal.Responses.ResponseCreateParamsNonStreaming\ntype ResponsesCreateParamsStreaming = OpenAIOrignal.Responses.ResponseCreateParamsStreaming\n\ninterface MonitoringOpenAIConfig extends ClientOptions {\n apiKey: string\n posthog: PostHog\n baseURL?: string\n}\n\ntype RequestOptions = Record<string, any>\n\nexport class PostHogOpenAI extends OpenAIOrignal {\n private readonly phClient: PostHog\n public chat: WrappedChat\n public responses: WrappedResponses\n\n constructor(config: MonitoringOpenAIConfig) {\n const { posthog, ...openAIConfig } = config\n super(openAIConfig)\n this.phClient = posthog\n this.chat = new WrappedChat(this, this.phClient)\n this.responses = new WrappedResponses(this, this.phClient)\n }\n}\n\nexport class WrappedChat extends Chat {\n constructor(parentClient: PostHogOpenAI, phClient: PostHog) {\n super(parentClient)\n this.completions = new WrappedCompletions(parentClient, phClient)\n }\n\n public completions: WrappedCompletions\n}\n\nexport class WrappedCompletions extends Completions {\n private readonly phClient: PostHog\n\n constructor(client: OpenAIOrignal, phClient: PostHog) {\n super(client)\n this.phClient = phClient\n }\n\n // --- Overload #1: Non-streaming\n public create(\n body: ChatCompletionCreateParamsNonStreaming & MonitoringParams,\n options?: RequestOptions\n ): APIPromise<ChatCompletion>\n\n // --- Overload #2: Streaming\n public create(\n body: ChatCompletionCreateParamsStreaming & MonitoringParams,\n options?: RequestOptions\n ): APIPromise<Stream<ChatCompletionChunk>>\n\n // --- Overload #3: Generic base\n public create(\n body: ChatCompletionCreateParamsBase & MonitoringParams,\n options?: RequestOptions\n ): APIPromise<ChatCompletion | Stream<ChatCompletionChunk>>\n\n // --- Implementation Signature\n public create(\n body: ChatCompletionCreateParamsBase & MonitoringParams,\n options?: RequestOptions\n ): APIPromise<ChatCompletion | Stream<ChatCompletionChunk>> {\n const {\n posthogDistinctId,\n posthogTraceId,\n posthogProperties,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n posthogPrivacyMode = false,\n posthogGroups,\n posthogCaptureImmediate,\n ...openAIParams\n } = body\n\n const traceId = posthogTraceId ?? uuidv4()\n const startTime = Date.now()\n\n const parentPromise = super.create(openAIParams, options)\n\n if (openAIParams.stream) {\n return parentPromise.then((value) => {\n if ('tee' in value) {\n const [stream1, stream2] = value.tee()\n ;(async () => {\n try {\n let accumulatedContent = ''\n let usage: {\n inputTokens?: number\n outputTokens?: number\n reasoningTokens?: number\n cacheReadInputTokens?: number\n } = {\n inputTokens: 0,\n outputTokens: 0,\n }\n\n for await (const chunk of stream1) {\n const delta = chunk?.choices?.[0]?.delta?.content ?? ''\n accumulatedContent += delta\n if (chunk.usage) {\n usage = {\n inputTokens: chunk.usage.prompt_tokens ?? 0,\n outputTokens: chunk.usage.completion_tokens ?? 0,\n reasoningTokens: chunk.usage.completion_tokens_details?.reasoning_tokens ?? 0,\n cacheReadInputTokens: chunk.usage.prompt_tokens_details?.cached_tokens ?? 0,\n }\n }\n }\n\n const latency = (Date.now() - startTime) / 1000\n await sendEventToPosthog({\n client: this.phClient,\n distinctId: posthogDistinctId,\n traceId,\n model: openAIParams.model,\n provider: 'openai',\n input: openAIParams.messages,\n output: [{ content: accumulatedContent, role: 'assistant' }],\n latency,\n baseURL: (this as any).baseURL ?? '',\n params: body,\n httpStatus: 200,\n usage,\n captureImmediate: posthogCaptureImmediate,\n })\n } catch (error: any) {\n await sendEventToPosthog({\n client: this.phClient,\n distinctId: posthogDistinctId,\n traceId,\n model: openAIParams.model,\n provider: 'openai',\n input: openAIParams.messages,\n output: [],\n latency: 0,\n baseURL: (this as any).baseURL ?? '',\n params: body,\n httpStatus: error?.status ? error.status : 500,\n usage: { inputTokens: 0, outputTokens: 0 },\n isError: true,\n error: JSON.stringify(error),\n captureImmediate: posthogCaptureImmediate,\n })\n }\n })()\n\n // Return the other stream to the user\n return stream2\n }\n return value\n }) as APIPromise<Stream<ChatCompletionChunk>>\n } else {\n const wrappedPromise = parentPromise.then(\n async (result) => {\n if ('choices' in result) {\n const latency = (Date.now() - startTime) / 1000\n await sendEventToPosthog({\n client: this.phClient,\n distinctId: posthogDistinctId,\n traceId,\n model: openAIParams.model,\n provider: 'openai',\n input: openAIParams.messages,\n output: formatResponseOpenAI(result),\n latency,\n baseURL: (this as any).baseURL ?? '',\n params: body,\n httpStatus: 200,\n usage: {\n inputTokens: result.usage?.prompt_tokens ?? 0,\n outputTokens: result.usage?.completion_tokens ?? 0,\n reasoningTokens: result.usage?.completion_tokens_details?.reasoning_tokens ?? 0,\n cacheReadInputTokens: result.usage?.prompt_tokens_details?.cached_tokens ?? 0,\n },\n captureImmediate: posthogCaptureImmediate,\n })\n }\n return result\n },\n async (error: any) => {\n await sendEventToPosthog({\n client: this.phClient,\n distinctId: posthogDistinctId,\n traceId,\n model: openAIParams.model,\n provider: 'openai',\n input: openAIParams.messages,\n output: [],\n latency: 0,\n baseURL: (this as any).baseURL ?? '',\n params: body,\n httpStatus: error?.status ? error.status : 500,\n usage: {\n inputTokens: 0,\n outputTokens: 0,\n },\n isError: true,\n error: JSON.stringify(error),\n captureImmediate: posthogCaptureImmediate,\n })\n throw error\n }\n ) as APIPromise<ChatCompletion>\n\n return wrappedPromise\n }\n }\n}\n\nexport class WrappedResponses extends Responses {\n private readonly phClient: PostHog\n\n constructor(client: OpenAIOrignal, phClient: PostHog) {\n super(client)\n this.phClient = phClient\n }\n\n // --- Overload #1: Non-streaming\n public create(\n body: ResponsesCreateParamsNonStreaming & MonitoringParams,\n options?: RequestOptions\n ): APIPromise<OpenAIOrignal.Responses.Response>\n\n // --- Overload #2: Streaming\n public create(\n body: ResponsesCreateParamsStreaming & MonitoringParams,\n options?: RequestOptions\n ): APIPromise<Stream<OpenAIOrignal.Responses.ResponseStreamEvent>>\n\n // --- Overload #3: Generic base\n public create(\n body: ResponsesCreateParamsBase & MonitoringParams,\n options?: RequestOptions\n ): APIPromise<OpenAIOrignal.Responses.Response | Stream<OpenAIOrignal.Responses.ResponseStreamEvent>>\n\n // --- Implementation Signature\n public create(\n body: ResponsesCreateParamsBase & MonitoringParams,\n options?: RequestOptions\n ): APIPromise<OpenAIOrignal.Responses.Response | Stream<OpenAIOrignal.Responses.ResponseStreamEvent>> {\n const {\n posthogDistinctId,\n posthogTraceId,\n posthogProperties,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n posthogPrivacyMode = false,\n posthogGroups,\n posthogCaptureImmediate,\n ...openAIParams\n } = body\n\n const traceId = posthogTraceId ?? uuidv4()\n const startTime = Date.now()\n\n const parentPromise = super.create(openAIParams, options)\n\n if (openAIParams.stream) {\n return parentPromise.then((value) => {\n if ('tee' in value && typeof (value as any).tee === 'function') {\n const [stream1, stream2] = (value as any).tee()\n ;(async () => {\n try {\n let finalContent: any[] = []\n let usage: {\n inputTokens?: number\n outputTokens?: number\n reasoningTokens?: number\n cacheReadInputTokens?: number\n } = {\n inputTokens: 0,\n outputTokens: 0,\n }\n\n for await (const chunk of stream1) {\n if (\n chunk.type === 'response.completed' &&\n 'response' in chunk &&\n chunk.response?.output &&\n chunk.response.output.length > 0\n ) {\n finalContent = chunk.response.output\n }\n if ('response' in chunk && chunk.response?.usage) {\n usage = {\n inputTokens: chunk.response.usage.input_tokens ?? 0,\n outputTokens: chunk.response.usage.output_tokens ?? 0,\n reasoningTokens: chunk.response.usage.output_tokens_details?.reasoning_tokens ?? 0,\n cacheReadInputTokens: chunk.response.usage.input_tokens_details?.cached_tokens ?? 0,\n }\n }\n }\n\n const latency = (Date.now() - startTime) / 1000\n await sendEventToPosthog({\n client: this.phClient,\n distinctId: posthogDistinctId,\n traceId,\n //@ts-expect-error\n model: openAIParams.model,\n provider: 'openai',\n input: openAIParams.input,\n output: finalContent,\n latency,\n baseURL: (this as any).baseURL ?? '',\n params: body,\n httpStatus: 200,\n usage,\n captureImmediate: posthogCaptureImmediate,\n })\n } catch (error: any) {\n await sendEventToPosthog({\n client: this.phClient,\n distinctId: posthogDistinctId,\n traceId,\n //@ts-expect-error\n model: openAIParams.model,\n provider: 'openai',\n input: openAIParams.input,\n output: [],\n latency: 0,\n baseURL: (this as any).baseURL ?? '',\n params: body,\n httpStatus: error?.status ? error.status : 500,\n usage: { inputTokens: 0, outputTokens: 0 },\n isError: true,\n error: JSON.stringify(error),\n captureImmediate: posthogCaptureImmediate,\n })\n }\n })()\n\n return stream2\n }\n return value\n }) as APIPromise<Stream<OpenAIOrignal.Responses.ResponseStreamEvent>>\n } else {\n const wrappedPromise = parentPromise.then(\n async (result) => {\n if ('output' in result) {\n const latency = (Date.now() - startTime) / 1000\n await sendEventToPosthog({\n client: this.phClient,\n distinctId: posthogDistinctId,\n traceId,\n //@ts-expect-error\n model: openAIParams.model,\n provider: 'openai',\n input: openAIParams.input,\n output: result.output,\n latency,\n baseURL: (this as any).baseURL ?? '',\n params: body,\n httpStatus: 200,\n usage: {\n inputTokens: result.usage?.input_tokens ?? 0,\n outputTokens: result.usage?.output_tokens ?? 0,\n reasoningTokens: result.usage?.output_tokens_details?.reasoning_tokens ?? 0,\n cacheReadInputTokens: result.usage?.input_tokens_details?.cached_tokens ?? 0,\n },\n captureImmediate: posthogCaptureImmediate,\n })\n }\n return result\n },\n async (error: any) => {\n await sendEventToPosthog({\n client: this.phClient,\n distinctId: posthogDistinctId,\n traceId,\n //@ts-expect-error\n model: openAIParams.model,\n provider: 'openai',\n input: openAIParams.input,\n output: [],\n latency: 0,\n baseURL: (this as any).baseURL ?? '',\n params: body,\n httpStatus: error?.status ? error.status : 500,\n usage: {\n inputTokens: 0,\n outputTokens: 0,\n },\n isError: true,\n error: JSON.stringify(error),\n captureImmediate: posthogCaptureImmediate,\n })\n throw error\n }\n ) as APIPromise<OpenAIOrignal.Responses.Response>\n\n return wrappedPromise\n }\n }\n\n public parse<Params extends ResponsesCreateParamsBase, ParsedT = any>(\n body: Params & MonitoringParams,\n options?: RequestOptions\n ): APIPromise<ParsedResponse<ParsedT>> {\n const {\n posthogDistinctId,\n posthogTraceId,\n posthogProperties,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n posthogPrivacyMode = false,\n posthogGroups,\n posthogCaptureImmediate,\n ...openAIParams\n } = body\n\n const traceId = posthogTraceId ?? uuidv4()\n const startTime = Date.now()\n\n // Create a temporary instance that bypasses our wrapped create method\n const originalCreate = super.create.bind(this)\n const originalSelf = this as any\n const tempCreate = originalSelf.create\n originalSelf.create = originalCreate\n\n try {\n const parentPromise = super.parse(openAIParams, options)\n\n const wrappedPromise = parentPromise.then(\n async (result) => {\n const latency = (Date.now() - startTime) / 1000\n await sendEventToPosthog({\n client: this.phClient,\n distinctId: posthogDistinctId,\n traceId,\n //@ts-expect-error\n model: openAIParams.model,\n provider: 'openai',\n input: openAIParams.input,\n output: result.output,\n latency,\n baseURL: (this as any).baseURL ?? '',\n params: body,\n httpStatus: 200,\n usage: {\n inputTokens: result.usage?.input_tokens ?? 0,\n outputTokens: result.usage?.output_tokens ?? 0,\n reasoningTokens: result.usage?.output_tokens_details?.reasoning_tokens ?? 0,\n cacheReadInputTokens: result.usage?.input_tokens_details?.cached_tokens ?? 0,\n },\n captureImmediate: posthogCaptureImmediate,\n })\n return result\n },\n async (error: any) => {\n await sendEventToPosthog({\n client: this.phClient,\n distinctId: posthogDistinctId,\n traceId,\n //@ts-expect-error\n model: openAIParams.model,\n provider: 'openai',\n input: openAIParams.input,\n output: [],\n latency: 0,\n baseURL: (this as any).baseURL ?? '',\n params: body,\n httpStatus: error?.status ? error.status : 500,\n usage: {\n inputTokens: 0,\n outputTokens: 0,\n },\n isError: true,\n error: JSON.stringify(error),\n captureImmediate: posthogCaptureImmediate,\n })\n throw error\n }\n )\n\n return wrappedPromise as APIPromise<ParsedResponse<ParsedT>>\n } finally {\n // Restore our wrapped create method\n originalSelf.create = tempCreate\n }\n }\n}\n\nexport default PostHogOpenAI\n\nexport { PostHogOpenAI as OpenAI }\n"],"names":["STRING_FORMAT","getModelParams","params","modelParams","paramKeys","key","undefined","formatResponseOpenAI","response","output","choice","choices","message","content","push","role","withPrivacyMode","client","privacyMode","input","privacy_mode","sanitizeValues","obj","jsonSafe","JSON","parse","stringify","Buffer","from","toString","Array","isArray","map","Object","fromEntries","entries","k","v","sendEventToPosthog","distinctId","traceId","model","provider","latency","baseURL","httpStatus","usage","isError","error","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","Chat","OpenAIOrignal","Completions","Responses","PostHogOpenAI","constructor","config","posthog","openAIConfig","phClient","chat","WrappedChat","responses","WrappedResponses","parentClient","completions","WrappedCompletions","create","body","options","posthogDistinctId","posthogTraceId","posthogCaptureImmediate","openAIParams","uuidv4","startTime","Date","now","parentPromise","stream","then","value","stream1","stream2","tee","accumulatedContent","chunk","delta","prompt_tokens","completion_tokens","completion_tokens_details","reasoning_tokens","prompt_tokens_details","cached_tokens","messages","status","wrappedPromise","result","finalContent","type","length","input_tokens","output_tokens","output_tokens_details","input_tokens_details","originalCreate","bind","originalSelf","tempCreate"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.mjs","sources":["../../src/utils.ts","../../src/openai/index.ts"],"sourcesContent":["import { PostHog } from 'posthog-node'\nimport { Buffer } from 'buffer'\nimport OpenAIOrignal from 'openai'\nimport AnthropicOriginal from '@anthropic-ai/sdk'\nimport type { ChatCompletionTool } from 'openai/resources/chat/completions'\nimport type { Tool as GeminiTool } from '@google/genai'\nimport type { FormattedMessage, FormattedContent, TokenUsage } from './types'\n\ntype ChatCompletionCreateParamsBase = OpenAIOrignal.Chat.Completions.ChatCompletionCreateParams\ntype MessageCreateParams = AnthropicOriginal.Messages.MessageCreateParams\ntype ResponseCreateParams = OpenAIOrignal.Responses.ResponseCreateParams\ntype AnthropicTool = AnthropicOriginal.Tool\n\n// limit large outputs by truncating to 200kb (approx 200k bytes)\nexport const MAX_OUTPUT_SIZE = 200000\nconst STRING_FORMAT = 'utf8'\n\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): 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\n if (content.length > 0) {\n output.push({\n role,\n content,\n })\n }\n }\n }\n\n // Handle Responses API format\n if (response.output) {\n const content: FormattedContent = []\n let role = 'assistant'\n\n for (const item of response.output) {\n if (item.type === 'message') {\n role = item.role\n\n if (item.content && Array.isArray(item.content)) {\n for (const contentItem of item.content) {\n if (contentItem.type === 'output_text' && contentItem.text) {\n content.push({ type: 'text', text: contentItem.text })\n } else if (contentItem.text) {\n content.push({ type: 'text', text: contentItem.text })\n } else if (contentItem.type === 'input_image' && contentItem.image_url) {\n content.push({\n type: 'image',\n image: contentItem.image_url,\n })\n }\n }\n } else if (item.content) {\n content.push({ type: 'text', text: String(item.content) })\n }\n } else if (item.type === 'function_call') {\n content.push({\n type: 'function',\n id: item.call_id || item.id || '',\n function: {\n name: item.name,\n arguments: item.arguments || {},\n },\n })\n }\n }\n\n if (content.length > 0) {\n output.push({\n role,\n content,\n })\n }\n }\n\n return output\n}\n\nexport const formatResponseGemini = (response: any): FormattedMessage[] => {\n const output: FormattedMessage[] = []\n\n if (response.candidates && Array.isArray(response.candidates)) {\n for (const candidate of response.candidates) {\n if (candidate.content && candidate.content.parts) {\n const content: FormattedContent = []\n\n for (const part of candidate.content.parts) {\n if (part.text) {\n content.push({ type: 'text', text: part.text })\n } else if (part.functionCall) {\n content.push({\n type: 'function',\n function: {\n name: part.functionCall.name,\n arguments: part.functionCall.args,\n },\n })\n }\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\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\n/**\n * Extract available tool calls from the request parameters.\n * These are the tools provided to the LLM, not the tool calls in the response.\n */\nexport const extractAvailableToolCalls = (\n provider: string,\n params: any\n): ChatCompletionTool[] | AnthropicTool[] | GeminiTool[] | null => {\n if (provider === 'anthropic') {\n if (params.tools) {\n return params.tools\n }\n\n return null\n } else if (provider === 'gemini') {\n if (params.config && params.config.tools) {\n return params.config.tools\n }\n\n return null\n } else if (provider === 'openai') {\n if (params.tools) {\n return params.tools\n }\n\n return null\n } else if (provider === 'vercel') {\n // Vercel AI SDK stores tools in params.mode.tools when mode type is 'regular'\n if (params.mode?.type === 'regular' && params.mode.tools) {\n return params.mode.tools\n }\n\n return null\n }\n\n return null\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?: TokenUsage\n params: (ChatCompletionCreateParamsBase | MessageCreateParams | ResponseCreateParams) & MonitoringParams\n isError?: boolean\n error?: string\n tools?: ChatCompletionTool[] | AnthropicTool[] | GeminiTool[] | null\n captureImmediate?: boolean\n}\n\nfunction sanitizeValues(obj: any): any {\n if (obj === undefined || obj === null) {\n return obj\n }\n const jsonSafe = JSON.parse(JSON.stringify(obj))\n if (typeof jsonSafe === 'string') {\n 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 { OpenAI as OpenAIOrignal, ClientOptions } from 'openai'\nimport { PostHog } from 'posthog-node'\nimport { v4 as uuidv4 } from 'uuid'\nimport { formatResponseOpenAI, MonitoringParams, sendEventToPosthog, extractAvailableToolCalls } from '../utils'\nimport type { APIPromise } from 'openai'\nimport type { Stream } from 'openai/streaming'\nimport type { ParsedResponse } from 'openai/resources/responses/responses'\n\nconst Chat = OpenAIOrignal.Chat\nconst Completions = Chat.Completions\nconst Responses = OpenAIOrignal.Responses\n\ntype ChatCompletion = OpenAIOrignal.ChatCompletion\ntype ChatCompletionChunk = OpenAIOrignal.ChatCompletionChunk\ntype ChatCompletionCreateParamsBase = OpenAIOrignal.Chat.Completions.ChatCompletionCreateParams\ntype ChatCompletionCreateParamsNonStreaming = OpenAIOrignal.Chat.Completions.ChatCompletionCreateParamsNonStreaming\ntype ChatCompletionCreateParamsStreaming = OpenAIOrignal.Chat.Completions.ChatCompletionCreateParamsStreaming\ntype ResponsesCreateParamsBase = OpenAIOrignal.Responses.ResponseCreateParams\ntype ResponsesCreateParamsNonStreaming = OpenAIOrignal.Responses.ResponseCreateParamsNonStreaming\ntype ResponsesCreateParamsStreaming = OpenAIOrignal.Responses.ResponseCreateParamsStreaming\n\ninterface MonitoringOpenAIConfig extends ClientOptions {\n apiKey: string\n posthog: PostHog\n baseURL?: string\n}\n\ntype RequestOptions = Record<string, any>\n\nexport class PostHogOpenAI extends OpenAIOrignal {\n private readonly phClient: PostHog\n public chat: WrappedChat\n public responses: WrappedResponses\n\n constructor(config: MonitoringOpenAIConfig) {\n const { posthog, ...openAIConfig } = config\n super(openAIConfig)\n this.phClient = posthog\n this.chat = new WrappedChat(this, this.phClient)\n this.responses = new WrappedResponses(this, this.phClient)\n }\n}\n\nexport class WrappedChat extends Chat {\n constructor(parentClient: PostHogOpenAI, phClient: PostHog) {\n super(parentClient)\n this.completions = new WrappedCompletions(parentClient, phClient)\n }\n\n public completions: WrappedCompletions\n}\n\nexport class WrappedCompletions extends Completions {\n private readonly phClient: PostHog\n\n constructor(client: OpenAIOrignal, phClient: PostHog) {\n super(client)\n this.phClient = phClient\n }\n\n // --- Overload #1: Non-streaming\n public create(\n body: ChatCompletionCreateParamsNonStreaming & MonitoringParams,\n options?: RequestOptions\n ): APIPromise<ChatCompletion>\n\n // --- Overload #2: Streaming\n public create(\n body: ChatCompletionCreateParamsStreaming & MonitoringParams,\n options?: RequestOptions\n ): APIPromise<Stream<ChatCompletionChunk>>\n\n // --- Overload #3: Generic base\n public create(\n body: ChatCompletionCreateParamsBase & MonitoringParams,\n options?: RequestOptions\n ): APIPromise<ChatCompletion | Stream<ChatCompletionChunk>>\n\n // --- Implementation Signature\n public create(\n body: ChatCompletionCreateParamsBase & MonitoringParams,\n options?: RequestOptions\n ): APIPromise<ChatCompletion | Stream<ChatCompletionChunk>> {\n const {\n posthogDistinctId,\n posthogTraceId,\n posthogProperties,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n posthogPrivacyMode = false,\n posthogGroups,\n posthogCaptureImmediate,\n ...openAIParams\n } = body\n\n const traceId = posthogTraceId ?? uuidv4()\n const startTime = Date.now()\n\n const parentPromise = super.create(openAIParams, options)\n\n if (openAIParams.stream) {\n return parentPromise.then((value) => {\n if ('tee' in value) {\n const [stream1, stream2] = value.tee()\n ;(async () => {\n try {\n let accumulatedContent = ''\n let usage: {\n inputTokens?: number\n outputTokens?: number\n reasoningTokens?: number\n cacheReadInputTokens?: number\n } = {\n inputTokens: 0,\n outputTokens: 0,\n }\n\n for await (const chunk of stream1) {\n const delta = chunk?.choices?.[0]?.delta?.content ?? ''\n accumulatedContent += delta\n if (chunk.usage) {\n usage = {\n inputTokens: chunk.usage.prompt_tokens ?? 0,\n outputTokens: chunk.usage.completion_tokens ?? 0,\n reasoningTokens: chunk.usage.completion_tokens_details?.reasoning_tokens ?? 0,\n cacheReadInputTokens: chunk.usage.prompt_tokens_details?.cached_tokens ?? 0,\n }\n }\n }\n\n const latency = (Date.now() - startTime) / 1000\n const availableTools = extractAvailableToolCalls('openai', openAIParams)\n await sendEventToPosthog({\n client: this.phClient,\n distinctId: posthogDistinctId,\n traceId,\n model: openAIParams.model,\n provider: 'openai',\n input: openAIParams.messages,\n output: [{ content: accumulatedContent, role: 'assistant' }],\n latency,\n baseURL: (this as any).baseURL ?? '',\n params: body,\n httpStatus: 200,\n usage,\n tools: availableTools,\n captureImmediate: posthogCaptureImmediate,\n })\n } catch (error: any) {\n await sendEventToPosthog({\n client: this.phClient,\n distinctId: posthogDistinctId,\n traceId,\n model: openAIParams.model,\n provider: 'openai',\n input: openAIParams.messages,\n output: [],\n latency: 0,\n baseURL: (this as any).baseURL ?? '',\n params: body,\n httpStatus: error?.status ? error.status : 500,\n usage: { inputTokens: 0, outputTokens: 0 },\n isError: true,\n error: JSON.stringify(error),\n captureImmediate: posthogCaptureImmediate,\n })\n }\n })()\n\n // Return the other stream to the user\n return stream2\n }\n return value\n }) as APIPromise<Stream<ChatCompletionChunk>>\n } else {\n const wrappedPromise = parentPromise.then(\n async (result) => {\n if ('choices' in result) {\n const latency = (Date.now() - startTime) / 1000\n const availableTools = extractAvailableToolCalls('openai', openAIParams)\n await sendEventToPosthog({\n client: this.phClient,\n distinctId: posthogDistinctId,\n traceId,\n model: openAIParams.model,\n provider: 'openai',\n input: openAIParams.messages,\n output: formatResponseOpenAI(result),\n latency,\n baseURL: (this as any).baseURL ?? '',\n params: body,\n httpStatus: 200,\n usage: {\n inputTokens: result.usage?.prompt_tokens ?? 0,\n outputTokens: result.usage?.completion_tokens ?? 0,\n reasoningTokens: result.usage?.completion_tokens_details?.reasoning_tokens ?? 0,\n cacheReadInputTokens: result.usage?.prompt_tokens_details?.cached_tokens ?? 0,\n },\n tools: availableTools,\n captureImmediate: posthogCaptureImmediate,\n })\n }\n return result\n },\n async (error: any) => {\n await sendEventToPosthog({\n client: this.phClient,\n distinctId: posthogDistinctId,\n traceId,\n model: openAIParams.model,\n provider: 'openai',\n input: openAIParams.messages,\n output: [],\n latency: 0,\n baseURL: (this as any).baseURL ?? '',\n params: body,\n httpStatus: error?.status ? error.status : 500,\n usage: {\n inputTokens: 0,\n outputTokens: 0,\n },\n isError: true,\n error: JSON.stringify(error),\n captureImmediate: posthogCaptureImmediate,\n })\n throw error\n }\n ) as APIPromise<ChatCompletion>\n\n return wrappedPromise\n }\n }\n}\n\nexport class WrappedResponses extends Responses {\n private readonly phClient: PostHog\n\n constructor(client: OpenAIOrignal, phClient: PostHog) {\n super(client)\n this.phClient = phClient\n }\n\n // --- Overload #1: Non-streaming\n public create(\n body: ResponsesCreateParamsNonStreaming & MonitoringParams,\n options?: RequestOptions\n ): APIPromise<OpenAIOrignal.Responses.Response>\n\n // --- Overload #2: Streaming\n public create(\n body: ResponsesCreateParamsStreaming & MonitoringParams,\n options?: RequestOptions\n ): APIPromise<Stream<OpenAIOrignal.Responses.ResponseStreamEvent>>\n\n // --- Overload #3: Generic base\n public create(\n body: ResponsesCreateParamsBase & MonitoringParams,\n options?: RequestOptions\n ): APIPromise<OpenAIOrignal.Responses.Response | Stream<OpenAIOrignal.Responses.ResponseStreamEvent>>\n\n // --- Implementation Signature\n public create(\n body: ResponsesCreateParamsBase & MonitoringParams,\n options?: RequestOptions\n ): APIPromise<OpenAIOrignal.Responses.Response | Stream<OpenAIOrignal.Responses.ResponseStreamEvent>> {\n const {\n posthogDistinctId,\n posthogTraceId,\n posthogProperties,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n posthogPrivacyMode = false,\n posthogGroups,\n posthogCaptureImmediate,\n ...openAIParams\n } = body\n\n const traceId = posthogTraceId ?? uuidv4()\n const startTime = Date.now()\n\n const parentPromise = super.create(openAIParams, options)\n\n if (openAIParams.stream) {\n return parentPromise.then((value) => {\n if ('tee' in value && typeof (value as any).tee === 'function') {\n const [stream1, stream2] = (value as any).tee()\n ;(async () => {\n try {\n let finalContent: any[] = []\n let usage: {\n inputTokens?: number\n outputTokens?: number\n reasoningTokens?: number\n cacheReadInputTokens?: number\n } = {\n inputTokens: 0,\n outputTokens: 0,\n }\n\n for await (const chunk of stream1) {\n if (\n chunk.type === 'response.completed' &&\n 'response' in chunk &&\n chunk.response?.output &&\n chunk.response.output.length > 0\n ) {\n finalContent = chunk.response.output\n }\n if ('response' in chunk && chunk.response?.usage) {\n usage = {\n inputTokens: chunk.response.usage.input_tokens ?? 0,\n outputTokens: chunk.response.usage.output_tokens ?? 0,\n reasoningTokens: chunk.response.usage.output_tokens_details?.reasoning_tokens ?? 0,\n cacheReadInputTokens: chunk.response.usage.input_tokens_details?.cached_tokens ?? 0,\n }\n }\n }\n\n const latency = (Date.now() - startTime) / 1000\n const availableTools = extractAvailableToolCalls('openai', openAIParams)\n await sendEventToPosthog({\n client: this.phClient,\n distinctId: posthogDistinctId,\n traceId,\n //@ts-expect-error\n model: openAIParams.model,\n provider: 'openai',\n input: openAIParams.input,\n output: finalContent,\n latency,\n baseURL: (this as any).baseURL ?? '',\n params: body,\n httpStatus: 200,\n usage,\n tools: availableTools,\n captureImmediate: posthogCaptureImmediate,\n })\n } catch (error: any) {\n await sendEventToPosthog({\n client: this.phClient,\n distinctId: posthogDistinctId,\n traceId,\n //@ts-expect-error\n model: openAIParams.model,\n provider: 'openai',\n input: openAIParams.input,\n output: [],\n latency: 0,\n baseURL: (this as any).baseURL ?? '',\n params: body,\n httpStatus: error?.status ? error.status : 500,\n usage: { inputTokens: 0, outputTokens: 0 },\n isError: true,\n error: JSON.stringify(error),\n captureImmediate: posthogCaptureImmediate,\n })\n }\n })()\n\n return stream2\n }\n return value\n }) as APIPromise<Stream<OpenAIOrignal.Responses.ResponseStreamEvent>>\n } else {\n const wrappedPromise = parentPromise.then(\n async (result) => {\n if ('output' in result) {\n const latency = (Date.now() - startTime) / 1000\n const availableTools = extractAvailableToolCalls('openai', openAIParams)\n await sendEventToPosthog({\n client: this.phClient,\n distinctId: posthogDistinctId,\n traceId,\n //@ts-expect-error\n model: openAIParams.model,\n provider: 'openai',\n input: openAIParams.input,\n output: formatResponseOpenAI({ output: result.output }),\n latency,\n baseURL: (this as any).baseURL ?? '',\n params: body,\n httpStatus: 200,\n usage: {\n inputTokens: result.usage?.input_tokens ?? 0,\n outputTokens: result.usage?.output_tokens ?? 0,\n reasoningTokens: result.usage?.output_tokens_details?.reasoning_tokens ?? 0,\n cacheReadInputTokens: result.usage?.input_tokens_details?.cached_tokens ?? 0,\n },\n tools: availableTools,\n captureImmediate: posthogCaptureImmediate,\n })\n }\n return result\n },\n async (error: any) => {\n await sendEventToPosthog({\n client: this.phClient,\n distinctId: posthogDistinctId,\n traceId,\n //@ts-expect-error\n model: openAIParams.model,\n provider: 'openai',\n input: openAIParams.input,\n output: [],\n latency: 0,\n baseURL: (this as any).baseURL ?? '',\n params: body,\n httpStatus: error?.status ? error.status : 500,\n usage: {\n inputTokens: 0,\n outputTokens: 0,\n },\n isError: true,\n error: JSON.stringify(error),\n captureImmediate: posthogCaptureImmediate,\n })\n throw error\n }\n ) as APIPromise<OpenAIOrignal.Responses.Response>\n\n return wrappedPromise\n }\n }\n\n public parse<Params extends ResponsesCreateParamsBase, ParsedT = any>(\n body: Params & MonitoringParams,\n options?: RequestOptions\n ): APIPromise<ParsedResponse<ParsedT>> {\n const {\n posthogDistinctId,\n posthogTraceId,\n posthogProperties,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n posthogPrivacyMode = false,\n posthogGroups,\n posthogCaptureImmediate,\n ...openAIParams\n } = body\n\n const traceId = posthogTraceId ?? uuidv4()\n const startTime = Date.now()\n\n // Create a temporary instance that bypasses our wrapped create method\n const originalCreate = super.create.bind(this)\n const originalSelf = this as any\n const tempCreate = originalSelf.create\n originalSelf.create = originalCreate\n\n try {\n const parentPromise = super.parse(openAIParams, options)\n\n const wrappedPromise = parentPromise.then(\n async (result) => {\n const latency = (Date.now() - startTime) / 1000\n await sendEventToPosthog({\n client: this.phClient,\n distinctId: posthogDistinctId,\n traceId,\n //@ts-expect-error\n model: openAIParams.model,\n provider: 'openai',\n input: openAIParams.input,\n output: result.output,\n latency,\n baseURL: (this as any).baseURL ?? '',\n params: body,\n httpStatus: 200,\n usage: {\n inputTokens: result.usage?.input_tokens ?? 0,\n outputTokens: result.usage?.output_tokens ?? 0,\n reasoningTokens: result.usage?.output_tokens_details?.reasoning_tokens ?? 0,\n cacheReadInputTokens: result.usage?.input_tokens_details?.cached_tokens ?? 0,\n },\n captureImmediate: posthogCaptureImmediate,\n })\n return result\n },\n async (error: any) => {\n await sendEventToPosthog({\n client: this.phClient,\n distinctId: posthogDistinctId,\n traceId,\n //@ts-expect-error\n model: openAIParams.model,\n provider: 'openai',\n input: openAIParams.input,\n output: [],\n latency: 0,\n baseURL: (this as any).baseURL ?? '',\n params: body,\n httpStatus: error?.status ? error.status : 500,\n usage: {\n inputTokens: 0,\n outputTokens: 0,\n },\n isError: true,\n error: JSON.stringify(error),\n captureImmediate: posthogCaptureImmediate,\n })\n throw error\n }\n )\n\n return wrappedPromise as APIPromise<ParsedResponse<ParsedT>>\n } finally {\n // Restore our wrapped create method\n originalSelf.create = tempCreate\n }\n }\n}\n\nexport default PostHogOpenAI\n\nexport { PostHogOpenAI as OpenAI }\n"],"names":["STRING_FORMAT","getModelParams","params","modelParams","paramKeys","key","undefined","formatResponseOpenAI","response","output","choices","choice","content","role","message","push","type","text","tool_calls","toolCall","id","function","name","arguments","length","item","Array","isArray","contentItem","image_url","image","String","call_id","withPrivacyMode","client","privacyMode","input","privacy_mode","extractAvailableToolCalls","provider","tools","sanitizeValues","obj","jsonSafe","JSON","parse","stringify","Buffer","from","toString","map","Object","fromEntries","entries","k","v","sendEventToPosthog","distinctId","traceId","model","latency","baseURL","httpStatus","usage","isError","error","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","Chat","OpenAIOrignal","Completions","Responses","PostHogOpenAI","constructor","config","posthog","openAIConfig","phClient","chat","WrappedChat","responses","WrappedResponses","parentClient","completions","WrappedCompletions","create","body","options","posthogDistinctId","posthogTraceId","posthogCaptureImmediate","openAIParams","uuidv4","startTime","Date","now","parentPromise","stream","then","value","stream1","stream2","tee","accumulatedContent","chunk","delta","prompt_tokens","completion_tokens","completion_tokens_details","reasoning_tokens","prompt_tokens_details","cached_tokens","availableTools","messages","status","wrappedPromise","result","finalContent","input_tokens","output_tokens","output_tokens_details","input_tokens_details","originalCreate","bind","originalSelf","tempCreate"],"mappings":"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"}
|
package/dist/vercel/index.cjs
CHANGED
|
@@ -36,6 +36,20 @@ const truncate = str => {
|
|
|
36
36
|
return str;
|
|
37
37
|
}
|
|
38
38
|
};
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* Extract available tool calls from the request parameters.
|
|
42
|
+
* These are the tools provided to the LLM, not the tool calls in the response.
|
|
43
|
+
*/
|
|
44
|
+
const extractAvailableToolCalls = (provider, params) => {
|
|
45
|
+
{
|
|
46
|
+
// Vercel AI SDK stores tools in params.mode.tools when mode type is 'regular'
|
|
47
|
+
if (params.mode?.type === 'regular' && params.mode.tools) {
|
|
48
|
+
return params.mode.tools;
|
|
49
|
+
}
|
|
50
|
+
return null;
|
|
51
|
+
}
|
|
52
|
+
};
|
|
39
53
|
function sanitizeValues(obj) {
|
|
40
54
|
if (obj === undefined || obj === null) {
|
|
41
55
|
return obj;
|
|
@@ -143,7 +157,7 @@ const sendEventToPosthog = async ({
|
|
|
143
157
|
const mapVercelParams = params => {
|
|
144
158
|
return {
|
|
145
159
|
temperature: params.temperature,
|
|
146
|
-
|
|
160
|
+
max_output_tokens: params.maxOutputTokens,
|
|
147
161
|
top_p: params.topP,
|
|
148
162
|
frequency_penalty: params.frequencyPenalty,
|
|
149
163
|
presence_penalty: params.presencePenalty,
|
|
@@ -151,79 +165,68 @@ const mapVercelParams = params => {
|
|
|
151
165
|
stream: params.stream
|
|
152
166
|
};
|
|
153
167
|
};
|
|
154
|
-
const mapVercelPrompt =
|
|
155
|
-
// normalize single inputs into an array of messages
|
|
156
|
-
let promptsArray;
|
|
157
|
-
if (typeof prompt === 'string') {
|
|
158
|
-
promptsArray = [{
|
|
159
|
-
role: 'user',
|
|
160
|
-
content: prompt
|
|
161
|
-
}];
|
|
162
|
-
} else if (!Array.isArray(prompt)) {
|
|
163
|
-
promptsArray = [prompt];
|
|
164
|
-
} else {
|
|
165
|
-
promptsArray = prompt;
|
|
166
|
-
}
|
|
167
|
-
|
|
168
|
+
const mapVercelPrompt = messages => {
|
|
168
169
|
// Map and truncate individual content
|
|
169
|
-
const inputs =
|
|
170
|
-
let content
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
content: {
|
|
170
|
+
const inputs = messages.map(message => {
|
|
171
|
+
let content;
|
|
172
|
+
|
|
173
|
+
// Handle system role which has string content
|
|
174
|
+
if (message.role === 'system') {
|
|
175
|
+
content = [{
|
|
176
|
+
type: 'text',
|
|
177
|
+
text: truncate(String(message.content))
|
|
178
|
+
}];
|
|
179
|
+
} else {
|
|
180
|
+
// Handle other roles which have array content
|
|
181
|
+
if (Array.isArray(message.content)) {
|
|
182
|
+
content = message.content.map(c => {
|
|
183
|
+
if (c.type === 'text') {
|
|
184
|
+
return {
|
|
185
|
+
type: 'text',
|
|
186
|
+
text: truncate(c.text)
|
|
187
|
+
};
|
|
188
|
+
} else if (c.type === 'file') {
|
|
189
|
+
return {
|
|
190
|
+
type: 'file',
|
|
191
191
|
file: c.data instanceof URL ? c.data.toString() : 'raw files not supported',
|
|
192
|
-
|
|
193
|
-
}
|
|
194
|
-
}
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
192
|
+
mediaType: c.mediaType
|
|
193
|
+
};
|
|
194
|
+
} else if (c.type === 'reasoning') {
|
|
195
|
+
return {
|
|
196
|
+
type: 'reasoning',
|
|
197
|
+
text: truncate(c.reasoning)
|
|
198
|
+
};
|
|
199
|
+
} else if (c.type === 'tool-call') {
|
|
200
|
+
return {
|
|
201
|
+
type: 'tool-call',
|
|
199
202
|
toolCallId: c.toolCallId,
|
|
200
203
|
toolName: c.toolName,
|
|
201
|
-
|
|
202
|
-
}
|
|
203
|
-
}
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
type: 'tool-result',
|
|
207
|
-
content: {
|
|
204
|
+
input: c.input
|
|
205
|
+
};
|
|
206
|
+
} else if (c.type === 'tool-result') {
|
|
207
|
+
return {
|
|
208
|
+
type: 'tool-result',
|
|
208
209
|
toolCallId: c.toolCallId,
|
|
209
210
|
toolName: c.toolName,
|
|
210
|
-
|
|
211
|
+
output: c.output,
|
|
211
212
|
isError: c.isError
|
|
212
|
-
}
|
|
213
|
+
};
|
|
214
|
+
}
|
|
215
|
+
return {
|
|
216
|
+
type: 'text',
|
|
217
|
+
text: ''
|
|
213
218
|
};
|
|
214
|
-
}
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
text: truncate(p.content)
|
|
223
|
-
};
|
|
219
|
+
});
|
|
220
|
+
} else {
|
|
221
|
+
// Fallback for non-array content
|
|
222
|
+
content = [{
|
|
223
|
+
type: 'text',
|
|
224
|
+
text: truncate(String(message.content))
|
|
225
|
+
}];
|
|
226
|
+
}
|
|
224
227
|
}
|
|
225
228
|
return {
|
|
226
|
-
role:
|
|
229
|
+
role: message.role,
|
|
227
230
|
content
|
|
228
231
|
};
|
|
229
232
|
});
|
|
@@ -255,7 +258,32 @@ const mapVercelPrompt = prompt => {
|
|
|
255
258
|
return inputs;
|
|
256
259
|
};
|
|
257
260
|
const mapVercelOutput = result => {
|
|
258
|
-
|
|
261
|
+
const content = [];
|
|
262
|
+
if (result.text) {
|
|
263
|
+
content.push({
|
|
264
|
+
type: 'text',
|
|
265
|
+
text: truncate(result.text)
|
|
266
|
+
});
|
|
267
|
+
}
|
|
268
|
+
if (result.toolCalls && Array.isArray(result.toolCalls)) {
|
|
269
|
+
for (const toolCall of result.toolCalls) {
|
|
270
|
+
content.push({
|
|
271
|
+
type: 'function',
|
|
272
|
+
id: toolCall.toolCallId,
|
|
273
|
+
function: {
|
|
274
|
+
name: toolCall.toolName,
|
|
275
|
+
arguments: typeof toolCall.args === 'string' ? toolCall.args : JSON.stringify(toolCall.args)
|
|
276
|
+
}
|
|
277
|
+
});
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
if (content.length > 0) {
|
|
281
|
+
return [{
|
|
282
|
+
role: 'assistant',
|
|
283
|
+
content: content.length === 1 && content[0].type === 'text' ? content[0].text : content
|
|
284
|
+
}];
|
|
285
|
+
}
|
|
286
|
+
// Fallback to original behavior for other result types TODO: check if we can remove this
|
|
259
287
|
const normalizedResult = typeof result === 'string' ? {
|
|
260
288
|
text: result
|
|
261
289
|
} : result;
|
|
@@ -266,8 +294,8 @@ const mapVercelOutput = result => {
|
|
|
266
294
|
...(normalizedResult.object ? {
|
|
267
295
|
object: normalizedResult.object
|
|
268
296
|
} : {}),
|
|
269
|
-
...(normalizedResult.
|
|
270
|
-
reasoning: normalizedResult.
|
|
297
|
+
...(normalizedResult.reasoningText ? {
|
|
298
|
+
reasoning: normalizedResult.reasoningText
|
|
271
299
|
} : {}),
|
|
272
300
|
...(normalizedResult.response ? {
|
|
273
301
|
response: normalizedResult.response
|
|
@@ -326,14 +354,14 @@ const createInstrumentationMiddleware = (phClient, model, options) => {
|
|
|
326
354
|
...options,
|
|
327
355
|
...mapVercelParams(params)
|
|
328
356
|
};
|
|
357
|
+
const availableTools = extractAvailableToolCalls('vercel', params);
|
|
329
358
|
try {
|
|
330
359
|
const result = await doGenerate();
|
|
331
|
-
const latency = (Date.now() - startTime) / 1000;
|
|
332
360
|
const modelId = options.posthogModelOverride ?? (result.response?.modelId ? result.response.modelId : model.modelId);
|
|
333
361
|
const provider = options.posthogProviderOverride ?? extractProvider(model);
|
|
334
362
|
const baseURL = ''; // cannot currently get baseURL from vercel
|
|
335
363
|
const content = mapVercelOutput(result);
|
|
336
|
-
|
|
364
|
+
const latency = (Date.now() - startTime) / 1000;
|
|
337
365
|
const providerMetadata = result.providerMetadata;
|
|
338
366
|
const additionalTokenValues = {
|
|
339
367
|
...(providerMetadata?.openai?.reasoningTokens ? {
|
|
@@ -354,19 +382,17 @@ const createInstrumentationMiddleware = (phClient, model, options) => {
|
|
|
354
382
|
model: modelId,
|
|
355
383
|
provider: provider,
|
|
356
384
|
input: options.posthogPrivacyMode ? '' : mapVercelPrompt(params.prompt),
|
|
357
|
-
output:
|
|
358
|
-
content,
|
|
359
|
-
role: 'assistant'
|
|
360
|
-
}],
|
|
385
|
+
output: content,
|
|
361
386
|
latency,
|
|
362
387
|
baseURL,
|
|
363
388
|
params: mergedParams,
|
|
364
389
|
httpStatus: 200,
|
|
365
390
|
usage: {
|
|
366
|
-
inputTokens: result.usage.
|
|
367
|
-
outputTokens: result.usage.
|
|
391
|
+
inputTokens: result.usage.inputTokens,
|
|
392
|
+
outputTokens: result.usage.outputTokens,
|
|
368
393
|
...additionalTokenValues
|
|
369
394
|
},
|
|
395
|
+
tools: availableTools,
|
|
370
396
|
captureImmediate: options.posthogCaptureImmediate
|
|
371
397
|
});
|
|
372
398
|
return result;
|
|
@@ -390,6 +416,7 @@ const createInstrumentationMiddleware = (phClient, model, options) => {
|
|
|
390
416
|
},
|
|
391
417
|
isError: true,
|
|
392
418
|
error: truncate(JSON.stringify(error)),
|
|
419
|
+
tools: availableTools,
|
|
393
420
|
captureImmediate: options.posthogCaptureImmediate
|
|
394
421
|
});
|
|
395
422
|
throw error;
|
|
@@ -401,6 +428,7 @@ const createInstrumentationMiddleware = (phClient, model, options) => {
|
|
|
401
428
|
}) => {
|
|
402
429
|
const startTime = Date.now();
|
|
403
430
|
let generatedText = '';
|
|
431
|
+
let reasoningText = '';
|
|
404
432
|
let usage = {};
|
|
405
433
|
const mergedParams = {
|
|
406
434
|
...options,
|
|
@@ -408,7 +436,9 @@ const createInstrumentationMiddleware = (phClient, model, options) => {
|
|
|
408
436
|
};
|
|
409
437
|
const modelId = options.posthogModelOverride ?? model.modelId;
|
|
410
438
|
const provider = options.posthogProviderOverride ?? extractProvider(model);
|
|
439
|
+
const availableTools = extractAvailableToolCalls('vercel', params);
|
|
411
440
|
const baseURL = ''; // cannot currently get baseURL from vercel
|
|
441
|
+
|
|
412
442
|
try {
|
|
413
443
|
const {
|
|
414
444
|
stream,
|
|
@@ -416,13 +446,17 @@ const createInstrumentationMiddleware = (phClient, model, options) => {
|
|
|
416
446
|
} = await doStream();
|
|
417
447
|
const transformStream = new TransformStream({
|
|
418
448
|
transform(chunk, controller) {
|
|
449
|
+
// Handle new v5 streaming patterns
|
|
419
450
|
if (chunk.type === 'text-delta') {
|
|
420
|
-
generatedText += chunk.
|
|
451
|
+
generatedText += chunk.delta;
|
|
452
|
+
}
|
|
453
|
+
if (chunk.type === 'reasoning-delta') {
|
|
454
|
+
reasoningText += chunk.delta; // New in v5
|
|
421
455
|
}
|
|
422
456
|
if (chunk.type === 'finish') {
|
|
423
457
|
usage = {
|
|
424
|
-
inputTokens: chunk.usage?.
|
|
425
|
-
outputTokens: chunk.usage?.
|
|
458
|
+
inputTokens: chunk.usage?.inputTokens,
|
|
459
|
+
outputTokens: chunk.usage?.outputTokens
|
|
426
460
|
};
|
|
427
461
|
if (chunk.providerMetadata?.openai?.reasoningTokens) {
|
|
428
462
|
usage.reasoningTokens = chunk.providerMetadata.openai.reasoningTokens;
|
|
@@ -441,6 +475,7 @@ const createInstrumentationMiddleware = (phClient, model, options) => {
|
|
|
441
475
|
},
|
|
442
476
|
flush: async () => {
|
|
443
477
|
const latency = (Date.now() - startTime) / 1000;
|
|
478
|
+
const outputContent = reasoningText ? `${reasoningText}\n\n${generatedText}` : generatedText;
|
|
444
479
|
await sendEventToPosthog({
|
|
445
480
|
client: phClient,
|
|
446
481
|
distinctId: options.posthogDistinctId,
|
|
@@ -449,7 +484,7 @@ const createInstrumentationMiddleware = (phClient, model, options) => {
|
|
|
449
484
|
provider: provider,
|
|
450
485
|
input: options.posthogPrivacyMode ? '' : mapVercelPrompt(params.prompt),
|
|
451
486
|
output: [{
|
|
452
|
-
content:
|
|
487
|
+
content: outputContent,
|
|
453
488
|
role: 'assistant'
|
|
454
489
|
}],
|
|
455
490
|
latency,
|
|
@@ -457,6 +492,7 @@ const createInstrumentationMiddleware = (phClient, model, options) => {
|
|
|
457
492
|
params: mergedParams,
|
|
458
493
|
httpStatus: 200,
|
|
459
494
|
usage,
|
|
495
|
+
tools: availableTools,
|
|
460
496
|
captureImmediate: options.posthogCaptureImmediate
|
|
461
497
|
});
|
|
462
498
|
}
|
|
@@ -484,6 +520,7 @@ const createInstrumentationMiddleware = (phClient, model, options) => {
|
|
|
484
520
|
},
|
|
485
521
|
isError: true,
|
|
486
522
|
error: truncate(JSON.stringify(error)),
|
|
523
|
+
tools: availableTools,
|
|
487
524
|
captureImmediate: options.posthogCaptureImmediate
|
|
488
525
|
});
|
|
489
526
|
throw error;
|
|
@@ -499,7 +536,7 @@ const wrapVercelLanguageModel = (model, phClient, options) => {
|
|
|
499
536
|
posthogTraceId: traceId,
|
|
500
537
|
posthogDistinctId: options.posthogDistinctId
|
|
501
538
|
});
|
|
502
|
-
const wrappedModel = ai.
|
|
539
|
+
const wrappedModel = ai.wrapLanguageModel({
|
|
503
540
|
model,
|
|
504
541
|
middleware
|
|
505
542
|
});
|