A production-ready platform that orchestrates Claude, GPT-4, and Perplexity using the A2A (Agent-to-Agent) Protocol to deliver comprehensive, cited research reports in real time.
Three specialized AI agents coordinated through a central orchestrator via the A2A protocol.
Orchestrator parses the query, identifies sub-topics, and creates a research plan
Perplexity searches the web for relevant sources and citations
Claude performs deep analysis and synthesizes findings into structured output
OpenAI cross-validates claims, checks for inconsistencies, and verifies accuracy
Final report assembled with citations, confidence scores, and follow-up questions
JSON-RPC 2.0 based agent-to-agent communication with discoverable agent cards and typed skill schemas.
Server-Sent Events deliver live progress updates as agents collaborate. Watch the research unfold in real time.
Configurable priority chains with automatic failover. Local Ollama integration for offline operation.
Download research as PDF, DOCX, Markdown, HTML, or JSON. Server-side rendering with fpdf2 and python-docx.
Web-based admin interface to configure agents, set provider priorities, and manage the system.
Full REST API for programmatic access plus standards-compliant A2A JSON-RPC endpoint for agent interop.
See the multi-agent workflow in action. This is a simulated demo — no API keys required.
Initializing agents...
Key implementation details from the codebase.
class TaskStatus(str, Enum):
"""Task execution status states."""
PENDING = "pending"
IN_PROGRESS = "in_progress"
COMPLETED = "completed"
FAILED = "failed"
CANCELLED = "cancelled"
WAITING = "waiting"
class AgentSkill(BaseModel):
"""Definition of a capability that an agent can perform."""
id: str = Field(..., description="Unique skill identifier")
name: str = Field(..., description="Human-readable name")
description: str = Field(..., description="What this skill does")
input_schema: Optional[dict] = Field(None, alias="inputSchema")
output_schema: Optional[dict] = Field(None, alias="outputSchema")
tags: list[str] = Field(default_factory=list)
class AgentCard(BaseModel):
"""Discoverable manifest describing an agent's identity and skills."""
name: str
description: str
url: Optional[HttpUrl] = None
version: str = "1.0.0"
skills: list[AgentSkill] = Field(default_factory=list)
capabilities: AgentCapabilities = Field(default_factory=AgentCapabilities)
| Endpoint | Method | Description |
|---|---|---|
/research | POST | Execute a multi-agent research workflow |
/a2a | POST | A2A Protocol JSON-RPC endpoint |
/agents | GET | List all registered agents |
/agents/{id}/card | GET | Get agent card (A2A discovery) |
/export/pdf | POST | Download report as PDF |
/export/docx | POST | Download report as DOCX |
/health | GET | System health check |
/api/info | GET | System information |