11import { centsToMicroCents } from "@opencode-ai/console-core/util/price.js"
22import { buildRateLimitKey , getRedis } from "./redis"
3+ import { logger } from "./logger"
34
45export function createProviderBudgetTracker (
56 providers : {
@@ -22,13 +23,15 @@ export function createProviderBudgetTracker(
2223 const keys = Object . fromEntries (
2324 tracked . map ( ( provider ) => [ provider . id , buildRateLimitKey ( "provider-budget" , provider . id , interval ) ] ) ,
2425 )
26+ let budgetUsage : Record < string , number > = { }
2527
2628 return {
2729 check : async ( ) => {
28- const ids = tracked . filter ( ( provider ) => provider . budgetMode === "fill" ) . map ( ( provider ) => provider . id )
30+ const ids = tracked . map ( ( provider ) => provider . id )
2931 if ( ids . length === 0 ) return { }
3032 const values = await redis . mget < ( string | number | null ) [ ] > ( ids . map ( ( id ) => keys [ id ] ) )
31- return Object . fromEntries ( ids . map ( ( id , index ) => [ id , Number ( values [ index ] ?? 0 ) ] ) )
33+ budgetUsage = Object . fromEntries ( ids . map ( ( id , index ) => [ id , Number ( values [ index ] ?? 0 ) ] ) )
34+ return budgetUsage
3235 } ,
3336 track : async ( provider : string , costInCent : number ) => {
3437 const config = tracked . find ( ( item ) => item . id === provider )
@@ -40,6 +43,10 @@ export function createProviderBudgetTracker(
4043 pipeline . incrby ( keys [ provider ] , cost )
4144 pipeline . expire ( keys [ provider ] , 120 )
4245 await pipeline . exec ( )
46+ logger . metric ( {
47+ "provider.budget_usage" : budgetUsage [ provider ] + cost ,
48+ "model.budget_usage" : cost ,
49+ } )
4350 } ,
4451 }
4552}
0 commit comments