Freigeben über


Erstellen einer API-basierten Nachrichtenerweiterung

Hinweis

API-basierte Nachrichtenerweiterungen unterstützen nur Suchbefehle.

API-basierte Nachrichtenerweiterungen sind eine Microsoft Teams-App-Funktion, die externe APIs direkt in Teams integriert, um die Benutzerfreundlichkeit Ihrer App zu verbessern und eine nahtlose Benutzererfahrung zu bieten. API-basierte Nachrichtenerweiterungen unterstützen Suchbefehle und können zum Abrufen und Anzeigen von Daten aus externen Diensten innerhalb von Teams verwendet werden, um Workflows zu optimieren, indem sie den Wechsel zwischen Anwendungen reduzieren.

Bevor Sie beginnen, stellen Sie sicher, dass Sie die folgenden Anforderungen erfüllen:


1. OpenAPI Description (OAD)

Stellen Sie sicher, dass Sie die folgenden Richtlinien für das OAD-Dokument (OpenAPI Description) einhalten:

  • Die OpenAPI-Versionen 2.0 und 3.0.x werden unterstützt.
  • JSON und YAML sind die unterstützten Formate.
  • Falls vorhanden, muss der Anforderungstext application/JSON sein.
  • Definieren Sie eine HTTPS-Protokollserver-URL für die servers.url -Eigenschaft.
  • Nur DIE HTTP-Methoden POST und GET werden unterstützt.
  • Das OpenAPI-Beschreibungsdokument muss über einen verfügen operationId.
  • Nur ein erforderlicher Parameter ohne Standardwert ist zulässig.
  • Ein erforderlicher Parameter mit einem Standardwert wird als optional betrachtet.
  • Benutzer dürfen keinen Parameter für eine Kopfzeile oder ein Cookie eingeben.
  • Der Vorgang darf keine erforderlichen Header- oder Cookieparameter ohne Standardwerte aufweisen.
  • Stellen Sie sicher, dass im Dokument OpenAPI Description keine Remoteverweise vorhanden sind.
  • Das Erstellen von Arrays für die Anforderung wird nicht unterstützt. Geschachtelte Objekte in einem JSON-Anforderungstext werden jedoch unterstützt.
  • Teams unterstützt oneOfdie Konstrukte , anyOf, allOf, und not (swagger.io) nicht.

Der folgende Code ist ein Beispiel für ein OpenAPI-Beschreibungsdokument:

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.

Weitere Informationen finden Sie unter OpenAPI-Struktur.


2. App-Manifest

Stellen Sie sicher, dass Sie die folgenden Richtlinien für das App-Manifest einhalten:

  • Legen Sie die App-Manifestversion auf fest 1.17.

  • Legen Sie auf fest composeExtensions.composeExtensionTypeapiBased.

  • Definieren Sie composeExtensions.apiSpecificationFile als relativen Pfad zur OpenAPI-Beschreibungsdatei innerhalb des Ordners. Dadurch wird das App-Manifest mit der API-Spezifikation verknüpft.

  • Definieren Sie apiResponseRenderingTemplateFile als relativen Pfad zur Antwortrenderingvorlage. Dies gibt den Speicherort der Vorlage an, die zum Rendern von API-Antworten verwendet wird.

  • Jeder Befehl muss über einen Link zur Antwortrenderingvorlage verfügen. Dadurch wird jeder Befehl mit dem entsprechenden Antwortformat verbunden.

  • Die Commands.id -Eigenschaft im App-Manifest muss mit dem operationId in der OpenAPI-Beschreibung übereinstimmen.

  • Wenn ein erforderlicher Parameter ohne Standardwert ist, muss der Befehl parameters.name im App-Manifest mit dem parameters.name im Dokument OpenAPI Description übereinstimmen.

  • Wenn kein erforderlicher Parameter vorhanden ist, muss der Befehl parameters.name im App-Manifest mit dem optionalen parameters.name in der OpenAPI-Beschreibung übereinstimmen.

  • Stellen Sie sicher, dass die Parameter für jeden Befehl genau mit den Namen der Parameter übereinstimmen, die für den Vorgang in der OpenAPI-Spezifikation definiert sind.

  • Eine Antwortrenderingvorlage muss pro Befehl definiert werden, der zum Konvertieren von Antworten von einer API verwendet wird.

  • Die vollständige Beschreibung darf 128 Zeichen nicht überschreiten.

    {
    "$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": []
    }
    

