Jueves, 10 de septiembre de 2026  ·  LATAM / Español
Intermedio 45 min en total 6 pasos

Cómo hacer que Claude cree un chatbot con la API

Construye un chatbot conversacional con memoria usando la API de Claude en Python paso a paso.

Imagen de portada editorial · Cómo hacer que Claude cree un chatbot con la API · Educación · Claude Builders
Requisitos
  • Python 3.9+ instalado
  • Cuenta en console.anthropic.com con crédito
  • Clave API de Anthropic
  • Conocimientos básicos de Python y línea de comandos
Lo que vas a aprender
  • Configurar el SDK de Anthropic y autenticar tu clave API
  • Mantener el historial de conversación para dar memoria al chatbot
  • Definir la personalidad del bot con un system prompt
  • Implementar respuestas en streaming para una UX fluida
  • Controlar costes limitando tokens y el tamaño del contexto
PASO 1 · ~8 min

Instalar el SDK y configurar la clave API

Empieza creando un entorno aislado para no ensuciar tu Python global. Crea una carpeta para el proyecto, monta un entorno virtual e instala el SDK oficial de Anthropic. Después guarda tu clave API en una variable de entorno para no hardcodearla en el código: es el error de seguridad más frecuente entre builders que empiezan. En España y LATAM puedes pagar la API con tarjeta normal desde la consola; recuerda añadir crédito inicial porque sin saldo las llamadas fallan con un error 400. La clave la obtienes en console.anthropic.com > API Keys. Cópiala una sola vez porque no vuelve a mostrarse.

bash
python -m venv venv
source venv/bin/activate  # En Windows: venv\Scripts\activate
pip install anthropic
export ANTHROPIC_API_KEY='sk-ant-tu-clave-aqui'
ConsejoAñade el archivo .env y venv/ a tu .gitignore para no subir la clave a GitHub por accidente.
Error comúnNunca escribas la clave directamente en el .py. Si la subes a un repo público, Anthropic la revoca automáticamente.
PASO 2 · ~6 min

Hacer la primera llamada a Claude

Antes de montar el bucle conversacional, valida que la conexión funciona con una llamada mínima. El SDK lee la clave automáticamente desde la variable de entorno ANTHROPIC_API_KEY, así que no necesitas pasarla al cliente. El parámetro messages es una lista de turnos con rol user o assistant, y max_tokens limita la longitud de la respuesta (y por tanto el coste). Usamos el modelo claude-opus-4-8 por defecto. Si todo va bien verás el texto de la respuesta impreso en consola. Si obtienes un error de autenticación, revisa que exportaste bien la variable en la misma terminal donde ejecutas el script.

python
import anthropic

client = anthropic.Anthropic()

respuesta = client.messages.create(
    model="claude-opus-4-8",
    max_tokens=1024,
    messages=[
        {"role": "user", "content": "Hola, ¿funciona la conexión?"}
    ],
)

print(respuesta.content[0].text)
ConsejoEl objeto respuesta incluye respuesta.usage con los tokens consumidos: úsalo para monitorizar gasto.
Error comúncontent es una lista de bloques, no un string. Accede siempre con .content[0].text o fallará con un TypeError.
PASO 3 · ~7 min

Dar personalidad al bot con un system prompt

Un chatbot sin instrucciones responde de forma genérica. El system prompt define quién es tu bot, su tono y sus límites. A diferencia de los mensajes de usuario, va en el parámetro system separado, no dentro de messages. Aquí es donde defines si es un asistente de soporte, un tutor o un vendedor. Sé específico: indica idioma, longitud de respuesta y qué NO debe hacer. Un buen system prompt reduce respuestas fuera de tema y evita que el bot invente. Para casos de negocio en LATAM conviene fijar el idioma español neutro y aclarar que no debe dar consejos legales o médicos si no aplica a tu producto.

python
SYSTEM_PROMPT = """Eres SoporteBot, el asistente de una tienda online de electrónica.
Responde en español neutro, con tono cercano y profesional.
Sé conciso: máximo 3 frases salvo que pidan detalle.
Si no sabes algo, dilo claramente y ofrece contactar con un humano.
Nunca inventes precios ni plazos de envío."""

respuesta = client.messages.create(
    model="claude-opus-4-8",
    max_tokens=1024,
    system=SYSTEM_PROMPT,
    messages=[{"role": "user", "content": "¿Cuánto tarda un envío?"}],
)
print(respuesta.content[0].text)
ConsejoItera el system prompt como si fuera código: pequeños cambios de wording cambian mucho el comportamiento.
Error comúnNo metas el system prompt como un mensaje con role 'system' dentro de messages; la API de Claude no lo acepta ahí.
PASO 4 · ~8 min

Añadir memoria con historial de conversación

