Zum Hauptinhalt springen

AG-UI-Protokollreferenz

Diese Seite beschreibt die von iac-code agui bereitgestellte HTTP/SSE-Schnittstelle und die iac-code-Erweiterungsfelder in standardisierten AG-UI-Umschlägen. Lesen Sie zuerst den Überblick und die Ersten Schritte.

HTTP-Endpunkte

Methode und PfadZweck
GET /healthDienststatus und Protokollversionen
POST /RunAgentInput senden und SSE-Ereignisstrom empfangen
POST /extensions/iac-code/v1/executions/{executionId}/cancelNamensraumgebundene Abbrucherweiterung

Der Body von POST / muss JSON verwenden; Clients sollten SSE anfordern:

Content-Type: application/json
Accept: text/event-stream

Bei konfiguriertem IAC_CODE_AGUI_AUTH_TOKEN ist außerdem erforderlich:

Authorization: Bearer <token>

Der Standardheader Accept-Language dient als Rückfall für Fehlermeldungen. forwardedProps.iacCode.preferredLanguage hat Vorrang und wird an die A2A-Runtime weitergeleitet.

RunAgentInput

Minimales Beispiel für einen normalen Lauf:

{
"threadId": "8473547e-c8ed-4aef-a84c-603a6a8d42da",
"runId": "32c263f2-b0b0-42ac-905c-524a0a9bb652",
"state": {},
"messages": [
{"id": "message-1", "role": "user", "content": "Erstelle eine VPC-Vorlage"}
],
"tools": [],
"context": [],
"forwardedProps": {
"iacCode": {
"schemaVersion": 1,
"rosInvocationId": "invocation-1",
"cwd": "/workspace/session-1",
"runMode": "normal"
}
}
}

Standardfelder

FeldAnforderungVerhalten von iac-code
threadIdErforderliche, nicht leere ZeichenfolgeStabile Gesprächsidentität für einen A2A-Kontext und eine iac-code-Sitzung
runIdErforderliche, nicht leere ZeichenfolgeEin HTTP/SSE-Lauf; darf im Thread nicht wiederverwendet werden
parentRunIdOptionalWird nach RUN_STARTED kopiert
stateErforderlichBleibt im Standardumschlag, wird aber nicht als iac-code-Laufzeitstatus genutzt
messagesErforderlichNeuer Lauf verwendet die letzte Benutzernachricht; eine Wiederaufnahme benötigt keine neue
toolsErforderlich und leerClientdefinierte Werkzeuge werden nicht unterstützt
contextErforderlichBleibt im Umschlag, wird derzeit nicht in Prompt-Kontext umgewandelt
forwardedPropsErforderlichMuss die Erweiterung iacCode enthalten
resumeBei WiederaufnahmeEine Antwort für jede ausstehende Unterbrechung

Benutzernachrichten unterstützen Zeichenfolgen sowie text- und image-Teile mit eingebetteten Base64-data-Quellen. Entfernte Bild-URLs, Audio, Video, Dokumente und allgemeine Binärteile werden nicht unterstützt. Ein dekodiertes Bild ist auf 8 MiB, alle Bilder zusammen auf 10 MiB und die gesamte HTTP-Anfrage auf 12 MiB begrenzt.

forwardedProps.iacCode

Das Schema ist strikt; unbekannte Felder werden abgelehnt.

