From 546e033081259d782c50fe88fedfc820407edde4 Mon Sep 17 00:00:00 2001 From: Brandon Keiji Date: Tue, 3 Jun 2025 19:19:49 +0000 Subject: feat: notify user when chat context is compressed (#724) --- packages/cli/src/ui/hooks/useGeminiStream.ts | 56 +++++++++++++++++++++------- 1 file changed, 42 insertions(+), 14 deletions(-) (limited to 'packages/cli/src') diff --git a/packages/cli/src/ui/hooks/useGeminiStream.ts b/packages/cli/src/ui/hooks/useGeminiStream.ts index c50d4c43..64e39e68 100644 --- a/packages/cli/src/ui/hooks/useGeminiStream.ts +++ b/packages/cli/src/ui/hooks/useGeminiStream.ts @@ -356,6 +356,18 @@ export const useGeminiStream = ( [addItem, pendingHistoryItemRef, setPendingHistoryItem], ); + const handleChatCompressionEvent = useCallback( + () => + addItem( + { + type: 'info', + text: `IMPORTANT: this conversation approached the input token limit for ${config.getModel()}. We'll send a compressed context to the model for any future messages.`, + }, + Date.now(), + ), + [addItem, config], + ); + const processGeminiStreamEvents = useCallback( async ( stream: AsyncIterable, @@ -364,20 +376,35 @@ export const useGeminiStream = ( let geminiMessageBuffer = ''; const toolCallRequests: ToolCallRequestInfo[] = []; for await (const event of stream) { - if (event.type === ServerGeminiEventType.Content) { - geminiMessageBuffer = handleContentEvent( - event.value, - geminiMessageBuffer, - userMessageTimestamp, - ); - } else if (event.type === ServerGeminiEventType.ToolCallRequest) { - toolCallRequests.push(event.value); - } else if (event.type === ServerGeminiEventType.UserCancelled) { - handleUserCancelledEvent(userMessageTimestamp); - return StreamProcessingStatus.UserCancelled; - } else if (event.type === ServerGeminiEventType.Error) { - handleErrorEvent(event.value, userMessageTimestamp); - return StreamProcessingStatus.Error; + switch (event.type) { + case ServerGeminiEventType.Content: + geminiMessageBuffer = handleContentEvent( + event.value, + geminiMessageBuffer, + userMessageTimestamp, + ); + break; + case ServerGeminiEventType.ToolCallRequest: + toolCallRequests.push(event.value); + break; + case ServerGeminiEventType.UserCancelled: + handleUserCancelledEvent(userMessageTimestamp); + break; + case ServerGeminiEventType.Error: + handleErrorEvent(event.value, userMessageTimestamp); + break; + case ServerGeminiEventType.ChatCompressed: + handleChatCompressionEvent(); + break; + case ServerGeminiEventType.ToolCallConfirmation: + case ServerGeminiEventType.ToolCallResponse: + // do nothing + break; + default: { + // enforces exhaustive switch-case + const unreachable: never = event; + return unreachable; + } } } if (toolCallRequests.length > 0) { @@ -390,6 +417,7 @@ export const useGeminiStream = ( handleUserCancelledEvent, handleErrorEvent, scheduleToolCalls, + handleChatCompressionEvent, ], ); -- cgit v1.2.3