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. 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
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.