Zitate mit Antwortsemantik anzeigen

Zitate schaffen Vertrauen, dass eine Antwort von Microsoft 365 Copilot korrekt und fundiert ist. Der Antworttext enthält automatisch Zitate für von Copilot synthetisierte Antworten. Der Endbenutzer ist jedoch möglicherweise nicht in der Lage, die Informationsquelle zu öffnen. Wenn Copilot eine Antwort auf öffentliche Webinhalte stützt, wird die URL automatisch angegeben.

Inhalte, die von einem MCP-Server (Model Context Protocol) oder einer API stammen, können eine URL zurückgeben, die ein Endbenutzer öffnen und überprüfen kann. Sie definieren response_semantics in Ihrer Plug-In-Definition, damit Copilot weiß, wo sich diese URL in der Plug-In-Antwort befindet, und das Zitat mit dem richtigen Link anklickbar machen kann.

Wenn Sie diesen Schritt überspringen, kann die Antwort weiterhin ein Zitat enthalten, jedoch nur mit einer repräsentativen Pille oder einem Symbol. Der Endbenutzer kann sich nicht durch die Daten Ihrer Website klicken und diese bestätigen.

Copilot kann Zitationsmetadaten auch automatisch aus allgemeinen Feldnamen ableiten, sodass Sie nicht mehr explizit response_semanticsdefinieren müssen. Explizite Formulierungen response_semantics haben immer noch Vorrang, wenn Sie sie bereitstellen. Dieser dynamische Fallback ist besonders nützlich, wenn Sie die dynamische Toolermittlung verwenden, bei der sich die Tooloberfläche zur Laufzeit ändern kann. Weitere Informationen finden Sie unter Semantik dynamischer Antworten.

Zeigen Sie beim Daraufzeigen auf klickbare Zitate in einer Copilot-Antwort.

Wichtig

Sie benötigen keine adaptive Karte, um Zitate zu erhalten. Antwortsemantik allein – plus data_path ein paar properties Zuordnungen – reicht aus, damit Copilot ein klickbares Zitat rendert, das auf Ihre Quelle verweist.

Erwägen Sie die Verwendung interaktiver MCP-Apps für eine umfassende UX, die über Zitate hinausgeht.

Verwenden der Antwortsemantik

Die in Ihrem Plug-In-Manifest definierte Antwortsemantik fungiert als Vertrag zwischen Ihrem MCP-Server oder Ihrer API und Copilot.

  1. Ihr Tool gibt JSON zurück.

  2. Im Plug-In-Manifest:

    • Sie teilen Copilot mit , wo sich in diesem JSON-Code die zitierfähigen Elemente befinden (data_path).
    • Sie teilen Copilot mit , welche Felder auf jedem Element dem Titel, dem Untertitel und der URL des Zitats zugeordnet werden (properties).
  3. Copilot rendert für jedes Element ein Zitat. Benutzer klicken auf Ihre Quelle.

Wenn Sie explizite properties Zuordnungen angeben, verwendet Copilot diese unverändert. Dynamische Rückschlüsse gelten nur, wenn diese Zuordnungen nicht vorhanden sind. Weitere Informationen finden Sie unter Semantik dynamischer Antworten.

Mindestkonfiguration

Ihre response_semantics Konfiguration wird von der Form der Antwort Ihres Tools bestimmt, nicht vom Protokoll Ihrer Toolantwort. Copilot-Agents mit allen Toolprotokollen (MCP, OpenAPI, Nachrichtenerweiterungen) verwenden dasselbe Manifestschema.

Die meisten Toolantworten fallen in eine von zwei Formen:

  • Ein Array von Ergebnissen (wie ein Suchtool): Das Tool gibt mehrere Elemente zurück, von denen jedes zu einem eigenen Zitat werden sollte.
  • Ein einzelnes Objekt (wie ein Abruftool): Das Tool gibt genau ein Dokument oder einen Datensatz zurück, der zu einem einzelnen Zitat wird.

Array von Ergebnissen (Suchstil)

Tools, die mehrere Elemente zurückgeben, geben in der Regel ein Array unter einem results (oder einem gleichwertigen) Schlüssel zurück, wie im folgenden Beispiel gezeigt.

