The review agent was creating too many low-value skills. Three changes tighten the funnel: - review_worker prompt: rewritten in "保守模式". Default decision is do-nothing. To create, all five AND conditions must hold (>=5 tool calls with step dependencies, an explicit fail->fix->success episode, cross-scenario reusability, no >=70% overlap with skill_list, can produce >=300 chars of substance). Adds 7 explicit NO categories (single-tool loops, one-off queries, LLM common knowledge, etc.) and a 4-question self-check before any create. Hard cap of 1 new skill per review, with patch preferred over create. - min_tool_calls: 3 -> 5. Matches the prompt's ">=5 steps" hard condition so trivial turns never reach the LLM reviewer. - Updated config.yaml, the default-value assertion in test_skill_review_worker, and the middleware docstring's "(default 3)" annotation to keep all three references in sync. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
40 lines
2.1 KiB
Python
40 lines
2.1 KiB
Python
from pydantic import BaseModel, Field
|
|
|
|
|
|
class ReviewWorkerConfig(BaseModel):
|
|
"""Configuration for the post-turn background skill review worker."""
|
|
|
|
enabled: bool = Field(default=False, description="Whether the review worker is active.")
|
|
min_tool_calls: int = Field(default=5, description="Minimum tool calls in a turn to trigger review. Matches the prompt's '≥5 steps' hard condition so simple queries never reach the LLM reviewer.")
|
|
max_messages: int = Field(default=60, description="Max messages passed to the review LLM.")
|
|
model_name: str | None = Field(default=None, description="Model to use for review; defaults to primary model.")
|
|
timeout_seconds: int = Field(default=120, description="Overall timeout for a single review run.")
|
|
|
|
|
|
class CuratorConfig(BaseModel):
|
|
"""Configuration for the background skill curator."""
|
|
|
|
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.")
|
|
review_timeout_seconds: int = Field(default=600, description="Overall timeout (seconds) for the LLM review pass.")
|
|
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.",
|
|
)
|
|
review_worker: ReviewWorkerConfig = Field(
|
|
default_factory=ReviewWorkerConfig,
|
|
description="Configuration for the post-turn background skill review worker.",
|
|
)
|