次の方法で共有


API ベースのメッセージ拡張機能を作成する

注:

API ベースのメッセージ拡張機能では、検索コマンドのみがサポートされます。

API ベースのメッセージ拡張機能は、外部 API を Teams に直接統合し、アプリの使いやすさを高め、シームレスなユーザー エクスペリエンスを提供する、Microsoft Teamsアプリ機能です。 API ベースのメッセージ拡張機能は検索コマンドをサポートしており、Teams 内の外部サービスからデータをフェッチして表示するために使用でき、アプリケーション間の切り替えの必要性を減らすことでワークフローを合理化できます。

作業を開始する前に、次の要件を満たしていることを確認してください。


1. OpenAPI Description (OAD)

OpenAPI Description (OAD) ドキュメントの次のガイドラインに従っていることを確認します。

  • OpenAPI バージョン 2.0 および 3.0.x がサポートされています。
  • JSON と YAML は、サポートされている形式です。
  • 要求本文が存在する場合は、application/Json である必要があります。
  • プロパティの HTTPS プロトコル サーバー URL を servers.url 定義します。
  • POST メソッドと GET HTTP メソッドのみがサポートされています。
  • OpenAPI Description ドキュメントには、 が必要です operationId
  • 既定値のない必須パラメーターは 1 つだけ許可されます。
  • 既定値の必須パラメーターは省略可能と見なされます。
  • ユーザーは、ヘッダーまたは Cookie のパラメーターを入力しないでください。
  • 操作には、既定値のない必須のヘッダーパラメーターまたは Cookie パラメーターを含めてはいけません。
  • OpenAPI 説明ドキュメントにリモート参照がないことを確認します。
  • 要求の配列の構築はサポートされていません。ただし、JSON 要求本文内の入れ子になったオブジェクトはサポートされています。
  • Teams は、、anyOfallOf、および not (swagger.io) コンストラクトをサポートoneOfしていません。

次のコードは、OpenAPI Description ドキュメントの例です。

openapi: 3.0.1
info:
title: OpenTools Plugin
description: A plugin that allows the user to find the most appropriate AI tools for their use cases, with their pricing information.
version: 'v1'
servers:
- url: https://gptplugin.opentools.ai
paths:
/tools:
 get:
   operationId: searchTools
   summary: Search for AI Tools
   parameters:
     - in: query
       name: search
       required: true
       schema:
         type: string
       description: Used to search for AI tools by their category based on the keywords. For example, ?search="tool to create music" will give tools that can create music.
   responses:
     "200":
       description: OK
       content:
         application/json:
           schema:
             $ref: '#/components/schemas/searchToolsResponse'
     "400":
       description: Search Error
       content:
         application/json:
           schema:
             $ref: '#/components/schemas/searchToolsError'
components:
schemas:
 searchToolsResponse:
   required:
     - search
   type: object
   properties:
     tools:
       type: array
       items:
         type: object
         properties:
           name:
             type: string
             description: The name of the tool.
           opentools_url:
             type: string
             description: The URL to access the tool.
           main_summary:
             type: string
             description: A summary of what the tool is.
           pricing_summary:
             type: string
             description: A summary of the pricing of the tool.
           categories:
             type: array
             items:
               type: string
             description: The categories assigned to the tool.
           platforms:
             type: array
             items:
               type: string
             description: The platforms that this tool is available on.
       description: The list of AI tools.
 searchToolsError:
   type: object
   properties:
     message:
       type: string
       description: Message of the error.

詳細については、「OpenAPI 構造体」を参照してください。


2. アプリ マニフェスト