El punto clave de un chatbot real es la memoria: Claude no recuerda turnos anteriores por sí solo, tú debes reenviar todo el historial en cada llamada. La estrategia es mantener una lista messages y, en cada turno, añadir el mensaje del usuario, llamar a la API, y añadir también la respuesta del asistente. Así el modelo tiene contexto completo de la conversación. Este patrón es el corazón de cualquier bot conversacional. Ten en cuenta que cada llamada envía todo el historial, por lo que los tokens (y el coste) crecen con la conversación: en el paso 6 veremos cómo acotarlo.

python
historial = []

def enviar_mensaje(texto_usuario):
    historial.append({"role": "user", "content": texto_usuario})
    respuesta = client.messages.create(
        model="claude-opus-4-8",
        max_tokens=1024,
        system=SYSTEM_PROMPT,
        messages=historial,
    )
    texto_bot = respuesta.content[0].text
    historial.append({"role": "assistant", "content": texto_bot})
    return texto_bot

print(enviar_mensaje("Me llamo Ana"))
print(enviar_mensaje("¿Cómo me llamo?"))  # Recordará Ana
ConsejoGuarda el historial en Redis o una base de datos si quieres persistencia entre sesiones de usuario.
Error comúnLos roles deben alternar user/assistant. Si añades dos user seguidos sin respuesta intermedia, la API devuelve error.
PASO 5 · ~9 min

Montar el bucle de chat interactivo con streaming

Ahora unimos todo en un chat de consola funcional. Añadimos streaming para que las respuestas aparezcan token a token en lugar de esperar a la respuesta completa: mejora enormemente la percepción de velocidad, igual que en la app de Claude. Usamos client.messages.stream como context manager y iteramos sobre text_stream. El bucle while permite conversar hasta que el usuario escriba 'salir'. Acumulamos la respuesta completa para guardarla en el historial. Este es ya un chatbot usable que puedes conectar a un frontend web, WhatsApp o Telegram cambiando solo la capa de entrada/salida.

python
def chat():
    print("SoporteBot listo. Escribe 'salir' para terminar.\n")
    while True:
        entrada = input("Tú: ")
        if entrada.lower() == "salir":
            break
        historial.append({"role": "user", "content": entrada})
        print("Bot: ", end="", flush=True)
        texto_bot = ""
        with client.messages.stream(
            model="claude-opus-4-8",
            max_tokens=1024,
            system=SYSTEM_PROMPT,
            messages=historial,
        ) as stream:
            for fragmento in stream.text_stream:
                print(fragmento, end="", flush=True)
                texto_bot += fragmento
        print("\n")
        historial.append({"role": "assistant", "content": texto_bot})

chat()
Consejoflush=True fuerza a la consola a mostrar cada fragmento al instante; sin él verás la respuesta de golpe.
Error comúnNo olvides añadir texto_bot al historial tras el streaming, o el bot perderá la memoria de sus propias respuestas.
PASO 6 · ~7 min

Controlar contexto y costes en producción

En un bot real la conversación puede alargarse hasta consumir muchos tokens por llamada, lo que dispara el coste y puede superar la ventana de contexto. La solución más simple es mantener una ventana deslizante: conserva solo los últimos N turnos. Para bots que necesitan memoria larga, resume los turnos antiguos con una llamada aparte y guarda ese resumen. También conviene registrar respuesta.usage.input_tokens y output_tokens para vigilar el gasto y poner alertas. Con estos controles tienes un chatbot listo para escalar sin sorpresas en la factura a fin de mes.

python
MAX_TURNOS = 20  # 10 intercambios user+assistant

def recortar_historial(historial):
    if len(historial) > MAX_TURNOS:
        # Conserva los turnos más recientes
        return historial[-MAX_TURNOS:]
    return historial

# Uso dentro del bucle antes de llamar a la API:
# historial[:] = recortar_historial(historial)

# Monitorizar consumo tras una llamada no-streaming:
# print(f"Entrada: {respuesta.usage.input_tokens} tokens")
# print(f"Salida: {respuesta.usage.output_tokens} tokens")
ConsejoActiva prompt caching en llamadas con system prompts largos y repetidos para reducir el coste de tokens de entrada.
Error comúnSi recortas el historial a mitad de un intercambio puedes romper la alternancia user/assistant; recorta siempre en pares.
Resultado

Has construido un chatbot conversacional completo con la API de Claude: mantiene memoria del historial, tiene una personalidad definida por su system prompt, responde en streaming y controla su consumo de tokens. A partir de aquí puedes conectar sobre la API de Claude tu bot a un frontend web, WhatsApp o Telegram, y desplegarlo en producción con persistencia en base de datos. Tienes una base sólida y reutilizable para cualquier asistente conversacional.

PRÓXIMOS PASOS