{
  "results": [
    {
      "id": "tr-001",
      "title": "Forecasting AI adoption in the enterprise (2026)",
      "url": "https://www.treyresearch.net/notes/ai-adoption-2026",
      "publishedDate": "2026-03-12",
      "thumbnailUrl": "https://www.treyresearch.net/assets/trey-research-logo.png"
    },
    {
      "id": "tr-005",
      "title": "Enterprise AI spend, deep dive",
      "url": "https://www.treyresearch.net/notes/ai-spend",
      "publishedDate": "2026-03-28",
      "thumbnailUrl": "https://www.treyresearch.net/assets/trey-research-logo.png"
    }
  ]
}

Das folgende Beispiel zeigt eine Konfiguration der Minimalantwortsemantik im Plug-In-Manifest.

"capabilities": {
  "response_semantics": {
    "data_path": "$.results",
    "properties": {
      "title": "$.title",
      "subtitle": "$.publishedDate",
      "url": "$.url"
    }
  }
}

Die data_path Eigenschaft verweist auf das Array. Jedes Element erzeugt ein eigenes anklickbares Zitat. Die properties JSONPaths werden relativ zu jedem Arrayelement aufgelöst, nicht zum Stamm.

Einzelnes Objekt (Fetch-Stil)

Das folgende Beispiel zeigt eine Antwort, bei der genau ein Datensatz – ein Dokument, eine Entität, eine Datei – als eine Quelle angegeben wird.

{
  "id": "tr-001",
  "title": "Forecasting AI adoption in the enterprise (2026)",
  "text": "Trey Research surveyed 412 enterprise CIOs across North America and EMEA between January and February 2026. We forecast that 64% of Fortune 500 firms will be running at least one production generative AI workload by end of 2026, up from 38% at the close of 2025...",
  "url": "https://www.treyresearch.net/notes/ai-adoption-2026",
  "publishedDate": "2026-03-12",
  "thumbnailUrl": "https://www.treyresearch.net/assets/trey-research-logo.png",
  "metadata": { "source": "trey-research", "category": "AI" }
}

Das folgende Beispiel zeigt eine Konfiguration der Minimalantwortsemantik im Plug-In-Manifest.

"capabilities": {
  "response_semantics": {
    "data_path": "$",
    "properties": {
      "title": "$.title",
      "subtitle": "$.publishedDate",
      "url": "$.url"
    }
  }
}

Die data_path festgelegte Eigenschaft, die das Stammobjekt als einzelnes Zitatelement auswählt $ . Dies ist die richtige Wahl, wenn das Tool einen Datensatz zurückgibt - auch wenn der Datensatz verschachtelte Felder wie metadataenthält.

MCP-Inhaltswrapper

MCP-Tools verpacken ihre Antwort in ein content Array von TextContentBlock Elementen. Copilot analysiert das text Feld jedes Blocks als JSON und wendet dann den data_path Wert an. Die Form innerhalb der text Zeichenfolge steuert Ihre Konfiguration – nicht die äußere content Hülle.

Beispiel für eine MCP-Antwort

{
  "content": [
    {
      "type": "text",
      "text": "{\"id\":\"tr-001\",\"title\":\"Forecasting AI adoption in the enterprise (2026)\",\"url\":\"https://www.treyresearch.net/notes/ai-adoption-2026\"}"
    }
  ]
}

Der Parser entpackt zuerst die text Nutzlast und hinterlässt ein einzelnes Objekt. Sie verwenden die Einzelobjektkonfiguration ("data_path": "$"). Ein MCP-Suchtool, das ein Array innerhalb des text Felds zurückgibt, verwendet die Array-Konfiguration der Ergebnisse (data_path: "$.results").

Dynamische Antwortsemantik (Zero-Config-Fallback)

Explizit response_semantics funktioniert nur dann, wenn Ihre Tools stabil und unveränderlich sind. Das ist oft nicht der Fall: Ein Connector, der auf einem MCP-Server eines Drittanbieters erstellt wurde, aktualisiert häufig seine Tools, sodass Sie das Manifest synchron halten müssen, wenn sich der Server weiterentwickelt. Wenn sich der Server ändert, das Manifest jedoch nicht, wird die strukturierte Fundierung automatisch auf Rohtext zurückgesetzt, und Zitate werden nicht mehr gerendert.

