Documentación del WATP
El Wortic Autonomous Trade Protocol es un contrato abierto de protocolo para negociaciones autónomas entre agentes (A2A) de diferentes empresas. Esta guía cubre el envelope actual, SDKs públicos, snapshots Java/A2A/ACP/catalog-feed, demo catalog-feed-A2A-ACP, PrestaShop beta, registry-gossip y límites del runtime.
Versión Preliminar
WATP está en beta técnico controlado. El core/runtime permanece privado/local; los repositorios públicos exponen protocolo y SDKs TS/Python/Go, mientras Java, A2A, ACP, UCP, demo cross-protocol, PrestaShop y registry-gossip tienen snapshots limpios para PR controlado.
Inicio Rápido
Empiece por el snapshot público del protocolo y valide las fixtures del contrato fuera del core privado.
# 1. Clonar el contrato público del protocolo
git clone https://github.com/wortic-tecnologia/watp-protocol.git
cd watp-protocol
# 2. Validar fixtures y ejemplos
npm install
npm run validate
Instalación
Requisitos
- PHP 8.1+ (8.3 recomendado)
- Docker and Docker Compose
- Acceso al ERP (MySQL / PostgreSQL / REST API)
- Clave de IA (opcional — OpenAI, Anthropic, Google Gemini, u Ollama local)
SDKs públicos
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 locales esperando PR publico
# 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 del runtime
# En la Fase 1, los nodos de runtime son deployments privados gestionados por Wortic.
# Los repositorios públicos exponen solo protocolo y SDKs de integración.
Formato de Mensaje
Toda la comunicación WATP usa un sobre JSON estandarizado. Cada mensaje referencia el hash anterior, formando una cadena inmutable.
{
"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
El ciclo de vida de una negociación WATP sigue estados determinísticos. Cada transición es validada y persistida en la cadena de hash.
| Estado | Tipo | Descripción |
|---|---|---|
HASH_INTEREST |
Inicio | El agente detecta demanda y publica un interés de compra en la red |
HASH_PROPOSAL |
Negociación | Propuesta formal: precio, condiciones de pago, entrega |
HASH_COUNTER |
Negociación | Contrapropuesta dentro de los guardrails configurados |
HASH_WAITING_HUMAN |
Seguridad | Fuera de parámetros — se requiere aprobación humana |
HASH_CONCLUDED |
Final | Términos finales registrados en la cadena de hash |
HASH_CANCELLED |
Final | Negociación cancelada por cualquiera de las partes |
HASH_WAITING_HUMAN
Este estado es obligatorio cuando la negociación excede los guardrails configurados. El sistema nunca cierra un acuerdo fuera de los límites definidos sin aprobación humana explícita.
Cadena de Hash
Cada mensaje contiene el hash SHA-256 del mensaje anterior, creando una pista de auditoría inmutable sin necesidad 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);
Firmas HMAC
En el runtime actual, escrituras críticas de peers conocidos usan autenticación Bearer más firma HMAC por peer. Identidad basada en certificados y flujos de firma jurídica son roadmap, no garantías del contrato actual.
# Headers de escritura crítica entre peers
Authorization: Bearer <network-token>
X-WATP-Node-Id: watp-supplier
X-WATP-Node-Signature: hmac-sha256:base64...
SDKs públicos
Los SDKs se enfocan en builders, validación de envelope, hashing, HMAC/Ed25519, transporte HTTP y fixtures de conformidad. TypeScript, Python y Go ya tienen repos públicos; Java, A2A, ACP, UCP, el demo UCP-A2A-ACP, PrestaShop beta y registry-gossip están listos como snapshots para validación/publicación controlada.
Java SDK
dev.watp:watp-sdk:0.3.0 cubre envelope, hash, HMAC, Ed25519, registry, server y negotiate.
Bridge A2A
commerce.negotiate llama WATP negotiate y retorna payment_url cuando el supplier concluye.
<?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();
Configuración
Toda la configuración se realiza mediante el archivo .env en el directorio del nodo.
# 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
# Confianza entre peers WATP
WATP_SHARED_SECRET=network-token
WATP_NODE_SECRETS_FILE=/secure/watp-node-secrets.json
Agentes
Los agentes son clases PHP que encapsulan la lógica de negocio. Extienda el 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
Reglas de negocio inmutables que restringen las negociaciones de la IA. Si se exceden, el estado transiciona a HASH_WAITING_HUMAN.
| Parámetro | Tipo | Descripción |
|---|---|---|
GUARD_MIN_MARGIN |
int (%) | Margen bruto mínimo aceptable |
GUARD_MAX_DISCOUNT |
int (%) | Descuento máximo sobre el precio de lista |
GUARD_MAX_PAYMENT_DAYS |
int | Plazo máximo de pago en días |
GUARD_AUTO_APPROVE_BELOW |
float | Aprobación automática por debajo de este total |
GUARD_MAX_ROUNDS |
int | Máximo de contrapropuestas antes de escalar |
GUARD_BLOCKED_IDS |
string | IDs fiscales bloqueados separados por coma |
Productos
La clase Product ofrece acceso tipado al catálogo del socio con 18 campos enriquecidos incluyendo dimensiones, precio de costo, código NCM y plazo de entrega.
use Wortic\WATP\Client;
use Wortic\WATP\Product;
$client = new Client(['node_url' => 'https://site-a.wortic.com/api']);
// Listar todos los productos (retorna Product[])
$products = $client->listProducts();
foreach ($products as $p) {
printf("%s — %s — R$ %.2f\n", $p->sku, $p->name, $p->price);
}
// Buscar un producto 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 del Producto
| Propiedad | Tipo | Descripción |
|---|---|---|
name | string | Nombre del producto |
sku | string | Código único de stock |
price | float | Precio de lista |
costPrice | ?float | Precio de costo (cálculo de margen) |
category | ?string | Categoría del producto |
ncmCode | ?string | Código fiscal NCM (Brasil) |
brand | ?string | Marca del fabricante |
weightKg | ?float | Peso en kilogramos |
minOrderQty | ?int | Cantidad mínima de pedido |
leadTimeDays | ?int | Plazo de entrega en días |
Endpoints de la API
El nodo local expone una API REST para la integración con sistemas externos.
/api/v1/messages
Enviar un envelope de mensaje WATP, como HASH_INTEREST.
/api/v1/negotiations
Listar todas las negociaciones activas con su estado actual.
/api/v1/negotiations/{id}
Detalle completo incluyendo la cadena de hash.
/api/v1/negotiations/{id}/approve
Aprobación humana para el estado HASH_WAITING_HUMAN.
/api/v1/negotiations/{id}/cancel
Cancelar una negociación, generando HASH_CANCELLED.
/api/v1/health
Salud del nodo: estado, uptime, agentes registrados.
/api/v1/catalog
Catálogo completo de productos con campos enriquecidos (18 propiedades por producto).
Webhooks
Configure webhooks para recibir eventos en tiempo real en su 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 Error
| Código | Constante | Descripción |
|---|---|---|
| 4001 | INVALID_HASH_CHAIN |
El hash anterior no coincide |
| 4002 | GUARDRAIL_VIOLATED |
La propuesta excedió los guardrails |
| 4003 | INVALID_SIGNATURE |
Firma HMAC inválida, peer desconocido o ventana de replay expirada |
| 4004 | AGENT_NOT_FOUND |
El agente de destino no está en la red |
| 4005 | NEGOTIATION_EXPIRED |
El TTL de la negociación expiró |
| 5001 | ERP_CONNECTION_FAILED |
No se pudo conectar al ERP local |
| 5002 | AI_PROVIDER_ERROR |
Error al llamar a la API del proveedor de IA |
BYOK — Trae Tu Propia Clave
Use su propia clave de API. Usted controla costos, selección de modelo y límites de uso.
AI_PROVIDER=openai
AI_API_KEY=sk-proj-...
AI_MODEL=gpt-4o-mini
Computación Local
Costo cero. El modelo corre en el propio servidor del cliente, completamente offline y privado.
AI_PROVIDER=ollama
AI_OLLAMA_URL=http://localhost:11434
AI_MODEL=llama3.1:7b
Orquestador Anti-Amnesia
Garantiza que el modelo nunca pierda el contexto de negociación ni rompa el formato JSON. Poda automáticamente el historial y reinyecta el prompt del 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 qué Anti-Amnesia?
En negociaciones largas (más de 5 rondas), los modelos más pequeños pierden el contexto inicial. El Orquestador mantiene un resumen comprimido junto con el prompt del sistema intacto, garantizando consistencia incluso con ventanas de contexto limitadas.