WATP Docs

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.

bash
# 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

bash
composer require wortic/watp-sdk

Via Docker

bash
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.

json
{
  "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.

php
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.

php
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 — initialization
<?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ó.

.env
# 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.

php — custom agent
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.

php — listando produtos
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
namestringNome do produto
skustringCódigo único de estoque
pricefloatPreço de lista
costPrice?floatPreço de custo (cálculo de margem)
category?stringCategoria do produto
ncmCode?stringCódigo NCM fiscal
brand?stringMarca do fabricante
weightKg?floatPeso em quilogramas
minOrderQty?intQuantidade mínima de pedido
leadTimeDays?intPrazo de entrega em dias

Endpoints da API

O nó local expõe uma API REST para integração com sistemas externos.

POST
/api/v1/negotiate

Iniciar uma nova negociação publicando HASH_INTEREST.

GET
/api/v1/negotiations

Listar todas as negociações ativas com status atual.

GET
/api/v1/negotiations/{id}

Detalhes completos incluindo a cadeia de hash.

POST
/api/v1/negotiations/{id}/approve

Aprovação humana para o estado HASH_WAITING_HUMAN.

POST
/api/v1/negotiations/{id}/cancel

Cancelar uma negociação, gerando HASH_CANCELLED.

GET
/api/v1/health

Saúde do nó: status, uptime, agentes registrados.

GET
/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.

json — webhook payload
{
  "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.

.env
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.

.env
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.

php
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.