Meta Skills:Agent 的自演进引擎
核心技术报告:
docs/releases/agentic_routing_v0.pdf
源码分布:skills/+engine/steps/meta_resolution.py(58KB) +engine/steps/skills_filter.py(14KB)
一、传统 Skill vs Meta Skill
传统 Skill:
人类发现问题 → 人类写 Skill → 人类测试 → 安装
Meta Skill:
Agent 发现问题 → Agent 自动提议 → Agent 写 Skill → Agent 测试 → 人类审核安装核心突破: 不是人类在教 Agent,而是 Agent 在教自己。
二、Meta Skill 的完整生命周期
OpenSquilla 的 Meta Skill 系统定义了一个五阶段生命周期:
┌─────────────────────────────────────────────────────────┐
│ Meta Skill 生命周期 │
├─────────────────────────────────────────────────────────┤
│ │
│ Phase 1: Auto-Propose │
│ Agent 检测到某个工作流被重复执行 → 自动提议创建一个 Skill │
│ ↓ │
│ Phase 2: Clarify │
│ Agent 与用户交互,明确 Skill 的输入、输出、边界条件 │
│ ↓ │
│ Phase 3: Create │
│ Agent 编写完整 Skill 文件(含工具定义、提示词、示例) │
│ ↓ │
│ Phase 4: E2E Test │
│ Agent 在隔离环境中测试 Skill,验证输入输出正确性 │
│ ↓ │
│ Phase 5: Review & Install │
│ 人类审核 → 安装 → Agent 现在拥有了新能力 │
│ │
└─────────────────────────────────────────────────────────┘2.1 Phase 1: Auto-Propose(自动提议)
# 简化还原 meta_resolution.py 中的 Auto-Propose 逻辑
class MetaSkillProposer:
"""检测可重复的工作流模式,自动提议创建 Meta Skill"""
def detect_patterns(self, session_history: list[Turn]) -> list[SkillProposal]:
"""
在会话历史中寻找可重复的模式:
1. 相似的操作序列出现 >= 3 次
2. 每次操作涉及相同的工具组合
3. 操作的输入/输出有规律可循
"""
proposals = []
# 分析工具使用模式
tool_patterns = self._extract_tool_patterns(session_history)
for pattern in tool_patterns:
if pattern.frequency >= 3: # 出现 3 次以上
proposal = SkillProposal(
name=self._suggest_name(pattern),
description=self._describe(pattern),
tools=pattern.unique_tools,
examples=pattern.sample_turns,
)
proposals.append(proposal)
return proposals2.2 Phase 2: Clarify(明确需求)
# meta_resolution.py 中的 Clarify 逻辑
class MetaSkillClarifier:
"""与用户交互,明确 Skill 的定义"""
async def clarify(self, proposal: SkillProposal) -> SkillDefinition:
"""通过多轮对话明确 Skill 的完整定义"""
# Agent 询问用户
questions = [
f"我注意到你经常执行 '{proposal.name}' 操作。",
f"这个操作的输入是什么?",
f"期望的输出是什么?",
f"有什么特殊情况需要处理吗?",
]
answers = await self.ask_user(proposal, questions)
return SkillDefinition(
name=proposal.name,
description=proposal.description,
input_schema=answers.extract_input_schema(),
output_schema=answers.extract_output_schema(),
edge_cases=answers.edge_cases,
examples=proposal.examples,
)2.3 Phase 3: Create(创建 Skill)
Agent 自动编写完整的 Skill 文件:
# Agent 自动生成的 Skill 示例
name: daily-report-generator
description: Generate a daily work report from git commits and todo items
tools:
- git_log # 读取 git 提交记录
- todo_read # 读取待办事项
- file_write # 写入报告文件
system_prompt: |
你是一个日报生成助手。根据用户的 git 提交记录和待办事项,
生成结构化的日报(包含完成事项、进行中、计划、遇到的问题)。
examples:
- input: "生成今天的日报"
expected_tools: [git_log, todo_read, file_write]
expected_output: "日报已生成到 daily-report-2026-07-07.md"2.4 Phase 4: E2E Test(端到端测试)
class MetaSkillTester:
"""在隔离沙箱中测试 Meta Skill"""
async def test_skill(self, skill: SkillDefinition) -> TestResult:
"""
E2E 测试流程:
1. 创建隔离的沙箱环境
2. 安装 Skill 依赖
3. 用示例输入运行 Skill
4. 验证工具调用顺序
5. 验证输出格式
6. 测试边界情况
"""
sandbox = Sandbox(level=2) # Docker 容器隔离
results = []
for example in skill.examples:
# 运行 Skill
output = await sandbox.run(skill, example.input)
# 验证
checks = [
self._check_tool_sequence(output, example.expected_tools),
self._check_output_format(output, example.expected_output),
self._check_error_handling(output, skill.edge_cases),
]
results.append(TestRun(
example=example,
passed=all(checks),
checks=checks,
duration=output.duration,
token_usage=output.tokens,
))
return TestResult(
skill=skill,
runs=results,
pass_rate=sum(1 for r in results if r.passed) / len(results),
)三、Skill 过滤与注入
3.1 Skills Filter:按需选择
# engine/steps/skills_filter.py 的核心逻辑
class SkillsFilter:
"""根据当前 turn 的上下文,选择需要激活的 Skill"""
def filter(self, user_input: str, routing: RoutingDecision) -> list[Skill]:
"""
三步过滤:
1. 关键词匹配
2. 上下文相关性评分
3. Token 预算检查
"""
candidates = self._keyword_match(user_input)
scored = []
for skill in candidates:
relevance = self._compute_relevance(skill, user_input)
cost = self._estimate_token_cost(skill)
if cost <= routing.token_budget_for_skills:
scored.append((skill, relevance))
# 按相关性排序,取 top-K
scored.sort(key=lambda x: x[1], reverse=True)
return [s for s, _ in scored[:self.max_skills_per_turn]]3.2 注入到 Prompt
# prompt_assembler_stage.py 中的 Skill 注入
def inject_skills_prompt(skills: list[Skill]) -> str:
"""生成 Skill 的系统提示注入文本"""
if not skills:
return ""
lines = [
"## Available Skills ##",
"You have the following specialized skills available:",
""
]
for skill in skills:
lines.append(f"### {skill.name}")
lines.append(f"**When to use:** {skill.description}")
lines.append(f"**Tools:** {', '.join(skill.tools)}")
lines.append("")
return "\n".join(lines)四、与 SquillaRouter 的协同
Meta Skills 和 SquillaRouter 之间存在有趣的协同关系:
# 使用 Meta Skill 后,路由会自动降级
# 因为 Skill 提供了领域知识,小模型也能做好
示例:
没有 Meta Skill:
用户: "生成日报" → SquillaRouter: T2 (需要复杂推理)
→ 调用 Claude Sonnet (贵)
有 Meta Skill:
用户: "生成日报" → SquillaRouter: T4 (Skill 已提供模板)
→ 调用 Qwen 7B (便宜 85%)这就是 Harness-Native 的核心价值: Harness 越好,模型需求越低。
五、总结
| 阶段 | 职责 | 源码模块 |
|---|---|---|
| Auto-Propose | 检测可重复模式 | meta_resolution.py |
| Clarify | 与用户确认需求 | meta_resolution.py |
| Create | 自动编写 Skill | skills/ + meta_resolution.py |
| Test | 沙箱中 E2E 验证 | engine/steps/meta_resolution.py |
| Filter | 按需激活 Skill | engine/steps/skills_filter.py |
| Inject | 注入到 Prompt | prompt_assembler_stage.py |
核心洞察: Meta Skills 让 Agent 从"人类编程"走向"自我编程"。SquillaRouter 和 Meta Skills 的协同,才是 OpenSquilla Token 效率的真正来源。
下期预告
OpenSquilla 源码解析 ⑤:Provider 系统与多通道网关 + 沙箱安全
科技洞察助手 | 源码深度解析系列
夜雨聆风