docs(wxoa): update setup guide and explain automatic reply fallback

This commit is contained in:
Hyu
2026-10-09 20:22:45 +08:00
parent b8059973fc
commit e6d92319a6
8 changed files with 191 additions and 50 deletions
+39 -10
View File
@@ -8,17 +8,46 @@ Deploy WeChat Official Account bot to connect with LangBot.
## LangBot WeChat Official Account Integration Modes
Currently, LangBot provides two ways to integrate with WeChat Official Accounts:
The current Official Account adapter supports three modes. Save the bot configuration after changing the mode. Existing bots keep their selected mode; the default remains `drop`. The legacy adapter does not offer `auto`.
1. **Traditional Message Exchange Mode**
- Official accounts require requests to be processed within **15 seconds**, AI-generated content that exceeds this timeout cannot be sent.
- When AI content generation timeout occurs, LangBot will print request timeout information in the console.
| Mode | How replies are delivered |
| --- | --- |
| `auto` | Returns a loading message, processes the request in the background, then tries the customer service API. If restricted, queues the answer for retrieval with the next message. |
| `passive` | Returns a loading message and queues the answer. The user sends another message to retrieve it. Does not call the customer service API. |
| `drop` (default) | Replies within the current callback. Suitable for replies completed within 5 seconds. Does not use the customer service API or fall back to retrieval. |
2. **"Send Any Text to Get Reply" Mode**
- This method can break the **15 second** limit, but **very long text** may not be sent successfully.
- When using this method, after sending a message to the official account, it will reply "AI is thinking, please send any content to get the answer". At this point, you need to send any content to get the answer.
### How auto works
For more complex functionality, please contact the **LangBot team** for customized support.
`auto` does not query the account's verification status in advance. When the processor sends its reply, LangBot calls the customer service API and uses the actual result:
- Success: the user receives the answer without sending another message.
- Permission denied (`48001`), expired reply window (`45015`), exhausted quota (`45047`), or recipient not following the account (`43004`): the answer is queued for retrieval with the next message.
- Other failures, including credentials, IP whitelist and network errors: an error is recorded instead of treating the failure as a permission restriction.
This decision is made for each reply. An initial loading message does not mean the answer has been generated; check processor execution logs if no answer arrives.
### Verification and reply windows
Callbacks require a response within **5 seconds**, regardless of verification. `drop` uses this callback; WeChat retries do not provide a reliable 15-second generation window. See the [official passive reply documentation](https://developers.weixin.qq.com/doc/service/guide/product/message/Passive_user_reply_message.html).
Customer service messages can be sent after the callback ends. WeChat currently requires enterprise verification for Official Accounts and Service Accounts to use this API. Identity verification alone does not grant this permission; actual account permissions and API responses determine availability.
| User action | Customer service message quota | Validity |
| --- | --- | --- |
| Sends a message | 5 messages | 48 hours |
| Clicks an eligible custom menu, follows the account, or scans a QR code | 3 messages | 1 minute |
These are platform limits, not AI generation timeouts. Consult the [official customer service API documentation](https://developers.weixin.qq.com/doc/service/api/customer/message/api_sendcustommessage) for current rules.
### Retrieving replies
In `passive`, or after `auto` falls back, the next message retrieves the previous answer and is **not also processed as a new question**. If the answer is still being generated, the loading message is returned again. Retrieve the answer before sending a new question.
`LoadingMessage` applies to both `auto` and `passive`, not `drop`. For `auto`, use wording such as “Processing your request. If no answer arrives, send any message later to retrieve it.” If empty, LangBot acknowledges the callback without a visible loading message.
Queued replies are stored in memory and cleared when LangBot restarts or the bot configuration is reloaded. All modes remain subject to WeChat content and message-length limits.
Route incoming messages to a processor. Reply modes do not automatically send every Agent text output: approve the reply-to-current-conversation tool and instruct the Agent to use it. Plugin processors must call the reply API.
## Create Bot
@@ -52,8 +81,8 @@ At this point, open the LangBot Webui page, create a new bot, and fill in the fo
![Set Development Items](/images/zh/deploy/bots/wxoa/connect_to_langbot.png)
In the configuration items, the `Mode` option is the selected integration mode, where the default is `drop`. `drop` is the traditional message exchange mode, and `passive` is the "send any text to get reply" mode.
Select `auto`, `passive`, or `drop` in `Mode` using the comparison above. The default is `drop`.
The `LoadingMessage` option is the loading message, which can be changed to other content, and is only valid when the mode is `passive`. Set `enable` to `true`.
The `LoadingMessage` option controls the loading message for `auto` and `passive`. Set `enable` to `true`.
After filling in successfully, on the LangBot homepage, enable and select the corresponding bot, click to enter the configuration page, copy the Webhook callback address, return to the WeChat Official Account bot configuration page, and fill it into `URL`. For example, if the URL is filled as `https://your_domain_name/bots/xxxxx`, where `your_domain_name` is the domain name filled in Caddy. Click Save. If it can be saved successfully, it means the deployment is successful. If you see **System error, please try again later**, please recheck whether the above configuration content is filled in correctly.
Binary file not shown.

After

Width:  |  Height:  |  Size: 91 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 143 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 MiB

+39 -10
View File
@@ -8,17 +8,46 @@ WeChat Official Account ボットをデプロイして LangBot に接続しま
## LangBot WeChat Official Account 統合モード
現在、LangBot は WeChat Official Accounts と統合する 2 つの方法を提供しています:
新しい公式アカウントアダプターでは、次の 3 種類を選択できます。変更後はボット設定を保存してください。既存の設定は自動変更されず、デフォルトは `drop` です。旧版アダプターには `auto` はありません。
1. **従来のメッセージ交換モード**
- 公式アカウントはリクエストを **15 秒**以内に処理する必要があり、このタイムアウトを超える AI 生成コンテンツは送信できません。
- AI コンテンツ生成のタイムアウトが発生すると、LangBot はコンソールにリクエストタイムアウト情報を出力します。
| モード | 返信の仕組み |
| --- | --- |
| `auto` | 処理中のメッセージを返し、バックグラウンドで回答を生成します。カスタマーサービス API で送信し、利用制限がある場合は次のメッセージで受け取る方式に切り替えます。 |
| `passive` | 処理中のメッセージを返し、回答を保存します。ユーザーが再度メッセージを送ると受け取れます。カスタマーサービス API は呼び出しません。 |
| `drop`(デフォルト) | 現在のコールバック内で返信します。5 秒以内に完了する処理向けです。カスタマーサービス API や受け取り方式への切り替えは使用しません。 |
2. **「任意のテキストを送信して返信を取得」モード**
- この方法は **15 秒**の制限を破ることができますが、**非常に長いテキスト**は正常に送信されない場合があります。
- この方法を使用する場合、公式アカウントにメッセージを送信すると、「AI が考えています。回答を得るには任意のコンテンツを送信してください」と返信されます。この時点で、回答を得るために任意のコンテンツを送信する必要があります。
### auto の判定方法
より複雑な機能については、カスタマイズされたサポートのために **LangBot チーム**にお問い合わせください。
`auto` は認証状態を事前に取得しません。処理器が回答を送信する際にカスタマーサービス API を呼び出し、その結果で判定します。
- 成功した場合、追加メッセージを送らずに回答を受信できます。
- 権限不足(`48001`)、返信期限切れ(`45015`)、送信枠の上限(`45047`)、受信者が未フォロー(`43004`)の場合、回答を保存し、次のメッセージで受け取れるようにします。
- 認証情報、IP ホワイトリスト、ネットワークなどのその他のエラーは記録されます。一律に権限不足として扱うことはありません。
判定は返信ごとに行います。処理中の表示は回答の生成完了を意味しません。回答が届かない場合は処理器の実行ログを確認してください。
### 認証と返信期限
コールバックには認証の有無にかかわらず **5 秒以内**に応答する必要があります。`drop` はこの仕組みを使います。WeChat の再試行を安定した 15 秒の生成時間として利用することはできません。[公式の受動返信ドキュメント](https://developers.weixin.qq.com/doc/service/guide/product/message/Passive_user_reply_message.html)を参照してください。
カスタマーサービス API ではコールバック終了後も返信できます。現在の公式仕様では、公式アカウントとサービスアカウントは企業主体の認証が必要です。本人確認だけでこの権限が付与されるわけではありません。利用可否は実際の権限と API の応答で決まります。
| ユーザーの操作 | 送信可能数 | 有効期限 |
| --- | --- | --- |
| メッセージを送信 | 5 件 | 48 時間 |
| 対象のカスタムメニューをクリック、フォロー、QR コードをスキャン | 3 件 | 1 分 |
これは AI の生成タイムアウトではなく、プラットフォームの制限です。最新の条件は[公式のカスタマーサービス API ドキュメント](https://developers.weixin.qq.com/doc/service/api/customer/message/api_sendcustommessage)を確認してください。
### 回答の受け取り
`passive` または `auto` の切り替え後は、次のメッセージは前の回答の受け取りに使われ、**同時に新しい質問として処理されません**。回答が未完成なら処理中の表示を再度返します。回答を受け取ってから新しい質問を送ってください。
`LoadingMessage` は `auto` と `passive` に適用され、`drop` には適用されません。`auto` では「処理中です。回答が届かない場合は、しばらくしてから任意のメッセージを送って受け取ってください」などを設定できます。空欄の場合は表示用のメッセージを送らずにコールバックの受信を確認します。
回答はメモリ上に保存され、LangBot の再起動やボット設定の再読み込みで消去されます。どのモードでも WeChat の内容や文字数の制限が適用されます。
イベントルーティングで処理器を接続してください。モードは Agent のすべてのテキスト出力を自動送信するものではありません。Agent には現在の会話への返信ツールを許可して使用するよう指示してください。プラグイン処理器は返信 API を呼び出す必要があります。
## ボットの作成
@@ -52,8 +81,8 @@ WeChat Official Accounts は http(ポート 80)と https(ポート 443)
![Set Development Items](/images/zh/deploy/bots/wxoa/connect_to_langbot.png)
設定項目の「Mode」オプションは、選択された統合モードです。デフォルトは「drop」です。「drop」は従来のメッセージ交換モードで、「passive」は「任意のテキストを送信して返信を取得」モードです。
設定項目の「Mode」で、上記の比較を参考に `auto`、`passive`、`drop` を選択してください。デフォルトは `drop` です。
「LoadingMessage」オプションはローディングメッセージで、他のコンテンツに変更でき、モードが「passive」の場合にのみ有効です。「enable」を「true」に設定します。
「LoadingMessage」は `auto` と `passive` の処理中メッセージを設定します。「enable」を「true」に設定します。
正常に入力した後、LangBot ホームページで対応するボットを有効にして選択し、設定ページをクリックして入り、Webhook コールバックアドレスをコピーし、WeChat Official Account ボット設定ページに戻って「URL」に入力します。たとえば、URL を「https://your_domain_name/bots/xxxxx」として入力します。ここで「your_domain_name」は Caddy に入力したドメイン名です。保存をクリックします。正常に保存できれば、デプロイは成功です。**システムエラー、後でもう一度お試しください**が表示された場合は、上記の設定内容が正しく入力されているかどうかを再確認してください。
+113 -30
View File
@@ -1,59 +1,142 @@
---
title: "微信公众号"
description: "用 LangBot 搭建微信公众号 AI 机器人,将大模型接入你的微信公众号。"
description: "通过微信开发者平台配置消息推送,将微信公众号接入 LangBot。"
icon: "/images/platforms/wechat.svg"
---
部署微信公众号机器人接入 LangBot 。
本教程使用微信公众平台完成账号注册和主体实名认证,在微信开发者平台配置应用密钥、消息推送和 API IP 白名单。
## LangBot 微信公众号接入模式
## 1. 注册公众号并完成主体实名认证
目前,LangBot 提供两种方式接入微信公众号:
进入[微信公众平台](https://mp.weixin.qq.com/)。已有公众号可直接扫码登录;尚未注册时,点击「立即注册」,选择「公众号」,按提示完成注册。
1. **传统收发消息模式**
- 公众号要求请求必须在 **15 秒内** 处理完成,超时的 AI 生成内容将无法发送。
- 当 AI 生成内容超时发生后,LangBot 会在控制台打印请求超时信息。
进入「设置与开发 → 账号设置 → 账号详情」,找到页面底部的「主体信息」,点击「详情」。如果显示「待完善」,请先完成主体信息。
2. **“发送任意文字回复消息”模式**
- 该方法可突破 **15 秒** 限制,但 **过长的文本** 可能无法成功发送。
- 使用此方法时,给公众号发消息,公众号会回复“AI正在思考中,请发送任意内容获取回答”,此时,需要发送任意内容获取回答。
![账号详情页面底部的主体信息入口](/images/zh/deploy/bots/wxoa/account-details.png)
如需更复杂的功能,请联系 **LangBot 团队** 进行定制化支持。
在主体信息页面点击「实名验证」,按照微信提示完成实名认证。
## 创建机器人
![主体信息页面的实名验证按钮](/images/zh/deploy/bots/wxoa/identity-verification.png)
进入[微信公众平台](https://mp.weixin.qq.com/),如果已经有公众号账号,那么直接扫码登录,进入控制台。
如果之前没有注册过公众号,那么点击立即注册,选择 `公众号`,依次填写信息,进入控制台。控制台是这样的:
![控制台页面](/images/zh/deploy/bots/wxoa/wxoa1.png)
<Note>
这里需要完成的是「主体信息」中的实名验证。账号详情中还有「申请微信认证」「个人认证」等入口,请按截图进入主体信息页面操作。
</Note>
## 2. 获取应用信息并创建 LangBot 机器人
## 设置回调地址
前往[微信开发者平台](https://developers.weixin.qq.com/platform),进入公众号设置,选择要接入的公众号,打开「基础信息」。页面包含 AppID、「开发密钥」以及「域名与消息推送配置」。
![微信开发者平台的公众号基础信息、开发密钥及消息推送入口](/images/zh/deploy/bots/wxoa/developer-platform.png)
在 LangBot 中新建机器人,选择「微信公众号」适配器,进入机器人配置页:
1. 复制微信开发者平台中的 **AppID**,填写到 LangBot 的「应用 ID」。
2. 在微信开发者平台的「开发密钥」区域点击 AppSecret 的「重置」,按提示获取密钥,填写到 LangBot 的「应用密钥」。首次使用时,如果按钮显示为「启用」,先按提示启用 AppSecret。
3. 点击 LangBot 的「保存并启用」,保存机器人并启用。
下面是 LangBot 适配器配置区域。图中的「令牌」和「消息加解密密钥」会在下一步与微信平台一起配置。
![LangBot 微信公众号适配器的回调地址及配置字段](/images/zh/deploy/bots/wxoa/langbot-adapter-settings.png)
## 3. 启用消息推送并配置回调
回到微信开发者平台,在「基础信息」页面下方的「域名与消息推送配置」区域,点击「消息推送」旁的「启用」。
在「配置消息推送」弹窗中按以下顺序填写,暂时不要点击「确定」:
1. **URL**:复制 LangBot 机器人配置页显示的完整「Webhook 回调地址」并粘贴。地址通常为 `https://你的域名/bots/机器人UUID`,请保留完整路径。
2. **Token**:自行设置一个符合微信页面要求的 Token,并将同一个值填入 LangBot 的「令牌」。两边必须完全一致。
3. **EncodingAESKey**:点击微信平台的「随机生成」,复制生成的值,填入 LangBot 的「消息加解密密钥」。
4. **消息加密**:选择「安全模式(推荐)」。
5. **数据格式**:选择 **XML**。
![微信开发者平台的配置消息推送弹窗](/images/zh/deploy/bots/wxoa/message-push.png)
两个平台的配置对应关系如下:
| 微信开发者平台 | LangBot |
| --- | --- |
| AppID | 应用 ID |
| AppSecret | 应用密钥 |
| URL | Webhook 回调地址(从 LangBot 复制) |
| Token | 令牌 |
| EncodingAESKey | 消息加解密密钥 |
保持微信平台弹窗开启,回到 LangBot **再次保存机器人**。确认机器人已启用且配置成功应用后,再回到微信平台点击「确定」。微信会访问回调地址进行验证,通过后消息推送配置即完成。
<Tip>
**微信公众号需要公网域名和 HTTPS。** 如果你没有服务器,[LangBot Cloud](https://space.langbot.app/cloud) 自带域名解析,注册即可直接使用。
Webhook 回调地址需要能够从公网访问,建议使用 HTTPS。自部署可参考[配置 HTTP 反向代理和 SSL](/zh/workshop/production/proxy-and-ssl),将公网域名转发到 LangBot 服务。使用 HTTP 时需使用 80 端口,HTTPS 使用 443 端口。
如页面显示的仍是本地地址,请将实例 `data/config.yaml` 中的 `api.webhook_prefix` 设置为公网地址,例如 `https://bot.example.com`,重启 LangBot 后重新复制回调地址。[LangBot Cloud](https://space.langbot.app/cloud) 提供可直接使用的公网回调地址。
</Tip>
### 获取配置项
### 常见错误:请求失败,HTTP 返回非 200
点击`设置与开发`,`开发接口管理`,出现这样的页面:
![设置开发项](/images/zh/deploy/bots/wxoa/wxoa2.png)
如果点击微信平台的「确定」后出现此提示,请依次检查:
记录下来`开发者ID(AppID)`,`开发者密码(AppSecret)`,并将部署 LangBot 的服务器添加入`IP白名单`。
- **URL 正确且公网可达**:使用 LangBot 显示的完整回调地址,包含 `/bots/机器人UUID`。本机地址、内网地址或仅填写域名首页均不能作为此机器人的回调地址。
- **机器人已保存并启用**:填写 Token 和 EncodingAESKey 后,需要先在 LangBot 保存,再在微信平台确认。
- **字段一致**:Token、EncodingAESKey 必须与 LangBot 完全一致;AppID、AppSecret 必须属于当前选择的公众号,复制时不要带入多余空格或换行。
- **转发配置有效**:检查反向代理或隧道是否仍在运行、HTTPS 证书是否有效,以及回调是否被登录验证或访问控制拦截。
### 为 LangBot 设置反向代理
旧界面可能显示「系统发生错误,请稍后重试」,同样可以按上述项目检查,并查看 LangBot 的机器人日志定位错误。
由于微信公众号的只支持http(80端口),https(443端口),请根据文档[配置 HTTP 反向代理和 SSL](/zh/workshop/production/proxy-and-ssl) 操作。
## 4. 配置 API IP 白名单
### 保存回调地址
在微信开发者平台「基础信息 → 开发密钥」中找到 **API IP 白名单**,填入部署 LangBot 的服务器访问微信 API 时使用的**公网出站 IP**,保存配置。截图中未启用 AppSecret 时,该项会提示「启用 AppSecret 后,可配置」。
点击设置服务器配置,输入`Token`,`EncodingAESKey`,并将消息加解密方式改为`安全模式`。
可以从服务器或云平台的网络配置中查找出站 IP。如果 LangBot 通过 NAT 网关或代理访问微信 API,应填写实际出口的公网 IP;存在多个出口时,按微信页面要求将它们加入白名单。
至此,打开 LangBot Webui 页面,创建一个新的机器人,将获取到的四个配置项( AppID , AppSecret , token , EncodingAESKey )填入
<Note>
回调 URL 用于微信向 LangBot 推送事件;API IP 白名单用于 LangBot 调用微信接口。使用反向代理或 Cloudflare Tunnel 提供回调地址时,白名单仍应填写 LangBot 访问微信 API 的出站 IP,而不是回调域名解析出的 CDN 地址。
</Note>
![设置开发项](/images/zh/deploy/bots/wxoa/connect_to_langbot.png)
## 接入模式与后续使用
在配置项中,`Mode`选项为选择的接入模式,其中默认为`drop`,`drop` 为传统收发消息模式,`passive` 为发送任意文字获取回复模式。
在新版「微信公众号」适配器的「接入模式」中选择回复方式,保存后生效。已有机器人不会自动切换模式;默认值仍为 `drop`。旧版适配器不提供 `auto`,请使用新版适配器。
`LoadingMessage`选项为加载信息,可以更改为其他内容,仅在模式为`passive`下有效。将 `enable` 设置为 `true` 。
| 接入模式(Mode) | 回复机制 | 适用场景 |
| --- | --- | --- |
| `auto` | 先返回加载提示,后台生成回复;通过客服接口发送,受限时改为下一条消息领取。 | 希望生成完成后直接收到回复,或不确定账号是否具有客服接口权限。 |
| `passive` | 先返回加载提示,后台生成回复;用户再发任意内容领取,不调用客服接口。 | 没有客服接口权限,或希望始终使用领取方式。 |
| `drop`(默认) | 在当前微信回调内直接返回回复,不调用客服接口,也不会自动转为领取方式。 | 能在 5 秒内完成的快速回复;不适合耗时较长的 AI 生成。 |
填写成功后,在 LangBot 主页中,启用并选择对应的机器人,点击进入配置页面,复制其中的 Webhook 回调地址,返回微信公众号机器人配置页面,填写到`URL`。比如 URL 填写为`https://your_domain_name/bots/xxxxx`,其中的 `your_domain_name` 就是 Caddy 中填写的域名。点击保存。如果可以保存成功,那么意味着部署成功。如果出现**系统发生错误,请稍后重试**,那么请重新检查以上配置内容是否填写正确。
### auto 如何自动选择回复方式?
`auto` 不会预先查询或要求填写账号认证状态,而是在处理器发送回复时,根据微信客服接口的实际返回结果决定:
1. 收到用户消息后,先返回加载提示,处理器在后台继续运行。
2. 处理器生成并发送回复时,LangBot 尝试调用客服接口。成功后,用户直接收到回复,不必再发消息领取。
3. 微信明确返回无接口权限(`48001`)、超过回复时限(`45015`)、下发额度用尽(`45047`)或接收者未关注(`43004`)时,LangBot 缓存回复。用户随后向公众号发送任意内容,即可通过这次回调领取。
这个判断针对每次回复,不会把账号永久标记为“无权限”。AppID、AppSecret、IP 白名单错误以及网络异常等其他失败会记录报错,不会一律当作权限不足并回退。收到加载提示只能说明消息已进入处理流程;排查未收到回答时,还需要查看处理器执行日志。
### 认证与回复窗口有什么关系?
**被动回调和客服消息是两种不同的回复渠道。** 微信要求被动回调在 **5 秒内**响应;认证不会延长这个时间。`drop` 使用的就是被动回调,不能把微信重试当成稳定的 15 秒生成窗口。[被动回复官方说明](https://developers.weixin.qq.com/doc/service/guide/product/message/Passive_user_reply_message.html)
客服接口允许在回调结束后发送回复。微信官方当前标明,公众号、服务号需企业主体已认证才能调用;前文的「主体实名验证」不等于取得客服接口权限。具体以账号实际权限和微信接口返回为准。
| 用户操作 | 客服消息下发额度 | 有效期 |
| --- | --- | --- |
| 发送消息 | 5 条 | 48 小时 |
| 点击符合条件的自定义菜单、关注、扫描二维码 | 3 条 | 1 分钟 |
这些是微信客服接口的限制,不是 AI 的生成超时设置,也不是所有事件都享有 48 小时窗口。规则可能调整,请以[微信客服消息官方文档](https://developers.weixin.qq.com/doc/service/api/customer/message/api_sendcustommessage)为准。
### 如何领取回复和设置加载提示?
在 `passive` 或 `auto` 回退后,用户发送的下一条消息用于领取上一轮回答,**不会同时作为新的问题交给处理器**。如果回答尚未生成,仍会返回加载提示;稍后再发送任意内容即可。领取完成后,再发送新的问题。
`LoadingMessage` 对 `auto` 和 `passive` 都有效,对 `drop` 无效。可以按模式修改,例如:
- `auto`:「正在处理,请稍候。若未收到回复,请稍后发送任意内容领取。」
- `passive`:「AI 正在思考中,请稍后发送任意内容获取回复。」
将加载提示留空时,LangBot 只向微信确认接收,不发送可见的加载消息。待领取回复保存在内存中,重启 LangBot 或重新加载机器人配置会清空,因此请在修改配置后重新发起对话。三种模式仍受微信消息内容和长度限制。
### 连接处理器
完成平台配置后,在 LangBot 的「事件路由」中将「收到消息」连接到需要使用的流水线、Agent 或插件处理器,再关注公众号并发送消息。
接入模式只决定回复如何送达,不会自动把 Agent 的所有文本输出发送到微信。使用 Agent 时,请批准「回复当前会话」工具,并在指令中要求使用该工具回复;使用插件处理器时,需要插件调用回复接口。