Parameter

Name Beschreibung
composeExtensions.composeExtensionType Compose Erweiterungstyp. Aktualisieren Sie den Wert auf apiBased.
composeExtensions.authorization Autorisierungsbezogene Informationen für die API-basierte Nachrichtenerweiterung
composeExtensions.authorization.authType Enumeration möglicher Autorisierungstypen. Unterstützte Werte sind none, apiSecretServiceAuthund microsoftEntra.
composeExtensions.authorization.apiSecretServiceAuthConfiguration Objekterfassungsdetails, die für die Dienstauthentifizierung erforderlich sind. Gilt nur, wenn der Authentifizierungstyp ist apiSecretServiceAuth.
composeExtensions.authorization.apiSecretServiceAuthConfiguration.apiSecretRegistrationId Die Registrierungs-ID wird zurückgegeben, wenn der Entwickler den API-Schlüssel über das Entwicklerportal übermittelt.
composeExtensions.apiSpecificationFile Verweist auf eine OpenAPI-Beschreibungsdatei im App-Paket. Schließen Sie ein, wenn der Typ ist apiBased.
composeExtensions.commands.id Eindeutige ID, die Sie dem Suchbefehl zuweisen. Die Benutzeranforderung enthält diese ID. Die ID muss mit der OperationId in der OpenAPI-Beschreibung verfügbaren übereinstimmen.
composeExtensions.commands.context Array, in dem die Einstiegspunkte für die Nachrichtenerweiterung definiert sind. Die Standardwerte sind compose und commandBox.
composeExtensions.commands.parameters Definiert eine statische Liste von Parametern für den Befehl. Der Name muss dem parameters.name in der OpenAPI-Beschreibung zugeordnet werden. Wenn Sie auf eine Eigenschaft im Anforderungstextschema verweisen, muss der Name oder abfrageparametern zugeordnet properties.name werden.
composeExtensions.commands.apiResponseRenderingTemplateFile Vorlage, die zum Formatieren der JSON-Antwort von der Entwickler-API auf die Antwort für adaptive Karten verwendet wird. [Obligatorisch]

Weitere Informationen finden Sie unter composeExtensions.


3. Antwortrenderingvorlage

Hinweis

Teams unterstützt adaptive Karten bis Version 1.5 und adaptive Karten Designer bis Version 1.6.

  • Definieren Sie die Schemaverweis-URL in der $schema -Eigenschaft, um die Struktur Ihrer Vorlage festzulegen.
  • Die unterstützten Werte für responseLayout sind list und grid, die bestimmen, wie die Antwort visuell dargestellt wird.
  • Ein jsonPath wird für Arrays oder empfohlen, wenn die Daten für die adaptive Karte nicht das Stammobjekt sind. Wenn Ihre Daten beispielsweise unter productDetailsgeschachtelt sind, lautet productDetailsIhr JSON-Pfad .
  • Definieren Sie jsonPath als Pfad zu den relevanten Daten oder Arrays in der API-Antwort. Wenn der Pfad auf ein Array zeigt, wird jeder Eintrag im Array an die Vorlage adaptive Karte gebunden und als separates Ergebnis zurückgegeben. [Optional]
  • Rufen Sie eine Beispielantwort zum Überprüfen der Antwortrenderingvorlage ab. Dies dient als Test, um sicherzustellen, dass Ihre Vorlage wie erwartet funktioniert.
  • Verwenden Sie Tools wie Fiddler oder Postman , um die API aufzurufen und sicherzustellen, dass die Anforderung und die Antwort gültig sind. Dieser Schritt ist entscheidend für die Problembehandlung und die Bestätigung, dass Ihre API ordnungsgemäß funktioniert.
  • Sie können die adaptive Karte Designer verwenden, um die API-Antwort an die Antwortrenderingvorlage zu binden und eine Vorschau der adaptiven Karte anzuzeigen. Fügen Sie die Vorlage in den CARD PAYLOAD EDITOR ein, und fügen Sie den Beispielantworteintrag im SAMPLE DATA EDITOR ein.

