Melso Docs

DingTalk Bot 連携

Melso エージェントをあなた自身の DingTalk アプリに接続します——DingTalk オープンプラットフォームで Stream モードのロボットを作成し、その AppKey と AppSecret をコピーして Melso に貼り付ければ、DingTalk の中から DM したり、グループで @ メンションしたり、/issue と入力したりできます。

任意のエージェントを DingTalk Bot に接続すれば、チームは DingTalk の中から直接それを使えます——Bot に DM したり、グループで @ メンションしたり、スクリーンショットを送ったり、/issue と入力してアプリを開かずに Melso イシューを起票したりできます。

DingTalk 連携はコミュニティによってメンテナンスされています。毎リリースに同梱されますが、公式のサポート SLA は付きません。問題があれば GitHub issues に報告してください。

DingTalk は**自分のアプリを持ち込む(BYO: bring-your-own-app)**モデルを採用しています。ワークスペースの admin が DingTalk アプリを作成し、Stream モードのロボットを追加して、その認証情報を Melso に貼り付けます。セットアップ時に選んだエージェントが DM と新しく検出されたグループのデフォルトになります。同じロボットを複数のグループに追加し、グループごとに別のエージェントへルーティングできます。(これは紐づけがスキャンしてインストールするフローである Lark とは異なります。)

セットアップ全体は以下のとおりで、所要時間は約 5 分です。最終的に、Melso に貼り付ける 2 つの認証情報が得られます。

  • AppKey —— アプリの client id
  • AppSecret —— アプリの client secret

DingTalk アプリをセットアップする

1. アプリを作成し、Stream モードのロボットを追加する

  1. DingTalk オープンプラットフォームを開き、企業内部アプリ(企业内部应用)を作成します。
  2. そのアプリを開き、ロボット(机器人)機能を追加します。
  3. ロボット設定で、メッセージ受信モードStream モード(推送模式)に設定します。これにより、Bot は webhook を受け取るのではなく、長時間維持される push 接続を通じて外向きに接続するようになります。

これがプラットフォーム層で Melso が必要とするすべてです——Bot は Stream モードで外向きに接続するので、公開アドレスを設定する必要はありません。

設定なぜそこにあるか
企業内部アプリロボットを保持し、AppKey / AppSecret 認証情報を発行するアプリのコンテナです。
ロボット機能@ メンションされ、返信を投稿する Bot のアイデンティティを作成します。
Stream モードBot は長時間維持される Stream 接続を通じて外向きに接続します——公開 webhook/URL は不要です。
ロボット送信権限Bot が DingTalk にメッセージを送り返せるようにします(エージェントの返信や能動的なメッセージ)。
メッセージ読み取り権限Bot が 1:1 メッセージと、自分を @ メンションしたグループメッセージを受け取れるようにします。

webhook URL も OAuth リダイレクト URL もありません。ロボットは Stream モードで動作し、BYO は OAuth を使わないからです。

DingTalk にはネイティブの入力中/リアクションのインジケーターがないため——Slack とは異なり——Bot は処理を始めると短い「処理中」の合図を先に返し、完全な返信はエージェントの処理が終わってから届きます。短時間に連投したメッセージは 1 つの合図にまとめられます。

2. ロボットに権限を付与する

ロボットに、メッセージを受信し、メッセージを送り返すために必要なスコープ(ロボットのメッセージ送信権限)を付与します。送信権限がないと、エージェントは動作しても返信を配信できません。

3. AppKey と AppSecret をコピーする

アプリの 凭证与基础信息(認証情報と基本情報)を開き、以下をコピーします。

  • AppKey —— これがアプリの client id です
  • AppSecret —— これがアプリの client secret です

4. Melso で接続する

  1. Agents → あなたのエージェント からそのエージェントを開き、Integrations タブ(または左サイドバーの Integrations 区画)を開きます。
  2. Connect DingTalk をクリックします。
  3. AppKeyAppSecret を貼り付け、Connect をクリックします。
  4. エージェントに Connected to DingTalk と表示されます。Bot はこれで、自身の Stream 接続を通じて待ち受けています。

2 つの認証情報は同じ DingTalk アプリのものでなければならず、そのアプリは 1 つの Melso ワークスペースに 1 回だけインストールできます。2 つ目のインストールや別のワークスペースへの接続は拒否されます。インストール時のエージェントは DM のデフォルトとして残り、グループは再接続せずに別のエージェントへルーティングできます。

1 つのロボットを複数のエージェントで使うには、各 DingTalk グループに追加して一度 @ メンションし、Settings → Integrations → DingTalk → グループルーティングでグループごとのエージェントを選びます。別の Bot ID や DM 用エージェントが必要な場合だけ、別の DingTalk アプリをインストールしてください。

この連携でできること

