Agent2Agent-Agenten (A2A) in der Agent Registry stellen Protokollschnittstellen bereit, die eine Endpunkt-URL und eine Protokollbindung (z. B. HTTP_JSON) enthalten. Sie können die URL eines Agenten in der Registry finden, um seine A2A-Methoden über benutzerdefinierte Orchestratoren oder Clients aufzurufen.
Auf einen Blick
| Spezifikation | Details |
|---|---|
| Discovery API | agentregistry.googleapis.com (v1) |
| Aufruf-Proxy-Host | 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 dem aufrufenden Hauptkonto die entsprechenden IAM-Berechtigungen:
- Zum Lesen der Registry: Agent Registry Viewer (
roles/agentregistry.viewer). - Zum Aufrufen des KI-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: Installieren Sie die Agent Development Kit (ADK)-Bibliothek, wenn Sie Remote-Agenten als programmatische Sub-Agenten einbinden möchten:
pip install "google-adk[a2a]>=1.29.0".
Schritt 1: Agenten und seinen A2A-Endpunkt ermitteln
Wenn Sie einen A2A-Agenten aufrufen möchten, müssen Sie zuerst die veröffentlichten url in der Agent Registry finden. Listen Sie die KI-Agenten in Ihrem Registry-Speicherort auf (z. B. us oder eu, übergeben als Pfadparameter auf dem globalen agentregistry.googleapis.com-Host):
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 -Befehlszeile 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 KI-Agentenressource das Array protocols. Suchen Sie den Eintrag, bei dem type gleich A2A_AGENT und interfaces[].protocolBinding gleich HTTP_JSON ist. Extrahieren Sie die entsprechenden 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 Agentenressource 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. Wenn Sie die Karte abrufen möchten, senden Sie eine HTTP-GET-Anfrage an den Pfad /v1/card, der an die A2A-Endpunkt-URL des Agents angehängt ist:
curl -X GET \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
"A2A_ENDPOINT_URL/v1/card"
Beispiel für eine 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
Wenn Sie eine Nutzeranfrage an den Agenten senden möchten, stellen Sie eine POST-Anfrage an /v1/message:send. Der Anfragetext muss dem A2A-Nachrichtenschema entsprechen. Dazu muss role auf ROLE_USER festgelegt sein, ein content-Array mit Textteilen enthalten sein und eine eindeutig generierte messageId vorhanden sein:
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 KI-Agenten im Objekt message 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 schrittweise 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 von gestreamten Chunk-Objekten über HTTP zurück. Hängen Sie die content[].text-Fragmente nacheinander an, sobald sie eintreffen. Gestreamte Chunks enthalten auch metadata.sessionInfo und metadata.assistToken.
Die Spezifikation der Streaming-Nutzlast 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 über 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 verpackt Remote-A2A-Agenten als Sub-Agenten:
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
A2A-Endpunkte haben die folgenden Verhaltensweisen:
- Strikte Pfadbenennung: Für HTTP+JSON-Bindungen werden nur
GET {url}/v1/card,POST {url}/v1/message:sendundPOST {url}/v1/message:streamunterstützt. - Strikte Schemavalidierung: Wenn Sie
"user"als Rolle übergeben, wird ein HTTP-400 Bad Request-Fehler zurückgegeben. Sie müssen den Enum-String"ROLE_USER"übergeben. Ebenso muss der Nachrichtentext imcontent-Array und nicht imparts-Array enthalten sein.messageIdist unbedingt erforderlich. - Fehler beim Aufruf eines 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 UNIMPLEMENTED(„… wird noch nicht unterstützt“) und der Aufruf vonmessage:send400 INVALID_ARGUMENT(„Nicht unterstützter Agent“) zurück. - Projektnummer in URL: Die Registry gibt eine A2A-URL zurück, die die Projektnummer anstelle der 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 |
Verwendung eines falschen Pfad-Alias (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'"* | Verwendung der alten oder generativen KI-Client-Textformatierung. | Platzieren Sie Textstrings in content, nicht in parts. |
HTTP 400 – Ungültiger Enum-Wert für role |
Übergabe von "user" oder "user_role" in Kleinbuchstaben. |
Setzen Sie message.role genau auf "ROLE_USER". |
| HTTP 501 *"is not supported yet"* | Aufruf von getCard für einen Agenten, der keine A2A-Schnittstelle veröffentlicht. |
Prüfen Sie das Array protocols der Registry-Ressource, um die Unterstützung von A2A_AGENT vor dem Aufruf zu bestätigen. |
| HTTP 400 *"Unsupported agent"* | Aufruf von message:send für einen Nicht-A2A-Agenten. |
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 Kontingentprojekt-Header. | 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 Standardanmeldedaten für Anwendungen verwenden. |