diff --git a/docs/channels/wecom/README.fr.md b/docs/channels/wecom/README.fr.md new file mode 100644 index 000000000..8f6cfe285 --- /dev/null +++ b/docs/channels/wecom/README.fr.md @@ -0,0 +1,148 @@ +> Retour au [README](../../../README.fr.md) + +# WeCom + +PicoClaw expose WeCom en tant que canal unique `channels.wecom`, basé sur l'API WebSocket officielle WeCom AI Bot. +Ce canal remplace l'ancienne séparation `wecom`, `wecom_app` et `wecom_aibot` par un modèle de configuration unifié. + +> Aucune URL de callback webhook publique n'est requise. PicoClaw établit une connexion WebSocket sortante vers WeCom. + +## Fonctionnalités prises en charge + +- Chat privé et chat de groupe +- Réponses en streaming côté canal via le protocole WeCom AI Bot +- Messages entrants : texte, voix, image, fichier, vidéo et messages mixtes +- Réponses sortantes : texte et médias (`image`, `file`, `voice`, `video`) +- Onboarding par QR code via l'interface Web ou le CLI +- Liste blanche partagée et routage `reasoning_channel_id` + +--- + +## Démarrage rapide + +### Option 1 : Liaison QR via l'interface Web (recommandé) + +Ouvrez l'interface Web, accédez à **Channels → WeCom** et cliquez sur le bouton de liaison QR. Scannez le QR code avec WeCom et confirmez dans l'application — les identifiants sont enregistrés automatiquement. + +

+Liaison QR WeCom dans l'interface Web +

