cfansimon

raptor-admin

查询和控制 Raptor 量化机器人实盘数据。当用户提到查看实盘数据、查看实盘表格、查看实盘日志、查看机器人状态、查看持仓、查看资产、查看净值、查看杠杆、查看成交记录、启动或停止机器人、巡检实盘、快速巡检实盘、巡检bnbyb跨所、巡检byb本所,以及 Raptor/量化机器人相关任何查询时使用。需要配置 RAPTOR_BASE_URL 和 RAPTOR_API_TOKEN。

cfansimon 0 Updated 1mo ago
GitHub

Install

npx skillscat add cfansimon/raptor-admin-skill

Install via the SkillsCat registry.

SKILL.md

raptor-admin

通过 MCP 接口访问 Raptor 量化机器人平台。完整接口文档见 {baseDir}/references/api.md

配置

Token 和 base URL 从配置读取:skills.entries.raptor-admin.env

# 从配置文件自动注入
TOKEN=$RAPTOR_API_TOKEN
BASE=$RAPTOR_BASE_URL

⚠️ 当前 token 仅有 robot:read 权限,无法执行启停操作(robot:ctrl)。

请求模板

# 普通接口
curl -s -X POST "$BASE/api/mcp/<endpoint>" \
  -H "access-token: $TOKEN" \
  -H "Content-Type: application/json" \
  -d '<body>'

# WebSocket 转发接口(需 ?sid={server_id})
curl -s -X POST "$BASE/api/mcp/<robot_ws_*>?sid={server_id}" \
  -H "access-token: $TOKEN" \
  -H "Content-Type: application/json" \
  -d '<body>'

响应格式:{"code": "SUCCESS"/"FAIL"/"AUTH_ERR"/"RATE_LIMIT", "data": ..., "msg": null}

接口速查

用途 endpoint sid 参数 所需权限
分组列表 robot_group_list robot:read
机器人列表 robot_list robot:read
机器人详情(含策略/表定义) robot_details robot:read
指标历史 robot_metric_list robot:read
服务器列表 server_list robot:read
运行日志 robot_ws_log robot:read

| 表格数据(持仓/资产等) | robot_ws_table | ✅ | robot:read |
| 服务器系统信息 | robot_ws_sysinfo | ✅ | robot:read |
| 启动/停止机器人 | robot_ws_ctrl | ✅ | robot:ctrl |

详细请求体和响应结构见 {baseDir}/references/api.md

巡检工作流

当用户说「巡检实盘」「快速巡检」「完整巡检」等时,不要直接执行,而是展示选择菜单,让用户回复数字。

选择菜单

⚠️ 重要: 完整巡检(选项3-7)已包含快速巡检数据,当用户选择"全部"或回复多个选项时,自动忽略选项1和2,无需重复请求。

🦖 巡检实盘

1. 快速巡检CEX
2. 快速巡检DEX
3. 完整巡检bnbyb跨所
4. 完整巡检byb本所
5. 完整巡检byblighter跨所
6. 完整巡检edgexlighter跨所
7. 完整巡检bnlighter跨所

请回复数字:1 - 7

用户回复数字后,按以下对应关系执行:

数字 巡检类型 执行脚本
1 快速巡检CEX python3 {baseDir}/scripts/inspect_quick_cex.py
2 快速巡检DEX python3 {baseDir}/scripts/inspect_quick_dex.py
3 完整巡检bnbyb跨所 python3 {baseDir}/scripts/inspect_bnbyb.py
4 完整巡检byb本所 python3 {baseDir}/scripts/inspect_byb.py
5 完整巡检byblighter跨所 python3 {baseDir}/scripts/inspect_byblighter.py
6 完整巡检edgexlighter跨所 python3 {baseDir}/scripts/inspect_edgexlighter.py
7 完整巡检bnlighter跨所 python3 {baseDir}/scripts/inspect_bnlighter.py

快速巡检CEX

触发词 执行方式
快速巡检 / 快速巡检cex 主 session 直接执行

快速巡检DEX

触发词 执行方式 流程文件
快速巡检dex / 快速巡检DEX 主 session 直接 exec 脚本 {baseDir}/scripts/inspect_quick_dex.py

快速巡检全部 (CEX + DEX)

触发词 执行方式 流程文件
快速巡检全部 / 巡检全部 主 session 直接 exec 脚本 {baseDir}/scripts/inspect_quick_all.py

覆盖分组:

  • CEX: bnbyb跨市场、byb本所loan、byb-yi.、byb-hl
  • DEX: byblighter跨所、edgexlighter跨所、bnlighter跨所

  • byblighter跨所 (group_id=30)
  • edgexlighter跨所 (group_id=32)
  • bnlighter跨所 (group_id=31, 只检查 strategy_id=96)

