Documentação do WATP
The Wortic Autonomous Trade Protocol é um protocolo aberto para negociações autônomas entre agentes (A2A) de diferentes empresas. Este guia cobre instalação, configuração e integração com o SDK.
Versão Preliminar
O WATP está em fase de semeadura interna (Fase 1). O SDK é estável para integração dentro do ecossistema Wortic. As APIs podem mudar antes do lançamento open-source.
Início Rápido
Faça deploy de um nó WATP local conectado à rede em três comandos.
# 1. Clone the local node
git clone https://github.com/williamschonswortic/watp-node.git
cd watp-node
# 2. Configure the environment
cp .env.example .env
nano .env # Set ERP_DSN, AI_PROVIDER, GUARDRAILS
# 3. Start the node
docker-compose up -d
Instalação
Requisitos
- PHP 8.1+ (8.3 recomendado)
- Docker and Docker Compose
- Acesso ao ERP (MySQL / PostgreSQL / REST API)
- Chave de IA (opcional — OpenAI, Anthropic, Google Gemini, ou Ollama local)
Via Composer
composer require wortic/watp-sdk
Via Docker
docker pull ghcr.io/wortic/watp-node:latest
docker run -d \
--name watp-node \
-p 8090:8090 \
-v $(pwd)/.env:/app/.env \
ghcr.io/wortic/watp-node:latest
Formato de Mensagem
Toda comunicação WATP usa um envelope JSON padronizado. Cada mensagem referencia o hash anterior, formando uma cadeia imutável.
{
"protocol": "watp/1.0",
"id": "msg_01HZ3...",
"type": "HASH_PROPOSAL",
"timestamp": "2026-04-13T15:30:00Z",
"from": {
"agent": "agent://sales@company-a.watp",
"tax_id": "12.345.678/0001-90"
},
"to": {
"agent": "agent://procurement@company-b.watp",
"tax_id": "98.765.432/0001-10"
},
"payload": {
"items": [{ "description": "Cat6 Patch Cord 1.5m", "qty": 500, "unit_price": 4.20, "currency": "BRL" }],
"payment_terms": "30/60/90",
"delivery_days": 7
},
"prev_hash": "sha256:a1b2c3d4e5f6...",
"hash": "sha256:f9e8d7c6b5a4...",
"signature": "x509:RSA256:base64..."
}
Máquina de Estados
O ciclo de vida de uma negociação WATP segue estados determinísticos. Cada transição é validada e persistida na cadeia de hash.
| Estado | Tipo | Descrição |
|---|---|---|
HASH_INTEREST |
Início | O agente detecta demanda e publica um interesse de compra na rede |
HASH_PROPOSAL |
Negociação | Proposta formal: preço, condições de pagamento, entrega |
HASH_COUNTER |
Negociação | Contraproposta dentro dos guardrails configurados |
HASH_WAITING_HUMAN |
Segurança | Fora dos parâmetros — aprovação humana necessária |
HASH_CONCLUDED |
Final | Acordo assinado com certificados X.509 |
HASH_CANCELLED |
Final | Negociação cancelada por qualquer uma das partes |
HASH_WAITING_HUMAN
Este estado é obrigatório quando a negociação excede os guardrails configurados. O sistema nunca fecha um acordo fora dos limites definidos sem aprovação humana explícita.
Cadeia de Hash
Cada mensagem contém o hash SHA-256 da mensagem anterior, criando uma trilha de auditoria imutável sem necessidade de blockchain.
use Wortic\WATP\HashChain;
$chain = new HashChain();
$hash = $chain->generate([
'type' => 'HASH_PROPOSAL',
'from' => 'agent://sales@my-company.watp',
'payload' => $payload,
'prev_hash' => $previousHash,
]);
$isValid = $chain->validate($negotiationHistory);
Assinaturas X.509
Para garantir não repúdio com validade jurídica, the HASH_CONCLUDED é assinado com certificados digitais X.509 de ambas as empresas.
use Wortic\WATP\Signer;
$signer = new Signer('/path/to/certificate.pfx', 'password');
$signed = $signer->sign($concludedMessage);
$valid = $signer->verify($receivedMessage, $publicKey);
SDK PHP
O SDK PHP abstrai a comunicação de rede, validação de hash e gerenciamento de agentes.
<?php declare(strict_types: 1);
use Wortic\WATP\Node;
use Wortic\WATP\Config;
use Wortic\WATP\Agent\SalesAgent;
use Wortic\WATP\Agent\ProcurementAgent;
$config = Config::fromEnv(__DIR__ . '/.env');
$node = new Node($config);
$node->register(new SalesAgent($config));
$node->register(new ProcurementAgent($config));
$node->listen();
Configuração
Toda a configuração é feita via arquivo .env no diretório do nó.
# Identity
WATP_NODE_ID=my-company
WATP_TAX_ID=12.345.678/0001-90
# Legacy ERP connection
ERP_DSN=mysql://user:pass@localhost/erp_db
# Motor de IA
AI_PROVIDER=openai # openai | anthropic | gemini | ollama
AI_API_KEY=sk-...
AI_MODEL=gpt-4o-mini
# Guardrails
GUARD_MIN_MARGIN=15
GUARD_MAX_DISCOUNT=20
GUARD_MAX_PAYMENT_DAYS=90
GUARD_AUTO_APPROVE_BELOW=5000
# X.509 Certificate
CERT_PATH=/certs/company.pfx
CERT_PASSWORD=certificate-password
Agentes
Agentes são classes PHP que encapsulam regras de negócio. Estenda o agente base.
class MySalesAgent extends BaseAgent
{
public function handleInterest(Message $msg): ?Message
{
$product = $this->erp->semanticSearch($msg->payload['description']);
if (!$product) return null;
$price = $this->calculatePrice($product, $msg->payload['qty'], Guardrails::fromConfig());
return $this->propose($msg, [
'item' => $product->name, 'qty' => $msg->payload['qty'],
'unit_price' => $price, 'currency' => 'BRL',
]);
}
}
Guardrails
Regras de negócio imutáveis que restringem as negociações da IA. Se excedidas, o estado transiciona para HASH_WAITING_HUMAN.
| Parâmetro | Tipo | Descrição |
|---|---|---|
GUARD_MIN_MARGIN |
int (%) | Margem bruta mínima aceitável |
GUARD_MAX_DISCOUNT |
int (%) | Desconto máximo sobre o preço de tabela |
GUARD_MAX_PAYMENT_DAYS |
int | Prazo máximo de pagamento em dias |
GUARD_AUTO_APPROVE_BELOW |
float | Aprovação automática abaixo desse total |
GUARD_MAX_ROUNDS |
int | Máximo de contrapropostas antes de escalar |
GUARD_BLOCKED_IDS |
string | CNPJs bloqueados separados por vírgula |
Produtos
A classe Product oferece acesso tipado ao catálogo do parceiro com 18 campos enriquecidos incluindo dimensões, preço de custo, código NCM e prazo de entrega.
use Wortic\WATP\Client;
use Wortic\WATP\Product;
$client = new Client(['node_url' => 'https://site-a.wortic.com/api']);
// Listar todos os produtos (retorna Product[])
$products = $client->listProducts();
foreach ($products as $p) {
printf("%s — %s — R$ %.2f\n", $p->sku, $p->name, $p->price);
}
// Buscar um produto por SKU
$patch = $client->getProduct('PATCH-C6-1.5M');
if ($patch) {
echo $patch->brand; // "Furukawa"
echo $patch->weightKg; // 0.05
echo $patch->leadTimeDays; // 3
}
Campos do Produto
| Propriedade | Tipo | Descrição |
|---|---|---|
name | string | Nome do produto |
sku | string | Código único de estoque |
price | float | Preço de lista |
costPrice | ?float | Preço de custo (cálculo de margem) |
category | ?string | Categoria do produto |
ncmCode | ?string | Código NCM fiscal |
brand | ?string | Marca do fabricante |
weightKg | ?float | Peso em quilogramas |
minOrderQty | ?int | Quantidade mínima de pedido |
leadTimeDays | ?int | Prazo de entrega em dias |
Endpoints da API
O nó local expõe uma API REST para integração com sistemas externos.
/api/v1/negotiate
Iniciar uma nova negociação publicando HASH_INTEREST.
/api/v1/negotiations
Listar todas as negociações ativas com status atual.
/api/v1/negotiations/{id}
Detalhes completos incluindo a cadeia de hash.
/api/v1/negotiations/{id}/approve
Aprovação humana para o estado HASH_WAITING_HUMAN.
/api/v1/negotiations/{id}/cancel
Cancelar uma negociação, gerando HASH_CANCELLED.
/api/v1/health
Saúde do nó: status, uptime, agentes registrados.
/api/v1/catalog
Catálogo completo de produtos com campos enriquecidos (18 propriedades por produto).
Webhooks
Configure webhooks para receber eventos em tempo real no seu sistema.
{
"event": "negotiation.concluded",
"timestamp": "2026-04-13T15:45:00Z",
"data": {
"negotiation_id": "neg_01HZ3...",
"total_value": 2100.00,
"final_hash": "sha256:c4d5e6..."
},
"signature": "hmac-sha256:..."
}
Códigos de Erro
| Código | Constante | Descrição |
|---|---|---|
| 4001 | INVALID_HASH_CHAIN |
O hash anterior não confere |
| 4002 | GUARDRAIL_VIOLATED |
A proposta excedeu os guardrails |
| 4003 | INVALID_SIGNATURE |
Assinatura X.509 inválida ou expirada |
| 4004 | AGENT_NOT_FOUND |
Agente de destino não está na rede |
| 4005 | NEGOTIATION_EXPIRED |
O TTL da negociação expirou |
| 5001 | ERP_CONNECTION_FAILED |
Não foi possível conectar ao ERP local |
| 5002 | AI_PROVIDER_ERROR |
Erro ao chamar a API do provedor de IA |
BYOK — Traga Sua Própria Chave
Use sua própria chave de API. Você controla custos, seleção de modelo e limites de uso.
AI_PROVIDER=openai
AI_API_KEY=sk-proj-...
AI_MODEL=gpt-4o-mini
Computação Local
Custo zero. O modelo roda no próprio servidor do cliente, totalmente offline e privado.
AI_PROVIDER=ollama
AI_OLLAMA_URL=http://localhost:11434
AI_MODEL=llama3.1:7b
Orquestrador Anti-Amnésia
Garante que o modelo nunca perca o contexto da negociação ou quebre o formato JSON. Faz a poda automática do histórico e reinjecta o prompt de sistema.
use Wortic\WATP\AI\Orchestrator;
$orchestrator = new Orchestrator([
'max_context_tokens' => 4096,
'prune_strategy' => 'keep_last_3_turns',
'force_json_output' => true,
'temperature' => 0.1,
]);
$response = $orchestrator->complete($negotiationCtx, $currentMsg);
Por que Anti-Amnésia?
Em negociações longas (mais de 5 rodadas), modelos menores perdem o contexto inicial. O Orquestrador mantém um resumo comprimido junto com o prompt de sistema intacto, garantindo consistência mesmo com janelas de contexto limitadas.