OpenClaw / 08

构建你的 OpenClaw

这一节是动手实践。目标是把 pi-mono 改成属于你自己的 Agent,部署起来,通过 Slack 或飞书跟它对话。

完成之后,你就有了一个真正运行在你自己机器上的 Coding Agent,可以叫它 [你的名字]Claw


第一步:Fork 并克隆 pi-mono

# Fork 仓库(在 GitHub 上操作)
# 然后克隆你自己的 fork
git clone https://github.com/[你的用户名]/pi-mono
cd pi-mono

为什么 fork 而不是直接 clone?

fork 之后,你可以自由修改、提交到自己的仓库,同时还能从上游拉取更新。你的 Agent 是你自己的代码,不是别人的。


第二步:配置 LLM

pi-mono 使用 OpenAI 兼容协议,只需要设置环境变量:

# Kimi (Moonshot)
export OPENAI_API_KEY="sk-xxx"
export OPENAI_BASE_URL="https://api.moonshot.cn/v1"
export OPENAI_MODEL="moonshot-v1-32k"

# 智谱 GLM
export OPENAI_API_KEY="your-key.your-secret"
export OPENAI_BASE_URL="https://open.bigmodel.cn/api/paas/v4"
export OPENAI_MODEL="glm-4"

# DeepSeek
export OPENAI_API_KEY="sk-xxx"
export OPENAI_BASE_URL="https://api.deepseek.com/v1"
export OPENAI_MODEL="deepseek-chat"

建议把这些写进 .env 文件(加进 .gitignore),用 python-dotenv 加载:

# 在入口文件顶部
from dotenv import load_dotenv
load_dotenv()

第三步:修改系统 Prompt

SYSTEM_PROMPT.md 是你 Agent 的”人格”。把它改成你想要的行为:

你是 [你的名字]Claw,一个专注于 Python 和 TypeScript 的 Coding Agent。

你的工作方式:
- 修改代码前先读取并理解现有实现
- 遇到不确定的需求,直接问用户,不要猜测
- 每次修改后运行相关测试
- 用中文和用户对话,代码注释用英文

你的限制:
- 不修改 .env 文件
- 不执行 git push(需要用户确认后再推)

系统 Prompt 的质量直接决定 Agent 的可靠性。多花时间在这里。


第四步:精简工具集

根据你的使用场景,决定保留哪些工具:

# agent/tools/__init__.py — 根据需要增删
from .file_ops import ReadFile, WriteFile, EditFile, ListDir
from .shell import Bash
from .search_ops import Grep, Find
# from .web import SearchWeb  ← 如果不需要联网搜索,注释掉

ALL_TOOLS = [ReadFile(), WriteFile(), EditFile(), ListDir(), Bash(), Grep(), Find()]

原则:你用不到的工具,删掉。工具越少,Agent 行为越可预测。


第五步:本地测试

# 安装依赖
uv sync

# 命令行交互模式
uv run python -m agent.main

# 你应该能看到:
# > 你好,我是 [你的名字]Claw。有什么可以帮你?
# You: 帮我看看 src/main.py 有没有问题

在部署之前,在命令行把几个典型任务跑通:

  • 读文件并分析
  • 修改代码并解释改了什么
  • 执行 shell 命令并处理输出

第六步:PM2 后台部署

PM2 是 Node.js 生态的进程管理器,支持 Python 脚本,是 Agent 后台部署的标准工具。

# 安装 PM2
npm install -g pm2

# 启动 Agent(HTTP 服务模式)
pm2 start "uv run python -m agent.server" --name "myclaw"

# 查看状态
pm2 status

# 查看日志
pm2 logs myclaw

# 开机自启
pm2 startup
pm2 save

agent/server.py 是一个简单的 HTTP 服务,接收消息,调用 Agent,返回结果:

# agent/server.py
from flask import Flask, request, jsonify
from agent.main import process_message

app = Flask(__name__)

@app.route("/message", methods=["POST"])
def handle_message():
    data = request.json
    user_id = data.get("user_id", "default")
    text = data["text"]
    response = process_message(user_id=user_id, text=text)
    return jsonify({"text": response})

if __name__ == "__main__":
    app.run(host="0.0.0.0", port=5000)

第七步:接入 Slack 或飞书

Slack 集成

# integrations/slack_bot.py
from slack_bolt import App
from slack_bolt.adapter.flask import SlackRequestHandler
import requests

slack_app = App(token=os.environ["SLACK_BOT_TOKEN"],
                signing_secret=os.environ["SLACK_SIGNING_SECRET"])

@slack_app.event("app_mention")
def handle_mention(event, say):
    user_id = event["user"]
    text = event["text"].replace(f"<@{slack_app.client.auth_test()['user_id']}>", "").strip()

    # 转发给 Agent 服务
    resp = requests.post("http://localhost:5000/message",
                         json={"user_id": user_id, "text": text})
    say(resp.json()["text"])

飞书集成

# integrations/feishu_bot.py
import hmac, hashlib, json
from flask import Flask, request

app = Flask(__name__)

@app.route("/feishu/webhook", methods=["POST"])
def handle_feishu():
    data = request.json

    # 飞书 URL 验证
    if data.get("type") == "url_verification":
        return jsonify({"challenge": data["challenge"]})

    # 处理消息
    if data.get("header", {}).get("event_type") == "im.message.receive_v1":
        msg = data["event"]["message"]
        user_id = data["event"]["sender"]["sender_id"]["user_id"]
        text = json.loads(msg["content"])["text"]

        resp = requests.post("http://localhost:5000/message",
                             json={"user_id": user_id, "text": text})

        # 回复消息(需要调飞书发送 API)
        send_feishu_message(user_id, resp.json()["text"])

    return jsonify({"code": 0})

你的 Agent 叫什么

OpenClaw 的命名约定:[你的名字]Claw

比如:

  • AliceClaw — Alice 的 Coding Agent
  • BobClaw — Bob 的 Coding Agent

这不只是命名游戏。给你的 Agent 一个名字,意味着它是你自己的东西,不是某个框架的实例。你对它的行为负责,你也最了解它。

# SYSTEM_PROMPT.md 第一行
你是 AliceClawAlice 的个人 Coding Agent

完整的部署检查清单

□ fork + clone pi-mono
□ 配置 .env(API key + base URL + model)
□ 修改 SYSTEM_PROMPT.md
□ 精简工具集(删掉用不到的)
□ 本地命令行测试(至少 5 个典型任务)
□ 启动 agent/server.py,测试 HTTP 接口
□ pm2 start,验证后台运行
□ 接入 Slack 或飞书,测试端到端对话
□ pm2 save + pm2 startup(配置开机自启)

下一篇:面试与实习准备