Skip to main content
Skip to content

Ereignisse einer Streaming-Sitzung

Jede Aktion, die der Copilot-Agent ausführt – etwa Denken, Schreiben von Code oder Ausführen von Tools – wird als Session-Ereignis ausgegeben, das Sie abonnieren können. Dieses Handbuch ist ein Verweis auf Feldebene für jeden Ereignistyp, sodass Sie genau wissen, welche Daten erwartet werden, ohne die SDK-Quelle zu lesen.

Übersicht

Wenn streaming: true für eine Sitzung festgelegt wird, sendet das SDK kurzlebige Ereignisse in Echtzeit (Deltas, Statusaktualisierungen) neben dauerhaften Ereignissen (vollständige Nachrichten, Toolergebnisse). Alle Ereignisse teilen einen gemeinsamen Umschlag und tragen eine data Nutzlast, deren Shape vom Ereignis typeabhängt.

Diagramm: Sequenzdiagramm mit dem beschriebenen Prozess.

KonzeptDescription
Ephemerales EreignisVorübergehende; in Echtzeit gestreamt, aber nicht im Sitzungsprotokoll gespeichert. Wird beim Fortsetzen der Sitzung nicht wiedergegeben.
Persistiertes EreignisIm Sitzungsereignisprotokoll auf dem Datenträger gespeichert. Wird wiedergegeben, wenn eine Sitzung fortgesetzt wird.
Delta-EreignisEin ephemerer Streamingabschnitt (Text oder Argumentation). Sammeln Sie Deltas, um den vollständigen Inhalt zu erstellen.
parentId KetteJedes Ereignis parentId verweist auf das vorherige Ereignis und bildet eine verknüpfte Liste, die Sie durchlaufen können.

Ereignishülle

Jedes Sitzungsereignis umfasst unabhängig vom Typ die folgenden Felder:

FeldTypDescription
id
string (UUID v4)Eindeutiger Ereignisbezeichner
timestamp
string (ISO 8601)Wann das Ereignis erstellt wurde
parentIdstring | nullID des vorherigen Ereignisses in der Kette; null für das erste Ereignis
agentIdstring?Sub-Agent-Instanz-ID für Sub-Agent-Ursprungsereignisse; für Stamm-/Haupt-Agent- und Sitzungsereignisse nicht vorhanden
ephemeralboolean?
true für vorübergehende Ereignisse; nicht vorhanden oder false für beibehaltene Ereignisse
typestringDiskriminator des Ereignistyps (siehe Tabellen unten)
dataobjectEreignisspezifische Nutzlast

Abonnieren von Ereignissen

Codesprachen navigation

TypeScript
// All events
session.on((event) => {
    console.log(event.type, event.data);
});

// Specific event type — data is narrowed automatically
session.on("assistant.message_delta", (event) => {
    process.stdout.write(event.data.deltaContent);
});

Tipp

(Python / Go) Diese SDKs verwenden für jedes Ereignis separate Datentypen (z. B. AssistantMessageDeltaData), sodass nur die relevanten Felder in jedem Typ vorhanden sind.

(.NET) Das .NET SDK verwendet separate, stark typierte Datenklassen pro Ereignis (z. B. AssistantMessageDeltaData), sodass nur die relevanten Felder für jeden Typ vorhanden sind.

(TypeScript) Das TypeScript SDK verwendet ein discriminated union – wenn Sie auf event.type passen, wird der data Payload automatisch auf die richtige Form eingegrenzt.

Abonnieren vor Beginn einer Sitzung

Eine Sitzung kann Ereignisse ausgeben, bevor ihr create- oder resume-Aufruf zurückkehrt. Der Agent arbeitet möglicherweise bereits – insbesondere bei Fortsetzung mit continuePendingWork – und kurzlebige Ereignisse wie session.idle werden niemals in das Sitzungsprotokoll geschrieben, sodass getMessages sie anschließend nicht wiederherstellen kann. Ein Abonnement, das erst eingerichtet wird, nachdem das Sitzungs-Handle bereits existiert, verpasst dieses Startfenster.

Tipp

(Rust)Client::prepare_session und Client::prepare_resume_session geben ein PreparedSession zurück, das den Ereigniskanal der Sitzung besitzt, bevor irgendeine Protokollaktivität stattfindet. Abonnieren Sie zuerst, und rufen Sie dann auf start().

use github_copilot_sdk::{Client, SessionConfig};

async fn create_without_missing_startup_events(
    client: &Client,
) -> Result<(), github_copilot_sdk::Error> {
    let prepared = client.prepare_session(
        SessionConfig::default().with_event_buffer_capacity(2048),
    )?;

    // Installed before any wire activity: nothing is dropped for lack of a receiver.
    let mut events = prepared.subscribe();
    tokio::spawn(async move {
        while let Ok(event) = events.recv().await {
            println!("{}", event.event_type);
        }
    });

    let session = prepared.start().await?;
    let _ = session;
    Ok(())
}

prepare_* ist synchron und inert: Er überprüft die Pufferkapazität, weist einen lokalen Kanal zu und führt nichts anderes aus. Es ist keine Sitzung registriert, und nichts erreicht die CLI, bis start() erstmals abgefragt wird. Das Ablegen einer vorbereiteten Sitzung, die nie gestartet wurde, hinterlässt keinen Zustand und schließt seine Abonnements; Wenn Sie die start() Zukunft löschen, wird der In-Flight-Start abgebrochen und die Registrierung der Sitzung aufgehoben, sodass ein Wiederholungsversuche mit derselben Sitzungs-ID erfolgreich ist. Die Bereinigung ist auf genau die Registrierung des abgebrochenen Startvorgangs beschränkt, sodass sie keinen Wiederholungsversuch verdrängen kann, der dieselbe Sitzungs-ID bereits übernommen hat.

