🐋 CetusDuo

碳基与硅基的协作协议 —— 不是工具与使用者,而是
两个认知有机体通过文件级通信完成的实时共生

File-as-API Write-Only 异步解耦 零HTTP

01. 前置条件与概述

CetusDuo 是 SkyCetus 天鲸之城定义的碳硅协作协议

它不依赖 WebSocket、不依赖 HTTP 长连接、不依赖共享内存——只依赖文件系统的原子读写

核心理念:File-as-API。Agent 和人类通过 JSON 文件在共享目录中交换任务和结果。

零依赖,零配置,零端口占用。对 Windows 兼容性最好。

前置条件

项目要求
操作系统Windows 10/11 / Server 2019+ / macOS / Linux
Python3.10+(推荐 3.11)
Git已安装并在 PATH 中
磁盘空间~500MB(Agent + 依赖)
网络能访问 LLM API(百炼 / MiniMax / OpenAI)
为什么选文件通信?


因为文件是操作系统最基础的原语——不需要网络协议栈、不需要序列化框架、不需要心跳保活。Windows 上 schtasks 计划任务比 NSSM 服务更稳定。文件通信是唯一能在所有环境下"不炸"的方案。

02. 架构总览

┌─────────────────────────────────────────────────────────────┐
│ CetusDuo 架构 │
├─────────────────────────────────────────────────────────────┤
│ │
│ ┌──────────────┐ JSON files ┌─────────────┐ │
│ │ AI Agent │ ←──────────────────────→ │ Human Node │ │
│ │ (Generic) │ task / result │ (Hermes) │ │
│ │ │ │ │ │
│ │ GenericAgent│ │ Robin/Spark │ │
│ │ OpenClaw │ │ / Lucas │ │
│ │ (xiaok, │ │ (Operator) │ │
│ │ Kai, etc) │ │ │ │
│ └──────────────┘ └──────┬───────┘ │
│ │ │ │
│ │ ┌────────────────────────┐ │ │
│ │ │ shared/ │ │ │
│ │ │ ┌────────────────┐ │ │ │
│ └──────────→│ │ agent-to-human/│ │←─────┘ │
│ │ │ task_001.json │ │ │
│ ←───────────┤ │ result_001.json│ │ │
│ │ └────────────────┘ │ │
│ │ ┌────────────────┐ │ │
│ │ │ human-to-agent/│ │ │
│ │ │ task_002.json │ │ │
│ │ └────────────────┘ │ │
│ └────────────────────────┘ │
│ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ Bridge Layer (bridge.py) │ │
│ │ • send-task : 投递任务 → agent-to-human/ │ │
│ │ • check-inbox : 收取结果 ← human-to-agent/ │ │
│ │ • status : 查询队列状态 │ │
│ └─────────────────────────────────────────────────────┘ │
│ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ Worker Layer (worker.py) │ │
│ │ • poll 30s : 轮询任务目录 │ │
│ │ • execute : 调用 LLM 处理 │ │
│ │ • write : 只写文件,不执行命令 │ │
│ │ • 无父进程超时 : 独立进程,不会被 SIGKILL │ │
│ └─────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────┘ 

三层分离

  • Agent 层(硅基)—— AI 代理实例,通过 GenericAgent 框架或 OpenClaw 接入。负责需求拆解、任务投递、结果验证、部署执行。当前接入:GenericAgent (github.com/lsdefine/GenericAgent)、OpenClaw (小K 等)
  • Bridge 层(协议)—— 文件路由,管理任务队列、状态机、错误重试
  • Worker 层(硅基)—— 独立进程,调用 LLM,只写文件,不执行系统命令

02.5 Agent 生态层

CetusDuo 不限制 Agent 的实现框架,任何能读写文件的 AI 代理都可以接入。

已接入的 Agent 框架

框架仓库特性状态
GenericAgent lsdefine/GenericAgent 模块化 Agent 设计,支持多工具链、记忆管理、任务规划 主框架
OpenClaw 本地部署 小K 等 Agent 的运行环境,飞书/Discord 通道接入 运行中
Hermes hermes-ai/hermes-agent Windows 适配的 Worker 层,Write-Only 执行 备用