+ +### Option 2 : Connexion QR via le CLI + +Exécutez : + +```bash +picoclaw auth wecom +``` + +La commande : +1. Demande un QR code à WeCom et l'affiche dans le terminal +2. Affiche également un **lien QR code** que vous pouvez ouvrir dans un navigateur si le QR du terminal est difficile à scanner +3. Attend la confirmation — après le scan, vous devez également **confirmer la connexion dans l'application WeCom** +4. En cas de succès, écrit `bot_id` et `secret` dans `channels.wecom` et sauvegarde la configuration + +Le délai d'expiration par défaut est de **5 minutes**. Utilisez `--timeout` pour l'étendre : + +```bash +picoclaw auth wecom --timeout 10m +``` + +> ⚠️ Scanner le QR code ne suffit pas — vous devez également appuyer sur **Confirmer** dans l'application WeCom, sinon la commande expirera. + +### Option 3 : Configuration manuelle + +Si vous disposez déjà d'un `bot_id` et d'un `secret` depuis la plateforme WeCom AI Bot, configurez directement : + +```json +{ + "channels": { + "wecom": { + "enabled": true, + "bot_id": "YOUR_BOT_ID", + "secret": "YOUR_SECRET", + "websocket_url": "wss://openws.work.weixin.qq.com", + "send_thinking_message": true, + "allow_from": [], + "reasoning_channel_id": "" + } + } +} +``` + +--- + +## Configuration + +| Champ | Type | Défaut | Description | +| ----- | ---- | ------ | ----------- | +| `enabled` | bool | `false` | Activer le canal WeCom. | +| `bot_id` | string | — | Identifiant WeCom AI Bot. Requis lorsque le canal est activé. | +| `secret` | string | — | Secret WeCom AI Bot. Stocké chiffré dans `.security.yml`. Requis lorsque le canal est activé. | +| `websocket_url` | string | `wss://openws.work.weixin.qq.com` | Point de terminaison WebSocket WeCom. | +| `send_thinking_message` | bool | `true` | Envoyer un message `Processing...` avant le début de la réponse en streaming. | +| `allow_from` | array | `[]` | Liste blanche des expéditeurs. Vide signifie autoriser tous les expéditeurs. | +| `reasoning_channel_id` | string | `""` | ID de chat optionnel pour router la sortie de raisonnement vers une conversation séparée. | + +### Variables d'environnement + +Tous les champs peuvent être remplacés par des variables d'environnement avec le préfixe `PICOCLAW_CHANNELS_WECOM_` : + +| Variable d'environnement | Champ correspondant | +| ------------------------ | ------------------- | +| `PICOCLAW_CHANNELS_WECOM_ENABLED` | `enabled` | +| `PICOCLAW_CHANNELS_WECOM_BOT_ID` | `bot_id` | +| `PICOCLAW_CHANNELS_WECOM_SECRET` | `secret` | +| `PICOCLAW_CHANNELS_WECOM_WEBSOCKET_URL` | `websocket_url` | +| `PICOCLAW_CHANNELS_WECOM_SEND_THINKING_MESSAGE` | `send_thinking_message` | +| `PICOCLAW_CHANNELS_WECOM_ALLOW_FROM` | `allow_from` | +| `PICOCLAW_CHANNELS_WECOM_REASONING_CHANNEL_ID` | `reasoning_channel_id` | + +--- + +## Comportement à l'exécution + +- PicoClaw maintient un tour WeCom actif pour que les réponses en streaming puissent continuer sur le même flux lorsque c'est possible. +- Les réponses en streaming ont une durée maximale de **5,5 minutes** et un intervalle d'envoi minimum de **500 ms**. +- Si le streaming n'est plus disponible, les réponses basculent vers la livraison par push actif. +- Les associations de routes de chat expirent après **30 minutes** d'inactivité. +- Les médias entrants sont téléchargés dans le stockage média local avant d'être transmis à l'agent. +- Les médias sortants sont uploadés vers WeCom en tant que fichier temporaire, puis envoyés comme message média. +- Les messages en double sont détectés et supprimés (tampon circulaire des 1000 derniers identifiants de messages). + +--- + +## Migration depuis l'ancienne configuration WeCom + +| Configuration précédente | Migration | +| ------------------------ | --------- | +| `channels.wecom` (bot webhook) | Remplacer par `channels.wecom` avec `bot_id` + `secret`. | +| `channels.wecom_app` | Supprimer. Utiliser `channels.wecom` à la place. | +| `channels.wecom_aibot` | Déplacer `bot_id` et `secret` vers `channels.wecom`. | +| `token`, `encoding_aes_key`, `webhook_url`, `webhook_path` | Plus utilisés. Supprimer de la configuration. | +| `corp_id`, `corp_secret`, `agent_id` | Plus utilisés. Supprimer de la configuration. | +| `welcome_message`, `processing_message`, `max_steps` | Ne font plus partie de la configuration du canal WeCom. | + +--- + +## Dépannage + +### La liaison QR expire + +- Après avoir scanné le QR code, vous devez également **confirmer la connexion dans l'application WeCom**. Le scan seul ne suffit pas. +- Relancez avec un `--timeout` plus long : `picoclaw auth wecom --timeout 10m` +- Si le QR code dans le terminal est difficile à scanner, utilisez le **lien QR code** affiché en dessous pour l'ouvrir dans un navigateur. + +### QR code expiré + +- Le QR code a une durée de validité limitée. Relancez `picoclaw auth wecom` pour en obtenir un nouveau. + +### Échec de la connexion WebSocket + +- Vérifiez que `bot_id` et `secret` sont corrects. +- Confirmez que l'hôte peut atteindre `wss://openws.work.weixin.qq.com` (WebSocket sortant, aucun port entrant nécessaire). + +### Les réponses n'arrivent pas + +- Vérifiez si `allow_from` bloque l'expéditeur. +- Vérifiez que `channels.wecom.bot_id` et `channels.wecom.secret` sont définis et non vides. diff --git a/docs/channels/wecom/README.ja.md b/docs/channels/wecom/README.ja.md new file mode 100644 index 000000000..34b785ba5 --- /dev/null +++ b/docs/channels/wecom/README.ja.md @@ -0,0 +1,148 @@ +> [README](../../../README.ja.md) に戻る + +# WeCom + +PicoClaw は WeCom を公式 WeCom AI Bot WebSocket API に基づく単一の `channels.wecom` チャンネルとして公開します。 +従来の `wecom`、`wecom_app`、`wecom_aibot` の分割を統一された設定モデルに置き換えました。 + +> パブリックな Webhook コールバック URL は不要です。PicoClaw は WeCom へのアウトバウンド WebSocket 接続を確立します。 + +## サポートされる機能 + +- ダイレクトチャットとグループチャット +- WeCom AI Bot プロトコルによるチャンネル側ストリーミング返信 +- テキスト、音声、画像、ファイル、動画、ミックスメッセージの受信 +- テキストおよびメディア返信の送信(`image`、`file`、`voice`、`video`) +- Web UI または CLI による QR コードオンボーディング +- 共有許可リストと `reasoning_channel_id` ルーティング + +--- + +## クイックスタート + +### オプション 1:Web UI QR バインディング(推奨) + +Web UI を開き、**Channels → WeCom** に移動して、QR バインディングボタンをクリックします。WeCom で QR コードをスキャンし、アプリ内で確認すると、認証情報が自動的に保存されます。 + +

