你有没有这种瞬间:
- 群里同事甩一堆需求,“帮我总结一下 / 给个模板 / 查下资料”。
- 你不想打开电脑,不想复制粘贴。
- 你只想在微信里丢一句话:“小助理,干活。”
这篇就干这个。
目标很明确:Hermes Agent 在微信里接收消息 → 调工具 → 产出结果 → 回微信。
顺便聊一个你可能已经遇到的怪事:功能介绍里为啥会显示 OpenClaw 和微信链接 🤔
跑完后,你的微信机器人至少能做这些:
- 你发:
/sum+ 一段话 → 回你三行总结 - 你发:
/todo+ 需求 → 回你 TODO 列表 - 你发:
/help→ 回可用指令 + 示例
后面你想接飞书、企业微信、网页也行。微信只是一个入口。
你需要:
- Node.js 18+(建议 20)
- 一个能跑机器人的微信接入方式
- 个人微信:通常用 Wechaty(不同 puppet 方案限制差异很大)
- 更稳的选择:企业微信应用/机器人(合规、省心)
- Hermes Agent(你的 Agent 框架/项目)
- Claude Code(用来快速把骨架补齐,少敲无聊胶水代码)
如果你只是想“快跑起来看看”,建议用企业微信。个人微信那条路,水深一点。
这套东西就三层:
- 微信入口层:接收消息、发送消息(Wechaty / 企业微信 SDK)
- Agent 层(Hermes):理解意图、规划、调用工具
- 工具层(Tools):总结/检索/读写文件/调接口(你写的函数)
微信层只做两件事:
- 把“用户消息”丢给 Hermes
- 把“Hermes 输出”回给微信
别在微信层塞业务逻辑。后面你会感谢自己。
mkdir hermes-wechat-agent cd hermes-wechat-agent npm init -y npm i wechaty dotenv
你如果用企业微信,依赖会不同;思路不变。
新建 .env:
# 你自己的 Hermes/大模型相关 key HERMES_API_KEY=xxx # wechaty puppet 相关配置(按你选的 puppet 来) WECHATY_PUPPET=xxx WECHATY_PUPPET_TOKEN=xxx
⚠️ 这块没法给“万能填写法”。每个 puppet 的配置都不一样。
你打开 Claude Code,直接把需求说清楚。
给你一段非常好用的提示词(你照抄就行):
帮我用 Node.js 写一个微信机器人骨架:
- 使用 wechaty
- 收到文本消息时,转发给
runHermes(text, context)runHermes返回的字符串直接回复- 支持
/help/sum/todo三个指令- 用 dotenv 读取环境变量
- 输出完整代码到
index.js
Claude Code 会给你一个能跑的壳子。
你要做的是:把 runHermes() 这块对接到你的 Hermes Agent。
下面这份代码是“示意写法”。你把
runHermes替换成你项目里实际的 Hermes 调用即可。
import 'dotenv/config' import { WechatyBuilder } from 'wechaty' async function runHermes(text, context) { // 这里换成你的 Hermes Agent 调用 // 举例:return await hermes.run({ input: text, userId: context.talkerId }) if (text.startsWith('/help')) { return [ '可用指令:', '/sum 需要总结的内容', '/todo 需求描述', '直接发普通文本:我会按默认模式处理' ].join(' ') } if (text.startsWith('/sum')) { const payload = text.replace('/sum', '').trim() return `【三行总结】 - ${payload.slice(0, 20)}...(示例) - 关键信息 2 - 行动建议 3` } if (text.startsWith('/todo')) { const payload = text.replace('/todo', '').trim() return `【TODO】 1. 拆解:${payload.slice(0, 20)}...(示例) 2. 评估工作量 3. 给出时间点` } return `收到:${text} (这里接 Hermes 的默认对话输出)` } const bot = WechatyBuilder.build({ name: 'hermes-wechat-agent' }) bot.on('message', async (msg) => const context = { talkerId: talker.id, talkerName: talker.name(), roomId: room?.id, roomTopic: room ? await room.topic() : null } const reply = await runHermes(text, context) await msg.say(reply) } catch (e) { console.error(e) await msg.say('我这边刚刚卡了一下,你再发一遍?') } }) bot.start().then(() => { console.log('✅ bot started') })
跑起来:
node index.js
能登录、能收消息、能回消息,这条链路就通了。
很多人做机器人翻车,不是模型不行,是上下文太少。
建议你至少给 Hermes 这些:
- talkerId(用来做“同一个人”的长期记忆)
- roomId(群/私聊隔离)
- roomTopic(群名,模型理解场景用)
- 原始文本(别只传清洗后的)
你未来要做权限、配额、白名单,全靠这些字段。
微信里没人爱看论文。
同样是输出,下面这种更讨喜:
- 结论 1 行
- 要点 3 行
- 下一步 1 行
想让你每天早下班一小时,就别给用户发 80 行长文。
你说的现象特别典型:
“奇怪的是功能介绍那里为什么显示链接 OpenClaw 和微信”
大概率不是微信的问题,也不是你写错了业务逻辑。
更像是:你的工具(tools / functions)元数据里,带了默认的“来源链接/项目链接”字段,被界面展示出来了。
常见触发点有这些:
- 你用模板项目起的 Agent(模板作者写了
homepage、repository、source) - 你用某个工具注册器自动生成 manifest(里面有
url或links) - 你把工具描述直接从某个项目拷过来(描述里就带 OpenClaw)
去你 Hermes 的工具定义里搜关键字:
OpenClawwechatlinkurlhomepagerepository
一般会在这些地方:
tools.jsonmanifest.jsontoolRegistry.ts/tools.ts- 工具的
description字段
你有三个修法,选你顺手的:
- 改描述:把工具
description里那段链接删掉 - 改元数据:把
homepage/repository换成你自己的 - 禁止展示:如果你的 UI/接入层支持,直接不渲染 links
如果你愿意贴一段“工具定义/功能介绍”的原始 JSON(打码也行),我可以帮你一眼指出是哪一个字段在捣乱。
- 群聊不做触发条件:机器人会被群消息刷爆。建议只响应“@我”或“/命令”。
- 不做异常兜底:一报错就沉默,用户以为你挂了。至少回一句“我卡了”。
- 输出太长:微信看长文太痛苦。默认输出限制在 10 行内。
- 没有用户隔离:A 问的问题被 B 接着用,社死现场。用
talkerId+roomId做隔离。 - 把 token 打进日志:别笑,真有人这么干。日志里只留 requestId。
你可以把指令设计成这种风格:
/sum:三行总结/plan:给执行计划(按天拆)/reply:帮我写一段微信回复(礼貌但不卑微)/risk:列风险点(越尖锐越好)
用户会觉得这机器人真的在“替我工作”,而不是在聊天。
当链路跑通以后,再加两件事,机器人就开始值钱了:
- 记忆:同一个人常用格式、常聊项目,别每次从零开始
- 工具:查日历、查文档、写周报、拉取工单、跑脚本
到这一步,Hermes 才算“Agent”,不是“会说话的模型”。
如果你想把“示例骨架”替换成你真实的 Hermes 调用,发这些就够:
- 你 Hermes Agent 的初始化代码片段(打码 key)
- 你现在工具注册(tools/functions)的那段 JSON/TS
- 你用的微信接入方式:Wechaty 哪个 puppet / 企业微信哪种模式
- 那个“功能介绍显示 OpenClaw/微信链接”的截图或原文
我会按你的栈给一版能直接跑的对接方式。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/271065.html