Es lohnt sich, die Pufferung beim Start einzuplanen:

  • Der Ereignispuffer ist begrenzt – auf 512 Ereignisse, sofern dies nicht durch event_buffer_capacity überschrieben wird. Eine Kapazität von 0 wird mit einem „invalid-config“-Fehler abgelehnt, anstatt begrenzt zu werden.
  • Langsame Abonnenten beobachten einen Lagged Fehler, der meldet, wie viele Ereignisse übersprungen wurden. Sie üben niemals Backpressure auf die Ereignisschleife der Sitzung aus.
  • Verbraucher, die einen lückenlosen Überblick über einen großen Start-Burst benötigen, müssen entweder eine Kapazität konfigurieren, die dies abdeckt, oder das Abonnement gleichzeitig mit start() aufbrauchen.

Hinweis

Bei Cloudsitzungen, in denen der Server die Sitzungs-ID zuweist, kann das SDK keine Benachrichtigungen weiterleiten, bis die Erstellungsantwort eingeht und die ID bekannt ist. Ereignisse, die vor diesem Zeitpunkt ausgelöst werden, lassen sich keiner Sitzung zuordnen. Die Garantie ist eingeschränkter: Weitergeleitete Ereignisse werden nie mangels eines installierten Empfängers verworfen. Heften Sie session_id in der Konfiguration an, um Routing – und vollständige Abdeckung vor der Antwort – ab dem ersten Byte zu erhalten.

Nur die Antwort des übergeordneten Agenten anzeigen

Subagent-Ereignisse teilen den übergeordneten Sitzungsdatenstrom und umfassen agentId auf Envelope-Ebene. Ereignisse des Root-/Haupt-Agenten und Ereignisse auf Sitzungsebene lassen agentId aus, sodass Renderer des Hauptchats Assistentenereignisse, bei denen agentId gesetzt ist, ignorieren und stattdessen an Traces oder die Fortschritts-UI weiterleiten können.

Codesprachen navigation

TypeScript
import type { CopilotSession } from "@github/copilot-sdk";

export function subscribeParentResponse(session: CopilotSession): void {
    session.on("assistant.message_delta", (event) => {
        if (!event.agentId) {
            process.stdout.write(event.data.deltaContent);
        }
    });
}

Ereignisse des Assistenten

Diese Ereignisse verfolgen den Lebenszyklus der Antwort des Agents - vom Start der Abzweigung über die Streaming Chunks bis zur endgültigen Nachricht.

assistant.turn_start

Wird ausgelöst, wenn der Agent mit der Verarbeitung eines Ablaufschritts beginnt.

DatenfeldTypErforderlichDescription
turnIdstring✅Turn-Identifikator (typischerweise eine stringifizierte Turn-Nummer)
interactionIdstringCAPI-Interaktions-ID für Telemetriekorrelation

assistant.intent

Flüchtig Kurze Beschreibung dessen, was der Agent gerade tut, aktualisiert während der Vorgang läuft.

DatenfeldTypErforderlichDescription
intentstring✅Lesbare Absicht (z. B. "Erkunden der Codebasis")

assistant.reasoning

Schließen Sie die erweiterte Denkblockade des Modells ab. Wird nach Abschluss der Begründung ausgegeben.

DatenfeldTypErforderlichDescription
reasoningIdstring✅Eindeutiger Bezeichner für diesen Logikblock
contentstring✅Der vollständige erweiterte Denktext

assistant.reasoning_delta

Flüchtig Inkrementeller Chunk des erweiterten Denkens des Modells, das in Echtzeit gestreamt wird.

DatenfeldTypErforderlichDescription
reasoningIdstring✅Entspricht dem entsprechenden assistant.reasoning Ereignis.
deltaContentstring✅Textabschnitt, der an den Inhalt von Gründen angefügt werden soll

assistant.message

Die vollständige Antwort des Assistenten für diesen LLM-Aufruf. Kann Toolaufrufanforderungen enthalten.

DatenfeldTypErforderlichDescription
messageIdstring✅Eindeutiger Bezeichner für diese Nachricht
contentstring✅Die Textantwort des Assistenten
toolRequestsToolRequest[]Toolaufrufe, die der Assistent tätigen möchte (siehe unten)
reasoningOpaquestringVerschlüsseltes erweitertes Denken (Anthropische Modelle); sitzungsgebunden
reasoningTextstringLesbarer Reasoning-Text aus erweitertem Denken
encryptedContentstringVerschlüsselte Begründungsinhalte (OpenAI-Modelle); sitzungsgebunden
phasestringGenerationsphase (z. B. "thinking" vs "response")
outputTokensnumberTatsächliche Ausgabetokenanzahl aus der API-Antwort
interactionIdstringCAPI-Interaktions-ID für Telemetrie
parentToolCallIdstringDeprecated. Verwenden der Umschlagebene agentId für die Sub-Agent-Zuordnung

** ToolRequest Felder:**

FeldTypErforderlichDescription
toolCallIdstring✅Eindeutige ID für diesen Toolaufruf
namestring✅Toolname (z. B., "bash", "edit", "grep")
argumentsobjectAnalysierte Argumente für das Tool
type"function" | "custom"Anruftyp; Standardwert: "function" wenn nicht vorhanden

