# Crea una interfaz de terminal para tu agente

Muestra progreso, consultas de referencias y pasos reanudables con una terminal portátil en Python.

## Añade una interfaz de terminal al mismo ejecutor

La terminal debe mostrar qué hace tu aplicación: qué paso ejecutó, qué referencia consultó y si terminó la tarea. Reutiliza `mandapi_worker.py` de la [guía sin interfaz](/es/cookbook/building-agents/headless-agent/). Esta interfaz portátil utiliza entrada y salida normales de Python, sin otro SDK de agentes.

Guarda el código como `agent_tui.py` junto a ese módulo. `/next` admite un paso, `/status` muestra el progreso y `/quit` deja disponible el último punto de control. Solo está habilitada la consulta de referencias fijas. La interfaz no concede acceso a comandos ni crea un agente alojado por MandAPI.

## Añade la interfaz

```python
import argparse
import os
from pathlib import Path
from mandapi_worker import load_state, step, chat, demo, MAX_STEPS


def safe(text):
    return "".join(c for c in str(text) if c.isprintable() or c == "\n")


def show_event(event):
    if event["event"] == "read":
        print("  reference:", safe(event["name"]))
    elif event["event"] == "done":
        print("  answer:", safe(event["answer"]))
    else:
        print("  status:", safe(event["event"]))


def run_ui(state, checkpoint, ask, read=input):
    while state["status"] == "ready":
        print("\n+--- MandAPI demo assistant ---+")
        print("attempts:", state["attempts"], "/", MAX_STEPS)
        print("/next = one step | /status | /quit")
        command = read("> ").strip()
        if command == "/quit":
            return state
        if command == "/status":
            print("status:", safe(state["status"]))
        elif command == "/next":
            print("working...", flush=True)
            step(state, checkpoint, ask, show_event)
        else:
            print("Unknown command")
    print("status:", safe(state["status"]))
    if state["result"]:
        print(safe(state["result"]))
    return state


if __name__ == "__main__":
    parser = argparse.ArgumentParser()
    parser.add_argument("job")
    parser.add_argument("--checkpoint", type=Path, default=Path("tui-run.json"))
    parser.add_argument("--demo", action="store_true")
    args = parser.parse_args()
    model = "offline-demo" if args.demo else os.environ["MANDAPI_MODEL_ID"]
    state = load_state(args.checkpoint, args.job, model)
    try:
        run_ui(state, args.checkpoint, demo if args.demo else chat)
    except (EOFError, KeyboardInterrupt):
        print("\nStopped; the last saved checkpoint remains available.")
    except (OSError, ValueError, KeyError, TypeError, IndexError) as error:
        print("Stopped:", type(error).__name__)
        raise SystemExit(1)
```

## Prueba la interacción

Ejecuta `python agent_tui.py "How long does demo shipping take?" --demo --checkpoint tui-demo.json`. Introduce `/status` y después `/next` dos veces. Debes ver el nombre de una referencia y una respuesta. Repite el comando con la misma tarea y archivo para consultar el resultado terminado sin llamar otra vez al modelo.

Para usar chat real, configura `MANDAPI_API_KEY` y un `MANDAPI_MODEL_ID` adecuado, omite `--demo` y elige otro archivo. El ejecutor realiza solicitudes normales a `https://api.mandapi.com/v1/chat/completions`; cada paso real puede consumir saldo. Muestra una espera y después el paso terminado, sin transmisión token a token.

## Verifica los controles

Prueba un comando desconocido y confirma que no envía solicitudes. Sal antes de `/next` y confirma que no hubo llamadas. Simula una acción inválida del modelo y comprueba que se rechaza. La visualización elimina caracteres de control; no imprimas directamente secuencias de escape generadas por el modelo.

Salir de la interfaz no cancela una solicitud remota ya aceptada. El intento fallido o interrumpido sigue contado. Para ejecutar sin supervisión, conserva el mismo módulo y sigue la [guía de tareas reanudables](/es/cookbook/building-agents/long-horizon/).

## Referencias

- [https://openrouter.ai/docs/cookbook/building-agents/create-agent-harness-tui](https://openrouter.ai/docs/cookbook/building-agents/create-agent-harness-tui)
