diff --git a/images/webui-accounts.png b/images/webui-accounts.png index 38647f8..c1689d6 100644 Binary files a/images/webui-accounts.png and b/images/webui-accounts.png differ diff --git a/images/webui-dashboard.png b/images/webui-dashboard.png index 72adf17..5bb1832 100644 Binary files a/images/webui-dashboard.png and b/images/webui-dashboard.png differ diff --git a/images/webui-logs.png b/images/webui-logs.png index 49cc74a..0f85794 100644 Binary files a/images/webui-logs.png and b/images/webui-logs.png differ diff --git a/images/webui-models.png b/images/webui-models.png new file mode 100644 index 0000000..8c2ae66 Binary files /dev/null and b/images/webui-models.png differ diff --git a/images/webui-settings.png b/images/webui-settings.png index 9d3eef2..33b2ebb 100644 Binary files a/images/webui-settings.png and b/images/webui-settings.png differ diff --git a/public/js/components/claude-config.js b/public/js/components/claude-config.js index 355be9b..4a84e64 100644 --- a/public/js/components/claude-config.js +++ b/public/js/components/claude-config.js @@ -8,6 +8,16 @@ window.Components.claudeConfig = () => ({ config: { env: {} }, models: [], loading: false, + gemini1mSuffix: false, + + // Model fields that may contain Gemini model names + geminiModelFields: [ + 'ANTHROPIC_MODEL', + 'CLAUDE_CODE_SUBAGENT_MODEL', + 'ANTHROPIC_DEFAULT_OPUS_MODEL', + 'ANTHROPIC_DEFAULT_SONNET_MODEL', + 'ANTHROPIC_DEFAULT_HAIKU_MODEL' + ], init() { // Only fetch config if this is the active sub-tab @@ -28,6 +38,36 @@ window.Components.claudeConfig = () => ({ this.models = Alpine.store('data').models || []; }, + /** + * Detect if any Gemini model has [1m] suffix + */ + detectGemini1mSuffix() { + for (const field of this.geminiModelFields) { + const val = this.config.env[field]; + if (val && val.toLowerCase().includes('gemini') && val.includes('[1m]')) { + return true; + } + } + return false; + }, + + /** + * Toggle [1m] suffix for all Gemini models + */ + toggleGemini1mSuffix(enabled) { + for (const field of this.geminiModelFields) { + const val = this.config.env[field]; + if (val && val.toLowerCase().includes('gemini')) { + if (enabled && !val.includes('[1m]')) { + this.config.env[field] = val.trim() + ' [1m]'; + } else if (!enabled && val.includes('[1m]')) { + this.config.env[field] = val.replace(/\s*\[1m\]$/i, '').trim(); + } + } + } + this.gemini1mSuffix = enabled; + }, + async fetchConfig() { const password = Alpine.store('global').webuiPassword; try { @@ -38,6 +78,24 @@ window.Components.claudeConfig = () => ({ const data = await response.json(); this.config = data.config || {}; if (!this.config.env) this.config.env = {}; + + // Default MCP CLI to true if not set + if (this.config.env.ENABLE_EXPERIMENTAL_MCP_CLI === undefined) { + this.config.env.ENABLE_EXPERIMENTAL_MCP_CLI = 'true'; + } + + // Detect existing [1m] suffix state, default to true + const hasExistingSuffix = this.detectGemini1mSuffix(); + const hasGeminiModels = this.geminiModelFields.some(f => + this.config.env[f]?.toLowerCase().includes('gemini') + ); + + // Default to enabled: if no suffix found but Gemini models exist, apply suffix + if (!hasExistingSuffix && hasGeminiModels) { + this.toggleGemini1mSuffix(true); + } else { + this.gemini1mSuffix = hasExistingSuffix || !hasGeminiModels; + } } catch (e) { console.error('Failed to fetch Claude config:', e); } diff --git a/public/js/store.js b/public/js/store.js index 49ff770..8b53e32 100644 --- a/public/js/store.js +++ b/public/js/store.js @@ -243,6 +243,12 @@ document.addEventListener('alpine:init', () => { oauthTimeout: "⏱️ OAuth authorization timed out. Please try again.", oauthWindowClosed: "OAuth window was closed. Authorization may be incomplete.", cancelOAuth: "Cancel", + // MCP CLI & Gemini 1M + mcpCliExperimental: "Experimental MCP CLI", + mcpCliDesc: "Enables experimental MCP integration for reliable tool usage with reduced context consumption.", + gemini1mMode: "Gemini 1M Context Mode", + gemini1mDesc: "Appends [1m] suffix to Gemini models for 1M context window support.", + gemini1mWarning: "⚠ Large context may reduce Gemini-3-Pro performance.", }, zh: { dashboard: "仪表盘", @@ -475,6 +481,12 @@ document.addEventListener('alpine:init', () => { oauthTimeout: "⏱️ OAuth 授权超时,请重试。", oauthWindowClosed: "OAuth 窗口已关闭,授权可能未完成。", cancelOAuth: "取消", + // MCP CLI & Gemini 1M + mcpCliExperimental: "实验性 MCP CLI", + mcpCliDesc: "启用实验性 MCP 集成,减少上下文消耗,提高工具调用可靠性。", + gemini1mMode: "Gemini 1M 上下文模式", + gemini1mDesc: "为 Gemini 模型添加 [1m] 后缀以支持 1M 上下文窗口。", + gemini1mWarning: "⚠ 大上下文可能降低 Gemini-3-Pro 性能。", } }, diff --git a/public/views/settings.html b/public/views/settings.html index 24158c4..ea3976e 100644 --- a/public/views/settings.html +++ b/public/views/settings.html @@ -406,6 +406,53 @@ + +