assistant.message_delta

Flüchtig Inkrementeller Chunk der Text-Antwort des Assistenten, der in Echtzeit gestreamt wird.

DatenfeldTypErforderlichDescription
messageIdstring✅Entspricht dem entsprechenden assistant.message Ereignis.
deltaContentstring✅Textabschnitt, der an die Nachricht angefügt werden soll
parentToolCallIdstringDeprecated. Verwenden der Umschlagebene agentId für die Sub-Agent-Zuordnung

assistant.turn_end

Wird ausgegeben, wenn der Agent eine Runde abschließt (alle Tool-Ausführungen abgeschlossen, endgültige Antwort geliefert).

DatenfeldTypErforderlichDescription
turnIdstring✅Entspricht dem entsprechenden assistant.turn_start Ereignis.

assistant.usage

Flüchtig Tokenverwendungs- und Kosteninformationen für einen einzelnen API-Aufruf.

DatenfeldTypErforderlichDescription
modelstring✅Modellbezeichner (z. B. "gpt-5.4")
inputTokensnumberVerbrauchte Eingabetoken
outputTokensnumberErzeugte Ausgabetoken
reasoningTokensnumberAusgabetoken, die für Begründung/Gedankengang verwendet werden (Teilmenge von outputTokens)
cacheReadTokensnumberToken aus dem Prompt-Cache lesen
cacheWriteTokensnumberToken werden in den Prompt-Cache geschrieben
cacheExpiresAtstringISO 8601-Zeitstempel, zu dem der Prompt-Cache für diesen Modellaufruf abläuft
contentFilterTriggeredbooleanOb die Antwort durch Inhaltsfilterung blockiert oder gekürzt wurde (finish_reason === 'content_filter')
finishReasonstringAbschlussgrund des Modells (z. B. "stop", "length", "tool_calls", "content_filter")
costnumberKosten für den Modellmultiplikator bei der Abrechnung
durationnumberAPI-Aufrufdauer in Millisekunden
timeToFirstTokenMsnumberZeit vom Anforderungsversand an das erste empfangene Token (Streaminglatenz)
interTokenLatencyMsnumberDurchschnittliche Latenz zwischen aufeinander folgenden Token (Streamingdurchsatz)
reasoningEffortstringFür diesen Aufruf verwendete Aufwandsstufe für die Argumentation (z. B. "low", "medium", "high")
initiatorstringWas diesen Aufruf ausgelöst hat (z. B. "sub-agent"); fehlt für vom Benutzer initiierte
apiCallIdstringAbschluss-ID vom Anbieter (z. B. chatcmpl-abc123)
serviceRequestIdstringCopilot-Dienstanforderungs-ID (x-copilot-service-request-id) für die CAPI-Protokollkorrelation
apiEndpoint"/chat/completions" | "/v1/messages" | "/responses" | "ws:/responses"
API-Endpunkt, der für den Modellaufruf verwendet wird; nützlich für Beobachtbarkeit und zur Kostenzuordnung.
ws:/responses ist die Websocket-Variante der Antwort-API.
providerCallIdstringGitHub-Anforderungsablaufverfolgungs-ID (x-github-request-id)
parentToolCallIdstringDeprecated. Verwenden der Umschlagebene agentId für die Sub-Agent-Zuordnung
quotaSnapshotsRecord<string, QuotaSnapshot>Ressourcennutzung pro Kontingent, schlüsseliert nach Kontingentbezeichner
copilotUsageCopilotUsageAufschlüsselung der Kosten für Tokens aus der API

assistant.streaming_delta

Flüchtig Niedrigrangige Fortschrittsanzeige – Gesamtanzahl der Bytes, die von der Streaming-API-Antwort empfangen wurden.

DatenfeldTypErforderlichDescription
totalResponseSizeBytesnumber✅Bisher empfangene kumulative Bytes

Toolausführungsereignisse

Diese Ereignisse verfolgen den vollständigen Lebenszyklus jedes Toolaufrufs, von der Anforderung durch das Modell über die Ausführung bis zur Fertigstellung.

tool.execution_start

Wird ausgegeben, wenn ein Tool mit der Ausführung beginnt.

DatenfeldTypErforderlichDescription
toolCallIdstring✅Eindeutiger Bezeichner für diesen Toolaufruf
toolNamestring✅Name des Tools (z. B. , "bash", "edit") "grep"
argumentsobjectAnalysierte Argumente, die an das Tool übergeben werden
mcpServerNamestringMCP-Servername, wenn das Tool von einem MCP-Server bereitgestellt wird
mcpToolNamestringUrsprünglicher Toolname auf dem MCP-Server
parentToolCallIdstringDeprecated. Verwenden der Umschlagebene agentId für die Sub-Agent-Zuordnung

tool.execution_partial_result

Deprecated. Verwenden Sie tool.shell_output für die Live-Terminalausgabe. Dieses kurzlebige Ereignis wird während der Migration weiterhin zusammen mit dem Ersatz ausgegeben; abonnieren Sie nur eine Darstellung, um zu vermeiden, dass die gleiche Ausgabe zweimal angezeigt wird.

DatenfeldTypErforderlichDescription
toolCallIdstring✅Entspricht dem entsprechenden tool.execution_start
partialOutputstring✅Begrenzte, Snapshot der kumulativen Ersetzung mit stdout und stderr zusammengeführt; kein Append-only-Block

tool.shell_output

Flüchtig Ausgabe nur im Anhängemodus eines Befehls in einem verbundenen Terminal oder eines vom Benutzer angeforderten Terminalbefehls. Jedes Ereignis enthält neu beobachteten, von Geheimnissen bereinigten Text, ohne die Trennzeichen oder Markierungen, die zum Formatieren der endgültigen Toolergebnisse für das Modell verwendet werden.

DatenfeldTypErforderlichDescription
toolCallIdstring✅Identifiziert den ursprünglichen Toolaufruf.
textstring✅Neuer Text, der angefügt werden soll, kein Ersatz-Snapshot
stream"stdout" | "stderr" | "terminal"
Ausgabe; weggelassen bedeutet "stdout".
"terminal" identifiziert inhärente PTY-Ausgabe, deren Stdout/Stderr-Ursprung nicht wiederhergestellt werden kann
sequencenumber✅Beginnt bei Null und erhöht sich über alle Streams für diesen Toolaufruf in beobachteter Publikationsreihenfolge.

Sammeln Sie separat nach stream und text, oder verbinden Sie die Blöcke in Sequenzreihenfolge für eine kombinierte Anzeige. Eine Sequenznummer identifiziert Duplikate und fehlende Blöcke; es wird keine exakte Reihenfolge zwischen unabhängigen Betriebssystemschreibvorgängen festgelegt. Ein verspäteter Abonnent kann eine erste Sequenz größer als 0 empfangen.

Diese Ereignisse sind nur live: Sie werden nach dem Fortsetzen nicht beibehalten oder erneut gesendet. Endergebnisse tool.execution_complete , modellorientierte Formatierung und getrennte Befehlserfassung sind unverändert. Text kann Terminalsteuerungssequenzen enthalten; Renderer müssen ihre normale Terminaltextbehandlung anwenden.

Ein angefügter Terminalbefehl kann nach tool.execution_complete weiterhin ausgeführt werden, wenn er asynchron ausgeführt wird oder über initial_wait hinaus fortgesetzt wird. Die Ausgabe, die empfangen wird, während sie fortgesetzt wird, verwendet das ursprüngliche toolCallId und setzt dasselbe sequence fort, anstatt bei null neu zu starten. Verbraucher, die nur aktive Aufrufe anzeigen, müssen nach Abschluss empfangene Chunks ignorieren, anstatt den Status eines abgeschlossenen Aufrufs neu zu erstellen.

Die Filterung von Geheimnissen wird für jeden decodierten Block ausgeführt. Die Laufzeit teilt Zeilen nicht künstlich auf, aber Lesevorgänge des Betriebssystems können eine Zeile oder ein Geheimnis über Blöcke hinweg aufteilen; eine Rekonstruktion von Geheimnissen über Blockgrenzen hinweg wird nicht bereitgestellt.

tool.execution_progress

Flüchtig Menschenlesbarer Fortschrittsstatus von einem laufenden Tool (z. B. Fortschrittsbenachrichtigungen des MCP-Servers).

DatenfeldTypErforderlichDescription
toolCallIdstring✅Entspricht dem entsprechenden tool.execution_start
progressMessagestring✅Fortschrittsstatusmeldung

tool.execution_complete

Wird ausgegeben, wenn die Ausführung eines Tools abgeschlossen ist – erfolgreich oder mit einem Fehler.

DatenfeldTypErforderlichDescription
toolCallIdstring✅Entspricht dem entsprechenden tool.execution_start
successboolean✅Ob die Ausführung erfolgreich war
modelstringModell, das diesen Toolaufruf generiert hat
interactionIdstringCAPI-Interaktions-ID
isUserRequestedboolean
true wenn der Benutzer diesen Toolaufruf explizit angefordert hat
resultResultBei Erfolg und bei Fehlern, wenn das Tool Inhalte zusammen mit der Fehlermeldung zurückgegeben hat (siehe unten)
error{ message, code? }Vorhanden bei Fehlschlag
toolTelemetryobjectToolspezifische Telemetrie (z. B. Anzahl der CodeQL-Prüfungen)
parentToolCallIdstringDeprecated. Verwenden der Umschlagebene agentId für die Sub-Agent-Zuordnung

** Result Felder:**

FeldTypErforderlichDescription
contentstring✅Kurzes Ergebnis, das an das LLM gesendet wird (kann aus Gründen der Token-Effizienz verkürzt werden)
detailedContentstringVollständiges Ergebnis für die Anzeige, unter Beibehaltung des vollständigen Inhalts wie Diffs
contentsContentBlock[]Strukturierte Inhaltsblöcke (Text, Terminal, Bild, Audio, Ressource)

tool.user_requested

Wird ausgegeben, wenn der Benutzende explizit einen Tool-Aufruf anfordert (und nicht das Modell selbst einen Aufruf vornimmt).

DatenfeldTypErforderlichDescription
toolCallIdstring✅Eindeutiger Bezeichner für diesen Toolaufruf
toolNamestring✅Name des Tools, das der Benutzer aufrufen möchte
argumentsobjectArgumente für den Aufruf

Sitzungslebenszyklusereignisse

session.idle

Flüchtig Der Agent hat die gesamte Verarbeitung abgeschlossen und ist bereit für die nächste Nachricht. Dies ist das Signal, dass eine Drehung vollständig abgeschlossen ist.

DatenfeldTypErforderlichDescription
abortedbooleanTrue, wenn die vorhergehende Drehung per Abbruchsignal abgebrochen wurde

session.error

Ein Fehler ist während der Sitzungsverarbeitung aufgetreten.

