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 auslösen, bevor ihr create- oder resume-Aufruf zurückkehrt. Der Agent arbeitet möglicherweise bereits – insbesondere bei der 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 eine verlustfreie Ansicht eines großen Start-Bursts benötigen, müssen entweder eine Kapazität konfigurieren, die es abdeckt, oder das Abonnement gleichzeitig ableiten mit start().

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 Pre-Response-Abdeckung – 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)
interactionIdstring
CAPI-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)
reasoningOpaquestring
Verschlüsseltes erweitertes Denken (Anthropische Modelle); sitzungsgebunden
reasoningTextstring
Lesbarer Reasoning-Text aus erweitertem Denken
encryptedContentstring
Verschlüsselte Begründungsinhalte (OpenAI-Modelle); sitzungsgebunden
phasestring
Generationsphase (z. B. "thinking" vs "response")
outputTokensnumber
Tatsächliche Ausgabetokenanzahl aus der API-Antwort
interactionIdstring
CAPI-Interaktions-ID für Telemetrie
parentToolCallIdstring
Deprecated. 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")
argumentsobject
Analysierte 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
parentToolCallIdstring
Deprecated. 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")
inputTokensnumber
Verbrauchte Eingabetoken
outputTokensnumber
Erzeugte Ausgabetoken
reasoningTokensnumber
Ausgabetoken, die für Begründung/Gedankengang verwendet werden (Teilmenge von outputTokens)
cacheReadTokensnumber
Token aus dem Prompt-Cache lesen
cacheWriteTokensnumber
Token werden in den Prompt-Cache geschrieben
cacheExpiresAtstring
ISO 8601-Zeitstempel, zu dem der Prompt-Cache für diesen Modellaufruf abläuft
contentFilterTriggeredboolean
Ob die Antwort durch Inhaltsfilterung blockiert oder gekürzt wurde (finish_reason === 'content_filter')
finishReasonstring
Abschlussgrund des Modells (z. B. "stop", "length", "tool_calls", "content_filter")
costnumber
Kosten für den Modellmultiplikator bei der Abrechnung
durationnumber
API-Aufrufdauer in Millisekunden
timeToFirstTokenMsnumber
Zeit vom Anforderungsversand an das erste empfangene Token (Streaminglatenz)
interTokenLatencyMsnumber
Durchschnittliche Latenz zwischen aufeinander folgenden Token (Streamingdurchsatz)
reasoningEffortstring
Für diesen Aufruf verwendete Aufwandsstufe für die Argumentation (z. B. "low", "medium", "high")
initiatorstring
Was diesen Aufruf ausgelöst hat (z. B. "sub-agent"); fehlt für vom Benutzer initiierte
apiCallIdstring
Abschluss-ID vom Anbieter (z. B. chatcmpl-abc123)
serviceRequestIdstring
Copilot-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.
providerCallIdstring
GitHub-Anforderungsablaufverfolgungs-ID (x-github-request-id)
parentToolCallIdstring
Deprecated. Verwenden der Umschlagebene agentId für die Sub-Agent-Zuordnung
quotaSnapshotsRecord<string, QuotaSnapshot>
Ressourcennutzung pro Kontingent, schlüsseliert nach Kontingentbezeichner
copilotUsageCopilotUsage
Aufschlü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"
argumentsobject
Analysierte Argumente, die an das Tool übergeben werden
mcpServerNamestring
MCP-Servername, wenn das Tool von einem MCP-Server bereitgestellt wird
mcpToolNamestring
Ursprünglicher Toolname auf dem MCP-Server
parentToolCallIdstring
Deprecated. Verwenden der Umschlagebene agentId für die Sub-Agent-Zuordnung

tool.execution_partial_result

Flüchtig Inkrementelle Ausgabe eines laufenden Tools (z. B. gestreamte bash-Ausgabe).

