feat(llm): LLM 配置完全通过管理后台维护

- _get_provider_config 改从 DB 读取 api_key(.env 为 fallback)
- 前端 admin.html 新增 sensenova provider 选项,默认值更新为 sensenova
- 新增提供商不再需要改代码,后台直接配即可
This commit is contained in:
Yuzhiran Dev
2026-06-01 14:23:24 +08:00
parent 2c17f006fc
commit 475945418e
2 changed files with 17 additions and 14 deletions
+11 -9
View File
@@ -50,29 +50,31 @@ def _get_active_provider() -> str:
def _get_provider_config(provider: Optional[str] = None) -> dict: def _get_provider_config(provider: Optional[str] = None) -> dict:
p = provider or _get_active_provider() p = provider or _get_active_provider()
# 优先从 DB 读取该供应商的配置 # 优先从 DB 读取该供应商的完整配置(包括 api_key
model = None db_model = None
base_url = None db_base_url = None
db_api_key = None
try: try:
from ..database import SessionLocal from ..database import SessionLocal
from ..models import LLMConfig from ..models import LLMConfig
db = SessionLocal() db = SessionLocal()
cfg = db.query(LLMConfig).filter(LLMConfig.provider == p).order_by(LLMConfig.is_active.desc()).first() cfg = db.query(LLMConfig).filter(LLMConfig.provider == p).order_by(LLMConfig.is_active.desc()).first()
if cfg: if cfg:
model = cfg.model db_model = cfg.model
base_url = cfg.base_url db_base_url = cfg.base_url
db_api_key = cfg.api_key
db.close() db.close()
except Exception: except Exception:
pass pass
# 回退到代码默认值 # 回退到代码默认值
fb = _FALLBACK.get(p, {}) fb = _FALLBACK.get(p, {})
api_key = _API_KEYS.get(p, "") api_key = db_api_key or _API_KEYS.get(p, "")
if not api_key: if not api_key:
raise LLMError(f"{p} API_KEY 未配置,请在 .env 中设置") raise LLMError(f"{p} API_KEY 未配置,请在管理后台 LLM 配置中设置 API Key")
return { return {
"api_key": api_key, "api_key": api_key,
"model": model or fb.get("model", ""), "model": db_model or fb.get("model", ""),
"base_url": base_url or fb.get("base_url", ""), "base_url": db_base_url or fb.get("base_url", ""),
} }
def _get_db_defaults(provider: Optional[str] = None) -> dict: def _get_db_defaults(provider: Optional[str] = None) -> dict:
+6 -5
View File
@@ -607,8 +607,9 @@
<el-col :span="12"><el-form-item label="名称"><el-input v-model="llmConfigForm.name" placeholder="如:default_expand"/></el-form-item></el-col> <el-col :span="12"><el-form-item label="名称"><el-input v-model="llmConfigForm.name" placeholder="如:default_expand"/></el-form-item></el-col>
<el-col :span="12"><el-form-item label="供应商"> <el-col :span="12"><el-form-item label="供应商">
<el-select v-model="llmConfigForm.provider" style="width:100%"> <el-select v-model="llmConfigForm.provider" style="width:100%">
<el-option label="opencode-go (deepseek-v4-pro)" value="opencode-go"></el-option> <el-option label="opencode-go (deepseek-v4-flash)" value="opencode-go"></el-option>
<el-option label="nvidia (gemma-3n)" value="nvidia"></el-option> <el-option label="nvidia (step-3.5-flash)" value="nvidia"></el-option>
<el-option label="sensenova (deepseek-v4-flash)" value="sensenova"></el-option>
</el-select> </el-select>
</el-form-item></el-col> </el-form-item></el-col>
</el-row> </el-row>
@@ -718,9 +719,9 @@ const llmConfigs = ref([]);
Object.assign(llmConfigForm, row); Object.assign(llmConfigForm, row);
} else { } else {
llmConfigDialogTitle.value = '新增配置'; editingLLMConfigId.value = null; llmConfigDialogTitle.value = '新增配置'; editingLLMConfigId.value = null;
llmConfigForm.id = null; llmConfigForm.name = ''; llmConfigForm.provider = 'opencode-go'; llmConfigForm.model = 'deepseek-v4-pro'; llmConfigForm.id = null; llmConfigForm.name = ''; llmConfigForm.provider = 'sensenova'; llmConfigForm.model = 'deepseek-v4-flash';
llmConfigForm.base_url = 'https://opencode.ai/zen/go/v1'; llmConfigForm.api_key = ''; llmConfigForm.temperature = 0.7; llmConfigForm.base_url = 'https://token.sensenova.cn/v1'; llmConfigForm.api_key = ''; llmConfigForm.temperature = 0.3;
llmConfigForm.max_tokens = 131072; llmConfigForm.system_prompt = ''; llmConfigForm.user_prompt_template = ''; llmConfigForm.is_active = true; llmConfigForm.max_tokens = 4000; llmConfigForm.system_prompt = ''; llmConfigForm.user_prompt_template = ''; llmConfigForm.is_active = true;
} }
llmConfigDialogVisible.value = true; llmConfigDialogVisible.value = true;
}; };