Der folgende Code ist ein Beispiel für eine Antwortrenderingvorlage:

Beispiel für eine Antwortrenderingvorlage
{
"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}"
    }
  }
 }

Vorschaukarte

Der Screenshot zeigt ein Beispiel für die Compose-Erweiterung, die bei der Suche nach einem bestimmten Wort ein Array von Vorschaukarten anzeigt. In diesem Fall gibt die Suche nach

Erweiterte adaptive Karte

Beispiel für die Erweiterung der adaptiven Karte, sobald ein Benutzer eine Vorschauversion Karte auswählt. Die adaptive Karte zeigt den Titel, die vollständigen Description-, AssignedTo-, RepairId- und Date-Werte an.

Parameter

Eigenschaft Typ Beschreibung Erforderlich
version string Die Schemaversion der aktuellen Antwortrenderingvorlage. Ja
jsonPath string Der Pfad zum relevanten Abschnitt in den Ergebnissen, auf den responseCardTemplate und previewCardTemplate angewendet werden sollen. Wenn nicht festgelegt, wird das Stammobjekt als relevanter Abschnitt behandelt. Wenn der relevante Abschnitt ein Array ist, wird jeder Eintrag der responseCardTemplate und der previewCardTemplate zugeordnet. Nein
responseLayout responseLayoutType Gibt das Layout der Ergebnisse im Nachrichtenerweiterungs-Flyout an. Die unterstützten Typen sind list und grid. Ja
responseCardTemplate adaptiveCardTemplate Eine Vorlage zum Erstellen einer adaptiven Karte aus einem Ergebniseintrag. Ja
previewCardTemplate previewCardTemplate Eine Vorlage zum Erstellen einer Vorschauversion Karte aus einem Ergebniseintrag. Die resultierende Vorschauversion Karte wird im Flyoutmenü der Nachrichtenerweiterung angezeigt. Ja

JSON-Pfad

Der JSON-Pfad ist optional, sollte aber für Arrays verwendet werden, oder wenn das Objekt, das als Daten für die adaptive Karte verwendet werden soll, nicht das Stammobjekt ist. Der JSON-Pfad sollte dem von Newtonsoft definierten Format folgen. Wenn der JSON-Pfad auf ein Array verweist, wird jeder Eintrag in diesem Array an die Vorlage adaptive Karte gebunden und als separate Ergebnisse zurückgegeben.

Beispiel Angenommen, Sie verfügen über den folgenden JSON-Code für eine Liste von Produkten und möchten für jeden Eintrag ein Karte Ergebnis erstellen.

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

Wie Sie sehen können, befindet sich das Ergebnisarray unter "products", das unter "warehouse" geschachtelt ist, sodass der JSON-Pfad "warehouse.products" lautet.

Verwenden Sie , um eine Vorschau der adaptiven Karte anzuzeigen, indem Sie die Vorlage in Kartennutzlast Editor einfügen. Nehmen Sie https://adaptivecards.io/designer/ einen Beispielantworteintrag aus Ihrem Array oder für Ihr Objekt, und fügen Sie ihn in den Editor für gleiche Daten auf der rechten Seite ein. Stellen Sie sicher, dass die Karte ordnungsgemäß gerendert wird und Ihren Wünschen entspricht. Beachten Sie, dass Teams Karten bis Version 1.5 unterstützt, während der Designer 1.6 unterstützt.

Schemazuordnung