DatenfeldTypErforderlichDescription
toolCallIdstring✅Entspricht dem entsprechenden tool.execution_start
partialOutputstring✅Inkrementeller Ausgabeabschnitt

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
modelstring
Modell, das diesen Toolaufruf generiert hat
interactionIdstring
CAPI-Interaktions-ID
isUserRequestedboolean
true wenn der Benutzer diesen Toolaufruf explizit angefordert hat
resultResult
Bei Erfolg anzeigen (siehe unten)
error{ message, code? }
Vorhanden bei Fehlschlag
toolTelemetryobject
Toolspezifische Telemetrie (z. B. Anzahl der CodeQL-Prüfungen)
parentToolCallIdstring
Deprecated. 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)
detailedContentstring
Vollstä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
argumentsobject
Argumente 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
abortedboolean
True, 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
stackstring
Fehler Stack-Trace
statusCodenumber
HTTP-Statuscode aus der upstream-Anforderung
providerCallIdstring
GitHub 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.
errorstring
Fehlermeldung, wenn die Komprimierung fehlgeschlagen ist
preCompactionTokensnumber
Token vor Komprimierung
postCompactionTokensnumber
Token nach Komprimierung
preCompactionMessagesLengthnumber
Nachrichtenanzahl vor Komprimierung
messagesRemovednumber
Entfernte Nachrichten
tokensRemovednumber
Token entfernt
summaryContentstring
LLM-generierte Zusammenfassung des komprimierten Verlaufs
checkpointNumbernumber
Nummer des für die Wiederherstellung erstellten Checkpoint-Snapshots
checkpointPathstring
Dateipfad, in dem der Prüfpunkt gespeichert wurde
compactionTokensUsed{ input, output, cachedInput }
Tokenverwendung für den Komprimierungsaufruf des LLM
requestIdstring
GitHub-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
gitRootstring
Git-Repository-Stammverzeichnis
repositorystring
Repository im "owner/name" Format
branchstring
Aktuelle 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.maxAiCreditsnumber
Maximale 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
totalPremiumRequestsnumber
Gesamtanzahl der premium-API-Anforderungen, die zur Prüfpunktzeit verwendet werden

session.task_complete

Der Agent hat seine zugewiesene Aufgabe abgeschlossen.

DatenfeldTypErforderlichDescription
summarystring
Zusammenfassung des abgeschlossenen Vorgangs

session.shutdown

Die Sitzung wurde beendet.

DatenfeldTypErforderlichDescription
shutdownType"routine" | "error"✅Normales Herunterfahren oder Absturz
errorReasonstring
Fehlerbeschreibung, 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
currentModelstring
Modell 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?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.

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
allowFreeformboolean
Gibt 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
modelstring
Modell, 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
modelstring
Vom Unter-Agent verwendete Modell
durationMsnumber
Ausführungsdauer der Wanduhr in Millisekunden
totalTokensnumber
Gesamtzahl der verbrauchten Eingabe- und Ausgabetoken
totalToolCallsnumber
Gesamtanzahl 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
modelstring
Modell ausgewählt für den Unter-Agent, wenn bekannt
durationMsnumber
Ausführungsdauer der Wanduhr in Millisekunden
totalTokensnumber
Gesamtanzahl der vor dem Fehler verbrauchten Eingabe- und Ausgabetoken
totalToolCallsnumber
Gesamtanzahl 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[]
Werkzeuge werden automatisch genehmigt, solange diese Fähigkeit aktiv ist.
pluginNamestring
Plugin, aus dem die Fertigkeit stammt
pluginVersionstring
Plugin-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
transformedContentstring
Transformierte Version nach der Vorverarbeitung
attachmentsAttachment[]
Datei-, Verzeichnis-, Auswahl-, Blob- oder GitHub-Referenzanhänge
sourcestring
Nachrichtenquellenkennung
agentModestring
Agentmodus: "interactive", , "plan", "autopilot"oder "shell"
interactionIdstring
CAPI-Interaktions-ID

system.message

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

DatenfeldTypErforderlichDescription
contentstring✅Der Aufforderungstext
role"system" | "developer"✅Nachrichtenfunktion
namestring
Quellenbezeichner
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
argumentsobject
Argumente 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.additionalAiCreditsnumber
KI-Guthaben, die dem aktuellen Maximum hinzugefügt werden sollen, wenn response.action``"add" ist
response.maxAiCreditsnumber
Neuer 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.execution_partial_result  → Streaming tool 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_end
AssistentturnId
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.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_changed
SessionsessionLimits
session.usage_checkpoint
Session
totalNanoAiu, totalPremiumRequests?
session.task_complete
Sessionsummary?
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?
abort
Steuerungreason
user.message
Benutzer
content, attachments?``agentMode?
system.message
System
content, role
external_tool.requested
Externes Werkzeug
requestId, toolName``arguments?
external_tool.completed
Externes 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