アプリ マニフェストの次のガイドラインに従っていることを確認します。

  • アプリ マニフェストのバージョンを に設定します 1.17

  • を に設定 composeExtensions.composeExtensionType します apiBased

  • フォルダー内の OpenAPI Description ファイルへの相対パスとして定義 composeExtensions.apiSpecificationFile します。 これにより、アプリ マニフェストが API 仕様にリンクされます。

  • 応答レンダリング テンプレートへの相対パスとして定義 apiResponseRenderingTemplateFile します。 これは、API 応答のレンダリングに使用されるテンプレートの場所を指定します。

  • 各コマンドには、応答レンダリング テンプレートへのリンクが必要です。 これにより、各コマンドが対応する応答形式に接続されます。

  • アプリ マニフェストのプロパティは Commands.id 、OpenAPI Description 内の と operationId 一致する必要があります。

  • 必須パラメーターに既定値がない場合、アプリ マニフェストのコマンド parameters.name は OpenAPI Description ドキュメントの と parameters.name 一致する必要があります。

  • 必要なパラメーターがない場合、アプリ マニフェストのコマンド parameters.name は、OpenAPI Description のオプション parameters.name と一致する必要があります。

  • 各コマンドのパラメーターが、OpenAPI 仕様の操作に対して定義されているパラメーターの名前と正確に一致していることを確認します。

  • 応答レンダリング テンプレートは、API からの応答を変換するために使用されるコマンドごとに定義する必要があります。

  • 完全な説明は 128 文字を超えてはなりません。

    {
    "$schema": "https://developer.microsoft.com/json-schemas/teams/v1.17/MicrosoftTeams.schema.json",
    +  "manifestVersion": "1.17",
    "version": "1.0.0",
    "id": "04805b4b-xxxx-xxxx-xxxx-4dbc1cac8f89",
    "packageName": "com.microsoft.teams.extension",
    "developer": {
        "name": "Teams App, Inc.",
        "websiteUrl": "https://www.example.com",
        "privacyUrl": "https://www.example.com/termofuse",
        "termsOfUseUrl": "https://www.example.com/privacy"
    },
    "icons": {
        "color": "color.png",
        "outline": "outline.png"
    },
    "name": {
        "short": "AI tools",
        "full": "AI tools"
    },
    "description": {
        "short": "AI tools",
        "full": "AI tools"
    },
    "accentColor": "#FFFFFF",
    "composeExtensions": [
        {
    +      "composeExtensionType": "apiBased",
    +      "authorization": {
    +        "authType": "apiSecretServiceAuth ",
    +        "apiSecretServiceAuthConfiguration": {
    +            "apiSecretRegistrationId": "9xxxxxxx-7xxx-4xxx-bxxx-1xxxxxxxxxxx"
    +        }
    +      },
    +      "apiSpecificationFile": "aitools-openapi.yml",
           "commands": [
           {
              "id": "searchTools",
              "type": "query",
              "context": [
                 "compose",
                 "commandBox"
              ],
              "title": "search for AI tools",
              "description": "search for AI tools",
              "parameters": [
                 {
                 "name": "search",
                 "title": "search query",
                 "description": "e.g. search='tool to create music'"
                 }
              ],
    +          "apiResponseRenderingTemplateFile": "response-template.json"
           }
           ]
        }
    ],
    "validDomains": []
    }
    

パラメーター

名前 説明
composeExtensions.composeExtensionType Compose拡張機能の種類。 値を に更新します apiBased
composeExtensions.authorization API ベースのメッセージ拡張機能の承認に関する情報
composeExtensions.authorization.authType 可能な承認の種類の列挙型。 サポートされている値は noneapiSecretServiceAuthmicrosoftEntra です。
composeExtensions.authorization.apiSecretServiceAuthConfiguration サービス認証を実行するために必要なオブジェクトキャプチャの詳細。認証の種類が である apiSecretServiceAuth場合にのみ適用されます。
composeExtensions.authorization.apiSecretServiceAuthConfiguration.apiSecretRegistrationId 開発者が開発者ポータルを介して API キーを送信したときに返される登録 ID。
composeExtensions.apiSpecificationFile アプリ パッケージ内の OpenAPI Description ファイルを参照します。 型が の場合は apiBasedを含めます。
composeExtensions.commands.id 検索コマンドに割り当てる一意の ID。 ユーザー要求には、この ID が含まれています。 ID は、OpenAPI 説明で使用可能な ID と一致 OperationId している必要があります。
composeExtensions.commands.context メッセージ拡張のエントリ ポイントが定義されている配列。 既定値は と commandBoxですcompose
composeExtensions.commands.parameters コマンドのパラメーターの静的リストを定義します。 この名前は、OpenAPI Description 内の にマップ parameters.name する必要があります。 要求本文スキーマでプロパティを参照している場合は、名前を パラメーターまたはクエリ パラメーターにマップする properties.name 必要があります。
composeExtensions.commands.apiResponseRenderingTemplateFile 開発者の API からアダプティブ カード応答への JSON 応答の書式設定に使用されるテンプレート。 [必須]

詳細については、「 composeExtensions」を参照してください。


3. 応答レンダリング テンプレート

注:

