feat(google): add configurable thinking level for Gemini 3 models (#6585)

Signed-off-by: rabi <ramishra@redhat.com>
This commit is contained in:
Rabi Mishra
2026-02-05 21:17:03 +05:30
committed by GitHub
parent c02135ccec
commit 06e8b85907
4 changed files with 157 additions and 11 deletions
@@ -21,6 +21,11 @@ import { getPredefinedModelsFromEnv, shouldShowPredefinedModels } from '../prede
import { ProviderType } from '../../../../api';
import { trackModelChanged } from '../../../../utils/analytics';
const THINKING_LEVEL_OPTIONS = [
{ value: 'low', label: 'Low - Better latency, lighter reasoning' },
{ value: 'high', label: 'High - Deeper reasoning, higher latency' },
];
const PREFERRED_MODEL_PATTERNS = [
/claude-sonnet-4/i,
/claude-4/i,
@@ -101,6 +106,10 @@ export const SwitchModelModal = ({
const [loadingModels, setLoadingModels] = useState<boolean>(false);
const [userClearedModel, setUserClearedModel] = useState(false);
const [providerErrors, setProviderErrors] = useState<Record<string, string>>({});
const [thinkingLevel, setThinkingLevel] = useState<string>('low');
const modelName = usePredefinedModels ? selectedPredefinedModel?.name : model;
const isGemini3Model = modelName?.toLowerCase().startsWith('gemini-3') ?? false;
// Validate form data
const validateForm = useCallback(() => {
@@ -148,7 +157,18 @@ export const SwitchModelModal = ({
} else {
const providerMetaData = await getProviderMetadata(provider || '', getProviders);
const providerDisplayName = providerMetaData.display_name;
modelObj = { name: model, provider: provider, subtext: providerDisplayName } as Model;
modelObj = {
name: model,
provider: provider,
subtext: providerDisplayName,
} as Model;
}
if (isGemini3Model) {
modelObj = {
...modelObj,
request_params: { ...modelObj.request_params, thinking_level: thinkingLevel },
};
}
await changeModel(sessionId, modelObj);
@@ -410,7 +430,7 @@ export const SwitchModelModal = ({
className="peer sr-only"
/>
<div
className="h-4 w-4 rounded-full border border-border-default
className="h-4 w-4 rounded-full border border-border-default
peer-checked:border-[6px] peer-checked:border-black dark:peer-checked:border-white
peer-checked:bg-white dark:peer-checked:bg-black
transition-all duration-200 ease-in-out group-hover:border-border-default"
@@ -424,6 +444,24 @@ export const SwitchModelModal = ({
{attemptedSubmit && validationErrors.model && (
<div className="text-red-500 text-sm mt-1">{validationErrors.model}</div>
)}
{isGemini3Model && (
<div className="mt-2">
<label className="text-sm text-textSubtle mb-1 block">
Thinking Level
<span className="text-xs text-textMuted ml-2">(Gemini 3 models only)</span>
</label>
<Select
options={THINKING_LEVEL_OPTIONS}
value={THINKING_LEVEL_OPTIONS.find((o) => o.value === thinkingLevel)}
onChange={(newValue: unknown) => {
const option = newValue as { value: string; label: string } | null;
setThinkingLevel(option?.value || 'low');
}}
placeholder="Select thinking level"
/>
</div>
)}
</div>
) : (
/* Manual Provider/Model Selection */
@@ -522,6 +560,24 @@ export const SwitchModelModal = ({
)}
</div>
)}
{isGemini3Model && (
<div className="mt-2">
<label className="text-sm text-textSubtle mb-1 block">
Thinking Level
<span className="text-xs text-textMuted ml-2">(Gemini 3 models only)</span>
</label>
<Select
options={THINKING_LEVEL_OPTIONS}
value={THINKING_LEVEL_OPTIONS.find((o) => o.value === thinkingLevel)}
onChange={(newValue: unknown) => {
const option = newValue as { value: string; label: string } | null;
setThinkingLevel(option?.value || 'low');
}}
placeholder="Select thinking level"
/>
</div>
)}
</>
)}
</div>