OpenProgram Docs

OpenClaw#

这是什么?#

本指南介绍如何在 OpenClaw 中使用 Agentic Programming — 作为 skill、工具库或 MCP tool provider。

Agentic Programming 和 OpenClaw 解决不同的问题:

  • OpenClaw 编排 agent、管理会话、路由消息
  • Agentic Programming 让单个函数具备思考能力(LLM-in-the-loop)

它们天然可组合:OpenClaw 的 skill 内部可以使用 agentic function。

配置#

# 在 OpenClaw 工作区
cd ~/.openclaw/workspace

# 克隆 OpenProgram
git clone https://github.com/fzkuji-neo/OpenProgram.git

# 准备源码环境
cd OpenProgram
uv sync --locked

用法 1:在 Skill 中使用 Agentic Function#

最简单的集成方式 — 把 agentic function 作为 OpenClaw skill 的内部构建块。

Skill 结构:

~/.openclaw/workspace/skills/my-agentic-skill/
├── SKILL.md
└── scripts/
    └── analyze.py

scripts/analyze.py:

#!/usr/bin/env python3
"""
使用 Agentic Programming 的 OpenClaw skill 脚本。
Agent 通过 exec 工具调用。
"""
import sys
import os

# 把源码 checkout 加入脚本 path
sys.path.insert(0, os.path.expanduser("~/.openclaw/workspace/OpenProgram"))

from openprogram import Agent
from openprogram.agentic_programming import llm
from openprogram.providers.registry import create_runtime

class ExampleAgent(Agent):
    method_options = {
        'decompose': {'tool': True},
        'assess': {'tool': True},
        'plan': {'tool': True},
    }

    def decompose(self, task):
        """把复杂任务拆解成可执行的步骤。"""
        return llm([
            {"type": "text", "text": f"把这个任务拆解成 3-5 个具体、可执行的步骤:\n{task}\n\n编号,要具体。"},
        ])

    def assess(self, step):
        """评估一个步骤的难度和时间。"""
        return llm([
            {"type": "text", "text": f"对这个步骤给出:难度(简单/中等/困难)和时间估计。\n格式:[难度] ~X小时\n\n步骤:{step}"},
        ])

    def plan(self, task):
        """为任务创建详细计划。"""
        steps_text = self.decompose(task=task)

        lines = [l.strip() for l in steps_text.split("\n") if l.strip() and l.strip()[0].isdigit()]
        assessments = []
        for line in lines[:5]:
            a = self.assess(step=line)
            assessments.append(f"{line}\n   → {a}")

        return "\n\n".join(assessments)

_example_agent = ExampleAgent(runtime=create_runtime(provider="anthropic", model="claude-haiku-4-5"))
decompose = _example_agent.decompose
assess = _example_agent.assess
plan = _example_agent.plan


if __name__ == "__main__":
    task = " ".join(sys.argv[1:]) if len(sys.argv) > 1 else "构建一个带认证的 REST API"
    result = plan(task=task)
    print(result)

SKILL.md(OpenClaw 要求 YAML front matter——agent 靠 name 和 description 匹配技能):

---
name: my-agentic-skill
description: Plan and decompose tasks using Agentic Programming with automatic context tracking.
---

# my-agentic-skill

当用户要求规划、分解或拆解任务时,运行:

\`\`\`bash
uv run --project ~/.openclaw/workspace/OpenProgram python \
  ~/.openclaw/workspace/skills/my-agentic-skill/scripts/analyze.py \
  "任务描述"
\`\`\`

该命令使用源码 checkout 的锁定环境运行脚本。不要使用系统 Python;系统 Python 不包含 OpenProgram 的依赖。

OpenClaw 和 OpenProgram 使用同一套 AgentSkills 兼容的 SKILL.md 格式,因此用户、项目或插件 skill 可以在两者之间复用。OpenProgram 不随安装包提供默认 skill;产品工作流由 Programs 提供。

用法 2:在 Agent 脚本中作为 Python 库#

如果你的 OpenClaw agent 运行 Python 脚本,可以直接导入 agentic function:

"""
OpenClaw agent 调用的代码审查脚本。
"""
from openprogram import Agent
from openprogram.agentic_programming import llm
from openprogram.providers.registry import create_runtime

class ExampleAgent(Agent):
    method_options = {
        'review_code': {'tool': True},
        'suggest_tests': {'tool': True},
        'code_analysis': {'tool': True},
    }

    def review_code(self, code, language="python"):
        """审查代码的 bug、风格问题和改进建议。"""
        return llm([
            {"type": "text", "text": f"审查这段 {language} 代码。列出:\n1. Bug(如果有)\n2. 风格问题\n3. 改进建议\n\n```{language}\n{code}\n```"},
        ])

    def suggest_tests(self, code):
        """为代码建议测试用例。"""
        return llm([
            {"type": "text", "text": f"为这段代码建议 3 个测试用例。每个给出:测试名称、输入、期望输出。\n\n```python\n{code}\n```"},
        ])

    def code_analysis(self, code):
        """完整代码分析:审查 + 测试建议。"""
        review = self.review_code(code=code)
        tests = self.suggest_tests(code=code)
        return f"## 代码审查\n{review}\n\n## 建议测试\n{tests}"

_example_agent = ExampleAgent(runtime=create_runtime(provider="anthropic", model="claude-haiku-4-5"))
review_code = _example_agent.review_code
suggest_tests = _example_agent.suggest_tests
code_analysis = _example_agent.code_analysis

用法 3:MCP Tool 封装#

把 agentic function 封装为 OpenClaw 可以调用的 MCP tool:

#!/usr/bin/env python3
"""
MCP 兼容的 tool server,暴露 agentic function。
"""
import json
import sys

from openprogram import Agent
from openprogram.agentic_programming import llm
from openprogram.providers.registry import create_runtime

class ExampleAgent(Agent):
    method_options = {
        'summarize_text': {'tool': True},
    }

    def summarize_text(self, text, style="bullet_points"):
        """按指定风格总结文本。"""
        style_instructions = {
            "bullet_points": "用 3-5 个要点总结。",
            "one_paragraph": "用一段话总结。",
            "eli5": "用 5 岁小孩能听懂的话解释。",
        }
        instruction = style_instructions.get(style, style_instructions["bullet_points"])

        return llm([
            {"type": "text", "text": f"{instruction}\n\n文本:\n{text}"},
        ])

_example_agent = ExampleAgent(runtime=create_runtime(provider="anthropic", model="claude-haiku-4-5"))
summarize_text = _example_agent.summarize_text


if __name__ == "__main__":
    request = json.loads(sys.stdin.read())
    tool = request.get("tool")
    args = request.get("args", {})

    if tool == "summarize":
        result = summarize_text(**args)
        print(json.dumps({"result": result}))
    else:
        print(json.dumps({"error": f"未知工具: {tool}"}))

为什么在 OpenClaw 中用 Agentic Programming?#

不用 Agentic Programming 用 Agentic Programming
Agent 在一次 LLM 调用中完成所有推理 推理拆分为聚焦的函数调用
上下文无限增长 上下文是结构化的 DAG,按函数作用域裁剪
难以调试 agent "想了什么" 每次调用都记录为 session DAG 的节点,可在 Web UI 或 session 文件里回看
重试 = 重试整个 agent 回合 重试 = 只重试失败的函数

建议#

  1. 回看执行 trace — 每次函数调用都记录在 session DAG 里,用 Web UI 或 openprogram sessions list 找到会话后回看。
  2. 保持函数小而精 — 每个 Agent method 只做一件事,用 Python 组合它们。
Last updated · 2026-10-10