Teams では、バージョン 1.5 までのアダプティブ カードがサポートされ、アダプティブ カード Designerはバージョン 1.6 までサポートされます。

  • テンプレートの構造を確立するには、 $schema プロパティでスキーマ参照 URL を定義します。
  • でサポートされている値 responseLayoutlistgridで、応答がどのように視覚的に表示されるかを決定します。
  • 配列jsonPathの場合、またはアダプティブ カードのデータがルート オブジェクトではない場合は、 をお勧めします。 たとえば、データが の下 productDetailsに入れ子になっている場合、JSON パスは になります productDetails
  • API 応答の関連データまたは配列へのパスとして定義jsonPathします。 パスが配列を指している場合、配列内の各エントリはアダプティブ カード テンプレートとバインドされ、個別の結果として返されます。 [省略可能]
  • 応答 レンダリング テンプレートを検証するためのサンプル応答を取得します。 これは、テンプレートが期待どおりに動作することを確認するためのテストとして機能します。
  • Fiddler や Postman などのツールを使用して API を呼び出し、要求と応答が有効であることを確認します。 この手順は、API が正しく機能していることをトラブルシューティングして確認するために重要です。
  • アダプティブ カード Designerを使用して、API 応答を応答レンダリング テンプレートにバインドし、アダプティブ カードをプレビューできます。 カード ペイロード エディターにテンプレートを挿入し、サンプル データ エディターにサンプル応答エントリを挿入します。

次のコードは、応答レンダリング テンプレートの例です。

応答レンダリング テンプレートの例
{
"version": "1.0",
"jsonPath": "repairs",
"responseLayout": "grid",
"responseCardTemplate": {
  "$schema": "http://adaptivecards.io/schemas/adaptive-card.json",
  "type": "AdaptiveCard",
  "version": "1.4",
  "body": [
    {
      "type": "Container",
      "items": [
        {
          "type": "ColumnSet",
          "columns": [
            {
              "type": "Column",
              "width": "stretch",
              "items": [
                {
                  "type": "TextBlock",
                  "text": "Title: ${if(title, title, 'N/A')}",
                  "wrap": true
                },
                {
                  "type": "TextBlock",
                  "text": "Description: ${if(description, description, 'N/A')}",
                  "wrap": true
                },
                {
                  "type": "TextBlock",
                  "text": "Assigned To: ${if(assignedTo, assignedTo, 'N/A')}",
                  "wrap": true
                },
                {
                  "type": "Image",
                  "url": "${image}",
                  "size": "Medium",
                  "$when": "${image != null}"
                }
              ]
            },
            {
              "type": "Column",
              "width": "auto",
              "items": [
                {
                  "type": "Image",
                  "url": "${if(image, image, '')}",
                  "size": "Medium"
                }
              ]
            }
          ]
        },
        {
          "type": "FactSet",
          "facts": [
            {
              "title": "Repair ID:",
              "value": "${if(id, id, 'N/A')}"
            },
            {
              "title": "Date:",
              "value": "${if(date, date, 'N/A')}"
            }
          ]
        }
      ]
    }
  ]
  },
  "previewCardTemplate": {
  "title": "Title: ${if(title, title, 'N/A')}",
  "subtitle": "Description: ${if(description, description, 'N/A')}",
  "text": "Assigned To: ${if(assignedTo, assignedTo, 'N/A')}",
  "image": {
    "url": "${image}",
    "$when": "${image != null}"
    }
  }
 }

プレビュー カード

特定の単語を検索するときにプレビュー カードの配列を表示する新規作成拡張機能の例を示すスクリーンショット。この場合、'SME テスト アプリ' で 'a' を検索すると、それぞれ 'Title'、'Description' (切り捨て) および 'AssignedTo' のプロパティと値を示す 5 枚のカードが返されます。

拡張アダプティブ カード

ユーザーがプレビュー カードを選択した後のアダプティブ カードの展開の例。アダプティブ カードには、タイトル、完全な説明、AssignedTo、RepairId、および Date の値が表示されます。

パラメーター

プロパティ 説明 必須
version string 現在の応答レンダリング テンプレートのスキーマ バージョン。 はい
jsonPath string responseCardTemplate と previewCardTemplate を適用する必要がある結果の関連セクションへのパス。 設定されていない場合、ルート オブジェクトは関連セクションとして扱われます。 関連するセクションが配列の場合、各エントリは responseCardTemplate と previewCardTemplate にマップされます。 いいえ
responseLayout responseLayoutType メッセージ拡張ポップアップの結果のレイアウトを指定します。 サポートされている型は と gridですlist はい
responseCardTemplate adaptiveCardTemplate 結果エントリからアダプティブ カードを作成するためのテンプレート。 はい
previewCardTemplate previewCardTemplate 結果エントリからプレビュー カードを作成するためのテンプレート。 結果のプレビュー カードは、メッセージ拡張機能のポップアップ メニューに表示されます。 はい

