@posthog/ai 3.0.0 → 3.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -9,6 +9,13 @@ export interface MonitoringParams {
9
9
  posthogProperties?: Record<string, any>;
10
10
  posthogPrivacyMode?: boolean;
11
11
  posthogGroups?: Record<string, any>;
12
+ posthogModelOverride?: string;
13
+ posthogProviderOverride?: string;
14
+ posthogCostOverride?: CostOverride;
15
+ }
16
+ export interface CostOverride {
17
+ inputCost: number;
18
+ outputCost: number;
12
19
  }
13
20
  export declare const getModelParams: (params: ((ChatCompletionCreateParamsBase | MessageCreateParams) & MonitoringParams) | null) => Record<string, any>;
14
21
  /**
@@ -1,5 +1,6 @@
1
1
  import type { LanguageModelV1, LanguageModelV1Middleware } from 'ai';
2
2
  import { PostHog } from 'posthog-node';
3
+ import { CostOverride } from '../utils';
3
4
  interface ClientOptions {
4
5
  posthogDistinctId?: string;
5
6
  posthogTraceId?: string;
@@ -10,10 +11,6 @@ interface ClientOptions {
10
11
  posthogProviderOverride?: string;
11
12
  posthogCostOverride?: CostOverride;
12
13
  }
13
- interface CostOverride {
14
- inputTokens: number;
15
- outputTokens: number;
16
- }
17
14
  interface CreateInstrumentationMiddlewareOptions {
18
15
  posthogDistinctId: string;
19
16
  posthogTraceId: string;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@posthog/ai",
3
- "version": "3.0.0",
3
+ "version": "3.1.0",
4
4
  "description": "PostHog Node.js AI integrations",
5
5
  "repository": {
6
6
  "type": "git",
@@ -80,7 +80,7 @@ export class LangChainCallbackHandler extends BaseCallbackHandler {
80
80
  parentRunId?: string,
81
81
  tags?: string[],
82
82
  metadata?: Record<string, unknown>,
83
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
83
+
84
84
  runType?: string,
85
85
  runName?: string
86
86
  ): void {
@@ -333,7 +333,9 @@ export class LangChainCallbackHandler extends BaseCallbackHandler {
333
333
  const traceId = this._getTraceId(runId)
334
334
  this._popParentOfRun(runId)
335
335
  const run = this._popRunMetadata(runId)
336
- if (!run) return
336
+ if (!run) {
337
+ return
338
+ }
337
339
  if ('modelParams' in run) {
338
340
  console.warn(`Run ${runId} is a generation, but attempted to be captured as a trace/span.`)
339
341
  return
@@ -466,10 +468,14 @@ export class LangChainCallbackHandler extends BaseCallbackHandler {
466
468
  private _getLangchainRunName(serialized: any, ...args: any[]): string | undefined {
467
469
  if (args && args.length > 0) {
468
470
  for (const arg of args) {
469
- if (arg && typeof arg === 'object' && 'name' in arg) return arg.name
471
+ if (arg && typeof arg === 'object' && 'name' in arg) {
472
+ return arg.name
473
+ }
470
474
  }
471
475
  }
472
- if (serialized && serialized.name) return serialized.name
476
+ if (serialized && serialized.name) {
477
+ return serialized.name
478
+ }
473
479
  if (serialized && serialized.id) {
474
480
  return Array.isArray(serialized.id) ? serialized.id[serialized.id.length - 1] : serialized.id
475
481
  }
package/src/utils.ts CHANGED
@@ -11,6 +11,14 @@ export interface MonitoringParams {
11
11
  posthogProperties?: Record<string, any>
12
12
  posthogPrivacyMode?: boolean
13
13
  posthogGroups?: Record<string, any>
14
+ posthogModelOverride?: string
15
+ posthogProviderOverride?: string
16
+ posthogCostOverride?: CostOverride
17
+ }
18
+
19
+ export interface CostOverride {
20
+ inputCost: number
21
+ outputCost: number
14
22
  }
15
23
 
16
24
  export const getModelParams = (
@@ -140,12 +148,23 @@ export const sendEventToPosthog = ({
140
148
  $ai_error: error,
141
149
  }
142
150
  }
151
+ let costOverrideData = {}
152
+ if (params.posthogCostOverride) {
153
+ const inputCostUSD = (params.posthogCostOverride.inputCost ?? 0) * (usage.inputTokens ?? 0)
154
+ const outputCostUSD = (params.posthogCostOverride.outputCost ?? 0) * (usage.outputTokens ?? 0)
155
+ costOverrideData = {
156
+ $ai_input_cost_usd: inputCostUSD,
157
+ $ai_output_cost_usd: outputCostUSD,
158
+ $ai_total_cost_usd: inputCostUSD + outputCostUSD,
159
+ }
160
+ }
161
+
143
162
  client.capture({
144
163
  distinctId: distinctId ?? traceId,
145
164
  event: '$ai_generation',
146
165
  properties: {
147
- $ai_provider: provider,
148
- $ai_model: model,
166
+ $ai_provider: params.posthogProviderOverride ?? provider,
167
+ $ai_model: params.posthogModelOverride ?? model,
149
168
  $ai_model_parameters: getModelParams(params),
150
169
  $ai_input: withPrivacyMode(client, params.posthogPrivacyMode ?? false, input),
151
170
  $ai_output_choices: withPrivacyMode(client, params.posthogPrivacyMode ?? false, output),
@@ -158,6 +177,7 @@ export const sendEventToPosthog = ({
158
177
  ...params.posthogProperties,
159
178
  ...(distinctId ? {} : { $process_person_profile: false }),
160
179
  ...errorData,
180
+ ...costOverrideData,
161
181
  },
162
182
  groups: params.posthogGroups,
163
183
  })
@@ -2,7 +2,7 @@ import { wrapLanguageModel } from 'ai'
2
2
  import type { LanguageModelV1, LanguageModelV1Middleware, LanguageModelV1Prompt, LanguageModelV1StreamPart } from 'ai'
3
3
  import { v4 as uuidv4 } from 'uuid'
4
4
  import { PostHog } from 'posthog-node'
5
- import { sendEventToPosthog } from '../utils'
5
+ import { CostOverride, sendEventToPosthog } from '../utils'
6
6
 
7
7
  interface ClientOptions {
8
8
  posthogDistinctId?: string
@@ -15,11 +15,6 @@ interface ClientOptions {
15
15
  posthogCostOverride?: CostOverride
16
16
  }
17
17
 
18
- interface CostOverride {
19
- inputTokens: number
20
- outputTokens: number
21
- }
22
-
23
18
  interface CreateInstrumentationMiddlewareOptions {
24
19
  posthogDistinctId: string
25
20
  posthogTraceId: string
@@ -96,7 +91,11 @@ export const createInstrumentationMiddleware = (
96
91
  options.posthogModelOverride ?? (result.response?.modelId ? result.response.modelId : model.modelId)
97
92
  const provider = options.posthogProviderOverride ?? extractProvider(model)
98
93
  const baseURL = '' // cannot currently get baseURL from vercel
99
-
94
+ let content = result.text
95
+ if (!content) {
96
+ // support generate Object
97
+ content = result.toolCalls?.[0].args || JSON.stringify(result)
98
+ }
100
99
  sendEventToPosthog({
101
100
  client: phClient,
102
101
  distinctId: options.posthogDistinctId,
@@ -104,7 +103,7 @@ export const createInstrumentationMiddleware = (
104
103
  model: modelId,
105
104
  provider: provider,
106
105
  input: options.posthogPrivacyMode ? '' : mapVercelPrompt(params.prompt),
107
- output: [{ content: result.text, role: 'assistant' }],
106
+ output: [{ content, role: 'assistant' }],
108
107
  latency,
109
108
  baseURL,
110
109
  params: mergedParams as any,