FeldTypErforderlichBedeutung
schemaVersion1JaVersion der iac-code-Erweiterung
rosInvocationIdZeichenfolgeJaAufruferidentität der aktuellen Ausführung, maximal 256 Zeichen
cwdZeichenfolgeJaAbsoluter Arbeitsbereichspfad
modelZeichenfolgeNeinModellüberschreibung pro Anfrage
llmApiKeyZeichenfolgeNeinLLM-Anbieterschlüssel pro Anfrage
thinking.enabledbooleschNeinReasoning-Ausgabe anfordern
thinking.effortZeichenfolgeNeinAnbieterspezifischer Reasoning-Aufwand
thinking.budgetpositive GanzzahlNeinAnbieterspezifisches Reasoning-Budget
userIdZeichenfolgeNeinIdentität für Telemetrie und Aufruferbindung
channelZeichenfolgeNeinMetadaten des Aufruferkanals
preferredLanguageZeichenfolgeNeinAnfragelokale Anzeigesprache, etwa de
candidatePresentationstandard oder richNeinDarstellung von Pipeline-Kandidaten
runModenormal oder pipelineNeinAusführungsmodus, andernfalls durch A2A gewählt
pipelineNameZeichenfolgeNeinPipeline-Name, zum Beispiel selling
cleanupOnlybooleschNeinNur Pipeline-Bereinigung anfordern
alibabaCloud.accessKeyIdZeichenfolgeNeinAnfragebezogene AccessKey-ID
alibabaCloud.accessKeySecretZeichenfolgeNeinAnfragebezogenes AccessKey-Secret
alibabaCloud.securityTokenZeichenfolgeNeinAnfragebezogenes STS-Token
alibabaCloud.regionIdZeichenfolgeNeinAnfragebezogene Standardregion

Der erste Lauf und seine Wiederaufnahmen müssen dieselbe rosInvocationId behalten. Eine spätere normale Runde darf einen neuen Wert verwenden. Beim Abbruch ist der Wert der aktuellen Ausführung erforderlich.

Eine threadId wird an cwd und userId der ersten Anfrage gebunden; spätere Anfragen können denselben Thread nicht in einen anderen Arbeitsbereich oder zu einem anderen Aufrufer verschieben.

SSE und Heartbeat

Jedes AG-UI-Ereignis wird als SSE-data:-Datensatz gesendet. Nach 15 Sekunden ohne Ereignis sendet der Server:

: heartbeat

Dies ist ein SSE-Kommentar, kein AG-UI-CUSTOM-Ereignis. Konforme Clients ignorieren ihn; die HTTP-Verbindung bleibt dadurch aktiv.

Standardereignis-Zuordnung

A2A/iac-code-SignalAG-UI-Ausgabe
Anfrage angenommenRUN_STARTED
AgententextTEXT_MESSAGE_START/CONTENT/END
Rohes ReasoningREASONING_START, REASONING_MESSAGE_*, REASONING_END
Werkzeugstart und ArgumenteTOOL_CALL_START/ARGS/END
WerkzeugergebnisTOOL_CALL_RESULT
Pipeline-SchrittzyklusSTEP_STARTED/STEP_FINISHED
Pipeline-WiederaufnahmeabbildACTIVITY_SNAPSHOT
Normaler AbschlussRUN_FINISHED mit outcome.type = "success"
Benutzereingabe erforderlichRUN_FINISHED mit outcome.type = "interrupt"
Adapter- oder A2A-FehlerRUN_ERROR

RUN_FINISHED beendet einen AG-UI-Lauf, nicht zwingend die gesamte Pipeline. Eine mehrfach unterbrochene Pipeline besitzt mehrere Läufe mit jeweils eigenem RUN_STARTED und RUN_FINISHED. Der fachliche Pipeline-Abschluss wird durch pipeline_completed, pipeline_error und verwandte Ereignisse dargestellt.

Für ausgeglichene AG-UI-Spans schließt der Adapter vor einer Unterbrechung offene Nachrichten-, Reasoning-, Werkzeug- und Schritt-Spans. Der Wiederaufnahmelauf öffnet weiterhin aktive, dauerhafte Pipeline-Schritte erneut. In Rohereignissen kann derselbe fachliche Schritt daher in einem Lauf geschlossen und im nächsten wieder geöffnet werden; die Ausführung läuft nicht rückwärts.

Benutzerdefinierte iac-code-Ereignisse

iac-code.session.v1

Stellt die aktuelle Adapter-A2A-Zuordnung bereit, einschließlich threadId, aguiRunId, executionId, contextId, taskId, rosInvocationId und sessionId. Verwenden Sie executionId für die Abbrucherweiterung. Allgemeine Clients dürfen dieses Ereignis ignorieren.

iac-code.artifact.v1

Enthält eine strukturierte Projektion eines A2A-Task-Artefakts für optionale Vorschau, Download oder Diagnose.

iac-code.tool-progress.v1

Enthält Werkzeug-Zwischenfortschritt ohne Standardentsprechung. Start, Argumente und Endergebnis bleiben standardisierte TOOL_CALL_*-Ereignisse und werden hier nicht dupliziert.

