feat(skill-evolution): expose model_name as per-user configurable field

前端恢复模型选择器,后端允许 model_name 写入 per-user skill_evolution.json。

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
xuhdandClaude Sonnet 4.6 committed 2026-06-05 13:32:19 +08:00
1 parent 603d667608
commit 2c2650ff07
4 files changed
+49 -3

No files matched your search

@@ -2329,14 +2329,15 @@ class CuratorConfigResponse(BaseModel):
class CuratorConfigRequest(BaseModel):
"""Payload for updating the three user-facing curator thresholds in skill_evolution.json.
"""Payload for updating user-facing curator settings in skill_evolution.json.
All other settings (enabled, model, timeouts) are controlled via config.yaml.
All other settings (enabled, timeouts) are global-only and controlled via config.yaml.
"""
interval_hours: int = Field(..., ge=1, description="Hours between curator runs.")
stale_after_days: int = Field(..., ge=1, description="Days of inactivity before a skill is marked stale.")
archive_after_days: int = Field(..., ge=1, description="Days of inactivity before a stale skill is archived.")
model_name: str | None = Field(default=None, description="Model for the curator LLM review; null = primary model.")
class CuratorLogRecord(BaseModel):
@@ -2394,6 +2395,7 @@ async def update_curator_config(body: CuratorConfigRequest, request: Request) ->
"interval_hours": body.interval_hours,
"stale_after_days": body.stale_after_days,
"archive_after_days": body.archive_after_days,
"model_name": body.model_name,
},
})
return _build_curator_config_response(load_skill_evolution_config_for_user(user_id))
@@ -137,7 +137,7 @@ def resolve_user_path(user_id: str) -> Path:
# Only these curator sub-fields may be overridden per user.
# All other fields (enabled, model_name, timeouts, etc.) are global-only.
_USER_ALLOWED_CURATOR_KEYS = {"interval_hours", "stale_after_days", "archive_after_days"}
_USER_ALLOWED_CURATOR_KEYS = {"interval_hours", "stale_after_days", "archive_after_days", "model_name"}
def load_user_overrides(user_id: str) -> dict[str, Any] | None: