0Pricing
AI Agents · Lección

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 support

Comandos 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 KeyboardInterrupt para salir limpiamente con Ctrl+C
  • Mantenga una lista conversation_history para conservar la memoria entre turnos
  • Use readline para consultar el historial de entradas con las teclas de dirección
  • Implemente los comandos de barra /help, /clear y /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

  1. Creación de interfaces de agentes de línea de comandos
  2. Agentes interactivos al estilo REPL
  3. Análisis de argumentos y texto de ayuda
  4. Salida en streaming en agentes CLI
← Volver a AI Agents