@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.
- package/CHANGELOG.md +3 -1
- package/lib/index.cjs.js +30 -10
- package/lib/index.cjs.js.map +1 -1
- package/lib/index.d.ts +7 -4
- package/lib/index.esm.js +30 -10
- package/lib/index.esm.js.map +1 -1
- package/lib/posthog-ai/src/utils.d.ts +7 -0
- package/lib/posthog-ai/src/vercel/middleware.d.ts +1 -4
- package/package.json +1 -1
- package/src/langchain/callbacks.ts +10 -4
- package/src/utils.ts +22 -2
- package/src/vercel/middleware.ts +7 -8
|
@@ -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
|
@@ -80,7 +80,7 @@ export class LangChainCallbackHandler extends BaseCallbackHandler {
|
|
|
80
80
|
parentRunId?: string,
|
|
81
81
|
tags?: string[],
|
|
82
82
|
metadata?: Record<string, unknown>,
|
|
83
|
-
|
|
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)
|
|
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)
|
|
471
|
+
if (arg && typeof arg === 'object' && 'name' in arg) {
|
|
472
|
+
return arg.name
|
|
473
|
+
}
|
|
470
474
|
}
|
|
471
475
|
}
|
|
472
|
-
if (serialized && 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
|
})
|
package/src/vercel/middleware.ts
CHANGED
|
@@ -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
|
|
106
|
+
output: [{ content, role: 'assistant' }],
|
|
108
107
|
latency,
|
|
109
108
|
baseURL,
|
|
110
109
|
params: mergedParams as any,
|