DatenfeldTypErforderlichDescription
errorTypestring✅Fehlerkategorie (z. B. , "authentication", "quota") "rate_limit"
messagestring✅Vom Menschen lesbare Fehlermeldung
stackstringFehler Stack-Trace
statusCodenumberHTTP-Statuscode aus der upstream-Anforderung
providerCallIdstringGitHub Anforderungsablaufverfolgungs-ID für die serverseitige Protokollkorrelation

session.compaction_start

Die Verdichtung des Kontextfensters hat begonnen. Die Datennutzlast ist leer ({}).

session.compaction_complete

Die Verdichtung des Kontextfensters wurde abgeschlossen.

DatenfeldTypErforderlichDescription
successboolean✅Gibt an, ob die Komprimierung erfolgreich war.
errorstringFehlermeldung, wenn die Komprimierung fehlgeschlagen ist
preCompactionTokensnumberToken vor Komprimierung
postCompactionTokensnumberToken nach Komprimierung
preCompactionMessagesLengthnumberNachrichtenanzahl vor Komprimierung
messagesRemovednumberEntfernte Nachrichten
tokensRemovednumberToken entfernt
summaryContentstringLLM-generierte Zusammenfassung des komprimierten Verlaufs
checkpointNumbernumberNummer des für die Wiederherstellung erstellten Checkpoint-Snapshots
checkpointPathstringDateipfad, in dem der Prüfpunkt gespeichert wurde
compactionTokensUsed{ input, output, cachedInput }Tokenverwendung für den Komprimierungsaufruf des LLM
requestIdstringGitHub-Anforderungsablaufverfolgungs-ID für den Kompaktierungsaufruf

session.title_changed

Flüchtig Der automatisch generierte Titel der Sitzung wurde aktualisiert.

DatenfeldTypErforderlichDescription
titlestring✅Neuer Sitzungstitel

session.context_changed

Der Arbeitsverzeichnis- oder Repositorykontext der Sitzung wurde geändert.

DatenfeldTypErforderlichDescription
cwdstring✅Aktuelles Arbeitsverzeichnis
gitRootstringGit-Repository-Stammverzeichnis
repositorystringRepository im "owner/name" Format
branchstringAktuelle Git-Verzweigung

session.usage_info

Flüchtig Momentaufnahme der Kontextfensterverwendung.

DatenfeldTypErforderlichDescription
tokenLimitnumber✅Maximale Token für das Kontextfenster des Modells
currentTokensnumber✅Aktuelle Token im Kontextfenster
messagesLengthnumber✅Aktuelle Anzahl der Nachrichten in der Konversation

session.session_limits_changed

Die Sitzungslimits wurden für den aktuellen Abrechnungszeitraum geändert. Ein null``sessionLimits Wert bedeutet, dass keine Grenzwerte aktiv sind.

DatenfeldTypErforderlichDescription
sessionLimitsSessionLimitsConfig | null✅Aktuelle Sitzungsgrenzwerte oder null wenn keine Grenzwerte aktiv sind
sessionLimits.maxAiCreditsnumberMaximale zulässige KI-Gutschriften innerhalb des aktuellen Abrechnungszeitraums der Sitzung

session.usage_checkpoint

Dauerhafter Aggregatverwendungsprüfpunkt, der zum Rekonstruieren der Buchhaltung verwendet wird, wenn eine Sitzung fortgesetzt wird.

DatenfeldTypErforderlichDescription
totalNanoAiunumber✅Sitzungsweit kumulierte Kosten für Nano-AI-Einheiten zum Zeitpunkt des Checkpoints
totalPremiumRequestsnumberGesamtanzahl der premium-API-Anforderungen, die zur Prüfpunktzeit verwendet werden

session.task_complete

Der Agent hat seine zugewiesene Aufgabe abgeschlossen.

DatenfeldTypErforderlichDescription
summarystringZusammenfassung des abgeschlossenen Vorgangs

session.shutdown

Die Sitzung wurde beendet.

DatenfeldTypErforderlichDescription
shutdownType"routine" | "error"✅Normales Herunterfahren oder Absturz
errorReasonstringFehlerbeschreibung, wenn shutdownType gleich "error" ist
totalPremiumRequestsnumber✅Gesamtanzahl der verwendeten Premium-API-Anforderungen
totalApiDurationMsnumber✅Kumulierte API-Aufrufzeit in Millisekunden
sessionStartTimenumber✅Unix-Zeitstempel (ms) beim Starten der Sitzung
codeChanges{ linesAdded, linesRemoved, filesModified }✅Aggregierte Codeänderungsmetriken
modelMetricsRecord<string, ModelMetric>✅Aufschlüsselung der Modellnutzung
currentModelstringModell zum Zeitpunkt des Herunterfahrens ausgewählt

Berechtigungs- und Benutzereingabeereignisse

Diese Ereignisse werden ausgegeben, wenn der Agent eine Genehmigung oder Eingabe des Benutzers benötigt, bevor er fortfahren kann.

permission.requested

Der Agent benötigt die Berechtigung zum Ausführen einer Aktion (Ausführen eines Befehls, Schreiben einer Datei usw.).

DatenfeldTypErforderlichDescription
requestIdstring✅Verwenden Sie dies, um über session.respondToPermission() zu antworten.
permissionRequestPermissionRequest✅Details der angeforderten Berechtigung

Der permissionRequest ist ein discriminated union auf kind:

