diff --git a/platform/backend/app/core/nvidia_client.py b/platform/backend/app/core/nvidia_client.py index 5265b19..db90ca2 100644 --- a/platform/backend/app/core/nvidia_client.py +++ b/platform/backend/app/core/nvidia_client.py @@ -50,29 +50,31 @@ def _get_active_provider() -> str: def _get_provider_config(provider: Optional[str] = None) -> dict: p = provider or _get_active_provider() - # 优先从 DB 读取该供应商的配置 - model = None - base_url = None + # 优先从 DB 读取该供应商的完整配置(包括 api_key) + db_model = None + db_base_url = None + db_api_key = None try: from ..database import SessionLocal from ..models import LLMConfig db = SessionLocal() cfg = db.query(LLMConfig).filter(LLMConfig.provider == p).order_by(LLMConfig.is_active.desc()).first() if cfg: - model = cfg.model - base_url = cfg.base_url + db_model = cfg.model + db_base_url = cfg.base_url + db_api_key = cfg.api_key db.close() except Exception: pass # 回退到代码默认值 fb = _FALLBACK.get(p, {}) - api_key = _API_KEYS.get(p, "") + api_key = db_api_key or _API_KEYS.get(p, "") if not api_key: - raise LLMError(f"{p} API_KEY 未配置,请在 .env 中设置") + raise LLMError(f"{p} API_KEY 未配置,请在管理后台 LLM 配置中设置 API Key") return { "api_key": api_key, - "model": model or fb.get("model", ""), - "base_url": base_url or fb.get("base_url", ""), + "model": db_model or fb.get("model", ""), + "base_url": db_base_url or fb.get("base_url", ""), } def _get_db_defaults(provider: Optional[str] = None) -> dict: diff --git a/platform/frontend/admin.html b/platform/frontend/admin.html index 1a13d16..c5ef28e 100644 --- a/platform/frontend/admin.html +++ b/platform/frontend/admin.html @@ -607,8 +607,9 @@ - - + + + @@ -718,9 +719,9 @@ const llmConfigs = ref([]); Object.assign(llmConfigForm, row); } else { llmConfigDialogTitle.value = '新增配置'; editingLLMConfigId.value = null; - llmConfigForm.id = null; llmConfigForm.name = ''; llmConfigForm.provider = 'opencode-go'; llmConfigForm.model = 'deepseek-v4-pro'; - llmConfigForm.base_url = 'https://opencode.ai/zen/go/v1'; llmConfigForm.api_key = ''; llmConfigForm.temperature = 0.7; - llmConfigForm.max_tokens = 131072; llmConfigForm.system_prompt = ''; llmConfigForm.user_prompt_template = ''; llmConfigForm.is_active = true; + llmConfigForm.id = null; llmConfigForm.name = ''; llmConfigForm.provider = 'sensenova'; llmConfigForm.model = 'deepseek-v4-flash'; + llmConfigForm.base_url = 'https://token.sensenova.cn/v1'; llmConfigForm.api_key = ''; llmConfigForm.temperature = 0.3; + llmConfigForm.max_tokens = 4000; llmConfigForm.system_prompt = ''; llmConfigForm.user_prompt_template = ''; llmConfigForm.is_active = true; } llmConfigDialogVisible.value = true; };