diff --git a/src/shared/config/env.ts b/src/shared/config/env.ts
index 4c2ccba..8d9488b 100644
--- a/src/shared/config/env.ts
+++ b/src/shared/config/env.ts
@@ -1,85 +1,98 @@
-// 环境变量配置
+// 从 localStorage 读取运行时配置
+const STORAGE_KEY = 'xcodereviewer_runtime_config';
+const getRuntimeConfig = () => {
+ try {
+ const saved = localStorage.getItem(STORAGE_KEY);
+ return saved ? JSON.parse(saved) : null;
+ } catch {
+ return null;
+ }
+};
+
+const runtimeConfig = getRuntimeConfig();
+
+// 环境变量配置(支持运行时配置覆盖)
export const env = {
// ==================== LLM 通用配置 ====================
// 当前使用的LLM提供商 (gemini|openai|claude|qwen|deepseek|zhipu|moonshot|baidu|minimax|doubao|ollama)
- LLM_PROVIDER: import.meta.env.VITE_LLM_PROVIDER || 'gemini',
+ LLM_PROVIDER: runtimeConfig?.llmProvider || import.meta.env.VITE_LLM_PROVIDER || 'gemini',
// LLM API Key
- LLM_API_KEY: import.meta.env.VITE_LLM_API_KEY || '',
+ LLM_API_KEY: runtimeConfig?.llmApiKey || import.meta.env.VITE_LLM_API_KEY || '',
// LLM 模型名称
- LLM_MODEL: import.meta.env.VITE_LLM_MODEL || '',
+ LLM_MODEL: runtimeConfig?.llmModel || import.meta.env.VITE_LLM_MODEL || '',
// LLM API 基础URL (可选,用于自定义端点或代理)
- LLM_BASE_URL: import.meta.env.VITE_LLM_BASE_URL || '',
+ LLM_BASE_URL: runtimeConfig?.llmBaseUrl || import.meta.env.VITE_LLM_BASE_URL || '',
// LLM 请求超时时间(ms)
- LLM_TIMEOUT: Number(import.meta.env.VITE_LLM_TIMEOUT) || 150000,
+ LLM_TIMEOUT: runtimeConfig?.llmTimeout || Number(import.meta.env.VITE_LLM_TIMEOUT) || 150000,
// LLM 温度参数 (0.0-2.0)
- LLM_TEMPERATURE: Number(import.meta.env.VITE_LLM_TEMPERATURE) || 0.2,
+ LLM_TEMPERATURE: runtimeConfig?.llmTemperature !== undefined ? runtimeConfig.llmTemperature : (Number(import.meta.env.VITE_LLM_TEMPERATURE) || 0.2),
// LLM 最大token数
- LLM_MAX_TOKENS: Number(import.meta.env.VITE_LLM_MAX_TOKENS) || 4096,
+ LLM_MAX_TOKENS: runtimeConfig?.llmMaxTokens || Number(import.meta.env.VITE_LLM_MAX_TOKENS) || 4096,
// ==================== Gemini AI 配置 (兼容旧配置) ====================
- GEMINI_API_KEY: import.meta.env.VITE_GEMINI_API_KEY || '',
+ GEMINI_API_KEY: runtimeConfig?.geminiApiKey || import.meta.env.VITE_GEMINI_API_KEY || '',
GEMINI_MODEL: import.meta.env.VITE_GEMINI_MODEL || 'gemini-2.5-flash',
GEMINI_TIMEOUT_MS: Number(import.meta.env.VITE_GEMINI_TIMEOUT_MS) || 25000,
// ==================== OpenAI 配置 ====================
- OPENAI_API_KEY: import.meta.env.VITE_OPENAI_API_KEY || '',
+ OPENAI_API_KEY: runtimeConfig?.openaiApiKey || import.meta.env.VITE_OPENAI_API_KEY || '',
OPENAI_MODEL: import.meta.env.VITE_OPENAI_MODEL || 'gpt-4o-mini',
OPENAI_BASE_URL: import.meta.env.VITE_OPENAI_BASE_URL || '',
// ==================== Claude 配置 ====================
- CLAUDE_API_KEY: import.meta.env.VITE_CLAUDE_API_KEY || '',
+ CLAUDE_API_KEY: runtimeConfig?.claudeApiKey || import.meta.env.VITE_CLAUDE_API_KEY || '',
CLAUDE_MODEL: import.meta.env.VITE_CLAUDE_MODEL || 'claude-3-5-sonnet-20241022',
// ==================== 通义千问 配置 ====================
- QWEN_API_KEY: import.meta.env.VITE_QWEN_API_KEY || '',
+ QWEN_API_KEY: runtimeConfig?.qwenApiKey || import.meta.env.VITE_QWEN_API_KEY || '',
QWEN_MODEL: import.meta.env.VITE_QWEN_MODEL || 'qwen-turbo',
// ==================== DeepSeek 配置 ====================
- DEEPSEEK_API_KEY: import.meta.env.VITE_DEEPSEEK_API_KEY || '',
+ DEEPSEEK_API_KEY: runtimeConfig?.deepseekApiKey || import.meta.env.VITE_DEEPSEEK_API_KEY || '',
DEEPSEEK_MODEL: import.meta.env.VITE_DEEPSEEK_MODEL || 'deepseek-chat',
// ==================== 智谱AI 配置 ====================
- ZHIPU_API_KEY: import.meta.env.VITE_ZHIPU_API_KEY || '',
+ ZHIPU_API_KEY: runtimeConfig?.zhipuApiKey || import.meta.env.VITE_ZHIPU_API_KEY || '',
ZHIPU_MODEL: import.meta.env.VITE_ZHIPU_MODEL || 'glm-4-flash',
// ==================== Moonshot 配置 ====================
- MOONSHOT_API_KEY: import.meta.env.VITE_MOONSHOT_API_KEY || '',
+ MOONSHOT_API_KEY: runtimeConfig?.moonshotApiKey || import.meta.env.VITE_MOONSHOT_API_KEY || '',
MOONSHOT_MODEL: import.meta.env.VITE_MOONSHOT_MODEL || 'moonshot-v1-8k',
// ==================== 百度文心一言 配置 ====================
- BAIDU_API_KEY: import.meta.env.VITE_BAIDU_API_KEY || '',
+ BAIDU_API_KEY: runtimeConfig?.baiduApiKey || import.meta.env.VITE_BAIDU_API_KEY || '',
BAIDU_MODEL: import.meta.env.VITE_BAIDU_MODEL || 'ERNIE-3.5-8K',
// ==================== MiniMax 配置 ====================
- MINIMAX_API_KEY: import.meta.env.VITE_MINIMAX_API_KEY || '',
+ MINIMAX_API_KEY: runtimeConfig?.minimaxApiKey || import.meta.env.VITE_MINIMAX_API_KEY || '',
MINIMAX_MODEL: import.meta.env.VITE_MINIMAX_MODEL || 'abab6.5-chat',
// ==================== 豆包 配置 ====================
- DOUBAO_API_KEY: import.meta.env.VITE_DOUBAO_API_KEY || '',
+ DOUBAO_API_KEY: runtimeConfig?.doubaoApiKey || import.meta.env.VITE_DOUBAO_API_KEY || '',
DOUBAO_MODEL: import.meta.env.VITE_DOUBAO_MODEL || 'doubao-pro-32k',
// ==================== Ollama 本地模型配置 ====================
OLLAMA_API_KEY: import.meta.env.VITE_OLLAMA_API_KEY || 'ollama',
OLLAMA_MODEL: import.meta.env.VITE_OLLAMA_MODEL || 'llama3',
- OLLAMA_BASE_URL: import.meta.env.VITE_OLLAMA_BASE_URL || 'http://localhost:11434/v1',
+ OLLAMA_BASE_URL: runtimeConfig?.ollamaBaseUrl || import.meta.env.VITE_OLLAMA_BASE_URL || 'http://localhost:11434/v1',
// ==================== Supabase 配置 ====================
SUPABASE_URL: import.meta.env.VITE_SUPABASE_URL || '',
SUPABASE_ANON_KEY: import.meta.env.VITE_SUPABASE_ANON_KEY || '',
// ==================== GitHub 配置 ====================
- GITHUB_TOKEN: import.meta.env.VITE_GITHUB_TOKEN || '',
+ GITHUB_TOKEN: runtimeConfig?.githubToken || import.meta.env.VITE_GITHUB_TOKEN || '',
// ==================== 应用配置 ====================
APP_ID: import.meta.env.VITE_APP_ID || 'xcodereviewer',
// ==================== 分析配置 ====================
- MAX_ANALYZE_FILES: Number(import.meta.env.VITE_MAX_ANALYZE_FILES) || 40,
- LLM_CONCURRENCY: Number(import.meta.env.VITE_LLM_CONCURRENCY) || 2,
- LLM_GAP_MS: Number(import.meta.env.VITE_LLM_GAP_MS) || 500,
+ MAX_ANALYZE_FILES: runtimeConfig?.maxAnalyzeFiles || Number(import.meta.env.VITE_MAX_ANALYZE_FILES) || 40,
+ LLM_CONCURRENCY: runtimeConfig?.llmConcurrency || Number(import.meta.env.VITE_LLM_CONCURRENCY) || 2,
+ LLM_GAP_MS: runtimeConfig?.llmGapMs || Number(import.meta.env.VITE_LLM_GAP_MS) || 500,
// ==================== 语言配置 ====================
- OUTPUT_LANGUAGE: import.meta.env.VITE_OUTPUT_LANGUAGE || 'zh-CN', // zh-CN | en-US
+ OUTPUT_LANGUAGE: runtimeConfig?.outputLanguage || import.meta.env.VITE_OUTPUT_LANGUAGE || 'zh-CN', // zh-CN | en-US
// ==================== 开发环境标识 ====================
isDev: import.meta.env.DEV,