@@ -26,6 +26,9 @@ export type SequenceDebug = {
2626 reasoningTokens : number ;
2727 text : string ;
2828 textTokens : number ;
29+ uncachedInputTokens : number ;
30+ cachedInputTokens : number ;
31+ outputTokens : number ;
2932 cachedTokens : number ;
3033 responseId : string | null ;
3134 toolCalls : SequenceDebugToolCall [ ] ;
@@ -45,13 +48,17 @@ type SequenceDebugModelCall = {
4548 reasoningTokens : number ;
4649 text : string ;
4750 textTokens : number ;
51+ uncachedInputTokens : number ;
52+ cachedInputTokens : number ;
53+ outputTokens : number ;
4854 cachedTokens : number ;
4955 responseId : string | null ;
5056 resultType : SequenceDebugResultType ;
5157} ;
5258
5359type OpenAiUsageMetadata = {
5460 input_tokens ?: number ;
61+ output_tokens ?: number ;
5562 input_token_details ?: {
5663 cache_read ?: number ;
5764 } ;
@@ -82,6 +89,9 @@ function createPendingSequenceDebug(sequenceId: number): PendingSequenceDebug {
8289 reasoningTokens : 0 ,
8390 text : "" ,
8491 textTokens : 0 ,
92+ uncachedInputTokens : 0 ,
93+ cachedInputTokens : 0 ,
94+ outputTokens : 0 ,
8595 cachedTokens : 0 ,
8696 responseId : null ,
8797 toolCalls : [ ] ,
@@ -112,6 +122,9 @@ function finalizeSequenceDebug(sequence: PendingSequenceDebug): SequenceDebug {
112122 reasoningTokens : sequence . reasoningTokens ,
113123 text : sequence . text ,
114124 textTokens : sequence . textTokens ,
125+ uncachedInputTokens : sequence . uncachedInputTokens ,
126+ cachedInputTokens : sequence . cachedInputTokens ,
127+ outputTokens : sequence . outputTokens ,
115128 cachedTokens : sequence . cachedTokens ,
116129 responseId : sequence . responseId ,
117130 toolCalls : sequence . toolCalls . map ( ( { completed : _completed , ...toolCall } ) => toolCall ) ,
@@ -133,6 +146,21 @@ function getDebugModelName(model: SequenceDebugPromptModel) {
133146 return typeof model . getName === "function" ? model . getName ( ) : undefined ;
134147}
135148
149+ function getDebugToolName ( tool : unknown ) {
150+ if ( ! tool || typeof tool !== "object" ) {
151+ return null ;
152+ }
153+
154+ const name = ( tool as { name ?: unknown } ) . name ;
155+ return typeof name === "string" ? name : null ;
156+ }
157+
158+ function formatToolsForDebug ( tools : unknown [ ] ) {
159+ return tools . map ( ( tool ) => ( {
160+ name : getDebugToolName ( tool ) ,
161+ } ) ) ;
162+ }
163+
136164function stringifyPromptForDebug ( params : {
137165 model : SequenceDebugPromptModel ;
138166 systemMessage : { text : string } ;
@@ -160,7 +188,7 @@ function stringifyPromptForDebug(params: {
160188 } ,
161189 systemMessage,
162190 messages,
163- ...( tools . length > 0 ? { tools } : { } ) ,
191+ ...( tools . length > 0 ? { tools : formatToolsForDebug ( tools ) } : { } ) ,
164192 ...( toolChoice !== undefined ? { toolChoice } : { } ) ,
165193 ...( modelSettings ? { modelSettings } : { } ) ,
166194 ...( invocationParams ? { invocationParams } : { } ) ,
@@ -219,6 +247,9 @@ async function countTokens(model: unknown, content: string) {
219247}
220248
221249function extractSequenceResponseDebug ( message : AIMessage ) : SequenceDebugModelCall {
250+ const usageMetadata = message . usage_metadata as OpenAiUsageMetadata | undefined ;
251+ const promptTokens = usageMetadata ?. input_tokens ?? 0 ;
252+ const cachedInputTokens = usageMetadata ?. input_token_details ?. cache_read ?? 0 ;
222253 const blocks = getMessageBlocks ( message ) ;
223254 const reasoning = blocks
224255 . filter ( ( block : any ) => block ?. type === "reasoning" )
@@ -230,16 +261,15 @@ function extractSequenceResponseDebug(message: AIMessage): SequenceDebugModelCal
230261 . join ( "" ) ;
231262
232263 return {
233- promptTokens :
234- ( message . usage_metadata as OpenAiUsageMetadata | undefined ) ?. input_tokens ??
235- 0 ,
264+ promptTokens,
236265 reasoning,
237266 reasoningTokens : 0 ,
238267 text : textFromBlocks || ( typeof message . content === "string" ? message . content : "" ) ,
239268 textTokens : 0 ,
240- cachedTokens :
241- ( message . usage_metadata as OpenAiUsageMetadata | undefined )
242- ?. input_token_details ?. cache_read ?? 0 ,
269+ uncachedInputTokens : Math . max ( promptTokens - cachedInputTokens , 0 ) ,
270+ cachedInputTokens,
271+ outputTokens : usageMetadata ?. output_tokens ?? 0 ,
272+ cachedTokens : cachedInputTokens ,
243273 responseId :
244274 ( message . response_metadata as OpenAiResponseMetadata | undefined ) ?. id ??
245275 null ,
@@ -290,6 +320,9 @@ export function createSequenceDebugCollector(): SequenceDebugCollector {
290320 sequenceDebug . reasoningTokens = params . reasoningTokens ;
291321 sequenceDebug . text = params . text ;
292322 sequenceDebug . textTokens = params . textTokens ;
323+ sequenceDebug . uncachedInputTokens = params . uncachedInputTokens ;
324+ sequenceDebug . cachedInputTokens = params . cachedInputTokens ;
325+ sequenceDebug . outputTokens = params . outputTokens ;
293326 sequenceDebug . cachedTokens = params . cachedTokens ;
294327 sequenceDebug . responseId = params . responseId ;
295328 sequenceDebug . resultType = params . resultType ;
@@ -387,6 +420,8 @@ export function createSequenceDebugMiddleware(
387420 promptTokens,
388421 reasoningTokens,
389422 textTokens,
423+ uncachedInputTokens : debug . promptTokens ? debug . uncachedInputTokens : promptTokens ,
424+ outputTokens : debug . outputTokens || reasoningTokens + textTokens ,
390425 } ) ;
391426 return response ;
392427 } ,
0 commit comments