iac-code.pipeline.v1

Nur nützliche Pipeline-Informationen ohne vollständige Standardentsprechung werden gesendet. Aktuelle eventType-Werte:

  • Pipeline: pipeline_started, pipeline_resumed, pipeline_completed, pipeline_error, pipeline_warning, backup_blocked;
  • Kandidaten: candidate_started, candidate_completed, candidate_failed, candidate_interrupted, candidate_restart_requested, candidate_selected, candidate_detail_shown, candidate_step_failed;
  • Sub-Pipelines und Schrittfehler: sub_pipeline_started, sub_pipeline_completed, sub_step_failed, step_failed;
  • Stacks und Bereinigung: stack_progress, stack_instances_progress, stack_current_changed, cleanup_started, cleanup_progress, cleanup_completed, cleanup_failed;
  • Rollback: rollback_triggered, rollback_completed;
  • Kontext: context_compaction_started, context_compacted, context_compaction_failed, fields_marked_stale;
  • Darstellung und Werkzeuge: diagram_shown, mcp_status, tool_progress.

Signale mit Standardzuordnung werden nicht als CUSTOM dupliziert: text_delta wird zu TEXT_MESSAGE_*, thinking_delta zu REASONING_*, tool_started/tool_result zu TOOL_CALL_*, usage zu RUN_FINISHED.usage und Schrittzyklen zu STEP_*.

Clients sollten wiederholte Pipeline-Ereignisse mit (name, value.eventId) oder der Pipeline-Sequenz deduplizieren und unbekannte namensraumgebundene Ereignisse tolerieren.

Unterbrechung

Ein Lauf mit erforderlicher Eingabe endet mit RUN_FINISHED.outcome.type = "interrupt". Jede Unterbrechung enthält:

  • id und reason;
  • eine benutzerorientierte message;
  • eine optionale toolCallId;
  • ein JSON-responseSchema;
  • expiresAt;
  • Metadaten wie title, purpose, safeSummary, options und toolName.

Für eine Berechtigungsanfrage akzeptiert das Schema normalerweise:

{"decision": "allow_once"}

oder:

{"decision": "deny"}

Stellen Sie message, responseSchema und beschreibende Metadaten dar, statt die Oberfläche nur aus reason abzuleiten. Fragen und Optionsauswahlen können andere Schemata verwenden.

Wiederaufnahme

Eine Wiederaufnahme ist ein neues POST / mit derselben threadId, einer neuen runId, derselben rosInvocationId und einem Eintrag pro ausstehender Unterbrechung:

{
"resume": [
{
"interruptId": "permission-1",
"status": "resolved",
"payload": {"decision": "allow_once"}
}
]
}

Regeln:

  • jede ausstehende Unterbrechung genau einmal beantworten;
  • doppelte und unbekannte IDs werden abgelehnt;
  • resolved erfordert einen schema-konformen Payload;
  • cancelled beendet die Unterbrechung und entspricht bei Berechtigungen deny;
  • dauerhafter Pending-Status wird erst entfernt, nachdem A2A die Antwort akzeptiert hat;
  • Schemafehler erzeugen RUN_ERROR, die Unterbrechung bleibt erneut beantwortbar;
  • eine wiederholte, bereits akzeptierte Antwort führt das Werkzeug nicht erneut aus.

Vor der Wiederaufnahme kann der Adapter A2A zur Wiederherstellung der iac-code-Sitzung auffordern, Task- und Kontextidentität prüfen und fehlende Pipeline-Ereignisse nachholen.

Dialogrunden und Identitäten

threadId (stabiles Gespräch)
├─ runId-1 (Benutzerrunde)
├─ runId-2 (Wiederaufnahme)
├─ runId-3 (weitere Wiederaufnahme)
└─ runId-4 (nächste normale Nachricht)

Jede HTTP/SSE-Anfrage verwendet eine eindeutige runId. Eine Wiederaufnahme ist ein neuer Lauf. Nach einer normalen Runde erzeugt die nächste Nachricht eine neue Ausführung und verwendet die iac-code-Sitzung des Threads weiter. Idempotenz gilt im Bereich (threadId, runId).