Wenn Ihr Manifest die expliziten properties Zuordnungen auslässt, leitet Copilot Zitationsfelder ab, indem jedes Ergebnisobjekt anhand einer priorisierten Liste bekannter Aliase überprüft wird. Dieser Zero-Config-Fallback ist besonders nützlich bei der dynamischen Toolermittlung, bei der Sie ein Manifest nicht an eine feste Tooloberfläche anheften können.

Feld-Aliasse

Für jedes Zitatfeld überprüft Copilot die folgenden Aliase in der Prioritätsreihenfolge und verwendet die erste gefundene Übereinstimmung.

Feld "Zitat" Aliase (Prioritätsreihenfolge)
URL display_url, displayUrl, web_url, webUrl, url, citation_url, citationUrl, reference_url, referenceUrl, website_url, websiteUrl, web_link, webLink, link, href
Position display_title, displayTitle, title, name, display_name, displayName, web_title, webTitle, subject, heading, caption
Untertitel subtitle, description, summary, snippet, source, provider, site_name, siteName, highlight
Miniaturansicht thumbnail_url, thumbnailUrl, thumbnail, image_url, imageUrl, logo_url, logoUrl, icon_url, iconUrl
Array von Ergebnissen results, items, data, value, records, entries

Regeln zur Lösung

  • URL ist die harte Anforderung. Wenn keine nicht leere URL gefunden wird, überspringt Copilot das Element und gibt keine Zitate aus.
  • Der Titel greift auf den Hostnamen zurück , wenn kein Titelalias vorhanden ist.
  • Untertitel und Miniaturansicht sind opportunistisch. Copilot schließt sie ein, wenn es ein übereinstimmendes Feld erkennt und andernfalls auslässt.

Beispiel

Wenn Ihr MCP-Tool die folgende Antwort zurückgibt, müssen Sie dies nicht explizit definieren response_semantics . Copilot leitet die Zitationsfelder aus den bekannten Aliasen ab.

{
  "isError": false,
  "content": [
    {
      "type": "text",
      "text": "<stringified results>"
    }
  ]
}

Das text Feld enthält die in Zeichenfolgen unterteilten Ergebnisse:

{
  "results": [
    {
      "url": "https://example.com/result1",
      "title": "Result 1",
      "subtitle": "Subtitle for Result 1"
    },
    {
      "url": "https://example.com/result2",
      "title": "Result 2",
      "subtitle": "Subtitle for Result 2"
    }
  ]
}

Da results, url, titleund subtitle alle mit bekannten Aliasen übereinstimmen, rendert Copilot für jedes Element ein anklickbares Zitat. Jeder der entsprechenden Aliase funktioniert an ihrer Stelle – zum Beispiel items or instead of results, or webUrl or href instead of urldata .

Eigenschaften für Zitate

Die folgenden Eigenschaften sind für Zitate verfügbar. Alle Werte sind relative JSONPath-Ausdrücke für ein Element, das von ausgewählt wurde data_path.

Eigenschaft Erforderlich Funktion der Einstellung
title Ja (praktisch) Die anklickbare Überschrift des Zitats.
subtitle Nein Zweite Zeile - Daten, Autoren, Kategorien.
url Ja (praktisch) Wo das Zitat beim Klicken navigiert. Muss ein kanonischer Link zurück zu Ihrer Quelle sein.
thumbnail_url Nein Kleines Bild, das neben dem Zitat angezeigt wird.

Hinweis

Wenn url fehlt, kann auf das Zitat nicht geklickt werden. Diese fehlende Eigenschaft ist ein sehr häufiger Grund, warum Entwickler nicht funktionale Zitate sehen.

Einstellung data_path

Bei der data_path Eigenschaft handelt es sich um einen JSONPath-Ausdruck (RFC 9535). Die Verwendung eines falschen JSONPath-Ausdrucks ist einer der häufigsten Gründe, warum Zitate nicht angezeigt werden.

Wenn Ihre Antwort wie folgt aussieht: Verwenden Sie data_path
{ "results": [ ... ] } $.results
{ "content": [ { "results": [ ... ] } ] } (MCP-Art geschachtelt) $.content[0].results
Ein einzelnes Objekt im Stammverzeichnis (kein Array-Wrapper) $
{ "content": [ { "type": "text", "text": "<stringified JSON>" } ] } (unformatiertes MCP) $ for root oder $.results wenn der innere JSON-Code über ein Array verfügt

