@posthog/ai 3.3.1 → 4.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/CHANGELOG.md +8 -0
- package/lib/anthropic/index.cjs.js +293 -0
- package/lib/anthropic/index.cjs.js.map +1 -0
- package/lib/anthropic/index.d.ts +45 -0
- package/lib/anthropic/index.esm.js +282 -0
- package/lib/anthropic/index.esm.js.map +1 -0
- package/lib/index.cjs.js +36 -8
- package/lib/index.cjs.js.map +1 -1
- package/lib/index.d.ts +2 -2
- package/lib/index.esm.js +36 -8
- package/lib/index.esm.js.map +1 -1
- package/lib/langchain/index.cjs.js +1003 -0
- package/lib/langchain/index.cjs.js.map +1 -0
- package/lib/langchain/index.d.ts +68 -0
- package/lib/langchain/index.esm.js +979 -0
- package/lib/langchain/index.esm.js.map +1 -0
- package/lib/openai/index.cjs.js +286 -0
- package/lib/openai/index.cjs.js.map +1 -0
- package/lib/openai/index.d.ts +49 -0
- package/lib/openai/index.esm.js +274 -0
- package/lib/openai/index.esm.js.map +1 -0
- package/lib/posthog-ai/src/anthropic/index.d.ts +1 -0
- package/lib/posthog-ai/src/langchain/index.d.ts +1 -0
- package/lib/posthog-ai/src/openai/index.d.ts +3 -2
- package/lib/posthog-ai/src/vercel/index.d.ts +1 -0
- package/lib/vercel/index.cjs.js +408 -0
- package/lib/vercel/index.cjs.js.map +1 -0
- package/lib/vercel/index.d.ts +21 -0
- package/lib/vercel/index.esm.js +404 -0
- package/lib/vercel/index.esm.js.map +1 -0
- package/package.json +28 -1
- package/src/anthropic/index.ts +2 -0
- package/src/langchain/callbacks.ts +39 -7
- package/src/langchain/index.ts +1 -0
- package/src/openai/index.ts +4 -2
- package/src/utils.ts +1 -1
- package/src/vercel/index.ts +1 -0
- package/src/vercel/middleware.ts +4 -4
- package/tsconfig.json +1 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.esm.js","sources":["../../src/utils.ts","../../src/anthropic/index.ts"],"sourcesContent":["import { PostHog } from 'posthog-node'\nimport OpenAIOrignal from 'openai'\nimport AnthropicOriginal from '@anthropic-ai/sdk'\n\ntype ChatCompletionCreateParamsBase = OpenAIOrignal.Chat.Completions.ChatCompletionCreateParams\ntype MessageCreateParams = AnthropicOriginal.Messages.MessageCreateParams\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}\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 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}\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}: SendEventToPosthogParams): void => {\n if (client.capture) {\n let errorData = {}\n if (isError) {\n errorData = {\n $ai_is_error: true,\n $ai_error: error,\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 client.capture({\n distinctId: distinctId ?? traceId,\n event: '$ai_generation',\n 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, input),\n $ai_output_choices: withPrivacyMode(client, params.posthogPrivacyMode ?? false, output),\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 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":["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","sendEventToPosthog","distinctId","traceId","model","latency","baseURL","httpStatus","usage","isError","error","tools","capture","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","event","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","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","JSON","stringify","wrappedPromise","result"],"mappings":"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"}
|
package/lib/index.cjs.js
CHANGED
|
@@ -121,7 +121,7 @@ const sendEventToPosthog = ({
|
|
|
121
121
|
$ai_total_cost_usd: inputCostUSD + outputCostUSD
|
|
122
122
|
};
|
|
123
123
|
}
|
|
124
|
-
|
|
124
|
+
const additionalTokenValues = {
|
|
125
125
|
...(usage.reasoningTokens ? {
|
|
126
126
|
$ai_reasoning_tokens: usage.reasoningTokens
|
|
127
127
|
} : {}),
|
|
@@ -559,7 +559,7 @@ const mapVercelPrompt = prompt => {
|
|
|
559
559
|
});
|
|
560
560
|
};
|
|
561
561
|
const mapVercelOutput = result => {
|
|
562
|
-
|
|
562
|
+
const output = {
|
|
563
563
|
...(result.text ? {
|
|
564
564
|
text: result.text
|
|
565
565
|
} : {}),
|
|
@@ -620,10 +620,10 @@ const createInstrumentationMiddleware = (phClient, model, options) => {
|
|
|
620
620
|
const modelId = options.posthogModelOverride ?? (result.response?.modelId ? result.response.modelId : model.modelId);
|
|
621
621
|
const provider = options.posthogProviderOverride ?? extractProvider(model);
|
|
622
622
|
const baseURL = ''; // cannot currently get baseURL from vercel
|
|
623
|
-
|
|
623
|
+
const content = mapVercelOutput(result);
|
|
624
624
|
// let tools = result.toolCalls
|
|
625
|
-
|
|
626
|
-
|
|
625
|
+
const providerMetadata = result.providerMetadata;
|
|
626
|
+
const additionalTokenValues = {
|
|
627
627
|
...(providerMetadata?.openai?.reasoningTokens ? {
|
|
628
628
|
reasoningTokens: providerMetadata.openai.reasoningTokens
|
|
629
629
|
} : {}),
|
|
@@ -1694,9 +1694,16 @@ class LangChainCallbackHandler extends BaseCallbackHandler {
|
|
|
1694
1694
|
eventProperties['$ai_is_error'] = true;
|
|
1695
1695
|
} else {
|
|
1696
1696
|
// Handle token usage
|
|
1697
|
-
const [inputTokens, outputTokens] = this.parseUsage(output);
|
|
1697
|
+
const [inputTokens, outputTokens, additionalTokenData] = this.parseUsage(output);
|
|
1698
1698
|
eventProperties['$ai_input_tokens'] = inputTokens;
|
|
1699
1699
|
eventProperties['$ai_output_tokens'] = outputTokens;
|
|
1700
|
+
// Add additional token data to properties
|
|
1701
|
+
if (additionalTokenData.cacheReadInputTokens) {
|
|
1702
|
+
eventProperties['$ai_cache_read_tokens'] = additionalTokenData.cacheReadInputTokens;
|
|
1703
|
+
}
|
|
1704
|
+
if (additionalTokenData.reasoningTokens) {
|
|
1705
|
+
eventProperties['$ai_reasoning_tokens'] = additionalTokenData.reasoningTokens;
|
|
1706
|
+
}
|
|
1700
1707
|
// Handle generations/completions
|
|
1701
1708
|
let completions;
|
|
1702
1709
|
if (output.generations && Array.isArray(output.generations)) {
|
|
@@ -1735,6 +1742,8 @@ class LangChainCallbackHandler extends BaseCallbackHandler {
|
|
|
1735
1742
|
for (const arg of args) {
|
|
1736
1743
|
if (arg && typeof arg === 'object' && 'name' in arg) {
|
|
1737
1744
|
return arg.name;
|
|
1745
|
+
} else if (arg && typeof arg === 'object' && 'runName' in arg) {
|
|
1746
|
+
return arg.runName;
|
|
1738
1747
|
}
|
|
1739
1748
|
}
|
|
1740
1749
|
}
|
|
@@ -1808,10 +1817,28 @@ class LangChainCallbackHandler extends BaseCallbackHandler {
|
|
|
1808
1817
|
input: 0,
|
|
1809
1818
|
output: 0
|
|
1810
1819
|
});
|
|
1811
|
-
|
|
1820
|
+
// Extract additional token details like cached tokens and reasoning tokens
|
|
1821
|
+
const additionalTokenData = {};
|
|
1822
|
+
// Check for cached tokens in various formats
|
|
1823
|
+
if (usage.prompt_tokens_details?.cached_tokens != null) {
|
|
1824
|
+
additionalTokenData.cacheReadInputTokens = usage.prompt_tokens_details.cached_tokens;
|
|
1825
|
+
} else if (usage.input_token_details?.cache_read != null) {
|
|
1826
|
+
additionalTokenData.cacheReadInputTokens = usage.input_token_details.cache_read;
|
|
1827
|
+
} else if (usage.cachedPromptTokens != null) {
|
|
1828
|
+
additionalTokenData.cacheReadInputTokens = usage.cachedPromptTokens;
|
|
1829
|
+
}
|
|
1830
|
+
// Check for reasoning tokens in various formats
|
|
1831
|
+
if (usage.completion_tokens_details?.reasoning_tokens != null) {
|
|
1832
|
+
additionalTokenData.reasoningTokens = usage.completion_tokens_details.reasoning_tokens;
|
|
1833
|
+
} else if (usage.output_token_details?.reasoning != null) {
|
|
1834
|
+
additionalTokenData.reasoningTokens = usage.output_token_details.reasoning;
|
|
1835
|
+
} else if (usage.reasoningTokens != null) {
|
|
1836
|
+
additionalTokenData.reasoningTokens = usage.reasoningTokens;
|
|
1837
|
+
}
|
|
1838
|
+
return [parsedUsage.input, parsedUsage.output, additionalTokenData];
|
|
1812
1839
|
}
|
|
1813
1840
|
parseUsage(response) {
|
|
1814
|
-
let llmUsage = [0, 0];
|
|
1841
|
+
let llmUsage = [0, 0, {}];
|
|
1815
1842
|
const llmUsageKeys = ['token_usage', 'usage', 'tokenUsage'];
|
|
1816
1843
|
if (response.llmOutput != null) {
|
|
1817
1844
|
const key = llmUsageKeys.find(k => response.llmOutput?.[k] != null);
|
|
@@ -1823,6 +1850,7 @@ class LangChainCallbackHandler extends BaseCallbackHandler {
|
|
|
1823
1850
|
if (llmUsage[0] === 0 && llmUsage[1] === 0 && response.generations) {
|
|
1824
1851
|
for (const generation of response.generations) {
|
|
1825
1852
|
for (const genChunk of generation) {
|
|
1853
|
+
// Check other paths for usage information
|
|
1826
1854
|
if (genChunk.generationInfo?.usage_metadata) {
|
|
1827
1855
|
llmUsage = this._parseUsageModel(genChunk.generationInfo.usage_metadata);
|
|
1828
1856
|
return llmUsage;
|