Abbrucherweiterung

POST /extensions/iac-code/v1/executions/<executionId>/cancel
Content-Type: application/json
{"threadId": "thread-1", "rosInvocationId": "invocation-1"}

Mögliche Ergebnisse sind cancelled, already_terminal oder HTTP 404 mit EXECUTION_NOT_FOUND. Der Abbruch entfernt ausstehende Unterbrechungen und ändert keine standardisierten AG-UI-Ereignisformate.

Persistenz und Wiederherstellung

Standardverzeichnis:

<config-dir>/agui/threads/<thread-key>.json

Jede Datei enthält Thread-/Kontext-/Arbeitsbereichsbindung, Sitzungs-, Task- und Ausführungsidentität, Pipeline-Wiederaufnahmepositionen, ausstehende Unterbrechungen sowie Idempotenzdaten. Der Adapter lädt einen angefragten Thread verzögert und ersetzt atomar nur dessen kleine Datei.

LLM-Schlüssel, AccessKey-Secrets und STS-Tokens werden nie gespeichert. Das Verzeichnis enthält Adapterzuordnungen, keine Gespräche oder Ausführungsartefakte. A2A verwaltet seine eigene Sitzungs- und Taskpersistenz; siehe A2A-Dokumentation.

Eine abgelaufene Unterbrechung wird beim nächsten Zugriff abgelehnt, ihr Pending-Status gelöscht und der passende A2A-Task nach Möglichkeit abgebrochen.

Verbindungsabbrüche

  • Ein Lauf, der sicher mit einer Unterbrechung endete, hängt nicht mehr von seiner SSE-Verbindung ab.
  • Eine Wiederaufnahme erzeugt eine neue SSE-Verbindung.
  • Bei Trennung eines gewöhnlichen aktiven Laufs bricht der Adapter den A2A-Task ab.
  • Eine Trennung nach einer Unterbrechung löscht deren persistenten Wiederaufnahmestatus nicht.

Fehler

Fehler vor Beginn von SSE verwenden einen HTTP-JSON-Umschlag. Fehler während der Ausführung verwenden standardisierte RUN_ERROR-Ereignisse.

CodeBedeutung
INVALID_INPUTUngültiger Umschlag, Erweiterungswert, Nachrichteninhalt oder Arbeitsbereich
DUPLICATE_RUN_IDDerselbe Anfrage-Digest verwendet eine bestehende Run-ID
RUN_ID_CONFLICTEine andere Anfrage verwendet eine bestehende Run-ID erneut
THREAD_BUSYDer Thread besitzt bereits einen aktiven Lauf
THREAD_BINDING_CONFLICTArbeitsbereich oder Aufrufer widerspricht der Threadbindung
RESUME_REQUIREDDer Thread wartet auf Unterbrechungsantworten
INCOMPLETE_RESUMEFehlende Unterbrechungen oder doppelte IDs
UNKNOWN_INTERRUPTUnbekannte Unterbrechung in der Wiederaufnahme
RESUME_PAYLOAD_INVALIDFehlender Payload oder Schemaverstoß
RESUME_ALREADY_APPLIEDAntwort wurde bereits angewendet oder steht im Konflikt
EXECUTION_EXPIREDUnterbrechung ist abgelaufen
EXECUTION_LOSTAdapter, A2A-Task oder iac-code-Sitzung konnte nicht wiederhergestellt werden
STATE_PERSISTENCE_FAILEDWiederherstellungskritischer Status konnte nicht gespeichert werden
A2A_UNAVAILABLELokaler A2A-Ausführungsdienst ist nicht verfügbar
A2A_PROTOCOL_ERRORTask-/Kontext-/Sitzungsidentität widerspricht der Zuordnung
A2A_EXECUTION_FAILEDA2A-Task ist fehlgeschlagen
CANCELLEDAusführung wurde abgebrochen

Wiederherstellungskritische Schreibfehler werden sicher behandelt. Der Adapter meldet keinen wiederherstellbaren Task, keine Sitzung und keine Unterbrechung, bevor die Zuordnung dauerhaft gespeichert ist, und bricht nötigenfalls den passenden A2A-Task ab.