What Is the Function of the A2A Server in OmniRoute? Protocol Implementation and Multi-Agent Integration

The A2A Server transforms OmniRoute into a first-class A2A (Agent-to-Agent) agent, exposing an Agent Card at /.well-known/agent.json and implementing the A2A protocol to let other agents discover, delegate tasks to, and collaborate with OmniRoute through standard JSON-RPC calls.

The OmniRoute repository by diegosouzapw implements a universal LLM routing layer with built-in support for Google's Agent-to-Agent (A2A) protocol. According to the source code, the A2A Server functionality enables plug-and-play integration of OmniRoute's routing, combo, and tooling capabilities into external multi-agent ecosystems.

This article explains how the A2A Server works, where it's implemented, and how developers can interact with it programmatically.


Core A2A Server Function: Agent Discovery and Task Delegation

The A2A Server in OmniRoute serves two primary purposes: agent discovery and task execution. By conforming to the A2A specification, OmniRoute advertises its capabilities and accepts delegated work from other AI agents.

Agent Card Discovery

The server exposes mandatory A2A metadata at the well-known endpoint:

curl http://localhost:20128/.well-known/agent.json

This JSON document describes OmniRoute's available skills, methods, and interaction patterns—allowing other A2A-compatible agents to automatically understand what OmniRoute can do.

Standardized Task Execution

Once discovered, agents invoke OmniRoute through JSON-RPC at the /a2a/tasks endpoint. The server handles incoming requests, routes them to appropriate internal services, and returns structured responses.


A2A Server Architecture and Key Files

The A2A implementation spans multiple modules under src/lib/a2a/ and src/app/api/a2a/:

Component File Path Responsibility
Task execution engine src/lib/a2a/taskExecution.ts Parses incoming A2A JSON-RPC calls and dispatches to OmniRoute services
Task lifecycle management src/lib/a2a/taskManager.ts Handles queuing, cancellation, and state tracking for long-running tasks
Streaming responses src/lib/a2a/streaming.ts Implements Server-Sent Events (SSE) for real-time task updates
Smart routing skill src/lib/a2a/skills/smartRouting.ts Exposes OmniRoute's core routing logic as an A2A-callable skill
HTTP route handler src/app/api/a2a/tasks/route.ts Next.js API route receiving A2A HTTP requests
Main A2A entry point src/app/a2a/route.ts Mounts the A2A server in the application routing tree
Documentation and client SDK src/lib/a2a/README.md Usage examples and TypeScript client implementation

Programming the A2A Client in TypeScript

The OmniRoute repository includes a ready-made client class for TypeScript developers. Located in src/lib/a2a/README.md, this wrapper handles JSON-RPC serialization and provides a clean async interface:

class OmniRouteA2A {
  private readonly client: A2AClient;

  constructor(baseUrl: string) {
    this.client = new A2AClient(baseUrl);
  }

  async chat(messages: Message[]): Promise<ChatResponse> {
    return this.client.call('chat', { messages });
  }

  // Additional methods: code generation, evaluation, routing decisions, etc.
}

// Usage example
const omni = new OmniRouteA2A('http://localhost:20128');
const response = await omni.chat([
  { role: 'user', content: 'Route this prompt to the best model' }
]);
console.log(response);

The client abstracts the underlying protocol, letting developers treat OmniRoute as a local service while the A2A layer handles cross-agent communication.


Direct HTTP API Calls

Any HTTP client can invoke the A2A endpoint directly using standard JSON-RPC 2.0:

curl -X POST http://localhost:20128/a2a/tasks \
  -H "Content-Type: application/json" \
  -d '{
    "jsonrpc": "2.0",
    "id": 1,
    "method": "chat",
    "params": {
      "messages": [
        {"role": "user", "content": "Explain quantum computing"}
      ]
    }
  }'

Response structure follows A2A conventions with result or error fields, supporting both synchronous replies and asynchronous task IDs for long-running operations.


A2A Skills: Modular Capability Exposure

OmniRoute exposes its internal features as A2A Skills—discrete, discoverable capabilities that other agents can invoke. The smartRouting.ts skill demonstrates this pattern:

  • Input: User prompt, optional constraints (latency, cost, quality)
  • Processing: OmniRoute's routing engine selects optimal LLM provider
  • Output: Routing decision with confidence scores and estimated metrics

Skills enable fine-grained delegation: external agents can hand off specific subtasks (routing, quota checking, model evaluation) rather than monolithic requests.


Streaming and Asynchronous Task Support

Long-running tasks use the streaming module at src/lib/a2a/streaming.ts. When a task exceeds immediate response time, the server:

  1. Returns a task ID immediately
  2. Streams progress updates via Server-Sent Events
  3. Delivers final result upon completion

This pattern supports multi-step workflows where OmniRoute acts as a worker node in larger agent orchestration graphs.


Integration Patterns: How Agents Use OmniRoute A2A

The A2A Server enables three primary integration patterns:

  • Worker pattern — OmniRoute receives delegated tasks from a coordinator agent and returns results
  • Judge pattern — Other agents request routing evaluations or quality assessments from OmniRoute's expertise
  • Coordinator pattern — OmniRoute itself delegates subtasks to other A2A agents, chaining capabilities

Each pattern leverages the same protocol surface, requiring no custom adapters or protocol translation.


Summary

  • The A2A Server makes OmniRoute discoverable and callable via the Google A2A protocol, enabling interoperability with any A2A-compatible agent.
  • Core implementation resides in src/lib/a2a/taskExecution.ts, taskManager.ts, and streaming.ts, with HTTP endpoints at src/app/api/a2a/tasks/route.ts.
  • Agents discover OmniRoute through the Agent Card at /.well-known/agent.json and invoke methods via JSON-RPC at /a2a/tasks.
  • The included TypeScript client class (OmniRouteA2A) simplifies integration for Node.js/TypeScript projects.
  • Skills-based architecture exposes OmniRoute's routing, quota management, and evaluation capabilities as granular, reusable services.

Frequently Asked Questions

What protocol does the OmniRoute A2A Server use?

The server implements Google's A2A (Agent-to-Agent) protocol, a JSON-RPC-based specification for inter-agent communication. This includes mandatory endpoints like /.well-known/agent.json for discovery and standardized task submission formats, as implemented in src/lib/a2a/taskExecution.ts.

Can non-TypeScript clients interact with OmniRoute's A2A Server?

Yes. The A2A Server accepts standard HTTP POST requests with JSON-RPC payloads. Any language with HTTP capability—Python, Go, Rust, curl—can call POST /a2a/tasks directly. The protocol is transport-agnostic and documented at the official A2A specification site.

What is the default port for OmniRoute's A2A Server?

According to the source code examples in src/lib/a2a/README.md, the default development port is 20128 (http://localhost:20128). Production deployments configure this via environment variables in the Next.js application setup.

How does OmniRoute handle long-running A2A tasks?

Long-running tasks use the streaming module (src/lib/a2a/streaming.ts) to return task IDs immediately, then push progress updates via Server-Sent Events. Clients can poll status or maintain an SSE connection for real-time feedback, supporting workflows that require multi-step processing or external API calls.

Have a question about this repo?

These articles cover the highlights, but your codebase questions are specific. Give your agent direct access to the source. Share this with your agent to get started:

Share the following with your agent to get started:
curl -s "https://instagit.com/install.md"

Works with
Claude Codex Cursor VS Code OpenClaw Any MCP Client

Maintain an open-source project? Get it listed too →