WATP Docs

Documentação do WATP

O Wortic Autonomous Trade Protocol é um contrato aberto de protocolo para negociações autônomas entre agentes (A2A) de diferentes empresas. Este guia cobre o envelope atual, SDKs públicos, snapshots Java/A2A/ACP/catalog-feed, demo catalog-feed-A2A-ACP, PrestaShop beta, registry-gossip e limites do runtime.

Versão Preliminar

O WATP está em beta técnico controlado. O core/runtime permanece privado/local; os repositórios públicos expõem protocolo e SDKs TS/Python/Go, enquanto Java, A2A, ACP, UCP, demo cross-protocol, PrestaShop e registry-gossip têm snapshots limpos para PR controlado.

Início Rápido

Comece pelo snapshot público do protocolo e valide as fixtures do contrato fora do core privado.

bash
# 1. Clonar o contrato público do protocolo
git clone https://github.com/wortic-tecnologia/watp-protocol.git
cd watp-protocol

# 2. Validar fixtures e exemplos
npm install
npm run validate

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)

SDKs públicos

bash
git clone https://github.com/wortic-tecnologia/watp-sdk-typescript.git
git clone https://github.com/wortic-tecnologia/watp-sdk-python.git
git clone https://github.com/wortic-tecnologia/watp-sdk-go.git

# Sprints 6-9: snapshots locais aguardando PR público
# sdk/java       -> dev.watp:watp-sdk:0.3.0
# connectors/a2a -> watp-a2a-bridge:0.3.0
# connectors/acp -> watp-acp-bridge:0.3.0
# connectors/ucp -> watp-ucp-bridge:0.3.0
# connectors/agentic-commerce-demo -> watp-agentic-commerce-demo
# connectors/prestashop -> watp-prestashop-connector
# services/registry-gossip -> watp-registry-gossip

Deploy do runtime

bash
# Na Fase 1, os nós de runtime são deployments privados gerenciados pela Wortic.
# Os repositórios públicos expõem apenas protocolo e SDKs de integração.

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": "hmac-sha256: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 Termos finais registrados na cadeia de hash
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 HMAC

No runtime atual, escritas críticas de peers conhecidos usam autenticação Bearer mais assinatura HMAC por peer. Identidade por certificado e fluxos de assinatura jurídica são roadmap, não garantias do contrato atual.

php
# Headers de escrita crítica entre peers
Authorization: Bearer <network-token>
X-WATP-Node-Id: watp-supplier
X-WATP-Node-Signature: hmac-sha256:base64...

SDKs públicos

Os SDKs focam em builders, validação de envelope, hashing, HMAC/Ed25519, transporte HTTP e fixtures de conformidade. TypeScript, Python e Go já têm repos públicos; Java, A2A, ACP, UCP, o demo UCP-A2A-ACP, PrestaShop beta e registry-gossip estão prontos em snapshots para validação/publicação controlada.

Java SDK

dev.watp:watp-sdk:0.3.0 cobre envelope, hash, HMAC, Ed25519, registry, server e negotiate.

Bridge A2A

commerce.negotiate chama WATP negotiate e retorna payment_url quando o supplier conclui.

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

# Confiança entre peers WATP
WATP_SHARED_SECRET=network-token
WATP_NODE_SECRETS_FILE=/secure/watp-node-secrets.json

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/messages

Enviar um envelope de mensagem WATP, como 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 HMAC inválida, peer desconhecido ou janela de replay 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.