kindSchlüsselfelderDescription
"shell"
fullCommandText, intention, commands[], possiblePaths[]Ausführen eines Shellbefehls
"write"
fileName, diff, intention, newFileContents?, , fileEdits?Schreiben/Ändern einer Datei
"read"
path, intentionLesen einer Datei oder eines Verzeichnisses
"mcp"
serverName, toolName, toolTitle, args?, , readOnlyAufrufen eines MCP-Tools
"url"
url, intentionAbrufen einer URL
"memory"
subject, fact``citationsEin Gedächtnis speichern
"custom-tool"
toolName, toolDescription``args?Aufrufen eines benutzerdefinierten Tools

Alle kind Varianten enthalten auch eine optionale toolCallId Verknüpfung mit dem Toolaufruf, der die Anforderung ausgelöst hat.

Schreibanforderungen können auch fileEdits sowohl in permissionRequest als auch in promptRequest enthalten. Jeder Eintrag enthält einen optionalen before und einen path Snapshot, jeweils mit einem absoluten content im Namespace des Sitzungsdateisystems und einem vollständigen UTF-8-after. Ein fehlendes before bedeutet Erstellung; ein fehlendes after bedeutet Löschung. Eine leere content Zeichenfolge stellt eine leere Datei dar, keine nicht verfügbare Vorschau. Eine Bewegung kann unterschiedliche Pfade auf ihren beiden Seiten haben. Wenn eine Verschiebung ein vorhandenes Ziel überschreibt, beschreiben separate Einträge den Quelllöschvorgang und den Zielersetzungsvorgang.

Diese Momentaufnahmen beschreiben den geplanten Vorgang, nicht ein späteres Auslesen des Live-Dateisystems. Die Laufzeit lässt fileEdits aus, wenn keine vollständige Textvorschau bereitgestellt werden kann, einschließlich Anfragen, die vor dem Lesen einer sandbox-geschützten Datei gestellt werden, Inhalte, die nicht in UTF-8 codiert sind, oder eines nicht lesbaren oder nicht regulären Verschiebungsziels, z. B. einer benannten Pipe. Leiten Sie keinen Löschvorgang aus einem leeren Legacy-Wert newFileContents ab. Die vorhandenen Felder und Genehmigungsoptionen bleiben für Verbraucher verfügbar, die keine Vorschau verwenden.

permission.completed

Eine Berechtigungsanfrage wurde gelöst.

DatenfeldTypErforderlichDescription
requestIdstring✅Entspricht dem entsprechenden permission.requested
result.kindstring✅Einer von: "approved", , "denied-by-rules"``"denied-interactively-by-user", , "denied-no-approval-rule-and-could-not-request-from-user"``"denied-by-content-exclusion-policy"

user_input.requested

Flüchtig Der Agent stellt dem Benutzer eine Frage.

DatenfeldTypErforderlichDescription
requestIdstring✅Verwenden Sie dies, um über session.respondToUserInput() zu antworten.
questionstring✅Die Frage, die dem Benutzer präsentiert werden soll
choicesstring[]Vordefinierte Auswahlmöglichkeiten für den Benutzer
allowFreeformbooleanGibt an, ob Freiformtexteingaben zulässig sind.

user_input.completed

Flüchtig Eine Benutzereingabeanforderung wurde aufgelöst.

DatenfeldTypErforderlichDescription
requestIdstring✅Entspricht dem entsprechenden user_input.requested

elicitation.requested

Flüchtig Der Agent benötigt strukturierte Formulareingaben vom Benutzer (MCP-Elicitationsprotokoll).

DatenfeldTypErforderlichDescription
requestIdstring✅Verwenden Sie dies, um über session.respondToElicitation() zu antworten.
messagestring✅Beschreibung der benötigten Informationen
mode"form"Elicitationsmodus (derzeit nur "form")
requestedSchema{ type: "object", properties, required? }✅JSON-Schema zur Beschreibung der Formularfelder

elicitation.completed

Flüchtig Eine Anfrage wurde behoben.

DatenfeldTypErforderlichDescription
requestIdstring✅Entspricht dem entsprechenden elicitation.requested

Sub-Agenten und Skill-Ereignisse

subagent.started

Ein angepasster Agent wurde als Sub-Agent aufgerufen.

DatenfeldTypErforderlichDescription
toolCallIdstring✅Übergeordneter Werkzeugaufruf, der diesen Unter-Agenten erzeugt hat
agentNamestring✅Interner Name des Unter-Agents
agentDisplayNamestring✅Menschenlesbarer Anzeigename
agentDescriptionstring✅Beschreibung der Funktionsweise des Unter-Agents
modelstringModell, mit dem der Sub-Agent ausgeführt wird, sofern dies beim Start bekannt ist

subagent.completed

Ein Sub-Agent wurde erfolgreich abgeschlossen.

DatenfeldTypErforderlichDescription
toolCallIdstring✅Entspricht dem entsprechenden subagent.started
agentNamestring✅Interner Name
agentDisplayNamestring✅Anzeigename
modelstringVom Unter-Agent verwendete Modell
durationMsnumberAusführungsdauer der Wanduhr in Millisekunden
totalTokensnumberGesamtzahl der verbrauchten Eingabe- und Ausgabetoken
totalToolCallsnumberGesamtanzahl der getätigten Toolaufrufe

subagent.failed

Bei einem Unter-Agent ist ein Fehler aufgetreten.

