@@ -2,14 +2,7 @@ import { useMemo } from 'react'
22import { useMessages } from './useOpenCode'
33import { useSettings } from './useSettings'
44import { useQuery } from '@tanstack/react-query'
5- import type { components } from '@/api/opencode-types'
6-
7- type AssistantMessage = components [ 'schemas' ] [ 'AssistantMessage' ]
8-
9- type MessageListItem = {
10- info : components [ 'schemas' ] [ 'Message' ]
11- parts : components [ 'schemas' ] [ 'Part' ] [ ]
12- }
5+ import { getSessionModel } from '@/lib/model'
136
147interface ContextUsage {
158 totalTokens : number
@@ -40,10 +33,6 @@ interface ProvidersResponse {
4033 providers : Provider [ ]
4134}
4235
43- const isAssistantMessage = ( message : MessageListItem ) : message is MessageListItem & { info : AssistantMessage } => {
44- return message . info . role === 'assistant'
45- }
46-
4736async function fetchProviders ( opcodeUrl : string ) : Promise < ProvidersResponse > {
4837 const response = await fetch ( `${ opcodeUrl } /config/providers` )
4938 if ( ! response . ok ) {
@@ -64,70 +53,45 @@ export const useContextUsage = (opcodeUrl: string | null | undefined, sessionID:
6453 } )
6554
6655 return useMemo ( ( ) => {
67- // Get current model from preferences immediately
68- let currentModel = preferences ?. defaultModel || null
56+ const currentModel = getSessionModel ( messages , preferences ?. defaultModel )
6957
70- if ( ! messages || messages . length === 0 ) {
71- // Still try to get context limit from preferences model even without messages
72- let contextLimit : number | null = null
73-
74- if ( currentModel && providersData ) {
75- const [ providerId , modelId ] = currentModel . split ( '/' )
76- const provider = providersData . providers . find ( p => p . id === providerId )
77- if ( provider && provider . models ) {
78- const model = provider . models [ modelId ]
79- if ( model && model . limit ) {
80- contextLimit = model . limit . context
81- }
82- }
83- }
84-
85- return {
86- totalTokens : 0 ,
87- contextLimit,
88- usagePercentage : contextLimit ? 0 : null ,
89- currentModel,
90- isLoading : messagesLoading
91- }
92- }
93-
94- // Get the latest assistant message for current context usage
95- const assistantMessages = messages . filter ( isAssistantMessage )
58+ const assistantMessages = messages ?. filter ( msg => msg . info . role === 'assistant' ) || [ ]
9659 let latestAssistantMessage = assistantMessages [ assistantMessages . length - 1 ]
9760
98- // If the latest message has 0 tokens (still being created), use the previous one
99- if ( latestAssistantMessage ) {
100- const latestTokens = latestAssistantMessage . info . tokens . input + latestAssistantMessage . info . tokens . output + latestAssistantMessage . info . tokens . reasoning
101- if ( latestTokens === 0 && assistantMessages . length > 1 ) {
61+ if ( latestAssistantMessage ?. info . role === 'assistant' ) {
62+ const tokens = latestAssistantMessage . info . tokens . input + latestAssistantMessage . info . tokens . output + latestAssistantMessage . info . tokens . reasoning
63+ if ( tokens === 0 && assistantMessages . length > 1 ) {
10264 latestAssistantMessage = assistantMessages [ assistantMessages . length - 2 ]
10365 }
10466 }
105-
106- let totalTokens = 0
107- if ( latestAssistantMessage ) {
108- // The latest message contains the total context usage
109- totalTokens = latestAssistantMessage . info . tokens . input + latestAssistantMessage . info . tokens . output + latestAssistantMessage . info . tokens . reasoning
110-
111- // If no model in preferences, use the model from the message
112- if ( ! currentModel && 'modelID' in latestAssistantMessage . info && 'providerID' in latestAssistantMessage . info ) {
113- currentModel = `${ latestAssistantMessage . info . providerID } /${ latestAssistantMessage . info . modelID } `
114- }
115- }
11667
117- // Find the model configuration from providers data
11868 let contextLimit : number | null = null
119-
12069 if ( currentModel && providersData ) {
12170 const [ providerId , modelId ] = currentModel . split ( '/' )
12271 const provider = providersData . providers . find ( p => p . id === providerId )
123- if ( provider && provider . models ) {
72+ if ( provider ? .models ) {
12473 const model = provider . models [ modelId ]
125- if ( model && model . limit ) {
74+ if ( model ? .limit ) {
12675 contextLimit = model . limit . context
12776 }
12877 }
12978 }
13079
80+ if ( ! messages || messages . length === 0 ) {
81+ return {
82+ totalTokens : 0 ,
83+ contextLimit,
84+ usagePercentage : contextLimit ? 0 : null ,
85+ currentModel,
86+ isLoading : messagesLoading
87+ }
88+ }
89+
90+ let totalTokens = 0
91+ if ( latestAssistantMessage ?. info . role === 'assistant' ) {
92+ totalTokens = latestAssistantMessage . info . tokens . input + latestAssistantMessage . info . tokens . output + latestAssistantMessage . info . tokens . reasoning
93+ }
94+
13195 const usagePercentage = contextLimit ? ( totalTokens / contextLimit ) * 100 : null
13296
13397 return {
@@ -138,4 +102,4 @@ export const useContextUsage = (opcodeUrl: string | null | undefined, sessionID:
138102 isLoading : false
139103 }
140104 } , [ messages , messagesLoading , preferences ?. defaultModel , providersData ] )
141- }
105+ }
0 commit comments