Boilerplate completo para construir soluciones agénticas sobre IBM watsonx Orchestrate (ADK 2.x) con una capa web encima. Destilado de cotemar-poc-n1 y dun-casos-prueba. Incluye: - 11 docs (best practices, architecture patterns, ADK cheatsheet, observability, tool authoring, deployment, RUNBOOK, DEPLOY_TO_NEW_WOX, known-issues con 16 errores reales y fix, eval strategy, INDEX) - 13 templates WxO (orchestrator/specialist/single-meta agents, 3 connections, KB + runbook, observable_tool decorator, coercion helpers, Python tools, OpenAPI spec, backend filter endpoint, webhook validator HMAC, MCP connection) - 6 scripts (deploy idempotente con fallback ADK, undeploy, reset, check-adk-version, new-specialist scaffold, eval-agents runner) - 4 eval pieces (linter de best practices, runner, smoke-test, direct backend probe) + scenario templates - 8 subagentes Claude (.claude/agents/) — wxo-architect, wxo-agent-author, wxo-tool-author, runbook-author, mock-builder, backend-tool-builder, eval-author, web-layer-builder - Skill bundle fit-wxo-bootstrap/ (SKILL.md + 3 templates) listo para copiar a ~/.claude/skills/ - Web layer default FastAPI+HTMX con vista timeline observable + endpoint receptor de trazas - Docker compose Coolify-ready (healthcheck wget -qO-, sin labels Traefik, network split internal:true) - CI Gitea workflow con lint + smoke Best practices enforced por evals/lint_wxo_yaml.py: - A1: máx 10 tools por agente - A3: orchestrator sin tools de remediación - A6: agente sin propósito (react sin tools ni KB) - T1: @observable_tool obligatorio, no @tool directo - T3: _compat shim inline en tools.py - D1: docker-compose sin wget --spider - I-005: OpenAPI con description per-operation - I-009: sin labels Traefik manuales Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5.1 KiB
Deploy to a New WxO Tenant — Cold Start Playbook
Cuando arrancás esta solución en un tenant WxO completamente nuevo (otro cliente, otro environment, fresh start), seguí este playbook literal. Es el camino más corto desde "tengo credenciales" a "demo funcionando".
Step 0 — Pre-requisitos
- IBM Cloud account del cliente con WxO instance provisionada
- API key del tenant
- Coolify (u otro host Docker) accesible
- Dominio público con DNS apuntando al host
- Acceso a Gitea/repo para clonar el código
Step 1 — Provisionar el ADK localmente
python3.12 -m venv .venv-wxo
source .venv-wxo/bin/activate
pip install --upgrade "ibm-watsonx-orchestrate==2.1.0"
orchestrate --version # 2.1.x
Verificá que el modelo esté disponible:
orchestrate env add -n nuevo-tenant \
--iam-url https://iam.cloud.ibm.com/identity/token \
-u "$ORCHESTRATE_API_URL"
orchestrate env activate nuevo-tenant
orchestrate models list | grep gpt-oss-120b
Si no aparece gpt-oss-120b, editá los YAMLs en wxo/agents/ y poné
meta-llama/llama-3-3-70b-instruct (con la advertencia de I-002).
Step 2 — Secretos
Crear .env desde .env.example:
cp .env.example .env
nano .env
Llenar:
ORCHESTRATE_API_URLORCHESTRATE_API_KEYWATSONX_API_KEY(si vas a usar Plan A)PUBLIC_HOST- (Coolify)
COOLIFY_API_URL,COOLIFY_API_TOKEN
Step 3 — Deploy del backend / mocks
Si tu solución incluye un backend propio o mocks:
# Coolify: crear app desde el git repo, configurar env vars, deploy
# O localmente:
docker compose up -d --build
Verificá que el PUBLIC_HOST/health responde 200:
curl -sf "https://$PUBLIC_HOST/health"
Si da 503 → Traefik exclude por healthcheck. Issue I-008. Si da default cert → labels manuales en compose. Issue I-009.
Step 4 — Deploy del stack WxO
PUBLIC_HOST=mi-cliente.fitlabs.dev ./scripts/deploy-wxo.sh
El script:
- Crea las connections (draft + live)
- Importa los tools
- Importa las KBs
- Importa los agentes en orden (specialists primero)
- Hace
deploy --env livede cada uno - Crea el canal webchat
Si falla a mitad de camino:
- Re-corré el script (es idempotente)
- Si persiste, ver
docs/known-issues.md
Step 5 — Capturar IDs
orchestrate agents list
Buscá tu orchestrator en el env live, capturá:
agent_id(UUID)environment_id(UUID)
Ponelos en:
web/.../templates/index.html(o donde esté tu landing):agentIdyagentEnvironmentId.env:WXO_AGENT_ID- Coolify panel:
WXO_AGENT_IDenv var
Commit + redeploy de la landing.
Step 6 — Embed Security OFF (manual, UI)
Esto es manual. No hay API.
- WxO Console → Settings
- Embed Security → Off
- Confirmar
Sin esto, el widget de chat queda en "Cargando..." para siempre. Issue I-007.
Step 7 — Smoke test
./evals/smoke-test.sh
Si pasa, validá manualmente:
# Abrir el chat
open "https://$PUBLIC_HOST/"
Tirale al chat tu primer scenario. Verifica que:
- El agente responde
- El tool se llama (mirá
docker logs <web>para ver las trazas) - El resultado final aparece en la UI (kanban / control plane / lo que sea)
Step 8 — Direct backend probe (diagnóstico)
Si el chat funciona pero ves errores, ejecutá:
./evals/direct-backend-probe.sh
Esto llama tu backend directamente con curl + el token de WxO. Sirve para aislar:
- 200 OK con error de lógica → el backend está bien, el problema está en la conversación con el agente
- 401/403 → problema de auth / connection / credentials
- 502/504 → problema de red entre WxO y tu backend (firewall, DNS, Cloud Run cold start, etc.)
Step 9 — Activar Plan A (webhook → Runs API)
Si tu solución tiene auto-trigger desde un sistema externo:
- Capturá el
WXO_AGENT_ID(paso 5) - Asegurate que
WATSONX_API_KEYestá en.env - Re-deployá el backend/mocks (
docker compose up -d --force-recreate) - Probá disparando un evento desde el sistema externo
- Mirá los logs: debería ver
→ POST /v1/orchestrate/runs ... 200
Issue I-011 si los env vars no se actualizan: restart no relee .env,
usar --force-recreate.
Step 10 — Set up monitoring básico
- Coolify alerta por email si el container reinicia >3 veces en 5 min
- Healthcheck endpoint custom si necesitás
- Logs accesibles desde Coolify panel
./evals/smoke-test.shcorriendo nightly desde CI
Checklist final
- Step 0 — Pre-reqs listos
- Step 1 — ADK provisionado + modelo disponible
- Step 2 —
.envcompleto - Step 3 — Backend/mocks responden 200 en /health
- Step 4 —
./scripts/deploy-wxo.shsin errores - Step 5 — IDs capturados y propagados
- Step 6 — Embed Security OFF
- Step 7 — Smoke test pasa
- Step 8 — Direct probe responde 200
- Step 9 — (si aplica) Plan A funciona
- Step 10 — Monitoring básico
Cuando los 10 estén ✅, estás listo para demo.
Si algo se rompió en producción
Ver docs/RUNBOOK.md para recovery procedures.