乐于分享
好东西不私藏

OpenClaw 核心原理:Skill 多步调用全解析

OpenClaw 核心原理:Skill 多步调用全解析

OpenClaw 能够把 skill 和工具 进行多步调用,高效完成复杂任务。本文带你拆解 OpenClaw 调用 skill 的核心能力原理,用流程图逻辑+Python代码对应,一次性讲透交互全过程。


🔍 一、核心交互流程:用户→大模型→Tool→Skill

当用户提出问题,整套调用链路会按固定逻辑循环执行,最多支持 10轮 调用,直至输出最终答案。

1. 问题分析与 Skill 初选

用户问题 → 大模型接收 → 大模型遍历所有 Skill(Name+Describe)
→ 大模型分析需求,选定目标 Skill(例:读文件工具)

2. Skill 内容读取

大模型指令:读取对应 Skill 文件 → 获取 Skill 完整使用规则
→ 规则回传大模型,掌握 Skill 使用方法

3. Tool 执行与命令调用

大模型生成执行指令 → 调用 Tool 执行(主流:curl命令/Shell脚本
→ 执行 Skill 对应的 API → 获取返回结果

4. 多轮循环判断

结果回传大模型 → 校验是否为最终答案
✅ 是:结束流程,返回结果
❌ 否:开启下一轮 Skill 调用,重复上述步骤
→ 最多循环 10轮 终止


💻 二、代码层对应:Python 实现逻辑

理论落地到代码,每一步都有明确对应关系,清晰易懂。

1. 初始化:加载所有 Skill

程序启动 → 读取全部 Skill 文件 → 提取 Skill 名称+描述
→ 拼接进 System 提示词 → 整合入 Message 结构体

# 加载 skillsskills = load_skills(SKILLS_DIR)if not skills:	print("[错误] 未找到任何 SKILL 文件,请检查 SKILLS_DIR 配置")	returnprint(f"\n已加载 {len(skills)} 个技能: {', '.join(skills.keys())}\n")# 构建 system prompt(参考 openclaw 的 buildEmbeddedSystemPrompt)system_prompt = build_system_prompt(skills)messages = [	{"role""system""content": system_prompt},	*conversation_history,	{"role""user""content": user_input},]

2. 消息结构组装

System 提示词(含 Skill 信息)+ 历史对话 + 用户最新问题
→ 生成完整请求 Message

3. 接口调用:Function Call 核心

Message 传入 chat.completion 接口
→ 同步传入 TOOLS 参数(开启 Function Call 能力)

        # 始终用 stream=True(对应 openai-completions.js 的 stream: true)        stream = client.chat.completions.create(            model=MODEL_ID,            messages=messages,            tools=TOOLS,            tool_choice="auto",            stream=True,            stream_options={"include_usage"True},            extra_body={"enable_thinking"True},        )

🛠️ 三、OpenClaw 必备双 Tool 设计

为支撑 Skill 多步调用,至少需配置两个核心工具,分工明确:

  1. 读工具
     📖
    专属作用:读取 Skill 文件,获取完整执行规则
  2. 执行工具
     ⚙️
    专属作用:运行脚本,主流为执行 curl 命令,完成 Skill 落地
    TOOLS = [    {        "type""function",        "function": {            "name""read_file",            "description": (                "读取文件内容。用于读取 SKILL.md 技能说明文件,获取接口地址、参数格式等信息。"            ),            "parameters": {                "type""object",                "required": ["file_path"],                "properties": {                    "file_path": {                        "type""string",                        "description""文件路径(绝对路径或相对路径)",                    }                },            },        },    },    {        "type""function",        "function": {            "name""exec_command",            "description": (                "执行 Shell 命令。用于执行 curl 命令调用外部 API 接口,获取查询结果。"                "只允许执行 curl 命令,不允许执行其他命令。"            ),            "parameters": {                "type""object",                "required": ["command"],                "properties": {                    "command": {                        "type""string",                        "description""要执行的 Shell 命令(仅限 curl)",                    }                },            },        },    },]

🔁 四、最终执行闭环

大模型输出 Function Call 结果 → 解析结果数据
→ 触发 Tool 执行 → 结果回传 → 循环/终止
→ 输出最终答案

while iteration < max_iterations:        iteration += 1        print(f"\n[循环 {iteration}/{max_iterations}] 调用大模型...", flush=True)