Json パス

JSON パスは省略可能ですが、配列に使用するか、アダプティブ カードのデータとして使用するオブジェクトがルート オブジェクトではない場合に使用する必要があります。 JSON パスは、Newtonsoft によって定義された形式に従う必要があります。 JSON パスが配列を指している場合、その配列内の各エントリはアダプティブ カード テンプレートにバインドされ、個別の結果として返されます。

たとえば、製品の一覧に対して以下の JSON があり、エントリごとにカード結果を作成するとします。

{
   "version": "1.0",
   "title": "All Products",
   "warehouse": {
      "products": [
        ...
      ]
   }
}

ご覧のとおり、結果の配列は "products" の下にあり、これは "warehouse" の下に入れ子になっているため、JSON パスは "warehouse.products" になります。

https://adaptivecards.io/designer/テンプレートをカード ペイロード エディターに挿入してアダプティブ カードをプレビューし、配列またはオブジェクトのサンプル応答エントリを取得し、右側の同じデータ エディターに挿入します。 カードが適切にレンダリングされ、好みに合っていることを確認します。 Teams はバージョン 1.5 までのカードをサポートし、デザイナーは 1.6 をサポートします。

スキーマ マッピング

OpenAPI Description ドキュメントのプロパティは、次のようにアダプティブ カード テンプレートにマップされます。

  • stringnumberintegerboolean型は TextBlock に変換されます。

    • ソース スキーマ: string、、 numberintegerおよび boolean

       name:
         type: string
         example: doggie
      
    • ターゲット スキーマ: Textblock

      {
      "type": "TextBlock",
      "text": "name: ${if(name, name, 'N/A')}",
      "wrap": true
      }
      
  • array: 配列はアダプティブ カード内のコンテナーに変換されます。

    • ソース スキーマ: array

          type: array
                    items:
                    required:
                      - name
                    type: object
                      properties:
                      id:
                        type: integer
                      category:
                        type: object
                        properties:
                        name:
                          type: string
      
    • ターゲット スキーマ: Container

          {
                    "type": "Container",
                    "$data": "${$root}",
                    "items": [
                      {
                        "type": "TextBlock",
                        "text": "id: ${if(id, id, 'N/A')}",
                        "wrap": true
                      },
                      {
                        "type": "TextBlock",
                        "text": "category.name: ${if(category.name, category.name, 'N/A')}",
                        "wrap": true
                      }
                    ]
                  }
      
      
  • object: オブジェクトがアダプティブ カードの入れ子になったプロパティに変換されます。

    • ソース スキーマ: object

      components:
        schemas:
          Pet:
              category:
                type: object
              properties:
                id:
                  type: integer
                name:
                  type: string
      
      
    • ターゲット スキーマ: アダプティブ カードの入れ子になったプロパティ

      {
        "type": "TextBlock",
        "text": "category.id: ${if(category.id, category.id, 'N/A')}",
        "wrap": true
      },
      {
        "type": "TextBlock",
        "text": "category.name: ${if(category.name, category.name, 'N/A')}",
        "wrap": true
      }
      
      
  • image: プロパティがイメージ URL の場合は、アダプティブ カードの Image 要素に変換されます。

    • ソース スキーマ: image

          image:
            type: string
            format: uri
            description: The URL of the image of the item to be repaired
      
      
    • ターゲット スキーマ: "Image"

      {
            "type": "Image",
            "url": "${image}",
            "$when": "${image != null}"
          }
      
      

Api ベースのメッセージ拡張機能は、開発者ポータル for Teams と Teams Toolkit for Visual Studio Code、コマンド ライン インターフェイス (CLI)、または Visual Studio を使用して作成できます。