+Web UI での WeCom QR バインディング +

+ +### オプション 2:CLI QR ログイン + +実行: + +```bash +picoclaw auth wecom +``` + +コマンドの動作: +1. WeCom に QR コードをリクエストし、ターミナルに表示します +2. ターミナルの QR コードがスキャンしにくい場合に備え、ブラウザで開ける **QR コードリンク** も表示します +3. 確認をポーリングします — スキャン後、**WeCom アプリ内でログインを確認** する必要があります +4. 成功すると、`bot_id` と `secret` を `channels.wecom` に書き込み、設定を保存します + +デフォルトのタイムアウトは **5 分** です。`--timeout` で延長できます: + +```bash +picoclaw auth wecom --timeout 10m +``` + +> ⚠️ QR コードのスキャンだけでは不十分です — WeCom アプリ内で **確認** をタップする必要があります。そうしないとコマンドがタイムアウトします。 + +### オプション 3:手動設定 + +WeCom AI Bot プラットフォームから `bot_id` と `secret` を既にお持ちの場合、直接設定できます: + +```json +{ + "channels": { + "wecom": { + "enabled": true, + "bot_id": "YOUR_BOT_ID", + "secret": "YOUR_SECRET", + "websocket_url": "wss://openws.work.weixin.qq.com", + "send_thinking_message": true, + "allow_from": [], + "reasoning_channel_id": "" + } + } +} +``` + +--- + +## 設定 + +| フィールド | 型 | デフォルト | 説明 | +| ---------- | -- | ---------- | ---- | +| `enabled` | bool | `false` | WeCom チャンネルを有効にする。 | +| `bot_id` | string | — | WeCom AI Bot 識別子。有効時に必須。 | +| `secret` | string | — | WeCom AI Bot シークレット。`.security.yml` に暗号化して保存。有効時に必須。 | +| `websocket_url` | string | `wss://openws.work.weixin.qq.com` | WeCom WebSocket エンドポイント。 | +| `send_thinking_message` | bool | `true` | ストリーミング返信の開始前に `Processing...` メッセージを送信する。 | +| `allow_from` | array | `[]` | 送信者許可リスト。空の場合はすべての送信者を許可。 | +| `reasoning_channel_id` | string | `""` | 推論・思考出力を別の会話にルーティングするためのオプションのチャット ID。 | + +### 環境変数 + +すべてのフィールドは `PICOCLAW_CHANNELS_WECOM_` プレフィックスの環境変数で上書きできます: + +| 環境変数 | 対応フィールド | +| -------- | -------------- | +| `PICOCLAW_CHANNELS_WECOM_ENABLED` | `enabled` | +| `PICOCLAW_CHANNELS_WECOM_BOT_ID` | `bot_id` | +| `PICOCLAW_CHANNELS_WECOM_SECRET` | `secret` | +| `PICOCLAW_CHANNELS_WECOM_WEBSOCKET_URL` | `websocket_url` | +| `PICOCLAW_CHANNELS_WECOM_SEND_THINKING_MESSAGE` | `send_thinking_message` | +| `PICOCLAW_CHANNELS_WECOM_ALLOW_FROM` | `allow_from` | +| `PICOCLAW_CHANNELS_WECOM_REASONING_CHANNEL_ID` | `reasoning_channel_id` | + +--- + +## ランタイム動作 + +- PicoClaw はアクティブな WeCom ターンを維持し、可能な限り同じストリームでストリーミング返信を継続します。 +- ストリーミング返信の最大持続時間は **5.5 分**、最小送信間隔は **500ms** です。 +- ストリーミングが利用できなくなった場合、返信はアクティブプッシュ配信にフォールバックします。 +- チャットルートの関連付けは **30 分** の非アクティブ後に期限切れになります。 +- 受信メディアはエージェントに渡される前にローカルメディアストアにダウンロードされます。 +- 送信メディアは WeCom に一時ファイルとしてアップロードされ、メディアメッセージとして送信されます。 +- 重複メッセージは検出され抑制されます(最新 1000 件のメッセージ ID のリングバッファ)。 + +--- + +## レガシー WeCom 設定からの移行 + +| 以前の設定 | 移行方法 | +| ---------- | -------- | +| `channels.wecom`(Webhook ボット) | `bot_id` + `secret` を使用する `channels.wecom` に置き換える。 | +| `channels.wecom_app` | 削除して `channels.wecom` を使用する。 | +| `channels.wecom_aibot` | `bot_id` と `secret` を `channels.wecom` に移動する。 | +| `token`、`encoding_aes_key`、`webhook_url`、`webhook_path` | 使用されなくなりました。設定から削除してください。 | +| `corp_id`、`corp_secret`、`agent_id` | 使用されなくなりました。設定から削除してください。 | +| `welcome_message`、`processing_message`、`max_steps` | WeCom チャンネル設定の一部ではなくなりました。 | + +--- + +## トラブルシューティング + +### QR バインディングがタイムアウトする + +- QR コードをスキャンした後、**WeCom アプリ内でログインを確認** する必要があります。スキャンだけでは不十分です。 +- より長い `--timeout` で再実行してください:`picoclaw auth wecom --timeout 10m` +- ターミナルの QR コードがスキャンしにくい場合は、その下に表示される **QR コードリンク** を使用してブラウザで開いてください。 + +### QR コードの有効期限切れ + +- QR コードには有効期限があります。`picoclaw auth wecom` を再実行して新しいものを取得してください。 + +### WebSocket 接続の失敗 + +- `bot_id` と `secret` が正しいことを確認してください。 +- ホストが `wss://openws.work.weixin.qq.com` に到達できることを確認してください(アウトバウンド WebSocket、インバウンドポートは不要)。 + +### 返信が届かない + +- `allow_from` が送信者をブロックしていないか確認してください。 +- `channels.wecom.bot_id` と `channels.wecom.secret` が設定されており、空でないことを確認してください。 diff --git a/docs/channels/wecom/README.pt-br.md b/docs/channels/wecom/README.pt-br.md new file mode 100644 index 000000000..5d8cf10f0 --- /dev/null +++ b/docs/channels/wecom/README.pt-br.md @@ -0,0 +1,148 @@ +> Voltar ao [README](../../../README.pt-br.md) + +# WeCom + +O PicoClaw expõe o WeCom como um único canal `channels.wecom`, construído sobre a API WebSocket oficial do WeCom AI Bot. +Isso substitui a antiga separação `wecom`, `wecom_app` e `wecom_aibot` por um modelo de configuração unificado. + +> Nenhuma URL de callback webhook pública é necessária. O PicoClaw estabelece uma conexão WebSocket de saída para o WeCom. + +## Funcionalidades Suportadas + +- Chat direto e chat em grupo +- Respostas em streaming pelo protocolo WeCom AI Bot +- Mensagens recebidas: texto, voz, imagem, arquivo, vídeo e mensagens mistas +- Respostas enviadas: texto e mídia (`image`, `file`, `voice`, `video`) +- Onboarding por QR code via Web UI ou CLI +- Lista de permissões compartilhada e roteamento `reasoning_channel_id` + +--- + +## Início Rápido + +### Opção 1: Vinculação QR via Web UI (Recomendado) + +Abra a Web UI, navegue até **Channels → WeCom** e clique no botão de vinculação QR. Escaneie o QR code com o WeCom e confirme no aplicativo — as credenciais são salvas automaticamente. + +