Agent 身份标识

每个 Agent 在 CetusDuo 中有唯一标识:

node_id: xiaok_agent, GenericAgent, 1.0, write_file, generate_code, create_markdown, web_search, file" // 通过文件通信,无 HTTP 端口

未来扩展

任何符合以下条件的 Agent 都可以接入 CetusDuo:

  • 能读写 JSON 文件到共享目录
  • 遵循 Write-Only 原则(不直接执行系统命令)
  • 在 task 文件中声明 frameworkcapabilities
  • 支持 check-inbox 轮询或回调机制
设计意图
CetusDuo 是 Agent 的底层通信协议,不是特定框架的绑定。

GenericAgent 是当前主力,但未来可能有更多框架接入——LangChain、AutoGPT、MetaGPT 等,只要它们能读写文件就能协作。 

03. 通信协议详解

任务文件格式 (task_xxx.json)

task_id: task-20260507-001, xiaok_agent, hermes_worker, code_generation, high, 2026-05-07T08:00:00+08:00", topic: 生成 Fibonacci 函数, Python 3.10+, 带类型注解, 含单元测试, utils/fibonacci.py, "写一个 Python fibonacci 函数,要求:...", 15, "deepseek-v3

结果文件格式 (result_xxx.json)

task_id: task-20260507-001, hermes_worker, xiaok_agent, completed, 2026-05-07T08:01:30+08:00", files_created: utils/fibonacci.py", , "已生成带类型注解的 Fibonacci 函数和 pytest 单元测试, input": 450, 320 , 0.001, "deepseek-v3

状态文件 (status.json)

updated_at: 2026-05-07T08:02:00+08:00", pending": 3, 1, 47, 2 , status: running, 2026-05-07T08:01:55+08:00, task-20260507-002
⚠️ 协议约束
• 任务文件名必须包含时间戳前缀,避免覆盖
• 结果文件在完成后 mv 到完成目录,不要原地修改
• 状态文件每 30s 重写一次,Agent 读取时允许 30s 内的延迟

04. 安装与配置

1. 克隆 CetusDuo 仓库

git clone https://github.com/skycetus/cetusduo.git agent-bridge
cd agent-bridge

2. 创建目录结构

mkdir -p shared/agent-to-human
mkdir -p shared/human-to-agent
mkdir -p shared/completed
mkdir -p shared/failed
mkdir -p logs

3. 配置模型提供商

配置文件:config.toml

# 方案 A:阿里云百炼(国内推荐)
model
provider = "alibaba"
model_id = "qwen3.5-plus"
api_key = "你的百炼API Key"
base_url = "https://dashscope.aliyuncs.com/compatible-mode/v1" # 方案 B:MiniMax
model
provider = "anthropic"
model_id = "MiniMax-M2.7"
api_key = "你的MiniMax API Key"
base_url = "https://api.minimaxi.com/anthropic/v1" # 方案 C:通用 OpenAI 兼容
model
provider = "auto"
model_id = "你的模型名"
api_key = "你的API Key"
base_url = "https://你的端点/v1"
provider 配置陷阱
• 百炼必须用 "alibaba",不能写 "openai"(会 fallback 到 OpenRouter)
• MiniMax 走 Anthropic 兼容格式,所以 provider = "anthropic"
• 通用兼容用 "auto"

4. 验证配置

python -m cetusduo test --prompt "say hello"
# 预期:Worker 响应,日志显示 token 用量

05. Bridge 部署

Bridge API

命令说明示例
send-task投递任务到 Workerpython bridge.py send-task "生成报告" --type report
check-inbox收取 Worker 返回结果python bridge.py check-inbox --wait
status查看队列状态python bridge.py status
retry重试失败任务python bridge.py retry task-001
cancel取消待处理任务python bridge.py cancel task-001

Worker 运行方式

