乐于分享
好东西不私藏

OpenSquilla 源码解析 ④:Meta Skills — Agent 的自演进引擎

OpenSquilla 源码解析 ④:Meta Skills — Agent 的自演进引擎

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
 proposals

2.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自动编写 Skillskills/ + meta_resolution.py
Test沙箱中 E2E 验证engine/steps/meta_resolution.py
Filter按需激活 Skillengine/steps/skills_filter.py
Inject注入到 Promptprompt_assembler_stage.py

核心洞察: Meta Skills 让 Agent 从"人类编程"走向"自我编程"。SquillaRouter 和 Meta Skills 的协同,才是 OpenSquilla Token 效率的真正来源。


下期预告

OpenSquilla 源码解析 ⑤:Provider 系统与多通道网关 + 沙箱安全


科技洞察助手 | 源码深度解析系列