feat(server): 设置持久化新增 LLM 模型表与主题字段

- SettingsLlmForm 新增 models 列表(SettingsModelRow:slot/provider/url/apiKey/modelId/type),支持多模型行持久化
- settings 服务读写模型表与主题相关字段,更新 test_settings_persistence 测试
This commit is contained in:
caoxiaozhu
2026-06-26 22:41:40 +08:00
parent 43c3ff860c
commit 9c3fa80d22
3 changed files with 164 additions and 11 deletions

View File

@@ -146,8 +146,48 @@ def test_runtime_model_config_returns_decrypted_main_model(monkeypatch) -> None:
assert runtime_model["endpoint"] == "https://api.minimaxi.com/v1"
assert runtime_model["apiKey"] == "shared-main-key"
assert runtime_model["capability"] == "chat"
def test_settings_service_persists_additional_model_rows(monkeypatch) -> None:
temp_dir = build_temp_secret_dir()
monkeypatch.setattr(secret_box, "SECRET_KEY_FILE", temp_dir / "settings.key")
monkeypatch.setattr(Base.metadata, "create_all", lambda *args, **kwargs: None)
monkeypatch.setenv("HERMES_HOME", str(temp_dir / ".hermes"))
with build_session(temp_dir / "settings.db") as db:
service = SettingsService(db)
payload = service.get_settings_snapshot().model_dump()
payload["llmForm"]["models"].append(
{
"slot": "llm_expense_audit",
"provider": "MiniMax",
"url": "https://api.minimaxi.com/v1",
"apiKey": "extra-secret",
"apiKeyConfigured": False,
"modelId": "MiniMax-Text-01",
"type": "llm",
}
)
saved_snapshot = service.save_settings_snapshot(SettingsWrite(**payload))
saved_model = next(
model for model in saved_snapshot.llmForm.models if model.slot == "llm_expense_audit"
)
assert saved_model.provider == "MiniMax"
assert saved_model.url == "https://api.minimaxi.com/v1"
assert saved_model.modelId == "MiniMax-Text-01"
assert saved_model.type == "llm"
assert saved_model.apiKey == ""
assert saved_model.apiKeyConfigured is True
model_row = db.get(SystemModelSetting, "llm_expense_audit")
assert model_row is not None
assert model_row.capability == "chat"
assert model_row.priority == 50
assert service.load_saved_model_api_key("llm_expense_audit") == "extra-secret"
def test_legacy_setup_admin_password_is_migrated_to_database(monkeypatch) -> None:
temp_dir = build_temp_secret_dir()
admin_file = temp_dir / "admin.json"