Operar NORA con IA
Esta página tiene dos usos: que una IA (un agente, un copiloto) sepa operar NORA, y que tú le pegues el contexto correcto para que te ayude a construir robots e integraciones sin adivinar.
Dale el contexto completo a tu IA
Sección titulada «Dale el contexto completo a tu IA»NORA publica su documentación en formato llms.txt, pensado para modelos de lenguaje:
| Archivo | Qué es | Cuándo usarlo |
|---|---|---|
/llms.txt | Índice: títulos, descripciones y enlaces de toda la doc. | Para que la IA sepa qué existe y navegue. |
/llms-full.txt | Volcado completo de toda la doc en Markdown. | Para pegar todo el conocimiento de NORA como contexto. |
/llms-small.txt | Versión compacta. | Cuando la ventana de contexto es limitada. |
Modelo mental (en 4 frases)
Sección titulada «Modelo mental (en 4 frases)»- Una máquina Windows/macOS con el agente instalado es donde corre el robot; debe estar Online.
- Un proceso es tu código Python (un release) que el agente ejecuta como un job.
- Una cola reparte unidades de trabajo entre robots; los assets guardan credenciales cifradas que el robot lee en runtime.
- El job se dispara a mano, por cron o por webhook/API, y se vigila con logs, progreso y detección de anomalías.
El robot habla con la plataforma con from nora_agent import sdk. Los sistemas externos
hablan con la API pública (https://nora-api.valisoftconsulting.com/api/v1,
cabecera X-API-Key, respuestas {"success": true, "data": ...}).
Recetario tarea → llamada
Sección titulada «Recetario tarea → llamada»Cada receta dice el objetivo y la llamada exacta. Las firmas completas están en la Lámina de comandos.
Dentro de un robot (SDK nora_agent)
Sección titulada «Dentro de un robot (SDK nora_agent)»| Quiero… | Llamada | Ver |
|---|---|---|
| Loguear un hito | sdk.log("info", "mensaje", {"clave": valor}) | SDK |
| Reportar avance | sdk.update_progress(50, "mitad") | SDK |
| Leer un argumento de entrada | mes = sdk.get_input("mes") (declarado en nora.json) | Argumentos |
| Devolver un resultado | sdk.set_output({"total": 142}) | Argumentos |
| Leer una credencial | cred = sdk.get_asset("portal"); cred["username"], cred["value"] | Assets |
| Tomar el siguiente item de una cola | item = sdk.get_queue_item("MiCola") (None si vacía) | Colas |
| Cerrar un item OK / con error | sdk.complete_queue_item("MiCola", item["id"], {...}) · sdk.fail_queue_item(..., "motivo") | Colas |
| Encolar trabajo desde el robot | sdk.add_queue_items("MiCola", lista_de_dicts) | Colas |
| Pedir aprobación humana de un item | sdk.send_queue_item_for_review("MiCola", item["id"]) + sdk.wait_for_queue_review(...) | Colas |
| Preguntarle algo al operador | sdk.ask_user("¿Continúo?", ["Sí", "No"]) | SDK |
| Salir limpio si piden Stop | if sdk.should_stop(): return | Tutorial 3 |
| Usar la resolución correcta | leer NORA_DISPLAY_WIDTH/HEIGHT antes que la del SO | SDK |
Desde fuera (API pública, X-API-Key)
Sección titulada «Desde fuera (API pública, X-API-Key)»| Quiero… | Llamada | Scope | Ver |
|---|---|---|---|
| Listar procesos | GET /processes/list → data[].id | processes:read | Autenticación |
| Disparar un job | POST /jobs/trigger con {"process_id":"…"} (machine_id opcional: si se omite, NORA elige una máquina online) | jobs:write | Disparar jobs |
| Ver el estado/resultado de un job | GET /jobs/{id} (patrón de polling) | jobs:read | Consultar jobs |
| Cargar muchos items en una cola | POST /queues/by-name/{name}/items/bulk | queues:write | Colas vía API |
| Leer un asset | GET /assets/by-name/{name}?environment=production | assets:read | Assets vía API |
| Disparar por webhook fijo | POST /webhooks/trigger/{process_id} | ninguno (requiere feature webhooks) | Webhooks |
Desde la consola / sesión (no X-API-Key)
Sección titulada «Desde la consola / sesión (no X-API-Key)»| Quiero… | Cómo | Ver |
|---|---|---|
| Programar por horario | POST /api/v1/schedules (cron + zona horaria) | Programaciones |
| Crear un trigger de webhook con HMAC | POST /api/v1/triggers (devuelve token+secret) | Triggers |
| Disparar el trigger entrante (emisor) | POST /api/v1/triggers/inbound/{webhook_token} con cabecera X-Webhook-Signature: sha256=<HMAC-SHA256 del cuerpo crudo> (clave = webhook_secret); endpoint público (sin X-API-Key); el prefijo sha256= es obligatorio | Triggers |
| Orquestar varios procesos | POST /api/v1/dags + /dags/{id}/execute | Flujos DAG |
| Revisar anomalías | GET /api/v1/anomalies?severity=critical&is_resolved=false | Anomalías |
Construir y desplegar un robot (lo que haría una IA)
Sección titulada «Construir y desplegar un robot (lo que haría una IA)»pip install nora-sdk # SDK + CLInora login # sesiónnora dev run main.py # probar con datos en vivo (sin agente)nora package # empaquetar (auto-versiona, excluye secretos)nora release push # subir como release# luego: crear el Proceso en la consola y lanzar/programar el jobTutorial guiado de punta a punta: Primer robot (RPA Challenge).
Reglas que una IA debe respetar
Sección titulada «Reglas que una IA debe respetar»- Nunca poner secretos en el código ni en los datos: usar assets (
get_asset).nora packageaborta si detecta un secreto. - Loguear con
sdk.log(...), no conprint()(en un job gestionado,printno llega a la plataforma). - Las funciones que bloquean esperando al operador (
ask_user) y las señales de control (should_stop/get_job_signal) solo funcionan en un job gestionado lanzado desde el Robots Center, no ennora dev run. - Cerrar siempre cada item de cola (
complete/fail); no dejarloin_progress. - Preferir
NORA_DISPLAY_WIDTH/HEIGHTa la resolución del SO en máquinas desatendidas. - En
nora dev run/dev envel token está acotado a dev/staging (nuncaproduction). Comosdk.get_asset(name)usaenvironment="production"por defecto, en pruebas locales pasa el entorno explícito:sdk.get_asset("portal", environment="dev"); el defaultproductionsolo lee assets dentro de un job gestionado.
Enlaces
Sección titulada «Enlaces»- Lámina de comandos — SDK + CLI + endpoints + enums.
- Tutoriales — ejemplo real de punta a punta.
/llms-full.txt— toda la doc para pegar a tu IA.