Agent2Agent-Agenten (A2A) in der Agent Registry werben für Protokollschnittstellen, die eine Endpunkt-URL und eine Protokollbindung (z. B. HTTP_JSON) enthalten. Sie können die URL eines Agenten in der Registry ermitteln, um seine A2A-Methoden von benutzerdefinierten Orchestratoren oder Clients aufzurufen.
Auf einen Blick
| Spezifikation | Details |
|---|---|
| Discovery API | agentregistry.googleapis.com (v1) |
| Host des Aufruf-Proxys | LOCATION-discoveryengine.googleapis.com |
| Protokollbindung | HTTP_JSON |
| URL-Projekt-ID | Google Cloud Projektnummer (nicht Projekt-ID) |
| Unterstützte A2A-Methoden | GET /v1/card, POST /v1/message:send, POST /v1/message:stream |
| Erforderliches Nachrichtenschema | message.role = "ROLE_USER", content[].text, eindeutige messageId |
| Erforderliche IAM-Berechtigungen | roles/agentregistry.viewer (Erkennung) und discoveryengine.assistants.assist (Aufruf) |
Hinweis
- Aktivieren Sie die Agent Registry API (
agentregistry.googleapis.com) und die Discovery Engine API (discoveryengine.googleapis.com) in Ihrem Google Cloud Projekt. - Wenn der Agent nicht direkt in Ihrer Gemini Enterprise-App erstellt wurde, importieren Sie ihn aus der Agent Registry und gewähren Sie Endnutzern Zugriff darauf. Eine Anleitung finden Sie unter A2A-Agenten aus der Agent Registry importieren.
- Gewähren Sie Ihrem Aufrufer-Hauptkonto die entsprechenden IAM-Berechtigungen:
- Zum Lesen der Registry: Agent Registry Viewer (
roles/agentregistry.viewer). - Zum Aufrufen des Agenten: Discovery Engine-Bearbeiter (
roles/discoveryengine.editor) oder eine benutzerdefinierte Rolle mitdiscoveryengine.assistants.assist.
- Zum Lesen der Registry: Agent Registry Viewer (
- Wenn Sie sich mit Standardanmeldedaten für Anwendungen (Application Default Credentials, ADC) authentifizieren, konfigurieren Sie Ihren Client so, dass er den Header für das Kontingentprojekt sendet:
-H "X-Goog-User-Project: PROJECT_ID". - Optional können Sie die Agent Development Kit-Bibliothek (ADK) installieren, wenn Sie Remote-Agenten als programmatische Sub-Agenten einbinden möchten:
pip install "google-adk[a2a]>=1.29.0".
Schritt 1: Agenten und zugehörigen A2A-Endpunkt ermitteln
Um einen A2A-Agenten aufzurufen, ermitteln Sie zuerst seine beworbene url in der Agent Registry. Listen Sie die Agenten in Ihrem Registry-Standort auf (z. B. us oder eu, als Pfad-Parameter auf dem globalen Host agentregistry.googleapis.com übergeben):
curl -X GET \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "Content-Type: application/json" \
"https://agentregistry.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/agents?pageSize=100"
Sie können auch mit der Google Cloud CLI nach einem Agenten anhand des Präfixes des Anzeigenamens suchen:
gcloud agent-registry agents search \
--project=PROJECT_ID \
--location=LOCATION \
--search-string="displayName:My_Agent_*"
Prüfen Sie in der zurückgegebenen Agent-Ressource das Array protocols. Suchen Sie den Eintrag, bei dem type gleich A2A_AGENT und interfaces[].protocolBinding gleich HTTP_JSON ist. Extrahieren Sie die entsprechende url:
{
"name": "projects/PROJECT_ID/locations/LOCATION/agents/AGENT_RESOURCE_ID",
"displayName": "My Agent",
"protocols": [
{
"type": "A2A_AGENT",
"protocolVersion": "0.3.0",
"interfaces": [
{
"url": "https://LOCATION-discoveryengine.googleapis.com/v1/projects/PROJECT_NUMBER/locations/LOCATION/collections/default_collection/engines/ENGINE_ID/assistants/default_assistant/agents/AGENT_ID/a2a",
"protocolBinding": "HTTP_JSON"
}
]
}
]
}
Das vollständige Schema der Agent-Ressource finden Sie in der projects.locations.agents REST API-Referenz.
Schritt 2: Agentenkarte abrufen
Die Agentenkarte enthält Metadaten, die die Identität, Beschreibung und Ein-/Ausgabefunktionen des Agenten beschreiben. Senden Sie eine HTTP-GET-Anfrage an den Pfad /v1/card, der an die A2A-Endpunkt-URL des Agenten angehängt ist, um die Karte abzurufen:
curl -X GET \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
"A2A_ENDPOINT_URL/v1/card"
Beispiel für die Antwortnutzlast:
{
"name": "My Agent",
"description": "What the agent does.",
"url": "A2A_ENDPOINT_URL",
"capabilities": {},
"defaultInputModes": ["text"],
"defaultOutputModes": ["text"],
"preferredTransport": "HTTP+JSON"
}
Schritt 3: Nachricht senden
Senden Sie eine POST-Anfrage an /v1/message:send, um eine Nutzeranfrage an den Agenten zu senden. Der Anfragetext muss dem A2A-Nachrichtenschema entsprechen. Dazu muss role auf ROLE_USER gesetzt sein, ein content-Array mit Textteilen und eine eindeutig generierte messageId enthalten:
curl -X POST \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "Content-Type: application/json" \
"A2A_ENDPOINT_URL/v1/message:send" \
-d '{
"message": {
"role": "ROLE_USER",
"content": [
{
"text": "What can you help me with?"
}
],
"messageId": "UNIQUE_UUID_STRING"
}
}'
In der Antwortnutzlast wird die Antwort des Agenten im message-Objekt zurückgegeben:
{
"message": {
"contextId": "projects/PROJECT_NUMBER/locations/LOCATION/collections/default_collection/engines/ENGINE_ID/sessions/SESSION_ID",
"role": "ROLE_AGENT",
"content": [
{
"text": "I am an AI assistant..."
}
]
}
}
Verketten Sie die Textstrings in content[].text, um die vollständige Antwort anzuzeigen. Wenn Sie die Unterhaltung in derselben Sitzung fortsetzen möchten, speichern Sie den zurückgegebenen contextId-String und geben Sie ihn in Ihrer nächsten Anfrage als message.contextId an.
Das vollständige Schema der Nachrichtennutzlast finden Sie in der A2A message:send REST API-Referenz.
Antworten inkrementell streamen
Senden Sie für die Streamingausgabe eine POST-Anfrage mit einem identischen Inhalt der Nachricht an /v1/message:stream:
curl -N -X POST \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "Content-Type: application/json" \
"A2A_ENDPOINT_URL/v1/message:stream" \
-d '{
"message": {
"role": "ROLE_USER",
"content": [
{
"text": "Say hello."
}
],
"messageId": "UNIQUE_UUID_STRING"
}
}'
Der Endpunkt gibt ein JSON-Array mit gestreamten Chunk-Objekten über HTTP zurück. Hängen Sie die content[].text-Fragmente sequenziell an, sobald sie eintreffen. Gestreamte Chunks enthalten auch metadata.sessionInfo und metadata.assistToken.
Die Spezifikation der Streamingnutzlast finden Sie in der A2A message:stream REST API-Referenz.
A2A-Endpunkt mit Python aufrufen
Dieses Python-Skript löst einen A2A-Endpunkt in der Agent Registry auf und sendet eine Nachricht mit Roh-HTTP-Anfragen:
# Install dependencies: pip install google-auth requests
import uuid
import google.auth
from google.auth.transport.requests import AuthorizedSession
# TODO(developer): Replace placeholder values with your project ID and location.
project_id = "PROJECT_ID"
location = "LOCATION" # Registry location (for example: "us" or "eu")
target_display_name = "My Agent"
query_text = "What can you help me with?"
# Initialize credentials and authorized session
creds, _ = google.auth.default(
scopes=["https://www.googleapis.com/auth/cloud-platform"]
)
session = AuthorizedSession(creds)
# Step 1: Resolve the A2A endpoint URL from the Agent Registry
registry_url = (
f"https://agentregistry.googleapis.com/v1/"
f"projects/{project_id}/locations/{location}/agents"
)
response = session.get(registry_url)
response.raise_for_status()
agents = response.json().get("agents", [])
def get_a2a_url(agent_resource):
for proto in agent_resource.get("protocols") or []:
if proto.get("type") == "A2A_AGENT":
for iface in proto.get("interfaces", []):
if iface.get("protocolBinding") == "HTTP_JSON":
return iface.get("url")
return None
target_agent = next(
(a for a in agents if a.get("displayName") == target_display_name),
None
)
if not target_agent:
raise SystemExit(f"Agent '{target_display_name}' not found in registry.")
endpoint_url = get_a2a_url(target_agent)
if not endpoint_url:
raise SystemExit("Target agent does not publish an HTTP_JSON A2A endpoint.")
# Step 2: Fetch and verify the agent card
card_resp = session.get(f"{endpoint_url}/v1/card")
card_resp.raise_for_status()
card = card_resp.json()
print("Resolved Agent:", card.get("name"))
# Step 3: Send an A2A message
body = {
"message": {
"role": "ROLE_USER",
"content": [{"text": query_text}],
"messageId": str(uuid.uuid4()),
}
}
send_resp = session.post(f"{endpoint_url}/v1/message:send", json=body)
send_resp.raise_for_status()
reply_message = send_resp.json().get("message", {})
full_reply_text = "".join(
part.get("text", "") for part in reply_message.get("content", [])
)
print("Agent Reply:", full_reply_text)
Orchestrierung mit dem ADK vereinfachen
Das Agent Development Kit (ADK) löst Registry-Endpunkte automatisch auf und bindet Remote-A2A-Agenten als Sub-Agenten ein:
from google.adk.integrations.agent_registry import AgentRegistry
# Initialize registry client
registry = AgentRegistry(project_id="PROJECT_ID", location="LOCATION")
# Resolve remote A2A agent directly by resource name
remote_agent = registry.get_remote_a2a_agent(
agent_name="agents/AGENT_RESOURCE_ID"
)
Zusätzliche Hinweise
Für A2A-Endpunkte gilt Folgendes:
- Strikte Pfadbenennung: Für HTTP+JSON-Bindungen werden nur
GET {url}/v1/card,POST {url}/v1/message:send, undPOST {url}/v1/message:streamunterstützt. - Strikte Schemavalidierung: Wenn Sie nur
"user"als Rolle übergeben, wird ein HTTP-Fehler400 Bad Requestzurückgegeben. Sie müssen den Enum-String"ROLE_USER"übergeben. Ebenso muss sich der Nachrichtentext imcontent-Array und nicht inpartsbefinden undmessageIdist unbedingt erforderlich. - Fehler beim Aufrufen von Nicht-A2A-Agenten: Wenn ein Agent keinen
A2A_AGENT-Protokolleintrag in der Registry hat (z. B. bestimmte vordefinierte oder verwaltete Agenten), gibt der Aufruf vongetCardfür seine Proxy-URL501 UNIMPLEMENTEDzurück ("... wird noch nicht unterstützt") und der Aufruf vonmessage:sendgibt400 INVALID_ARGUMENTzurück ("Agent wird nicht unterstützt"). - Projektnummer in der URL: Die Registry gibt eine A2A-URL zurück, die die Projektnummer und nicht die Projekt-ID enthält. Ändern Sie diesen numerischen String nicht, wenn Sie HTTP-Anfragen stellen.
Fehlerbehebung
In der folgenden Tabelle finden Sie Informationen zur Fehlerbehebung bei häufigen A2A-Endpunktfehlern:
| Symptom | Wahrscheinliche Ursache | Lösung |
|---|---|---|
HTTP 404 bei getCard Anfrage |
Falscher Pfadalias (z. B. /v1:getCard oder /.well-known/agent-card.json). |
Senden Sie die GET-Anfrage ausschließlich an GET {url}/v1/card. |
| HTTP 400 *"Unknown name 'parts'"* | Alte oder generative KI-Client-Body-Formatierung. | Platzieren Sie Textstrings in content und nicht in parts. |
HTTP 400 Ungültiger Enum-Wert für role |
Übergabe von Kleinbuchstaben "user" oder "user_role". |
Setzen Sie message.role genau auf "ROLE_USER". |
| HTTP 501 *"is not supported yet"* | getCard für einen Agenten aufgerufen, der keine A2A-Schnittstelle veröffentlicht. |
Prüfen Sie vor dem Aufruf das Array protocols der Registry-Ressource, um die A2A_AGENT-Unterstützung zu bestätigen. |
| HTTP 400 *"Unsupported agent"* | message:send für einen Nicht-A2A-Agenten aufgerufen. |
Wählen Sie einen Agenten aus, dessen Registry-Definition eine aktive A2A_AGENT-Protokollbindung enthält. |
HTTP 401 oder HTTP 403 Permission Denied |
Fehlende OAuth-Bereiche, fehlende IAM-Rollen oder fehlender Header für das Kontingentprojekt. | Prüfen Sie die IAM-Rollen des Aufrufers (agentregistry.viewer und assistants.assist), prüfen Sie den Bereich cloud-platform und übergeben Sie -H "X-Goog-User-Project: PROJECT_ID", wenn Sie ADC verwenden. |