チャンネル
チャンネルを使用すると、ターミナルではなく、Telegram、WeChat、QQ、DingTalk などのメッセージングプラットフォームから Qwen Code エージェントとやり取りできます。スマートフォンやデスクトップのチャットアプリからメッセージを送信すると、エージェントは CLI と同じように応答します。
仕組み
qwen channel start を実行すると、Qwen Code は次の処理を行います:
- 設定ファイル
settings.jsonからチャンネル設定を読み取ります - Agent Client Protocol (ACP) を使用して単一のエージェントプロセスを起動します
- 各メッセージングプラットフォームに接続し、メッセージのリッスンを開始します
- 受信メッセージをエージェントにルーティングし、適切なチャットに応答を送り返します
すべてのチャンネルは単一のエージェントプロセスを共有しますが、ユーザーごとにセッションは分離されています。各チャンネルは独自の作業ディレクトリ、モデル、指示を持つことができます。
クイックスタート
- メッセージングプラットフォームでボットをセットアップします(チャンネル別ガイド: Telegram、WeChat、QQ Bot、DingTalk)
- チャンネル設定を
~/.qwen/settings.jsonに追加します qwen channel startを実行してすべてのチャンネルを開始するか、qwen channel start <名前>で単一のチャンネルを開始します
組み込みでないプラットフォームに接続したいですか? 拡張機能としてカスタムアダプターを追加するには Plugins を参照してください。
設定
チャンネルは settings.json の channels キーの下で設定します。各チャンネルには名前と一連のオプションがあります:
{
"channels": {
"my-channel": {
"type": "telegram",
"token": "$MY_BOT_TOKEN",
"senderPolicy": "allowlist",
"allowedUsers": ["123456789"],
"sessionScope": "user",
"cwd": "/path/to/working/directory",
"instructions": "Optional system instructions for the agent.",
"groupPolicy": "disabled",
"groups": {
"*": { "requireMention": true }
}
}
}
}オプション
| オプション | 必須 | 説明 |
|---|---|---|
type | はい | チャンネルタイプ: telegram, weixin, qq, dingtalk, feishu、または拡張機能からのカスタムタイプ(Plugins を参照) |
token | Telegram | ボットトークン。環境変数から読み取るための $ENV_VAR 構文をサポートします。WeChat または DingTalk では不要 |
clientId | DingTalk | DingTalk AppKey。$ENV_VAR 構文をサポート |
clientSecret | DingTalk | DingTalk AppSecret。$ENV_VAR 構文をサポート |
model | いいえ | このチャンネルで使用するモデル(例:qwen3.5-plus)。デフォルトモデルを上書きします。画像入力をサポートするマルチモーダルモデルに便利 |
senderPolicy | いいえ | ボットとやり取りできる人: allowlist (デフォルト)、open、または pairing |
allowedUsers | いいえ | ボットの使用を許可されたユーザー ID のリスト(allowlist および pairing ポリシーで使用) |
sessionScope | いいえ | セッションのスコープ方法: user (デフォルト)、thread、または single |
cwd | いいえ | エージェントの作業ディレクトリ。デフォルトはカレントディレクトリ |
instructions | いいえ | 各セッションの最初のメッセージに追加されるカスタム指示 |
groupPolicy | いいえ | グループチャットアクセス: disabled (デフォルト)、allowlist、または open。グループチャット を参照 |
groups | いいえ | グループごとの設定。キーはグループチャット ID またはデフォルト用の "*"。グループチャット を参照 |
dispatchMode | いいえ | ボットがビジー中にメッセージを送信したときの動作: steer (デフォルト)、collect、または followup。ディスパッチモード を参照 |
blockStreaming | いいえ | プログレッシブ応答配信: on または off (デフォルト)。ブロックストリーミング を参照 |
blockStreamingChunk | いいえ | チャンクサイズの範囲: { "minChars": 400, "maxChars": 1000 }。ブロックストリーミング を参照 |
blockStreamingCoalesce | いいえ | アイドルフラッシュ: { "idleMs": 1500 }。ブロックストリーミング を参照 |
送信者ポリシー
ボットとやり取りできる人を制御します:
allowlist(デフォルト) —allowedUsersにリストされたユーザーのみメッセージを送信できます。その他は無視されます。pairing— 不明な送信者にペアリングコードが送信されます。ボットオペレーターが CLI 経由で承認すると、永続的な許可リストに追加されます。allowedUsersのユーザーはペアリングをスキップします。以下の DM ペアリング を参照。open— 誰でもメッセージを送信できます。注意して使用してください。
セッションスコープ
会話セッションの管理方法を制御します:
user(デフォルト) — ユーザーごとに 1 つのセッション。同じユーザーからのすべてのメッセージが会話を共有します。thread— スレッド/トピックごとに 1 つのセッション。スレッドのあるグループチャットに便利です。single— すべてのユーザーで共有される 1 つのセッション。全員が同じ会話を共有します。
トークンセキュリティ
ボットトークンは settings.json に直接保存しないでください。代わりに、環境変数参照を使用します:
{
"token": "$TELEGRAM_BOT_TOKEN"
}実際のトークンはシェル環境またはチャンネル実行前に読み込まれる .env ファイルに設定します。
DM ペアリング
senderPolicy が "pairing" に設定されている場合、不明な送信者は承認フローを経由します:
- 不明なユーザーがボットにメッセージを送信します
- ボットは 8 文字のペアリングコード(例:
VEQDDWXJ)で応答します - ユーザーがあなた(ボットオペレーター)とコードを共有します
- CLI 経由で承認します:
qwen channel pairing approve my-channel VEQDDWXJ承認されると、ユーザー ID が ~/.qwen/channels/<名前>-allowlist.json に保存され、以降のすべてのメッセージは通常通り処理されます。
ペアリング CLI コマンド
# 保留中のペアリングリクエストを一覧表示
qwen channel pairing list my-channel
# コードでリクエストを承認
qwen channel pairing approve my-channel <CODE>ペアリングルール
- コードは 8 文字、大文字、明確なアルファベットを使用(
0/O/1/Iは使用しません) - コードは 1 時間後に期限切れ
- チャンネルあたり最大 3 つの保留リクエスト — 期限切れまたは承認されるまで追加リクエストは無視されます
settings.jsonのallowedUsersにリストされたユーザーは常にペアリングをスキップ- 承認されたユーザーは
~/.qwen/channels/<名前>-allowlist.jsonに保存されます — このファイルは機密として扱ってください
グループチャット
デフォルトでは、ボットはダイレクトメッセージでのみ動作します。グループチャットを有効にするには、groupPolicy を "allowlist" または "open" に設定します。
グループポリシー
ボットがグループチャットに参加するかどうかを制御します:
disabled(デフォルト) — ボットはすべてのグループメッセージを無視します。最も安全なオプション。allowlist— ボットは、groupsでチャット ID によって明示的にリストされたグループ内でのみ応答します。"*"キーはデフォルト設定を提供しますが、ワイルドカード許可としては機能しません。open— ボットは追加されたすべてのグループで応答します。注意して使用してください。
メンションゲート
グループでは、デフォルトでボットは @メンション または自身のメッセージへの返信が必要です。これにより、グループチャットのすべてのメッセージにボットが応答するのを防ぎます。
groups 設定を使用してグループごとに設定します:
{
"groups": {
"*": { "requireMention": true },
"-100123456": { "requireMention": false }
}
}"*"— すべてのグループのデフォルト設定。設定のデフォルトを提供するのみで、許可リストエントリではありません。- グループチャット ID — 特定のグループの設定を上書きします。
"*"のデフォルトを上書きします。 requireMention(デフォルト:true) —trueの場合、ボットは @メンションがあるか、自身のメッセージへの返信であるメッセージにのみ応答します。falseの場合、ボットはすべてのメッセージに応答します(専用タスクグループに便利)。
グループメッセージの評価方法
1. groupPolicy — このグループは許可されているか? (いいえ → 無視)
2. requireMention — ボットにメンション/返信があったか? (いいえ → 無視)
3. senderPolicy — この送信者は承認されているか? (いいえ → ペアリングフロー)
4. セッションにルーティングTelegram のグループ設定
- ボットをグループに追加
- BotFather で プライバシーモードを無効 にする(
/mybots→ Bot Settings → Group Privacy → Turn Off)— そうしないとボットはコマンド以外のメッセージを認識しません - プライバシーモードを変更した後、ボットをグループから 削除して再度追加 する(Telegram はこの設定をキャッシュします)
グループチャット ID の検索
groups 許可リスト用のグループチャット ID を見つけるには:
- ボットが実行中の場合は停止
- グループでボットにメンションしたメッセージを送信
- Telegram Bot API を使用してキューされたアップデートを確認:
curl -s "https://api.telegram.org/bot${TELEGRAM_BOT_TOKEN}/getUpdates" | python3 -m json.tool応答内の message.chat.id を探します — グループ ID は負の数値です(例:-5170296765)。
メディアサポート
チャンネルはテキストだけでなく、画像やファイルをエージェントに送信することもサポートしています。
画像
ボットに写真を送信するとエージェントがそれを認識します — スクリーンショット、エラーメッセージ、図を共有するのに便利です。画像はビジョン入力としてモデルに直接送信されます。
画像サポートを使用するには、チャンネルにマルチモーダルモデルを設定します:
{
"channels": {
"my-channel": {
"type": "telegram",
"model": "qwen3.5-plus",
...
}
}
}ファイル
ドキュメント(PDF、コードファイル、テキストファイルなど)をボットに送信します。ファイルはダウンロードされて一時ディレクトリに保存され、エージェントにはファイルパスが通知されるため、ファイル読み取りツールを使用して内容を読むことができます。
ファイルは任意のモデルで動作します — マルチモーダルサポートは不要です。
プラットフォームの違い
| 機能 | Telegram | DingTalk | |
|---|---|---|---|
| 画像 | Bot API 経由で直接ダウンロード | AES 復号化による CDN ダウンロード | downloadCode API(2段階) |
| ファイル | Bot API 経由で直接ダウンロード(20MB制限) | AES 復号化による CDN ダウンロード | downloadCode API(2段階) |
| キャプション | 写真/ファイルのキャプションはメッセージテキストに含まれます | 該当なし | リッチテキスト:1つのメッセージにテキストと画像を混在 |
ディスパッチモード
ボットが前のメッセージを処理中に新しいメッセージを送信した場合の動作を制御します。
steer(デフォルト) — ボットは現在のリクエストをキャンセルし、新しいメッセージの処理を開始します。通常のチャットに最適で、フォローアップは通常、ボットを修正またはリダイレクトしたいことを意味します。collect— 新しいメッセージはバッファリングされます。現在のリクエストが完了すると、バッファされたすべてのメッセージが1つのフォローアッププロンプトに結合されます。非同期ワークフローで、考えをキューに入れたい場合に適しています。followup— 各メッセージがキューに入れられ、順番に個別のターンとして処理されます。各メッセージが独立しているバッチワークフローに便利です。
{
"channels": {
"my-channel": {
"type": "telegram",
"dispatchMode": "steer",
...
}
}
}また、グループごとにディスパッチモードを設定して、チャンネルのデフォルトを上書きすることもできます:
{
"groups": {
"*": { "requireMention": true, "dispatchMode": "steer" },
"-100123456": { "dispatchMode": "collect" }
}
}ブロックストリーミング
デフォルトでは、エージェントはしばらく動作してから 1 つの大きな応答を送信します。ブロックストリーミングを有効にすると、エージェントが処理中に応答が複数の短いメッセージとして届きます — ChatGPT や Claude がプログレッシブ出力を表示するのと同様です。
{
"channels": {
"my-channel": {
"type": "telegram",
"blockStreaming": "on",
"blockStreamingChunk": { "minChars": 400, "maxChars": 1000 },
"blockStreamingCoalesce": { "idleMs": 1500 },
...
}
}
}仕組み
- エージェントの応答は段落境界でブロックに分割され、個別のメッセージとして送信されます
minChars(デフォルト 400) — ブロックがこの長さに達するまで送信しません。小さなメッセージの大量送信を避けるためmaxChars(デフォルト 1000) — ブロックが自然な区切りなしでこの長さになった場合、強制的に送信しますidleMs(デフォルト 1500) — エージェントが一時停止した場合(例:ツールの実行)、現在バッファされているテキストを送信します- エージェントが終了すると、残りのテキストは即座に送信されます
blockStreaming のみ必須です。チャンクと coalesce の設定はオプションで、適切なデフォルト値があります。
スラッシュコマンド
チャンネルはスラッシュコマンドをサポートしています。これらはローカルで処理されます(エージェントへの往復は発生しません):
/help— 利用可能なコマンドを一覧表示/clear— セッションをクリアして新しく開始(エイリアス:/reset、/new)/status— セッション情報とアクセスポリシーを表示
その他のスラッシュコマンド(例:/compress、/summary)はエージェントに転送されます。
これらのコマンドはすべてのチャンネルタイプ(Telegram、WeChat、QQ、DingTalk)で動作します。
実行
# 設定されたすべてのチャンネルを開始(エージェントプロセスを共有)
qwen channel start
# 単一のチャンネルを開始
qwen channel start my-channel
# サービスが実行中かどうかを確認
qwen channel status
# 実行中のサービスを停止
qwen channel stopボットはフォアグラウンドで実行されます。Ctrl+C で停止するか、別のターミナルから qwen channel stop を使用します。
マルチチャンネルモード
qwen channel start を名前なしで実行すると、settings.json で定義されたすべてのチャンネルが同時に起動し、単一のエージェントプロセスを共有します。各チャンネルは独自のセッションを維持します — Telegram ユーザーと WeChat ユーザーは、同じエージェントを共有していても、別々の会話を取得します。
各チャンネルは設定から独自の cwd を使用するため、異なるチャンネルで異なるプロジェクトを同時に作業できます。
サービス管理
チャンネルサービスは PID ファイル(~/.qwen/channels/service.pid)を使用して実行中のインスタンスを追跡します:
- 重複防止: サービスが既に実行中に
qwen channel startを実行すると、2 番目のインスタンスを開始する代わりにエラーが表示されます qwen channel stop: 別のターミナルから実行中のサービスを正常に停止しますqwen channel status: サービスが実行中かどうか、その稼働時間、チャンネルごとのセッション数を表示します
クラッシュリカバリ
エージェントプロセスが予期せずクラッシュした場合、チャンネルサービスは自動的に再起動し、アクティブなすべてのセッションの復元を試みます。ユーザーは最初からやり直すことなく会話を続けることができます。
- セッションはサービス実行中に
~/.qwen/channels/sessions.jsonに永続化されます - クラッシュ時:エージェントは 3 秒以内に再起動し、保存されたセッションを再ロードします
- 3 回連続でクラッシュした場合、サービスはエラーで終了します
- クリーンシャットダウン(Ctrl+C または
qwen channel stop)時:セッションデータはクリアされ、次回の起動は常に新しい状態から行われます