@posthog/ai 4.2.1 → 4.3.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/CHANGELOG.md +5 -0
- package/lib/anthropic/index.cjs.js +82 -84
- package/lib/anthropic/index.cjs.js.map +1 -1
- package/lib/anthropic/index.d.ts +1 -1
- package/lib/anthropic/index.esm.js +82 -84
- package/lib/anthropic/index.esm.js.map +1 -1
- package/lib/index.cjs.js +125 -115
- package/lib/index.cjs.js.map +1 -1
- package/lib/index.d.ts +2 -2
- package/lib/index.esm.js +125 -115
- package/lib/index.esm.js.map +1 -1
- package/lib/langchain/index.cjs.js.map +1 -1
- package/lib/langchain/index.esm.js.map +1 -1
- package/lib/openai/index.cjs.js +82 -84
- package/lib/openai/index.cjs.js.map +1 -1
- package/lib/openai/index.d.ts +1 -1
- package/lib/openai/index.esm.js +82 -84
- package/lib/openai/index.esm.js.map +1 -1
- package/lib/posthog-ai/src/utils.d.ts +3 -3
- package/lib/posthog-ai/src/vercel/middleware.d.ts +2 -2
- package/lib/vercel/index.cjs.js +80 -85
- package/lib/vercel/index.cjs.js.map +1 -1
- package/lib/vercel/index.d.ts +1 -1
- package/lib/vercel/index.esm.js +80 -85
- package/lib/vercel/index.esm.js.map +1 -1
- package/package.json +1 -1
- package/src/anthropic/index.ts +11 -6
- package/src/openai/azure.ts +11 -6
- package/src/openai/index.ts +11 -6
- package/src/utils.ts +61 -74
- package/src/vercel/middleware.ts +15 -13
- package/tests/openai.test.ts +15 -0
- package/tsconfig.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.esm.js","sources":["../../src/utils.ts","../../src/anthropic/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\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 fullDebug?: 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 }\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 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 fullDebug?: 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 = ({\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 fullDebug = false,\n}: SendEventToPosthogParams): void => {\n if (client.capture) {\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 if (fullDebug) {\n // @ts-ignore\n console.log('Sending event to PostHog', JSON.stringify(properties))\n try {\n // @ts-ignore\n console.log(\n 'Size of properties (kb)',\n Math.round((Buffer.byteLength(JSON.stringify(properties), STRING_FORMAT) / 1024) * 10000) / 10000\n )\n // @ts-ignore\n console.log(\n 'Size of properties (mb)',\n Math.round((Buffer.byteLength(JSON.stringify(properties), STRING_FORMAT) / 1024 / 1024) * 10000) / 10000\n )\n } catch (error) {\n console.error('Error printing size of properties', error)\n }\n }\n\n client.capture({\n distinctId: distinctId ?? traceId,\n event: '$ai_generation',\n properties,\n groups: params.posthogGroups,\n })\n }\n}\n","import AnthropicOriginal from '@anthropic-ai/sdk'\nimport { PostHog } from 'posthog-node'\nimport { v4 as uuidv4 } from 'uuid'\nimport { formatResponseAnthropic, mergeSystemPrompt, MonitoringParams, sendEventToPosthog } from '../utils'\n\ntype MessageCreateParamsNonStreaming = AnthropicOriginal.Messages.MessageCreateParamsNonStreaming\ntype MessageCreateParamsStreaming = AnthropicOriginal.Messages.MessageCreateParamsStreaming\ntype MessageCreateParams = AnthropicOriginal.Messages.MessageCreateParams\ntype Message = AnthropicOriginal.Messages.Message\ntype RawMessageStreamEvent = AnthropicOriginal.Messages.RawMessageStreamEvent\ntype MessageCreateParamsBase = AnthropicOriginal.Messages.MessageCreateParams\n\nimport type { APIPromise, RequestOptions } from '@anthropic-ai/sdk/core'\nimport type { Stream } from '@anthropic-ai/sdk/streaming'\n\ninterface MonitoringAnthropicConfig {\n apiKey: string\n posthog: PostHog\n baseURL?: string\n}\n\nexport class PostHogAnthropic extends AnthropicOriginal {\n private readonly phClient: PostHog\n public messages: WrappedMessages\n\n constructor(config: MonitoringAnthropicConfig) {\n const { posthog, ...anthropicConfig } = config\n super(anthropicConfig)\n this.phClient = posthog\n this.messages = new WrappedMessages(this, this.phClient)\n }\n}\n\nexport class WrappedMessages extends AnthropicOriginal.Messages {\n private readonly phClient: PostHog\n\n constructor(parentClient: PostHogAnthropic, phClient: PostHog) {\n super(parentClient)\n this.phClient = phClient\n }\n\n public create(body: MessageCreateParamsNonStreaming, options?: RequestOptions): APIPromise<Message>\n public create(\n body: MessageCreateParamsStreaming & MonitoringParams,\n options?: RequestOptions\n ): APIPromise<Stream<RawMessageStreamEvent>>\n public create(\n body: MessageCreateParamsBase & MonitoringParams,\n options?: RequestOptions\n ): APIPromise<Stream<RawMessageStreamEvent> | Message>\n public create(\n body: MessageCreateParams & MonitoringParams,\n options?: RequestOptions\n ): APIPromise<Message> | APIPromise<Stream<RawMessageStreamEvent>> {\n const {\n posthogDistinctId,\n posthogTraceId,\n posthogProperties,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n posthogPrivacyMode = false,\n posthogGroups,\n ...anthropicParams\n } = body\n\n const traceId = posthogTraceId ?? uuidv4()\n const startTime = Date.now()\n\n const parentPromise = super.create(anthropicParams, options)\n\n if (anthropicParams.stream) {\n return parentPromise.then((value) => {\n let accumulatedContent = ''\n const usage: {\n inputTokens: number\n outputTokens: number\n cacheCreationInputTokens?: number\n cacheReadInputTokens?: number\n } = {\n inputTokens: 0,\n outputTokens: 0,\n cacheCreationInputTokens: 0,\n cacheReadInputTokens: 0,\n }\n if ('tee' in value) {\n const [stream1, stream2] = value.tee()\n ;(async () => {\n try {\n for await (const chunk of stream1) {\n if ('delta' in chunk) {\n if ('text' in chunk.delta) {\n const delta = chunk?.delta?.text ?? ''\n accumulatedContent += delta\n }\n }\n if (chunk.type == 'message_start') {\n usage.inputTokens = chunk.message.usage.input_tokens ?? 0\n usage.cacheCreationInputTokens = chunk.message.usage.cache_creation_input_tokens ?? 0\n usage.cacheReadInputTokens = chunk.message.usage.cache_read_input_tokens ?? 0\n }\n if ('usage' in chunk) {\n usage.outputTokens = chunk.usage.output_tokens ?? 0\n }\n }\n const latency = (Date.now() - startTime) / 1000\n sendEventToPosthog({\n client: this.phClient,\n distinctId: posthogDistinctId ?? traceId,\n traceId,\n model: anthropicParams.model,\n provider: 'anthropic',\n input: mergeSystemPrompt(anthropicParams, 'anthropic'),\n output: [{ content: accumulatedContent, role: 'assistant' }],\n latency,\n baseURL: (this as any).baseURL ?? '',\n params: body,\n httpStatus: 200,\n usage,\n })\n } catch (error: any) {\n // error handling\n sendEventToPosthog({\n client: this.phClient,\n distinctId: posthogDistinctId ?? traceId,\n traceId,\n model: anthropicParams.model,\n provider: 'anthropic',\n input: mergeSystemPrompt(anthropicParams, 'anthropic'),\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 })\n }\n })()\n\n // Return the other stream to the user\n return stream2\n }\n return value\n }) as APIPromise<Stream<RawMessageStreamEvent>>\n } else {\n const wrappedPromise = parentPromise.then(\n (result) => {\n if ('content' in result) {\n const latency = (Date.now() - startTime) / 1000\n sendEventToPosthog({\n client: this.phClient,\n distinctId: posthogDistinctId ?? traceId,\n traceId,\n model: anthropicParams.model,\n provider: 'anthropic',\n input: mergeSystemPrompt(anthropicParams, 'anthropic'),\n output: formatResponseAnthropic(result),\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 cacheCreationInputTokens: result.usage.cache_creation_input_tokens ?? 0,\n cacheReadInputTokens: result.usage.cache_read_input_tokens ?? 0,\n },\n })\n }\n return result\n },\n (error: any) => {\n sendEventToPosthog({\n client: this.phClient,\n distinctId: posthogDistinctId ?? traceId,\n traceId,\n model: anthropicParams.model,\n provider: 'anthropic',\n input: mergeSystemPrompt(anthropicParams, 'anthropic'),\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 })\n throw error\n }\n ) as APIPromise<Message>\n\n return wrappedPromise\n }\n }\n}\n\nexport default PostHogAnthropic\n\nexport { PostHogAnthropic as Anthropic }\n"],"names":["STRING_FORMAT","getModelParams","params","modelParams","paramKeys","key","undefined","formatResponseAnthropic","response","output","choice","content","text","push","role","mergeSystemPrompt","provider","messages","system","systemMessage","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","latency","baseURL","httpStatus","usage","isError","error","tools","fullDebug","capture","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","console","log","Math","round","byteLength","event","groups","posthogGroups","PostHogAnthropic","AnthropicOriginal","constructor","config","posthog","anthropicConfig","phClient","WrappedMessages","Messages","parentClient","create","body","options","posthogDistinctId","posthogTraceId","anthropicParams","uuidv4","startTime","Date","now","parentPromise","stream","then","value","accumulatedContent","stream1","stream2","tee","chunk","delta","type","message","input_tokens","cache_creation_input_tokens","cache_read_input_tokens","output_tokens","status","wrappedPromise","result"],"mappings":";;;;AAUA,MAAMA,aAAa,GAAG,MAAM,CAAA;AAmBrB,MAAMC,cAAc,GACzBC,MAA0F,IAClE;EACxB,IAAI,CAACA,MAAM,EAAE;AACX,IAAA,OAAO,EAAE,CAAA;AACX,GAAA;EACA,MAAMC,WAAgC,GAAG,EAAE,CAAA;EAC3C,MAAMC,SAAS,GAAG,CAChB,aAAa,EACb,YAAY,EACZ,uBAAuB,EACvB,OAAO,EACP,mBAAmB,EACnB,kBAAkB,EAClB,GAAG,EACH,MAAM,EACN,QAAQ,EACR,WAAW,CACH,CAAA;AAEV,EAAA,KAAK,MAAMC,GAAG,IAAID,SAAS,EAAE;IAC3B,IAAIC,GAAG,IAAIH,MAAM,IAAKA,MAAM,CAASG,GAAG,CAAC,KAAKC,SAAS,EAAE;AACvDH,MAAAA,WAAW,CAACE,GAAG,CAAC,GAAIH,MAAM,CAASG,GAAG,CAAC,CAAA;AACzC,KAAA;AACF,GAAA;AACA,EAAA,OAAOF,WAAW,CAAA;AACpB,CAAC,CAAA;AAiBM,MAAMI,uBAAuB,GAAIC,QAAa,IAA+C;AAClG;EACA,MAAMC,MAAgD,GAAG,EAAE,CAAA;EAC3D,KAAK,MAAMC,MAAM,IAAIF,QAAQ,CAACG,OAAO,IAAI,EAAE,EAAE;IAC3C,IAAID,MAAM,EAAEE,IAAI,EAAE;MAChBH,MAAM,CAACI,IAAI,CAAC;AACVC,QAAAA,IAAI,EAAE,WAAW;QACjBH,OAAO,EAAED,MAAM,CAACE,IAAAA;AAClB,OAAC,CAAC,CAAA;AACJ,KAAA;AACF,GAAA;AACA,EAAA,OAAOH,MAAM,CAAA;AACf,CAAC,CAAA;AAeM,MAAMM,iBAAiB,GAAGA,CAACb,MAA8C,EAAEc,QAAgB,KAAU;EAC1G,IAAIA,QAAQ,IAAI,WAAW,EAAE;AAC3B,IAAA,MAAMC,QAAQ,GAAGf,MAAM,CAACe,QAAQ,IAAI,EAAE,CAAA;AACtC,IAAA,IAAI,CAAEf,MAAM,CAASgB,MAAM,EAAE;AAC3B,MAAA,OAAOD,QAAQ,CAAA;AACjB,KAAA;AACA,IAAA,MAAME,aAAa,GAAIjB,MAAM,CAASgB,MAAM,CAAA;AAC5C,IAAA,OAAO,CAAC;AAAEJ,MAAAA,IAAI,EAAE,QAAQ;AAAEH,MAAAA,OAAO,EAAEQ,aAAAA;KAAe,EAAE,GAAGF,QAAQ,CAAC,CAAA;AAClE,GAAA;EACA,OAAOf,MAAM,CAACe,QAAQ,CAAA;AACxB,CAAC,CAAA;AAEM,MAAMG,eAAe,GAAGA,CAACC,MAAe,EAAEC,WAAoB,EAAEC,KAAU,KAAU;EACzF,OAAQF,MAAM,CAASG,YAAY,IAAIF,WAAW,GAAG,IAAI,GAAGC,KAAK,CAAA;AACnE,CAAC,CAAA;AAyCD,SAASE,cAAcA,CAACC,GAAQ,EAAO;AACrC,EAAA,IAAIA,GAAG,KAAKpB,SAAS,IAAIoB,GAAG,KAAK,IAAI,EAAE;AACrC,IAAA,OAAOA,GAAG,CAAA;AACZ,GAAA;AACA,EAAA,MAAMC,QAAQ,GAAGC,IAAI,CAACC,KAAK,CAACD,IAAI,CAACE,SAAS,CAACJ,GAAG,CAAC,CAAC,CAAA;AAChD,EAAA,IAAI,OAAOC,QAAQ,KAAK,QAAQ,EAAE;AAChC,IAAA,OAAOI,MAAM,CAACC,IAAI,CAACL,QAAQ,EAAE3B,aAAa,CAAC,CAACiC,QAAQ,CAACjC,aAAa,CAAC,CAAA;GACpE,MAAM,IAAIkC,KAAK,CAACC,OAAO,CAACR,QAAQ,CAAC,EAAE;AAClC,IAAA,OAAOA,QAAQ,CAACS,GAAG,CAACX,cAAc,CAAC,CAAA;GACpC,MAAM,IAAIE,QAAQ,IAAI,OAAOA,QAAQ,KAAK,QAAQ,EAAE;AACnD,IAAA,OAAOU,MAAM,CAACC,WAAW,CAACD,MAAM,CAACE,OAAO,CAACZ,QAAQ,CAAC,CAACS,GAAG,CAAC,CAAC,CAACI,CAAC,EAAEC,CAAC,CAAC,KAAK,CAACD,CAAC,EAAEf,cAAc,CAACgB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;AAC7F,GAAA;AACA,EAAA,OAAOd,QAAQ,CAAA;AACjB,CAAA;AAEO,MAAMe,kBAAkB,GAAGA,CAAC;EACjCrB,MAAM;EACNsB,UAAU;EACVC,OAAO;EACPC,KAAK;EACL7B,QAAQ;EACRO,KAAK;EACLd,MAAM;EACNqC,OAAO;EACPC,OAAO;EACP7C,MAAM;AACN8C,EAAAA,UAAU,GAAG,GAAG;EAChBC,KAAK,GAAG,EAAE;AACVC,EAAAA,OAAO,GAAG,KAAK;EACfC,KAAK;EACLC,KAAK;AACLC,EAAAA,SAAS,GAAG,KAAA;AACY,CAAC,KAAW;EACpC,IAAIhC,MAAM,CAACiC,OAAO,EAAE;AAClB;AACA,IAAA,MAAMC,SAAS,GAAG9B,cAAc,CAACF,KAAK,CAAC,CAAA;AACvC,IAAA,MAAMiC,UAAU,GAAG/B,cAAc,CAAChB,MAAM,CAAC,CAAA;AACzC,IAAA,MAAMgD,SAAS,GAAGhC,cAAc,CAAC0B,KAAK,CAAC,CAAA;IAEvC,IAAIO,SAAS,GAAG,EAAE,CAAA;AAClB,IAAA,IAAIR,OAAO,EAAE;AACXQ,MAAAA,SAAS,GAAG;AACVC,QAAAA,YAAY,EAAE,IAAI;AAClBC,QAAAA,SAAS,EAAEH,SAAAA;OACZ,CAAA;AACH,KAAA;IACA,IAAII,gBAAgB,GAAG,EAAE,CAAA;IACzB,IAAI3D,MAAM,CAAC4D,mBAAmB,EAAE;AAC9B,MAAA,MAAMC,YAAY,GAAG,CAAC7D,MAAM,CAAC4D,mBAAmB,CAACE,SAAS,IAAI,CAAC,KAAKf,KAAK,CAACgB,WAAW,IAAI,CAAC,CAAC,CAAA;AAC3F,MAAA,MAAMC,aAAa,GAAG,CAAChE,MAAM,CAAC4D,mBAAmB,CAACK,UAAU,IAAI,CAAC,KAAKlB,KAAK,CAACmB,YAAY,IAAI,CAAC,CAAC,CAAA;AAC9FP,MAAAA,gBAAgB,GAAG;AACjBQ,QAAAA,kBAAkB,EAAEN,YAAY;AAChCO,QAAAA,mBAAmB,EAAEJ,aAAa;QAClCK,kBAAkB,EAAER,YAAY,GAAGG,aAAAA;OACpC,CAAA;AACH,KAAA;AAEA,IAAA,MAAMM,qBAAqB,GAAG;MAC5B,IAAIvB,KAAK,CAACwB,eAAe,GAAG;QAAEC,oBAAoB,EAAEzB,KAAK,CAACwB,eAAAA;OAAiB,GAAG,EAAE,CAAC;MACjF,IAAIxB,KAAK,CAAC0B,oBAAoB,GAAG;QAAEC,2BAA2B,EAAE3B,KAAK,CAAC0B,oBAAAA;OAAsB,GAAG,EAAE,CAAC;MAClG,IAAI1B,KAAK,CAAC4B,wBAAwB,GAAG;QAAEC,+BAA+B,EAAE7B,KAAK,CAAC4B,wBAAAA;OAA0B,GAAG,EAAE,CAAA;KAC9G,CAAA;AAED,IAAA,MAAME,UAAU,GAAG;AACjBC,MAAAA,YAAY,EAAE9E,MAAM,CAAC+E,uBAAuB,IAAIjE,QAAQ;AACxDkE,MAAAA,SAAS,EAAEhF,MAAM,CAACiF,oBAAoB,IAAItC,KAAK;AAC/CuC,MAAAA,oBAAoB,EAAEnF,cAAc,CAACC,MAAM,CAAC;AAC5CmF,MAAAA,SAAS,EAAEjE,eAAe,CAACC,MAAM,EAAEnB,MAAM,CAACoF,kBAAkB,IAAI,KAAK,EAAE/B,SAAS,CAAC;AACjFgC,MAAAA,kBAAkB,EAAEnE,eAAe,CAACC,MAAM,EAAEnB,MAAM,CAACoF,kBAAkB,IAAI,KAAK,EAAE9B,UAAU,CAAC;AAC3FgC,MAAAA,eAAe,EAAExC,UAAU;AAC3ByC,MAAAA,gBAAgB,EAAExC,KAAK,CAACgB,WAAW,IAAI,CAAC;AACxCyB,MAAAA,iBAAiB,EAAEzC,KAAK,CAACmB,YAAY,IAAI,CAAC;AAC1C,MAAA,GAAGI,qBAAqB;AACxBmB,MAAAA,WAAW,EAAE7C,OAAO;AACpB8C,MAAAA,YAAY,EAAEhD,OAAO;AACrBiD,MAAAA,YAAY,EAAE9C,OAAO;MACrB,GAAG7C,MAAM,CAAC4F,iBAAiB;AAC3B,MAAA,IAAInD,UAAU,GAAG,EAAE,GAAG;AAAEoD,QAAAA,uBAAuB,EAAE,KAAA;AAAM,OAAC,CAAC;AACzD,MAAA,IAAI3C,KAAK,GAAG;AAAE4C,QAAAA,SAAS,EAAE5C,KAAAA;OAAO,GAAG,EAAE,CAAC;AACtC,MAAA,GAAGM,SAAS;MACZ,GAAGG,gBAAAA;KACJ,CAAA;AAED,IAAA,IAAIR,SAAS,EAAE;AACb;MACA4C,OAAO,CAACC,GAAG,CAAC,0BAA0B,EAAEtE,IAAI,CAACE,SAAS,CAACiD,UAAU,CAAC,CAAC,CAAA;MACnE,IAAI;AACF;AACAkB,QAAAA,OAAO,CAACC,GAAG,CACT,yBAAyB,EACzBC,IAAI,CAACC,KAAK,CAAErE,MAAM,CAACsE,UAAU,CAACzE,IAAI,CAACE,SAAS,CAACiD,UAAU,CAAC,EAAE/E,aAAa,CAAC,GAAG,IAAI,GAAI,KAAK,CAAC,GAAG,KAC9F,CAAC,CAAA;AACD;AACAiG,QAAAA,OAAO,CAACC,GAAG,CACT,yBAAyB,EACzBC,IAAI,CAACC,KAAK,CAAErE,MAAM,CAACsE,UAAU,CAACzE,IAAI,CAACE,SAAS,CAACiD,UAAU,CAAC,EAAE/E,aAAa,CAAC,GAAG,IAAI,GAAG,IAAI,GAAI,KAAK,CAAC,GAAG,KACrG,CAAC,CAAA;OACF,CAAC,OAAOmD,KAAK,EAAE;AACd8C,QAAAA,OAAO,CAAC9C,KAAK,CAAC,mCAAmC,EAAEA,KAAK,CAAC,CAAA;AAC3D,OAAA;AACF,KAAA;IAEA9B,MAAM,CAACiC,OAAO,CAAC;MACbX,UAAU,EAAEA,UAAU,IAAIC,OAAO;AACjC0D,MAAAA,KAAK,EAAE,gBAAgB;MACvBvB,UAAU;MACVwB,MAAM,EAAErG,MAAM,CAACsG,aAAAA;AACjB,KAAC,CAAC,CAAA;AACJ,GAAA;AACF,CAAC;;AClPM,MAAMC,gBAAgB,SAASC,iBAAiB,CAAC;EAItDC,WAAWA,CAACC,MAAiC,EAAE;IAC7C,MAAM;MAAEC,OAAO;MAAE,GAAGC,eAAAA;AAAgB,KAAC,GAAGF,MAAM,CAAA;IAC9C,KAAK,CAACE,eAAe,CAAC,CAAA;IACtB,IAAI,CAACC,QAAQ,GAAGF,OAAO,CAAA;IACvB,IAAI,CAAC5F,QAAQ,GAAG,IAAI+F,eAAe,CAAC,IAAI,EAAE,IAAI,CAACD,QAAQ,CAAC,CAAA;AAC1D,GAAA;AACF,CAAA;AAEO,MAAMC,eAAe,SAASN,iBAAiB,CAACO,QAAQ,CAAC;AAG9DN,EAAAA,WAAWA,CAACO,YAA8B,EAAEH,QAAiB,EAAE;IAC7D,KAAK,CAACG,YAAY,CAAC,CAAA;IACnB,IAAI,CAACH,QAAQ,GAAGA,QAAQ,CAAA;AAC1B,GAAA;AAWOI,EAAAA,MAAMA,CACXC,IAA4C,EAC5CC,OAAwB,EACyC;IACjE,MAAM;MACJC,iBAAiB;MACjBC,cAAc;MACdzB,iBAAiB;AACjB;AACAR,MAAAA,kBAAkB,GAAG,KAAK;MAC1BkB,aAAa;MACb,GAAGgB,eAAAA;AACL,KAAC,GAAGJ,IAAI,CAAA;AAER,IAAA,MAAMxE,OAAO,GAAG2E,cAAc,IAAIE,EAAM,EAAE,CAAA;AAC1C,IAAA,MAAMC,SAAS,GAAGC,IAAI,CAACC,GAAG,EAAE,CAAA;IAE5B,MAAMC,aAAa,GAAG,KAAK,CAACV,MAAM,CAACK,eAAe,EAAEH,OAAO,CAAC,CAAA;IAE5D,IAAIG,eAAe,CAACM,MAAM,EAAE;AAC1B,MAAA,OAAOD,aAAa,CAACE,IAAI,CAAEC,KAAK,IAAK;QACnC,IAAIC,kBAAkB,GAAG,EAAE,CAAA;AAC3B,QAAA,MAAMhF,KAKL,GAAG;AACFgB,UAAAA,WAAW,EAAE,CAAC;AACdG,UAAAA,YAAY,EAAE,CAAC;AACfS,UAAAA,wBAAwB,EAAE,CAAC;AAC3BF,UAAAA,oBAAoB,EAAE,CAAA;SACvB,CAAA;QACD,IAAI,KAAK,IAAIqD,KAAK,EAAE;UAClB,MAAM,CAACE,OAAO,EAAEC,OAAO,CAAC,GAAGH,KAAK,CAACI,GAAG,EAAE,CAAA;AACrC,UAAA,CAAC,YAAY;YACZ,IAAI;AACF,cAAA,WAAW,MAAMC,KAAK,IAAIH,OAAO,EAAE;gBACjC,IAAI,OAAO,IAAIG,KAAK,EAAE;AACpB,kBAAA,IAAI,MAAM,IAAIA,KAAK,CAACC,KAAK,EAAE;oBACzB,MAAMA,KAAK,GAAGD,KAAK,EAAEC,KAAK,EAAE1H,IAAI,IAAI,EAAE,CAAA;AACtCqH,oBAAAA,kBAAkB,IAAIK,KAAK,CAAA;AAC7B,mBAAA;AACF,iBAAA;AACA,gBAAA,IAAID,KAAK,CAACE,IAAI,IAAI,eAAe,EAAE;kBACjCtF,KAAK,CAACgB,WAAW,GAAGoE,KAAK,CAACG,OAAO,CAACvF,KAAK,CAACwF,YAAY,IAAI,CAAC,CAAA;kBACzDxF,KAAK,CAAC4B,wBAAwB,GAAGwD,KAAK,CAACG,OAAO,CAACvF,KAAK,CAACyF,2BAA2B,IAAI,CAAC,CAAA;kBACrFzF,KAAK,CAAC0B,oBAAoB,GAAG0D,KAAK,CAACG,OAAO,CAACvF,KAAK,CAAC0F,uBAAuB,IAAI,CAAC,CAAA;AAC/E,iBAAA;gBACA,IAAI,OAAO,IAAIN,KAAK,EAAE;kBACpBpF,KAAK,CAACmB,YAAY,GAAGiE,KAAK,CAACpF,KAAK,CAAC2F,aAAa,IAAI,CAAC,CAAA;AACrD,iBAAA;AACF,eAAA;cACA,MAAM9F,OAAO,GAAG,CAAC6E,IAAI,CAACC,GAAG,EAAE,GAAGF,SAAS,IAAI,IAAI,CAAA;AAC/ChF,cAAAA,kBAAkB,CAAC;gBACjBrB,MAAM,EAAE,IAAI,CAAC0F,QAAQ;gBACrBpE,UAAU,EAAE2E,iBAAiB,IAAI1E,OAAO;gBACxCA,OAAO;gBACPC,KAAK,EAAE2E,eAAe,CAAC3E,KAAK;AAC5B7B,gBAAAA,QAAQ,EAAE,WAAW;AACrBO,gBAAAA,KAAK,EAAER,iBAAiB,CAACyG,eAAe,EAAE,WAAW,CAAC;AACtD/G,gBAAAA,MAAM,EAAE,CAAC;AAAEE,kBAAAA,OAAO,EAAEsH,kBAAkB;AAAEnH,kBAAAA,IAAI,EAAE,WAAA;AAAY,iBAAC,CAAC;gBAC5DgC,OAAO;AACPC,gBAAAA,OAAO,EAAG,IAAI,CAASA,OAAO,IAAI,EAAE;AACpC7C,gBAAAA,MAAM,EAAEkH,IAAI;AACZpE,gBAAAA,UAAU,EAAE,GAAG;AACfC,gBAAAA,KAAAA;AACF,eAAC,CAAC,CAAA;aACH,CAAC,OAAOE,KAAU,EAAE;AACnB;AACAT,cAAAA,kBAAkB,CAAC;gBACjBrB,MAAM,EAAE,IAAI,CAAC0F,QAAQ;gBACrBpE,UAAU,EAAE2E,iBAAiB,IAAI1E,OAAO;gBACxCA,OAAO;gBACPC,KAAK,EAAE2E,eAAe,CAAC3E,KAAK;AAC5B7B,gBAAAA,QAAQ,EAAE,WAAW;AACrBO,gBAAAA,KAAK,EAAER,iBAAiB,CAACyG,eAAe,EAAE,WAAW,CAAC;AACtD/G,gBAAAA,MAAM,EAAE,EAAE;AACVqC,gBAAAA,OAAO,EAAE,CAAC;AACVC,gBAAAA,OAAO,EAAG,IAAI,CAASA,OAAO,IAAI,EAAE;AACpC7C,gBAAAA,MAAM,EAAEkH,IAAI;gBACZpE,UAAU,EAAEG,KAAK,EAAE0F,MAAM,GAAG1F,KAAK,CAAC0F,MAAM,GAAG,GAAG;AAC9C5F,gBAAAA,KAAK,EAAE;AACLgB,kBAAAA,WAAW,EAAE,CAAC;AACdG,kBAAAA,YAAY,EAAE,CAAA;iBACf;AACDlB,gBAAAA,OAAO,EAAE,IAAI;AACbC,gBAAAA,KAAK,EAAEvB,IAAI,CAACE,SAAS,CAACqB,KAAK,CAAA;AAC7B,eAAC,CAAC,CAAA;AACJ,aAAA;AACF,WAAC,GAAG,CAAA;;AAEJ;AACA,UAAA,OAAOgF,OAAO,CAAA;AAChB,SAAA;AACA,QAAA,OAAOH,KAAK,CAAA;AACd,OAAC,CAAC,CAAA;AACJ,KAAC,MAAM;AACL,MAAA,MAAMc,cAAc,GAAGjB,aAAa,CAACE,IAAI,CACtCgB,MAAM,IAAK;QACV,IAAI,SAAS,IAAIA,MAAM,EAAE;UACvB,MAAMjG,OAAO,GAAG,CAAC6E,IAAI,CAACC,GAAG,EAAE,GAAGF,SAAS,IAAI,IAAI,CAAA;AAC/ChF,UAAAA,kBAAkB,CAAC;YACjBrB,MAAM,EAAE,IAAI,CAAC0F,QAAQ;YACrBpE,UAAU,EAAE2E,iBAAiB,IAAI1E,OAAO;YACxCA,OAAO;YACPC,KAAK,EAAE2E,eAAe,CAAC3E,KAAK;AAC5B7B,YAAAA,QAAQ,EAAE,WAAW;AACrBO,YAAAA,KAAK,EAAER,iBAAiB,CAACyG,eAAe,EAAE,WAAW,CAAC;AACtD/G,YAAAA,MAAM,EAAEF,uBAAuB,CAACwI,MAAM,CAAC;YACvCjG,OAAO;AACPC,YAAAA,OAAO,EAAG,IAAI,CAASA,OAAO,IAAI,EAAE;AACpC7C,YAAAA,MAAM,EAAEkH,IAAI;AACZpE,YAAAA,UAAU,EAAE,GAAG;AACfC,YAAAA,KAAK,EAAE;AACLgB,cAAAA,WAAW,EAAE8E,MAAM,CAAC9F,KAAK,CAACwF,YAAY,IAAI,CAAC;AAC3CrE,cAAAA,YAAY,EAAE2E,MAAM,CAAC9F,KAAK,CAAC2F,aAAa,IAAI,CAAC;AAC7C/D,cAAAA,wBAAwB,EAAEkE,MAAM,CAAC9F,KAAK,CAACyF,2BAA2B,IAAI,CAAC;AACvE/D,cAAAA,oBAAoB,EAAEoE,MAAM,CAAC9F,KAAK,CAAC0F,uBAAuB,IAAI,CAAA;AAChE,aAAA;AACF,WAAC,CAAC,CAAA;AACJ,SAAA;AACA,QAAA,OAAOI,MAAM,CAAA;OACd,EACA5F,KAAU,IAAK;AACdT,QAAAA,kBAAkB,CAAC;UACjBrB,MAAM,EAAE,IAAI,CAAC0F,QAAQ;UACrBpE,UAAU,EAAE2E,iBAAiB,IAAI1E,OAAO;UACxCA,OAAO;UACPC,KAAK,EAAE2E,eAAe,CAAC3E,KAAK;AAC5B7B,UAAAA,QAAQ,EAAE,WAAW;AACrBO,UAAAA,KAAK,EAAER,iBAAiB,CAACyG,eAAe,EAAE,WAAW,CAAC;AACtD/G,UAAAA,MAAM,EAAE,EAAE;AACVqC,UAAAA,OAAO,EAAE,CAAC;AACVC,UAAAA,OAAO,EAAG,IAAI,CAASA,OAAO,IAAI,EAAE;AACpC7C,UAAAA,MAAM,EAAEkH,IAAI;UACZpE,UAAU,EAAEG,KAAK,EAAE0F,MAAM,GAAG1F,KAAK,CAAC0F,MAAM,GAAG,GAAG;AAC9C5F,UAAAA,KAAK,EAAE;AACLgB,YAAAA,WAAW,EAAE,CAAC;AACdG,YAAAA,YAAY,EAAE,CAAA;WACf;AACDlB,UAAAA,OAAO,EAAE,IAAI;AACbC,UAAAA,KAAK,EAAEvB,IAAI,CAACE,SAAS,CAACqB,KAAK,CAAA;AAC7B,SAAC,CAAC,CAAA;AACF,QAAA,MAAMA,KAAK,CAAA;AACb,OACF,CAAwB,CAAA;AAExB,MAAA,OAAO2F,cAAc,CAAA;AACvB,KAAA;AACF,GAAA;AACF;;;;"}
|
|
1
|
+
{"version":3,"file":"index.esm.js","sources":["../../src/utils.ts","../../src/anthropic/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\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 }\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 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) return Promise.resolve()\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 AnthropicOriginal from '@anthropic-ai/sdk'\nimport { PostHog } from 'posthog-node'\nimport { v4 as uuidv4 } from 'uuid'\nimport { formatResponseAnthropic, mergeSystemPrompt, MonitoringParams, sendEventToPosthog } from '../utils'\n\ntype MessageCreateParamsNonStreaming = AnthropicOriginal.Messages.MessageCreateParamsNonStreaming\ntype MessageCreateParamsStreaming = AnthropicOriginal.Messages.MessageCreateParamsStreaming\ntype MessageCreateParams = AnthropicOriginal.Messages.MessageCreateParams\ntype Message = AnthropicOriginal.Messages.Message\ntype RawMessageStreamEvent = AnthropicOriginal.Messages.RawMessageStreamEvent\ntype MessageCreateParamsBase = AnthropicOriginal.Messages.MessageCreateParams\n\nimport type { APIPromise, RequestOptions } from '@anthropic-ai/sdk/core'\nimport type { Stream } from '@anthropic-ai/sdk/streaming'\n\ninterface MonitoringAnthropicConfig {\n apiKey: string\n posthog: PostHog\n baseURL?: string\n}\n\nexport class PostHogAnthropic extends AnthropicOriginal {\n private readonly phClient: PostHog\n public messages: WrappedMessages\n\n constructor(config: MonitoringAnthropicConfig) {\n const { posthog, ...anthropicConfig } = config\n super(anthropicConfig)\n this.phClient = posthog\n this.messages = new WrappedMessages(this, this.phClient)\n }\n}\n\nexport class WrappedMessages extends AnthropicOriginal.Messages {\n private readonly phClient: PostHog\n\n constructor(parentClient: PostHogAnthropic, phClient: PostHog) {\n super(parentClient)\n this.phClient = phClient\n }\n\n public create(body: MessageCreateParamsNonStreaming, options?: RequestOptions): APIPromise<Message>\n public create(\n body: MessageCreateParamsStreaming & MonitoringParams,\n options?: RequestOptions\n ): APIPromise<Stream<RawMessageStreamEvent>>\n public create(\n body: MessageCreateParamsBase & MonitoringParams,\n options?: RequestOptions\n ): APIPromise<Stream<RawMessageStreamEvent> | Message>\n public create(\n body: MessageCreateParams & MonitoringParams,\n options?: RequestOptions\n ): APIPromise<Message> | APIPromise<Stream<RawMessageStreamEvent>> {\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 ...anthropicParams\n } = body\n\n const traceId = posthogTraceId ?? uuidv4()\n const startTime = Date.now()\n\n const parentPromise = super.create(anthropicParams, options)\n\n if (anthropicParams.stream) {\n return parentPromise.then((value) => {\n let accumulatedContent = ''\n const usage: {\n inputTokens: number\n outputTokens: number\n cacheCreationInputTokens?: number\n cacheReadInputTokens?: number\n } = {\n inputTokens: 0,\n outputTokens: 0,\n cacheCreationInputTokens: 0,\n cacheReadInputTokens: 0,\n }\n if ('tee' in value) {\n const [stream1, stream2] = value.tee()\n ;(async () => {\n try {\n for await (const chunk of stream1) {\n if ('delta' in chunk) {\n if ('text' in chunk.delta) {\n const delta = chunk?.delta?.text ?? ''\n accumulatedContent += delta\n }\n }\n if (chunk.type == 'message_start') {\n usage.inputTokens = chunk.message.usage.input_tokens ?? 0\n usage.cacheCreationInputTokens = chunk.message.usage.cache_creation_input_tokens ?? 0\n usage.cacheReadInputTokens = chunk.message.usage.cache_read_input_tokens ?? 0\n }\n if ('usage' in chunk) {\n usage.outputTokens = chunk.usage.output_tokens ?? 0\n }\n }\n const latency = (Date.now() - startTime) / 1000\n await sendEventToPosthog({\n client: this.phClient,\n distinctId: posthogDistinctId ?? traceId,\n traceId,\n model: anthropicParams.model,\n provider: 'anthropic',\n input: mergeSystemPrompt(anthropicParams, 'anthropic'),\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 // error handling\n await sendEventToPosthog({\n client: this.phClient,\n distinctId: posthogDistinctId ?? traceId,\n traceId,\n model: anthropicParams.model,\n provider: 'anthropic',\n input: mergeSystemPrompt(anthropicParams, 'anthropic'),\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 }\n })()\n\n // Return the other stream to the user\n return stream2\n }\n return value\n }) as APIPromise<Stream<RawMessageStreamEvent>>\n } else {\n const wrappedPromise = parentPromise.then(\n async (result) => {\n if ('content' in result) {\n const latency = (Date.now() - startTime) / 1000\n await sendEventToPosthog({\n client: this.phClient,\n distinctId: posthogDistinctId ?? traceId,\n traceId,\n model: anthropicParams.model,\n provider: 'anthropic',\n input: mergeSystemPrompt(anthropicParams, 'anthropic'),\n output: formatResponseAnthropic(result),\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 cacheCreationInputTokens: result.usage.cache_creation_input_tokens ?? 0,\n cacheReadInputTokens: result.usage.cache_read_input_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 ?? traceId,\n traceId,\n model: anthropicParams.model,\n provider: 'anthropic',\n input: mergeSystemPrompt(anthropicParams, 'anthropic'),\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<Message>\n\n return wrappedPromise\n }\n }\n}\n\nexport default PostHogAnthropic\n\nexport { PostHogAnthropic as Anthropic }\n"],"names":["STRING_FORMAT","getModelParams","params","modelParams","paramKeys","key","undefined","formatResponseAnthropic","response","output","choice","content","text","push","role","mergeSystemPrompt","provider","messages","system","systemMessage","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","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","PostHogAnthropic","AnthropicOriginal","constructor","config","posthog","anthropicConfig","phClient","WrappedMessages","Messages","parentClient","create","body","options","posthogDistinctId","posthogTraceId","posthogCaptureImmediate","anthropicParams","uuidv4","startTime","Date","now","parentPromise","stream","then","value","accumulatedContent","stream1","stream2","tee","chunk","delta","type","message","input_tokens","cache_creation_input_tokens","cache_read_input_tokens","output_tokens","status","wrappedPromise","result"],"mappings":"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"}
|
package/lib/index.cjs.js
CHANGED
|
@@ -117,7 +117,7 @@ function sanitizeValues(obj) {
|
|
|
117
117
|
}
|
|
118
118
|
return jsonSafe;
|
|
119
119
|
}
|
|
120
|
-
const sendEventToPosthog = ({
|
|
120
|
+
const sendEventToPosthog = async ({
|
|
121
121
|
client,
|
|
122
122
|
distinctId,
|
|
123
123
|
traceId,
|
|
@@ -133,82 +133,75 @@ const sendEventToPosthog = ({
|
|
|
133
133
|
isError = false,
|
|
134
134
|
error,
|
|
135
135
|
tools,
|
|
136
|
-
|
|
136
|
+
captureImmediate = false
|
|
137
137
|
}) => {
|
|
138
|
-
if (client.capture)
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
};
|
|
149
|
-
}
|
|
150
|
-
let costOverrideData = {};
|
|
151
|
-
if (params.posthogCostOverride) {
|
|
152
|
-
const inputCostUSD = (params.posthogCostOverride.inputCost ?? 0) * (usage.inputTokens ?? 0);
|
|
153
|
-
const outputCostUSD = (params.posthogCostOverride.outputCost ?? 0) * (usage.outputTokens ?? 0);
|
|
154
|
-
costOverrideData = {
|
|
155
|
-
$ai_input_cost_usd: inputCostUSD,
|
|
156
|
-
$ai_output_cost_usd: outputCostUSD,
|
|
157
|
-
$ai_total_cost_usd: inputCostUSD + outputCostUSD
|
|
158
|
-
};
|
|
159
|
-
}
|
|
160
|
-
const additionalTokenValues = {
|
|
161
|
-
...(usage.reasoningTokens ? {
|
|
162
|
-
$ai_reasoning_tokens: usage.reasoningTokens
|
|
163
|
-
} : {}),
|
|
164
|
-
...(usage.cacheReadInputTokens ? {
|
|
165
|
-
$ai_cache_read_input_tokens: usage.cacheReadInputTokens
|
|
166
|
-
} : {}),
|
|
167
|
-
...(usage.cacheCreationInputTokens ? {
|
|
168
|
-
$ai_cache_creation_input_tokens: usage.cacheCreationInputTokens
|
|
169
|
-
} : {})
|
|
138
|
+
if (!client.capture) return Promise.resolve();
|
|
139
|
+
// sanitize input and output for UTF-8 validity
|
|
140
|
+
const safeInput = sanitizeValues(input);
|
|
141
|
+
const safeOutput = sanitizeValues(output);
|
|
142
|
+
const safeError = sanitizeValues(error);
|
|
143
|
+
let errorData = {};
|
|
144
|
+
if (isError) {
|
|
145
|
+
errorData = {
|
|
146
|
+
$ai_is_error: true,
|
|
147
|
+
$ai_error: safeError
|
|
170
148
|
};
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
$
|
|
178
|
-
$
|
|
179
|
-
$
|
|
180
|
-
...additionalTokenValues,
|
|
181
|
-
$ai_latency: latency,
|
|
182
|
-
$ai_trace_id: traceId,
|
|
183
|
-
$ai_base_url: baseURL,
|
|
184
|
-
...params.posthogProperties,
|
|
185
|
-
...(distinctId ? {} : {
|
|
186
|
-
$process_person_profile: false
|
|
187
|
-
}),
|
|
188
|
-
...(tools ? {
|
|
189
|
-
$ai_tools: tools
|
|
190
|
-
} : {}),
|
|
191
|
-
...errorData,
|
|
192
|
-
...costOverrideData
|
|
149
|
+
}
|
|
150
|
+
let costOverrideData = {};
|
|
151
|
+
if (params.posthogCostOverride) {
|
|
152
|
+
const inputCostUSD = (params.posthogCostOverride.inputCost ?? 0) * (usage.inputTokens ?? 0);
|
|
153
|
+
const outputCostUSD = (params.posthogCostOverride.outputCost ?? 0) * (usage.outputTokens ?? 0);
|
|
154
|
+
costOverrideData = {
|
|
155
|
+
$ai_input_cost_usd: inputCostUSD,
|
|
156
|
+
$ai_output_cost_usd: outputCostUSD,
|
|
157
|
+
$ai_total_cost_usd: inputCostUSD + outputCostUSD
|
|
193
158
|
};
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
159
|
+
}
|
|
160
|
+
const additionalTokenValues = {
|
|
161
|
+
...(usage.reasoningTokens ? {
|
|
162
|
+
$ai_reasoning_tokens: usage.reasoningTokens
|
|
163
|
+
} : {}),
|
|
164
|
+
...(usage.cacheReadInputTokens ? {
|
|
165
|
+
$ai_cache_read_input_tokens: usage.cacheReadInputTokens
|
|
166
|
+
} : {}),
|
|
167
|
+
...(usage.cacheCreationInputTokens ? {
|
|
168
|
+
$ai_cache_creation_input_tokens: usage.cacheCreationInputTokens
|
|
169
|
+
} : {})
|
|
170
|
+
};
|
|
171
|
+
const properties = {
|
|
172
|
+
$ai_provider: params.posthogProviderOverride ?? provider,
|
|
173
|
+
$ai_model: params.posthogModelOverride ?? model,
|
|
174
|
+
$ai_model_parameters: getModelParams(params),
|
|
175
|
+
$ai_input: withPrivacyMode(client, params.posthogPrivacyMode ?? false, safeInput),
|
|
176
|
+
$ai_output_choices: withPrivacyMode(client, params.posthogPrivacyMode ?? false, safeOutput),
|
|
177
|
+
$ai_http_status: httpStatus,
|
|
178
|
+
$ai_input_tokens: usage.inputTokens ?? 0,
|
|
179
|
+
$ai_output_tokens: usage.outputTokens ?? 0,
|
|
180
|
+
...additionalTokenValues,
|
|
181
|
+
$ai_latency: latency,
|
|
182
|
+
$ai_trace_id: traceId,
|
|
183
|
+
$ai_base_url: baseURL,
|
|
184
|
+
...params.posthogProperties,
|
|
185
|
+
...(distinctId ? {} : {
|
|
186
|
+
$process_person_profile: false
|
|
187
|
+
}),
|
|
188
|
+
...(tools ? {
|
|
189
|
+
$ai_tools: tools
|
|
190
|
+
} : {}),
|
|
191
|
+
...errorData,
|
|
192
|
+
...costOverrideData
|
|
193
|
+
};
|
|
194
|
+
const event = {
|
|
195
|
+
distinctId: distinctId ?? traceId,
|
|
196
|
+
event: '$ai_generation',
|
|
197
|
+
properties,
|
|
198
|
+
groups: params.posthogGroups
|
|
199
|
+
};
|
|
200
|
+
if (captureImmediate) {
|
|
201
|
+
// await capture promise to send single event in serverless environments
|
|
202
|
+
await client.captureImmediate(event);
|
|
203
|
+
} else {
|
|
204
|
+
client.capture(event);
|
|
212
205
|
}
|
|
213
206
|
};
|
|
214
207
|
|
|
@@ -243,6 +236,7 @@ class WrappedCompletions$1 extends OpenAIOrignal__default["default"].Chat.Comple
|
|
|
243
236
|
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
244
237
|
posthogPrivacyMode = false,
|
|
245
238
|
posthogGroups,
|
|
239
|
+
posthogCaptureImmediate,
|
|
246
240
|
...openAIParams
|
|
247
241
|
} = body;
|
|
248
242
|
const traceId = posthogTraceId ?? uuid.v4();
|
|
@@ -272,7 +266,7 @@ class WrappedCompletions$1 extends OpenAIOrignal__default["default"].Chat.Comple
|
|
|
272
266
|
}
|
|
273
267
|
}
|
|
274
268
|
const latency = (Date.now() - startTime) / 1000;
|
|
275
|
-
sendEventToPosthog({
|
|
269
|
+
await sendEventToPosthog({
|
|
276
270
|
client: this.phClient,
|
|
277
271
|
distinctId: posthogDistinctId ?? traceId,
|
|
278
272
|
traceId,
|
|
@@ -287,10 +281,11 @@ class WrappedCompletions$1 extends OpenAIOrignal__default["default"].Chat.Comple
|
|
|
287
281
|
baseURL: this.baseURL ?? '',
|
|
288
282
|
params: body,
|
|
289
283
|
httpStatus: 200,
|
|
290
|
-
usage
|
|
284
|
+
usage,
|
|
285
|
+
captureImmediate: posthogCaptureImmediate
|
|
291
286
|
});
|
|
292
287
|
} catch (error) {
|
|
293
|
-
sendEventToPosthog({
|
|
288
|
+
await sendEventToPosthog({
|
|
294
289
|
client: this.phClient,
|
|
295
290
|
distinctId: posthogDistinctId ?? traceId,
|
|
296
291
|
traceId,
|
|
@@ -307,7 +302,8 @@ class WrappedCompletions$1 extends OpenAIOrignal__default["default"].Chat.Comple
|
|
|
307
302
|
outputTokens: 0
|
|
308
303
|
},
|
|
309
304
|
isError: true,
|
|
310
|
-
error: JSON.stringify(error)
|
|
305
|
+
error: JSON.stringify(error),
|
|
306
|
+
captureImmediate: posthogCaptureImmediate
|
|
311
307
|
});
|
|
312
308
|
}
|
|
313
309
|
})();
|
|
@@ -317,10 +313,10 @@ class WrappedCompletions$1 extends OpenAIOrignal__default["default"].Chat.Comple
|
|
|
317
313
|
return value;
|
|
318
314
|
});
|
|
319
315
|
} else {
|
|
320
|
-
const wrappedPromise = parentPromise.then(result => {
|
|
316
|
+
const wrappedPromise = parentPromise.then(async result => {
|
|
321
317
|
if ('choices' in result) {
|
|
322
318
|
const latency = (Date.now() - startTime) / 1000;
|
|
323
|
-
sendEventToPosthog({
|
|
319
|
+
await sendEventToPosthog({
|
|
324
320
|
client: this.phClient,
|
|
325
321
|
distinctId: posthogDistinctId ?? traceId,
|
|
326
322
|
traceId,
|
|
@@ -337,12 +333,13 @@ class WrappedCompletions$1 extends OpenAIOrignal__default["default"].Chat.Comple
|
|
|
337
333
|
outputTokens: result.usage?.completion_tokens ?? 0,
|
|
338
334
|
reasoningTokens: result.usage?.completion_tokens_details?.reasoning_tokens ?? 0,
|
|
339
335
|
cacheReadInputTokens: result.usage?.prompt_tokens_details?.cached_tokens ?? 0
|
|
340
|
-
}
|
|
336
|
+
},
|
|
337
|
+
captureImmediate: posthogCaptureImmediate
|
|
341
338
|
});
|
|
342
339
|
}
|
|
343
340
|
return result;
|
|
344
|
-
}, error => {
|
|
345
|
-
sendEventToPosthog({
|
|
341
|
+
}, async error => {
|
|
342
|
+
await sendEventToPosthog({
|
|
346
343
|
client: this.phClient,
|
|
347
344
|
distinctId: posthogDistinctId ?? traceId,
|
|
348
345
|
traceId,
|
|
@@ -359,7 +356,8 @@ class WrappedCompletions$1 extends OpenAIOrignal__default["default"].Chat.Comple
|
|
|
359
356
|
outputTokens: 0
|
|
360
357
|
},
|
|
361
358
|
isError: true,
|
|
362
|
-
error: JSON.stringify(error)
|
|
359
|
+
error: JSON.stringify(error),
|
|
360
|
+
captureImmediate: posthogCaptureImmediate
|
|
363
361
|
});
|
|
364
362
|
throw error;
|
|
365
363
|
});
|
|
@@ -399,6 +397,7 @@ class WrappedCompletions extends OpenAIOrignal.AzureOpenAI.Chat.Completions {
|
|
|
399
397
|
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
400
398
|
posthogPrivacyMode = false,
|
|
401
399
|
posthogGroups,
|
|
400
|
+
posthogCaptureImmediate,
|
|
402
401
|
...openAIParams
|
|
403
402
|
} = body;
|
|
404
403
|
const traceId = posthogTraceId ?? uuid.v4();
|
|
@@ -432,7 +431,7 @@ class WrappedCompletions extends OpenAIOrignal.AzureOpenAI.Chat.Completions {
|
|
|
432
431
|
}
|
|
433
432
|
}
|
|
434
433
|
const latency = (Date.now() - startTime) / 1000;
|
|
435
|
-
sendEventToPosthog({
|
|
434
|
+
await sendEventToPosthog({
|
|
436
435
|
client: this.phClient,
|
|
437
436
|
distinctId: posthogDistinctId ?? traceId,
|
|
438
437
|
traceId,
|
|
@@ -447,11 +446,12 @@ class WrappedCompletions extends OpenAIOrignal.AzureOpenAI.Chat.Completions {
|
|
|
447
446
|
baseURL: this.baseURL ?? '',
|
|
448
447
|
params: body,
|
|
449
448
|
httpStatus: 200,
|
|
450
|
-
usage
|
|
449
|
+
usage,
|
|
450
|
+
captureImmediate: posthogCaptureImmediate
|
|
451
451
|
});
|
|
452
452
|
} catch (error) {
|
|
453
453
|
// error handling
|
|
454
|
-
sendEventToPosthog({
|
|
454
|
+
await sendEventToPosthog({
|
|
455
455
|
client: this.phClient,
|
|
456
456
|
distinctId: posthogDistinctId ?? traceId,
|
|
457
457
|
traceId,
|
|
@@ -468,7 +468,8 @@ class WrappedCompletions extends OpenAIOrignal.AzureOpenAI.Chat.Completions {
|
|
|
468
468
|
outputTokens: 0
|
|
469
469
|
},
|
|
470
470
|
isError: true,
|
|
471
|
-
error: JSON.stringify(error)
|
|
471
|
+
error: JSON.stringify(error),
|
|
472
|
+
captureImmediate: posthogCaptureImmediate
|
|
472
473
|
});
|
|
473
474
|
}
|
|
474
475
|
})();
|
|
@@ -478,14 +479,14 @@ class WrappedCompletions extends OpenAIOrignal.AzureOpenAI.Chat.Completions {
|
|
|
478
479
|
return value;
|
|
479
480
|
});
|
|
480
481
|
} else {
|
|
481
|
-
const wrappedPromise = parentPromise.then(result => {
|
|
482
|
+
const wrappedPromise = parentPromise.then(async result => {
|
|
482
483
|
if ('choices' in result) {
|
|
483
484
|
const latency = (Date.now() - startTime) / 1000;
|
|
484
485
|
let model = openAIParams.model;
|
|
485
486
|
if (result.model != model) {
|
|
486
487
|
model = result.model;
|
|
487
488
|
}
|
|
488
|
-
sendEventToPosthog({
|
|
489
|
+
await sendEventToPosthog({
|
|
489
490
|
client: this.phClient,
|
|
490
491
|
distinctId: posthogDistinctId ?? traceId,
|
|
491
492
|
traceId,
|
|
@@ -502,12 +503,13 @@ class WrappedCompletions extends OpenAIOrignal.AzureOpenAI.Chat.Completions {
|
|
|
502
503
|
outputTokens: result.usage?.completion_tokens ?? 0,
|
|
503
504
|
reasoningTokens: result.usage?.completion_tokens_details?.reasoning_tokens ?? 0,
|
|
504
505
|
cacheReadInputTokens: result.usage?.prompt_tokens_details?.cached_tokens ?? 0
|
|
505
|
-
}
|
|
506
|
+
},
|
|
507
|
+
captureImmediate: posthogCaptureImmediate
|
|
506
508
|
});
|
|
507
509
|
}
|
|
508
510
|
return result;
|
|
509
|
-
}, error => {
|
|
510
|
-
sendEventToPosthog({
|
|
511
|
+
}, async error => {
|
|
512
|
+
await sendEventToPosthog({
|
|
511
513
|
client: this.phClient,
|
|
512
514
|
distinctId: posthogDistinctId ?? traceId,
|
|
513
515
|
traceId,
|
|
@@ -524,7 +526,8 @@ class WrappedCompletions extends OpenAIOrignal.AzureOpenAI.Chat.Completions {
|
|
|
524
526
|
outputTokens: 0
|
|
525
527
|
},
|
|
526
528
|
isError: true,
|
|
527
|
-
error: JSON.stringify(error)
|
|
529
|
+
error: JSON.stringify(error),
|
|
530
|
+
captureImmediate: posthogCaptureImmediate
|
|
528
531
|
});
|
|
529
532
|
throw error;
|
|
530
533
|
});
|
|
@@ -623,7 +626,9 @@ const mapVercelPrompt = prompt => {
|
|
|
623
626
|
// Trim the inputs array until its JSON size fits within MAX_OUTPUT_SIZE
|
|
624
627
|
let serialized = JSON.stringify(inputs);
|
|
625
628
|
let removedCount = 0;
|
|
626
|
-
|
|
629
|
+
// We need to keep track of the initial size of the inputs array because we're going to be mutating it
|
|
630
|
+
let initialSize = inputs.length;
|
|
631
|
+
for (let i = 0; i < initialSize && buffer.Buffer.byteLength(serialized, 'utf8') > MAX_OUTPUT_SIZE; i++) {
|
|
627
632
|
inputs.shift();
|
|
628
633
|
removedCount++;
|
|
629
634
|
serialized = JSON.stringify(inputs);
|
|
@@ -631,7 +636,7 @@ const mapVercelPrompt = prompt => {
|
|
|
631
636
|
if (removedCount > 0) {
|
|
632
637
|
// Add one placeholder to indicate how many were removed
|
|
633
638
|
inputs.unshift({
|
|
634
|
-
role: '
|
|
639
|
+
role: 'posthog',
|
|
635
640
|
content: `[${removedCount} message${removedCount === 1 ? '' : 's'} removed due to size limit]`
|
|
636
641
|
});
|
|
637
642
|
}
|
|
@@ -737,7 +742,7 @@ const createInstrumentationMiddleware = (phClient, model, options) => {
|
|
|
737
742
|
cacheCreationInputTokens: providerMetadata.anthropic.cacheCreationInputTokens
|
|
738
743
|
} : {})
|
|
739
744
|
};
|
|
740
|
-
sendEventToPosthog({
|
|
745
|
+
await sendEventToPosthog({
|
|
741
746
|
client: phClient,
|
|
742
747
|
distinctId: options.posthogDistinctId,
|
|
743
748
|
traceId: options.posthogTraceId,
|
|
@@ -757,12 +762,12 @@ const createInstrumentationMiddleware = (phClient, model, options) => {
|
|
|
757
762
|
outputTokens: result.usage.completionTokens,
|
|
758
763
|
...additionalTokenValues
|
|
759
764
|
},
|
|
760
|
-
|
|
765
|
+
captureImmediate: options.posthogCaptureImmediate
|
|
761
766
|
});
|
|
762
767
|
return result;
|
|
763
768
|
} catch (error) {
|
|
764
769
|
const modelId = model.modelId;
|
|
765
|
-
sendEventToPosthog({
|
|
770
|
+
await sendEventToPosthog({
|
|
766
771
|
client: phClient,
|
|
767
772
|
distinctId: options.posthogDistinctId,
|
|
768
773
|
traceId: options.posthogTraceId,
|
|
@@ -780,7 +785,7 @@ const createInstrumentationMiddleware = (phClient, model, options) => {
|
|
|
780
785
|
},
|
|
781
786
|
isError: true,
|
|
782
787
|
error: truncate(JSON.stringify(error)),
|
|
783
|
-
|
|
788
|
+
captureImmediate: options.posthogCaptureImmediate
|
|
784
789
|
});
|
|
785
790
|
throw error;
|
|
786
791
|
}
|
|
@@ -829,9 +834,9 @@ const createInstrumentationMiddleware = (phClient, model, options) => {
|
|
|
829
834
|
}
|
|
830
835
|
controller.enqueue(chunk);
|
|
831
836
|
},
|
|
832
|
-
flush() {
|
|
837
|
+
flush: async () => {
|
|
833
838
|
const latency = (Date.now() - startTime) / 1000;
|
|
834
|
-
sendEventToPosthog({
|
|
839
|
+
await sendEventToPosthog({
|
|
835
840
|
client: phClient,
|
|
836
841
|
distinctId: options.posthogDistinctId,
|
|
837
842
|
traceId: options.posthogTraceId,
|
|
@@ -847,7 +852,7 @@ const createInstrumentationMiddleware = (phClient, model, options) => {
|
|
|
847
852
|
params: mergedParams,
|
|
848
853
|
httpStatus: 200,
|
|
849
854
|
usage,
|
|
850
|
-
|
|
855
|
+
captureImmediate: options.posthogCaptureImmediate
|
|
851
856
|
});
|
|
852
857
|
}
|
|
853
858
|
});
|
|
@@ -856,7 +861,7 @@ const createInstrumentationMiddleware = (phClient, model, options) => {
|
|
|
856
861
|
...rest
|
|
857
862
|
};
|
|
858
863
|
} catch (error) {
|
|
859
|
-
sendEventToPosthog({
|
|
864
|
+
await sendEventToPosthog({
|
|
860
865
|
client: phClient,
|
|
861
866
|
distinctId: options.posthogDistinctId,
|
|
862
867
|
traceId: options.posthogTraceId,
|
|
@@ -874,7 +879,7 @@ const createInstrumentationMiddleware = (phClient, model, options) => {
|
|
|
874
879
|
},
|
|
875
880
|
isError: true,
|
|
876
881
|
error: truncate(JSON.stringify(error)),
|
|
877
|
-
|
|
882
|
+
captureImmediate: options.posthogCaptureImmediate
|
|
878
883
|
});
|
|
879
884
|
throw error;
|
|
880
885
|
}
|
|
@@ -920,6 +925,7 @@ class WrappedMessages extends AnthropicOriginal__default["default"].Messages {
|
|
|
920
925
|
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
921
926
|
posthogPrivacyMode = false,
|
|
922
927
|
posthogGroups,
|
|
928
|
+
posthogCaptureImmediate,
|
|
923
929
|
...anthropicParams
|
|
924
930
|
} = body;
|
|
925
931
|
const traceId = posthogTraceId ?? uuid.v4();
|
|
@@ -955,7 +961,7 @@ class WrappedMessages extends AnthropicOriginal__default["default"].Messages {
|
|
|
955
961
|
}
|
|
956
962
|
}
|
|
957
963
|
const latency = (Date.now() - startTime) / 1000;
|
|
958
|
-
sendEventToPosthog({
|
|
964
|
+
await sendEventToPosthog({
|
|
959
965
|
client: this.phClient,
|
|
960
966
|
distinctId: posthogDistinctId ?? traceId,
|
|
961
967
|
traceId,
|
|
@@ -970,11 +976,12 @@ class WrappedMessages extends AnthropicOriginal__default["default"].Messages {
|
|
|
970
976
|
baseURL: this.baseURL ?? '',
|
|
971
977
|
params: body,
|
|
972
978
|
httpStatus: 200,
|
|
973
|
-
usage
|
|
979
|
+
usage,
|
|
980
|
+
captureImmediate: posthogCaptureImmediate
|
|
974
981
|
});
|
|
975
982
|
} catch (error) {
|
|
976
983
|
// error handling
|
|
977
|
-
sendEventToPosthog({
|
|
984
|
+
await sendEventToPosthog({
|
|
978
985
|
client: this.phClient,
|
|
979
986
|
distinctId: posthogDistinctId ?? traceId,
|
|
980
987
|
traceId,
|
|
@@ -991,7 +998,8 @@ class WrappedMessages extends AnthropicOriginal__default["default"].Messages {
|
|
|
991
998
|
outputTokens: 0
|
|
992
999
|
},
|
|
993
1000
|
isError: true,
|
|
994
|
-
error: JSON.stringify(error)
|
|
1001
|
+
error: JSON.stringify(error),
|
|
1002
|
+
captureImmediate: posthogCaptureImmediate
|
|
995
1003
|
});
|
|
996
1004
|
}
|
|
997
1005
|
})();
|
|
@@ -1001,10 +1009,10 @@ class WrappedMessages extends AnthropicOriginal__default["default"].Messages {
|
|
|
1001
1009
|
return value;
|
|
1002
1010
|
});
|
|
1003
1011
|
} else {
|
|
1004
|
-
const wrappedPromise = parentPromise.then(result => {
|
|
1012
|
+
const wrappedPromise = parentPromise.then(async result => {
|
|
1005
1013
|
if ('content' in result) {
|
|
1006
1014
|
const latency = (Date.now() - startTime) / 1000;
|
|
1007
|
-
sendEventToPosthog({
|
|
1015
|
+
await sendEventToPosthog({
|
|
1008
1016
|
client: this.phClient,
|
|
1009
1017
|
distinctId: posthogDistinctId ?? traceId,
|
|
1010
1018
|
traceId,
|
|
@@ -1021,12 +1029,13 @@ class WrappedMessages extends AnthropicOriginal__default["default"].Messages {
|
|
|
1021
1029
|
outputTokens: result.usage.output_tokens ?? 0,
|
|
1022
1030
|
cacheCreationInputTokens: result.usage.cache_creation_input_tokens ?? 0,
|
|
1023
1031
|
cacheReadInputTokens: result.usage.cache_read_input_tokens ?? 0
|
|
1024
|
-
}
|
|
1032
|
+
},
|
|
1033
|
+
captureImmediate: posthogCaptureImmediate
|
|
1025
1034
|
});
|
|
1026
1035
|
}
|
|
1027
1036
|
return result;
|
|
1028
|
-
}, error => {
|
|
1029
|
-
sendEventToPosthog({
|
|
1037
|
+
}, async error => {
|
|
1038
|
+
await sendEventToPosthog({
|
|
1030
1039
|
client: this.phClient,
|
|
1031
1040
|
distinctId: posthogDistinctId ?? traceId,
|
|
1032
1041
|
traceId,
|
|
@@ -1043,7 +1052,8 @@ class WrappedMessages extends AnthropicOriginal__default["default"].Messages {
|
|
|
1043
1052
|
outputTokens: 0
|
|
1044
1053
|
},
|
|
1045
1054
|
isError: true,
|
|
1046
|
-
error: JSON.stringify(error)
|
|
1055
|
+
error: JSON.stringify(error),
|
|
1056
|
+
captureImmediate: posthogCaptureImmediate
|
|
1047
1057
|
});
|
|
1048
1058
|
throw error;
|
|
1049
1059
|
});
|