@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.
Files changed (60) hide show
  1. package/LICENSE +245 -0
  2. package/{lib → dist}/anthropic/index.cjs +44 -17
  3. package/dist/anthropic/index.cjs.map +1 -0
  4. package/{lib → dist}/anthropic/index.mjs +41 -10
  5. package/dist/anthropic/index.mjs.map +1 -0
  6. package/{lib → dist}/gemini/index.cjs +68 -26
  7. package/dist/gemini/index.cjs.map +1 -0
  8. package/{lib → dist}/gemini/index.d.ts +0 -1
  9. package/{lib → dist}/gemini/index.mjs +67 -25
  10. package/dist/gemini/index.mjs.map +1 -0
  11. package/{lib → dist}/index.cjs +875 -601
  12. package/dist/index.cjs.map +1 -0
  13. package/{lib → dist}/index.d.ts +3 -3
  14. package/{lib → dist}/index.mjs +859 -579
  15. package/dist/index.mjs.map +1 -0
  16. package/{lib → dist}/langchain/index.cjs +178 -118
  17. package/dist/langchain/index.cjs.map +1 -0
  18. package/{lib → dist}/langchain/index.d.ts +1 -0
  19. package/{lib → dist}/langchain/index.mjs +175 -112
  20. package/dist/langchain/index.mjs.map +1 -0
  21. package/{lib → dist}/openai/index.cjs +113 -6
  22. package/dist/openai/index.cjs.map +1 -0
  23. package/{lib → dist}/openai/index.mjs +112 -5
  24. package/dist/openai/index.mjs.map +1 -0
  25. package/{lib → dist}/vercel/index.cjs +117 -82
  26. package/dist/vercel/index.cjs.map +1 -0
  27. package/{lib → dist}/vercel/index.d.ts +2 -2
  28. package/{lib → dist}/vercel/index.mjs +118 -81
  29. package/dist/vercel/index.mjs.map +1 -0
  30. package/package.json +45 -35
  31. package/CHANGELOG.md +0 -89
  32. package/index.ts +0 -1
  33. package/lib/anthropic/index.cjs.map +0 -1
  34. package/lib/anthropic/index.mjs.map +0 -1
  35. package/lib/gemini/index.cjs.map +0 -1
  36. package/lib/gemini/index.mjs.map +0 -1
  37. package/lib/index.cjs.map +0 -1
  38. package/lib/index.mjs.map +0 -1
  39. package/lib/langchain/index.cjs.map +0 -1
  40. package/lib/langchain/index.mjs.map +0 -1
  41. package/lib/openai/index.cjs.map +0 -1
  42. package/lib/openai/index.mjs.map +0 -1
  43. package/lib/vercel/index.cjs.map +0 -1
  44. package/lib/vercel/index.mjs.map +0 -1
  45. package/src/anthropic/index.ts +0 -211
  46. package/src/gemini/index.ts +0 -254
  47. package/src/index.ts +0 -13
  48. package/src/langchain/callbacks.ts +0 -640
  49. package/src/langchain/index.ts +0 -1
  50. package/src/openai/azure.ts +0 -481
  51. package/src/openai/index.ts +0 -498
  52. package/src/utils.ts +0 -287
  53. package/src/vercel/index.ts +0 -1
  54. package/src/vercel/middleware.ts +0 -393
  55. package/tests/callbacks.test.ts +0 -48
  56. package/tests/gemini.test.ts +0 -344
  57. package/tests/openai.test.ts +0 -403
  58. package/tsconfig.json +0 -10
  59. /package/{lib → dist}/anthropic/index.d.ts +0 -0
  60. /package/{lib → dist}/openai/index.d.ts +0 -0
@@ -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 }