Teams 用開発者ポータルを使用して API ベースのメッセージ拡張機能を作成するには、次の手順に従います。

  1. Teams 開発者ポータルに移動します。

  2. [アプリ] に移動します。

  3. [ + 新しいアプリ] を選択します。

  4. アプリの名前を入力し、 マニフェスト バージョンパブリック開発者プレビュー (devPreview) として選択します。

  5. [追加] を選択します。

    アプリ名と、開発者ポータルで [最新のプレリリース (devPreview)] として選択されているマニフェスト バージョンを示すスクリーンショット。

  6. 左側のウィンドウの [ 構成] で、次の 基本情報を更新します。

    1. フル ネーム
    2. 簡潔な説明
    3. 詳しい説明
    4. 開発者または会社名
    5. Web サイト (有効な HTTPS URL である必要があります)
    6. プライバシー ポリシー
    7. 使用条件
  7. [保存] を選択します。

  8. [ アプリ機能] を選択します

  9. [ メッセージング拡張機能] を選択します

    Teams 開発者ポータルのメッセージ拡張機能オプションを示すスクリーンショット。

  10. [ メッセージ拡張機能の種類] で、[API] を選択 します

    1. 免責事項を受け取った場合は、ボット メッセージ拡張機能が既にユーザーによって使用されています。メッセージ拡張機能の種類を API に変更しますか? [ はい、変更] を選択します
  11. [ OpenAPI spec]\(OpenAPI 仕様\) で、[ 今すぐアップロード] を選択します。

    Teams 開発者ポータルの [今すぐアップロード] オプションを示すスクリーンショット。

  12. JSON または YAML 形式で OpenAPI Description ドキュメントを選択し、[ 開く] を選択します。

  13. [保存] を選択します。 メッセージ API 仕様が正常に保存されたポップアップが表示されます。

  14. [ 入手] を選択します

    [正常に保存された API スペック] と [取得] ボタンの例を示すスクリーンショット。

コマンドの追加

注:

API からビルドされたメッセージ拡張機能は、1 つのパラメーターのみをサポートします。

コマンドとパラメーターをメッセージ拡張機能に追加して、コマンドを追加できます。

  1. [ メッセージ拡張機能の種類] で、[ 追加] を選択します。

    Teams 開発者ポータルでコマンドを追加するための追加オプションを示すスクリーンショット。

    [ 追加] コマンド ポップアップが表示され、OpenAPI Description ドキュメントから使用可能なすべての API の一覧が表示されます。

  2. 一覧から API を選択し、[ 次へ] を選択します。

    [コマンドの追加] ポップアップ ウィンドウの OpenAPI 説明ドキュメントの API の一覧を示すスクリーンショット。

    コマンドの詳細が表示されます。

  3. [コマンドの詳細] で、[アダプティブ カード テンプレート] に移動し、[今すぐアップロード] を選択します。

    コマンドのアダプティブ カード テンプレートを追加する [今すぐアップロード] オプションを示すスクリーンショット。

    注:

    複数の API がある場合は、各 API の Adaptive カード テンプレートをアップロードしてください。

  4. JSON 形式のアダプティブ カード テンプレート ファイルを選択し、[ 開く] を選択します。

    アダプティブ カード テンプレートから次の属性が自動的に更新されます。

    • コマンドの種類
    • コマンド ID
    • コマンドのタイトル
    • パラメーター名
    • パラメータの説明

    コマンドの詳細ページで使用できるフィールドを示すスクリーンショット。

  5. [ 詳細] で、 コマンドの説明を更新します。

    1. Microsoft 365 Copilotでトリガーを使用してコマンドを起動する場合は、[ユーザーが拡張機能を開いたときにコマンドを自動的に実行する] トグルをオンにします。
  6. [追加] を選択します。 コマンドが正常に追加されました。

  7. [保存] を選択します。

  8. [ 認証] で、次のいずれかのオプションを選択します。

    • 認証なし
    • API キー

API ベースのメッセージ拡張機能が作成されます。

スクリーンショットは、Teams 開発者ポータルのアプリ機能ページで作成されたMicrosoft 365 Copilotのプラグインを示しています。

Teams 用開発者ポータルで作成された API ベースのメッセージ拡張機能をテストするには、次の方法を使用します。

  • Teams でのプレビュー: 開発者ポータルでメッセージ拡張機能を開き、右上隅 にある [Teams でプレビュー ] を選択します。 Teams にリダイレクトされ、アプリを Teams に追加してアプリをプレビューできます。

  • アプリ パッケージのダウンロード: メッセージ拡張機能ページで、左側のウィンドウで [ アプリ パッケージ ] を選択し、ウィンドウの左上隅にある [ アプリ パッケージのダウンロード] を選択します。 アプリ パッケージは、.zip ファイル内のローカル コンピューターにダウンロードされます。 アプリ パッケージをチームにアップロードし、メッセージ拡張機能をテストできます。

ステップ バイ ステップのガイド

API ベースのメッセージ拡張機能を構築するには、次のステップ バイ ステップ ガイドに従います。

  • 初心者向け: Teams Toolkit を使用して API ベースのメッセージ拡張機能を構築します。
  • 上級ユーザーの場合: API ベースのメッセージ拡張機能を最初からビルドします。

関連項目

API ベースのメッセージ拡張機能の認証