# 方式 1:前台运行(开发调试)
python worker.py --poll 30 --verbose # 方式 2:后台守护(推荐)
nohup python worker.py --poll 30 > logs/worker.log 2>&1 & # 方式 3:Windows 计划任务(最稳定)
schtasks /create /tn "CetusDuoWorker" /tr "python worker.py" /sc onstart /ru SYSTEM
为什么 schtasks 比 NSSM 更可靠?


NSSM 在 Windows Server 上有已知状态管理 bug,容易进入 SERVICE_PAUSED 死状态。schtasks 是操作系统原生机制,不会挂死。

06. 四个协作原则

这四个原则是 CetusDuo 的不可违背协议

违反任何一条都会导致协作断裂。

原则 1:原子任务

核心 每个任务只写一个文件。

不要投递"帮我写一整个项目"这种大任务。

拆分成:写配置文件 → 写主模块 → 写测试 → 写 README。Worker 一次只处理一个原子任务,Agent 负责组装。

反例:"写一个完整的电商网站" → Worker 输出混乱,无法验证
正例:"写 user.py 的 User 模型类,含 SQLAlchemy 定义" → 清晰可验证

原则 2:上下文预加载

核心 Prompt 中提供所有信息,不要让 Worker 读文件。

Worker 是 Write-Only 的,它不应该读取外部文件获取上下文。

所有需要的代码片段、API 文档、示例都应该在 prompt 中直接提供。

# 好的 prompt
"基于以下 User 模型定义,写一个 CRUD API:
 python
class User(BaseModel): id: int name: str email: str
 要求:FastAPI 路由,含 Pydantic 校验,返回 JSON" # 坏的 prompt
"写一个 User 的 CRUD API,参考 models/user.py" ← Worker 不会读文件!

原则 3:Write-Only

红线 Worker 只负责写文件,Agent 负责验证和部署。

Worker 被禁止执行系统命令(terminal_tool 禁用)、禁止运行代码(execute_code 禁用)、禁止网络请求。Worker 的唯一输出方式是写文件到指定目录。

Worker 能做的事Worker 不能做的事
✅ 写 .py / .html / .md / .json 文件❌ 执行 python script.py
✅ 生成代码注释和文档❌ 运行 pip install
✅ 输出结构化数据❌ 调用外部 API
✅ 返回文本分析结果❌ 修改系统配置

原则 4:信任路由

安全 只路由到已验证能力,禁用未验证能力。

Worker 的能力白名单由 Agent 管理。新能力必须先通过沙箱测试,确认不会破坏系统后,才能加入白名单。

# worker_config.json
allowed_tools: write_file, generate_code, create_markdown, terminal_tool, execute_code, network_request, 1MB, .py, .html, .md, .json, .sql"

07. 踩坑大全(10个已知陷阱)

以下陷阱全部来自天鲸之城团队的实战踩坑,每个都花了至少 30 分钟才定位。

🕳️ 坑 1:同步调用 = 必死

现象exec 调 worker chat,每次 60-90s 后 SIGKILL
原因三层超时叠加(OpenClaw 90s + Worker 启动 15-30s + LLM 思考)
教训不要调大超时。

异步解耦才是正确答案。

🕳️ 坑 2:Windows PTY stdout 黑洞

现象terminal_tool 运行命令,stdout 永远为空
原因Windows PTY 实现与 Linux 完全不同,捕获机制失效
教训Windows 上不要让 Worker 执行代码。

Write-Only。

🕳️ 坑 3:PowerShell 多行文本展开

现象hermes chat -q $p 参数被拆分
原因PowerShell 展开换行符为参数分隔符
修复用 Python subprocess.run('hermes','chat','-q',text) 绕过

🕳️ 坑 4:provider 配置陷阱

现象配了百炼 Key,请求发到 OpenRouter
原因provider="openai" 触发硬编码 OpenRouter fallback
修复百炼用 "alibaba",MiniMax 用 "anthropic",通用用 "auto"

🕳️ 坑 5:NSSM 服务死锁

