# omp-wechatClawbot **Repository Path**: futurelei/omp-wechat-clawbot ## Basic Information - **Project Name**: omp-wechatClawbot - **Description**: 链接omp和wechat-clawbot(python的iLink接口)的项目仓库,简单运行扫描二维码即可链接omp和wechat的clawbot - **Primary Language**: Unknown - **License**: MIT - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-08-02 - **Last Updated**: 2026-08-10 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # wechat-omp-bot 通过微信(iLink)远程驱动 [Oh My Pi](https://github.com/oh-my-pi)(`omp`)编码智能体: 微信扫码登录 → 直接发消息 → 消息作为 prompt 转发给 `omp --mode rpc` 会话执行 → 智能体回复回传到微信。 每个微信用户拥有**独立的、可续传的** omp 会话(`--session-dir` + `-c` 恢复),机器人重启后对话历史不丢。 ## 特性 - 终端渲染二维码,微信扫码即登录(`wechatbot-sdk`),iLink 会话过期自动重登 - **多 omp 会话路由(特色)**:每个微信用户可有多个命名任务会话,按会话名+描述 自动切换(强信号直切 / 弱信号确认),任务隔离互不干扰 - 每条非指令消息 = 一条 omp prompt,自带工具权限(读写工作目录、执行命令等) - **自然语言技能**:子串 / jieba 关键词 / ternlight 语义(英文)三级匹配,20+ 本地命令零 token - 回复脚注:供应商/模型 + 入/出/缓存 token + 费用(含缓存计价),本地命令标注“不消耗 token” - **文件 + 图片 RAG**:发 txt/docx/pptx/pdf/图片 → 自动提取/OCR → 切块建索引 → 追问注入回答 - outbox 文件投递:按日期分目录,机器人生成文件自动发到微信 - **媒体处理**:发视频/音频 → ffmpeg 加速/截取/转格式/拼接,结果自动回传微信 - 会话运维:热重载技能 `/reload`、上下文压缩 `/compact`、模型切换 `/model`、组件安装 `/install` - 退出零残留:SIGTERM/SIGKILL 后 omp/ternlight 子进程自动清理(PDEATHSIG + 进程组) ## 架构 ```mermaid graph LR A[微信] -->|扫码登录/消息| B[bot.py
wechatbot-sdk] B -->|prompt/回复| C[omp_rpc.py
JSONL over stdio] C -->|spawn 子进程| D[omp --mode rpc × N
每用户每会话一个] D -->|agent 事件流| C B -->|最终文本| A ``` `omp_rpc.py` 是 `omp --mode rpc` 协议的最小实现:`ready` 帧握手 → `prompt` 命令 → 订阅 `agent_start` / `message_update`(text_delta) / `agent_end` 事件 → 聚合文本返回。 会话布局:`~/.wechat-omp-bot/sessions//`(默认会话)+ `//`(命名任务会话), 每个会话独立 omp 进程(进程级隔离)。 ## 系统要求 | 平台 | 支持 | 说明 | |---|---|---| | **Linux(含 WSL2)** | ✅ 推荐 | 开发与测试环境;退出清理用内核 PDEATHSIG、后台常驻可用 systemd | | macOS | ⚠️ 可用 | 功能正常;退出清理退化为 stdin 管道关闭兜底(无 PDEATHSIG) | | Windows | ❌ 不支持 | 子进程 `preexec_fn` 不受支持,建议 WSL2 运行 | 软件要求:Python ≥ 3.9、[omp](https://omp.sh)(已认证)、ffmpeg(可选,媒体处理)、Bun(可选,语义匹配)。 运行时数据都在 `~/.wechat-omp-bot/`(会话/索引/日志),仓库内无状态写入(outbox 已 gitignore)。 ## 安装 从零开始的完整部署(含 omp 安装认证、扫码、后台常驻、FAQ)见 [**DEPLOY.md**](DEPLOY.md)。 要求:Python ≥ 3.9、已安装并配置好认证的 [omp](https://omp.sh)(`omp -p "hi"` 能跑通)。 ```bash pip install -r requirements.txt # 国内可用: -i https://pypi.tuna.tsinghua.edu.cn/simple python3 bot.py # 终端出现二维码,微信扫码 ``` 媒体处理(发视频/音频后的加速/截取/转格式/拼接)需要 ffmpeg(可选,不装则其它功能不受影响): ```bash apt install ffmpeg # Debian/Ubuntu;macOS: brew install ffmpeg ``` 扫码后凭证存于 `~/.wechatbot/credentials.json`,下次运行直接登录。 ## 使用 ### 命令速查(全部本地命令,零 token) | 分类 | 命令 | 用法 | |---|---|---| | 基础 | `/ping` `/help` | 连通性测试 / 帮助(含自然语言技能清单) | | 会话 | `/sessions` | 会话列表(任务名 + 描述 + 消息数,→ 当前) | | 会话 | `/session new <任务名> [描述]` | 新建并切换命名会话 | | 会话 | `/session switch <名>` · `rm <名>` · `desc <名> <描述>` | 切换 / 删除 / 改描述 | | 会话 | `/status` | 当前会话模型/消息数/上下文占用/自动压缩 | | 会话 | `/restart` · `/reload` · `/compact` · `/new` · `/stop` | 重启进程 / 热重载技能 / 压缩上下文 / 清空 / 中止 | | 模型 | `/model [供应商/模型ID]` | 查看当前模型与已认证供应商,或切换 | | 记账 | `/usage [today\|yesterday\|YYYY-MM-DD]` | 按日期查询 token 消耗与费用 | | 记账 | `/stats` | 各项目 token 排名(转接 omp stats) | | 技能 | `/skills` | omp 技能清单(已加载 + 已安装) | | 技能 | `/skillhub <关键词>` | 让智能体查 SkillHub 安装指引(走 LLM) | | 分享 | `/share` | 当前会话网页版只读快照链接(浏览器查看) | | 分享 | `/collab` | 实时共享说明(omp TUI 功能,含手动步骤) | | 文件 | `/files` · `/clear_files` · `/outbox` | 已索引文件 / 清空文件库 / 待投递文件 | | 媒体 | `/video [操作]` | ffmpeg 处理 inbox 视频/音频(加速/截取/转格式/拼接) | | 组件 | `/install [ocr\|semantic]` | 可选组件状态与安装 | 给机器人发消息: | 输入 | 行为 | |---|---| | `把 README 翻译成英文并写入 docs/` | 转发给 omp 智能体执行 | | `生成一份周报存成 pdf 发给我` | 智能体把文件写入 `outbox/`,机器人自动通过微信发送 | | **发文件(txt/word/ppt/pdf)** | 自动解读、切块、建索引,之后可追问文件内容 | | **发图片(含截图/拍照)** | OCR 识别文字并索引(rapidocr,CPU 本地),可追问图片内容 | | `/ping` | `pong` | | `/status` | 当前会话模型、消息数、是否处理中 | | `/sessions` | 会话列表(任务名 + 描述 + 消息数) | | `/session new <任务名> [描述]` | 新建并切换到命名会话 | | `/session switch <名>` / `rm <名>` | 切换 / 删除会话 | | `/model [供应商/模型ID]` | 查看/切换模型 | | `/new` | 清空当前会话历史,重新开始 | | `/stop` | 中止正在执行的任务 | | `/usage [today\|yesterday\|YYYY-MM-DD]` | 按日期查询 token 消耗(本地,含费用) | | `/stats` | 各项目 token 消耗排名,转接 `omp stats`(本地) | | `/files` | 已索引文件列表 | | `/clear_files` | 清空文件库(本地) | | `/install` | 可选组件状态与安装(ocr / semantic) | | `/help` | 所有本地命令汇总 | 所有 `/` 命令均为**本地命令**,不调用 LLM、不消耗 token(回复末尾有标注); 直接发消息才走 LLM。 ### 会话路由(多任务隔离) 每个微信用户可以有多个**命名会话**(任务),互不干扰、各自续传: ``` /session new ppt 帮用户做PPT # 新建并切换到「ppt」会话 /session new 翻译 处理翻译任务 # 又一个任务 /sessions # 列出:任务名 + 描述 + 消息数(→ 当前) /session switch ppt # 切回 PPT 任务 /session rm 翻译 # 删除会话 ``` - 会话按任务隔离(实测:A 会话记住的暗号 B 会话不知道),每个会话独立 omp 进程 - 会话名支持中文(目录名安全编码,显示/匹配用 meta.json 里的原始名) - 每条消息路由到**当前会话**(`~/.wechat-omp-bot/sessions//current.txt` 持久化, 机器人重启不丢);`/status` `/model` `/compact` 等命令作用于当前会话 - 默认 `default` 会话兼容旧数据,路径不变;`/usage` 可按会话统计(`/sessions` 显示每会话消息数) - 自然语言也能触发:"新建会话 ppt" → `/session new ppt`、"会话列表" → `/sessions` #### 自然语言会话路由(自动切换 + 确认) 不用记命令,消息会**按会话名 + 描述**自动匹配目标会话: - **强信号**(含"切到/换到/切换到"等动词)→ 直接切换并执行,如"切到 ppt 会话帮我做个封面" - **弱信号**(提到会话名/描述但无切换动词)→ 先**确认**: "检测到会话「ppt」(帮用户做PPT)与你的请求相关。要在其中执行吗? 回复『确认』;不想切换直接说任务内容。" 回复"确认"/"在ppt做" → 切换并执行原请求;"不用" → 留在当前会话 - 已在目标会话时不会重复提示;确认等待 10 分钟内有效 例如在"翻译"会话中直接说"帮我做一份PPT",机器人会询问是否切到「ppt」会话。 ### 自然语言技能匹配(模糊 + 轻量语义 RAG) 除了精确的 `/` 命令,自然语言也能触发本地技能,三级匹配(全部本地、零 token): 1. **子串**:别名命中即触发,如“看看今天的用量”→“/usage”、“清空会话”→“/new” 2. **关键词**:jieba 分词后关键词覆盖率 ≥ 50%,如“这个月花了多少token”→“/usage” 3. **语义**:**ternlight**(7MB WASM 三元量化嵌入模型,CPU 本地运行,无 GPU/无 API) cosine 相似度。仅用于非中文消息(ternlight 的 BERT 以英文为中心,中文嵌入 实测为噪声,中文走子串/关键词层);`/new`、`/stop` 等破坏性技能需要更高 相似度(0.6)才会触发,避免误伤 语义引擎实现:`vendor/ternlight/server.mjs`(Bun 子进程,JSONL over stdio, 与 omp RPC 同款模式),Python 侧 `embedder.py` 桥接;Bun 缺失时自动降级为 纯关键词匹配。匹配命中时回复脚注标注“模糊匹配/语义匹配 + 分数”。 ### 回复脚注 每条 LLM 回复末尾的分割线下显示:`供应商/模型 | 入/出/缓存/合计 tokens | 费用`。 token 数与费用来自 omp 实时返回(含缓存计价,费用为 USD,可配人民币近似汇率), 不依赖任何价格表。本地命令回复标注“本地命令 · 不消耗 token”。 ### 文件解读与轻量 RAG 给机器人直接发文件(**txt / docx / pptx / pdf**)或**图片**(png/jpg,需 OCR 组件),自动完成: 1. **提取**:txt 直接解码;docx/pptx 解析 OpenXML 抽取文本;pdf 提取文本层(`pypdf`) 2. **切块**:段落感知分块(~450 字符/块,≈ ternlight 单次嵌入 128 token 上限内),相邻重叠 64 字符 3. **索引**:英文块用 ternlight 嵌入(384 维)存 SQLite(`~/.wechat-omp-bot/bot_files.db`),中文块存纯文本(中文嵌入实测为噪声) 4. **检索**:混合检索——中文用 jieba 分词词频打分,英文关键词 + ternlight 余弦相似度 5. **回答**:提问时 top-k 相关块注入 omp 会话,基于文件内容回答 索引完成后回复“已索引 xxx:N 字 / M 块”,之后直接问“报告里第三季度营收是多少”即可。 老格式(.doc/.ppt/.xls)与无文字图片会提示无法解读。`/files` 查看、`/clear_files` 清空。 #### 可选组件(按需安装) 以下组件不装也能跑核心功能,未安装时收到对应请求会直接提示,发 `/install` 确认安装: | 组件 | 功能 | 未安装时的行为 | |---|---|---| | OCR(rapidocr_onnxruntime) | 图片文字识别 | 发图片提示"发送 /install ocr 安装" | | 语义匹配(ternlight + bun) | 英文自然语言技能匹配 | 自动降级关键词匹配,不打断使用 | `/install` 无参数显示组件状态;`/install ocr`、`/install semantic` 自动安装 (pip 走 `PIP_INDEX_URL`,默认清华源),安装后即时生效、无需重启。 自然语言"安装ocr"也会触发。 #### 上下文连贯 上传文件/图片后,问题处理分两级:具体关键词问题走块检索注入;**检索未命中时自动注入 文件库概览**(文件名 + 上传时间 + 首块,标注"用户上传"),所以“**图片里说了什么**” “**我发了什么**”“**你想要我干啥**”这类指代问法都能联系到上传的内容回答。 概览同时告知 omp:用户上传的内容来自微信,**不是机器人生成的 outbox 文件**, 避免把两者搞混。 ### 媒体处理(视频/音频 → ffmpeg) 发**视频**或**音频文件**(mp4/mov/mp3/wav 等)→ 存入媒体 inbox → 发操作指令: | 指令示例 | 效果 | |---|---| | `加速1.5倍` / `减速` / `放慢两倍` | 变速(视频画面+音频同步,支持中文数字) | | `截取10-20秒` / `截取前30秒` | 分切片段(精确到秒) | | `转成mp3` / `转mp4` / `提取音频` | 转格式(mp3/mp4/wav/flac/mov/gif/m4a) | | `拼接合并` | 按上传时间顺序拼接全部 inbox 文件 | 处理结果自动发回微信(走 outbox 投递)。`/video` 查看 inbox 列表,`/video clear` 清空。 语音消息(微信 silk 私有编码)暂不支持,提示说明。 ### 文件投递(outbox) 告诉智能体"生成/导出一个文件给我",它会按系统提示把文件写入 `outbox/` 下 **当天日期子目录**(`outbox/2026-08-02/xxx.pdf`,YYYY-MM-DD),目录规则同时写有 `outbox/README.md` 供智能体直接阅读。任务结束后机器人自动把新文件通过微信发给你 (图片/视频按扩展名发送为对应类型,其余作为文件),发送后删除文件并清理空日期目录。 超过 `OMP_BOT_MAX_FILE_MB`(默认 20MB)的文件会跳过并保留。 `/outbox` 可本地查看待投递文件(自然语言"outbox里有什么"也能触发)。 ## 配置(环境变量) | 变量 | 默认 | 说明 | |---|---|---| | `OMP_CWD` | 项目目录 | omp 智能体工作目录 | | `OMP_BOT_DATA` | `~/.wechat-omp-bot` | 每用户会话目录根 | | `OMP_BIN` | `omp` | omp 可执行文件 | | `OMP_BOT_TIMEOUT` | `600` | 单次 prompt 超时(秒),超时先回部分内容 | | `OMP_BOT_MAX_REPLY` | `2000` | 微信单条回复最大字符数,超出截断 | | `OMP_BOT_MAX_FILE_MB` | `20` | outbox 单文件大小上限(MB),超出跳过 | | `OMP_BOT_CNY_RATE` | `7.2` | 费用的人民币近似汇率(仅显示用;`None` 关闭) | | `OMP_BOT_LOG` | `INFO` | 日志级别(DEBUG/INFO/WARNING/ERROR) | 安全提示:消息会以 `--auto-approve`(yolo)模式驱动 omp,智能体可以读写/执行 `OMP_CWD` 下的任何内容。仅给自己或可信的微信号使用。 ## 项目结构 ``` bot.py # 入口:微信登录 + 消息路由 + 指令 + 回复脚注 omp_rpc.py # omp --mode rpc 最小 JSONL 客户端 + 会话管理器 ledger.py # token/费用记账(bot_stats.db)+ omp stats.db 合并查询 ingest.py # 文件解读 + 切块 + 混合检索(bot_files.db) skills.py # 本地技能注册表 + 自然语言路由 embedder.py # ternlight 语义嵌入桥(Bun 子进程) vendor/ternlight/ # ternlight 嵌入服务(bun install 安装) requirements.txt ``` 机器人自身用量实时写入 `~/.wechat-omp-bot/bot_stats.db`;`/usage`、`/stats` 同时 合并 omp 官方统计 `~/.omp/stats.db`(覆盖你手动使用 omp 的用量)。 上传文件的索引存 `~/.wechat-omp-bot/bot_files.db`。 ## 许可证 MIT