Featured image of post 打造一个 24 小时在线为你打工的智能体:通过Telegram控制Codex CLI

打造一个 24 小时在线为你打工的智能体:通过Telegram控制Codex CLI

关键词:Telegram Bot、Codex CLI、远程执行、长会话、定时任务、文件/补丁、skills 闭环、记忆体压缩

背景:OpenClaw 很火,但安装部署调试不理想

  • 安装部署链路复杂,环境依赖多,调试不顺手
  • 状态不可见,出错定位困难
  • 能力本质上来自后端的 CLI/Agent(比如 codex cli),OpenClaw 只是“多了一个外部交互渠道”
  • 我更想要一个“轻量、可控、可扩展、我自己能维护”的版本于是我们做了一个最小可用但可迭代的方案:mybot

目标

  1. 一个“24 小时在线为你打工”的智能体壳
  2. 像 OpenClaw 一样好上手:配置简单、快速启动、调试友好。
  3. 长期可用:会话续聊、自动压缩、沉淀技能、定时任务自动产出。 一句话:把 Codex CLI 的能力“远程化 + 常驻化 + 产品化”。

设计思路:通道、会话、适配器三层解耦

我们把系统拆成 3 层:

  • 通道层(Telegram):只管收消息、发消息、文件上传、菜单命令。
  • 会话层(Session):按 chat_id 管理“一个人一个会话”,串行输入,支持 cancel、status、new。
  • 适配器层(Adapter):对接具体 CLI(默认 codex),把输入输出统一成事件流。

为什么默认不用 Codex 的 TUI(interactive)

最早我们尝试 PTY 启动 codex TUI,但很快踩到真实世界的坑:

  • macOS/环境限制导致 pty.Startoperation not permitted

  • codex TUI 会发光标位置查询(DSR),PTY 不会自动响应,报 cursor position could not be read

  • 输出包含大量控制字符、alternate screen、光标移动,Telegram 不适合承载 解决路线有两条:

  • 继续模拟终端能力(实现更多 VT/xterm 协议)——复杂且脆弱

    最终我们选择第二条:默认 exec(JSONL) 模式

实现要点:从 “能跑” 到 “像产品”

下面按功能演进讲关键实现点。

1) .env 一键配置 + 覆盖开关

为了“快速上手”,我们做了:

  • 程序启动自动加载 .env

    • 但提供 DOTENV_OVERRIDE=1 强制 .env 覆盖,解决“旧 token 覆盖导致 Unauthorized”的经典坑 配置示例(节选):
    • CODEX_CMD=codex
    • CODEX_DRIVER=exec
    • CODEX_ENABLE_SEARCH=1(资讯类任务需要)

    并提供 TELEGRAM_LOG_UNKNOWN=1 用于首次获取 chat_id。

3) Codex exec(JSONL) 适配:稳定输出 + 可解析事件

exec 模式典型输出:

1
2
  {"type":"thread.started","thread_id":"..."}
  {"type":"item.completed","item":{"type":"agent_message","text":"..."}}
  • 解析 turn.completed.usage 用于后续“记忆体压缩”的触发
  • 将噪声 stderr(如内部 rollout 报错)过滤掉,保持 Telegram 输出干净

4) 会话续聊:thread_id 持久化

为了让你“像和一个人聊天一样”续聊,我们把 thread_id 持久化:

  • 保存到 LOG_DIR/state.json
    • 下次启动自动 codex exec resume <thread_id> …
    • /new 会清掉 thread_id,开始新对话

5) 文件/patch:上传即上下文(并且可安全删除)

你把文件丢给 bot:

  • bot 回显相对路径 uploads/xxx.txt

  • 对 .patch/.diff:先让 codex 总结改动,不自动 apply(防止破坏性操作)

  • /uploads 列出最近上传

  • 支持自然语言删除“删除这个 xxx.txt”(仍然走同一安全约束)

6) Telegram 菜单命令:像 OpenClaw 一样可发现

为了让“能力可发现”,我们在启动时调用 Telegram 的 setMyCommands:

  • /new /status /cancel
  • /skills
  • /schedule
  • 存储到 LOG_DIR/schedules.json
  • 支持 /schedule ls/add/rm/on/off/run 资讯类任务通常需要搜索,我们加了 CODEX_ENABLE_SEARCH=1 自动为 codex 加 –search。

8) 记忆体:对话自动压缩(摘要 + 长期规则 + 偏好)

长期使用必然遇到“上下文膨胀”:

  • 你聊得越多,token 越大

我们的策略:

  • 通过 JSONL 的 turn.completed.usage 累计 tokens/turns
    • summary(对话摘要)
    • durable_rules(用户反复强调的长期规则)
  • 落盘到 LOG_DIR/memory.json

这一步让 bot 从“能聊”变成“能长期为你工作”。

9) skills 升级闭环:从经验到可复用资产

最后一步是“把经验沉淀成可复用能力”。

  1. 自动压缩后生成 skill_ideas
  2. 你在 Telegram 输入:/memory ideas 查看 idea 列表
  3. 你执行:/skillify

功能演示(真实对话流)

1) 每天 9 点 AI 资讯

用户:

scheduled: id=… daily 09:00

2) 上传文件作为上下文

用户上传 23131.txt

bot:

saved: uploads/20260209_131717_23131.txt

随后 codex 会基于文件内容回应或总结。

3) 安全删除上传文件

用户:

/delete 23131.txt 用户:

  1. … 用户: /skillify ai-news 1 bot: installed/updated skill: ai-news (SKILL.md)

为什么这个形态值得做

  • Telegram 是最强的外部入口之一:低门槛、跨平台、随时随地。
  • Codex CLI 是强执行器:能写代码、改文件、跑命令、做工程任务。
  • 两者结合,等于你有了一个“随时可召唤的远程工作搭子”。

而且它比很多“套壳产品”更可控:

  • 所有数据、日志、文件都在你机器上
  • 适配器可扩展,可替换为其他 CLI
  • 安全策略(allowlist、删除限制、危险操作)可以按你偏好收紧

未来规划(下一阶段)

我接下来想把它从 “MVP+” 进化到 “稳定可长期运行”的版本,优先级大致如下:

  1. 调度能力增强
    • 支持时区配置(而不是默认 time.Local)
    • 支持工作日/周末、每周/每月、一次性任务
    • 任务失败重试、指数退避、告警
  2. 更强的“文件工作流”
    • 上传 patch 提供 /apply:预览 diff、确认后再 apply
    • 文件摘要缓存(避免每次都读同一文件)
  3. 更严格的安全模型
    • 将“破坏性操作”变成必须二次确认的指令
    • 对 codex 输出的“建议执行命令”做拦截/审批
  4. skills 市场化/版本化
    • CHANGELOG.md 自动维护
    • /skillify –preview 先预览再落盘
    • skill 的依赖/适用范围描述更结构化
  5. 多适配器支持
    • cloudcode / qoder cli 适配器
    • 统一 exec/event 协议

总结

这个项目的本质不是“再造一个 AI Bot”,而是:

  • 用 Telegram 解决“随时随地交互”
  • 用 Codex CLI 解决“强执行能力”
  • 用记忆体 + skills 闭环解决“长期可用与可进化”

最终得到一个真正能 24 小时在线为你打工的智能体。

如果你也在用 codex cli 或类似工具,强烈建议你做一层“外部入口 + 会话 + 资产沉淀”的壳:你会发现生产力不是线性提升,而是直接换了工作方式。