ClawRelay 用不习惯 OpenClaw,我自己撸了一个 Claude Code 调度器 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
yadorez

ClawRelay 用不习惯 OpenClaw,我自己撸了一个 Claude Code 调度器

  •  
  •   yadorez 2 月 27 日 3517 次点击
    这是一个创建于 57 天前的主题,其中的信息可能已经有所发展或是发生改变。

    起因

    先说结论:用了一个假期的 OpenClaw 之后,我决定自己造一个。

    不是 OpenClaw 不好,Telegram UI 确实香,但用深了之后问题实在太多,多到我一个写代码的人每天花一半时间在跟工具较劲,而不是在干活。

    痛点一:发了消息之后完全不知道它在干什么

    这是最让我抓狂的。你给 Claude 一个任务,然后呢?然后就是对着 Telegram 聊天窗口干瞪眼。它在读文件?在跑命令?在思考人生?你不知道。配了消息切分也不行切太碎 Telegram 直接 429 ,指数退避之后两条消息要等 10 分钟才发出来。10 分钟。你坐在那里等 10 分钟看一条消息,这体验跟拨号上网有什么区别?

    痛点二:两个 Agent 打架

    这是架构层面的硬伤。Claude Code 本身已经是一个非常成熟的 Agent 了,有完整的工具链:Bash 、Read 、Write 、Edit 、Grep 、WebSearch……它自己就能干活。但 OpenClaw 的 pi-mono 框架也是个 Agent ,也想管事。结果就是两个 Agent 互相抢活干,你不得不把 Claude 本来就能做的事情委托给 OpenClaw 去调度,这太不 AI 了。

    说白了我需要的只是一个监工 + 调度器,不是另一个 Agent 。那堆 SAUL 和 SKILL 对我来说完全用不上Claude 自己就能做。唯一算有点用的计划任务和 heartbeat ,对稍微有点经验的人来说也是鸡肋。

    痛点三:Anthropic 封了 OpenClaw

    嗯,这个不多说了。


    所以我做了 ClawRelay

    架构图一目了然:

    Flutter 桌面客户端 ↓ HTTP/SSE ( OpenAI 兼容协议) Go Relay Server (:50009 ) ↓ subprocess fork Claude Code CLI (带完整工具链) ↓ Anthropic API → Claude Opus/Sonnet/Haiku 

    核心设计哲学:Claude Code 是干活的人,ClawRelay 只是给它装了个好看的壳。

    不抢活,不加戏,不搞中间商赚差价。Go relay 是一个无状态的透传层,把 Claude Code 的 stream-json 转成 OpenAI 兼容的 SSE 格式,Flutter 客户端接住渲染。所有工具调用、文件读写、命令执行,全部由 Claude Code 自己搞定。

    你能看到 Claude 在干什么

    这是我最在意的功能。消息发出去之后:

    • 实时 token 流:Claude 打一个字你就看到一个字
    • Extended Thinking 面板:Claude 的思考过程实时展示,默认折叠,点开看完整思维链
    • Tool Call 标签:Claude 每调用一个工具,底部就多一个 chipBash 、Read 、Edit 、WebSearch……一目了然

    再也不用对着屏幕发呆猜它在干嘛了。

    多项目管理

    每个项目独立配置:

    • 工作目录( Claude 在哪个目录下干活)
    • System Prompt (你的个性化指令)
    • 模型选择( Opus / Sonnet / Haiku 随便切)
    • 独立的消息历史,SQLite 本地持久化

    项目之间互不干扰,有新消息还会亮未读标记。同时盯三四个项目的进度完全没问题。

    OpenAI 兼容协议

    /v1/chat/completions,标准的 OpenAI API 格式。这意味着理论上你可以用任何支持 OpenAI API 的客户端连上来。Go relay 做了模型别名映射:gpt-4 → Opus ,gpt-4o → Sonnet ,gpt-3.5-turbo → Haiku 。还有 /v1/stats 端点追踪 token 用量。


    技术栈

    组件 技术
    桌面客户端 Flutter + Riverpod + Drift(SQLite) + Material Design 3
    Relay 服务 Go 1.24 ,无框架,subprocess 管理
    流式传输 SSE ( Server-Sent Events )
    本地存储 SQLite (~/.config/clawrelay/clawrelay.sqlite )

    整个项目没用什么花里胡哨的依赖,Go 后端甚至没引 web 框架,标准库直接撸。


    跟 OpenClaw 的本质区别

    OpenClaw ClawRelay
    架构 Agent 调度 Agent 纯 UI 壳 + 透传 Relay
    工具执行 框架接管 Claude Code 原生执行
    UI Telegram Bot Flutter 原生桌面应用
    消息延迟 受 Telegram API 限制 本地直连,零延迟
    可观测性 黑盒 实时 streaming + thinking + tool chips
    复杂度 重( pi-mono + SAUL + SKILL ) 轻(一个 Go binary + 一个 Flutter app )

    手机上和电脑上之前都没法愉快地做监工,现在终于舒服了。


    最后

    代码已开源,欢迎 PR:https://github.com/roodkcab/clawrelay

    如果你也是 Claude Code 重度用户,如果你也受够了终端的不好体验或者对着 Telegram 猜 Claude 在干什么,试试 ClawRelay 。

    它不多管闲事,不跟 Claude 抢活干,只做一件事:随时随地让你清清楚楚地看到 Claude Code 在帮你干什么。


    一个假期的怨气,化成了代码。

    ClawRelay

    第 1 条附言    2 月 27 日
    问:为什么不用 happycoder
    答:happy 更像是 tee ,你需要先启动一个 claude 然后把它转发出去,小机器内存是扛不住那么多 claude 的(毕竟不是 rust 写的) clawrelay 采用 session-id 来做会话同步,每次 session 跑完就释放掉 claude ,不需要你时刻开着一个 claude 。

    当然对于没有那么多项目需要并行管理的人来说,足够用了。我的需求太跳脱,有时候要开好几个 claude 来并行处理,happy 对我来说不太够用。
    25 条回复    2026-02-27 13:44:54 +08:00
    andforce
        1
    andforce  
       2 月 27 日
    知识点有点密集,收藏学习
    yukinotech
        2
    yukinotech  
       2 月 27 日   1
    啊?那和直接用 claude code 有啥区别?没看懂,解决了什么问题,似乎变成了在应用里面调用 Claude code 了,还有别的不一样的地方吗
    MHPSY
        3
    MHPSY  
       2 月 27 日
    是我准备要搞的东西,start 了,睡醒就开始用
    Aquariuslt
        4
    Aquariuslt  
       2 月 27 日   2
    > 不抢活,不加戏,不搞中间商赚差价。

    看文章看到这个 AI 修饰语气有点不适。
    Edward4074
        5
    Edward4074  
       2 月 27 日 via iPhone
    @yukinotech 大概是有点类似 codex cli 和 codex 客户端的关系吧
    win8en
        6
    win8en  
       2 月 27 日 via Android
    @yukinotech 正是我想问的
    yadorez
        7
    yadorez  
    OP
       2 月 27 日
    @yukinotech 因为我有 7-8 个项目需要并行处理,我需要的是一个调度器,最好是能远程的.手机上之前用 terminus+tmux+claude code,体验上太难用了,我需要看到 thinking 和看聊天记录,然后好几个项目来回切过于难受了.

    看到 openclaw,第一时间就想到可以用来做调度工具,实际上确实有人这么做了,tmux 负责接管标准输入输出,然后由 openclaw 调度任务,每 10 分钟做一次状态管理,是一种高级的拉尔夫循环

    我之前也是这么做的,直到 cc 开始封禁 openclaw,我自己弄了个 openai compatible streaming api 继续用,但是也很不爽,触发了 telegram 封禁后,10 分钟才能看到返回的消息

    加上 openclaw 过于笨重,所以自己搞一个最轻量的远程调度器是最爽的
    yadorez
        8
    yadorez  
    OP
       2 月 27 日
    @MHPSY 哈哈哈哈,我刚弄完,你猜怎么着,cc 就把远程控制给做了.

    有没有一种英雄所见略同的感觉?
    yadorez
        9
    yadorez  
    OP
       2 月 27 日
    @Edward4074 那只是一层皮,我们真正需要的是一个能随时远程盯好几个项目的编排工具(orchestrator).如果非要找个类比,这就是 k8s 之于 docker.
    Retas
        10
    Retas  
       2 月 27 日
    如果只是远程 cc ,为啥不用 hapi
    xJogger
        11
    xJogger  
       2 月 27 日 via Android
    手机用什么合适?
    philcat
        12
    philcat  
       2 月 27 日
    emm, happy-coder ?
    Tink
        13
    Tink  
    PRO
       2 月 27 日
    我现在逻辑是让龙虾监工 Claude ,他能把要求提的非常明确
    ebiorz
        14
    ebiorz  
       2 月 27 日
    和 happy-coder 有啥区别啊, 做的不是一个事情吗
    yadorez
        15
    yadorez  
    OP
       2 月 27 日
    @philcat happy 的每个会话要启动一个 claude code ,会榨干小机器的内存。虽然我同时跑 3-4 个 project 的时候也挺占用,但是只要推理完了就会释放掉。会话之间的历史是通过 session-id 同步的,所以内存占用非常小。
    d119
        16
    d119  
       2 月 27 日
    折腾了一天 openclaw ,感觉它跟我都是废物
    yadorez
        17
    yadorez  
    OP
       2 月 27 日
    @d119 不需要气馁,claude 自己整了好半天,帮我调试到足够满足我的需求了,我还是觉得怎么用都别扭,哈哈哈
    EasonYan
        18
    EasonYan  
       2 月 27 日
    需要跑 cc 的那个机器有公网 IP 吗?
    yadorez
        19
    yadorez  
    OP
       2 月 27 日
    @EasonYan 我是用 vpn 穿透到内网。放在公网不好吧,我都没做验证的,不过可以加。
    yukinotech
        20
    yukinotech  
       2 月 27 日
    @yadorez get 了,类似 codex app ,而且还能在手机上操作。claude code 原来官方没做吗,我还以为这个是个大趋势
    frantic
        21
    frantic  
       2 月 27 日
    @Tink 这个要咋弄,我现在期望 openclaw 监工 codex 或者 opencode, 我自己只能用于在同一个 bot 聊天窗口通过指令或者语言意图来切换是聊天模型( kimi-k2.5)还是 coding 模型( codex-5.3)
    yadorez
        22
    yadorez  
    OP
       2 月 27 日
    @yukinotech 其实远程操作只是第一层

    然而 clawrelay 真正强大的地方在于可以将 claude 转发到企业微信这样的地方去,每个项目就是一个智能体,智能体之间通过 IM 工具天然造就一张通信网络,每个 agent 有自己项目的代码和其他项目的交互作为上下文,从而快速时间跨项目的开发,比之前的开发效率又要增长一大截了。

    ![ClawRelay]( https://raw.githubusercontent.com/roodkcab/images/refs/heads/main/clawrelay.png?token=GHSAT0AAAAAADWM3AA5NPBAGR67B46D7NEA2NBCVOA)
    Tink
        23
    Tink  
    PRO
       2 月 27 日   1
    @frantic #21 用这个 skill:claude-code-supervisor

    其实就是拉起一个 tmux ,然后启动一个交互式 claudecode 。你告诉他要干什么,他帮你安排给 Claude ,然后把 Claude 执行结果返回给你
    cadl
        24
    cadl  
       2 月 27 日
    我先前也是做了一个 openclaw 对接 claude code 的插件,感觉比 openclaw 通过 tui 交互 claude code 好用一些,可以方便调起 plan 模式,输出 thinking 内容 等等。加了个本地调试的页面,有点类似你的项目。https://github.com/cadl/openclaw-cc-bridge

    本地调试的页面:


    但是春节过年回家基本没在电脑前,在手机上操作 openclaw 使用这个插件还是有很多槽点,跟你的感觉很像。后来我又把自己之前做的一个远程 ssh 连接 claude code 的 app 项目打磨了下,春节期间一边使用自己的这个 app 开发自己,一边发布 testflight 更新,感觉还挺顺畅。因为跟在电脑上操作 claude code 的体验是一致的,能保证生产力。

    也支持 worktree 的工作流啥的,感觉比裸用一个 terminal ssh 登录要方便很多







    frantic
        25
    frantic  
       2 月 27 日
    @Tink 感谢,之前我以为这样会双倍消耗 token, 刚刚想了下应该没啥问题。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     897 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 120ms UTC 20:13 PVG 04:13 LAX 13:13 JFK 16:13
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86