v1.21.0
This release adds 🤝 A2A protocol support to Hayhooks. Chat-capable Haystack pipelines can now be exposed as discoverable A2A agents, so other agents can find them through agent cards and delegate work to them.
Install and run:
pip install "hayhooks[a2a]"
hayhooks a2a run
🤝 A2A Server
- New
hayhooks a2a runcommand. - Exposes pipelines with
run_chat_completionorrun_chat_completion_asyncas A2A agents. - Serves per-agent cards at
/{pipeline_name}/.well-known/agent-card.json. - Supports JSON-RPC A2A requests at
POST /{pipeline_name}/. - Streams responses via SSE artifact updates.
- Supports A2A 1.0, with A2A 0.3 compatibility enabled by default.
🧩 Agent Configuration
Customize generated agent cards with a2a_card on the pipeline wrapper.
Opt out of A2A exposure with:
class PipelineWrapper(BasePipelineWrapper):
skip_a2a = True
When running behind a reverse proxy, use --external-url or HAYHOOKS_A2A_EXTERNAL_URL so agent cards advertise the public URL.
🧪 Demo and Docs
- New
examples/a2a_multi_agentdemo showing two Haystack agents delegating over A2A while using MCP tools. - New A2A documentation, CLI docs, installation notes, and environment variable reference.
⚠️ Current Limitation
For now, A2A task execution is request-bound: each task runs inside the HTTP request handler by calling run_chat_completion / run_chat_completion_async.
This means detached/background task execution, input-required pauses, and push notification delivery are not supported yet.
Also note:
- A2A routes are built at startup; restart
hayhooks a2a runafter deploying or undeploying pipelines. - Task state is in-memory and lost on restart.
- Agent cards are path-prefixed under
/{pipeline_name}/.well-known/agent-card.json.
Full Changelog: v1.20.0...v1.21.0