English | 简体中文 | 繁體中文 | 日本語 | 한국어 | Français | Español | Deutsch | Italiano | Русский | Português (Brasil)
Готовый к промышленной эксплуатации плагин для OpenClaw, реализующий протокол A2A (Agent-to-Agent) v0.3.0. Он позволяет агентам OpenClaw обнаруживать друг друга и обмениваться сообщениями между серверами — с установкой без конфигурации и автоматическим обнаружением пиров.
Единственный A2A-шлюз с адаптивной биоинспирированной маршрутизацией, обнаружением и отказоустойчивостью — разработан для масштабных мультиагентных экосистем.
- Три транспорта: JSON-RPC, REST и gRPC — с автоматическим переключением (пробует JSON-RPC → REST → gRPC)
- SSE-стриминг с heartbeat-поддержанием соединения для отслеживания статуса задач в реальном времени
- Полная поддержка типов Part: TextPart, FilePart (URI + base64), DataPart (структурированный JSON)
- Автоматическое извлечение URL: URL файлов в текстовых ответах агента автоматически преобразуются в исходящие FilePart
- Маршрутизация по правилам: автоматический выбор пира по шаблону сообщения, тегам или навыкам пира
- Кэширование навыков пиров: навыки из Agent Card извлекаются при проверке доступности, что позволяет маршрутизировать по навыкам
- Целевой agentId для каждого сообщения: направление сообщения конкретному агенту OpenClaw на стороне пира (расширение OpenClaw)
- Обнаружение через DNS-SD: автоматическое обнаружение пиров по записям
_a2a._tcpSRV + TXT - Самоанонсирование через mDNS: публикация записей SRV + TXT для автоматического обнаружения другими шлюзами
- Проверки доступности с экспоненциальным откатом + автоматическим размыкателем цепи (closed → open → half-open)
- Push-уведомления: доставка через webhook при завершении задачи с HMAC + защитой от SSRF
- Аутентификация по Bearer-токену с ротацией нескольких токенов без простоя
- Защита от SSRF: белый список хостов URI, белый список MIME-типов, ограничение размера файлов
- Идентификация устройства Ed25519 для совместимости со scope OpenClaw ≥2026.3.13
- Аудит-лог в формате JSONL для всех A2A-вызовов и событий безопасности
- Эндпоинт телеметрии с опциональной Bearer-аутентификацией
- Персистентное хранилище задач на диске с TTL-очисткой и ограничением параллелизма
┌──────────────────────┐ A2A/JSON-RPC ┌──────────────────────┐
│ OpenClaw Server A │ ◄──────────────────────────► │ OpenClaw Server B │
│ │ (Tailscale / LAN) │ │
│ Agent: AGI │ │ Agent: Coco │
│ A2A Port: 18800 │ │ A2A Port: 18800 │
│ Peer: Server-B │ │ Peer: Server-A │
└──────────────────────┘ └──────────────────────┘
- OpenClaw ≥ 2026.3.0 установлен и запущен
- Сетевое подключение между серверами (Tailscale, LAN или публичный IP)
- Node.js ≥ 22
Плагин поставляется с разумными значениями по умолчанию — вы можете установить и загрузить его без какой-либо ручной настройки:
# Клонирование
mkdir -p ~/.openclaw/workspace/plugins
cd ~/.openclaw/workspace/plugins
git clone https://github.com/win4r/openclaw-a2a-gateway.git a2a-gateway
cd a2a-gateway
npm install --production
# Регистрация и активация
openclaw plugins install ~/.openclaw/workspace/plugins/a2a-gateway
# Перезапуск
openclaw gateway restart
# Проверка
openclaw plugins list # должен показать a2a-gateway как загруженный
curl -s http://localhost:18800/.well-known/agent-card.json | python3 -m json.toolПлагин запустится с Agent Card по умолчанию (name: "OpenClaw A2A Gateway", skills: [chat]). Вы можете настроить его позже — см. раздел Настройка Agent Card ниже.
Если вы предпочитаете ручное управление или вам нужно сохранить существующие плагины в конфигурации:
# В каталог плагинов вашего рабочего пространства
mkdir -p ~/.openclaw/workspace/plugins
cd ~/.openclaw/workspace/plugins
git clone https://github.com/win4r/openclaw-a2a-gateway.git a2a-gateway
cd a2a-gateway
npm install --production# Добавление в список разрешённых плагинов
openclaw config set plugins.allow '["telegram", "a2a-gateway"]'
# Указание пути к плагину для OpenClaw
openclaw config set plugins.load.paths '["<FULL_PATH_TO>/plugins/a2a-gateway"]'
# Активация плагина
openclaw config set plugins.entries.a2a-gateway.enabled trueПримечание: Замените
<FULL_PATH_TO>на фактический абсолютный путь, например/home/ubuntu/.openclaw/workspace/plugins/a2a-gateway. Сохраните все существующие плагины в массивеplugins.allow.
Каждому A2A-агенту нужна Agent Card, описывающая его. Если вы пропустите этот шаг, плагин использует значения по умолчанию:
| Field | Default |
|---|---|
agentCard.name |
OpenClaw A2A Gateway |
agentCard.description |
A2A bridge for OpenClaw agents |
agentCard.skills |
[{"id":"chat","name":"chat","description":"Chat bridge"}] |
Для настройки:
openclaw config set plugins.entries.a2a-gateway.config.agentCard.name 'My Agent'
openclaw config set plugins.entries.a2a-gateway.config.agentCard.description 'My OpenClaw A2A Agent'
openclaw config set plugins.entries.a2a-gateway.config.agentCard.url 'http://<YOUR_IP>:18800/a2a/jsonrpc'
openclaw config set plugins.entries.a2a-gateway.config.agentCard.skills '[{"id":"chat","name":"chat","description":"Bridge chat/messages to OpenClaw agents"}]'Важно: Замените
<YOUR_IP>на IP-адрес, доступный вашим пирам (Tailscale IP, IP в локальной сети или публичный IP).
openclaw config set plugins.entries.a2a-gateway.config.server.host '0.0.0.0'
openclaw config set plugins.entries.a2a-gateway.config.server.port 18800Сгенерируйте токен для аутентификации входящих подключений:
TOKEN=$(openssl rand -hex 24)
echo "Your A2A token: $TOKEN"
openclaw config set plugins.entries.a2a-gateway.config.security.inboundAuth 'bearer'
openclaw config set plugins.entries.a2a-gateway.config.security.token "$TOKEN"Сохраните этот токен — он понадобится пирам для аутентификации на вашем агенте.
openclaw config set plugins.entries.a2a-gateway.config.routing.defaultAgentId 'main'openclaw gateway restart# Проверка доступности Agent Card
curl -s http://localhost:18800/.well-known/agent-card.json | python3 -m json.toolВы должны увидеть вашу Agent Card с именем, навыками и URL.
Чтобы обмениваться сообщениями с другим A2A-агентом, добавьте его как пира:
openclaw config set plugins.entries.a2a-gateway.config.peers '[
{
"name": "PeerName",
"agentCardUrl": "http://<PEER_IP>:18800/.well-known/agent-card.json",
"auth": {
"type": "bearer",
"token": "<PEER_TOKEN>"
}
}
]'Затем перезапустите:
openclaw gateway restartДля двусторонней связи оба сервера должны добавить друг друга как пиры:
| Server A | Server B |
|---|---|
| Peer: Server-B (с токеном B) | Peer: Server-A (с токеном A) |
Каждый сервер генерирует собственный токен безопасности и передаёт его другому.
node <PLUGIN_PATH>/skill/scripts/a2a-send.mjs \
--peer-url http://<PEER_IP>:18800 \
--token <PEER_TOKEN> \
--message "Hello from Server A!"Скрипт использует @a2a-js/sdk ClientFactory для автоматического обнаружения Agent Card и выбора лучшего транспорта.
Для длительных запросов или многораундовых обсуждений используйте неблокирующий режим + опрос, чтобы избежать блокировки одного запроса:
node <PLUGIN_PATH>/skill/scripts/a2a-send.mjs \
--peer-url http://<PEER_IP>:18800 \
--token <PEER_TOKEN> \
--non-blocking \
--wait \
--timeout-ms 600000 \
--poll-ms 1000 \
--message "Discuss A2A advantages in 3 rounds and provide final conclusion"Эта команда отправляет configuration.blocking=false, а затем опрашивает tasks/get до тех пор, пока задача не достигнет конечного состояния.
Совет: тайм-аут скрипта по умолчанию (--timeout-ms) составляет 10 минут; для очень длительных задач переопределите его.
По умолчанию пир направляет входящие A2A-сообщения на routing.defaultAgentId (обычно main).
Чтобы направить отдельный запрос конкретному agentId OpenClaw на стороне пира, используйте --agent-id:
node <PLUGIN_PATH>/skill/scripts/a2a-send.mjs \
--peer-url http://<PEER_IP>:18800 \
--token <PEER_TOKEN> \
--agent-id coder \
--message "Run a health check"Это реализовано как нестандартное поле message.agentId, понимаемое данным плагином. Наиболее надёжно работает через JSON-RPC/REST. Транспорт gRPC может отбрасывать неизвестные поля Message.
Даже если плагин установлен и настроен, LLM-агент не сможет надёжно «угадать», как вызвать A2A-пиров (URL пира, токен, команду для запуска). Для надёжных исходящих A2A-вызовов следует добавить раздел A2A в файл TOOLS.md агента.
Добавьте следующее в TOOLS.md вашего агента, чтобы он знал, как вызывать пиров (полный шаблон см. в skill/references/tools-md-template.md):
## A2A Gateway (Agent-to-Agent Communication)
You have an A2A Gateway plugin running on port 18800.
### Peers
| Peer | IP | Auth Token |
|------|-----|------------|
| PeerName | <PEER_IP> | <PEER_TOKEN> |
### How to send a message to a peer
Use the exec tool to run:
\```bash
node <PLUGIN_PATH>/skill/scripts/a2a-send.mjs \
--peer-url http://<PEER_IP>:18800 \
--token <PEER_TOKEN> \
--message "YOUR MESSAGE HERE"
# Optional (OpenClaw extension): route to a specific peer agentId
# --agent-id coder
\```
The script auto-discovers the Agent Card, handles auth, and prints the peer's response text.После этого пользователи смогут говорить:
- "Send to PeerName: what's your status?"
- "Ask PeerName to run a health check"
Плагин поддерживает все три типа A2A Part для входящих сообщений. Поскольку RPC-шлюз OpenClaw принимает только простой текст, каждый тип Part сериализуется в удобочитаемый формат перед передачей агенту.
| Part Type | Format Sent to Agent | Example |
|---|---|---|
TextPart |
Необработанный текст | Hello world |
FilePart (URI) |
[Attached: report.pdf (application/pdf) → https://...] |
Файловая ссылка по URI |
FilePart (base64) |
[Attached: photo.png (image/png), inline 45KB] |
Встроенный файл с указанием размера |
DataPart |
[Data (application/json): {"key":"value"}] |
Структурированные данные JSON (обрезаются до 2КБ) |
Для исходящих ответов плагин преобразует структурированные поля mediaUrl/mediaUrls из payload агента в записи FilePart в A2A-ответе. Кроме того, URL файлов, встроенные в текстовый ответ агента (markdown-ссылки вида [report](https://…/report.pdf) и голые URL вида https://…/data.csv), автоматически извлекаются в записи FilePart, если они заканчиваются распознаваемым расширением файла.
Плагин регистрирует инструмент a2a_send_file, который агенты могут вызывать для отправки файлов пирам:
| Parameter | Required | Description |
|---|---|---|
peer |
Да | Имя целевого пира (должно совпадать с настроенным пиром) |
uri |
Да | Публичный URL файла для отправки |
name |
Нет | Имя файла (например, report.pdf) |
mimeType |
Нет | MIME-тип (автоматически определяется по расширению, если не указан) |
text |
Нет | Опциональное текстовое сообщение вместе с файлом |
agentId |
Нет | Направить конкретному agentId на стороне пира (расширение OpenClaw) |
Пример взаимодействия агента:
- Пользователь: "Отправь тестовый отчёт на AWS-bot"
- Агент вызывает
a2a_send_fileсpeer: "AWS-bot",uri: "https://...",name: "report.pdf"
Tailscale создаёт защищённую mesh-сеть между вашими серверами без какой-либо настройки файрвола.
# Установка на обоих серверах
curl -fsSL https://tailscale.com/install.sh | sh
# Аутентификация (один аккаунт на обоих)
sudo tailscale up
# Проверка связи
tailscale status
# Вы увидите IP-адреса вида 100.x.x.x для каждой машины
# Проверка
ping <OTHER_SERVER_TAILSCALE_IP>Используйте IP-адреса Tailscale 100.x.x.x в конфигурации A2A. Трафик шифруется сквозным образом.
Если оба сервера находятся в одной локальной сети, используйте их LAN IP напрямую. Убедитесь, что порт 18800 доступен.
Используйте публичные IP-адреса с аутентификацией по Bearer-токену. Рассмотрите возможность добавления правил файрвола для ограничения доступа к известным IP.
# Генерация токена сервера A
A_TOKEN=$(openssl rand -hex 24)
echo "Server A token: $A_TOKEN"
# Настройка A2A
openclaw config set plugins.entries.a2a-gateway.config.agentCard.name 'Server-A'
openclaw config set plugins.entries.a2a-gateway.config.agentCard.url 'http://100.10.10.1:18800/a2a/jsonrpc'
openclaw config set plugins.entries.a2a-gateway.config.agentCard.skills '[{"id":"chat","name":"chat","description":"Chat bridge"}]'
openclaw config set plugins.entries.a2a-gateway.config.server.host '0.0.0.0'
openclaw config set plugins.entries.a2a-gateway.config.server.port 18800
openclaw config set plugins.entries.a2a-gateway.config.security.inboundAuth 'bearer'
openclaw config set plugins.entries.a2a-gateway.config.security.token "$A_TOKEN"
openclaw config set plugins.entries.a2a-gateway.config.routing.defaultAgentId 'main'
# Добавление сервера B как пира (используя токен B)
openclaw config set plugins.entries.a2a-gateway.config.peers '[{"name":"Server-B","agentCardUrl":"http://100.10.10.2:18800/.well-known/agent-card.json","auth":{"type":"bearer","token":"<B_TOKEN>"}}]'
openclaw gateway restart# Генерация токена сервера B
B_TOKEN=$(openssl rand -hex 24)
echo "Server B token: $B_TOKEN"
# Настройка A2A
openclaw config set plugins.entries.a2a-gateway.config.agentCard.name 'Server-B'
openclaw config set plugins.entries.a2a-gateway.config.agentCard.url 'http://100.10.10.2:18800/a2a/jsonrpc'
openclaw config set plugins.entries.a2a-gateway.config.agentCard.skills '[{"id":"chat","name":"chat","description":"Chat bridge"}]'
openclaw config set plugins.entries.a2a-gateway.config.server.host '0.0.0.0'
openclaw config set plugins.entries.a2a-gateway.config.server.port 18800
openclaw config set plugins.entries.a2a-gateway.config.security.inboundAuth 'bearer'
openclaw config set plugins.entries.a2a-gateway.config.security.token "$B_TOKEN"
openclaw config set plugins.entries.a2a-gateway.config.routing.defaultAgentId 'main'
# Добавление сервера A как пира (используя токен A)
openclaw config set plugins.entries.a2a-gateway.config.peers '[{"name":"Server-A","agentCardUrl":"http://100.10.10.1:18800/.well-known/agent-card.json","auth":{"type":"bearer","token":"<A_TOKEN>"}}]'
openclaw gateway restart# С сервера A → проверка Agent Card сервера B
curl -s http://100.10.10.2:18800/.well-known/agent-card.json
# С сервера B → проверка Agent Card сервера A
curl -s http://100.10.10.1:18800/.well-known/agent-card.json
# Отправка сообщения A → B (с использованием SDK-скрипта)
node <PLUGIN_PATH>/skill/scripts/a2a-send.mjs \
--peer-url http://100.10.10.2:18800 \
--token <B_TOKEN> \
--message "Hello from Server A!"| Path | Type | Default | Description |
|---|---|---|---|
agentCard.name |
string | OpenClaw A2A Gateway |
Отображаемое имя агента |
agentCard.description |
string | A2A bridge for OpenClaw agents |
Описание в человекочитаемом формате |
agentCard.url |
string | auto | URL эндпоинта JSON-RPC |
agentCard.skills |
array | [{chat}] |
Список навыков, предоставляемых агентом |
server.host |
string | 0.0.0.0 |
Адрес привязки |
server.port |
number | 18800 |
HTTP-порт A2A (gRPC на port+1) |
storage.tasksDir |
string | ~/.openclaw/a2a-tasks |
Путь к персистентному хранилищу задач на диске |
storage.taskTtlHours |
number | 72 |
Автоочистка просроченных задач через N часов |
storage.cleanupIntervalMinutes |
number | 60 |
Частота сканирования просроченных задач |
| Path | Type | Default | Description |
|---|---|---|---|
peers |
array | [] |
Список агентов-пиров |
peers[].name |
string | required | Отображаемое имя пира |
peers[].agentCardUrl |
string | required | URL Agent Card пира |
peers[].auth.type |
string | — | bearer или apiKey |
peers[].auth.token |
string | — | Токен аутентификации |
| Path | Type | Default | Description |
|---|---|---|---|
security.inboundAuth |
string | none |
none или bearer |
security.token |
string | — | Одиночный токен для входящей аутентификации |
security.tokens |
array | [] |
Несколько токенов для ротации без простоя |
security.allowedMimeTypes |
array | [image/*, application/pdf, ...] |
Разрешённые MIME-шаблоны для передачи файлов |
security.maxFileSizeBytes |
number | 52428800 |
Макс. размер файла по URI (50МБ) |
security.maxInlineFileSizeBytes |
number | 10485760 |
Макс. размер встроенного base64-файла (10МБ) |
security.fileUriAllowlist |
array | [] |
Белый список хостов URI (пустой = разрешить все публичные) |
| Path | Type | Default | Description |
|---|---|---|---|
routing.defaultAgentId |
string | default |
ID агента для входящих сообщений |
routing.rules |
array | [] |
Правила маршрутизации на основе правил (см. ниже) |
routing.rules[].name |
string | required | Имя правила |
routing.rules[].match.pattern |
string | — | Регулярное выражение для текста сообщения (регистронезависимое) |
routing.rules[].match.tags |
array | — | Совпадение, если у сообщения есть хотя бы один из этих тегов |
routing.rules[].match.skills |
array | — | Совпадение, если у целевого пира есть хотя бы один из этих навыков |
routing.rules[].target.peer |
string | required | Пир для маршрутизации |
routing.rules[].target.agentId |
string | — | Переопределение agentId на стороне пира |
routing.rules[].priority |
number | 0 |
Выше = проверяется первым |
| Path | Type | Default | Description |
|---|---|---|---|
resilience.healthCheck.enabled |
boolean | true |
Включить периодические проверки Agent Card |
resilience.healthCheck.intervalMs |
number | 30000 |
Интервал проверки (мс) |
resilience.healthCheck.timeoutMs |
number | 5000 |
Тайм-аут проверки (мс) |
resilience.retry.maxRetries |
number | 3 |
Макс. количество повторов для неудачных исходящих вызовов |
resilience.retry.baseDelayMs |
number | 1000 |
Базовая задержка для экспоненциального отката |
resilience.retry.maxDelayMs |
number | 10000 |
Максимальное ограничение задержки |
resilience.circuitBreaker.failureThreshold |
number | 5 |
Количество сбоев до размыкания цепи |
resilience.circuitBreaker.resetTimeoutMs |
number | 30000 |
Пауза перед полуоткрытой проверкой |
| Path | Type | Default | Description |
|---|---|---|---|
discovery.enabled |
boolean | false |
Включить обнаружение пиров через DNS-SD |
discovery.serviceName |
string | _a2a._tcp.local |
Имя сервиса DNS-SD для запроса |
discovery.refreshIntervalMs |
number | 30000 |
Частота повторного запроса DNS (мс) |
discovery.mergeWithStatic |
boolean | true |
Объединять обнаруженных пиров со статической конфигурацией |
advertise.enabled |
boolean | false |
Включить самоанонсирование через mDNS |
advertise.serviceName |
string | _a2a._tcp.local |
Тип сервиса DNS-SD для анонсирования |
advertise.ttl |
number | 120 |
TTL в секундах для анонсируемых записей |
| Path | Type | Default | Description |
|---|---|---|---|
observability.structuredLogs |
boolean | true |
Выводить структурированные логи в формате JSON |
observability.exposeMetricsEndpoint |
boolean | true |
Открыть снимок телеметрии по HTTP |
observability.metricsPath |
string | /a2a/metrics |
HTTP-путь для телеметрии |
observability.metricsAuth |
string | none |
none или bearer для эндпоинта метрик |
observability.auditLogPath |
string | ~/.openclaw/a2a-audit.jsonl |
Путь для JSONL аудит-лога |
timeouts.agentResponseTimeoutMs |
number | 300000 |
Макс. ожидание ответа агента (мс) |
limits.maxConcurrentTasks |
number | 4 |
Макс. количество активных входящих запусков агентов |
limits.maxQueuedTasks |
number | 100 |
Макс. количество задач в очереди до отклонения |
| Endpoint | Method | Description |
|---|---|---|
/.well-known/agent-card.json |
GET | Обнаружение Agent Card (псевдоним: /.well-known/agent.json) |
/a2a/jsonrpc |
POST | A2A транспорт JSON-RPC |
/a2a/rest |
POST | A2A транспорт REST |
<host>:<port+1> |
gRPC | A2A транспорт gRPC |
/a2a/metrics |
GET | Снимок телеметрии (опциональная Bearer-аутентификация) |
/a2a/push/register |
POST | Регистрация webhook для push-уведомлений |
/a2a/push/:taskId |
DELETE | Отмена регистрации push-уведомлений |
Это означает, что A2A-запрос был принят шлюзом, но нижележащая диспетчеризация агента OpenClaw не завершилась.
Распространённые причины:
- Не настроен провайдер ИИ на целевом экземпляре OpenClaw.
openclaw config get auth.profiles- Тайм-аут диспетчеризации агента (длительный запрос / многораундовое обсуждение).
Варианты решения:
- Используйте асинхронный режим задач на стороне отправителя:
--non-blocking --wait - Увеличьте тайм-аут плагина:
plugins.entries.a2a-gateway.config.timeouts.agentResponseTimeoutMs(по умолчанию: 300000)
Плагин не загружен. Проверьте:
# Убедитесь, что плагин в списке разрешённых
openclaw config get plugins.allow
# Проверьте правильность пути загрузки
openclaw config get plugins.load.paths
# Проверьте логи шлюза
cat /tmp/openclaw/openclaw-$(date +%Y-%m-%d).log | grep a2a# Проверьте, слушает ли A2A-сервер
ss -tlnp | grep 18800
# Если нет, перезапустите шлюз
openclaw gateway restartУбедитесь, что токен в вашей конфигурации пира точно совпадает с security.token на целевом сервере.
Этот репозиторий включает готовый к использованию навык в каталоге skill/, который пошагово проводит AI-агентов (OpenClaw, Codex CLI, Claude Code и др.) через полный процесс настройки A2A — включая установку, конфигурацию, регистрацию пиров, настройку TOOLS.md и проверку.
Ручная настройка A2A включает множество шагов с определёнными именами полей, шаблонами URL и обработкой токенов. Навык кодирует всё это в виде воспроизводимой процедуры, предотвращая типичные ошибки, такие как:
- Путаница между
agentCard.url(эндпоинт JSON-RPC) иpeers[].agentCardUrl(обнаружение Agent Card) - Забытое обновление TOOLS.md (агент не будет знать, как вызывать пиров)
- Использование относительных путей в
plugins.load.paths(должны быть абсолютными) - Пропуск взаимной регистрации пиров (обе стороны должны иметь конфигурацию друг друга)
Для OpenClaw:
# Скопируйте в каталог навыков
cp -r <repo>/skill ~/.openclaw/workspace/skills/a2a-setup
# Или создайте символическую ссылку
ln -s $(pwd)/skill ~/.openclaw/workspace/skills/a2a-setupДля Codex CLI:
# Скопируйте в каталог навыков Codex
cp -r <repo>/skill ~/.codex/skills/a2a-setupДля Claude Code:
# Скопируйте в ваш проект или рабочее пространство
cp -r <repo>/skill ./skills/a2a-setupskill/
├── SKILL.md # Пошаговое руководство по настройке
├── scripts/
│ └── a2a-send.mjs # Отправитель сообщений на базе SDK (официальный @a2a-js/sdk)
└── references/
└── tools-md-template.md # Шаблон TOOLS.md для осведомлённости агента об A2A
Навык предоставляет два метода для вызова пиров агентами:
- curl — универсальный, работает везде
- SDK-скрипт — использует
@a2a-js/sdkClientFactory с автоматическим обнаружением Agent Card и выбором транспорта
После установки скажите вашему агенту:
- "Set up A2A gateway" / "Настрой A2A-шлюз"
- "Connect this OpenClaw to another server via A2A"
- "Add an A2A peer"
Агент автоматически выполнит процедуру навыка.
По мере масштабирования мультиагентных экосистем от 2 пиров до 20 или 200, стандартные A2A-шлюзы упираются в предсказуемые ограничения: маршрутизация выбирает не тот пир, размыкатели цепи полностью блокируют трафик, опрос обнаружения расходует полосу пропускания, а перегрузка ударяет как стена. Этот шлюз решает эти проблемы с помощью механизмов, заимствованных из биологии клеточной сигнализации — тех же принципов, которые клетки используют для маршрутизации сигналов, обработки перегрузки рецепторов и обнаружения соседей в плотных тканях.
| Биология | Механизм | Функция A2A | Ссылка |
|---|---|---|---|
| Связывание лиганд-рецептор | Сигмоида уравнения Хилла | Маршрутизация по аффинности — многомерная оценка совпадения с настраиваемой крутизной (n) и порогом (Kd) | Hill (1910) J Physiol 40 |
| Десенсибилизация рецепторов | Фосфорилирование → интернализация → рециклинг | Четырёхфазный размыкатель цепи — постепенная деградация (DESENSITIZED) перед полной блокировкой (OPEN), с экспоненциальной кривой восстановления | Bhalla & Bhatt (2007) BMC Syst Biol 1:54 |
| Деградация cAMP | Ферментативный распад фосфодиэстеразой | Уведомления с затуханием сигнала — оценка важности экспоненциально затухает; повторная попытка прекращается при падении ниже порога | Alon (2007) Intro to Systems Biology Гл.4 |
| Кворумное зондирование | Пороговая концентрация автоиндуктора | Обнаружение с учётом плотности — адаптивный опрос с гистерезисом (режим исследования ↔ стабильный режим) на основе популяции пиров | Tamsir et al. (2011) Nature 469:212 |
| Выбор сигнального пути | Эффективность пути × скорость трансдукции | Адаптивный транспорт — оценка каждого транспорта по проценту успеха × коэффициент задержки; непроверенные пути получают приоритет исследования | Kholodenko (2006) Nat Rev Mol Cell Biol 7:165 |
| Насыщение ферментов | Кинетика Михаэлиса-Ментен | Мягкое ограничение параллелизма — прогрессивная задержка baseDelay × load/(Km + load) перед жёстким пределом очереди |
Michaelis & Menten (1913) Biochem Z 49:333 |
Все биоинспирированные функции опциональны и обратно совместимы — без явной конфигурации шлюз ведёт себя идентично стандартным реализациям. Включайте их, когда ваше развёртывание перерастает настройки по умолчанию:
| Функция | Включить когда... | Ключ конфигурации |
|---|---|---|
| Маршрутизация по аффинности Хилла | 5+ пиров с пересекающимися навыками | routing.affinity |
| Четырёхфазный размыкатель цепи | У пиров перемежающиеся сбои | resilience.circuitBreaker.softThreshold |
| Повтор с затуханием сигнала | Webhook-эндпоинты ненадёжны | Включено по умолчанию |
| Обнаружение с кворумным зондированием | Динамические сети пиров с DNS-SD | discovery.quorum |
| Адаптивный транспорт | Пиры предоставляют несколько транспортов | Автоматически (обучается на использовании) |
| Мягкий параллелизм ММ | Высокопроизводительные операции менее секунды | limits.saturation |
Benchmark:
node --import tsx --test tests/benchmark.test.ts
| Version | Highlights |
|---|---|
| v1.2.0 | Маршрутизация по навыкам пиров, самоанонсирование через mDNS (симметричное обнаружение) |
| v1.1.0 | Извлечение URL, переключение транспорта, push-уведомления, маршрутизация по правилам, обнаружение через DNS-SD |
| v1.0.1 | Идентификация устройства Ed25519, аутентификация метрик, CI |
| v1.0.0 | Промышленная готовность: персистентность, многораундовый режим, передача файлов, SSE, проверки доступности, мульти-токены, аудит |
| v0.1.0 | Первоначальная реализация A2A v0.3.0 |
Подробности см. в CHANGELOG.md, загрузки — в Releases.
MIT