+Vinculação QR do WeCom na Web UI +

+ +### Opção 2: Login QR via CLI + +Execute: + +```bash +picoclaw auth wecom +``` + +O comando: +1. Solicita um QR code ao WeCom e o exibe no terminal +2. Também exibe um **Link do QR Code** que você pode abrir no navegador se o QR do terminal for difícil de escanear +3. Aguarda a confirmação — após escanear, você também deve **confirmar o login dentro do aplicativo WeCom** +4. Em caso de sucesso, grava `bot_id` e `secret` em `channels.wecom` e salva a configuração + +O timeout padrão é de **5 minutos**. Use `--timeout` para estendê-lo: + +```bash +picoclaw auth wecom --timeout 10m +``` + +> ⚠️ Escanear o QR code não é suficiente — você também deve tocar em **Confirmar** dentro do aplicativo WeCom, caso contrário o comando expirará. + +### Opção 3: Configuração Manual + +Se você já possui um `bot_id` e `secret` da plataforma WeCom AI Bot, configure diretamente: + +```json +{ + "channels": { + "wecom": { + "enabled": true, + "bot_id": "YOUR_BOT_ID", + "secret": "YOUR_SECRET", + "websocket_url": "wss://openws.work.weixin.qq.com", + "send_thinking_message": true, + "allow_from": [], + "reasoning_channel_id": "" + } + } +} +``` + +--- + +## Configuração + +| Campo | Tipo | Padrão | Descrição | +| ----- | ---- | ------ | --------- | +| `enabled` | bool | `false` | Ativar o canal WeCom. | +| `bot_id` | string | — | Identificador do WeCom AI Bot. Obrigatório quando ativado. | +| `secret` | string | — | Secret do WeCom AI Bot. Armazenado criptografado em `.security.yml`. Obrigatório quando ativado. | +| `websocket_url` | string | `wss://openws.work.weixin.qq.com` | Endpoint WebSocket do WeCom. | +| `send_thinking_message` | bool | `true` | Enviar uma mensagem `Processing...` antes do início da resposta em streaming. | +| `allow_from` | array | `[]` | Lista de permissões de remetentes. Vazio significa permitir todos os remetentes. | +| `reasoning_channel_id` | string | `""` | ID de chat opcional para rotear a saída de raciocínio para uma conversa separada. | + +### Variáveis de Ambiente + +Todos os campos podem ser substituídos via variáveis de ambiente com o prefixo `PICOCLAW_CHANNELS_WECOM_`: + +| Variável de Ambiente | Campo Correspondente | +| -------------------- | -------------------- | +| `PICOCLAW_CHANNELS_WECOM_ENABLED` | `enabled` | +| `PICOCLAW_CHANNELS_WECOM_BOT_ID` | `bot_id` | +| `PICOCLAW_CHANNELS_WECOM_SECRET` | `secret` | +| `PICOCLAW_CHANNELS_WECOM_WEBSOCKET_URL` | `websocket_url` | +| `PICOCLAW_CHANNELS_WECOM_SEND_THINKING_MESSAGE` | `send_thinking_message` | +| `PICOCLAW_CHANNELS_WECOM_ALLOW_FROM` | `allow_from` | +| `PICOCLAW_CHANNELS_WECOM_REASONING_CHANNEL_ID` | `reasoning_channel_id` | + +--- + +## Comportamento em Tempo de Execução + +- O PicoClaw mantém um turno WeCom ativo para que as respostas em streaming possam continuar no mesmo fluxo quando possível. +- As respostas em streaming têm uma duração máxima de **5,5 minutos** e um intervalo mínimo de envio de **500ms**. +- Se o streaming não estiver mais disponível, as respostas recorrem à entrega por push ativo. +- As associações de rotas de chat expiram após **30 minutos** de inatividade. +- A mídia recebida é baixada para o armazenamento de mídia local antes de ser passada ao agente. +- A mídia enviada é carregada para o WeCom como um arquivo temporário e então enviada como uma mensagem de mídia. +- Mensagens duplicadas são detectadas e suprimidas (buffer circular dos últimos 1000 IDs de mensagens). + +--- + +## Migração da Configuração Legada do WeCom + +| Configuração anterior | Migração | +| --------------------- | -------- | +| `channels.wecom` (bot webhook) | Substituir por `channels.wecom` usando `bot_id` + `secret`. | +| `channels.wecom_app` | Remover. Usar `channels.wecom` no lugar. | +| `channels.wecom_aibot` | Mover `bot_id` e `secret` para `channels.wecom`. | +| `token`, `encoding_aes_key`, `webhook_url`, `webhook_path` | Não mais utilizados. Remover da configuração. | +| `corp_id`, `corp_secret`, `agent_id` | Não mais utilizados. Remover da configuração. | +| `welcome_message`, `processing_message`, `max_steps` | Não fazem mais parte da configuração do canal WeCom. | + +--- + +## Solução de Problemas + +### A vinculação QR expira + +- Após escanear o QR code, você também deve **confirmar o login dentro do aplicativo WeCom**. Escanear sozinho não é suficiente. +- Execute novamente com um `--timeout` maior: `picoclaw auth wecom --timeout 10m` +- Se o QR code no terminal for difícil de escanear, use o **Link do QR Code** exibido abaixo dele para abrir no navegador. + +### QR code expirado + +- O QR code tem validade limitada. Execute novamente `picoclaw auth wecom` para obter um novo. + +### Falha na conexão WebSocket + +- Verifique se `bot_id` e `secret` estão corretos. +- Confirme que o host pode alcançar `wss://openws.work.weixin.qq.com` (WebSocket de saída, nenhuma porta de entrada necessária). + +### As respostas não chegam + +- Verifique se `allow_from` está bloqueando o remetente. +- Verifique se `channels.wecom.bot_id` e `channels.wecom.secret` estão definidos e não vazios. diff --git a/docs/channels/wecom/README.vi.md b/docs/channels/wecom/README.vi.md new file mode 100644 index 000000000..caffb3465 --- /dev/null +++ b/docs/channels/wecom/README.vi.md @@ -0,0 +1,148 @@ +> Quay lại [README](../../../README.vi.md) + +# WeCom + +PicoClaw cung cấp WeCom dưới dạng một kênh duy nhất `channels.wecom`, được xây dựng trên API WebSocket chính thức của WeCom AI Bot. +Điều này thay thế việc phân tách cũ `wecom`, `wecom_app` và `wecom_aibot` bằng một mô hình cấu hình thống nhất. + +> Không cần URL callback webhook công khai. PicoClaw thiết lập kết nối WebSocket đi ra tới WeCom. + +## Tính năng được hỗ trợ + +- Chat trực tiếp và chat nhóm +- Phản hồi streaming qua giao thức WeCom AI Bot +- Nhận tin nhắn văn bản, giọng nói, hình ảnh, tệp, video và tin nhắn hỗn hợp +- Gửi phản hồi văn bản và phương tiện (`image`, `file`, `voice`, `video`) +- Đăng ký qua mã QR bằng Web UI hoặc CLI +- Danh sách cho phép chung và định tuyến `reasoning_channel_id` + +--- + +## Bắt đầu nhanh + +### Tùy chọn 1: Liên kết QR qua Web UI (Khuyến nghị) + +Mở Web UI, điều hướng đến **Channels → WeCom** và nhấp vào nút liên kết QR. Quét mã QR bằng WeCom và xác nhận trong ứng dụng — thông tin đăng nhập được lưu tự động. + +

