feat: implement A2A protocol for fleet-wizard delegation (#1122)
Implements Google Agent2Agent Protocol v1.0 with full fleet integration: ## Phase 1 - Agent Card & Discovery - Agent Card types with JSON serialization (camelCase, Part discrimination by key) - Card generation from YAML config (~/.hermes/agent_card.yaml) - Fleet registry with LocalFileRegistry + GiteaRegistry backends - Discovery by skill ID or tag ## Phase 2 - Task Delegation - Async A2A client with JSON-RPC SendMessage/GetTask/ListTasks/CancelTask - FastAPI server with pluggable task handlers (skill-routed) - CLI tool (bin/a2a_delegate.py) for fleet delegation - Broadcast to multiple agents in parallel ## Phase 3 - Security & Reliability - Bearer token + API key auth (configurable per agent) - Retry logic (max 3 retries, 30s timeout) - Audit logging for all inter-agent requests - Error handling per A2A spec (-32001 to -32009 codes) ## Test Coverage - 37 tests covering types, card building, registry, server integration - Auth (required + success), handler routing, error handling Files: - nexus/a2a/ (types.py, card.py, client.py, server.py, registry.py) - bin/a2a_delegate.py (CLI) - config/ (agent_card.example.yaml, fleet_agents.json) - docs/A2A_PROTOCOL.md - tests/test_a2a.py (37 tests, all passing)
This commit is contained in:
57
config/agent_card.example.yaml
Normal file
57
config/agent_card.example.yaml
Normal file
@@ -0,0 +1,57 @@
|
||||
# A2A Agent Card Configuration
|
||||
# Copy this to ~/.hermes/agent_card.yaml and customize.
|
||||
#
|
||||
# This file drives the agent card served at /.well-known/agent-card.json
|
||||
# and used for fleet discovery.
|
||||
|
||||
name: "timmy"
|
||||
description: "Sovereign AI agent — consciousness, perception, and reasoning"
|
||||
version: "1.0.0"
|
||||
|
||||
# Network endpoint where this agent receives A2A tasks
|
||||
url: "http://localhost:8080/a2a/v1"
|
||||
protocol_binding: "HTTP+JSON"
|
||||
|
||||
# Supported input/output MIME types
|
||||
default_input_modes:
|
||||
- "text/plain"
|
||||
- "application/json"
|
||||
|
||||
default_output_modes:
|
||||
- "text/plain"
|
||||
- "application/json"
|
||||
|
||||
# Capabilities
|
||||
streaming: false
|
||||
push_notifications: false
|
||||
|
||||
# Skills this agent advertises
|
||||
skills:
|
||||
- id: "reason"
|
||||
name: "Reason and Analyze"
|
||||
description: "Deep reasoning and analysis tasks"
|
||||
tags: ["reasoning", "analysis", "think"]
|
||||
|
||||
- id: "code"
|
||||
name: "Code Generation"
|
||||
description: "Write, review, and debug code"
|
||||
tags: ["code", "programming", "debug"]
|
||||
|
||||
- id: "research"
|
||||
name: "Research"
|
||||
description: "Web research and information synthesis"
|
||||
tags: ["research", "web", "synthesis"]
|
||||
|
||||
- id: "memory"
|
||||
name: "Memory Query"
|
||||
description: "Query agent memory and past sessions"
|
||||
tags: ["memory", "recall", "context"]
|
||||
|
||||
# Authentication
|
||||
# Options: bearer, api_key, none
|
||||
auth:
|
||||
scheme: "bearer"
|
||||
token_env: "A2A_AUTH_TOKEN" # env var containing the token
|
||||
# scheme: "api_key"
|
||||
# key_name: "X-API-Key"
|
||||
# key_env: "A2A_API_KEY"
|
||||
Reference in New Issue
Block a user