feat(llm): LLM 配置完全通过管理后台维护
- _get_provider_config 改从 DB 读取 api_key(.env 为 fallback) - 前端 admin.html 新增 sensenova provider 选项,默认值更新为 sensenova - 新增提供商不再需要改代码,后台直接配即可
This commit is contained in:
@@ -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:
|
||||||
|
|||||||
@@ -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;
|
||||||
};
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user