Agentes interactivos al estilo REPL
Bucles de entrada, historial y conversación de varios turnos en agentes de terminal.
Agentes interactivos al estilo REPL es una lección gratuita de AI Agents en CoddyKit. Esta es la lección 2 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de AI Agents, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de AI Agents incluye 4 lecciones en total.
¿Qué es un agente de estilo REPL?
Un REPL (Read-Eval-Print Loop, bucle de lectura-evaluación-impresión) es una sesión interactiva de terminal en la que se escribe una entrada, se obtiene una salida y se continúa. Los agentes conversacionales en la terminal funcionan exactamente así: el usuario escribe un mensaje, el agente responde y la conversación continúa hasta que el usuario sale.
El bucle REPL básico
El REPL más sencillo es un bucle while True que lee la entrada del usuario con input(), la procesa e imprime el resultado. El bucle se ejecuta indefinidamente hasta que el usuario indica que desea salir.
def run_agent_repl(inputs):
print('Agent started. Type /exit to quit.')
conversation_history = []
for user_input in inputs:
user_input = user_input.strip()
if not user_input:
continue
if user_input == '/exit':
print('Goodbye!')
break
conversation_history.append({'role': 'user', 'content': user_input})
agent_reply = f'[Agent reply to: {user_input}]'
conversation_history.append({'role': 'assistant', 'content': agent_reply})
print(f'Agent: {agent_reply}')
run_agent_repl(['Hello agent', 'What can you do?', '/exit'])Gestión adecuada de KeyboardInterrupt
Cuando un usuario pulsa Ctrl+C, Python genera una excepción KeyboardInterrupt. Captúrela en el nivel superior para mostrar un mensaje de despedida cordial en lugar de un seguimiento de pila.
def run_agent_repl():
print('Agent ready. Press Ctrl+C to exit.')
conversation_history = []
try:
while True:
user_input = input('You: ').strip()
if not user_input:
continue
conversation_history.append({'role': 'user', 'content': user_input})
reply = '[mocked agent response]'
conversation_history.append({'role': 'assistant', 'content': reply})
print(f'Agent: {reply}')
except KeyboardInterrupt:
print('\nSession ended. Goodbye!')
except EOFError:
# Triggered when stdin is closed (piped input ends)
print('\nEnd of input. Exiting.')
if __name__ == '__main__':
import builtins
_demo_inputs = iter(['What agents can you build?', EOFError])
def _fake_input(prompt=''):
val = next(_demo_inputs)
if val is EOFError:
raise EOFError
print(prompt + val)
return val
builtins.input = _fake_input
run_agent_repl()
Mantenimiento del historial de conversaciones de varios turnos
Para proporcionar al agente memoria de la conversación, mantenga una lista de mensajes y pase el historial completo al LLM en cada turno. Comience con un mensaje del sistema que establezca la personalidad del agente.
import openai
client = openai.OpenAI(api_key='YOUR_API_KEY')
def run_chat_repl():
history = [
{'role': 'system', 'content': 'You are a helpful AI assistant.'}
]
print('Chat started. Type /exit to quit.')
try:
while True:
user_input = input('You: ').strip()
if not user_input or user_input == '/exit':
break
history.append({'role': 'user', 'content': user_input})
response = client.chat.completions.create(
model='gpt-4o-mini',
messages=history
)
reply = response.choices[0].message.content
history.append({'role': 'assistant', 'content': reply})
print(f'Agent: {reply}')
except KeyboardInterrupt:
print('\nGoodbye!')readline: historial y edición de entradas
El módulo readline (Unix/Mac) permite desplazarse con las teclas de dirección por las entradas anteriores, igual que en un shell real. Los usuarios pueden pulsar la flecha arriba para recuperar mensajes anteriores.
try:
import readline # available on Unix/Mac, not Windows
# Enable persistent history between sessions
import os
HISTORY_FILE = os.path.expanduser('~/.agent_history')
try:
readline.read_history_file(HISTORY_FILE)
except FileNotFoundError:
pass
import atexit
atexit.register(readline.write_history_file, HISTORY_FILE)
readline.set_history_length(500)
print('History enabled (use up/down arrows)')
except ImportError:
pass # readline not available on Windows
# After this, input() automatically has history supportComandos de barra integrados
Proporcione a su agente REPL comandos de barra integrados para operaciones habituales: /help, /exit y /clear para restablecer la conversación; /history para consultar los mensajes anteriores.
def handle_command(cmd: str, history: list) -> bool:
'Returns True if the command was handled, False if it is a regular message'
if cmd == '/exit' or cmd == '/quit':
print('Goodbye!')
raise SystemExit(0)
elif cmd == '/help':
print('Commands: /exit, /clear, /history, /help')
return True
elif cmd == '/clear':
# Keep only the system message
system = history[0] if history and history[0]['role'] == 'system' else None
history.clear()
if system:
history.append(system)
print('[Conversation cleared]')
return True
elif cmd == '/history':
for i, msg in enumerate(history):
if msg['role'] != 'system':
print(f' [{msg["role"]}] {msg["content"][:80]}')
return True
return False # not a command, treat as regular message
if __name__ == '__main__':
demo_history = [
{'role': 'system', 'content': 'You are a helpful agent.'},
{'role': 'user', 'content': 'Hi there'},
{'role': 'assistant', 'content': 'Hello! How can I help?'},
]
handle_command('/help', demo_history)
handle_command('/history', demo_history)
Limitación de la longitud del historial de conversaciones
Pasar todo el historial de la conversación al LLM en cada turno hace que la cantidad de tokens crezca linealmente. Recorte el historial para conservar los últimos N mensajes, manteniendo el mensaje del sistema, y así controlar los costes.
def trim_history(history: list, max_turns: int = 10) -> list:
system_messages = [m for m in history if m['role'] == 'system']
non_system = [m for m in history if m['role'] != 'system']
# Keep the last max_turns messages (each turn = 1 user + 1 assistant)
max_messages = max_turns * 2
trimmed = non_system[-max_messages:]
return system_messages + trimmed
# Usage in the REPL loop:
# history.append({'role': 'user', 'content': user_input})
# trimmed = trim_history(history, max_turns=10)
# response = client.chat.completions.create(model='gpt-4o-mini', messages=trimmed)
print('Trimming history prevents token count from growing unboundedly')Cómo mostrar un banner de bienvenida
Un banner de bienvenida hace que su REPL tenga un acabado más profesional. Muéstrelo una vez al iniciar, con el nombre y la versión del agente, además de los comandos disponibles. Use arte ASCII sencillo o la biblioteca rich para añadir color.
def print_banner():
banner = '''
====================================
AI Research Agent v1.0
====================================
Type your question to begin.
Commands: /help /clear /exit
====================================
'''
print(banner)
# Or with rich colors:
# from rich.console import Console
# from rich.panel import Panel
# console = Console()
# console.print(Panel('[bold cyan]AI Research Agent[/] v1.0', subtitle='Type /help for commands'))
print_banner()Cómo mostrar indicadores de escritura
Las llamadas al LLM pueden tardar varios segundos. Muestre un mensaje como «pensando...» mientras espera para que los usuarios sepan que el agente está procesando la solicitud. Bórrelo cuando llegue la respuesta.
import sys
import threading
import time
def thinking_spinner(stop_event: threading.Event):
frames = ['|', '/', '-', '\\']
i = 0
while not stop_event.is_set():
sys.stdout.write(f'\rAgent is thinking... {frames[i % 4]}')
sys.stdout.flush()
time.sleep(0.1)
i += 1
sys.stdout.write('\r' + ' ' * 30 + '\r') # clear the line
sys.stdout.flush()
def call_agent_with_spinner(query: str) -> str:
stop = threading.Event()
spinner = threading.Thread(target=thinking_spinner, args=(stop,))
spinner.start()
# result = agent.run(query) # the actual slow call
time.sleep(1) # simulating work
result = 'The answer is 42.'
stop.set()
spinner.join()
return result
if __name__ == '__main__':
answer = call_agent_with_spinner('What is 6 * 7?')
print(f'\nFinal answer: {answer}')
Cómo guardar la sesión en un archivo
Permita que los usuarios guarden la conversación en un archivo al final de una sesión. Esto resulta útil en sesiones de investigación en las que se desea conservar un registro de lo que encontró el agente.
import json
import datetime
import os
def save_session(history: list, directory: str = 'sessions'):
os.makedirs(directory, exist_ok=True)
timestamp = datetime.datetime.now().strftime('%Y%m%d_%H%M%S')
filename = os.path.join(directory, f'session_{timestamp}.json')
with open(filename, 'w') as f:
json.dump({
'saved_at': timestamp,
'messages': history
}, f, indent=2)
print(f'Session saved to {filename}')
# Usage in REPL on /save command:
# save_session(conversation_history)
if __name__ == '__main__':
import tempfile
demo_dir = tempfile.mkdtemp()
demo_history = [
{'role': 'user', 'content': 'Hello'},
{'role': 'assistant', 'content': 'Hi! How can I help?'},
]
save_session(demo_history, directory=demo_dir)
Plantilla completa de un agente REPL
Todo integrado: una plantilla de REPL lista para producción, con gestión del historial, comandos de barra, gestión de interrupciones del teclado y guardado de sesiones.
def run_repl(agent):
history = [{'role': 'system', 'content': 'You are a helpful AI assistant.'}]
print('Agent ready. Type /help for commands.')
try:
while True:
user_input = input('You: ').strip()
if not user_input:
continue
if user_input.startswith('/'):
handle_command(user_input, history)
continue
history.append({'role': 'user', 'content': user_input})
trimmed = trim_history(history, max_turns=10)
reply = agent.run(trimmed)
history.append({'role': 'assistant', 'content': reply})
print(f'Agent: {reply}')
except KeyboardInterrupt:
print('\nSession ended.')
save_session(history)Comprobación de conocimientos: agentes de estilo REPL
Compruebe sus conocimientos sobre los agentes REPL interactivos.
Recapitulación: agentes REPL interactivos
Ahora puede crear un agente interactivo para la terminal con todas las funciones:
- Use
while True: input()como bucle principal de lectura - Capture
KeyboardInterruptpara salir limpiamente con Ctrl+C - Mantenga una lista
conversation_historypara conservar la memoria entre turnos - Use
readlinepara consultar el historial de entradas con las teclas de dirección - Implemente los comandos de barra
/help,/cleary/exit - Recorte el historial para evitar un crecimiento ilimitado de tokens
- Muestre un indicador giratorio o de progreso durante las llamadas al LLM
Preguntas frecuentes
¿La lección «Agentes interactivos al estilo REPL» es gratis?
Sí — el texto completo de «Agentes interactivos al estilo REPL» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de AI Agents, actualiza a CoddyKit PRO. El curso de AI Agents incluye 4 lecciones en total.
¿Qué aprenderé en «Agentes interactivos al estilo REPL»?
Bucles de entrada, historial y conversación de varios turnos en agentes de terminal. Practicas AI Agents con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.
¿Necesito experiencia previa para empezar AI Agents?
No se requiere experiencia previa. AI Agents en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 2 de 4.
¿Cuánto tiempo toma la lección «Agentes interactivos al estilo REPL»?
La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.
¿Puedo escribir y ejecutar código en esta lección de AI Agents?
Sí. Cada lección de AI Agents incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.
Todas las lecciones de este curso
- Creación de interfaces de agentes de línea de comandos
- Agentes interactivos al estilo REPL
- Análisis de argumentos y texto de ayuda
- Salida en streaming en agentes CLI