mirror of
https://github.com/siteboon/claudecodeui.git
synced 2026-02-28 03:27:40 +00:00
* feat: integrate Gemini AI agent provider - Core Backend: Ported gemini-cli.js and gemini-response-handler.js to establish the CLI bridge. Registered 'gemini' as an active provider within index.js. - Core Frontend: Extended QuickSettingsPanel.jsx, Settings.jsx, and AgentListItem.jsx to render the Gemini provider option, models (gemini-pro, gemini-flash, etc.), and handle OAuth states. - WebSocket Pipeline: Added support for gemini-command executions in backend and payload processing of gemini-response and gemini-error streams in useChatRealtimeHandlers.ts. Resolved JSON double-stringification and sessionId stripping issues in the transmission handler. - Platform Compatibility: Added scripts/fix-node-pty.js postinstall script and modified posix_spawnp calls with sh -c wrapper to prevent ENOEXEC and MacOS permission errors when spawning the gemini headless binary. - UX & Design: Imported official Google Gemini branding via GeminiLogo.jsx and gemini-ai-icon.svg. Updated translations (chat.json) for en, zh-CN, and ko locales. * fix: propagate gemini permission mode from settings to cli - Added Gemini Permissions UI in Settings to toggle Auto Edit and YOLO modes - Synced gemini permission mode to localStorage - Passed permissionMode in useChatComposerState for Gemini commands - Mapped frontend permission modes to --yolo and --approval-mode options in gemini-cli.js * feat(gemini): Refactor Gemini CLI integration to use stream-json - Replaced regex buffering text-system with NDJSON stream parsing - Added fallback for restricted models like gemini-3.1-pro-preview * feat(gemini): Render tool_use and tool_result UI bubbles - Forwarded gemini tool NDJSON objects to the websocket - Added React state handlers in useChatRealtimeHandlers to match Claude's tool UI behavior * feat(gemini): Add native session resumption and UI token tracking - Captured cliSessionId from init events to map ClaudeCodeUI's chat sessionId directly into Gemini's internal session manager. - Updated gemini-cli.js spawn arguments to append the --resume proxy flag instead of naively dumping the accumulated chat history into the command prompt. - Handled result stream objects by proxying total_tokens back into the frontend's claude-status tracker to natively populate the UI label. - Eliminated gemini-3 model proxy filter entirely. * fix(gemini): Fix static 'Claude' name rendering in chat UI header - Added "gemini": "Gemini" translation strings to messageTypes across English, Korean, and Chinese loc dictionaries. - Updated AssistantThinkingIndicator and MessageComponent ternary checks to identify provider === 'gemini' and render the appropriate brand label instead of statically defaulting to Claude. * feat: Add Gemini session persistence API mapping and Sidebar UI * fix(gemini): Watch ~/.gemini/sessions for live UI updates Added the .gemini/sessions directory to PROVIDER_WATCH_PATHS so that Chokidar emits projects_updated websocket events when new Gemini sessions are created or modified, fixing live sidebar updates. * fix(gemini): Fix Gemini authentication status display in Settings UI - Injected 'checkGeminiAuthStatus' into the Settings.jsx React effect hook so that the UI can poll and render the 'geminiAuthStatus' state. - Updated 'checkGeminiCredentials()' inside server/routes/cli-auth.js to read from '~/.gemini/oauth_creds.json' and '~/.gemini/google_accounts.json', resolving the email address correctly. * Use logo-only icon for gemini * feat(gemini): Add Gemini 3 preview models to UI selection list * Fix Gemini CLI session resume bug and PR #422 review nitpicks * Fix Gemini tool calls disappearing from UI after completion * fix(gemini): resolve outstanding PR #422 feedback and stabilize gemini CLI timeouts * fix(gemini): resolve resume flag and shell session initialization issues This commit addresses the remaining PR comments for the Gemini CLI integration: - Moves the `--resume` flag logic outside the prompt command block, ensuring Gemini sessions correctly resume even when a new prompt isn't passed. - Updates `handleShellConnection` to correctly lookup the native `cliSessionId` from the internal `sessionId` when spawning Gemini sessions in a plain shell. - Refactors dynamic import of `sessionManager.js` back to a native static import for code consistency. * chore: fix TypeScript errors and remove gemini CLI dependency * fix: use cross-spawn on Windows to resolve gemini.cmd correctly --------- Co-authored-by: Haileyesus <118998054+blackmammoth@users.noreply.github.com>
87 lines
2.8 KiB
JavaScript
87 lines
2.8 KiB
JavaScript
/**
|
|
* Centralized Model Definitions
|
|
* Single source of truth for all supported AI models
|
|
*/
|
|
|
|
/**
|
|
* Claude (Anthropic) Models
|
|
*
|
|
* Note: Claude uses two different formats:
|
|
* - SDK format ('sonnet', 'opus') - used by the UI and claude-sdk.js
|
|
* - API format ('claude-sonnet-4.5') - used by slash commands for display
|
|
*/
|
|
export const CLAUDE_MODELS = {
|
|
// Models in SDK format (what the actual SDK accepts)
|
|
OPTIONS: [
|
|
{ value: 'sonnet', label: 'Sonnet' },
|
|
{ value: 'opus', label: 'Opus' },
|
|
{ value: 'haiku', label: 'Haiku' },
|
|
{ value: 'opusplan', label: 'Opus Plan' },
|
|
{ value: 'sonnet[1m]', label: 'Sonnet [1M]' }
|
|
],
|
|
|
|
DEFAULT: 'sonnet'
|
|
};
|
|
|
|
/**
|
|
* Cursor Models
|
|
*/
|
|
export const CURSOR_MODELS = {
|
|
OPTIONS: [
|
|
{ value: 'gpt-5.2-high', label: 'GPT-5.2 High' },
|
|
{ value: 'gemini-3-pro', label: 'Gemini 3 Pro' },
|
|
{ value: 'opus-4.5-thinking', label: 'Claude 4.5 Opus (Thinking)' },
|
|
{ value: 'gpt-5.2', label: 'GPT-5.2' },
|
|
{ value: 'gpt-5.1', label: 'GPT-5.1' },
|
|
{ value: 'gpt-5.1-high', label: 'GPT-5.1 High' },
|
|
{ value: 'composer-1', label: 'Composer 1' },
|
|
{ value: 'auto', label: 'Auto' },
|
|
{ value: 'sonnet-4.5', label: 'Claude 4.5 Sonnet' },
|
|
{ value: 'sonnet-4.5-thinking', label: 'Claude 4.5 Sonnet (Thinking)' },
|
|
{ value: 'opus-4.5', label: 'Claude 4.5 Opus' },
|
|
{ value: 'gpt-5.1-codex', label: 'GPT-5.1 Codex' },
|
|
{ value: 'gpt-5.1-codex-high', label: 'GPT-5.1 Codex High' },
|
|
{ value: 'gpt-5.1-codex-max', label: 'GPT-5.1 Codex Max' },
|
|
{ value: 'gpt-5.1-codex-max-high', label: 'GPT-5.1 Codex Max High' },
|
|
{ value: 'opus-4.1', label: 'Claude 4.1 Opus' },
|
|
{ value: 'grok', label: 'Grok' }
|
|
],
|
|
|
|
DEFAULT: 'gpt-5'
|
|
};
|
|
|
|
/**
|
|
* Codex (OpenAI) Models
|
|
*/
|
|
export const CODEX_MODELS = {
|
|
OPTIONS: [
|
|
{ value: 'gpt-5.3-codex', label: 'GPT-5.3 Codex' },
|
|
{ value: 'gpt-5.2-codex', label: 'GPT-5.2 Codex' },
|
|
{ value: 'gpt-5.2', label: 'GPT-5.2' },
|
|
{ value: 'gpt-5.1-codex-max', label: 'GPT-5.1 Codex Max' },
|
|
{ value: 'o3', label: 'O3' },
|
|
{ value: 'o4-mini', label: 'O4-mini' }
|
|
],
|
|
|
|
DEFAULT: 'gpt-5.3-codex'
|
|
};
|
|
|
|
/**
|
|
* Gemini Models
|
|
*/
|
|
export const GEMINI_MODELS = {
|
|
OPTIONS: [
|
|
{ value: 'gemini-3.1-pro-preview', label: 'Gemini 3.1 Pro Preview' },
|
|
{ value: 'gemini-3-pro-preview', label: 'Gemini 3 Pro Preview' },
|
|
{ value: 'gemini-3-flash-preview', label: 'Gemini 3 Flash Preview' },
|
|
{ value: 'gemini-2.5-flash', label: 'Gemini 2.5 Flash' },
|
|
{ value: 'gemini-2.5-pro', label: 'Gemini 2.5 Pro' },
|
|
{ value: 'gemini-2.0-flash-lite', label: 'Gemini 2.0 Flash Lite' },
|
|
{ value: 'gemini-2.0-flash', label: 'Gemini 2.0 Flash' },
|
|
{ value: 'gemini-2.0-pro-exp', label: 'Gemini 2.0 Pro Experimental' },
|
|
{ value: 'gemini-2.0-flash-thinking-exp', label: 'Gemini 2.0 Flash Thinking' }
|
|
],
|
|
|
|
DEFAULT: 'gemini-2.5-flash'
|
|
};
|