@@ -27,8 +27,13 @@ interface CreateInstrumentationMiddlewareOptions {
27
27
}
28
28
29
29
interface PostHogInput {
30
- content : string
31
30
role : string
31
+ type ?: string
32
+ content ?:
33
+ | string
34
+ | {
35
+ [ key : string ] : any
36
+ }
32
37
}
33
38
34
39
const mapVercelParams = ( params : any ) : Record < string , any > => {
@@ -45,18 +50,60 @@ const mapVercelParams = (params: any): Record<string, any> => {
45
50
46
51
const mapVercelPrompt = ( prompt : LanguageModelV1Prompt ) : PostHogInput [ ] => {
47
52
return prompt . map ( ( p ) => {
48
- let content = ''
53
+ let content = { }
49
54
if ( Array . isArray ( p . content ) ) {
50
- content = p . content
51
- . map ( ( c ) => {
52
- if ( c . type === 'text' ) {
53
- return c . text
55
+ content = p . content . map ( ( c ) => {
56
+ if ( c . type === 'text' ) {
57
+ return {
58
+ type : 'text' ,
59
+ content : c . text ,
54
60
}
55
- return ''
56
- } )
57
- . join ( '' )
61
+ } else if ( c . type === 'image' ) {
62
+ return {
63
+ type : 'image' ,
64
+ content : {
65
+ // if image is a url use it, or use "none supported"
66
+ image : c . image instanceof URL ? c . image . toString ( ) : 'raw images not supported' ,
67
+ mimeType : c . mimeType ,
68
+ } ,
69
+ }
70
+ } else if ( c . type === 'file' ) {
71
+ return {
72
+ type : 'file' ,
73
+ content : {
74
+ file : c . data instanceof URL ? c . data . toString ( ) : 'raw files not supported' ,
75
+ mimeType : c . mimeType ,
76
+ } ,
77
+ }
78
+ } else if ( c . type === 'tool-call' ) {
79
+ return {
80
+ type : 'tool-call' ,
81
+ content : {
82
+ toolCallId : c . toolCallId ,
83
+ toolName : c . toolName ,
84
+ args : c . args ,
85
+ } ,
86
+ }
87
+ } else if ( c . type === 'tool-result' ) {
88
+ return {
89
+ type : 'tool-result' ,
90
+ content : {
91
+ toolCallId : c . toolCallId ,
92
+ toolName : c . toolName ,
93
+ result : c . result ,
94
+ isError : c . isError ,
95
+ } ,
96
+ }
97
+ }
98
+ return {
99
+ content : '' ,
100
+ }
101
+ } )
58
102
} else {
59
- content = p . content
103
+ content = {
104
+ type : 'text' ,
105
+ text : p . content ,
106
+ }
60
107
}
61
108
return {
62
109
role : p . role ,
@@ -91,10 +138,22 @@ export const createInstrumentationMiddleware = (
91
138
options . posthogModelOverride ?? ( result . response ?. modelId ? result . response . modelId : model . modelId )
92
139
const provider = options . posthogProviderOverride ?? extractProvider ( model )
93
140
const baseURL = '' // cannot currently get baseURL from vercel
94
- let content = result . text
95
- if ( ! content ) {
96
- // support generate Object
97
- content = result . toolCalls ?. [ 0 ] . args || JSON . stringify ( result )
141
+ let content = result . text || JSON . stringify ( result )
142
+ // let tools = result.toolCalls
143
+ let providerMetadata = result . providerMetadata
144
+ let additionalTokenValues = {
145
+ ...( providerMetadata ?. openai ?. reasoningTokens
146
+ ? { reasoningTokens : providerMetadata . openai . reasoningTokens }
147
+ : { } ) ,
148
+ ...( providerMetadata ?. openai ?. cachedPromptToken
149
+ ? { cacheReadInputTokens : providerMetadata . openai . cachedPromptTokens }
150
+ : { } ) ,
151
+ ...( providerMetadata ?. anthropic
152
+ ? {
153
+ cacheReadInputTokens : providerMetadata . anthropic . cacheReadInputTokens ,
154
+ cacheCreationInputTokens : providerMetadata . anthropic . cacheCreationInputTokens ,
155
+ }
156
+ : { } ) ,
98
157
}
99
158
sendEventToPosthog ( {
100
159
client : phClient ,
@@ -111,6 +170,7 @@ export const createInstrumentationMiddleware = (
111
170
usage : {
112
171
inputTokens : result . usage . promptTokens ,
113
172
outputTokens : result . usage . completionTokens ,
173
+ ...additionalTokenValues ,
114
174
} ,
115
175
} )
116
176
@@ -143,7 +203,13 @@ export const createInstrumentationMiddleware = (
143
203
wrapStream : async ( { doStream, params } ) => {
144
204
const startTime = Date . now ( )
145
205
let generatedText = ''
146
- let usage : { inputTokens ?: number ; outputTokens ?: number } = { }
206
+ let usage : {
207
+ inputTokens ?: number
208
+ outputTokens ?: number
209
+ reasoningTokens ?: any
210
+ cacheReadInputTokens ?: any
211
+ cacheCreationInputTokens ?: any
212
+ } = { }
147
213
const mergedParams = {
148
214
...options ,
149
215
...mapVercelParams ( params ) ,
@@ -164,6 +230,18 @@ export const createInstrumentationMiddleware = (
164
230
inputTokens : chunk . usage ?. promptTokens ,
165
231
outputTokens : chunk . usage ?. completionTokens ,
166
232
}
233
+ if ( chunk . providerMetadata ?. openai ?. reasoningTokens ) {
234
+ usage . reasoningTokens = chunk . providerMetadata . openai . reasoningTokens
235
+ }
236
+ if ( chunk . providerMetadata ?. openai ?. cachedPromptToken ) {
237
+ usage . cacheReadInputTokens = chunk . providerMetadata . openai . cachedPromptToken
238
+ }
239
+ if ( chunk . providerMetadata ?. anthropic ?. cacheReadInputTokens ) {
240
+ usage . cacheReadInputTokens = chunk . providerMetadata . anthropic . cacheReadInputTokens
241
+ }
242
+ if ( chunk . providerMetadata ?. anthropic ?. cacheCreationInputTokens ) {
243
+ usage . cacheCreationInputTokens = chunk . providerMetadata . anthropic . cacheCreationInputTokens
244
+ }
167
245
}
168
246
controller . enqueue ( chunk )
169
247
} ,
0 commit comments