チャネルライフサイクルステータスアダプター
日付: 2026-07-01
目標
最初の4つのチャネルアダプターを通じて、タスクのライフサイクル状態を公開します。
- Telegram
- Weixin
- DingTalk
- Feishu
これは、チャネルIDおよびライフサイクルメタデータ作業のP1.1フォローアップです。 共有チャネル契約を再度変更することなく、サポートされている各チャネルが利用可能な最適なネイティブ進捗シグナルを表示できるようにすることが目標です。
対象外
- Slackの動作は実装しません。
- QQ Botの動作は実装しません。
- モック/プラグインの例は更新しません。
- DingTalkにターミナルステータスの絵文字は追加しません。
- アダプター固有のマッピングの1回のラウンドのために、共有ステータスレンダリング抽象化を導入しません。
参照と整合性
この設計は、まず現在の Qwen チャネルアダプターの機能に従います。 ライフサイクルセマンティクスは、このリポジトリですでに使用されている既存のタスク/セッションステータスモデルと整合性を保ちます。タスクは、開始、実行、完了、キャンセル、または失敗する可能性があります。 各チャネルはすでにこれらの状態に対する明確なネイティブサーフェスを持っているため、このスコープでは追加の外部ステータスモデルは導入されません。
現在の状態
| チャネル | 既存のステータスサーフェス | 現在の動作 |
|---|---|---|
| Telegram | タイピングインジケーター | プロンプト開始時にタイピングを開始し、プロンプト終了時に停止します。 |
| Weixin | タイピングインジケーター | プロンプト開始時にタイピングを開始し、プロンプト終了時に停止します。 |
| DingTalk | メッセージリアクション | プロンプト開始時に目のリアクションを追加し、プロンプト終了時にそれを取り消します。 |
| Feishu | ストリーミングカード | 完了およびエラーパスを伴うストリーミングカードを表示および更新します。 |
提案された設計
実装はアダプターローカルに保ちます。各アダプターはライフサイクルイベントフックを消費し、イベントをプラットフォームの既存のネイティブステータスサーフェスにマッピングします。
| ライフサイクルイベント | Telegram | Weixin | DingTalk | Feishu |
|---|---|---|---|---|
started | タイピングを開始します。 | タイピングを開始します。 | 目のリアクションを追加します。 | カードを実行中として表示/更新します。 |
text_chunk | 無視します。 | 無視します。 | 無視します。 | ライフサイクルフックでは無視します。コンテンツのストリーミングは既存のレスポンス/カードストリームパスに留まります。 |
tool_call | 無視します。 | 無視します。 | 無視します。 | UIでは無視します。 |
completed | タイピングを停止します。 | タイピングを停止します。 | 目のリアクションを取り消します。 | カードを完了としてマークします。 |
cancelled | タイピングを停止します。 | タイピングを停止します。 | 目のリアクションを取り消します。 | カードをキャンセル済みとしてマークします。 |
failed | タイピングを停止します。 | タイピングを停止します。 | 目のリアクションを取り消します。 | カードを失敗としてマークします。 |
Telegram
Telegramは既存のタイピング実装を維持します。ライフサイクルフックは、startedを既存のタイピング開始パスに、すべてのターミナルイベントを既存のタイピング停止パスにマッピングする必要があります。
text_chunkとtool_callはTelegramのUI変更不要です。
Weixin
WeixinはTelegramと同じ形状に従います。ライフサイクルフックは、startedをsetTyping(true)に、ターミナルイベントをsetTyping(false)にマッピングする必要があります。
追加のメッセージは送信されません。
DingTalk
DingTalkは既存の目のリアクション動作を維持します。
started: 既存の目のリアクションを付加します。completed、cancelled、failed: 既存の目のリアクションを取り消します。
このスコープにターミナル絵文字はありません。既存のエラーパスがすでに送信している場合を除き、失敗およびキャンセルされたタスクは追加のステータスメッセージを送信すべきではありません。
Feishu
Feishuはステータスサーフェスとしてストリーミングカードを維持し、カードコンテンツ内でターミナル状態を明示的にします。
| 状態 | カードラベル |
|---|---|
| 実行中 | 実行中... |
| 完了 | 完了 |
| キャンセル済み | キャンセル済み |
| 失敗 | 失敗しました。再試行してください |
カードは今日と同様に、既存のレスポンス/カードストリームフックを通じて回答コンテンツをストリーミングし続けます。ライフサイクルのtext_chunkは、このスコープではアダプターによって直接消費されません。これは、ライフサイクルチャンクを使用してカードコンテンツを追加するという以前のアダプターローカルのアイデアに優先します。tool_callは、このスコープではカードUIから非表示のままです。
Markdown/カードヘルパーは、必要に応じて最小限のステータスラベルオプションを受け取ることができますが、汎用レンダリングフレームワークに成長させるべきではありません。
データフロー
- チャネル実行は、ベースチャネルレイヤーからライフサイクルイベントを発行します。
- 選択されたアダプターは、ライフサイクルフックを通じてイベントを受信します。
- アダプターはイベントをプラットフォームステータスサーフェスにマッピングします。
- プラットフォームステータスの更新はベストエフォートで実行され、タスク実行には影響しません。
ライフサイクルイベントペイロードは、チャネルメッセージ/セッションを識別するために十分な既存のコンテキストを提供する必要があります。プラットフォーム固有の識別子が不足している場合、アダプターはステータスの更新をスキップします。
エラーハンドリング
プラットフォームステータスの更新は重要ではありません。失敗したタイピング、リアクション、またはカードステータスの更新は、アダプターの既存のスタイルに従ってログに記録されるか破棄されるべきであり、タスクを失敗させてはなりません。
ターミナルイベントは、メッセージ/セッションに対して冪等である必要があります。繰り返されるターミナルイベントは、重複するステータス更新を作成したり、古い実行中インジケーターを残したりしてはなりません。
Feishuはすでにカードの完了、エラー、および停止ボタンフローを持っているため、特別な注意が必要です。ライフサイクルマッピングは既存のカードセッション状態を再利用し、より具体的なターミナル状態を上書きするような競合する更新を避ける必要があります。
テスト計画
影響を受けるチャネルパッケージに焦点を絞ったユニットカバレッジを追加します。
- Telegram: ライフサイクルの
startedがタイピングを開始します。ターミナルイベントがタイピングを停止します。重複するタイピングインターバルは導入されません。 - Weixin: ライフサイクルの
startedがsetTyping(true)を呼び出します。ターミナルイベントがsetTyping(false)を呼び出します。 - DingTalk: ライフサイクルの
startedが目のリアクションを付加します。ターミナルイベントがそれを取り消します。ターミナル絵文字は送信されません。 - Feishu: 実行中、完了、キャンセル済み、および失敗のカード状態が期待されるラベルをレンダリングします。ライフサイクルの
text_chunkは、ライフサイクルフックではなく既存のストリームパスによって所有されたままになります。tool_callはUI出力を追加しません。
検証では、変更されたアダプターに対してパッケージローカルのVitestコマンドを実行し、次にPRが提出される前にプロジェクトのビルドと型チェックを実行する必要があります。
未決定事項
なし。現在のスコープは意図的に狭くされており、既存のアダプター機能に従っています。