17 KiB
created, type, status, tags
| created | type | status | tags | |||||
|---|---|---|---|---|---|---|---|---|
| 2026-03-21 | project | active |
|
Trading Agents 部署记录
本文记录 Trading Agents 多 Agent 辩论系统的完整部署过程,从 Discord Bot 创建到 OpenClaw 配置更新和 Skill 文件部署。
一、部署概览
| 项目 | 详情 |
|---|---|
| 部署日期 | 2026-03-21 |
| 远程服务器 | yiukai@192.168.68.108 (yiukai-ubuntu) |
| OpenClaw 版本 | 2026.3.2 (Node.js v24.13.1) |
| openclaw 二进制位置 | /home/yiukai/.nvm/versions/node/v24.13.1/bin/openclaw |
| 需 nvm 加载 | export NVM_DIR="$HOME/.nvm"; [ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh" |
| 配置文件 | ~/.openclaw/openclaw.json |
| API 数据源 | https://invest-api.k8s.home (192.168.68.240:8000) |
| Stock Guild ID | 1479926167141355560 |
| Stock Channel ID | 1479926167736942774 |
二、Discord Bot 创建
创建流程(每个 Bot 重复)
- 打开 https://discord.com/developers/applications
- 点击 "New Application" → 输入名称 → 创建
- 左侧菜单 "Bot" → 开启 "Message Content Intent"(Privileged Gateway Intents 下)
- 点 "Reset Token" → 复制 token(仅显示一次)
- 左侧 "OAuth2" → URL Generator → 勾选
botscope - Bot Permissions 勾选:
Send Messages、Read Message History、View Channels - 复制生成的 URL → 浏览器打开 → 邀请到 Stock Guild
4 个新 Bot 信息
| Bot 名称 | Discord Account ID | Bot User ID | Token 前缀 |
|---|---|---|---|
| invest-bull | invest-bull | 1484895948860817449 |
MTQ4NDg5NTk0ODg2MDgxNzQ0OQ... |
| invest-bear | invest-bear | 1484896838506254427 |
MTQ4NDg5NjgzODUwNjI1NDQyNw... |
| invest-hawk | invest-hawk | 1484897321526362316 |
MTQ4NDg5NzMyMTUyNjM2MjMxNg... |
| invest-dove | invest-dove | 1484897784024006826 |
MTQ4NDg5Nzc4NDAyNDAwNjgyNg... |
Bot User ID 解码方法:Discord token 的第一段(第一个
.前)是 base64 编码的 User ID。import base64 token_prefix = "MTQ4NDg5NTk0ODg2MDgxNzQ0OQ" padded = token_prefix + "=" * (4 - len(token_prefix) % 4) user_id = base64.b64decode(padded).decode() # → "1484895948860817449"
所有 Bot User ID 汇总(用于 users allowlist)
all_bot_ids = [
"964122056163721286", # owner (你)
"1475235860013125826", # ds-commander
"1475236767782146070", # ds-strategist
"1475237428624101518", # ds-builder
"1475237948936159314", # ds-creator
"1475238503729201222", # ds-guardian
"1479925669852086353", # invest-analyst
"1484895948860817449", # invest-bull (新)
"1484896838506254427", # invest-bear (新)
"1484897321526362316", # invest-hawk (新)
"1484897784024006826", # invest-dove (新)
]
三、openclaw.json 配置变更
3.1 备份原始配置
ssh yiukai@192.168.68.108
cp ~/.openclaw/openclaw.json ~/.openclaw/openclaw.json.bak.$(date +%Y%m%d%H%M%S)
3.2 新增 4 个 Agent(agents.list)
在 agents.list 数组末尾追加:
{
"id": "invest-bull",
"name": "invest-bull",
"workspace": "/home/yiukai/.openclaw/workspace-invest-bull",
"agentDir": "/home/yiukai/.openclaw/agents/invest-bull/agent",
"model": "kimi-coding/k2p5",
"identity": { "name": "Bull", "emoji": "🐂" }
},
{
"id": "invest-bear",
"name": "invest-bear",
"workspace": "/home/yiukai/.openclaw/workspace-invest-bear",
"agentDir": "/home/yiukai/.openclaw/agents/invest-bear/agent",
"model": "kimi-coding/k2p5",
"identity": { "name": "Bear", "emoji": "🐻" }
},
{
"id": "invest-hawk",
"name": "invest-hawk",
"workspace": "/home/yiukai/.openclaw/workspace-invest-hawk",
"agentDir": "/home/yiukai/.openclaw/agents/invest-hawk/agent",
"model": "kimi-coding/k2p5",
"identity": { "name": "Hawk", "emoji": "🦅" }
},
{
"id": "invest-dove",
"name": "invest-dove",
"workspace": "/home/yiukai/.openclaw/workspace-invest-dove",
"agentDir": "/home/yiukai/.openclaw/agents/invest-dove/agent",
"model": "kimi-coding/k2p5",
"identity": { "name": "Dove", "emoji": "🕊️" }
}
变更后 Agent 总数:11 个(7 个原有 + 4 个新增)
3.3 更新 Agent 间通信(agentToAgent)
将 invest-* 系列全部加入 allow 列表:
"tools": {
"agentToAgent": {
"enabled": true,
"allow": [
"ds-commander", "ds-strategist", "ds-builder", "ds-creator", "ds-guardian",
"invest-analyst", "invest-bull", "invest-bear", "invest-hawk", "invest-dove"
]
}
}
重要变更:invest-analyst 之前不在 A2A allow 列表中(独立运作),现在加入了,使其能通过
sessions_send触发辩论 agent。
3.4 添加 Ping-Pong 轮次配置
新增 session 顶级配置:
"session": {
"agentToAgent": {
"maxPingPongTurns": 5
}
}
- Bull/Bear 辩论最多 5 轮 ping-pong
- 任何 agent 回复
REPLY_SKIP可提前终止
3.5 新增 4 个 Discord Bot 账户
在 channels.discord.accounts 中追加(每个结构相同,仅 token 不同):
"invest-bull": {
"name": "Bull",
"enabled": true,
"token": "MTQ4NDg5NTk0ODg2MDgxNzQ0OQ.Gm081-...",
"groupPolicy": "open",
"streaming": "off",
"guilds": {
"1479926167141355560": {
"requireMention": true,
"users": ["964122056163721286", "1475235860013125826", ...全部 11 个 ID],
"channels": {
"1479926167736942774": { "allow": true }
}
}
}
}
关键配置说明:
| 字段 | 值 | 原因 |
|---|---|---|
requireMention: true |
所有 4 个新 bot | 防止自动回复用户消息,只在被 A2A 调用时工作 |
users |
11 个 ID | 所有 bot 互相可见,owner 可见 |
guilds |
Stock Guild only | 只在投资频道活动 |
streaming: "off" |
关闭 | 与现有配置保持一致 |
3.6 更新 invest-analyst 的 users 列表
将 4 个新 bot ID 追加到 invest-analyst 的 guilds.users 数组,确保 invest-analyst 能在 Stock Guild 中看到新 bot 的消息。
3.7 新增 4 个 Binding
在 bindings 数组末尾追加:
{ "agentId": "invest-bull", "match": { "channel": "discord", "accountId": "invest-bull" } },
{ "agentId": "invest-bear", "match": { "channel": "discord", "accountId": "invest-bear" } },
{ "agentId": "invest-hawk", "match": { "channel": "discord", "accountId": "invest-hawk" } },
{ "agentId": "invest-dove", "match": { "channel": "discord", "accountId": "invest-dove" } }
变更后 Binding 总数:10 个
四、Workspace 目录创建
在远程服务器上创建 4 个 agent 的 workspace 和 agent 目录:
ssh yiukai@192.168.68.108
for agent in invest-bull invest-bear invest-hawk invest-dove; do
mkdir -p ~/.openclaw/workspace-$agent/skills
mkdir -p ~/.openclaw/workspace-$agent/memory
mkdir -p ~/.openclaw/agents/$agent/agent
done
最终目录结构
~/.openclaw/
├── openclaw.json # 主配置(已更新)
├── openclaw.json.bak.20260321XXXXXX # 配置备份
│
├── workspace-invest-analyst/ # 编排者 workspace
│ └── skills/
│ ├── invest-api/SKILL.md # 原有 API skill
│ ├── trade-analyze/SKILL.md # 新 — 主编排 skill
│ ├── market-analysis/SKILL.md # 新 — 技术分析
│ ├── fundamental-analysis/SKILL.md # 新 — 基本面分析
│ ├── sentiment-analysis/SKILL.md # 新 — 情感分析
│ └── macro-analysis/SKILL.md # 新 — 宏观分析
│
├── workspace-invest-bull/ # 多方研究员 workspace
│ ├── SOUL.md # 人格:坚定的价值发现者
│ ├── AGENTS.md # 操作指令 + 回声防护
│ ├── skills/
│ └── memory/
│
├── workspace-invest-bear/ # 空方研究员 workspace
│ ├── SOUL.md # 人格:谨慎的风险猎手
│ ├── AGENTS.md # 操作指令 + 回声防护
│ ├── skills/
│ └── memory/
│
├── workspace-invest-hawk/ # 激进风控 workspace
│ ├── SOUL.md # 人格:积极进取的交易者
│ ├── AGENTS.md # 操作指令 + 回声防护
│ ├── skills/
│ └── memory/
│
├── workspace-invest-dove/ # 保守风控 workspace
│ ├── SOUL.md # 人格:稳健的资产守护者
│ ├── AGENTS.md # 操作指令 + 回声防护
│ ├── skills/
│ └── memory/
│
└── agents/
├── invest-bull/agent/
├── invest-bear/agent/
├── invest-hawk/agent/
└── invest-dove/agent/
五、Skill 文件部署
部署来源
所有 skill 文件在本地 openbb-invest-api 仓库的 openclaw-skills/ 目录中开发和版本管理。
部署命令
REMOTE="yiukai@192.168.68.108"
CLAW="/home/yiukai/.openclaw"
SKILLS="/Users/yiukai/Documents/git/openbb-invest-api/openclaw-skills"
# 分析 Skills → invest-analyst workspace
for skill in trade-analyze market-analysis fundamental-analysis sentiment-analysis macro-analysis; do
ssh $REMOTE "mkdir -p $CLAW/workspace-invest-analyst/skills/$skill"
scp "$SKILLS/$skill/SKILL.md" "$REMOTE:$CLAW/workspace-invest-analyst/skills/$skill/SKILL.md"
done
# SOUL.md + AGENTS.md → 辩论 agent workspace
for agent in invest-bull invest-bear invest-hawk invest-dove; do
scp "$SKILLS/souls/$agent.md" "$REMOTE:$CLAW/workspace-$agent/SOUL.md"
scp "$SKILLS/agents/$agent.md" "$REMOTE:$CLAW/workspace-$agent/AGENTS.md"
done
部署的文件清单
| 文件 | 部署到 | 用途 |
|---|---|---|
trade-analyze/SKILL.md |
invest-analyst/skills/ | 主编排:4 分析 → 辩论 → 风控 → 裁决 |
market-analysis/SKILL.md |
invest-analyst/skills/ | 技术分析(RSI, MACD, Ichimoku, ATR, OBV) |
fundamental-analysis/SKILL.md |
invest-analyst/skills/ | 基本面(PE, ROE, 财报, 分析师目标价) |
sentiment-analysis/SKILL.md |
invest-analyst/skills/ | 情感(复合评分, 内幕交易, 新闻情感) |
macro-analysis/SKILL.md |
invest-analyst/skills/ | 宏观(利率, CPI, 收益率曲线, 做空压力) |
souls/invest-bull.md |
workspace-invest-bull/SOUL.md | 多方人格定义 |
souls/invest-bear.md |
workspace-invest-bear/SOUL.md | 空方人格定义 |
souls/invest-hawk.md |
workspace-invest-hawk/SOUL.md | 激进风控人格定义 |
souls/invest-dove.md |
workspace-invest-dove/SOUL.md | 保守风控人格定义 |
agents/invest-bull.md |
workspace-invest-bull/AGENTS.md | 操作指令 + REPLY_SKIP 回声防护 |
agents/invest-bear.md |
workspace-invest-bear/AGENTS.md | 操作指令 + REPLY_SKIP 回声防护 |
agents/invest-hawk.md |
workspace-invest-hawk/AGENTS.md | 操作指令 + REPLY_SKIP 回声防护 |
agents/invest-dove.md |
workspace-invest-dove/AGENTS.md | 操作指令 + REPLY_SKIP 回声防护 |
快捷部署脚本
仓库中包含 openclaw-skills/deploy.sh,后续更新 skill 只需运行:
cd /Users/yiukai/Documents/git/openbb-invest-api
./openclaw-skills/deploy.sh
六、Gateway 重启与验证
重启命令
ssh yiukai@192.168.68.108 'export NVM_DIR="$HOME/.nvm"; [ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh"; openclaw gateway restart'
注意:SSH 非交互式 shell 不会加载 nvm,需要手动 source。
重启输出
- Config warning:
google-antigravity-auth插件已移除(无影响) - Doctor: 自动迁移了 Discord single-account 配置
- Doctor warning: Telegram groupPolicy 为 allowlist 但无 allowFrom(已知,非本次变更)
- 重启成功:
Restarted systemd service: openclaw-gateway.service
状态验证
ssh yiukai@192.168.68.108 'export NVM_DIR="$HOME/.nvm"; [ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh"; openclaw status'
验证结果:
| 项目 | 期望 | 实际 |
|---|---|---|
| Agents 数量 | 11 | ✅ 11 |
| Discord accounts | 10/10 | ✅ 10/10 |
| Gateway 状态 | running | ✅ active (pid 622452) |
| 新 bot 心跳 | disabled | ✅ disabled(辩论 bot 不需要主动心跳) |
七、配置更新脚本(Python)
用于批量更新 openclaw.json 的 Python 脚本(在远程通过 SSH 执行):
import json
with open("/home/yiukai/.openclaw/openclaw.json", "r") as f:
config = json.load(f)
# 1. 添加新 agent
new_agents = [
{"id": "invest-bull", "name": "invest-bull",
"workspace": "/home/yiukai/.openclaw/workspace-invest-bull",
"agentDir": "/home/yiukai/.openclaw/agents/invest-bull/agent",
"model": "kimi-coding/k2p5",
"identity": {"name": "Bull", "emoji": "🐂"}},
# ... invest-bear, invest-hawk, invest-dove 同理
]
existing_ids = {a["id"] for a in config["agents"]["list"]}
for agent in new_agents:
if agent["id"] not in existing_ids:
config["agents"]["list"].append(agent)
# 2. 更新 A2A allow
config["tools"]["agentToAgent"]["allow"] = [
"ds-commander", "ds-strategist", "ds-builder", "ds-creator", "ds-guardian",
"invest-analyst", "invest-bull", "invest-bear", "invest-hawk", "invest-dove"
]
# 3. 设置 ping-pong 轮次
config.setdefault("session", {}).setdefault("agentToAgent", {})["maxPingPongTurns"] = 5
# 4. 添加 Discord bot 账户(每个包含 token、guild、channel 配置)
# 5. 更新 invest-analyst 的 users 列表
# 6. 添加 bindings
with open("/home/yiukai/.openclaw/openclaw.json", "w") as f:
json.dump(config, f, indent=2, ensure_ascii=False)
完整脚本通过
ssh yiukai@192.168.68.108 'python3 << "PYEOF" ... PYEOF'远程执行。 脚本包含幂等检查(检查 existing_ids),重复运行不会产生重复条目。
八、Gateway WebSocket 修复(关键补丁)
问题
所有内部 RPC(sessions_send/spawn、gateway call、status --deep)超时,原因:
bind: "lan"后127.0.0.1:18789连不通- v2026.3.13 的 WebSocket handshake timeout 只有 3 秒
修复 1:Systemd 环境变量
在 ~/.config/systemd/user/openclaw-gateway.service 的 [Service] 中添加:
Environment=OPENCLAW_GATEWAY_URL=ws://192.168.68.108:18789
Environment=OPENCLAW_ALLOW_INSECURE_PRIVATE_WS=1
systemctl --user daemon-reload
修复 2:Patch handshake timeout
文件:~/.nvm/versions/node/v24.13.1/lib/node_modules/openclaw/dist/gateway-cli-CuZs0RlJ.js(和 Ol-vpIk7.js)
// 第 7588 行:3e3 → 10e3
const DEFAULT_HANDSHAKE_TIMEOUT_MS = 10e3;
修复 3:Patch scope grant
同一文件,第 22605 行:
// 原始
if (!device && (!isControlUi || decision.kind !== "allow")) clearUnboundScopes();
// 改为
if (!device && (!isControlUi || decision.kind !== "allow")) { clearUnboundScopes(); } else if (!device && decision.kind === "allow") { scopes = ["operator.read"]; connectParams.scopes = scopes; }
来源:PR #47388、PR #48950 注意:
npm update openclaw后 patch 会被覆盖,需要重新打
修复 4:辩论 Agent Discord 配置
辩论 agent 的 Discord 已完全禁用(不在频道输出):
"invest-bull": { "enabled": false, "groupPolicy": "disabled" }
invest-analyst 通过 sessions_spawn(非 sessions_send)在后台调用辩论 agent。
修复 5:subagents allowAgents
invest-analyst 需要允许 spawn 辩论 agent:
{
"id": "invest-analyst",
"subagents": {
"allowAgents": ["invest-bull", "invest-bear", "invest-hawk", "invest-dove"]
}
}
九、其他已知问题
| 问题 | 影响 | 处理 |
|---|---|---|
| Telegram groupPolicy allowlist 无 allowFrom | 群组消息被丢弃 | 非本次范围 |
google-antigravity-auth 插件 |
已删除 | ✅ |
| openbb-invest-api 偶尔 503 | K8s pod 可能重启 | 检查 pod 状态 |
十、测试步骤
1. 快速分析
帮我看看 AAPL 的行情
期望:invest-analyst 直接用 invest-api skill 回答。
2. 深度辩论分析
/trade-analyze AMZN
期望:
- 收集数据(curl API)
sessions_spawn→ invest-bull(Bull Case)sessions_spawn→ invest-bear(Bear Case)sessions_spawn→ invest-bull(Final Rebuttal)sessions_spawn→ invest-hawk(激进风控)sessions_spawn→ invest-dove(保守风控)- invest-analyst 输出最终 BUY/SELL/HOLD 裁决
3. 验证辩论 agent 参与
for a in invest-bull invest-bear invest-hawk invest-dove; do
echo "$a: $(ls ~/.openclaw/agents/$a/sessions/*.jsonl 2>/dev/null | wc -l) sessions"
done