@@ -3,6 +3,8 @@ import { Anthropic } from "@anthropic-ai/sdk" // Keep for type usage only
33
44import { litellmDefaultModelId , litellmDefaultModelInfo } from "@roo-code/types"
55
6+ import { calculateApiCostOpenAI } from "../../shared/cost"
7+
68import { ApiHandlerOptions } from "../../shared/api"
79
810import { ApiStream , ApiStreamUsageChunk } from "../transform/stream"
@@ -66,7 +68,7 @@ export class LiteLLMHandler extends RouterProvider implements SingleCompletionHa
6668
6769 for await ( const chunk of completion ) {
6870 const delta = chunk . choices [ 0 ] ?. delta
69- const usage = chunk . usage as OpenAI . CompletionUsage
71+ const usage = chunk . usage as LiteLLMUsage
7072
7173 if ( delta ?. content ) {
7274 yield { type : "text" , text : delta . content }
@@ -82,8 +84,12 @@ export class LiteLLMHandler extends RouterProvider implements SingleCompletionHa
8284 type : "usage" ,
8385 inputTokens : lastUsage . prompt_tokens || 0 ,
8486 outputTokens : lastUsage . completion_tokens || 0 ,
87+ cacheWriteTokens : lastUsage . cache_creation_input_tokens || 0 ,
88+ cacheReadTokens : lastUsage . prompt_tokens_details ?. cached_tokens || 0 ,
8589 }
8690
91+ usageData . totalCost = calculateApiCostOpenAI ( info , usageData . inputTokens , usageData . outputTokens , usageData . cacheWriteTokens , usageData . cacheReadTokens )
92+
8793 yield usageData
8894 }
8995 } catch ( error ) {
@@ -119,3 +125,8 @@ export class LiteLLMHandler extends RouterProvider implements SingleCompletionHa
119125 }
120126 }
121127}
128+
129+ // LiteLLM usage may include an extra field for Anthropic use cases.
130+ interface LiteLLMUsage extends OpenAI . CompletionUsage {
131+ cache_creation_input_tokens ?: number
132+ }
0 commit comments