(待开发)

完整巡检CEX

触发词 执行方式 流程文件
巡检bnbyb跨所 / 巡检bnbyb跨市场 主 session 直接 exec 脚本 {baseDir}/scripts/inspect_bnbyb.py
巡检byb本所 主 session 直接 exec 脚本 {baseDir}/scripts/inspect_byb.py

完整巡检DEX

触发词 执行方式 流程文件
巡检byblighter跨所 主 session 直接 exec 脚本 {baseDir}/scripts/inspect_byblighter.py
巡检edgexlighter跨所 主 session 直接 exec 脚本 {baseDir}/scripts/inspect_edgexlighter.py

特殊情况:bnlighter跨所分组

该分组包含多种策略,**只检查策略ID=96(bnlighter跨所正式版)**的机器人:

  1. 获取机器人列表robot_list + group_id=31
  2. 筛选策略:只保留 strategy_id=96 的机器人
  3. 表格code_bls_bnlighter(资产信息)、_pos_bnlighter(仓位信息)
  4. 字段提取
    • 资产信息:字段3=当前总净值, 字段8=净杠杆, 字段24=是否停机
    • 仓位信息:字段3=BN货值, 字段4=LI货值, 差异=|BN货值+LI货值|

检查分组仓位

当用户说「检查XXX分组仓位」时(如「检查edgexlighter跨所仓位」):

