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)
58 lines
1.4 KiB
YAML
58 lines
1.4 KiB
YAML
# 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"
|