这是一个基于 WeChaty + DeepSeek 的微信消息自动回复项目。你只需要配置 DeepSeek API Key,然后运行项目并扫码登录微信即可。
- 监听微信文本消息
- 监听微信图片消息,并把图片放入对话上下文用于问答
- 调用 DeepSeek Chat Completions API 生成回复
- 可把联网搜索工具交给模型自动判断是否调用
- 自动回复私聊消息
- 可选开启群聊回复
- 群聊中可读取机器人上线后收到的最近文本和图片上下文
- 支持触发前缀,例如只回复
AI: 你好 - 每个会话保留有限上下文,避免重复问答时丢失上下文
当前项目已经安装好依赖。如果你换了机器或删除了 node_modules,重新安装即可:
npm install复制环境变量文件:
cp .env.example .env编辑 .env,至少填入:
DEEPSEEK_API_KEY=你的DeepSeek API Key开发模式启动:
npm run dev终端里出现二维码后,用微信扫码登录。登录成功后,给这个微信号发私聊文本消息,机器人会自动调用 DeepSeek 并回复。
先编译:
npm run build再启动:
npm start.env 里可以调整这些选项:
BOT_SYSTEM_PROMPT=你是微信群聊里的轻松有趣的聊天机器人,像群友一样自然接话。\n默认回复非常简短:1-2句,能一句说完就别展开;可以适度使用 emoji,但不要刷屏。\n不要使用 LaTeX、Markdown 标题、表格、代码块或复杂排版;公式用普通文字讲。\n闲聊时活泼、俏皮、有梗但不冒犯;不要装权威,也不要输出长篇说教。\n当用户明确提问、求助、要步骤或重要信息时,认真准确回答;必要时分点,但仍保持简洁。\n不确定就直说不确定,并给出可验证的方向。\n群聊上下文里如果能看出是谁在说话,按上下文自然回应,避免重复解释自己是 AI。
BOT_TRIGGER_PREFIX=
ENABLE_ROOM_REPLY=false
ENABLE_ROOM_CONTEXT=true
BOT_MAX_HISTORY=8
BOT_MAX_ROOM_CONTEXT_MESSAGES=20
BOT_MAX_MESSAGE_AGE_SECONDS=120
LLM_ENABLE_WEB_SEARCH=true
LLM_ENABLE_THINKING=false说明:
- 私聊始终会回复文本和图片消息,不受
BOT_TRIGGER_PREFIX限制。 BOT_TRIGGER_PREFIX=AI:时,群聊里只有以AI:开头的消息才会触发回复。ENABLE_ROOM_REPLY=false是默认值,避免机器人在群里误回复。- 如果设置
ENABLE_ROOM_REPLY=true且不设置触发前缀,群聊里需要 @ 机器人。 - 如果设置
ENABLE_ROOM_REPLY=true且设置了触发前缀,群聊里发送对应前缀即可触发。 ENABLE_ROOM_CONTEXT=true时,机器人会缓存运行期间收到的最近群聊文本和图片;被触发回复时会把这些上下文交给 LLM。BOT_MAX_HISTORY=8表示每个私聊联系人或每个群聊最多保留最近 8 轮问答历史;不同私聊和不同群聊互相隔离,同一群聊内不同用户共享同一份群历史。BOT_MAX_ROOM_CONTEXT_MESSAGES=20表示最多带上最近 20 条群聊消息。LLM_ENABLE_WEB_SEARCH=true会通过 OpenAI function calling 暴露web_search工具;模型判断需要实时信息时会调用工具,程序搜索后再让模型生成最终回复。LLM_ENABLE_THINKING=false会在 API 请求里发送thinking: { type: "disabled" },并在回复前移除<think>...</think>内容,避免 thinking 泄露到微信。
机器人会把微信图片消息下载成 data:image/...;base64,...,并按 OpenAI 兼容的多模态 image_url 消息格式放入上下文。
- 私聊里直接发送图片时,机器人会尝试描述图片;之后继续发文字,也可以基于最近图片追问。
- 用户发送的图片会作为一条
user消息传给模型,文本说明和图片image_url会放在同一条消息内容里。 - 私聊里单独发送图片也会立即回复;群聊图片是否立即回复仍取决于 @ 机器人或触发前缀。
- 群聊图片会在
ENABLE_ROOM_CONTEXT=true时进入群上下文;真正回复仍受ENABLE_ROOM_REPLY、@ 机器人或触发前缀控制。 .env里的DEEPSEEK_BASE_URL和DEEPSEEK_MODEL必须指向支持图片输入、enable_search和enable_thinking的 OpenAI 兼容模型。纯文本模型或不支持这些额外参数的 API 通常会拒绝这类请求。
.env 里建议把系统提示词写成一个字符串,用 \n 表示换行:
BOT_SYSTEM_PROMPT=你是微信群聊里的轻松有趣的聊天机器人,像群友一样自然接话。\n默认回复非常简短:1-2句,能一句说完就别展开;可以适度使用 emoji,但不要刷屏。\n不要使用 LaTeX、Markdown 标题、表格、代码块或复杂排版;公式用普通文字讲。\n当用户明确提问、求助、要步骤或重要信息时,认真准确回答;必要时分点,但仍保持简洁。程序启动后会自动把 \n 转成真正的换行。
默认不回复群聊。要启用群聊,修改 .env:
ENABLE_ROOM_REPLY=true启用后:
- 如果
BOT_TRIGGER_PREFIX留空,群聊里需要 @ 机器人,它才会回复。 - 如果设置了
BOT_TRIGGER_PREFIX=AI:,群聊里发送AI: 你的问题即可触发。 - 机器人只能看到它运行期间 WeChaty 收到的新消息,不能读取上线前的历史聊天记录。
- 群聊上下文目前保存在内存里,重启后会清空。
WeChaty 是否能直接扫码登录,取决于可用的微信协议 puppet 和账号情况。默认配置会使用 WeChaty 的默认 puppet;如果你的账号无法登录,建议使用 WeChaty Puppet Service 或其他可用 puppet。
如果你有 Puppet Service token,在 .env 中配置:
WECHATY_PUPPET=wechaty-puppet-service
WECHATY_PUPPET_SERVICE_TOKEN=你的token然后重新启动:
npm run dev检查 TypeScript:
npm run typecheck构建项目:
npm run build- 请不要把
.env提交到代码仓库。 - 如果出现
MemoryCard load() exception: Unexpected end of JSON input,通常是本地登录缓存损坏,删除*.memory-card.json后重新扫码即可。 - 如果运行中偶发
AggregateError,通常是 Web 微信或 puppet 的网络请求短暂失败;程序会以警告形式处理,频繁出现时请检查网络/代理,或改用 Puppet Service。 - 微信网页版和第三方协议能力可能受微信风控、账号类型和 puppet 服务影响。
- 建议先用小号或测试账号验证自动回复行为。