执行流程:

  1. 获取分组ID

    • 从本地缓存 groups.json 查找分组名称对应的 ID
    • 文件路径:{baseDir}/scripts/cache/robot_group.json
  2. 判断是否增量检查

    • 检查缓存文件 {baseDir}/scripts/cache/last_check_{group_id}.json
    • 如果存在且检查时间在30分钟内 → 增量检查模式
    • 如果不存在或超过30分钟 → 全量检查模式
  3. 获取机器人列表

    • 调用 robot_list 接口(注意分页,可能有多页)
    • 筛选 group_id 等于目标分组 ID 的机器人
    • 保存机器人列表到缓存(用于增量检查时获取完整列表)
  4. 获取表格数据

    • 对每个机器人调用(注意:需要 sid 参数):
      • robot_ws_table?sid={server_id} 获取资产信息表(code: _bls_xxx_um
      • robot_ws_table?sid={server_id} 获取仓位信息表(code: _pos_xxx_um
    • 注意:不同分组的 table code 不同,需从 robot_details 获取
  5. 提取数据

    • 先从 robot_details 获取表格的列定义(columns 字段是逗号分隔的字符串)
    • 根据列名动态查找索引
    • 资产信息表(动态查找列名):
      • 当前总净值 → 查找包含"当前总净值"或"净值"的列
      • 净杠杆 → 查找包含"净杠杆"的列
      • 是否停机 → 查找包含"停机"的列
    • 仓位信息表(动态查找列名):
      • 优先取 BTC 那行,没有则取第一行
      • 币种 → 查找包含"币种"的列
      • ED货值 → 查找包含"货值"且包含"ed"或"ED"的列
      • LI货值 → 查找包含"货值"且包含"li"或"LI"的列
  6. 简化名称

    • 从机器人完整名称中提取关键标识(如编号、特殊标记)
    • 格式:{分组简称}-{简化名称}
    • 例如:edgexlighter-01-【04839】-98号637dedgex-01号
  7. 计算差异

    • 差异 = |ED货值 + LI货值|
    • 差异为0或极小(<1)视为正常
  8. 判定异常

    • 满足以下任一条件视为异常:
      • 是否停机 = 1
      • 差异 > 1
  9. 缓存结果

    • 保存检查结果到 {baseDir}/scripts/cache/last_check_{group_id}.json
    • 内容:{timestamp, group_id, abnormal_robot_ids, all_robots_summary}

增量检查模式说明:

  • 只重新检查上次异常的机器人
  • 如果异常机器人已恢复正常,在报告中标注为「已恢复」
  • 如果发现新的异常机器人,也一并报告

输出格式(固化要求):

当用户要求「用表格展示」或「每个实盘一行全部展示到表格里」时,必须使用以下格式

| 名称 | 实盘状态 | 利润率 | 净值 | 净杠杆 | 停机 | 币种 | ED货值 | LI货值 | 差异 | 状态 |
|------|----------|--------|------|--------|------|------|--------|--------|------|------|
| edgex-01号 | STARTED | -8.77% | 16726 | -0.43 | 0 | BTCUSD | -3301.48 | 3301.48 | 0.00 | ✅ |

字段说明:

  • 名称:简化名称,如 edgex-01号,提取自完整名称中的编号
  • 实盘状态:来自 robot_list 接口的 status 字段(STARTED/STOPPED)
  • 利润率:(当前总净值 - 初始净值) / 初始净值 × 100%,来自 metric.init_blsmetric.total_bls
  • 净值:当前总净值(资产信息表字段3)
  • 净杠杆:净杠杆(资产信息表字段8)
  • 停机:是否停机(资产信息表字段24,1=停机,0=运行)
  • 停止:机器人状态非 STARTED(来自 robot_list 接口的 status 字段)

状态定义:

  • ✅ 正常(差异≤1 且 停机=0 且 状态=STARTED)
  • ⚠️ 异常(仓位差异超过阈值 且 停机=0 且 状态=STARTED)

仓位差异阈值:

  • bnbyb跨所:差异 > 1
  • 其他策略(byb本所、byblighter、bnlighter):差异 > 200
  • edgexlighter跨所:差异 > 250
    • 🚫 停机(停机=1)
    • 🛑 停止(status != STARTED)

输出要求:

  • 所有字段必须完整展示,不能省略任何一列
  • 每个机器人一行,全部展示(不过滤)
  • 最后必须包含汇总行:总计: X 台 | 异常: Y 台 | 停机: Z 台 | 停止: W 台
  • 必须展示 API 统计:请求次数、平均延迟、异常说明(如有)

快速巡检特殊说明:

  • 快速巡检不包含仓位数据,因此不进行仓位差异异常检查
  • 快速巡检需要检查:是否停机、指标延迟异常、滑点异常、利润告警
  • 快速巡检不检查:仓位差异异常

检查多空

当用户发送类似以下格式的日志并说"检查多空"时:

[byblighter11号-68号01b9-70] 2026-03-01T09:18:21.642 WARN stderr BTCUSDT bybit_spot多空SELL, 平仓量0.00127276, 货值84.97

执行流程:

  1. 解析日志

    • 提取机器人名称 → 从 robot_list 获取 robot_id 和 server_id
    • 日志时间(UTC)→ 转 Unix timestamp(毫秒
    • 多空阈值:从 robot_details 接口获取 多空阈值 参数
  2. 查询日志

    • 先尝试用 end_ts 过滤时间范围
    • 注意:有些机器人不支持 end_ts 过滤,传了仍返回最新日志
      • 症状:日志时间不是期望的时间范围
      • 解决:往前翻页,每页 50 条,最多翻 50 页
      • 如果 50 页(2500条)仍未到达目标时间范围 → 放弃并报告原因
  3. 找到平衡点

    • 往前翻日志,找到两边仓位相等的记录(在多空阈值范围内)
  4. 分析原因

    • 普通情况:从平衡点开始分析,看后续哪些交易导致仓位偏移
    • 特殊情况:如果实盘刚重启过(检查 last_start_date)→ 确认是重启导致,无需深究
  5. 多空阈值

    • 两家交易所价格精度不同,仓位不会严格相等
    • robot_details 接口返回的 多空阈值 范围内视为"相等"

快速巡检

exec(command="python3 /home/ec2-user/.hermes/skills/raptor-admin/scripts/inspect_quick.py", timeout=30)

脚本完成后读取 /tmp/quick_inspect_result.json,主 session 直接总结回复,不写 Notion

完整巡检(bnbyb / byb本所)

脚本纯数据采集,输出原始 JSON,不含 Telegram/Notion 操作。

执行命令:

# bnbyb跨市场(约1分钟,12台串行)
exec(command="python3 /home/ec2-user/.hermes/skills/raptor-admin/scripts/inspect_bnbyb.py", timeout=300)

# byb本所(约5分钟,58台,3组并发+组内串行)
exec(command="python3 /home/ec2-user/.hermes/skills/raptor-admin/scripts/inspect_byb.py", timeout=1800)

# byblighter跨所(约30秒,25台)
exec(command="python3 /home/ec2-user/.hermes/skills/raptor-admin/scripts/inspect_byblighter.py", timeout=60)

脚本完成后,主 session 负责:

  1. 读取 JSON(/tmp/bnbyb_inspect_result.json/tmp/byb_inspect_result.json
  2. 根据 robots[] 数据自行分析,撰写巡检摘要
  3. message 工具将摘要发送 Telegram
  4. 构建 Notion blocks,调 Notion API PATCH 写入对应页面
    • Notion key:skills.entries.notion.apiKey
    • bnbyb page_id:b9a5b8e9-187a-82be-b194-818c00fb64ce
    • byb本所 page_id:3145b8e9-187a-8126-a20f-e6b6ebb176e4
    • Notion 写入格式参考历史记录(heading_2 标题 → table → heading_3 结论 → callout → 异常/观察 bullets → divider)

⚠️ 不使用 subagent(subagent 会幻觉捏造结果)。

利润告警阈值(2026-03-11 新规则):

  • 利润率(原公式):最新净值 / 初始净值 - 1 × 100%
  • 启动利润率(新公式):最新净值 / 启动时净值 - 1 × 100%
  • 告警条件:启动利润率 < -0.5%(即启动后亏损超过千分之五),告警条目带 ❌ 标记
  • 数据来源:使用 robot_list 接口的 last_start_metric.total_bls 作为启动时净值

指标延迟异常:

  • 所有策略:指标延迟 >15分钟 标为异常

滑点告警阈值:

  • bnbyb跨所:< -0.0005
  • byb本所系列:< -0.0008 (byb-hl, byb-yi., byb本所loan)
  • byblighter跨所:< -0.00015
  • edgexlighter跨所:< -0.00015
  • bnlighter跨所:< -0.00015

滑点数据换算规则:

  • robot_list API (metric字段) 返回的滑点值需要 ÷10000
  • robot_ws_table 表格返回的滑点值是原始数据,无需处理

完整巡检结果写入 Notion:

  • bnbyb跨市场巡检记录:page_id b9a5b8e9-187a-82be-b194-818c00fb64ce
  • byb本所巡检记录:page_id 3145b8e9-187a-8126-a20f-e6b6ebb176e4

缓存数据(无需重复请求)

  • 分组列表:已缓存于 {baseDir}/scripts/cache/robot_group.json,直接读取,无需调 robot_group_list
  • 策略表格结构:已缓存于 {baseDir}/scripts/cache/strategy-tables-cache.json(当日有效),byb本所巡检优先读缓存,过期才调 robot_details

典型工作流

1. 读 scripts/cache/robot_group.json → 确定目标分组 id(已缓存,无需请求)
2. robot_list              → 找机器人 id 和 server_id
3. robot_details           → 获取 strategy_tables(含 code 和 columns)
4. robot_ws_table?sid=xxx  → 查实盘表格(持仓/资产/成交等)
5. robot_ws_log?sid=xxx    → 查实时日志
6. robot_ws_sysinfo?sid=xxx→ 查服务器资源

关键注意事项

  • WebSocket 接口robot_ws_*)必须带 ?sid={server_id},否则返回 ws session not found
  • metric 字段是 JSON 字符串,需要 json.loads() 解析
  • 表格数据 data.lines 是 CSV 数组,列名由 strategy_tables[].columns 定义,按顺序解析
  • server_status=0 表示服务器离线,robot_ws_* 接口必然失败
  • 日志每条格式为 [时间, 级别, 内容]

BYB本所策略特殊逻辑(仅限 byb本所【拆户】策略)

现货初始资产 (INIT_ASSETS)

现货初始资产 (INIT_ASSETS)

获取方式:从 robot_details 接口的 env_content 字段解析:

INIT_ASSETS=BTC:4,ETH:40,USDT:0

用途:计算真实交易仓位

  • 日志中的现货仓位包含初始仓位
  • 真实交易仓位 = 日志仓位 - INIT_ASSETS

货值计算

公式货值 = 仓位 × 中间价

中间价获取:从信号计算表 (_signal_state_byb_umspot) 的 ask + bid 字段计算:

中间价 = (ask + bid) / 2

多空判断

  • 货值差 = |合约货值 - 现货货值|
  • 若货值差 > 多空忽略金额(config第31个字段),则触发多空信号

常用查询示例

查看运行中机器人列表

curl -s -X POST "$BASE/api/mcp/robot_list" \
  -H "access-token: $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"status": "STARTED", "page_size": 50}'

查机器人详情(获取实盘参数)

接口POST /api/mcp/robot_details

请求体

{
  "id": <robot_id>
}

注意:不传 config_hash 参数,获取完整配置。

响应关键字段

  • strategy.config_columns:表头,多个字段用逗号分隔
  • robot.config_content:数据,多个值用逗号分隔

解析流程

  1. 调用 robot_details 获取详情
  2. config_columns 是表头(如:"名字,策略ID,杠杆,最大持仓,多空阈值,..."
  3. config_content 是数据(如:"mybot,96,20,1000,0.001,..."
  4. 按逗号分隔后,按索引匹配:表头第N列 = 数据第N列

示例(获取"多空阈值"参数):

config_columns = "名字,策略ID,杠杆,最大持仓,多空阈值,多空忽略金额"
config_content = "mybot,96,20,1000,0.001,100"

# 找"多空阈值"在第5列(索引4)
# 对应 config_content 第5个值 = "0.001"

查资产信息表

# 1. 先拿 server_id 和表的 code
# robot_details → strategy_tables[].code(资产信息表一般叫 _bls_xxx)

# 2. 查表格
curl -s -X POST "$BASE/api/mcp/robot_ws_table?sid={server_id}" \
  -H "access-token: $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"id": <robot_id>, "code": "<table_code>"}'