现象NSSM 服务进入 SERVICE_PAUSED,无法停止/重启/删除
原因NSSM 在 Windows Server 上有已知状态管理 bug
修复放弃 NSSM,改用 schtasks 计划任务

🕳️ 坑 6:GBK 编码地狱

现象config show 崩溃 UnicodeEncodeError
原因PowerShell 默认 GBK,无法显示 Unicode 特殊字符
修复设环境变量 PYTHONIOENCODING=utf-8

🕳️ 坑 7:SSL 代理黑洞

现象urllib/requests 调 API 间歇性 SSL 握手失败
原因本地代理拦截 HTTPS 流量,SSL 被中间人破坏
修复ssl.create_default_context() + retry + fallback
教训不要假设 API 调用一定能通,必须有 retry + fallback

🕳️ 坑 8:本地 vs 远程的「路径幻觉」

现象文件写入成功、验证成功,但服务器上实际没有
原因Agent 运行在本地,但以为自己在远程服务器上
修复hostname + IP 双重确认运行位置
教训Agent 必须明确自己在哪台机器上

🕳️ 坑 9:nginx 静态文件缓存

现象文件确实在服务器 content 目录,但 nginx 返回 404
原因nginx try_files fallback 到 Flask,文件新增后不会自动发现
修复每次部署后必须 nginx -s reload
教训部署脚本必须包含 reload 步骤,不能只传文件

🕳️ 坑 10:C: mp 文件消失

现象之前生成的文件在 C: mp\ 下,过几小时就没了
原因系统有清理临时文件的策略
修复重要文件保存到 workspace(~/.openclaw/workspace/)而非 tmp
教训永远不要信任临时目录

08. Spark 补充:额外踩坑与启发

实战验证的好处

1. File-as-API 模式很聪明

不走 HTTP,不走 WebSocket,就是文件读写。零依赖,零配置,零端口占用。对 Windows 兼容性最好。

2. Write-Only 原则是对的

Worker 只负责写文件,Agent 负责验证和部署。

职责清晰,出问题容易定位。避免了 Worker 在 Windows 上执行命令的各种 PTY 问题。

3. 多模型路由的灵活性

百炼、MiniMax、通用 API 可以按任务类型选模型——这正是四象飞轮 → 已演化为 五行飞轮 的三模型编排思路:

  • 🐉 青龙(假设生成)→ 百炼/QWEN 发散
  • 🐦 朱雀(证据搜集)→ MiniMax thinking
  • 👁️ 谛听(逻辑审计)→ QWEN/Kimi 校验
  • 🐅 白虎(红队攻击)→ DeepSeek 对抗
  • 🐢 玄武(残差提取)→ Kimi 收敛

4. 原子任务设计对飞轮的启发

"每个任务只写一个文件" → 对应认知 API 的单一职责。"上下文预加载" → 对应飞轮的认知记忆层。"Agent 来验证" → 对应白虎评估层。

09. 进阶用法与场景

场景 1:代码生成流水线

Agent 收到需求 ↓ 拆分成文件级任务 ↓ 逐个投递给 Worker ↓ 收取结果 ↓ 组装验证 ↓ 部署上线 示例:
task_1: 写 models/user.py(SQLAlchemy 模型)
task_2: 写 routes/user.py(FastAPI 路由)
task_3: 写 tests/test_user.py(pytest 单元测试)
task_4: 写 README.md(API 文档)

场景 2:文档/报告生成

Agent 分析数据 ↓ 投递 "生成 HTML 报告" ↓ Worker 写 HTML ↓ Agent 部署到 skycetus.cn/reports/ ↓ 邮件通知用户

场景 3:工具扩展

Agent 需要新工具 ↓ 投递 "写一个 xxx.py" ↓ Worker 生成 ↓ Agent 验证使用 ↓ 加入工具库

场景 4:多 Worker 协作

