11"use client" ;
22
3- import type { LanguageModelUsage } from "ai" ;
4- import { type ComponentProps , createContext , useContext } from "react" ;
5- import { getUsage } from "tokenlens" ;
63import { Button } from "@/components/ui/button" ;
74import {
85 HoverCard ,
@@ -11,6 +8,20 @@ import {
118} from "@/components/ui/hover-card" ;
129import { Progress } from "@/components/ui/progress" ;
1310import { cn } from "@/lib/utils" ;
11+ import type { LanguageModelUsage } from "ai" ;
12+ import { type ComponentProps , createContext , useContext } from "react" ;
13+ import type { SourceModel } from "tokenlens" ;
14+ import { computeTokenCostsForModel } from "tokenlens/helpers" ;
15+ import { vercelModels } from "tokenlens/providers/vercel" ;
16+
17+ type VercelModelId = keyof typeof vercelModels . models ;
18+
19+ const lookupModel = ( modelId : string ) : SourceModel | undefined => {
20+ const model = vercelModels . models [ modelId as VercelModelId ] ;
21+ return model
22+ ? ( { canonical_id : model . id , ...model } as unknown as SourceModel )
23+ : undefined ;
24+ } ;
1425
1526const PERCENT_MAX = 100 ;
1627const ICON_RADIUS = 10 ;
@@ -196,14 +207,15 @@ export const ContextContentFooter = ({
196207 ...props
197208} : ContextContentFooterProps ) => {
198209 const { modelId, usage } = useContextValue ( ) ;
199- const costUSD = modelId
200- ? getUsage ( {
201- modelId,
210+ const model = modelId ? lookupModel ( modelId ) : undefined ;
211+ const costUSD = model
212+ ? computeTokenCostsForModel ( {
213+ model,
202214 usage : {
203- input : usage ?. inputTokens ?? 0 ,
204- output : usage ?. outputTokens ?? 0 ,
215+ input_tokens : usage ?. inputTokens ?? 0 ,
216+ output_tokens : usage ?. outputTokens ?? 0 ,
205217 } ,
206- } ) . costUSD ?. totalUSD
218+ } ) . totalTokenCostUSD
207219 : undefined ;
208220 const totalCost = new Intl . NumberFormat ( "en-US" , {
209221 style : "currency" ,
@@ -246,11 +258,12 @@ export const ContextInputUsage = ({
246258 return null ;
247259 }
248260
249- const inputCost = modelId
250- ? getUsage ( {
251- modelId,
252- usage : { input : inputTokens , output : 0 } ,
253- } ) . costUSD ?. totalUSD
261+ const inputModel = modelId ? lookupModel ( modelId ) : undefined ;
262+ const inputCost = inputModel
263+ ? computeTokenCostsForModel ( {
264+ model : inputModel ,
265+ usage : { input_tokens : inputTokens , output_tokens : 0 } ,
266+ } ) . totalTokenCostUSD
254267 : undefined ;
255268 const inputCostText = new Intl . NumberFormat ( "en-US" , {
256269 style : "currency" ,
@@ -286,11 +299,12 @@ export const ContextOutputUsage = ({
286299 return null ;
287300 }
288301
289- const outputCost = modelId
290- ? getUsage ( {
291- modelId,
292- usage : { input : 0 , output : outputTokens } ,
293- } ) . costUSD ?. totalUSD
302+ const outputModel = modelId ? lookupModel ( modelId ) : undefined ;
303+ const outputCost = outputModel
304+ ? computeTokenCostsForModel ( {
305+ model : outputModel ,
306+ usage : { input_tokens : 0 , output_tokens : outputTokens } ,
307+ } ) . totalTokenCostUSD
294308 : undefined ;
295309 const outputCostText = new Intl . NumberFormat ( "en-US" , {
296310 style : "currency" ,
@@ -326,11 +340,12 @@ export const ContextReasoningUsage = ({
326340 return null ;
327341 }
328342
329- const reasoningCost = modelId
330- ? getUsage ( {
331- modelId,
332- usage : { reasoningTokens } ,
333- } ) . costUSD ?. totalUSD
343+ const reasoningModel = modelId ? lookupModel ( modelId ) : undefined ;
344+ const reasoningCost = reasoningModel
345+ ? computeTokenCostsForModel ( {
346+ model : reasoningModel ,
347+ usage : { reasoning_tokens : reasoningTokens } ,
348+ } ) . totalTokenCostUSD
334349 : undefined ;
335350 const reasoningCostText = new Intl . NumberFormat ( "en-US" , {
336351 style : "currency" ,
@@ -366,11 +381,12 @@ export const ContextCacheUsage = ({
366381 return null ;
367382 }
368383
369- const cacheCost = modelId
370- ? getUsage ( {
371- modelId,
372- usage : { cacheReads : cacheTokens , input : 0 , output : 0 } ,
373- } ) . costUSD ?. totalUSD
384+ const cacheModel = modelId ? lookupModel ( modelId ) : undefined ;
385+ const cacheCost = cacheModel
386+ ? computeTokenCostsForModel ( {
387+ model : cacheModel ,
388+ usage : { cache_read_tokens : cacheTokens } ,
389+ } ) . totalTokenCostUSD
374390 : undefined ;
375391 const cacheCostText = new Intl . NumberFormat ( "en-US" , {
376392 style : "currency" ,
0 commit comments