SyNodeAi OpenClaw PluginSyNodeAi OpenClaw Plugin 用于把微信私聊 / 群聊接入 OpenClaw使每一条消息都能进入 Agent Runtime触发 Tool / Skill / Workflow 调度。为什么做这个插件微信不只是聊天工具。在 OpenClaw 体系里微信可以被看作高活跃入口天然承载真实用户会话事件源每条消息都可以转换为 Agent Event执行环境每个会话都可以成为独立上下文 Runtime能力承载层可以继续挂载 Tool、Skill、Workflow、ACP 持久会话你可以把它理解为WeChat Event SourceOpenClaw RuntimeAgent Execution UnitTool / Skill Capability Layer ArchitectureWeChat ↓ Channel (SyNodeAi) ↓ OpenClaw Runtime ↓ Agent ↓ Tool / Skill / Workflow ↓ Response → WeChat功能特性通道能力支持微信私聊 / 群聊接入支持 SyNodeAi API Webhook 回调支持消息转 Event支持接入 OpenClaw Channel 体系Agent 执行能力每个会话独立上下文支持 bindings 路由到指定 Agent支持 ACP 持久会话支持群聊 / 私聊细粒度触发策略微信特性支持支持触发 / 引用触发支持引用回复 / 普通回复 /发送者支持撤回消息支持转发已有富消息支持表情 / 名片 / 小程序 / appmsg / 链接等富消息支持群成员目录读取与已知对象缓存媒体与语音能力支持媒体上传支持mediaPublicUrl本地反代支持 S3 兼容上传支持语音自动转 silk支持自动下载rust-silk支持 ffmpeg / ffprobe 处理媒体Demo这不是自动回复而是一次完整的 Agent 调度执行。你可以用它来做 AI 客服自动跟进客户群内智能助手多 Agent 协作执行任务 每一次对话都会触发一次 Agent 执行比如Agent 架构设计微信 × AI 场景Skill / Tool 开发私域自动化玩法快速开始方式一傻瓜式接入点击进入http://synodeai.webotchat.com/openclaw[!NOTE]用户最简单配置接入这个入口最靠谱。方式二从 npm 安装openclaw pluginsinstallsynodeai方式三从本地目录安装openclaw pluginsinstall/path/to/synodeai方式四软链接安装开发调试openclaw pluginsinstall--link/path/to/synodeai方式五从归档安装OpenClaw 支持本地.zip/.tgz/.tar.gz/.taropenclaw pluginsinstall./synodeai.tgz安装或启用插件后需要重启 Gateway。Quickstart推荐新用户用上面的方式1接入只需要 5 分钟你就可以让微信跑起一个 AI Agent第 1 步安装插件openclaw pluginsinstallsynodeai第 2 步登录 SyNodeAi 并获取 Token打开以下地址登录微信并完成绑定获取tokenhttp://synodeai.webotchat.com/quickstart第 3 步复制 json 配置文件到~/.openclaw/openclaw.json将你的配置文件复制到~/.openclaw/openclaw.json{ channels: { synodeai: { enabled: true, token: synodeai-token, webhookHost: 0.0.0.0, webhookPort: 4399, webhookPath: /webhook, autoQuoteReply: false, allowFrom: [], dmPolicy: open, groupPolicy: open, groups: { *: { trigger: { mode: at }, reply: { mode: quote_source } } } } } }第 4 步配置 Webhook内网穿透启动 OpenClaw 前完成Webhook 是 SyNodeAi 将微信消息推送到你本地 OpenClaw 的入口地址必须公网可访问。如在本地环境使用推荐直接用ngrok做内网穿透4.1 安装 ngrokbrewinstallngrok4.2 配置 token注册 ngrok 后获取 token然后执行ngrok config add-authtoken YOUR_TOKENYOUR_TOKEN在 ngrok 官网注册后即可获取4.3 启动穿透ngrok http4399你会看到类似https://xxxx.ngrok-free.app - http://localhost:4399 这个https://xxxx.ngrok-free.app就是你的公网地址第 5 步在 SyNodeAi 填写 webhook把上一步的公网地址按下面格式填写到 SyNodeAihttps://xxxx.ngrok-free.app/webhook第 6 步最后启动 OpenClawopenclaw start第 7 步向机器人发一条微信消息验证可以测试私聊直接发消息群聊中机器人群聊中引用机器人上一条消息继续追问[!IMPORTANT]正确顺序是登录微信SyNodeAi安装 OpenClaw pluginsynodeai复制 json 配置文件到~/.openclaw/openclaw.json配置 ngrok拿到公网地址在 SyNodeAi 填写 webhook最后启动openclaw start Roadmap微信通道接入Agent 调度Tool 调用Skill 插件生态多 Agent 协同开发者平台Github跳转门 https://github.com/Devo919/openclaw-wechat-channel Use Cases私域 AI 销售助手微信群自动运营客户自动跟进系统AI 协作机器人最简配置示例插件配置放在~/.openclaw/openclaw.json的channels.synodeai段落中{ channels: { synodeai: { enabled: true, token: synodeai-token, webhookHost: 0.0.0.0, webhookPort: 4399, webhookPath: /webhook, autoQuoteReply: false, allowFrom: [], dmPolicy: open, groupPolicy: open, groups: { *: { trigger: { mode: at }, reply: { mode: quote_source } } } } } }配置项完整参数说明webhookHost/webhookPort/webhookPathSyNodeAi 回调入口需公网可达常配合 FRP。mediaPath本地媒体服务的路由前缀默认/synodeai-media。mediaPublicUrl本地反代回退时的公网地址前缀可选。配置后会自动拼接媒体 ID通常应与mediaPath对齐。s3Enabled是否启用 S3 兼容上传。s3Endpoint/s3Region/s3Bucket/s3AccessKeyId/s3SecretAccessKeyS3 兼容服务连接参数。s3SessionToken临时凭证可选字段。s3ForcePathStyle是否启用 path-style部分 S3 兼容服务需要。s3UrlModepublic或presigned默认public。s3PublicBaseUrlpublic模式下用于拼接可访问 URL必填。s3PresignExpiresSecpresigned模式签名有效期默认 3600 秒。s3KeyPrefix对象 key 前缀默认synodeai/outbound。allowFrom允许私聊触发的微信 ID或在群里走 allowlist 规则。voiceAutoConvert自动将音频转为 silk默认开启设为false可关闭。silkAutoDownload自动下载rust-silk默认开启可关闭后自行配置voiceSilkPath/voiceDecodePath。silkVersion自动下载的rust-silk版本latest会自动清理旧版本。silkBaseUrl自定义下载源默认 GitHub Releases。silkInstallDir自定义安装目录默认~/.openclaw/tools/rust-silk/version。silkAllowUnverified校验文件缺失时是否允许继续默认false。silkSha256手动指定下载包 SHA256用于私有源或校验文件缺失场景。apiBaseUrlSyNodeAi API 地址默认https://www.synodeaiapi.com。voiceFfmpegPath/videoFfmpegPath/videoFfprobePath自定义 ffmpeg / ffprobe 路径。voiceSilkPath/voiceSilkArgs自定义 silk 编码器路径和参数不使用自动下载时。voiceSilkPipe是否启用 ffmpeg rust-silk 的 stdin/stdout 管道默认关闭失败会回退到临时文件。低频 / 非高并发且磁盘压力不高时推荐临时文件方案更稳定 / 更快。高频 / 多并发或磁盘压力大时推荐 pipe 方案减少磁盘 IO。voiceDecodePath/voiceDecodeArgs/voiceDecodeOutput自定义 silk 解码器入站语音转写用。mediaMaxMb上传媒体大小上限默认 20MB。downloadMinDelayMs/downloadMaxDelayMs入站媒体下载节流。autoQuoteReply是否开启replyToId 纯文本自动引用回复默认开启设为false可关闭。群聊 / 私聊触发与回复规则groups和dms都支持*默认项 精确项覆写groups[*]/groups[roomIdchatroom]dms[*]/dms[wxid]局部规则可继续搭配既有字段一起使用例如allowFrom、skills、systemPrompt、tools仅群聊。群聊触发groups[*].trigger.mode支持at只有被时触发quote只有引用机器人消息时触发at_or_quote或引用机器人消息都触发any_message任何消息都触发群聊默认值是at。群聊回复groups[*].reply.mode支持plain普通回复quote_source首条回复自动引用当前入站消息at_sender首条文本回复自动发送者quote_and_at首条文本回复同时引用并非文本回复会自动退化为quote_source群聊默认值会跟随autoQuoteReply未配置或为true默认quote_source显式设为false默认plain私聊触发与回复dms[*].trigger.mode支持any_messagequotedms[*].reply.mode支持plainquote_source私聊默认触发是any_message。私聊默认回复也会跟随autoQuoteReply回退到quote_source或plain。兼容旧配置requireMention: true/false仍然可用会分别映射到群聊trigger.mode at/any_message新的trigger/reply配置优先级更高autoQuoteReply现在主要用于“未显式配置reply.mode时”的默认值回退示例{ channels: { synodeai: { groupPolicy: open, groups: { *: { trigger: { mode: at }, reply: { mode: quote_source } }, project-roomchatroom: { trigger: { mode: at_or_quote }, reply: { mode: quote_and_at }, skills: [project-skill] }, ops-roomchatroom: { trigger: { mode: any_message }, reply: { mode: plain } } }, dms: { *: { reply: { mode: quote_source } }, wxid_special: { trigger: { mode: quote }, systemPrompt: Only handle quoted follow-ups. } } } } }目录、Allowlist 与状态SyNodeAi 现在补齐了目录、标准 allowlist 适配和状态摘要。目录目录会混合这些来源allowFromgroupAllowFromdmsgroups顶层bindings[]里命中的 SyNodeAi 群运行中见过的私聊对象、群、群成员支持的目录能力self查看当前账号自己的wxid和昵称listPeers查看已知私聊对象listGroups查看已知群listGroupMembers按需读取某个群的实时成员列表其中listGroupMembers会 live 调用 SyNodeAi 的getChatroomInfo结果也会反哺后续名字解析。Allowlist标准/allowlist入口负责顶层两类名单私聊allowFrom群发言人groupAllowFrom如果你要管理某一个群自己的groups.groupId.allowFrom覆盖请用插件工具synodeai_manage_group_allowlist支持inspectaddremovereplaceclear示例{ mode: replace, groupId: ops-roomchatroom, entries: [wxid_admin_1, wxid_admin_2] }如果你就在目标群里调用groupId可以省略工具会自动用当前群。状态SyNodeAi 的状态页现在会额外显示API 是否可达、探测延迟当前账号自己的wxid/ 昵称已知私聊对象数、已知群数、已缓存群成员数显式bindings[]数量群局部 allowlist 覆盖数量pairing 本地 allow-from 数量把群绑定到 Agent / ACP除了channels.synodeai这一段插件配置SyNodeAi 还支持配合 OpenClaw 顶层bindings[]使用。可以把它理解成两层顶层bindings[]决定这个群 / 私聊归哪个 agent或者归哪个 ACP 持久会话groups.groupId.bindingIdentity决定绑定以后机器人在这个群里显示成什么身份绑定到普通 Agent下面这个例子表示ops-roomchatroom这个群固定交给opsagent 处理。{ bindings: [ { type: route, agentId: ops, match: { channel: synodeai, accountId: work, peer: { kind: group, id: ops-roomchatroom } } } ], channels: { synodeai: { accounts: { work: { groups: { ops-roomchatroom: { trigger: { mode: at_or_quote }, reply: { mode: quote_and_at } } } } } } } }说明match.channel写synodeaimatch.accountId可写具体账号也可以写*群聊peer.kind写grouppeer.id直接写群IDchatroombindings[]用于描述群或私聊与 agent 的绑定关系绑定到 ACP 持久会话下面这个例子表示这个群固定进入codexagent 的一个 ACP 持久会话。{ bindings: [ { type: acp, agentId: codex, match: { channel: synodeai, accountId: work, peer: { kind: group, id: repo-roomchatroom } }, acp: { label: repo-room, mode: persistent, cwd: /workspace/repo-a, backend: acpx } } ] }说明SyNodeAi 群没有 Telegram topic / Feishu thread 这种层级所以 ACP 绑定语义是“整群共享一个 ACP 会话”同一个群只配置一种绑定方式不要同时配置普通 route binding 和 ACP binding群里的绑定身份groups.groupId.bindingIdentity用来描述这个群已经绑定到 agent 后机器人在群里应该显示成什么样。当前只同步两项机器人自己的群昵称selfNickname这个群在机器人侧的备注remark不会改群名。{ channels: { synodeai: { groups: { *: { bindingIdentity: { enabled: true, selfNickname: { source: agent_name }, remark: { source: agent_id } } }, repo-roomchatroom: { bindingIdentity: { remark: { source: name_and_id } } } } } } }默认值enabled trueselfNickname.source agent_nameremark.source agent_id可选值selfNickname.source:agent_name | agent_id | literalremark.source:agent_id | agent_name | name_and_id | literal当source literal时需要额外提供value。手动同步群绑定身份插件提供了一个仅 owner 可用的工具synodeai_sync_group_binding。它不会在启动时自动改微信群信息而是采用手动同步流程先配置顶层bindings[]再按需配置groups.groupId.bindingIdentity最后由 owner 调用synodeai_sync_group_binding工具参数{ mode: inspect, groupId: repo-roomchatroom, accountId: work, syncSelfNickname: true, syncRemark: true }三个模式的区别inspect查看当前值、期望值、会改哪些字段dry_run和inspect类似但明确用于准备执行前预演apply只在字段真的发生变化时调用 SyNodeAi API使用限制只接受有显式 binding 的群不会对仅靠默认 main route 命中的群做推断同步bindingIdentity.enabled false的群不能执行同步在非群上下文里调用时必须显式传groupId发送媒体时的 URL 策略本地文件优先上传 S3失败回退mediaPublicUrl本地反代公网 URL先尝试原 URL 发送失败后再尝试上传 S3仍失败回退本地反代富消息与消息复用除了直接构造channelData[synodeai]现在也可以通过共享message工具走标准动作sendreplyunsend并在参数里附带一个synodeai对象来表达微信专属语义。示例在当前群里回复并做部分引用{ action: reply, message: 收到我接着处理, synodeai: { quote: { partialText: 需要继续跟进的那一段 } } }示例撤回一条已经发出的消息{ action: unsend, to: ops-roomchatroom, messageId: 10001, newMessageId: 10002, createTime: 1710000002 }插件支持通过channelData[synodeai]传入 SyNodeAi 专有消息语义。结构如下appMsg: { appmsg }直接发送appmsgXMLquoteReply: { svrid?, title?, atWxid? }发送引用回复未提供svrid时会回退到宿主replyToIdemoji: { emojiMd5, emojiSize }发送表情nameCard: { nickName, nameCardWxid }发送名片miniApp: { miniAppId, displayName, pagePath, coverImgUrl, title, userName }发送小程序revoke: { msgId, newMsgId, createTime }撤回指定消息forward: { kind, xml, coverImgUrl? }复用已存在消息 XML 进行二次转发kind支持image | video | file | link | miniAppminiApp转发额外需要coverImgUrl示例{channelData:{synodeai:{forward:{kind:link,xml:msg.../msg}}}}引用回复示例{channelData:{synodeai:{quoteReply:{svrid:208008054840614808,title:这条是引用回复,atWxid:wxid_member_optional}}}}另外普通文本回复如果带有宿主replyToId插件默认会自动映射为 SyNodeAi 的引用回复气泡媒体、链接、小程序、撤回、转发等既有富消息分支不会被这条自动桥接抢占。若不希望自动引用可在配置里设置autoQuoteReply: false。如果希望让模型主动发“部分引用”SyNodeAi 通道会识别回复末尾的一行隐藏指令[[GEWE_QUOTE_PARTIAL:要引用的原文片段]]插件会在发送前剥离这行指令并自动转成quoteReply.partialText。通常配合宿主replyToId一起使用用来引用当前正在回复的那条消息中的某一段文字。入站appmsg现在会尽量保留复用素材并在上下文中附带MsgType原始 SyNodeAimsgTypeSyNodeAiXml原始 XMLSyNodeAiAppMsgXmlappmsgXMLSyNodeAiAppMsgTypeappmsg的typeSyNodeAiQuoteXml引用消息原始 XML当type57时SyNodeAiQuoteTitle引用回复正文SyNodeAiQuoteType被引用消息类型SyNodeAiQuoteSvrid被引用消息 sidSyNodeAiQuoteFromUsrSyNodeAiQuoteChatUsrSyNodeAiQuoteDisplayNameSyNodeAiQuoteContentSyNodeAiQuoteMsgSource这意味着收到链接、文件通知、引用消息或其他未专门解析的appmsg后可以直接取上下文里的 XML 和引用元数据再走forward/appMsg/quoteReply能力完成复用或继续回复。配置变更后需重启 Gateway。高级用法让未安装插件也出现在 onboarding 列表默认情况下只有已安装的插件会出现在 onboarding 列表中。如果你希望未安装时也能在列表中展示需要配置本地 catalog~/.openclaw/plugins/catalog.json示例{entries:[{name:synodeai,openclaw:{channel:{id:synodeai,label:SyNodeAi,selectionLabel:WeChat (SyNodeAi),detailLabel:WeChat (SyNodeAi),docsPath:/channels/synodeai,docsLabel:synodeai,blurb:WeChat channel via SyNodeAi API and webhook callbacks.,aliases:[synodeai,synodeai,wechat,wx],order:72,quickstartAllowFrom:true},install:{npmSpec:synodeai,defaultChoice:npm}}}]}现在插件已支持 onboarding选择 SyNodeAi 通道后会提示填写 token / appId / webhook / mediaPublicUrl 等配置。依赖npm 依赖zodpeer 依赖openclaw( 2026.1.29)系统级工具ffmpeg/ffprobe用于视频缩略图与时长rust-silk出站语音转 silk 入站语音解码支持自动下载或者自行安装silk-encoder/silk-decoder并在配置中指定路径网络 / 服务依赖SyNodeAi API 服务Webhook 回调需要公网可达可配合 FRP媒体对外地址mediaPublicUrlContributing欢迎一起构建微信 × Agent 的基础设施可以贡献新的 Skill新的 Tool 适配更强的路由 / 调度能力富消息能力扩展Demo 与场景样例文档与排错指南如果这个项目对你有帮助欢迎 Star。
用 OpenClaw + 微信实现 AI 自动回复(附完整接入流程)
SyNodeAi OpenClaw PluginSyNodeAi OpenClaw Plugin 用于把微信私聊 / 群聊接入 OpenClaw使每一条消息都能进入 Agent Runtime触发 Tool / Skill / Workflow 调度。为什么做这个插件微信不只是聊天工具。在 OpenClaw 体系里微信可以被看作高活跃入口天然承载真实用户会话事件源每条消息都可以转换为 Agent Event执行环境每个会话都可以成为独立上下文 Runtime能力承载层可以继续挂载 Tool、Skill、Workflow、ACP 持久会话你可以把它理解为WeChat Event SourceOpenClaw RuntimeAgent Execution UnitTool / Skill Capability Layer ArchitectureWeChat ↓ Channel (SyNodeAi) ↓ OpenClaw Runtime ↓ Agent ↓ Tool / Skill / Workflow ↓ Response → WeChat功能特性通道能力支持微信私聊 / 群聊接入支持 SyNodeAi API Webhook 回调支持消息转 Event支持接入 OpenClaw Channel 体系Agent 执行能力每个会话独立上下文支持 bindings 路由到指定 Agent支持 ACP 持久会话支持群聊 / 私聊细粒度触发策略微信特性支持支持触发 / 引用触发支持引用回复 / 普通回复 /发送者支持撤回消息支持转发已有富消息支持表情 / 名片 / 小程序 / appmsg / 链接等富消息支持群成员目录读取与已知对象缓存媒体与语音能力支持媒体上传支持mediaPublicUrl本地反代支持 S3 兼容上传支持语音自动转 silk支持自动下载rust-silk支持 ffmpeg / ffprobe 处理媒体Demo这不是自动回复而是一次完整的 Agent 调度执行。你可以用它来做 AI 客服自动跟进客户群内智能助手多 Agent 协作执行任务 每一次对话都会触发一次 Agent 执行比如Agent 架构设计微信 × AI 场景Skill / Tool 开发私域自动化玩法快速开始方式一傻瓜式接入点击进入http://synodeai.webotchat.com/openclaw[!NOTE]用户最简单配置接入这个入口最靠谱。方式二从 npm 安装openclaw pluginsinstallsynodeai方式三从本地目录安装openclaw pluginsinstall/path/to/synodeai方式四软链接安装开发调试openclaw pluginsinstall--link/path/to/synodeai方式五从归档安装OpenClaw 支持本地.zip/.tgz/.tar.gz/.taropenclaw pluginsinstall./synodeai.tgz安装或启用插件后需要重启 Gateway。Quickstart推荐新用户用上面的方式1接入只需要 5 分钟你就可以让微信跑起一个 AI Agent第 1 步安装插件openclaw pluginsinstallsynodeai第 2 步登录 SyNodeAi 并获取 Token打开以下地址登录微信并完成绑定获取tokenhttp://synodeai.webotchat.com/quickstart第 3 步复制 json 配置文件到~/.openclaw/openclaw.json将你的配置文件复制到~/.openclaw/openclaw.json{ channels: { synodeai: { enabled: true, token: synodeai-token, webhookHost: 0.0.0.0, webhookPort: 4399, webhookPath: /webhook, autoQuoteReply: false, allowFrom: [], dmPolicy: open, groupPolicy: open, groups: { *: { trigger: { mode: at }, reply: { mode: quote_source } } } } } }第 4 步配置 Webhook内网穿透启动 OpenClaw 前完成Webhook 是 SyNodeAi 将微信消息推送到你本地 OpenClaw 的入口地址必须公网可访问。如在本地环境使用推荐直接用ngrok做内网穿透4.1 安装 ngrokbrewinstallngrok4.2 配置 token注册 ngrok 后获取 token然后执行ngrok config add-authtoken YOUR_TOKENYOUR_TOKEN在 ngrok 官网注册后即可获取4.3 启动穿透ngrok http4399你会看到类似https://xxxx.ngrok-free.app - http://localhost:4399 这个https://xxxx.ngrok-free.app就是你的公网地址第 5 步在 SyNodeAi 填写 webhook把上一步的公网地址按下面格式填写到 SyNodeAihttps://xxxx.ngrok-free.app/webhook第 6 步最后启动 OpenClawopenclaw start第 7 步向机器人发一条微信消息验证可以测试私聊直接发消息群聊中机器人群聊中引用机器人上一条消息继续追问[!IMPORTANT]正确顺序是登录微信SyNodeAi安装 OpenClaw pluginsynodeai复制 json 配置文件到~/.openclaw/openclaw.json配置 ngrok拿到公网地址在 SyNodeAi 填写 webhook最后启动openclaw start Roadmap微信通道接入Agent 调度Tool 调用Skill 插件生态多 Agent 协同开发者平台Github跳转门 https://github.com/Devo919/openclaw-wechat-channel Use Cases私域 AI 销售助手微信群自动运营客户自动跟进系统AI 协作机器人最简配置示例插件配置放在~/.openclaw/openclaw.json的channels.synodeai段落中{ channels: { synodeai: { enabled: true, token: synodeai-token, webhookHost: 0.0.0.0, webhookPort: 4399, webhookPath: /webhook, autoQuoteReply: false, allowFrom: [], dmPolicy: open, groupPolicy: open, groups: { *: { trigger: { mode: at }, reply: { mode: quote_source } } } } } }配置项完整参数说明webhookHost/webhookPort/webhookPathSyNodeAi 回调入口需公网可达常配合 FRP。mediaPath本地媒体服务的路由前缀默认/synodeai-media。mediaPublicUrl本地反代回退时的公网地址前缀可选。配置后会自动拼接媒体 ID通常应与mediaPath对齐。s3Enabled是否启用 S3 兼容上传。s3Endpoint/s3Region/s3Bucket/s3AccessKeyId/s3SecretAccessKeyS3 兼容服务连接参数。s3SessionToken临时凭证可选字段。s3ForcePathStyle是否启用 path-style部分 S3 兼容服务需要。s3UrlModepublic或presigned默认public。s3PublicBaseUrlpublic模式下用于拼接可访问 URL必填。s3PresignExpiresSecpresigned模式签名有效期默认 3600 秒。s3KeyPrefix对象 key 前缀默认synodeai/outbound。allowFrom允许私聊触发的微信 ID或在群里走 allowlist 规则。voiceAutoConvert自动将音频转为 silk默认开启设为false可关闭。silkAutoDownload自动下载rust-silk默认开启可关闭后自行配置voiceSilkPath/voiceDecodePath。silkVersion自动下载的rust-silk版本latest会自动清理旧版本。silkBaseUrl自定义下载源默认 GitHub Releases。silkInstallDir自定义安装目录默认~/.openclaw/tools/rust-silk/version。silkAllowUnverified校验文件缺失时是否允许继续默认false。silkSha256手动指定下载包 SHA256用于私有源或校验文件缺失场景。apiBaseUrlSyNodeAi API 地址默认https://www.synodeaiapi.com。voiceFfmpegPath/videoFfmpegPath/videoFfprobePath自定义 ffmpeg / ffprobe 路径。voiceSilkPath/voiceSilkArgs自定义 silk 编码器路径和参数不使用自动下载时。voiceSilkPipe是否启用 ffmpeg rust-silk 的 stdin/stdout 管道默认关闭失败会回退到临时文件。低频 / 非高并发且磁盘压力不高时推荐临时文件方案更稳定 / 更快。高频 / 多并发或磁盘压力大时推荐 pipe 方案减少磁盘 IO。voiceDecodePath/voiceDecodeArgs/voiceDecodeOutput自定义 silk 解码器入站语音转写用。mediaMaxMb上传媒体大小上限默认 20MB。downloadMinDelayMs/downloadMaxDelayMs入站媒体下载节流。autoQuoteReply是否开启replyToId 纯文本自动引用回复默认开启设为false可关闭。群聊 / 私聊触发与回复规则groups和dms都支持*默认项 精确项覆写groups[*]/groups[roomIdchatroom]dms[*]/dms[wxid]局部规则可继续搭配既有字段一起使用例如allowFrom、skills、systemPrompt、tools仅群聊。群聊触发groups[*].trigger.mode支持at只有被时触发quote只有引用机器人消息时触发at_or_quote或引用机器人消息都触发any_message任何消息都触发群聊默认值是at。群聊回复groups[*].reply.mode支持plain普通回复quote_source首条回复自动引用当前入站消息at_sender首条文本回复自动发送者quote_and_at首条文本回复同时引用并非文本回复会自动退化为quote_source群聊默认值会跟随autoQuoteReply未配置或为true默认quote_source显式设为false默认plain私聊触发与回复dms[*].trigger.mode支持any_messagequotedms[*].reply.mode支持plainquote_source私聊默认触发是any_message。私聊默认回复也会跟随autoQuoteReply回退到quote_source或plain。兼容旧配置requireMention: true/false仍然可用会分别映射到群聊trigger.mode at/any_message新的trigger/reply配置优先级更高autoQuoteReply现在主要用于“未显式配置reply.mode时”的默认值回退示例{ channels: { synodeai: { groupPolicy: open, groups: { *: { trigger: { mode: at }, reply: { mode: quote_source } }, project-roomchatroom: { trigger: { mode: at_or_quote }, reply: { mode: quote_and_at }, skills: [project-skill] }, ops-roomchatroom: { trigger: { mode: any_message }, reply: { mode: plain } } }, dms: { *: { reply: { mode: quote_source } }, wxid_special: { trigger: { mode: quote }, systemPrompt: Only handle quoted follow-ups. } } } } }目录、Allowlist 与状态SyNodeAi 现在补齐了目录、标准 allowlist 适配和状态摘要。目录目录会混合这些来源allowFromgroupAllowFromdmsgroups顶层bindings[]里命中的 SyNodeAi 群运行中见过的私聊对象、群、群成员支持的目录能力self查看当前账号自己的wxid和昵称listPeers查看已知私聊对象listGroups查看已知群listGroupMembers按需读取某个群的实时成员列表其中listGroupMembers会 live 调用 SyNodeAi 的getChatroomInfo结果也会反哺后续名字解析。Allowlist标准/allowlist入口负责顶层两类名单私聊allowFrom群发言人groupAllowFrom如果你要管理某一个群自己的groups.groupId.allowFrom覆盖请用插件工具synodeai_manage_group_allowlist支持inspectaddremovereplaceclear示例{ mode: replace, groupId: ops-roomchatroom, entries: [wxid_admin_1, wxid_admin_2] }如果你就在目标群里调用groupId可以省略工具会自动用当前群。状态SyNodeAi 的状态页现在会额外显示API 是否可达、探测延迟当前账号自己的wxid/ 昵称已知私聊对象数、已知群数、已缓存群成员数显式bindings[]数量群局部 allowlist 覆盖数量pairing 本地 allow-from 数量把群绑定到 Agent / ACP除了channels.synodeai这一段插件配置SyNodeAi 还支持配合 OpenClaw 顶层bindings[]使用。可以把它理解成两层顶层bindings[]决定这个群 / 私聊归哪个 agent或者归哪个 ACP 持久会话groups.groupId.bindingIdentity决定绑定以后机器人在这个群里显示成什么身份绑定到普通 Agent下面这个例子表示ops-roomchatroom这个群固定交给opsagent 处理。{ bindings: [ { type: route, agentId: ops, match: { channel: synodeai, accountId: work, peer: { kind: group, id: ops-roomchatroom } } } ], channels: { synodeai: { accounts: { work: { groups: { ops-roomchatroom: { trigger: { mode: at_or_quote }, reply: { mode: quote_and_at } } } } } } } }说明match.channel写synodeaimatch.accountId可写具体账号也可以写*群聊peer.kind写grouppeer.id直接写群IDchatroombindings[]用于描述群或私聊与 agent 的绑定关系绑定到 ACP 持久会话下面这个例子表示这个群固定进入codexagent 的一个 ACP 持久会话。{ bindings: [ { type: acp, agentId: codex, match: { channel: synodeai, accountId: work, peer: { kind: group, id: repo-roomchatroom } }, acp: { label: repo-room, mode: persistent, cwd: /workspace/repo-a, backend: acpx } } ] }说明SyNodeAi 群没有 Telegram topic / Feishu thread 这种层级所以 ACP 绑定语义是“整群共享一个 ACP 会话”同一个群只配置一种绑定方式不要同时配置普通 route binding 和 ACP binding群里的绑定身份groups.groupId.bindingIdentity用来描述这个群已经绑定到 agent 后机器人在群里应该显示成什么样。当前只同步两项机器人自己的群昵称selfNickname这个群在机器人侧的备注remark不会改群名。{ channels: { synodeai: { groups: { *: { bindingIdentity: { enabled: true, selfNickname: { source: agent_name }, remark: { source: agent_id } } }, repo-roomchatroom: { bindingIdentity: { remark: { source: name_and_id } } } } } } }默认值enabled trueselfNickname.source agent_nameremark.source agent_id可选值selfNickname.source:agent_name | agent_id | literalremark.source:agent_id | agent_name | name_and_id | literal当source literal时需要额外提供value。手动同步群绑定身份插件提供了一个仅 owner 可用的工具synodeai_sync_group_binding。它不会在启动时自动改微信群信息而是采用手动同步流程先配置顶层bindings[]再按需配置groups.groupId.bindingIdentity最后由 owner 调用synodeai_sync_group_binding工具参数{ mode: inspect, groupId: repo-roomchatroom, accountId: work, syncSelfNickname: true, syncRemark: true }三个模式的区别inspect查看当前值、期望值、会改哪些字段dry_run和inspect类似但明确用于准备执行前预演apply只在字段真的发生变化时调用 SyNodeAi API使用限制只接受有显式 binding 的群不会对仅靠默认 main route 命中的群做推断同步bindingIdentity.enabled false的群不能执行同步在非群上下文里调用时必须显式传groupId发送媒体时的 URL 策略本地文件优先上传 S3失败回退mediaPublicUrl本地反代公网 URL先尝试原 URL 发送失败后再尝试上传 S3仍失败回退本地反代富消息与消息复用除了直接构造channelData[synodeai]现在也可以通过共享message工具走标准动作sendreplyunsend并在参数里附带一个synodeai对象来表达微信专属语义。示例在当前群里回复并做部分引用{ action: reply, message: 收到我接着处理, synodeai: { quote: { partialText: 需要继续跟进的那一段 } } }示例撤回一条已经发出的消息{ action: unsend, to: ops-roomchatroom, messageId: 10001, newMessageId: 10002, createTime: 1710000002 }插件支持通过channelData[synodeai]传入 SyNodeAi 专有消息语义。结构如下appMsg: { appmsg }直接发送appmsgXMLquoteReply: { svrid?, title?, atWxid? }发送引用回复未提供svrid时会回退到宿主replyToIdemoji: { emojiMd5, emojiSize }发送表情nameCard: { nickName, nameCardWxid }发送名片miniApp: { miniAppId, displayName, pagePath, coverImgUrl, title, userName }发送小程序revoke: { msgId, newMsgId, createTime }撤回指定消息forward: { kind, xml, coverImgUrl? }复用已存在消息 XML 进行二次转发kind支持image | video | file | link | miniAppminiApp转发额外需要coverImgUrl示例{channelData:{synodeai:{forward:{kind:link,xml:msg.../msg}}}}引用回复示例{channelData:{synodeai:{quoteReply:{svrid:208008054840614808,title:这条是引用回复,atWxid:wxid_member_optional}}}}另外普通文本回复如果带有宿主replyToId插件默认会自动映射为 SyNodeAi 的引用回复气泡媒体、链接、小程序、撤回、转发等既有富消息分支不会被这条自动桥接抢占。若不希望自动引用可在配置里设置autoQuoteReply: false。如果希望让模型主动发“部分引用”SyNodeAi 通道会识别回复末尾的一行隐藏指令[[GEWE_QUOTE_PARTIAL:要引用的原文片段]]插件会在发送前剥离这行指令并自动转成quoteReply.partialText。通常配合宿主replyToId一起使用用来引用当前正在回复的那条消息中的某一段文字。入站appmsg现在会尽量保留复用素材并在上下文中附带MsgType原始 SyNodeAimsgTypeSyNodeAiXml原始 XMLSyNodeAiAppMsgXmlappmsgXMLSyNodeAiAppMsgTypeappmsg的typeSyNodeAiQuoteXml引用消息原始 XML当type57时SyNodeAiQuoteTitle引用回复正文SyNodeAiQuoteType被引用消息类型SyNodeAiQuoteSvrid被引用消息 sidSyNodeAiQuoteFromUsrSyNodeAiQuoteChatUsrSyNodeAiQuoteDisplayNameSyNodeAiQuoteContentSyNodeAiQuoteMsgSource这意味着收到链接、文件通知、引用消息或其他未专门解析的appmsg后可以直接取上下文里的 XML 和引用元数据再走forward/appMsg/quoteReply能力完成复用或继续回复。配置变更后需重启 Gateway。高级用法让未安装插件也出现在 onboarding 列表默认情况下只有已安装的插件会出现在 onboarding 列表中。如果你希望未安装时也能在列表中展示需要配置本地 catalog~/.openclaw/plugins/catalog.json示例{entries:[{name:synodeai,openclaw:{channel:{id:synodeai,label:SyNodeAi,selectionLabel:WeChat (SyNodeAi),detailLabel:WeChat (SyNodeAi),docsPath:/channels/synodeai,docsLabel:synodeai,blurb:WeChat channel via SyNodeAi API and webhook callbacks.,aliases:[synodeai,synodeai,wechat,wx],order:72,quickstartAllowFrom:true},install:{npmSpec:synodeai,defaultChoice:npm}}}]}现在插件已支持 onboarding选择 SyNodeAi 通道后会提示填写 token / appId / webhook / mediaPublicUrl 等配置。依赖npm 依赖zodpeer 依赖openclaw( 2026.1.29)系统级工具ffmpeg/ffprobe用于视频缩略图与时长rust-silk出站语音转 silk 入站语音解码支持自动下载或者自行安装silk-encoder/silk-decoder并在配置中指定路径网络 / 服务依赖SyNodeAi API 服务Webhook 回调需要公网可达可配合 FRP媒体对外地址mediaPublicUrlContributing欢迎一起构建微信 × Agent 的基础设施可以贡献新的 Skill新的 Tool 适配更强的路由 / 调度能力富消息能力扩展Demo 与场景样例文档与排错指南如果这个项目对你有帮助欢迎 Star。