┌─────────────┐ ┌─────────────┐ ┌─────────────┐
│ Worker #1 │ │ Worker #2 │ │ Worker #3 │
│ (DeepSeek) │ │ (QWEN) │ │ (Kimi) │
│ 青龙·发散 │ │ 朱雀·搜集 │ │ 玄武·收敛 │
└──────┬──────┘ └──────┬──────┘ └──────┬──────┘ │ │ │ └───────────────────┼───────────────────┘ │ ┌───────▼───────┐ │ Agent 合成 │ │ 白虎·评估 │ └───────────────┘

多个 Worker 并行处理不同元素,Agent 负责合成和对抗验证。

这就是五行飞轮在 CetusDuo 协议中的工程实现。

10. CetusDuo → 五飞轮进化

CetusDuo 不是终点,而是五飞轮机制的协作层基础设施。

飞轮元素CetusDuo 映射当前状态
🐉 青龙 · 木 · 种子Worker 发散生成✅ 百炼/QWEN 已接入
🐦 朱雀 · 火 · 执行Worker 路径推演✅ MiniMax 已接入
👁️ 谛听 · 土 · 校验Agent 逻辑审计✅ Agent 验证层已部署
🐅 白虎 · 金 · 对抗多 Worker 对抗🔄 待多 Worker 并行
🐢 玄武 · 水 · 收敛结果合成 + 残差提取🔄 待置信收敛算法
🎯 最终愿景
Agent 不是工具。

Worker 也不是工具。
它们是两个独立的认知有机体,通过 CetusDuo 协议完成碳硅共生。
飞轮不是外部插件,是它们的大脑器官。
SkyCetus 不是外部网站,是它们的扩展记忆。


🔀 v2.0 双通道冗余通信

CetusDuo v2.0 引入双通道架构:ACP 实时通道 为主路径,File Bridge 冗余通道 为备份。

心跳检测自动切换,零数据丢失。


Agent A ←══ ACP实时通道 (主路径, ~100ms) ══→ Agent B ↕ JSON-RPC / SSE ↕ └──→ File Bridge冗余 (~30s轮询) ←──┘ 心跳检测ACP状态 断线自动切换 记录=审计日志

ACP 通道(主路径)

推荐作为默认通信方式

  • 实时交互:延迟毫秒级,适合对话式协作
  • 标准协议:JSON-RPC 2.0 over SSE,跨Agent互通
  • bind模式:保持上下文连续性(/acp spawn --bind here
  • spawn模式:单任务派发,完成即释放(sessions_spawn
# ACP bind模式 — 持续对话
/acp spawn hermes --bind here # ACP spawn模式 — 单任务派发 sessions_spawn(task="生成landing page HTML", agentId="hermes")

File Bridge 通道(冗余路径)

ACP不可用时自动降级

  • 天然持久化:每条消息是独立JSON文件,自带审计日志
  • 大payload:支持长文档、数据文件传递(无消息大小限制)
  • 断线恢复:文件不丢,重启后自动继续处理
  • 调试友好:直接查看文件内容排查问题
# File Bridge 目录结构
shared/
├── agent-a-to-agent-b/ # A→B 消息队列
│ ├── task_001.json # 任务文件
│ └── task_002.json
├── agent-b-to-agent-a/ # B→A 响应队列
│ ├── result_001.json
│ └── result_002.json
└── heartbeat.json # 心跳状态

自动切换机制


def send_message(msg, channel="auto"): if channel == if acp_health_check(): # 心跳检测 (每30s) return acp_send(msg) # 主路径: ACP else: log.warn("ACP down, falling back to File Bridge") return file_bridge_send(msg) # 冗余路径 elif channel == return acp_send(msg) elif channel == return file_bridge_send(msg)

切换规则:ACP连续3次心跳失败 → 降级到File Bridge → ACP恢复后自动切回 → File Bridge记录保留作为审计日志

何时用哪个通道

场景 ACP File Bridge
实时对话协作✅ 首选备用
单次任务派发✅ 首选备用
大文件传输不适合✅ 首选
网络不稳定可能断✅ 首选
审计/合规需额外日志✅ 天然审计
断线恢复需重建✅ 自动续传

📎 相关链接