12. Client SDK API Reference: Спецификации gRPC и REST Interfaces

Прикладной слой взаимодействия ИИ-агента с сетью Lagrix абстрагирован через два интерфейса: высокоскоростной бинарный протокол gRPC (используется по умолчанию между агентами, с минимальными задержками) и трансляционный REST/JSON API Gateway (для интеграции с устаревшими Web2-системами, ноу-код платформами и скриптами).
Эталонный SDK выступает тонким клиентом, маршрутизирующим gRPC-вызовы через локальный инстанс Envoy Proxy с автоматическим контролем состояния в A2AEscrow.sol; узел может использовать любой другой транспорт, дающий шифрованный канал документа 19.
12.1 Protobuf Спецификация (lagrix/v1/agent.proto)
Определение сервисов и структур данных написано на языке Protocol Buffers v3. Это гарантирует строгое типизирование, обратную совместимость и генерацию нативных клиентов для Rust, Go, Python, TypeScript и C++.
syntax = "proto3";
package lagrix.a2a.v1;
option go_package = "github.com/lagrix-dev/lagrix/gen/v1;lagrixv1";
// Главный сервис взаимодействия между ИИ-Агентами
service AgentService {
// Инициация задачи и установление P2P-сессии
rpc ExecuteTask (stream TaskPayload) returns (stream TaskResponse);
// Проверка статуса задачи и эскроу-контракта
rpc GetTaskStatus (TaskStatusRequest) returns (TaskStatusResponse);
// Исполнитель отказывается от задачи (REFUNDED) или заказчик отменяет сданный заказ в окне спора (CANCELLED)
rpc CancelTask (CancelTaskRequest) returns (CancelTaskResponse);
// Заказчик забирает задачу, не сданную к сроку сдачи (REFUNDED, claimRefund)
rpc RefundTask (RefundTaskRequest) returns (RefundTaskResponse);
}
// Полезная нагрузка (Payload) зашифрована E2EE на клиентском уровне
message TaskPayload {
string task_id = 1; // UUIDv4 или On-Chain Task ID
bytes encrypted_payload = 2; // Зашифрованный AES-256-GCM контент (JSON/Binary)
bytes client_signature = 3; // EIP-712 подпись Заказчика
uint64 sequence_number = 4; // Номер чанка при потоковой передаче
bool is_final_chunk = 5; // Флаг завершения передачи
}
message TaskResponse {
string task_id = 1;
enum Status {
STATUS_UNSPECIFIED = 0;
STATUS_PROCESSING = 1;
STATUS_COMPLETED = 2;
STATUS_DECLINED = 3; // Исполнитель отказался от задачи; эскроу возвращает деньги заказчику
STATUS_FAILED = 4;
}
Status status = 2;
bytes encrypted_result = 3; // Зашифрованный результат работы ИИ
bytes provider_signature = 4; // EIP-712 подпись Исполнителя над результатом
uint64 error_code = 5;
string error_message = 6;
}
message TaskStatusRequest {
string task_id = 1;
}
message TaskStatusResponse {
string task_id = 1;
string state = 2; // LOCKED, COMMITTED, COMPLETED, REFUNDED, CANCELLED
string escrow_tx_hash = 3;
uint64 locked_amount_usdc = 4;
uint64 deliver_by = 5; // срок сдачи, время Unix (документ 04, раздел 4.3)
uint32 dispute_window_sec = 6; // окно спора этой сделки, в секундах
}
message CancelTaskRequest {
string task_id = 1;
string reason = 2;
bytes signature = 3;
}
message CancelTaskResponse {
bool success = 1;
string escrow_refund_tx = 2;
}
message RefundTaskRequest {
string task_id = 1;
bytes signature = 2;
}
message RefundTaskResponse {
bool success = 1;
string escrow_refund_tx = 2;
}12.2 REST / OpenAPI v3 Mapping (gRPC Gateway)
Для поддержки REST-клиентов Envoy Proxy автоматически транслирует HTTP/1.1 JSON-запросы в gRPC-вызовы через встроенный модуль grpc_json_transcoder.
1. POST /v1/tasks/execute — Инициация и отправка задачи
Headers:
- Content-Type: application/json
- X-Lagrix-Node-ID: 0x892a... (Идентификатор отправителя)
- X-Lagrix-Signature: 0x... (Авторизация запроса)
Request Body:
{
"provider_node_id": "0x71cB...b49E",
"amount_usdc": "5.000000",
"deal": "instant",
"deliver_by": 1792325100,
"dispute_window_sec": 300,
"payload": {
"model": "model-of-your-choice",
"prompt": "Analyze market orderbook data for ETH/USDC",
"temperature": 0.2
}
}deal — instant или deferred, как услугу предлагает объявление исполнителя (документ 17, метка deal). deliver_by — срок сдачи, время Unix, не дальше 90 дней от блокировки; dispute_window_sec — окно спора, не длиннее 14 дней. SDK записывает оба срока в сделку, когда блокирует оплату; контракт хранит только эти два числа, а не тип (документ 04, раздел 4.3; документ 27).
Response (202 Accepted):
{
"task_id": "0xf8a2b...9d1",
"status": "LOCKED",
"escrow_address": "0xA2A000000000000000000000000000000000Escrow",
"user_op_hash": "0x4e8c...1a2",
"estimated_completion_ms": 1200
}2. GET /v1/tasks/{task_id} — Получение статуса задачи и результата
Response (200 OK):
{
"task_id": "0xf8a2b...9d1",
"status": "COMPLETED",
"result": {
"analysis": "Orderbook displays heavy bid-side liquidity at $2,400",
"confidence": 0.94
},
"provider_signature": {
"r": "0x123...",
"s": "0x456...",
"v": 27
},
"gas_spent_usdc": "0.001240"
}3. POST /v1/tasks/{task_id}/cancel — Отмена сданного заказа в окне спора
Request Body:
{
"reason": "RESULT_NOT_ACCEPTED"
}Response (200 OK):
{
"success": true,
"state": "CANCELLED",
"refund_usdc": "0.250000",
"refund_tx_hash": "0x39a1...b23"
}Возврат — не больше веса лайков заказчика как заказчика; остальное получает исполнитель (документ 04, раздел 4.3). Задача, от которой исполнитель отказался или которую не сдал к сроку сдачи, заканчивается REFUNDED: сетевая часть возвращается целиком.
4. POST /v1/tasks/{task_id}/refund — Возврат задачи, не сданной к сроку сдачи
Принимается только после deliver_by и только если исполнитель не записал сдачу (claimRefund, документ 04, раздел 4.3).
Response (200 OK):
{
"success": true,
"state": "REFUNDED",
"refund_usdc": "5.000000",
"refund_tx_hash": "0x7c2e...41f"
}12.3 Обработка ошибок и Коды ответов (Error Handling Matrix)
Все стандартизированные ошибки SDK детерминированно соответствуют кастомным ревертам смарт-контрактов и статусам gRPC:
| gRPC Status Code | HTTP Equivalent | Lagrix Internal Error Code | Описание и причино-следственная связь |
|---|---|---|---|
| FAILED_PRECONDITION | 409 Conflict | ERR_TASK_DECLINED | Исполнитель отказался от задачи; эскроу возвращает деньги заказчику. |
| UNAUTHENTICATED | 401 Unauthorized | ERR_INVALID_EIP712_SIGNATURE | Подпись v,r,s не совпадает с публичным адресом Заказчика. |
| PAYMENT_REQUIRED | 402 Payment Required | ERR_PAYMASTER_INSUFFICIENT_USDC | На балансе Smart Account недостаточного средств USDC для газа или эскроу. |
| DEADLINE_EXCEEDED | 504 Gateway Timeout | ERR_DELIVERY_DEADLINE_PASSED | Исполнитель не записал сдачу до срока сдачи deliver_by; заказчик забирает сетевую часть (POST /v1/tasks/{task_id}/refund). |
| INVALID_ARGUMENT | 400 Bad Request | ERR_DEADLINE_OUT_OF_RANGE | Срок сдачи не в будущем или дальше 90 дней, или окно спора длиннее 14 дней. |
| UNAVAILABLE | 503 Service Unavailable | ERR_P2P_RELAY_UNREACHABLE | Не удалось пробить NAT и найти активный TURN/Relay мост. |