Ir al contenido

Jobs (ejecuciones)

Un job es una ejecución concreta de un proceso sobre una máquina. Cuando lanzas un proceso, NORA crea un job, lo encola y una máquina con el agente conectado lo recoge, ejecuta el robot y reporta el resultado. Cada job guarda su estado, sus logs, los datos de entrada/salida y, si falla, el mensaje de error.

Tabla de jobs en NORA mostrando proceso, estado, máquina, duración, fecha de inicio y origen de cada ejecución.

Un job referencia siempre un proceso y una máquina, y lleva estos campos principales (ver respuesta de la API más abajo):

CampoDescripción
idIdentificador único del job (UUID).
process_id / machine_idProceso ejecutado y máquina asignada.
statusEstado actual (ver Estados).
priorityPrioridad de encolado: 1 baja, 3 normal, 5 urgente (rango 1–5).
input_dataDatos de entrada para el robot (objeto JSON, máx. 1 MB).
output_dataDatos devueltos por el robot al finalizar.
logsFlujo de logs acumulado.
error_messageMensaje de error si el job falló.
started_at / finished_atMarcas de inicio y fin de ejecución.
progress_percent / progress_messageProgreso reportado por el robot.
retry_countNúmero de reintento (0 = ejecución original).

En el panel de NORA, abre un proceso y pulsa Ejecutar. Selecciona la máquina destino (debe estar activa y en línea), ajusta la prioridad y, si el proceso espera datos, completa el input_data. NORA crea el job en estado pending y lo asigna a la máquina cuando esta tenga capacidad libre.

Para crear un job desde la UI necesitas rol admin u operator. El rol viewer solo puede consultar jobs.

Los clientes externos lanzan jobs con una clave de API (X-API-Key: nora_ak_...). El endpoint y el payload exactos se documentan en Disparar jobs. En resumen:

Ventana de terminal
curl -X POST https://nora-api.valisoftconsulting.com/api/v1/jobs/trigger \
-H "X-API-Key: nora_ak_xxxxxxxxxxxxxxxxxxxx" \
-H "Content-Type: application/json" \
-d '{
"process_id": "f1e2d3c4-0000-0000-0000-000000000000",
"input_data": {"cliente": "ACME"},
"priority": 3
}'

machine_id es opcional en la API por clave: si lo omites, NORA elige automáticamente una máquina activa y en línea del tenant. La respuesta va envuelta en {"success": true, "data": {...}}:

{
"success": true,
"data": {
"id": "9a8b7c6d-0000-0000-0000-000000000000",
"process_id": "f1e2d3c4-0000-0000-0000-000000000000",
"machine_id": "1234abcd-0000-0000-0000-000000000000",
"status": "pending",
"priority": 3,
"input_data": {"cliente": "ACME"},
"output_data": null,
"logs": null,
"error_message": null,
"started_at": null,
"finished_at": null,
"retry_count": 0,
"stop_requested": false,
"process_name": "Facturación diaria",
"machine_name": "VM-PROD-01"
}
}

Crear un job por API requiere una clave con scope jobs:write. El endpoint está limitado a 30 solicitudes por minuto. Consulta autenticación para los scopes.

El status de un job evoluciona según estas transiciones válidas (definidas en el backend):

flowchart TD
    pending["pending<br/>(en cola)"]
    assigned["assigned<br/>(asignado a máquina)"]
    running["running<br/>(en ejecución)"]
    completed["completed"]
    failed["failed"]
    cancelled["cancelled"]

    pending -->|máquina lo recoge| assigned
    assigned -->|robot inicia| running
    running -->|éxito| completed
    running -->|error| failed
    pending -->|cancelar| cancelled
    assigned -->|cancelar| cancelled
    running -->|cancelar| cancelled
EstadoSignificado
pendingJob creado y en cola, a la espera de que una máquina con capacidad lo recoja.
assignedUna máquina lo tomó de la cola; el robot aún no ha comenzado.
runningEl robot está ejecutándose. Se fija started_at.
completedTerminó correctamente. Se fija finished_at y se guarda output_data.
failedTerminó con error. Se fija finished_at y se guarda error_message.
cancelledCancelado antes de completar.

Mientras el job se ejecuta, el robot envía sus logs y NORA los anexa al campo logs del job, visible en tiempo casi real en la interfaz. El SDK produce cada línea con este formato:

[2026-06-19T14:03:11Z] [INFO] Procesando factura 0042
[2026-06-19T14:03:12Z] [ERROR] Timeout al abrir el portal | {"intento": 3}

Es decir: marca de tiempo UTC ISO‑8601 entre corchetes, nivel en mayúsculas (INFO, WARNING, ERROR, DEBUG) y el mensaje. Si pasas datos estructurados, se añaden tras una barra | como JSON. La función log() del SDK genera estas líneas; ver SDK de robots para los detalles.

Los logs antiguos pueden archivarse según la política de retención. Si un job tiene logs archivados, se recuperan por separado a través de su endpoint de logs archivados.

Detener (stop) solicita una parada ordenada de un job en ejecución. NORA marca stop_requested = true; el agente lee esa señal y termina el robot de forma controlada. Solo se puede detener un job en estado running.

Por API, con una clave de scope jobs:stop:

Ventana de terminal
curl -X POST https://nora-api.valisoftconsulting.com/api/v1/jobs/{job_id}/stop \
-H "X-API-Key: nora_ak_xxxxxxxxxxxxxxxxxxxx"

La respuesta de stop devuelve el job actualizado, envuelto en {"success": true, "data": {...}}.