调度健壮性:
- 技能进化总开关 skill_evolution.enabled 真正生效;CuratorConfig
与 CuratorSubConfig 默认 enabled 改为 false(显式 opt-in)
- 新增 per-user 运行锁(.curator_state 的 running/started_at),
防定时器与手动触发并发重复运行;6h stale 检测防进程残留死锁
- maybe_run_curator 改用 ThreadPoolExecutor 限并发(上限 5),
防首次部署所有用户同时到期的惊群
- 首次运行持续失败时按 6h 退避重试,不再每个 tick 烧 LLM 配额
- should_run_now 时间解析容忍 naive 时间串;损坏的 last_run_at
触发重跑而非永久死锁
- SkillStore 新增 list_published_names 批量接口,curator 一轮
只查一次 published,取代逐技能查库
LLM 评审超时:
- _run_llm_review 给 agent.invoke 套整体超时
(curator.review_timeout_seconds,默认 600s),超时中止本次评审
并在 curator 日志输出,curator 正常收尾、释放运行锁
- copy_context 把 user 上下文传入工作线程
模型可配置:
- 新增 curator.model_name;curator 评审与技能安全审核共用该模型,
未配置则回退主模型
- 移除独立的 moderation_model_name 配置
- 前端进化面板新增模型下拉选择器
手动触发体验:
- /api/curator/run 派发后台线程前先预检,返回 {triggered, reason},
不再无论开关状态都提示"已开始"
- 前端:总开关/curator 开关未开时禁用"立即执行"按钮,
被预检拦下时按原因(开关未开 / 已有任务在跑)给出准确提示
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
31 lines
1.7 KiB
Python
31 lines
1.7 KiB
Python
from pydantic import BaseModel, Field
|
|
|
|
|
|
class CuratorConfig(BaseModel):
|
|
"""Configuration for the background skill curator."""
|
|
|
|
# 默认关闭:curator 仅在用户显式开启时才运行(配合 SkillEvolutionConfig.enabled
|
|
# 总开关,二者均为安全默认 False —— 未显式 opt-in 则整套技能进化不动作)。
|
|
enabled: bool = Field(default=False, description="Whether the curator runs automatically.")
|
|
interval_hours: int = Field(default=168, description="Hours between curator runs (default: 7 days).")
|
|
stale_after_days: int = Field(default=30, description="Days of inactivity before a skill is marked stale.")
|
|
archive_after_days: int = Field(default=90, description="Days of inactivity before a stale skill is archived.")
|
|
# LLM 评审整体超时:agent.invoke 内部可能多轮调 LLM,模型层的单次 request_timeout
|
|
# 兜不住整体;超过此秒数则中止本次评审,curator 正常收尾并释放运行锁。
|
|
review_timeout_seconds: int = Field(default=600, description="Overall timeout (seconds) for the LLM review pass.")
|
|
# curator LLM 评审使用的模型名(对应 config.yaml models[].name);为空则用主模型。
|
|
model_name: str | None = Field(default=None, description="Model name for the curator LLM review pass. Defaults to the primary chat model.")
|
|
|
|
|
|
class SkillEvolutionConfig(BaseModel):
|
|
"""Configuration for agent-managed skill evolution."""
|
|
|
|
enabled: bool = Field(
|
|
default=False,
|
|
description="Whether the agent can create and modify skills under skills/custom.",
|
|
)
|
|
curator: CuratorConfig = Field(
|
|
default_factory=CuratorConfig,
|
|
description="Configuration for the background skill curator.",
|
|
)
|