后端与接口
要把任意 AI Agent…
在 Node.js >=22 环境中,通过 weixin-agent-sdk 的 Agent 接口把 OpenAI、Claude 或自定义 AI 后端接入微信,使用扫码登录和长轮询消息循环,无需公网服务器。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 38/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 55/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 60/100 ×0.15
适用场景
要把任意 AI Agent 后端接入微信特定
解决思路
- 安装:运行 `npm install weixin-agent-sdk`,或在 pnpm monorepo 中运行 `pnpm add weixin-agent-sdk`;运行环境要求 Node.js >= 22。
- 快速开始:从 `weixin-agent-sdk` 导入 `login`、`start` 和 `type Agent`;定义一个实现 `Agent` 接口的对象,例如 `const echo: Agent = { async chat(req) { return { text: `You said: ${req.text}` }; } };`;然后依次执行 `await login(); await start(echo);`。
- 首次登录:调用 `login()` 触发二维码扫描,会话凭据持久化到 `~/.openclaw/`;只需运行一次,之后调用 `start()`。
- 实现 `Agent` 接口:提供 `chat(request: ChatRequest): Promise<ChatResponse>` 方法。
- 处理 `ChatRequest`:`conversationId` 是唯一用户/会话标识;`text` 是消息文本内容;可选 `media` 包含 `type`(`image`/`audio`/`video`/`file`)、`filePath`(本地路径,已下载并解密)、`mimeType`、可选 `fileName`。
- 构造 `ChatResponse`:可返回 `text`(支持 Markdown,自动转纯文本);可返回 `media`,其 `type` 为 `image`/`video`/`file`,`url` 可为本地路径或 HTTPS URL(自动下载),可选 `fileName`。
- 启动消息循环:调用 `start(agent)` 启动消息循环;该调用会阻塞直到进程退出;会话过期时自动重连。
- 实现多轮对话历史:用 `Map<string, string[]>` 按 `conversationId` 保存历史;在 `chat` 中读取历史,push `user: ${req.text}`,调用自己的 AI 服务,push `assistant: ${reply}`,写回 Map,并返回 `{ text: reply }`。
- 实现 OpenAI Agent:用 `new OpenAI({ apiKey: process.env.OPENAI_API_KEY, baseURL: process.env.OPENAI_BASE_URL })` 创建客户端,`baseURL` 可选;模型取 `process.env.OPENAI_MODEL ?? "gpt-4o"`;system prompt 取 `process.env.SYSTEM_PROMPT ?? "You are a helpful assistant."`。
- OpenAI 历史管理:用 `Map<string, OpenAI.Chat.ChatCompletionMessageParam[]>` 按 `conversationId` 保存消息;每次 `chat` 先取出历史。
- OpenAI 输入构造:创建 `content: OpenAI.Chat.ChatCompletionContentPart[]`;如果 `req.text` 存在,push `{ type: "text", text: req.text }`;如果 `req.media?.type === "image"`,用 `fs.readFileSync(req.media.filePath).toString("base64")` 读取图片,并 push `{ type: "image_url", image_url: { url: `data:${req.media.mimeType};base64,${imageData}` } }`。
- OpenAI 调用:push 用户消息到历史;调用 `client.chat.completions.create({ model, messages: [{ role: "system", content: systemPrompt }, ...history] })`;从 `response.choices[0].message.content ?? ""` 取回复;push assistant 消息;写回 `histories`;返回 `{ text: reply }`。
- 发送图片响应:返回 `{ text: "Here is your image:", media: { type: "image", url: "/tmp/output.png" } }`,或把 `url` 设为 `https://example.com/image.png` 让 SDK 自动下载。
- 发送文件响应:返回 `{ media: { type: "file", url: "/tmp/report.pdf", fileName: "monthly-report.pdf" } }`。
- ACP 集成:若有 ACP-compatible agent(如 Claude Code、Codex、kimi-cli 等),直接使用 `weixin-acp` 包,无需写代码。
- ACP 启动命令:Claude Code 用 `npx weixin-acp claude-code`;Codex 用 `npx weixin-acp codex`;任意 ACP-compatible agent 用 `npx weixin-acp start -- kimi acp`。
- ACP 原理:`weixin-acp` 会把 agent 作为子进程启动,并通过 stdio 上的 JSON-RPC 通信。
- OpenAI 示例环境变量:`OPENAI_API_KEY` 必填;`OPENAI_BASE_URL` 可选,用于 OpenAI-compatible 服务;`OPENAI_MODEL` 可选,默认 `gpt-5.4`(示例代码中默认写为 `gpt-4o`);`SYSTEM_PROMPT` 可选,用于 system prompt。
- 内置斜杠命令:在微信聊天中发送 `/echo <message>` 会直接回显,绕过 Agent,并显示 channel 延迟。
- 内置斜杠命令:发送 `/toggle-debug` 切换 debug 模式,开启后会在每条回复后附加完整延迟统计。
- 接收文本:微信文本消息放在 `request.text`。
- 接收图片:`media.type` 为 `image`,文件已下载并解密,`filePath` 指向本地文件。
- 接收语音:`media.type` 为 `audio`,SILK 会自动转换为 WAV;需要安装 `silk-wasm`。
- 接收视频:`media.type` 为 `video`,文件已下载并解密。
- 接收文件:`media.type` 为 `file`,文件已下载并解密,保留原始文件名。
- 接收引用消息:引用文本会追加到 `request.text`,引用媒体会作为 `media`。
- 接收语音转文字:微信转写结果会作为 `request.text` 传递。
- 发送文本:返回 `{ text: "..." }`。
- 发送图片:返回 `{ media: { type: "image", url: "..." } }`。
- 发送视频:返回 `{ media: { type: "video", url: "..." } }`。
- 发送文件:返回 `{ media: { type: "file", url: "...", fileName: "..." } }`。
- 同时发送文本和媒体:在同一个返回值里同时提供 `text` 和 `media`。
- 发送远程图片:把 `url` 设为 HTTPS 链接,SDK 会自动下载并上传到微信 CDN。
- Monorepo/pnpm 搭建:执行 `git clone https://github.com/wong2/weixin-agent-sdk`;`cd weixin-agent-sdk`;`pnpm install`。
- Monorepo 登录:运行 `pnpm run login -w packages/example-openai`,扫码登录。
- Monorepo 启动 OpenAI bot:运行 `OPENAI_API_KEY=$OPENAI_API_KEY pnpm run start -w packages/example-openai`。
- 处理 session expired(`errcode -14`):SDK 会自动进入 1 小时 cooldown,然后重连,无需手动干预。
- 处理音频无法从 SILK 转 WAV:安装可选依赖 `npm install silk-wasm`。
- 处理重启后 bot 收不到消息:状态持久化在 `~/.openclaw/get_updates_buf`,bot 会自动从上次位置恢复。
- 处理远程图片 URL 发送失败:确保 URL 是 HTTPS 且可公开访问;SDK 会先下载再上传到微信 CDN。
- 处理 `login()` 二维码不显示:确保终端支持渲染二维码,或检查 `~/.openclaw/` 中的原始二维码数据。
适用边界 · 注意事项
- 不适用于非微信渠道(如 Telegram、Slack)或需要企业微信官方 API 的场景。
- 不适用于 Node.js 版本低于 22,或无法完成微信扫码登录/无法持久化 `~/.openclaw/` 凭据的环境。
- 如果已有 ACP-compatible agent 且希望零代码接入,应优先用 `weixin-acp`,而不是自己实现 `Agent`。