Die Eigenschaften im OpenAPI-Beschreibungsdokument werden der Vorlage für adaptive Karten wie folgt zugeordnet:

  • stringDie Typen , number, und integerboolean werden in textBlock konvertiert.

    Beispiel
    • Quellschema: string, number, integerund boolean

       name:
         type: string
         example: doggie
      
    • Zielschema: Textblock

      {
      "type": "TextBlock",
      "text": "name: ${if(name, name, 'N/A')}",
      "wrap": true
      }
      
  • array: Ein Array wird in einen Container innerhalb der adaptiven Karte konvertiert.

    Beispiel
    • Quellschema: array

          type: array
                    items:
                    required:
                      - name
                    type: object
                      properties:
                      id:
                        type: integer
                      category:
                        type: object
                        properties:
                        name:
                          type: string
      
    • Zielschema: 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: Ein Objekt wird in adaptive Karte in eine geschachtelte Eigenschaft konvertiert.

    Beispiel
    • Quellschema: object

      components:
        schemas:
          Pet:
              category:
                type: object
              properties:
                id:
                  type: integer
                name:
                  type: string
      
      
    • Zielschema: Geschachtelte Eigenschaft in einer adaptiven Karte

      {
        "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: Wenn eine Eigenschaft eine Bild-URL ist, wird sie in ein Image-Element auf der adaptiven Karte konvertiert.

    Beispiel
    • Quellschema: image

          image:
            type: string
            format: uri
            description: The URL of the image of the item to be repaired
      
      
    • Zielschema: "Image"

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

Sie können eine API-basierte Nachrichtenerweiterung mithilfe des Entwicklerportals für Teams, des Teams-Toolkits für Visual Studio Code, der Befehlszeilenschnittstelle (CLI) oder Visual Studio erstellen.

Führen Sie die folgenden Schritte aus, um eine API-basierte Nachrichtenerweiterung über das Entwicklerportal zu erstellen:

  1. Wechseln Sie zum Entwicklerportal.

  2. Wechseln Sie zu Apps.

  3. Wählen Sie + Neue App aus.

  4. Geben Sie einen Namen der App ein, und wählen Sie die Manifestversionals Öffentliche Entwicklervorschau (devPreview) aus.

  5. Klicken Sie auf Hinzufügen.

    Screenshot: App-Name und Manifestversion, die im Entwicklerportal als Neueste Vorabversion (devPreview) ausgewählt ist

  6. Aktualisieren Sie im linken Bereich unter Konfigurieren die folgenden grundlegenden Informationen:

    1. Vollständiger Name
    2. Kurzbeschreibung
    3. Lange Beschreibung
    4. Entwickler- oder Firmenname
    5. Website (muss eine gültige HTTPS-URL sein)
    6. Datenschutzrichtlinie
    7. Nutzungsbedingungen
  7. Klicken Sie auf Speichern.

  8. Wählen Sie App-Features aus.

  9. Wählen Sie Nachrichtenerweiterung aus.

    Screenshot: Option

  10. Wählen Sie unter Nachrichtenerweiterungstyp die Option API aus.

    1. Wenn Sie einen Haftungsausschluss erhalten, der besagt, dass die Bot-Nachrichtenerweiterung bereits von Benutzern verwendet wird. Möchten Sie den Nachrichtenerweiterungstyp in API ändern?, wählen Sie Ja, ändern aus.
  11. Wählen Sie unter OpenAPI-Spezifikation die Option Jetzt hochladen aus.

    Screenshot: Option

  12. Wählen Sie das Dokument OpenAPI-Beschreibung im JSON- oder YAML-Format aus, und wählen Sie Öffnen aus.

  13. Klicken Sie auf Speichern. Es wird ein Popupfenster mit der Meldungs-API-Spezifikation angezeigt, die erfolgreich gespeichert wurde.

  14. Wählen Sie Got it (Erhalten) aus.

    Screenshot: Beispiel der erfolgreich gespeicherten Nachricht

Hinzufügen von Befehlen

Hinweis

Nachrichtenerweiterungen, die aus einer API erstellt wurden, unterstützen nur einen einzelnen Parameter.

Sie können Ihrer Nachrichtenerweiterung Befehle und Parameter hinzufügen, um Befehle hinzuzufügen:

  1. Wählen Sie unter Nachrichtenerweiterungstyp die Option Hinzufügen aus.

    Screenshot: Option zum Hinzufügen von Befehlen im Entwicklerportal

    Das Popupfenster Befehl hinzufügen wird mit einer Liste aller verfügbaren APIs aus dem OpenAPI-Beschreibungsdokument angezeigt.

  2. Wählen Sie eine API aus der Liste aus, und wählen Sie Weiter aus.

    Screenshot: Liste der APIs aus dem OpenAPI-Beschreibungsdokument im Popupfenster

  3. Wählen Sie unter Antwortvorlage die Option Jetzt hochladen aus.

    Screenshot: Option

    Hinweis

    Wenn Sie über mehr als eine API verfügen, stellen Sie sicher, dass Sie die Antwortvorlage für adaptive Karten für jede API hochladen.

  4. Wählen Sie die Antwortvorlagendatei für adaptive Karten im JSON-Format und dann Öffnen aus.

    Die folgenden Attribute werden automatisch aus der Vorlage für adaptive Karten aktualisiert:

    • Befehlstyp
    • Befehls-ID
    • Befehlstitel
    • Parametername
    • Parameterbeschreibung
  5. Aktualisieren Sie unter Details die Befehlsbeschreibung.

  6. Wenn Sie einen Befehl mithilfe eines Triggers in Microsoft 365 Copilot starten möchten, aktivieren Sie die Umschaltfläche Diesen Befehl automatisch ausführen, wenn ein Benutzer die Erweiterung öffnet.

  7. Klicken Sie auf Hinzufügen. Der Befehl wurde erfolgreich hinzugefügt.

    Screenshot: Felder, die auf der Seite mit den Befehlsdetails verfügbar sind

  8. Klicken Sie auf Speichern.

  9. Wählen Sie unter Authentifizierung und Autorisierung eine der folgenden Optionen aus:

    • Keine Authentifizierung (nicht empfohlen)
    • API-Schlüssel
    • OAuth

Eine API-basierte Nachrichtenerweiterung wird erstellt.

Screenshot des Plug-Ins für Microsoft 365 Copilot, das auf der Seite mit den App-Features im Entwicklerportal erstellt wurde.

Zum Testen Der API-basierten Nachrichtenerweiterung, die im Entwicklerportal erstellt wurde, können Sie die folgenden Methoden verwenden:

  • Vorschau in Teams: Öffnen Sie Ihre Nachrichtenerweiterung, und wählen Sie in Teams in der oberen rechten Ecke Vorschau aus. Sie werden zu Teams weitergeleitet, wo Sie die App zu Teams hinzufügen können, um eine Vorschau der App anzuzeigen.

  • App-Paket herunterladen: Wählen Sie auf der Seite der Nachrichtenerweiterung im linken Bereich App-Paket aus, und wählen Sie dann in der oberen linken Ecke des Fensters App-Paket herunterladen aus. Das App-Paket wird in einer .zip-Datei auf Ihren lokalen Computer heruntergeladen. Sie können das App-Paket in Teams hochladen und die Nachrichtenerweiterung testen.

Mehrere Parameter

Mehrere Parameter ermöglichen API-basierten Nachrichtenerweiterungen mehr als einen Eingabetyp für Abfragebefehle. Sie können beispielsweise nach Anime nach Genre, Bewertung, status und Datum suchen.

Sie können die Eingabetypen, Titel, Beschreibungen und Pflichtfelder für die Parameter im Manifest angeben.

  • Die isRequired -Eigenschaft im Parameterfeld gibt an, ob ein Parameter für den Abfragebefehl obligatorisch ist.
  • Die name -Eigenschaft des parameters Felds im App-Manifest muss mit dem id Feld im OpenAPI-Beschreibungsdokument für den entsprechenden Parameter übereinstimmen.

Beispiel

"composeExtensions": [
        {
            "composeExtensionType": "apiBased",
            "apiSpecificationFile": "apiSpecificationFiles/openapi.json",
            "commands": [
                {
                    "context": [
                        "compose"
                    ],
                    "type": "query",
                    "title": "Search Animes",
                    "id": "getAnimeSearch",
                    "parameters": [
                        {
                            "name": "q",
                            "title": "Search Query",
                            "description": "The search query",
                            "isRequired": true
                        },
                        {
                            "name": "type",
                            "inputType": "choiceset",
                            "title": "Type",
                            "description": "Available anime types",
                            "choices": [
                                {
                                    "title": "TV",
                                    "value": "tv"
                                },
                                {
                                    "title": "OVA",
                                    "value": "ova"
                                },
                                {
                                    "title": "Movie",
                                    "value": "movie"
                                },
                                {
                                    "title": "Special",
                                    "value": "special"
                                },
                                {
                                    "title": "ONA",
                                    "value": "ona"
                                },
                                {
                                    "title": "Music",
                                    "value": "music"
                                }
                            ]
                        },
                        {
                            "name": "status",
                            "inputType": "choiceset",
                            "title": "Status",
                            "description": "Available airing statuses",
                            "choices": [
                                {
                                    "title": "Airing",
                                    "value": "airing"
                                },
                                {
                                    "title": "Completed",
                                    "value": "complete"
                                },
                                {
                                    "title": "Upcoming",
                                    "value": "upcoming"
                                }
                            ]
                        },
                        {
                            "name": "rating",
                            "inputType": "choiceset",
                            "title": "Rating",
                            "description": "Available ratings",
                            "choices": [
                                {
                                    "title": "G",
                                    "value": "g"
                                },
                                {
                                    "title": "PG",
                                    "value": "pg"
                                },
                                {
                                    "title": "PG-13",
                                    "value": "pg13"
                                },
                                {
                                    "title": "R",
                                    "value": "r17"
                                },
                                {
                                    "title": "R+",
                                    "value": "r"
                                },
                                {
                                    "title": "Rx",
                                    "value": "rx"
                                }
                            ]
                        }
                    ],
                    "description": "Search animes",
                    "apiResponseRenderingTemplateFile": "response_json/getAnimeSearch.json"
                },
                {
                    "context": [
                        "compose"
                    ],
                    "type": "query",
                    "title": "Search mangas",
                    "id": "getMangaSearch",
                    "parameters": [
                        {
                            "name": "q",
                            "title": "Search Query",
                            "description": "The search query",
                            "isRequired": true
                        },
                        {
                            "name": "type",
                            "inputType": "choiceset",
                            "title": "Type",
                            "description": "Available manga types",
                            "choices": [
                                {
                                    "title": "Manga",
                                    "value": "manga"
                                },
                                {
                                    "title": "Novel",
                                    "value": "novel"
                                },
                                {
                                    "title": "Light Novel",
                                    "value": "lightnovel"
                                },
                                {
                                    "title": "One Shot",
                                    "value": "oneshot"
                                },
                                {
                                    "title": "Doujin",
                                    "value": "doujin"
                                },
                                {
                                    "title": "Manhwa",
                                    "value": "manhwa"
                                },
                                {
                                    "title": "Manhua",
                                    "value": "manhua"
                                }
                            ]
                        },
                        {
                            "name": "status",
                            "inputType": "choiceset",
                            "title": "Status",
                            "description": "Available manga statuses",
                            "choices": [
                                {
                                    "title": "Publishing",
                                    "value": "publishing"
                                },
                                {
                                    "title": "Complete",
                                    "value": "complete"
                                },
                                {
                                    "title": "Hiatus",
                                    "value": "hiatus"
                                },
                                {
                                    "title": "Discontinued",
                                    "value": "discontinued"
                                },
                                {
                                    "title": "Upcoming",
                                    "value": "upcoming"
                                }
                            ]
                        },
                        {
                            "name": "start_date",
                            "title": "Start Date",
                            "description": "Start date of the manga",
                            "inputType": "date"
                        },
                        {
                            "name": "end_date",
                            "title": "End Date",
                            "description": "End date of the manga",
                            "inputType": "date"
                        }
                    ],

Schritt-für-Schritt-Anleitungen

Um eine API-basierte Nachrichtenerweiterung zu erstellen, befolgen Sie die folgenden schrittweisen Anleitungen:

Siehe auch

Authentifizierung für API-basierte Nachrichtenerweiterungen