From 23d732cf9c6457e0159ef90657eae1f27dbe108c Mon Sep 17 00:00:00 2001 From: Bohdan Triapitsyn Date: Tue, 2 Jun 2026 13:41:19 +0300 Subject: [PATCH] fix: preserve thinking variant for generated messages Uses the selected thinking variant for Git-generated session prompts Preserves current variant for voice-triggered messages --- packages/ui/src/hooks/useBrowserVoice.ts | 9 +++++++-- packages/ui/src/lib/gitApi.ts | 9 +++++++++ packages/ui/src/lib/voice/realtimeClientTools.ts | 13 +++++++++++-- 3 files changed, 27 insertions(+), 4 deletions(-) diff --git a/packages/ui/src/hooks/useBrowserVoice.ts b/packages/ui/src/hooks/useBrowserVoice.ts index ed794d6c..f1f08f14 100644 --- a/packages/ui/src/hooks/useBrowserVoice.ts +++ b/packages/ui/src/hooks/useBrowserVoice.ts @@ -140,6 +140,7 @@ export function useBrowserVoice(): UseBrowserVoiceReturn { const currentProviderId = useConfigStore((state) => state.currentProviderId); const currentModelId = useConfigStore((state) => state.currentModelId); const currentAgentName = useConfigStore((state) => state.currentAgentName); + const currentVariant = useConfigStore((state) => state.currentVariant); const voiceModeEnabled = useConfigStore((state) => state.voiceModeEnabled); const voiceProvider = useConfigStore((state) => state.voiceProvider); const speechRate = useConfigStore((state) => state.speechRate); @@ -446,7 +447,11 @@ export function useBrowserVoice(): UseBrowserVoiceReturn { finalText.trim(), currentProviderId, currentModelId, - currentAgentName ?? undefined + currentAgentName ?? undefined, + undefined, + undefined, + undefined, + currentVariant ?? undefined, ); // Wait for AI response and speak it @@ -602,7 +607,7 @@ export function useBrowserVoice(): UseBrowserVoiceReturn { setStatus('error'); processingMessageRef.current = false; } - }, [currentSessionId, currentProviderId, currentModelId, currentAgentName, language, sendMessage, setPendingInputText, createSession, speechRate, speechPitch, speechVolume, isServerTTSAvailable, speakServerTTS, isSayTTSAvailable, speakSayTTS, voiceProvider, sayVoice, browserVoice, openaiVoice, openaiCompatibleVoice, openaiCompatibleUrl, openaiCompatibleTtsModel, conversationMode, startCurrentSTT]); + }, [currentSessionId, currentProviderId, currentModelId, currentAgentName, currentVariant, language, sendMessage, setPendingInputText, createSession, speechRate, speechPitch, speechVolume, isServerTTSAvailable, speakServerTTS, isSayTTSAvailable, speakSayTTS, voiceProvider, sayVoice, browserVoice, openaiVoice, openaiCompatibleVoice, openaiCompatibleUrl, openaiCompatibleTtsModel, conversationMode, startCurrentSTT]); // Handle speech recognition result const handleSpeechResult = useCallback(async (text: string, isFinal: boolean) => { diff --git a/packages/ui/src/lib/gitApi.ts b/packages/ui/src/lib/gitApi.ts index c178ea57..b7992a02 100644 --- a/packages/ui/src/lib/gitApi.ts +++ b/packages/ui/src/lib/gitApi.ts @@ -348,6 +348,7 @@ type SessionGenerationContext = { providerID: string; modelID: string; agent?: string; + variant?: string; }; const resolveSessionGenerationContext = (): SessionGenerationContext | null => { @@ -370,11 +371,17 @@ const resolveSessionGenerationContext = (): SessionGenerationContext | null => { return null; } + const agentVariant = agent + ? context.getAgentModelVariantForSession(sessionId, agent, selectedModel.providerId, selectedModel.modelId) + : undefined; + const variant = agentVariant || config.currentVariant || undefined; + return { sessionId, providerID: selectedModel.providerId, modelID: selectedModel.modelId, agent, + variant, }; }; @@ -399,6 +406,7 @@ const runStructuredGenerationInActiveSession = async ({ providerID: generationSession.providerID, modelID: generationSession.modelID, agent: generationSession.agent, + variant: generationSession.variant, }); const trimmedDirectory = typeof directory === 'string' ? directory.trim() : ''; const visiblePromptText = typeof visiblePrompt === 'string' ? visiblePrompt.trim() : ''; @@ -429,6 +437,7 @@ const runStructuredGenerationInActiveSession = async ({ modelID: generationSession.modelID, }, ...(generationSession.agent ? { agent: generationSession.agent } : {}), + ...(generationSession.variant ? { variant: generationSession.variant } : {}), parts: promptParts, }); }); diff --git a/packages/ui/src/lib/voice/realtimeClientTools.ts b/packages/ui/src/lib/voice/realtimeClientTools.ts index 7778ddbf..b11ca657 100644 --- a/packages/ui/src/lib/voice/realtimeClientTools.ts +++ b/packages/ui/src/lib/voice/realtimeClientTools.ts @@ -33,7 +33,7 @@ export const realtimeClientTools = { } // Get current provider and model from config store - const { currentProviderId, currentModelId, currentAgentName } = useConfigStore.getState(); + const { currentProviderId, currentModelId, currentAgentName, currentVariant } = useConfigStore.getState(); if (!currentProviderId || !currentModelId) { console.error("[Voice] No provider/model selected"); return "error (no provider or model selected)"; @@ -43,7 +43,16 @@ export const realtimeClientTools = { console.log("[Voice] Sending message to session:", sessionId); await useSessionUIStore .getState() - .sendMessage(parsed.data.message, currentProviderId, currentModelId, currentAgentName ?? undefined); + .sendMessage( + parsed.data.message, + currentProviderId, + currentModelId, + currentAgentName ?? undefined, + undefined, + undefined, + undefined, + currentVariant ?? undefined, + ); return "sent"; } catch (error) { console.error("[Voice] Failed to send message:", error);