# Agentes y ejecuciones
Un agente es un conjunto guardado de pasos que trabaja con sus datos, según un horario o cuando algo ocurre. Cada agente pertenece a un proyecto. ¿Es nuevo en agentes? Empiece por [Crear un agente](/docs/es/agents/create-an-agent).
## Antes de empezar [#antes-de-empezar]
- Tiene el **ID del proyecto** donde vive el agente, y puede editar ese proyecto.
- Poner un agente en vivo requiere un Propietario o Administrador del espacio de trabajo, porque un agente en vivo gasta créditos.
- Todos los ejemplos suponen `nexus = Nexus.connect()`.
## Encuentre agentes [#encuentre-agentes]
```python
for agent in nexus.agents.list(project_id):
print(agent)
for agent in nexus.agents.list_all(): # every project you can open
print(agent)
```
## Guarde y pruebe un borrador [#guarde-y-pruebe-un-borrador]
Un agente es un archivo `agents/.yaml` con su código Python en `agents//`, dentro del código de su proyecto. `save()` guarda ambos desde una carpeta local como borrador:
```python title="test_agent.py"
from pathlib import Path
from klarety import KlaretyError, Nexus
PROJECT = "your-project-id"
with Nexus.connect() as nexus:
try:
version_id = nexus.agents.save(PROJECT, "daily-summary", root=Path("."))
run_id = nexus.agents.start(PROJECT, "daily-summary", draft=True, inputs={"days": 1})
except KlaretyError as failed:
raise SystemExit(f"Could not test the agent: {failed}")
print("Draft", version_id, "running as", run_id)
```
`nexus.agents.check(project_id, text)` revisa el texto YAML sin guardarlo. Un borrador nunca se ejecuta solo; `start(..., draft=True)` lo ejecuta una vez.
## Póngalo en vivo [#póngalo-en-vivo]
```python
nexus.agents.ask_to_publish(PROJECT, "daily-summary", version_id)
```
Una persona decide en la app. Un Propietario o Administrador puede publicar directamente con `nexus.agents.publish(PROJECT, "daily-summary", version_id)`; cualquier otra persona es rechazada. `unpublish()` lo saca de línea, y `publish()` con un `version_id` anterior trae de vuelta esa versión. `nexus.agents.version(project_id, version_id)` muestra una versión guardada.
## Inicie una ejecución y sígala [#inicie-una-ejecución-y-sígala]
Cada ejecución informa su estado y sus pasos:
```python title="run_and_wait.py"
import time
from klarety import Nexus
PROJECT = "your-project-id"
with Nexus.connect() as nexus:
run_id = nexus.agents.start(PROJECT, "daily-summary")
run = nexus.agents.run(PROJECT, run_id)
while run["state"] == "running":
time.sleep(10)
run = nexus.agents.run(PROJECT, run_id)
print(run["state"], run["reason"], run["credits"], "credits")
for step in run["steps"]:
print(step["id"], step["state"], step["reason"])
```
Una ejecución termina como `done`, `failed`, `declined` o `stopped`. Cada paso tiene su propio estado: `waiting`, `running`, `asking`, `done`, `failed`, `declined`, `stopped` o `skipped`, entre otros.
## Responda un paso de aprobación [#responda-un-paso-de-aprobación]
Un paso en estado `asking` espera a que una persona diga que sí:
```python
for step in run["steps"]:
if step["state"] == "asking":
nexus.agents.answer(PROJECT, run_id, step["id"], yes=True)
```
`yes=True` continúa la ejecución. `yes=False` la detiene en ese paso.
## Lea lo que produjo una ejecución [#lea-lo-que-produjo-una-ejecución]
```python
result = nexus.agents.result(PROJECT, run_id)
print(result["value"]) # up to 1 MiB
print(result["files"]) # files the run left
names = nexus.agents.outputs(PROJECT, run_id, step_id)
data = nexus.agents.output(PROJECT, run_id, step_id, names[0]) # bytes
print(nexus.agents.log(PROJECT, run_id, step_id))
```
Para un paso que se ejecuta una vez por elemento, pase `item=` a `outputs()`, `output()` y `log()` para leer un elemento.
## Liste ejecuciones, detenga y vuelva a ejecutar [#liste-ejecuciones-detenga-y-vuelva-a-ejecutar]
```python
for one in nexus.agents.runs(PROJECT, agent="daily-summary"): # newest first, page by page
print(one["run_id"], one["state"])
nexus.agents.stop(PROJECT, run_id)
new_run = nexus.agents.rerun(PROJECT, run_id, from_step="summarise")
print(nexus.agents.stats(PROJECT, days=7)) # runs per day: count, outcomes, cost
```
`rerun()` inicia una ejecución nueva desde un paso, reutilizando lo que produjeron los anteriores. Para paginar desde otro proceso, use `runs_page()` y pase su `next` como `after`.
## Elimine un agente [#elimine-un-agente]
```python
nexus.agents.delete(PROJECT, "daily-summary")
```
El agente se pausa y sale de la lista. Sus ejecuciones quedan registradas.
## Qué puede salir mal [#qué-puede-salir-mal]
| Excepción | Causa | Qué hacer |
| --- | --- | --- |
| `KlaretyError: agents/.yaml does not exist` | `save()` no encontró el archivo bajo `root`. | Ejecute desde la carpeta del proyecto o pase `root=`. |
| `RefusedError` | No puede editar el proyecto, o no es administrador e intentó `publish()`. | Use `ask_to_publish()`, o pida acceso. |
| `NotFoundError` | No existe ese proyecto, agente o ejecución. | Revise los IDs. |
| `InsufficientCreditsError` | El espacio de trabajo no puede pagar la ejecución. | Agregue créditos. |
## Próximos pasos [#próximos-pasos]
- [Probar, poner en vivo y pausar](/docs/es/agents/go-live) para los mismos pasos en la app.
- [CLI](/docs/es/developers/cli) para los comandos `klarety agent`.
- [Trabajos y trabajos por lotes](/docs/es/developers/jobs) para trabajo en segundo plano sin un agente.