DatenfeldTypErforderlichDescription
toolCallIdstring✅Entspricht dem entsprechenden subagent.started
agentNamestring✅Interner Name
agentDisplayNamestring✅Anzeigename
errorstring✅Fehlermeldung
modelstringModell ausgewählt für den Unter-Agent, wenn bekannt
durationMsnumberAusführungsdauer der Wanduhr in Millisekunden
totalTokensnumberGesamtanzahl der vor dem Fehler verbrauchten Eingabe- und Ausgabetoken
totalToolCallsnumberGesamtanzahl der Aufrufe von Tools, die vor einem Fehler ausgeführt wurden

subagent.selected

Ein benutzerdefinierter Agent wurde ausgewählt (abgeleitet), um die aktuelle Anforderung zu verarbeiten.

DatenfeldTypErforderlichDescription
agentNamestring✅Interner Name des ausgewählten Agents
agentDisplayNamestring✅Anzeigename
toolsstring[] | null✅Für diesen Agent verfügbare Toolnamen; null für alle Tools

subagent.deselected

Ein benutzerdefinierter Agent wurde deaktiviert und kehrt zum Standard-Agent zurück. Die Datennutzlast ist leer ({}).

skill.invoked

Für die aktuelle Unterhaltung wurde eine Fähigkeit aktiviert.

DatenfeldTypErforderlichDescription
namestring✅Qualifikationsname
pathstring✅Dateipfad zur SKILL.md Definition
contentstring✅Vollständiger Skill-Inhalt, der in die Kommunikation eingespeist wird
allowedToolsstring[]Tools, die im Frontmatter des allowed-tools Skills aufgeführt sind. Das SDK gewährt sie nicht automatisch; der Permission-Handler entscheidet weiterhin. Die Copilot CLI genehmigt sie automatisch, während der Skill aktiv ist.
pluginNamestringPlugin, aus dem die Fertigkeit stammt
pluginVersionstringPlugin-Version

Andere Ereignisse

abort

Die aktuelle Drehung wurde abgebrochen.

DatenfeldTypErforderlichDescription
reasonstring✅Warum die Drehung abgebrochen wurde (z. B. "user initiated")

user.message

Der Benutzer hat eine Nachricht gesendet. Aufgezeichnet für den Sitzungsverlauf.

DatenfeldTypErforderlichDescription
contentstring✅Der Nachrichtentext des Benutzers
transformedContentstringTransformierte Version nach der Vorverarbeitung
attachmentsAttachment[]Datei-, Verzeichnis-, Auswahl-, Blob- oder GitHub-Referenzanhänge
sourcestringNachrichtenquellenkennung
agentModestringAgentmodus: "interactive", , "plan", "autopilot"oder "shell"
interactionIdstringCAPI-Interaktions-ID

system.message

Eine System- oder Entwickleraufforderung wurde in die Unterhaltung eingefügt.

DatenfeldTypErforderlichDescription
contentstring✅Der Aufforderungstext
role"system" | "developer"✅Nachrichtenfunktion
namestringQuellenbezeichner
metadata{ promptVersion?, variables? }Metadaten der Prompt-Vorlage

external_tool.requested

Der Agent möchte ein externes Tool aufrufen (eines, das vom SDK-Consumer bereitgestellt wird).

DatenfeldTypErforderlichDescription
requestIdstring✅Verwenden Sie dies, um über session.respondToExternalTool() zu antworten.
sessionIdstring✅Sitzung, zu der diese Anforderung gehört
toolCallIdstring✅Toolaufruf-ID für diesen Aufruf
toolNamestring✅Name des externen Tools
argumentsobjectArgumente für das Tool

external_tool.completed

Eine externe Toolanforderung wurde aufgelöst.

DatenfeldTypErforderlichDescription
requestIdstring✅Entspricht dem entsprechenden external_tool.requested

exit_plan_mode.requested

Flüchtig Der Agent hat einen Plan erstellt und möchte den Planmodus beenden.

DatenfeldTypErforderlichDescription
requestIdstring✅Verwenden Sie dies, um über session.respondToExitPlanMode() zu antworten.
summarystring✅Zusammenfassung des Plans
planContentstring✅Vollständiger Inhalt der Plandatei
actionsstring[]✅Verfügbare Benutzeraktionen (z. B. Genehmigen, Bearbeiten, Ablehnen)
recommendedActionstring✅Vorgeschlagene Maßnahme

exit_plan_mode.completed

Flüchtig Eine Anforderung für den Exit-Plan-Modus wurde aufgelöst.

DatenfeldTypErforderlichDescription
requestIdstring✅Entspricht dem entsprechenden exit_plan_mode.requested

command.queued

Flüchtig Ein Slash-Befehl wurde zur Ausführung in die Warteschlange gestellt.

DatenfeldTypErforderlichDescription
requestIdstring✅Verwenden Sie dies, um über session.respondToQueuedCommand() zu antworten.
commandstring✅Der Text des Slash-Befehls (z. B. /help, /clear)

command.completed

Flüchtig Ein Befehl in der Warteschlange wurde aufgelöst.

DatenfeldTypErforderlichDescription
requestIdstring✅Entspricht dem entsprechenden command.queued

session_limits_exhausted.requested

Flüchtig Das aktuelle Sitzungsbudget wurde ausgeschöpft und die Laufzeit erfordert eine Entscheidung des Benutzers, bevor fortgefahren werden kann.

DatenfeldTypErforderlichDescription
requestIdstring✅Verwenden Sie diese ID, wenn Sie auf die ausstehende Anfrage zu einem ausgeschöpften Limit antworten.
maxAiCreditsnumber✅Konfigurierte maximale KI-Credits für den aktuellen Abrechnungszeitraum
usedAiCreditsnumber✅KI-Gutschriften, die bereits im aktuellen Abrechnungsfenster verbraucht wurden