場所動作
エージェント → Integrationsowner と admin には Connect DingTalk が表示され、接続すると Connected to DingTalk バッジと Disconnect コントロールに切り替わります。
Bot に DMワークスペースメンバーが 1:1 チャットで Bot に直接メッセージを送ります。会話はそのエージェントとの Melso chat セッションになり、すべてのメッセージが読み取られます。
グループで @ メンションBot をグループに追加し、@ メンションします。最初のメンションでグループが検出され、まずデフォルトのエージェントが使われます。owner または admin はグループルーティングで別のエージェントを選べます。読み取られるのはメンションしたメッセージだけです。
画像を送るDM の画像も、グループで @ メンションと一緒に送った画像も、会話に入りエージェントが見られるようになります——PNG・JPEG・GIF・WebP・BMP に対応し、1 メッセージあたり最大 4 枚、1 枚あたり 10 MB までです。各画像は Melso のストレージにコピーされるため、DingTalk の一時リンクが失効した後も会話の中に表示され続けます。/issue と一緒に送った画像は、チャットの turn ではなく作成されたイシューに添付されます。ファイルと音声には対応していません。
/issue コマンド/issue <タイトル> で始めると、入力内容からあなた名義の Melso タスクを直接かつ同期的に作成し、同じ会話へ ID とタイトルを返します。続く行は説明になります。同じ DingTalk メッセージの画像は、作成したタスクに添付されます。コマンド自体は Melso Chat に表示されず、作成したタスクが Melso に記録される処理結果になります。
/new コマンド/new <あなたのメッセージ> で始めると、そのメッセージを過去の文脈なしで実行します。/new だけを送ると、同じ fresh-start の意図が次の空でないメッセージに適用され、空の turn は作られません。既存の会話履歴はそのまま残ります。
返信エージェントの回答は、同じ 1:1 チャットまたはグループに投稿し返されます。

Bot を使う(メンバー)

最初のメッセージ:アカウントを紐づける

初めて Bot を @ メンションするか DM すると、Bot は アカウントを紐づける プロンプトで返信し、それはプロダクト内の /dingtalk/bind ページを指しています。リンクをタップして Melso にサインインすると、あなたの DingTalk アイデンティティがあなたの Melso メンバーシップに紐づきます——これによって、エージェントがあなたとして振る舞えるようになります(たとえば /issue はあなたの名義でイシューを起票します)。このリンクは使い切りで、約 15 分で失効します。新しいものが必要なら、もう一度 Bot にメッセージを送るだけです。

Bot を使えるのは ワークスペースのメンバー だけです。メンバーでない場合や、アイデンティティの紐づけをスキップした場合、Bot は実行されません——あなたのメッセージは破棄されます(内容は保存せず、監査のために記録されます)。

対話とコマンド

  • グループで —— Bot をグループに追加してから、@your-bot <あなたのメッセージ> とします。フォローアップのたびに再度メンションしてください(Bot は自分をメンションしたメッセージだけを読みます)。
  • 1:1 チャットで —— Bot を開いて直接メッセージを送ります。メンションは不要で、すべてのメッセージが読み取られます。
  • 画像を送る —— スクリーンショットや写真を、テキストの有無を問わず送れます。会話に入り、エージェントが参照できます。対応形式は PNG・JPEG・GIF・WebP・BMP、1 メッセージあたり最大 4 枚、1 枚あたり 10 MB までです。
  • イシューを起票する —— /issue Safari でログインのリダイレクトが壊れている と送り、必要なら続く行に説明を書きます。Melso は同期的にイシューを作成し、同じメッセージの画像をそのイシューに添付して、ID とタイトルをチャットに返します。
  • 新しく始める —— /new <あなたのメッセージ> と送ると、そのメッセージを過去の文脈なしで実行します。/new だけを送れば、fresh-start を次の空でないメッセージに適用できます。どちらも既存の会話履歴は削除しません。

管理と切断

ワークスペース全体の管理は Settings → Integrations にあります。

  • Connected bots は、ワークスペース内のすべての Bot と、それぞれが紐づくエージェントを一覧表示します(すべてのメンバーから見えます)。
  • グループルーティングは Bot が検出したすべてのグループを表示します。owner と admin はグループごとに固定のエージェントを選べ、全メンバーが現在のルートを確認できます。
  • ルートを変更するたびに、選択したエージェント用の新しい Chat セッションが作成されます。エージェント A → B → A と戻しても、A の以前のセッションは再開されません。割り当てたエージェントをアーカイブするとルートは保持されますが、そのエージェントを復元するかグループを再割り当てするまで、処理は停止して利用不可の通知が返ります。
  • Disconnectowner / admin 専用 です。切断すると Bot は DingTalk メッセージの受信を停止し、その接続が破棄されます。インストール記録は監査のために保持され、あとで再接続できます。

権限

  • 接続 / 切断 にはワークスペースの owner または admin が必要です。
  • Bot との対話 には、DingTalk アイデンティティを紐づけたワークスペースメンバーであることが必要です。それ以外の人は一律に破棄されます。
  • 破棄されたメッセージの本文が保存されることはありません——監査のために破棄理由だけが記録されます。

セルフホストのセットアップ

Melso Cloud では連携はすでに利用可能です——このセクションは飛ばしてください。

セルフホストの場合、DingTalk は保存時の暗号化キーを設定するまでオフです。このキーは各アプリの AppSecret をデータベース保存前に暗号化します。AppKey は機密情報ではないインストールのルーティング識別子として平文で保存されます。BYO にはデプロイレベルの OAuth の client id/secret は不要です——各インストールは admin が貼り付けた認証情報を使います。

  1. 32 バイトのキーを生成し、API サーバーに設定します。

    MULTICA_DINGTALK_SECRET_KEY=<base64-encoded 32-byte key>

    たとえば: openssl rand -base64 32

  2. API を再起動します。キーを設定するまで、Settings → Integrations には「DingTalk integration not enabled」という通知が表示され、Connect DingTalk のエントリポイントは非表示のままになります。

キーはちょうど 32 バイトにデコードされなければなりません——openssl rand -base64 32 はそれを満たします。これは長く使い続けるシークレットとして扱ってください。ローテーションしたり紛失したりすると、すでに保存済みの認証情報が復号できなくなり、すべての Bot を再接続せざるを得なくなります。「アカウントを紐づける」リンクは、Web アプリの URL(MULTICA_APP_URL、未設定時は FRONTEND_ORIGIN にフォールバック)から生成されます。通常のデプロイではこれは既に設定されているため、追加で設定するものはありません。

次に