refactor(skill-evolution): simplify config UI to 3 user-editable fields

前端配置页只保留运行间隔、陈旧阈值、归档阈值三个字段,
其余配置(enabled、model_name 等)走 config.yaml 全局默认。
后端 PUT /api/curator/config 仅保存这三个字段到 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 6f9afcdba2
commit d0c696e523
4 files changed
+43 -119

No files matched your search

@@ -2329,12 +2329,12 @@ class CuratorConfigResponse(BaseModel):
class CuratorConfigRequest(BaseModel):
"""Payload for updating per-user skill evolution overrides.
"""Payload for updating the three user-facing curator thresholds in skill_evolution.json.
Users may only adjust archiving thresholds. All other settings (enabled,
interval, model, timeouts) are global and controlled via config.yaml.
All other settings (enabled, model, timeouts) are 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.")
@@ -2352,11 +2352,7 @@ class CuratorLogsResponse(BaseModel):
def _build_curator_config_response(evo) -> CuratorConfigResponse:
"""Pure helper so both the GET route and the post-PUT refresh share one shape.
``evo`` is a ``SkillEvolutionConfig`` instance (already merged with per-user
overrides if any).
"""
"""Pure helper so both the GET route and the post-PUT refresh share one shape."""
return CuratorConfigResponse(
enabled=evo.enabled,
curator=CuratorSubConfig(
@@ -2372,8 +2368,7 @@ def _build_curator_config_response(evo) -> CuratorConfigResponse:
@router.get("/curator/config", response_model=CuratorConfigResponse, summary="Get Skill Evolution Config")
async def get_curator_config(request: Request) -> CuratorConfigResponse:
"""Return the current curator config for the authenticated user (yaml
defaults + that user's overrides)."""
"""Return the current curator config for the authenticated user (yaml defaults + per-user overrides)."""
try:
from deerflow.config.skill_evolution_runtime import load_skill_evolution_config_for_user
@@ -2386,11 +2381,9 @@ async def get_curator_config(request: Request) -> CuratorConfigResponse:
@router.put("/curator/config", response_model=CuratorConfigResponse, summary="Update Skill Evolution Config")
async def update_curator_config(body: CuratorConfigRequest, request: Request) -> CuratorConfigResponse:
"""Persist per-user archiving thresholds to ``users/{user_id}/skill_evolution.json``.
"""Persist the three user-facing curator thresholds to the per-user ``skill_evolution.json``.
Only ``stale_after_days`` and ``archive_after_days`` are user-editable.
All other settings (enabled, interval, model, timeouts) are global and
read from config.yaml; users cannot override them here.
Other settings (enabled, model, timeouts) are global and controlled via config.yaml.
"""
try:
from deerflow.config.skill_evolution_runtime import load_skill_evolution_config_for_user, save_user_overrides
@@ -2398,9 +2391,10 @@ async def update_curator_config(body: CuratorConfigRequest, request: Request) ->
user_id = _current_user_id(request)
save_user_overrides(user_id, {
"curator": {
"interval_hours": body.interval_hours,
"stale_after_days": body.stale_after_days,
"archive_after_days": body.archive_after_days,
}
},
})
return _build_curator_config_response(load_skill_evolution_config_for_user(user_id))
except HTTPException: