Contenido del curso
Estructura tus datos
Construye agentes
Despliega en producción
Construye un chatbot con interfaz de terminal
Resumen
Construir un chatbot de terminal con Python que recuerde la conversación, responda en streaming y no se caiga al primer error es el objetivo de esta clase. Si estás aprendiendo a integrar la API de Claude y quieres pasar de archivos sueltos de prueba a un programa real que puedas abrir, usar y dejar corriendo, aquí unes todas las piezas en un solo main.py.
Hasta ahora todo lo que armaste vivía en archivos de prueba desconectados. La diferencia clave es que este chatbot guarda la conversación en el disco, así que puedes cerrarlo y al abrirlo de nuevo sigue recordando de qué hablaban. Y si algo falla, porque algo siempre falla, en vez de cerrarse y perderlo todo, te avisa qué pasó y te deja seguir escribiendo.
Qué necesitas importar para armar el chatbot
El código arranca declarando los imports que sostienen todo el programa. Cada uno cumple una función concreta [01:04].
from __future__ import annotationspara el manejo de tipos en Python, explicado en la clase anterior.jsonpara leer y exportar el historial en formato JSON.ospara manejarte dentro de tus directorios.pathlibpara acceder a archivos dentro de tus carpetas.- La librería de Anthropic para comunicarte con su API.
Después de los imports vienen dos variables que marcan el ritmo de todo. Una guarda el modelo, que se mantiene aparte para que puedas cambiarlo fácil si necesitas otro distinto al Sonnet que usamos en clase. La otra es el history_path, que apunta al archivo history.json donde vive la memoria del chat [01:40].
Si trabajas con TypeScript en vez de Python, el curso incluye una carpeta paralela con cada archivo de estas clases para que puedas seguirla igual.
Cómo lograr que el chatbot recuerde la conversación
La memoria del chatbot se resuelve con dos funciones espejo: una carga el historial y otra lo guarda. Sin ellas, cada mensaje empezaría desde cero.
La función de cargar revisa si existe el archivo history.json. Si existe, lo retorna leído con codificación UTF-8 para asegurar una lectura correcta. Si no existe, devuelve un array vacío para que el programa arranque sin problemas [02:12].
La función de guardar recibe la lista de mensajes, busca el history_path y escribe el texto en formato JSON con identado, sin permitir ASCII y con codificación UTF-8 [02:35].
¿Cómo guarda un chatbot la memoria entre sesiones? Escribiendo el historial de mensajes en un archivo JSON en el disco. Al abrir el programa, lo lee de vuelta y recupera todo el contexto anterior.
Esta persistencia es lo que separa un script de prueba de una aplicación usable. El historial vive fuera del programa, así que sobrevive a cualquier cierre.
Por qué el streaming mejora la respuesta del chatbot
Nadie quiere esperar a que se genere toda la respuesta antes de ver una sola palabra. Por eso existe la función stream_claude_response, que muestra el texto a medida que llega.
Esta función recibe un client y unos messages, y declara assistant_text vacío por defecto, porque se irá llenando con lo que llegue del stream [03:00]. La estructura es casi idéntica a la de la clase anterior: llama a client.messages.stream, usa el modelo declarado arriba y sube el max_tokens de 500 a 700 para permitir respuestas más grandes.
Un detalle importante: solo se leen los últimos 12 mensajes, para mantener el contexto sin saturar la petición. Dentro del for loop que imprime cada fragmento aparece flush=True.
¿Qué hace flush=True en Python? Le indica a Python que no espere a llenar el buffer completo antes de imprimir. Cada palabra o bloque de texto se muestra en consola apenas llega, dando el efecto de escritura en vivo.
Así el usuario ve cómo Claude "escribe" en tiempo real, palabra por palabra.
Cómo funciona la función principal del chatbot
La función main es grande, pero se entiende por partes. Reúne todo lo anterior y agrega los comandos que hacen usable el programa.
Primero lee la variable de entorno ANTHROPIC_API_KEY; si no existe, levanta un error. Luego crea el client con esa API key. La gran diferencia frente a clases pasadas es que los mensajes ya no se declaran como un array fijo, sino que se cargan desde el historial con la función que armamos antes [04:20].
El chatbot arranca avisando que está listo y muestra dos comandos:
- salir: rompe el loop y cierra la sesión.
- reset: fuerza los mensajes a un array vacío, guarda ese estado y avisa que el historial fue reiniciado, sin cerrar el programa gracias a un
continue.
Si no hay user input, el continue también deja seguir avanzando. Cuando sí hay entrada, se une al array de mensajes y Claude empieza a imprimir su respuesta con flush=True [05:30].
Aquí entra el manejo de errores con un bloque try. Intenta llamar a stream_claude_response con el client y los messages. Si la respuesta no es la esperada, levanta una excepción, saca ese mensaje de la última lista, muestra el error de Claude y te deja continuar en vez de tumbar todo el programa [06:00].
Al final se une el último mensaje con rol assistant al contenido que respondió el stream, y se guarda el historial para actualizarlo. Así, en el siguiente mensaje, el chatbot tiene el contexto completo de la conversación.
Cómo se prueba que el chatbot mantiene el contexto
La prueba real llega al ejecutar el programa desde la carpeta de clase cinco. Aparece el mensaje de "Chatbot listo" con los comandos disponibles.
Tras un saludo inicial y algunas preguntas, se le consulta a Claude qué se le había preguntado antes. La respuesta lista los mensajes previos correctamente, confirmando que guarda el contexto de toda la conversación [07:50]. Entre los tips que da para trabajar con la API aparecen:
- Guardar la API key en una variable de entorno.
- Empezar con Claude Haiku, el modelo más económico.
- Revisar la documentación en
docs.anthropic.com.
Al usar el comando reset, el historial se reinicia y al volver a preguntar qué se dijo antes, Claude responde que no tiene memoria de conversaciones anteriores [08:40]. Eso prueba que reset funciona. El comando salir cierra el programa y devuelve una terminal limpia.
Ya tienes un chatbot que corre, recuerda y no se rompe al primer error. Pero hay un techo: todo esto vive en texto. ¿Y si pudieras pasarle una factura en PDF o la foto de un recibo para que Claude te diga qué dice adentro? Eso también lo hace, y cambia por completo el tipo de aplicaciones que puedes construir. ¿Qué proyecto te gustaría montar con esta base? Cuéntame en los comentarios.