Ir al contenido

Colas (queues)

Una cola (queue) es una lista de unidades de trabajo que NORA reparte entre uno o varios robots. En lugar de codificar “qué procesar” dentro del bot, los datos se cargan como items y los robots los consumen uno a uno. Esto permite paralelizar el trabajo, reintentar lo que falla y mantener un registro auditable de cada unidad procesada.

Colas de trabajo en NORA, cada una con su recuento de items nuevos, en proceso, completados y fallidos.

El patrón es productor / consumidor:

  • El productor llena la cola con items (desde el panel, desde otro bot, o vía API con X-API-Key).
  • El consumidor (un robot ejecutando un job) toma items, los procesa y reporta el resultado.
flowchart TD
    P[Productor: panel / API / otro bot] -->|añade items| Q[(Cola)]
    Q -->|toma el siguiente item| R[Robot / Job]
    R -->|completa o falla| Q
    R -.->|envía a revisión| H[Revisor humano]
    H -.->|aprueba / rechaza| Q

Una cola pertenece a un workspace (tenant) y su name es único dentro de él. Campos principales (modelo Queue):

CampoDescripción
nameNombre único en el workspace. El robot lo usa para identificar la cola.
descriptionTexto libre opcional.
max_retriesReintentos antes de marcar un item como dead_letter. Rango 0–10 (por defecto 3).

Cada item (QueueItem) lleva la carga útil en data (un objeto JSON libre) y avanza por una máquina de estados. Campos relevantes:

CampoDescripción
dataCarga útil JSON definida por el productor.
priority1 = baja, 3 = normal (por defecto), 5 = urgente.
referenceClave de negocio opcional fijada por el productor (buscable).
deadlineSLA opcional; los items con deadline más próximo se despachan primero.
postponeEl robot omite el item hasta que llegue este instante.
resultResultado JSON que escribe el robot al completar.
retry_countNúmero de reintentos consumidos.
error_messageMotivo del último fallo o rechazo.
processed_byid del job que procesó el item.
reviewed_by / reviewed_atUsuario y momento de la revisión humana.

Estados que escribe la plataforma a lo largo del ciclo de vida:

EstadoSignificado
newListo para ser tomado por un robot.
in_progressUn robot lo está procesando.
pending_reviewPausado, esperando aprobación humana.
completedProcesado con éxito (lleva result).
failedFalló o fue rechazado por un revisor.
dead_letterSuperó max_retries; ya no se reintenta solo.
stateDiagram-v2
    [*] --> new
    new --> in_progress
    in_progress --> completed
    in_progress --> pending_review
    in_progress --> failed
    pending_review --> new : aprobado
    pending_review --> failed : rechazado
    failed --> dead_letter : sin reintentos
    failed --> new : reintento
    dead_letter --> new : reintento manual

Desde la API pública, el productor añade items a una cola identificándola por nombre, con una API key de scope queues:write. La respuesta va envuelta en { "data": ... } (ver autenticación).

Ventana de terminal
curl -X POST \
"https://nora-api.valisoftconsulting.com/api/v1/queues/by-name/facturas/items" \
-H "X-API-Key: nora_ak_xxx" \
-H "Content-Type: application/json" \
-d '{
"data": {"numero": "F-001", "proveedor": "Acme", "monto": 15420},
"priority": 5,
"reference": "F-001"
}'
{
"success": true,
"data": {
"id": "",
"queue_id": "",
"status": "new",
"priority": 5,
"reference": "F-001",
"data": {"numero": "F-001", "proveedor": "Acme", "monto": 15420},
"result": null,
"retry_count": 0
}
}

Para carga masiva existe el endpoint .../items/bulk (hasta 1000 items por petición, scope queues:write). Los detalles completos de todos los endpoints están en la referencia de colas en la API.

El robot, dentro de su job, toma el siguiente item disponible y reporta el desenlace mediante el NORA Agent SDK. La selección respeta priority, deadline y postpone.

from nora_agent import sdk
while True:
item = sdk.get_queue_item("facturas") # toma el siguiente; None si está vacía
if item is None:
break
try:
resultado = procesar(item["data"])
sdk.complete_queue_item("facturas", item["id"], resultado)
except Exception as e:
# Reintenta hasta max_retries; luego pasa a dead_letter
sdk.fail_queue_item("facturas", item["id"], str(e))

Cuando un paso requiere validación, el robot puede pausar el item y esperar la decisión de una persona antes de continuar. El flujo lo expone el SDK y la decisión se toma desde el panel.

sequenceDiagram
    participant R as Robot
    participant N as NORA
    participant H as Revisor
    R->>N: send_queue_item_for_review(item)
    Note over N: status → pending_review
    N-->>H: notificación en el panel
    H->>N: Aprobar / Rechazar
    R->>N: wait_for_queue_review(item)
    N-->>R: "approved" o "rejected"
    alt aprobado
        R->>N: complete_queue_item(...)
    else rechazado
        Note over N: status → failed
    end
  1. El robot llama a send_queue_item_for_review(...); el item pasa a pending_review y se notifica al panel.
  2. El robot bloquea con wait_for_queue_review(...) (sondea hasta un timeout configurable).
  3. Un revisor abre la cola, revisa los data del item y aprueba (vuelve a new para que el robot lo procese) o rechaza (queda failed).
  4. El robot recibe "approved" o "rejected" y actúa en consecuencia.

Una cola puede tener revisores asignados (QueueReviewer). Si los tiene, solo esos usuarios reciben la notificación y pueden decidir. Si no tiene ninguno, cualquier admin u operator del workspace puede revisar. Asignar revisores es exclusivo de admin.

RolCrear/editar colas y cargar itemsAprobar/rechazarAsignar revisores
admin
operatorSí (si está asignado o la cola no tiene revisores)No
viewerNo (solo lectura)NoNo

Desde el panel también puedes aplicar acciones masivas sobre varios items a la vez: retry, approve, reject o delete.

La superficie pública completa de la API está documentada en la referencia de la API.