Tipp

Vereinfachen Sie Ihre Arrays. Geschachtelte Arrays mit mehreren Ebenen (z. B. ) sind das Schemamuster, $.content[0].results[0].itemsdas am ehesten im Hintergrund fehlschlägt. Wenn Sie Besitzer des Werkzeugantwort-Shapes sind, geben Sie ein flaches results: [...] Array zurück.

Über die Antwortsemantik hinausgehen

Erwägen Sie als erste Präferenz, Ihrem Agenten umfassende UI-Widgets hinzuzufügen. Dieser Ansatz ist zukunftsfähiger und KI-nativ und ermöglicht intelligentere, anpassungsfähigere und nahtlosere Interaktionen.

Hinweis

Der Leitfaden zu adaptiven Karten in diesem Abschnitt gilt nur für deklarative Agents. Die staticTemplate Eigenschaft und das adaptive Kartenrendering für Zitate werden von Copilot-Connectors nicht unterstützt.

Fügen Sie als letzten Ausweg eine adaptive Karte hinzu , wenn - und nur wenn - Sie eine der folgenden Bedingungen benötigen:

  • Ein benutzerdefiniertes visuelles Layout nur für das Zitat (mehrspaltig, Bildbanner, formatierte Textblöcke) oder mehrere Felder, die im Zitat Karte Text gerendert werden (über Titel, Untertitel und URL hinaus).
  • Aktionsschaltflächen , die über das Standardverhalten "Klicken Sie auf das Zitat" hinausgehen (z. B Action.Execute. Symbolleisten mit mehreren Schaltflächen).

Für die überwiegende Mehrheit der Zitierszenarien – "Zeig mir die Quelle und klick mich durch" – überspringen Sie Adaptive Karten vollständig. Sie erhöhen die Komplexität, sind schwieriger zu debuggen und die Standardbenutzeroberfläche für Zitate ist sauber und konsistent mit dem Rest von Copilot.

Beispiel mit adaptiver Karte

"response_semantics": {
  "data_path": "$.content[1].results",
  "properties": {
    "title": "$.title",
    "subtitle": "$.publishedDate",
    "url": "$.url"
  },
  "staticTemplate": {
    "type": "AdaptiveCard",
    "version": "1.4",
    "body": [
      {
        "type": "TextBlock",
        "text": "${title}",
        "weight": "bolder",
        "size": "medium"
      },
      {
        "type": "TextBlock",
        "text": "${subtitle}",
        "isSubtle": true
      },
      {
        "type": "TextBlock",
        "text": "${text}",
        "wrap": true
      }
    ],
    "selectAction": {
      "type": "OpenUrl",
      "url": "${url}"
    }
  }
}

Beachten Sie die ${title}${subtitle}, und ${url} Token. Die gleiche properties Karte, die Sie zuvor gesehen haben, füllt diese Token auf. Die Adaptive Card ist eine Präsentationsschicht über der Antwortsemantik; sie ersetzt sie nicht.

Checkliste zur Problembehandlung

Wenn keine Zitate angezeigt werden, verwenden Sie die folgende Checkliste:

  • Zeigt auf den richtigen Knoten data_path ? Fügen Sie die unformatierte JSON-Antwort Ihres Tools in einen JSONPath-Tester ein, und bestätigen Sie, dass Ihr Ausdruck das erwartete Array oder Objekt zurückgibt.
  • Hat jeder Artikel eine nicht leere url? Fehlende URLs führen dazu, dass nicht geklickt werden kann.
  • Ist das text Feld für MCP-Tools gültiges TextContentBlock JSON? Analysieren Sie es manuell, um dies zu bestätigen.
  • Ist das Schema flach? Wenn Sie tief verschachtelte Arrays haben, versuchen Sie, ein einzelnes flaches Array zurückzugeben.
  • Haben Sie pro Funktion (innerhalb dieser Funktion im Plugin-Manifest) capabilities und nicht im Plugin-Stammverzeichnis deklariertresponse_semantics? Sie müssen den Umfang für die Funktion festlegen.