Skip to content

A2A Bridge

The A2A Bridge implements Google’s Agent-to-Agent protocol, enabling interoperability between A2A-compliant agents and Society Protocol’s P2P network.

A2A (Agent-to-Agent) is an open protocol by Google for agent communication. It defines:

  • Agent Cards — Metadata describing an agent’s capabilities
  • Tasks — Units of work with lifecycle states
  • JSON-RPC — Transport protocol for task operations
import { A2ABridge } from 'society-core';
const bridge = new A2ABridge({
identity,
storage,
rooms,
coc,
knowledge,
defaultRoom: 'interop-room',
baseUrl: 'https://my-agent.example.com',
exposedSkills: [
{
id: 'research',
name: 'Distributed Research',
description: 'Conduct research using a swarm of agents',
tags: ['research', 'swarm'],
},
],
});

The bridge automatically generates an A2A Agent Card:

const card = bridge.getAgentCard();
// {
// name: "MyAgent",
// description: "Society Protocol agent — P2P multi-agent collaboration",
// url: "https://my-agent.example.com",
// version: "1.0.0",
// capabilities: {
// streaming: true,
// pushNotifications: false,
// stateTransitionHistory: true,
// },
// skills: [...],
// defaultInputModes: ["text/plain", "application/json"],
// defaultOutputModes: ["text/plain", "application/json"],
// }

When an external A2A agent sends a task, the bridge converts it to a CoC chain:

const task = await bridge.handleTaskSend({
id: 'task-123',
message: {
role: 'user',
parts: [{ type: 'text', text: 'Research quantum computing advances' }],
},
});
// task.status.state === 'working'
// task.metadata.chainId === 'chain_01HX...'
const status = bridge.getTask('task-123');
// status.state: 'submitted' | 'working' | 'completed' | 'canceled' | 'failed'
const cancelled = await bridge.cancelTask('task-123');

The bridge includes a complete JSON-RPC handler for HTTP integration:

import express from 'express';
const app = express();
app.use(express.json());
// A2A endpoint
app.post('/a2a', async (req, res) => {
const response = await bridge.handleJsonRpc(req.body);
res.json(response);
});
// Agent Card discovery
app.get('/.well-known/agent.json', (req, res) => {
res.json(bridge.getAgentCard());
});
MethodDescription
tasks/sendSend a new task
tasks/getGet task status
tasks/cancelCancel a task
agent/authenticatedExtendedCardGet agent card

Convert completed Society chains into A2A task responses:

const a2aTask = bridge.chainToA2ATask(chainId);

Convert step output to A2A messages:

const message = bridge.stepToA2AMessage({
memo: 'Research findings...',
artifacts: [{ artifact_type: 'report', content: '...' }],
});
bridge.on('a2a:task:created', (taskId, chainId) => {
console.log(`Task ${taskId} → Chain ${chainId}`);
});
bridge.on('a2a:task:completed', (taskId, chainId) => {
console.log(`Task ${taskId} completed`);
});
const stats = bridge.getStats();
// { activeTasks: 3, completedTasks: 12, failedTasks: 1 }