fix: 修正 Hermite 同步逻辑与模型优先级配置

This commit is contained in:
caoxiaozhu
2026-05-09 09:21:00 +00:00
parent 694ee42781
commit da6f0e2589
2 changed files with 55 additions and 22 deletions

View File

@@ -1,5 +1,6 @@
from __future__ import annotations
from __future__ import annotations
import logging
from dataclasses import dataclass
from datetime import datetime
@@ -23,7 +24,9 @@ from app.services.hermes_sync import (
restore_hermes_config_snapshot,
sync_hermes_model_settings,
)
logger = logging.getLogger(__name__)
@dataclass(frozen=True, slots=True)
class ModelSlotConfig:
@@ -314,14 +317,14 @@ class SettingsService:
def load_saved_model_api_key(self, slot: str | None) -> str:
if not slot or slot not in MODEL_SLOT_CONFIGS:
return ""
settings_row, secrets_row = self.ensure_settings_ready()
model_rows = self.ensure_model_settings_ready(settings_row, secrets_row)
encrypted_value = model_rows[slot].api_key_encrypted
if not encrypted_value:
return ""
return decrypt_secret(encrypted_value)
settings_row, secrets_row = self.ensure_settings_ready()
model_rows = self.ensure_model_settings_ready(settings_row, secrets_row)
encrypted_value = model_rows[slot].api_key_encrypted
if not encrypted_value:
return ""
return self._decrypt_model_api_key(encrypted_value, slot=slot)
def get_runtime_model_config(self, slot: str) -> dict[str, str]:
if slot not in MODEL_SLOT_CONFIGS:
@@ -489,9 +492,7 @@ class SettingsService:
model_row.api_key_encrypted = encrypt_secret(normalized_api_key)
def _build_hermes_model_route(self, model_row: SystemModelSetting) -> HermesModelRoute:
api_key = ""
if model_row.api_key_encrypted:
api_key = decrypt_secret(model_row.api_key_encrypted)
api_key = self._decrypt_model_api_key(model_row.api_key_encrypted, slot=model_row.slot)
return HermesModelRoute(
provider_label=str(model_row.provider or "").strip(),
@@ -500,6 +501,16 @@ class SettingsService:
api_key=api_key,
)
def _decrypt_model_api_key(self, encrypted_value: str, *, slot: str) -> str:
normalized_value = str(encrypted_value or "").strip()
if not normalized_value:
return ""
try:
return decrypt_secret(normalized_value)
except ValueError:
logger.warning("Skipping undecryptable model API key for slot=%s", slot)
return ""
def _ensure_settings_schema(self) -> None:
bind = self.db.get_bind()
inspector = inspect(bind)
@@ -511,7 +522,7 @@ class SettingsService:
settings_columns = {column["name"] for column in inspector.get_columns("system_settings")}
if "onlyoffice_enabled" not in settings_columns:
migration_statements.append(
"ALTER TABLE system_settings ADD COLUMN onlyoffice_enabled BOOLEAN DEFAULT 0"
"ALTER TABLE system_settings ADD COLUMN onlyoffice_enabled BOOLEAN DEFAULT FALSE"
)
if "onlyoffice_public_url" not in settings_columns:
migration_statements.append(