fix: remove gemini support since google discontinued it

This commit is contained in:
Haileyesus
2026-07-06 17:01:29 +03:00
parent 6daae87443
commit 4e423f5fa2
100 changed files with 247 additions and 3799 deletions

View File

@@ -39,7 +39,6 @@ interface UseChatComposerStateArgs {
claudeModel: string;
codexModel: string;
currentProviderEffort: string;
geminiModel: string;
opencodeModel: string;
isLoading: boolean;
canAbortSession: boolean;
@@ -180,7 +179,6 @@ export function useChatComposerState({
claudeModel,
codexModel,
currentProviderEffort,
geminiModel,
opencodeModel,
isLoading,
canAbortSession,
@@ -353,9 +351,7 @@ export function useChatComposerState({
? cursorModel
: provider === 'codex'
? codexModel
: provider === 'gemini'
? geminiModel
: provider === 'opencode'
: provider === 'opencode'
? opencodeModel
: claudeModel,
tokenUsage: tokenBudget,
@@ -410,7 +406,6 @@ export function useChatComposerState({
codexModel,
currentSessionId,
cursorModel,
geminiModel,
opencodeModel,
handleBuiltInCommand,
handleCustomCommand,
@@ -741,9 +736,7 @@ export function useChatComposerState({
? 'cursor-tools-settings'
: provider === 'codex'
? 'codex-settings'
: provider === 'gemini'
? 'gemini-settings'
: provider === 'opencode'
: provider === 'opencode'
? 'opencode-settings'
: 'claude-settings';
const savedSettings = safeLocalStorage.getItem(settingsKey);
@@ -767,9 +760,7 @@ export function useChatComposerState({
? cursorModel
: provider === 'codex'
? codexModel
: provider === 'gemini'
? geminiModel
: provider === 'opencode'
: provider === 'opencode'
? opencodeModel
: claudeModel;
const effort = currentProviderEffort;
@@ -815,7 +806,6 @@ export function useChatComposerState({
currentSessionId,
cursorModel,
executeCommand,
geminiModel,
opencodeModel,
isLoading,
onSessionProcessing,

View File

@@ -20,11 +20,17 @@ const FALLBACK_DEFAULT_MODEL: Record<LLMProvider, string> = {
claude: 'default',
cursor: 'gpt-5.3-codex',
codex: 'gpt-5.4',
gemini: 'gemini-3.1-pro-preview',
opencode: 'anthropic/claude-sonnet-4-5',
};
const PROVIDERS: LLMProvider[] = ['claude', 'cursor', 'codex', 'gemini', 'opencode'];
const PROVIDERS: LLMProvider[] = ['claude', 'cursor', 'codex', 'opencode'];
const readStoredProvider = (): LLMProvider => {
const storedProvider = localStorage.getItem('selected-provider');
return PROVIDERS.includes(storedProvider as LLMProvider)
? storedProvider as LLMProvider
: 'claude';
};
/**
* Fallback permission-mode matrix used only until the backend capability
@@ -36,7 +42,6 @@ const FALLBACK_PERMISSION_MODES: Record<LLMProvider, PermissionMode[]> = {
claude: ['default', 'auto', 'acceptEdits', 'bypassPermissions', 'plan'],
cursor: ['default', 'acceptEdits', 'bypassPermissions', 'plan'],
codex: ['default', 'acceptEdits', 'bypassPermissions'],
gemini: ['default', 'acceptEdits', 'bypassPermissions', 'plan'],
opencode: ['default', 'acceptEdits', 'bypassPermissions', 'plan'],
};
@@ -85,9 +90,7 @@ type ChangeActiveModelApiResponse = {
export function useChatProviderState({ selectedSession, selectedProject: _selectedProject }: UseChatProviderStateArgs) {
const [permissionMode, setPermissionMode] = useState<PermissionMode>('default');
const [pendingPermissionRequests, setPendingPermissionRequests] = useState<PendingPermissionRequest[]>([]);
const [provider, setProvider] = useState<LLMProvider>(() => {
return (localStorage.getItem('selected-provider') as LLMProvider) || 'claude';
});
const [provider, setProvider] = useState<LLMProvider>(readStoredProvider);
const [cursorModel, setCursorModel] = useState<string>(() => {
return localStorage.getItem('cursor-model') || FALLBACK_DEFAULT_MODEL.cursor;
});
@@ -103,9 +106,6 @@ export function useChatProviderState({ selectedSession, selectedProject: _select
return acc;
}, {});
});
const [geminiModel, setGeminiModel] = useState<string>(() => {
return localStorage.getItem('gemini-model') || FALLBACK_DEFAULT_MODEL.gemini;
});
const [opencodeModel, setOpenCodeModel] = useState<string>(() => {
return localStorage.getItem('opencode-model') || FALLBACK_DEFAULT_MODEL.opencode;
});
@@ -151,12 +151,6 @@ export function useChatProviderState({ selectedSession, selectedProject: _select
return;
}
if (targetProvider === 'gemini') {
setGeminiModel(model);
localStorage.setItem('gemini-model', model);
return;
}
setOpenCodeModel(model);
localStorage.setItem('opencode-model', model);
}, []);
@@ -360,9 +354,8 @@ export function useChatProviderState({ selectedSession, selectedProject: _select
claude: claudeModel,
cursor: cursorModel,
codex: codexModel,
gemini: geminiModel,
opencode: opencodeModel,
}), [claudeModel, cursorModel, codexModel, geminiModel, opencodeModel]);
}), [claudeModel, cursorModel, codexModel, opencodeModel]);
useEffect(() => {
const claude = providerModelCatalog.claude;
@@ -403,19 +396,6 @@ export function useChatProviderState({ selectedSession, selectedProject: _select
}
}, [providerModelCatalog.codex, codexModel]);
useEffect(() => {
const gemini = providerModelCatalog.gemini;
if (gemini) {
const next = pickStoredOrCurrent('gemini-model', geminiModel, gemini);
if (next !== geminiModel) {
setGeminiModel(next);
}
if (localStorage.getItem('gemini-model') !== next) {
localStorage.setItem('gemini-model', next);
}
}
}, [providerModelCatalog.gemini, geminiModel]);
useEffect(() => {
const opencode = providerModelCatalog.opencode;
if (opencode) {
@@ -589,8 +569,6 @@ export function useChatProviderState({ selectedSession, selectedProject: _select
setCodexModel,
currentProviderEffort,
currentProviderEffortOptions,
geminiModel,
setGeminiModel,
opencodeModel,
setOpenCodeModel,
permissionMode,

View File

@@ -71,8 +71,6 @@ function ChatInterface({
setCodexModel,
currentProviderEffort,
currentProviderEffortOptions,
geminiModel,
setGeminiModel,
opencodeModel,
setOpenCodeModel,
permissionMode,
@@ -204,7 +202,6 @@ function ChatInterface({
claudeModel,
codexModel,
currentProviderEffort,
geminiModel,
opencodeModel,
isLoading: isProcessing,
canAbortSession,
@@ -300,9 +297,7 @@ function ChatInterface({
? t('messageTypes.cursor')
: provider === 'codex'
? t('messageTypes.codex')
: provider === 'gemini'
? t('messageTypes.gemini')
: provider === 'opencode'
: provider === 'opencode'
? t('messageTypes.opencode', { defaultValue: 'OpenCode' })
: t('messageTypes.claude');
@@ -342,8 +337,6 @@ function ChatInterface({
setCursorModel={setCursorModel}
codexModel={codexModel}
setCodexModel={setCodexModel}
geminiModel={geminiModel}
setGeminiModel={setGeminiModel}
opencodeModel={opencodeModel}
setOpenCodeModel={setOpenCodeModel}
providerModelCatalog={providerModelCatalog}
@@ -451,9 +444,7 @@ function ChatInterface({
? t('messageTypes.cursor')
: provider === 'codex'
? t('messageTypes.codex')
: provider === 'gemini'
? t('messageTypes.gemini')
: provider === 'opencode'
: provider === 'opencode'
? t('messageTypes.opencode', { defaultValue: 'OpenCode' })
: t('messageTypes.claude'),
})}

View File

@@ -38,8 +38,6 @@ interface ChatMessagesPaneProps {
setCursorModel: (model: string) => void;
codexModel: string;
setCodexModel: (model: string) => void;
geminiModel: string;
setGeminiModel: (model: string) => void;
opencodeModel: string;
setOpenCodeModel: (model: string) => void;
providerModelCatalog: Partial<Record<LLMProvider, ProviderModelsDefinition>>;
@@ -88,8 +86,6 @@ function ChatMessagesPane({
setCursorModel,
codexModel,
setCodexModel,
geminiModel,
setGeminiModel,
opencodeModel,
setOpenCodeModel,
providerModelCatalog,
@@ -189,8 +185,6 @@ function ChatMessagesPane({
setCursorModel={setCursorModel}
codexModel={codexModel}
setCodexModel={setCodexModel}
geminiModel={geminiModel}
setGeminiModel={setGeminiModel}
opencodeModel={opencodeModel}
setOpenCodeModel={setOpenCodeModel}
providerModelCatalog={providerModelCatalog}

View File

@@ -61,7 +61,6 @@ const PROVIDER_LABELS: Record<string, string> = {
claude: 'Claude',
cursor: 'Cursor',
codex: 'Codex',
gemini: 'Gemini',
opencode: 'OpenCode',
};

View File

@@ -149,9 +149,7 @@ const MessageComponent = memo(({ message, prevMessage, createDiff, onFileOpen, s
? t('messageTypes.cursor')
: provider === 'codex'
? t('messageTypes.codex')
: provider === 'gemini'
? t('messageTypes.gemini')
: provider === 'opencode'
: provider === 'opencode'
? t('messageTypes.opencode', { defaultValue: 'OpenCode' })
: t('messageTypes.claude'))}
</div>

View File

@@ -26,7 +26,6 @@ import {
const PROVIDER_META: { id: LLMProvider; name: string }[] = [
{ id: "claude", name: "Anthropic" },
{ id: "codex", name: "OpenAI" },
{ id: "gemini", name: "Google" },
{ id: "cursor", name: "Cursor" },
{ id: "opencode", name: "OpenCode" },
];
@@ -57,8 +56,6 @@ type ProviderSelectionEmptyStateProps = {
setCursorModel: (model: string) => void;
codexModel: string;
setCodexModel: (model: string) => void;
geminiModel: string;
setGeminiModel: (model: string) => void;
opencodeModel: string;
setOpenCodeModel: (model: string) => void;
providerModelCatalog: Partial<Record<LLMProvider, ProviderModelsDefinition>>;
@@ -88,12 +85,10 @@ function getCurrentModel(
c: string,
cu: string,
co: string,
g: string,
o: string,
) {
if (p === "claude") return c;
if (p === "codex") return co;
if (p === "gemini") return g;
if (p === "opencode") return o;
return cu;
}
@@ -103,7 +98,7 @@ function getProviderDisplayName(p: LLMProvider) {
if (p === "cursor") return "Cursor";
if (p === "codex") return "Codex";
if (p === "opencode") return "OpenCode";
return "Gemini";
return "Claude";
}
export default function ProviderSelectionEmptyState({
@@ -118,8 +113,6 @@ export default function ProviderSelectionEmptyState({
setCursorModel,
codexModel,
setCodexModel,
geminiModel,
setGeminiModel,
opencodeModel,
setOpenCodeModel,
providerModelCatalog,
@@ -149,7 +142,6 @@ export default function ProviderSelectionEmptyState({
claudeModel,
cursorModel,
codexModel,
geminiModel,
opencodeModel,
);
@@ -169,9 +161,6 @@ export default function ProviderSelectionEmptyState({
} else if (providerId === "codex") {
setCodexModel(modelValue);
localStorage.setItem("codex-model", modelValue);
} else if (providerId === "gemini") {
setGeminiModel(modelValue);
localStorage.setItem("gemini-model", modelValue);
} else if (providerId === "opencode") {
setOpenCodeModel(modelValue);
localStorage.setItem("opencode-model", modelValue);
@@ -180,7 +169,7 @@ export default function ProviderSelectionEmptyState({
localStorage.setItem("cursor-model", modelValue);
}
},
[setClaudeModel, setCursorModel, setCodexModel, setGeminiModel, setOpenCodeModel],
[setClaudeModel, setCursorModel, setCodexModel, setOpenCodeModel],
);
const handleModelSelect = useCallback(
@@ -323,9 +312,6 @@ export default function ProviderSelectionEmptyState({
codex: t("providerSelection.readyPrompt.codex", {
model: codexModel,
}),
gemini: t("providerSelection.readyPrompt.gemini", {
model: geminiModel,
}),
opencode: t("providerSelection.readyPrompt.opencode", {
model: opencodeModel,
defaultValue: "Ready with OpenCode {{model}}",