session_limits_exhausted.completed

Flüchtig Eine ausstehende Anfrage wegen eines ausgeschöpften Limits wurde bearbeitet.

DatenfeldTypErforderlichDescription
requestIdstring✅Entspricht dem entsprechenden session_limits_exhausted.requested Ereignis.
response.action"add" | "set" | "unset" | "cancel"✅Ausgewählte Aktion für die Anfrage bei erreichtem Limit
response.additionalAiCreditsnumberKI-Guthaben, die dem aktuellen Maximum hinzugefügt werden sollen, wenn response.action``"add" ist
response.maxAiCreditsnumberNeuer absoluter Höchstwert für AI-Credits, wenn response.action``"set" ist

Kurzübersicht: Agentischer Handlungsfluss

Ein typischer Agent gibt Ereignisse in dieser Reihenfolge aus:

assistant.turn_start          → Turn begins
├── assistant.intent          → What the agent plans to do (ephemeral)
├── assistant.reasoning_delta → Streaming thinking chunks (ephemeral, repeated)
├── assistant.reasoning       → Complete thinking block
├── assistant.message_delta   → Streaming response chunks (ephemeral, repeated)
├── assistant.message         → Complete response (may include toolRequests)
├── assistant.usage           → Token usage for this API call (ephemeral)
│
├── [If tools were requested:]
│   ├── permission.requested  → Needs user approval
│   ├── permission.completed  → Approval result
│   ├── tool.execution_start  → Tool begins
│   ├── tool.shell_output              → Stream-tagged terminal output (ephemeral, repeated)
│   ├── tool.execution_progress        → Progress updates (ephemeral, repeated)
│   ├── tool.execution_complete        → Tool finished
│   │
│   └── [Agent loops: more reasoning → message → tool calls...]
│
assistant.turn_end            → Turn complete
session.idle                  → Ready for next message (ephemeral)

Alle Ereignistypen auf einen Blick

In dieser Tabelle sind die wichtigsten data Nutzlastfelder aufgeführt. Allgemeine Umschlagfelder sind oben dokumentiert.

EreignistypKurzlebigKategorieSchlüsseldatenfelder
assistant.turn_start
Assistent
turnId, interactionId?
assistant.intent✅Assistentintent
assistant.reasoning
Assistent
reasoningId, content
assistant.reasoning_delta✅Assistent
reasoningId, deltaContent
assistant.streaming_delta✅AssistenttotalResponseSizeBytes
assistant.message
Assistent
messageId, content, toolRequests?, outputTokens?, , phase?
assistant.message_delta✅Assistent
messageId, deltaContent
assistant.turn_endAssistentturnId
assistant.usage✅Assistent
model, apiEndpoint?, inputTokens?, outputTokens?, , cost?, duration?
tool.user_requested
Werkzeug
toolCallId, toolName``arguments?
tool.execution_start
Werkzeug
toolCallId, toolName, arguments?, mcpServerName?
tool.execution_partial_result✅Werkzeug
toolCallId, partialOutput
tool.shell_output✅Werkzeug
toolCallId, text, stream?, sequence
tool.execution_progress✅Werkzeug
toolCallId, progressMessage
tool.execution_complete
Werkzeug
toolCallId, success, result?, error?
session.idle✅Sessionaborted?
session.error
Session
errorType, message``statusCode?
session.compaction_start
Session
(leer)
session.compaction_complete
Session
success, preCompactionTokens?``summaryContent?
session.title_changed✅Sessiontitle
session.context_changed
Session
cwd, gitRoot?, repository?, branch?
session.usage_info✅Session
tokenLimit, currentTokens``messagesLength
session.session_limits_changedSessionsessionLimits
session.usage_checkpoint
Session
totalNanoAiu, totalPremiumRequests?
session.task_completeSessionsummary?
session.shutdown
Session
shutdownType, codeChanges``modelMetrics
permission.requested
Erlaubnis
requestId, permissionRequest
permission.completed
Erlaubnis
requestId, result.kind
user_input.requested✅Benutzereingabe
requestId, question``choices?
user_input.completed✅BenutzereingaberequestId
elicitation.requested✅Benutzereingabe
requestId, message``requestedSchema
elicitation.completed✅BenutzereingaberequestId
subagent.started
Unteragent
toolCallId, agentName, agentDisplayName, model?
subagent.completed
Unteragent
toolCallId, agentName, agentDisplayName, model?, durationMs?, , totalTokens?, totalToolCalls?
subagent.failed
Unteragent
toolCallId, agentName, error, model?, durationMs?, , totalTokens?, totalToolCalls?
subagent.selected
Unteragent
agentName, agentDisplayName``tools
subagent.deselected
Unteragent
(leer)
skill.invoked
Skill
name, path, content, allowedTools?
abortSteuerungreason
user.message
Benutzer
content, attachments?``agentMode?
system.message
System
content, role
external_tool.requested
Externes Werkzeug
requestId, toolName``arguments?
external_tool.completedExternes WerkzeugrequestId
command.queued✅Befehl
requestId, command
command.completed✅BefehlrequestId
session_limits_exhausted.requested✅Session
requestId, maxAiCredits``usedAiCredits
session_limits_exhausted.completed✅Session
requestId, response.action
exit_plan_mode.requested✅Planmodus
requestId, summary, planContent, actions
exit_plan_mode.completed✅PlanmodusrequestId