+Liên kết QR WeCom trong Web UI +

+ +### Tùy chọn 2: Đăng nhập QR qua CLI + +Chạy: + +```bash +picoclaw auth wecom +``` + +Lệnh thực hiện: +1. Yêu cầu mã QR từ WeCom và hiển thị trong terminal +2. Đồng thời in ra một **Liên kết mã QR** mà bạn có thể mở trong trình duyệt nếu mã QR trên terminal khó quét +3. Chờ xác nhận — sau khi quét, bạn cũng phải **xác nhận đăng nhập trong ứng dụng WeCom** +4. Khi thành công, ghi `bot_id` và `secret` vào `channels.wecom` và lưu cấu hình + +Thời gian chờ mặc định là **5 phút**. Sử dụng `--timeout` để kéo dài: + +```bash +picoclaw auth wecom --timeout 10m +``` + +> ⚠️ Quét mã QR là chưa đủ — bạn cũng phải nhấn **Xác nhận** trong ứng dụng WeCom, nếu không lệnh sẽ hết thời gian chờ. + +### Tùy chọn 3: Cấu hình thủ công + +Nếu bạn đã có `bot_id` và `secret` từ nền tảng WeCom AI Bot, hãy cấu hình trực tiếp: + +```json +{ + "channels": { + "wecom": { + "enabled": true, + "bot_id": "YOUR_BOT_ID", + "secret": "YOUR_SECRET", + "websocket_url": "wss://openws.work.weixin.qq.com", + "send_thinking_message": true, + "allow_from": [], + "reasoning_channel_id": "" + } + } +} +``` + +--- + +## Cấu hình + +| Trường | Kiểu | Mặc định | Mô tả | +| ------ | ---- | -------- | ----- | +| `enabled` | bool | `false` | Kích hoạt kênh WeCom. | +| `bot_id` | string | — | Mã định danh WeCom AI Bot. Bắt buộc khi được kích hoạt. | +| `secret` | string | — | Secret của WeCom AI Bot. Được lưu mã hóa trong `.security.yml`. Bắt buộc khi được kích hoạt. | +| `websocket_url` | string | `wss://openws.work.weixin.qq.com` | Điểm cuối WebSocket của WeCom. | +| `send_thinking_message` | bool | `true` | Gửi tin nhắn `Processing...` trước khi phản hồi streaming bắt đầu. | +| `allow_from` | array | `[]` | Danh sách cho phép người gửi. Để trống nghĩa là cho phép tất cả. | +| `reasoning_channel_id` | string | `""` | ID chat tùy chọn để định tuyến đầu ra suy luận đến một cuộc hội thoại riêng. | + +### Biến môi trường + +Tất cả các trường có thể được ghi đè bằng biến môi trường với tiền tố `PICOCLAW_CHANNELS_WECOM_`: + +| Biến môi trường | Trường tương ứng | +| ---------------- | ---------------- | +| `PICOCLAW_CHANNELS_WECOM_ENABLED` | `enabled` | +| `PICOCLAW_CHANNELS_WECOM_BOT_ID` | `bot_id` | +| `PICOCLAW_CHANNELS_WECOM_SECRET` | `secret` | +| `PICOCLAW_CHANNELS_WECOM_WEBSOCKET_URL` | `websocket_url` | +| `PICOCLAW_CHANNELS_WECOM_SEND_THINKING_MESSAGE` | `send_thinking_message` | +| `PICOCLAW_CHANNELS_WECOM_ALLOW_FROM` | `allow_from` | +| `PICOCLAW_CHANNELS_WECOM_REASONING_CHANNEL_ID` | `reasoning_channel_id` | + +--- + +## Hành vi khi chạy + +- PicoClaw duy trì một lượt WeCom đang hoạt động để phản hồi streaming có thể tiếp tục trên cùng một luồng khi có thể. +- Phản hồi streaming có thời lượng tối đa **5,5 phút** và khoảng cách gửi tối thiểu **500ms**. +- Nếu streaming không còn khả dụng, phản hồi sẽ chuyển sang gửi push chủ động. +- Các liên kết tuyến chat hết hạn sau **30 phút** không hoạt động. +- Phương tiện nhận được sẽ được tải xuống bộ lưu trữ phương tiện cục bộ trước khi chuyển cho agent. +- Phương tiện gửi đi được tải lên WeCom dưới dạng tệp tạm thời, sau đó gửi dưới dạng tin nhắn phương tiện. +- Tin nhắn trùng lặp được phát hiện và loại bỏ (bộ đệm vòng của 1000 ID tin nhắn gần nhất). + +--- + +## Di chuyển từ cấu hình WeCom cũ + +| Cấu hình trước đây | Di chuyển | +| ------------------- | --------- | +| `channels.wecom` (bot webhook) | Thay thế bằng `channels.wecom` sử dụng `bot_id` + `secret`. | +| `channels.wecom_app` | Xóa. Sử dụng `channels.wecom` thay thế. | +| `channels.wecom_aibot` | Di chuyển `bot_id` và `secret` sang `channels.wecom`. | +| `token`, `encoding_aes_key`, `webhook_url`, `webhook_path` | Không còn sử dụng. Xóa khỏi cấu hình. | +| `corp_id`, `corp_secret`, `agent_id` | Không còn sử dụng. Xóa khỏi cấu hình. | +| `welcome_message`, `processing_message`, `max_steps` | Không còn là một phần của cấu hình kênh WeCom. | + +--- + +## Khắc phục sự cố + +### Liên kết QR hết thời gian chờ + +- Sau khi quét mã QR, bạn cũng phải **xác nhận đăng nhập trong ứng dụng WeCom**. Chỉ quét là chưa đủ. +- Chạy lại với `--timeout` lớn hơn: `picoclaw auth wecom --timeout 10m` +- Nếu mã QR trên terminal khó quét, hãy sử dụng **Liên kết mã QR** được in bên dưới để mở trong trình duyệt. + +### Mã QR đã hết hạn + +- Mã QR có thời hạn hiệu lực giới hạn. Chạy lại `picoclaw auth wecom` để lấy mã mới. + +### Kết nối WebSocket thất bại + +- Kiểm tra xem `bot_id` và `secret` có chính xác không. +- Xác nhận máy chủ có thể kết nối đến `wss://openws.work.weixin.qq.com` (WebSocket đi ra, không cần cổng đến). + +### Phản hồi không đến + +- Kiểm tra xem `allow_from` có đang chặn người gửi không. +- Kiểm tra rằng `channels.wecom.bot_id` và `channels.wecom.secret` đã được thiết lập và không trống.