Skip to content

Commit ce35957

Browse files
katzdavejamadeo
authored andcommitted
Token state not showing on load, or after message is finished. (#5606)
1 parent c4ffbe1 commit ce35957

File tree

7 files changed

+38
-29
lines changed

7 files changed

+38
-29
lines changed

crates/goose-server/src/routes/reply.rs

Lines changed: 26 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -133,6 +133,7 @@ pub enum MessageEvent {
133133
},
134134
Finish {
135135
reason: String,
136+
token_state: TokenState,
136137
},
137138
ModelChange {
138139
model: String,
@@ -149,6 +150,27 @@ pub enum MessageEvent {
149150
Ping,
150151
}
151152

153+
async fn get_token_state(session_id: &str) -> TokenState {
154+
SessionManager::get_session(session_id, false)
155+
.await
156+
.map(|session| TokenState {
157+
input_tokens: session.input_tokens.unwrap_or(0),
158+
output_tokens: session.output_tokens.unwrap_or(0),
159+
total_tokens: session.total_tokens.unwrap_or(0),
160+
accumulated_input_tokens: session.accumulated_input_tokens.unwrap_or(0),
161+
accumulated_output_tokens: session.accumulated_output_tokens.unwrap_or(0),
162+
accumulated_total_tokens: session.accumulated_total_tokens.unwrap_or(0),
163+
})
164+
.inspect_err(|e| {
165+
tracing::warn!(
166+
"Failed to fetch session token state for {}: {}",
167+
session_id,
168+
e
169+
);
170+
})
171+
.unwrap_or_default()
172+
}
173+
152174
async fn stream_event(
153175
event: MessageEvent,
154176
tx: &mpsc::Sender<String>,
@@ -321,29 +343,7 @@ pub async fn reply(
321343

322344
all_messages.push(message.clone());
323345

324-
let token_state = match SessionManager::get_session(&session_id, false).await {
325-
Ok(session) => {
326-
TokenState {
327-
input_tokens: session.input_tokens.unwrap_or(0),
328-
output_tokens: session.output_tokens.unwrap_or(0),
329-
total_tokens: session.total_tokens.unwrap_or(0),
330-
accumulated_input_tokens: session.accumulated_input_tokens.unwrap_or(0),
331-
accumulated_output_tokens: session.accumulated_output_tokens.unwrap_or(0),
332-
accumulated_total_tokens: session.accumulated_total_tokens.unwrap_or(0),
333-
}
334-
},
335-
Err(e) => {
336-
tracing::warn!("Failed to fetch session for token state: {}", e);
337-
TokenState {
338-
input_tokens: 0,
339-
output_tokens: 0,
340-
total_tokens: 0,
341-
accumulated_input_tokens: 0,
342-
accumulated_output_tokens: 0,
343-
accumulated_total_tokens: 0,
344-
}
345-
}
346-
};
346+
let token_state = get_token_state(&session_id).await;
347347

348348
stream_event(MessageEvent::Message { message, token_state }, &tx, &cancel_token).await;
349349
}
@@ -437,9 +437,12 @@ pub async fn reply(
437437
);
438438
}
439439

440+
let final_token_state = get_token_state(&session_id).await;
441+
440442
let _ = stream_event(
441443
MessageEvent::Finish {
442444
reason: "stop".to_string(),
445+
token_state: final_token_state,
443446
},
444447
&task_tx,
445448
&cancel_token,

crates/goose/src/conversation/message.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -711,7 +711,7 @@ impl Message {
711711
}
712712
}
713713

714-
#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
714+
#[derive(Debug, Clone, Default, Serialize, Deserialize, ToSchema)]
715715
#[serde(rename_all = "camelCase")]
716716
pub struct TokenState {
717717
pub input_tokens: i32,

ui/desktop/openapi.json

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3321,12 +3321,16 @@
33213321
"type": "object",
33223322
"required": [
33233323
"reason",
3324+
"token_state",
33243325
"type"
33253326
],
33263327
"properties": {
33273328
"reason": {
33283329
"type": "string"
33293330
},
3331+
"token_state": {
3332+
"$ref": "#/components/schemas/TokenState"
3333+
},
33303334
"type": {
33313335
"type": "string",
33323336
"enum": [

ui/desktop/src/api/types.gen.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -374,6 +374,7 @@ export type MessageEvent = {
374374
type: 'Error';
375375
} | {
376376
reason: string;
377+
token_state: TokenState;
377378
type: 'Finish';
378379
} | {
379380
mode: string;

ui/desktop/src/components/BaseChat.tsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -443,12 +443,12 @@ function BaseChatContent({
443443
commandHistory={commandHistory}
444444
initialValue={input || ''}
445445
setView={setView}
446-
totalTokens={tokenState?.totalTokens ?? sessionTokenCount}
446+
totalTokens={tokenState?.totalTokens || sessionTokenCount}
447447
accumulatedInputTokens={
448-
tokenState?.accumulatedInputTokens ?? sessionInputTokens ?? localInputTokens
448+
tokenState?.accumulatedInputTokens || sessionInputTokens || localInputTokens
449449
}
450450
accumulatedOutputTokens={
451-
tokenState?.accumulatedOutputTokens ?? sessionOutputTokens ?? localOutputTokens
451+
tokenState?.accumulatedOutputTokens || sessionOutputTokens || localOutputTokens
452452
}
453453
droppedFiles={droppedFiles}
454454
onFilesProcessed={() => setDroppedFiles([])} // Clear dropped files after processing

ui/desktop/src/hooks/useChatEngine.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -213,7 +213,6 @@ export const useChatEngine = ({
213213

214214
// Update token counts when session changes from the message stream
215215
useEffect(() => {
216-
console.log('Session received:', session);
217216
if (session) {
218217
setSessionTokenCount(session.total_tokens || 0);
219218
setSessionInputTokens(session.accumulated_input_tokens || 0);

ui/desktop/src/hooks/useMessageStream.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ export interface NotificationEvent {
3737
type MessageEvent =
3838
| { type: 'Message'; message: Message; token_state: TokenState }
3939
| { type: 'Error'; error: string }
40-
| { type: 'Finish'; reason: string }
40+
| { type: 'Finish'; reason: string; token_state: TokenState }
4141
| { type: 'ModelChange'; model: string; mode: string }
4242
| { type: 'UpdateConversation'; conversation: Conversation }
4343
| NotificationEvent;
@@ -368,6 +368,8 @@ export function useMessageStream({
368368
}
369369

370370
case 'Finish': {
371+
setTokenState(parsedEvent.token_state);
372+
371373
if (onFinish && currentMessages.length > 0) {
372374
const lastMessage = currentMessages[currentMessages.length - 1];
373375
onFinish(lastMessage, parsedEvent.reason);

0 commit comments

Comments
 (0)