@posthog/ai 5.2.2 → 6.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +245 -0
- package/{lib → dist}/anthropic/index.cjs +44 -17
- package/dist/anthropic/index.cjs.map +1 -0
- package/{lib → dist}/anthropic/index.mjs +41 -10
- package/dist/anthropic/index.mjs.map +1 -0
- package/{lib → dist}/gemini/index.cjs +68 -26
- package/dist/gemini/index.cjs.map +1 -0
- package/{lib → dist}/gemini/index.d.ts +0 -1
- package/{lib → dist}/gemini/index.mjs +67 -25
- package/dist/gemini/index.mjs.map +1 -0
- package/{lib → dist}/index.cjs +875 -601
- package/dist/index.cjs.map +1 -0
- package/{lib → dist}/index.d.ts +3 -3
- package/{lib → dist}/index.mjs +859 -579
- package/dist/index.mjs.map +1 -0
- package/{lib → dist}/langchain/index.cjs +178 -118
- package/dist/langchain/index.cjs.map +1 -0
- package/{lib → dist}/langchain/index.d.ts +1 -0
- package/{lib → dist}/langchain/index.mjs +175 -112
- package/dist/langchain/index.mjs.map +1 -0
- package/{lib → dist}/openai/index.cjs +113 -6
- package/dist/openai/index.cjs.map +1 -0
- package/{lib → dist}/openai/index.mjs +112 -5
- package/dist/openai/index.mjs.map +1 -0
- package/{lib → dist}/vercel/index.cjs +117 -82
- package/dist/vercel/index.cjs.map +1 -0
- package/{lib → dist}/vercel/index.d.ts +2 -2
- package/{lib → dist}/vercel/index.mjs +118 -81
- package/dist/vercel/index.mjs.map +1 -0
- package/package.json +45 -35
- package/CHANGELOG.md +0 -89
- package/index.ts +0 -1
- package/lib/anthropic/index.cjs.map +0 -1
- package/lib/anthropic/index.mjs.map +0 -1
- package/lib/gemini/index.cjs.map +0 -1
- package/lib/gemini/index.mjs.map +0 -1
- package/lib/index.cjs.map +0 -1
- package/lib/index.mjs.map +0 -1
- package/lib/langchain/index.cjs.map +0 -1
- package/lib/langchain/index.mjs.map +0 -1
- package/lib/openai/index.cjs.map +0 -1
- package/lib/openai/index.mjs.map +0 -1
- package/lib/vercel/index.cjs.map +0 -1
- package/lib/vercel/index.mjs.map +0 -1
- package/src/anthropic/index.ts +0 -211
- package/src/gemini/index.ts +0 -254
- package/src/index.ts +0 -13
- package/src/langchain/callbacks.ts +0 -640
- package/src/langchain/index.ts +0 -1
- package/src/openai/azure.ts +0 -481
- package/src/openai/index.ts +0 -498
- package/src/utils.ts +0 -287
- package/src/vercel/index.ts +0 -1
- package/src/vercel/middleware.ts +0 -393
- package/tests/callbacks.test.ts +0 -48
- package/tests/gemini.test.ts +0 -344
- package/tests/openai.test.ts +0 -403
- package/tsconfig.json +0 -10
- /package/{lib → dist}/anthropic/index.d.ts +0 -0
- /package/{lib → dist}/openai/index.d.ts +0 -0
package/src/gemini/index.ts
DELETED
|
@@ -1,254 +0,0 @@
|
|
|
1
|
-
import { GoogleGenAI } from '@google/genai'
|
|
2
|
-
import { PostHog } from 'posthog-node'
|
|
3
|
-
import { v4 as uuidv4 } from 'uuid'
|
|
4
|
-
import { MonitoringParams, sendEventToPosthog } from '../utils'
|
|
5
|
-
|
|
6
|
-
// Types from @google/genai
|
|
7
|
-
type GenerateContentRequest = {
|
|
8
|
-
model: string
|
|
9
|
-
contents: any
|
|
10
|
-
config?: any
|
|
11
|
-
[key: string]: any
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
type GenerateContentResponse = {
|
|
15
|
-
text?: string
|
|
16
|
-
candidates?: any[]
|
|
17
|
-
usageMetadata?: {
|
|
18
|
-
promptTokenCount?: number
|
|
19
|
-
candidatesTokenCount?: number
|
|
20
|
-
totalTokenCount?: number
|
|
21
|
-
}
|
|
22
|
-
[key: string]: any
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
interface MonitoringGeminiConfig {
|
|
26
|
-
apiKey?: string
|
|
27
|
-
vertexai?: boolean
|
|
28
|
-
project?: string
|
|
29
|
-
location?: string
|
|
30
|
-
apiVersion?: string
|
|
31
|
-
posthog: PostHog
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
export class PostHogGoogleGenAI {
|
|
35
|
-
private readonly phClient: PostHog
|
|
36
|
-
private readonly client: GoogleGenAI
|
|
37
|
-
public models: WrappedModels
|
|
38
|
-
|
|
39
|
-
constructor(config: MonitoringGeminiConfig) {
|
|
40
|
-
const { posthog, ...geminiConfig } = config
|
|
41
|
-
this.phClient = posthog
|
|
42
|
-
this.client = new GoogleGenAI(geminiConfig)
|
|
43
|
-
this.models = new WrappedModels(this.client, this.phClient)
|
|
44
|
-
}
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
export class WrappedModels {
|
|
48
|
-
private readonly phClient: PostHog
|
|
49
|
-
private readonly client: GoogleGenAI
|
|
50
|
-
|
|
51
|
-
constructor(client: GoogleGenAI, phClient: PostHog) {
|
|
52
|
-
this.client = client
|
|
53
|
-
this.phClient = phClient
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
public async generateContent(params: GenerateContentRequest & MonitoringParams): Promise<GenerateContentResponse> {
|
|
57
|
-
const {
|
|
58
|
-
posthogDistinctId,
|
|
59
|
-
posthogTraceId,
|
|
60
|
-
posthogProperties,
|
|
61
|
-
posthogGroups,
|
|
62
|
-
posthogCaptureImmediate,
|
|
63
|
-
...geminiParams
|
|
64
|
-
} = params
|
|
65
|
-
|
|
66
|
-
const traceId = posthogTraceId ?? uuidv4()
|
|
67
|
-
const startTime = Date.now()
|
|
68
|
-
|
|
69
|
-
try {
|
|
70
|
-
const response = await this.client.models.generateContent(geminiParams)
|
|
71
|
-
const latency = (Date.now() - startTime) / 1000
|
|
72
|
-
|
|
73
|
-
await sendEventToPosthog({
|
|
74
|
-
client: this.phClient,
|
|
75
|
-
distinctId: posthogDistinctId,
|
|
76
|
-
traceId,
|
|
77
|
-
model: geminiParams.model,
|
|
78
|
-
provider: 'gemini',
|
|
79
|
-
input: this.formatInput(geminiParams.contents),
|
|
80
|
-
output: this.formatOutput(response),
|
|
81
|
-
latency,
|
|
82
|
-
baseURL: 'https://generativelanguage.googleapis.com',
|
|
83
|
-
params: params as any,
|
|
84
|
-
httpStatus: 200,
|
|
85
|
-
usage: {
|
|
86
|
-
inputTokens: response.usageMetadata?.promptTokenCount ?? 0,
|
|
87
|
-
outputTokens: response.usageMetadata?.candidatesTokenCount ?? 0,
|
|
88
|
-
},
|
|
89
|
-
captureImmediate: posthogCaptureImmediate,
|
|
90
|
-
})
|
|
91
|
-
|
|
92
|
-
return response
|
|
93
|
-
} catch (error: any) {
|
|
94
|
-
const latency = (Date.now() - startTime) / 1000
|
|
95
|
-
await sendEventToPosthog({
|
|
96
|
-
client: this.phClient,
|
|
97
|
-
distinctId: posthogDistinctId,
|
|
98
|
-
traceId,
|
|
99
|
-
model: geminiParams.model,
|
|
100
|
-
provider: 'gemini',
|
|
101
|
-
input: this.formatInput(geminiParams.contents),
|
|
102
|
-
output: [],
|
|
103
|
-
latency,
|
|
104
|
-
baseURL: 'https://generativelanguage.googleapis.com',
|
|
105
|
-
params: params as any,
|
|
106
|
-
httpStatus: error?.status ?? 500,
|
|
107
|
-
usage: {
|
|
108
|
-
inputTokens: 0,
|
|
109
|
-
outputTokens: 0,
|
|
110
|
-
},
|
|
111
|
-
isError: true,
|
|
112
|
-
error: JSON.stringify(error),
|
|
113
|
-
captureImmediate: posthogCaptureImmediate,
|
|
114
|
-
})
|
|
115
|
-
throw error
|
|
116
|
-
}
|
|
117
|
-
}
|
|
118
|
-
|
|
119
|
-
public async *generateContentStream(
|
|
120
|
-
params: GenerateContentRequest & MonitoringParams
|
|
121
|
-
): AsyncGenerator<any, void, unknown> {
|
|
122
|
-
const {
|
|
123
|
-
posthogDistinctId,
|
|
124
|
-
posthogTraceId,
|
|
125
|
-
posthogProperties,
|
|
126
|
-
posthogGroups,
|
|
127
|
-
posthogCaptureImmediate,
|
|
128
|
-
...geminiParams
|
|
129
|
-
} = params
|
|
130
|
-
|
|
131
|
-
const traceId = posthogTraceId ?? uuidv4()
|
|
132
|
-
const startTime = Date.now()
|
|
133
|
-
let accumulatedContent = ''
|
|
134
|
-
let usage = {
|
|
135
|
-
inputTokens: 0,
|
|
136
|
-
outputTokens: 0,
|
|
137
|
-
}
|
|
138
|
-
|
|
139
|
-
try {
|
|
140
|
-
const stream = await this.client.models.generateContentStream(geminiParams)
|
|
141
|
-
|
|
142
|
-
for await (const chunk of stream) {
|
|
143
|
-
if (chunk.text) {
|
|
144
|
-
accumulatedContent += chunk.text
|
|
145
|
-
}
|
|
146
|
-
if (chunk.usageMetadata) {
|
|
147
|
-
usage = {
|
|
148
|
-
inputTokens: chunk.usageMetadata.promptTokenCount ?? 0,
|
|
149
|
-
outputTokens: chunk.usageMetadata.candidatesTokenCount ?? 0,
|
|
150
|
-
}
|
|
151
|
-
}
|
|
152
|
-
yield chunk
|
|
153
|
-
}
|
|
154
|
-
|
|
155
|
-
const latency = (Date.now() - startTime) / 1000
|
|
156
|
-
await sendEventToPosthog({
|
|
157
|
-
client: this.phClient,
|
|
158
|
-
distinctId: posthogDistinctId,
|
|
159
|
-
traceId,
|
|
160
|
-
model: geminiParams.model,
|
|
161
|
-
provider: 'gemini',
|
|
162
|
-
input: this.formatInput(geminiParams.contents),
|
|
163
|
-
output: [{ content: accumulatedContent, role: 'assistant' }],
|
|
164
|
-
latency,
|
|
165
|
-
baseURL: 'https://generativelanguage.googleapis.com',
|
|
166
|
-
params: params as any,
|
|
167
|
-
httpStatus: 200,
|
|
168
|
-
usage,
|
|
169
|
-
captureImmediate: posthogCaptureImmediate,
|
|
170
|
-
})
|
|
171
|
-
} catch (error: any) {
|
|
172
|
-
const latency = (Date.now() - startTime) / 1000
|
|
173
|
-
await sendEventToPosthog({
|
|
174
|
-
client: this.phClient,
|
|
175
|
-
distinctId: posthogDistinctId,
|
|
176
|
-
traceId,
|
|
177
|
-
model: geminiParams.model,
|
|
178
|
-
provider: 'gemini',
|
|
179
|
-
input: this.formatInput(geminiParams.contents),
|
|
180
|
-
output: [],
|
|
181
|
-
latency,
|
|
182
|
-
baseURL: 'https://generativelanguage.googleapis.com',
|
|
183
|
-
params: params as any,
|
|
184
|
-
httpStatus: error?.status ?? 500,
|
|
185
|
-
usage: {
|
|
186
|
-
inputTokens: 0,
|
|
187
|
-
outputTokens: 0,
|
|
188
|
-
},
|
|
189
|
-
isError: true,
|
|
190
|
-
error: JSON.stringify(error),
|
|
191
|
-
captureImmediate: posthogCaptureImmediate,
|
|
192
|
-
})
|
|
193
|
-
throw error
|
|
194
|
-
}
|
|
195
|
-
}
|
|
196
|
-
|
|
197
|
-
private formatInput(contents: any): Array<{ role: string; content: string }> {
|
|
198
|
-
if (typeof contents === 'string') {
|
|
199
|
-
return [{ role: 'user', content: contents }]
|
|
200
|
-
}
|
|
201
|
-
|
|
202
|
-
if (Array.isArray(contents)) {
|
|
203
|
-
return contents.map((item) => {
|
|
204
|
-
if (typeof item === 'string') {
|
|
205
|
-
return { role: 'user', content: item }
|
|
206
|
-
}
|
|
207
|
-
if (item && typeof item === 'object') {
|
|
208
|
-
if (item.text) {
|
|
209
|
-
return { role: item.role || 'user', content: item.text }
|
|
210
|
-
}
|
|
211
|
-
if (item.content) {
|
|
212
|
-
return { role: item.role || 'user', content: item.content }
|
|
213
|
-
}
|
|
214
|
-
}
|
|
215
|
-
return { role: 'user', content: String(item) }
|
|
216
|
-
})
|
|
217
|
-
}
|
|
218
|
-
|
|
219
|
-
if (contents && typeof contents === 'object') {
|
|
220
|
-
if (contents.text) {
|
|
221
|
-
return [{ role: 'user', content: contents.text }]
|
|
222
|
-
}
|
|
223
|
-
if (contents.content) {
|
|
224
|
-
return [{ role: 'user', content: contents.content }]
|
|
225
|
-
}
|
|
226
|
-
}
|
|
227
|
-
|
|
228
|
-
return [{ role: 'user', content: String(contents) }]
|
|
229
|
-
}
|
|
230
|
-
|
|
231
|
-
private formatOutput(response: GenerateContentResponse): Array<{ role: string; content: string }> {
|
|
232
|
-
if (response.text) {
|
|
233
|
-
return [{ role: 'assistant', content: response.text }]
|
|
234
|
-
}
|
|
235
|
-
|
|
236
|
-
if (response.candidates && Array.isArray(response.candidates)) {
|
|
237
|
-
return response.candidates.map((candidate) => {
|
|
238
|
-
if (candidate.content && candidate.content.parts) {
|
|
239
|
-
const text = candidate.content.parts
|
|
240
|
-
.filter((part: any) => part.text)
|
|
241
|
-
.map((part: any) => part.text)
|
|
242
|
-
.join('')
|
|
243
|
-
return { role: 'assistant', content: text }
|
|
244
|
-
}
|
|
245
|
-
return { role: 'assistant', content: String(candidate) }
|
|
246
|
-
})
|
|
247
|
-
}
|
|
248
|
-
|
|
249
|
-
return []
|
|
250
|
-
}
|
|
251
|
-
}
|
|
252
|
-
|
|
253
|
-
export default PostHogGoogleGenAI
|
|
254
|
-
export { PostHogGoogleGenAI as Gemini }
|
package/src/index.ts
DELETED
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
import PostHogOpenAI from './openai'
|
|
2
|
-
import PostHogAzureOpenAI from './openai/azure'
|
|
3
|
-
import { wrapVercelLanguageModel } from './vercel/middleware'
|
|
4
|
-
import PostHogAnthropic from './anthropic'
|
|
5
|
-
import PostHogGoogleGenAI from './gemini'
|
|
6
|
-
import { LangChainCallbackHandler } from './langchain/callbacks'
|
|
7
|
-
|
|
8
|
-
export { PostHogOpenAI as OpenAI }
|
|
9
|
-
export { PostHogAzureOpenAI as AzureOpenAI }
|
|
10
|
-
export { PostHogAnthropic as Anthropic }
|
|
11
|
-
export { PostHogGoogleGenAI as GoogleGenAI }
|
|
12
|
-
export { wrapVercelLanguageModel as withTracing }
|
|
13
|
-
export { LangChainCallbackHandler }
|