Cómo crear un chatbot con la API de OpenAI

Un chatbot propio se construye con la API de OpenAI, un backend bajo tu control y una interfaz para el usuario. «API de ChatGPT» es una expresión habitual de búsqueda, pero ChatGPT es el producto de conversación de OpenAI y no debe presentarse como si fuera una biblioteca instalable dentro de otro sitio. La integración oficial para desarrolladores parte de la plataforma API y de la Responses API.

Esta guía implementa un endpoint de una sola interacción. La clave permanece en el servidor, la entrada y la salida tienen límites, la respuesta no se almacena como estado de aplicación en OpenAI y se envía un identificador de seguridad seudónimo. Es una base educativa: antes de producción hay que añadir autenticación real, protección de abuso, política de privacidad, pruebas, supervisión y controles adecuados al riesgo del caso de uso.

Independencia y edad: chatgpt-gratis.chat es una interfaz independiente que utiliza actualmente la API de OpenAI; no es ChatGPT ni un producto oficial de OpenAI. El chat público de este sitio está destinado únicamente a personas de 18 años o más. Si construyes un servicio dirigido a menores, debes aplicar las salvaguardas adicionales, la verificación y los controles de datos exigidos por OpenAI y por la legislación aplicable.

Componentes del chatbot

  • Interfaz: muestra mensajes y envía la consulta a tu dominio.
  • Backend: autentica, valida, aplica cuotas y llama a OpenAI.
  • Gestor de secretos: entrega la clave al backend durante la ejecución.
  • Responses API: genera la respuesta mediante un modelo seleccionado.
  • Base de datos opcional: conserva el historial solo si el producto lo necesita y durante un plazo informado.
  • Monitorización: observa disponibilidad, latencia, errores y uso agregado sin copiar conversaciones.

El navegador no debe contener OPENAI_API_KEY. Ocultar una clave en un archivo JavaScript, una variable de compilación o una aplicación móvil no la protege: puede extraerse y utilizarse fuera del producto. El cliente se autentica ante tu backend; solo el backend se autentica ante OpenAI.

Preparación

Crea un proyecto de API para el entorno, genera una clave con los permisos mínimos disponibles y guárdala como variable secreta OPENAI_API_KEY. No la pegues en el código ni la envíes a un repositorio. Configura límites de gasto y alertas en la plataforma, además de límites propios por usuario y por intervalo.

La documentación oficial de inicio es https://developers.openai.com/api/docs/quickstart. Instala versiones actuales de openai, fastapi y uvicorn. El ejemplo usa gpt-5.6-terra como opción equilibrada; valida el modelo con tus propios casos y revisa la guía oficial porque los alias, capacidades y disponibilidad pueden cambiar.

Backend completo con FastAPI

Guarda el siguiente código en app.py. Para que el ejemplo sea ejecutable, acepta temporalmente un encabezado X-User-ID; en un producto real debe reemplazarse por el identificador obtenido de una sesión o token verificado. Nunca debes confiar en un identificador libre enviado por el navegador para autorización, cuota o facturación.

import hashlib
import hmac
import os

from fastapi import FastAPI, Header, HTTPException
from openai import OpenAI
from pydantic import BaseModel, Field


app = FastAPI(title="Chatbot con la API de OpenAI")
client = OpenAI(
    api_key=os.environ["OPENAI_API_KEY"],
    timeout=20.0,
    max_retries=2,
)


class ChatRequest(BaseModel):
    message: str = Field(min_length=1, max_length=4_000)


class ChatResponse(BaseModel):
    answer: str


def make_safety_identifier(user_id: str) -> str:
    secret = os.environ["SAFETY_ID_SECRET"].encode("utf-8")
    digest = hmac.new(
        secret,
        user_id.encode("utf-8"),
        hashlib.sha256,
    ).hexdigest()
    return "usr_" + digest


@app.post("/chat", response_model=ChatResponse)
def chat(
    data: ChatRequest,
    x_user_id: str | None = Header(default=None),
):
    # Sustituye este control por autenticación real antes de producción.
    if not x_user_id:
        raise HTTPException(status_code=401, detail="No autorizado")

    response = client.responses.create(
        model="gpt-5.6-terra",
        instructions=(
            "Responde en español neutral y con claridad. Distingue hechos de "
            "supuestos. Si no sabes algo, dilo. No inventes fuentes y no presentes "
            "la respuesta como asesoramiento médico, legal o financiero profesional."
        ),
        input=data.message,
        max_output_tokens=600,
        store=False,
        safety_identifier=make_safety_identifier(x_user_id),
    )

    answer = response.output_text.strip()
    if not answer:
        raise HTTPException(status_code=502, detail="Respuesta no disponible")
    return ChatResponse(answer=answer)

Además de OPENAI_API_KEY, define SAFETY_ID_SECRET con un valor aleatorio distinto. El HMAC crea un identificador estable que no expone directamente el correo o nombre. OpenAI recomienda enviar safety_identifier en productos donde personas interactúan con el modelo. Para visitantes sin cuenta puede utilizarse un identificador aleatorio de sesión, sujeto a la información y duración definidas en la política de privacidad.

uvicorn app:app --host 127.0.0.1 --port 8000

En producción, ejecuta el servicio detrás de HTTPS y un proxy o plataforma gestionada. No expongas el servidor de desarrollo directamente. Configura orígenes CORS específicos si el frontend está en otro dominio; * no es una decisión segura por defecto cuando intervienen credenciales. Usa cookies seguras o tokens verificados, protección CSRF cuando corresponda y límites por cuenta.

Qué hacen los parámetros principales

  • model="gpt-5.6-terra" selecciona el modelo solicitado. Prueba otras variantes solo con evaluaciones.
  • instructions define comportamiento de alto nivel, pero no sustituye autorización o filtros de código.
  • input contiene la consulta enviada en esta interacción.
  • max_output_tokens=600 limita la salida; una respuesta puede quedar incompleta al alcanzar el máximo.
  • store=False desactiva el almacenamiento predeterminado del objeto de respuesta como estado de aplicación en la ruta compatible.
  • safety_identifier ayuda a asociar actividad a un usuario de forma respetuosa con la privacidad.

El límite de salida no controla por sí solo el coste. También importan la entrada, el modelo, el volumen, el razonamiento y los reintentos. Limita el tamaño de la consulta, peticiones por minuto, concurrencia y consumo por cuenta. Añade alertas de presupuesto y una forma de desactivar la función si detectas una clave comprometida o un pico anómalo.

Conversaciones con memoria

El ejemplo es deliberadamente sin estado: cada petición contiene solo el mensaje actual. Para una conversación real hay dos estrategias. La aplicación puede conservar un historial limitado en su propia base de datos y enviar una selección de mensajes, o puede usar las capacidades de estado documentadas por OpenAI. La elección cambia la privacidad, la retención, la capacidad de borrar datos y la recuperación ante errores.

No envíes un historial ilimitado. Resume o selecciona contexto relevante, separa instrucciones de contenido del usuario y elimina datos que ya no sean necesarios. Si conservas conversaciones, informa la duración, ofrece controles de borrado y restringe el acceso. store=False no borra las copias que tu aplicación haya guardado ni los registros de otros proveedores.

Retención de datos y store:false

store=False no equivale a Zero Data Retention. OpenAI documenta que los registros de supervisión de abuso pueden incluir contenido del cliente y metadatos y que, de manera predeterminada, pueden conservarse hasta 30 días, salvo obligaciones legales o necesidades de protección del servicio o de terceros. ZDR es un control separado, sujeto a elegibilidad, aprobación y compatibilidad de endpoints o funciones.

OpenAI también indica que los datos enviados mediante la API no se usan para entrenar modelos por defecto, salvo adhesión voluntaria. Esto no significa que la aplicación pueda omitir su aviso de privacidad. Debe explicar qué envía, finalidad, proveedor, datos técnicos, cookies o identificadores, plazos propios y forma de ejercer derechos. Archivos, herramientas conectadas y servicios de terceros pueden tener reglas distintas.

Moderación y seguridad

Una instrucción no impide por sí sola abuso, inyección de prompt o salida insegura. Para un chatbot público, combina límites, autenticación o controles de sesión, detección de automatización y, cuando resulte apropiado, la Moderation API. OpenAI ofrece el endpoint de moderación sin coste. La política debe adaptarse al público y al riesgo; un producto para menores o un flujo médico requiere controles más estrictos y revisión especializada.

  • Escapa la respuesta antes de mostrarla como HTML.
  • No ejecutes código, SQL, URLs o comandos producidos por el modelo sin validación.
  • Si añades herramientas, comprueba autorización en cada llamada y limita parámetros.
  • Evita introducir documentos internos completos cuando basten fragmentos autorizados.
  • Ofrece un mecanismo para reportar respuestas problemáticas.
  • Incluye revisión humana en usos de alto impacto y no presentes la salida como profesional.

Errores, reintentos y experiencia del usuario

El SDK oficial realiza reintentos limitados para determinados errores transitorios y respeta Retry-After cuando corresponde. Mantén un tiempo máximo explícito. Si añades reintentos propios, usa espera exponencial con variación aleatoria y un máximo pequeño. No reintentes credenciales inválidas, una solicitud mal formada o un límite de gasto agotado.

  • Convierte errores internos en un mensaje breve que no revele claves, stack traces o datos.
  • Distingue un 429 temporal de una cuota o presupuesto agotado mediante el código de error.
  • Evita que el botón del cliente envíe dos veces; asigna un identificador de petición.
  • Si una acción externa depende de la respuesta, usa idempotencia y confirmación humana.
  • Permite volver a intentar manualmente sin perder el texto del usuario.

Registra identificador interno de petición, fecha, modelo, estado, latencia y uso agregado cuando esté disponible. No registres de forma predeterminada el mensaje, la respuesta, cookies, tokens de sesión, encabezados de autorización o secretos. Revisa si la plataforma de errores captura variables locales automáticamente y aplica redacción.

Evaluar antes de cambiar

Prepara un conjunto de consultas reales anonimizadas y casos adversarios. Evalúa exactitud, utilidad, tono, refusals, afirmaciones sin fuente, inyección, longitud y latencia. Define criterios observables y revisores. Repite las evaluaciones al cambiar el modelo, instrucciones, contexto, herramientas o interfaz. Una demostración satisfactoria no predice por sí sola el comportamiento con tráfico real.

Checklist antes de abrir el chatbot

  1. La clave está únicamente en el backend y puede revocarse con rapidez.
  2. La identidad procede de una sesión verificada y existe cuota por usuario.
  3. Entrada, salida, frecuencia, concurrencia y gasto están limitados.
  4. La interfaz explica que las respuestas pueden equivocarse y no son asesoramiento profesional.
  5. store=False está configurado y la política explica que no es ZDR.
  6. Los logs no contienen conversaciones, claves o identificadores directos.
  7. Los errores no filtran detalles y los reintentos están acotados.
  8. Las salidas se escapan y las herramientas tienen autorización propia.
  9. Existen evaluaciones, revisión de cambios y mecanismo de reporte.
  10. Se documenta la independencia del producto respecto de OpenAI y ChatGPT.

Fuentes oficiales

Revisión editorial: 3 de agosto de 2026. Se utilizaron herramientas de IA como apoyo para estructurar y comprobar el borrador; una persona revisó la redacción, el código y las fuentes oficiales. chatgpt-gratis.chat es un sitio independiente y no es una aplicación oficial de OpenAI ni ChatGPT. El servicio del sitio utiliza actualmente la API de OpenAI, pero el proveedor, los modelos y los límites pueden cambiar.

Frontend accesible y separación segura de conversaciones

El backend del chatbot debe conservar la clave y aplicar autenticación, límites y validación. El navegador solo envía el mensaje y presenta una respuesta tratada como texto no confiable.

const form = document.querySelector("#chat-form");
const field = document.querySelector("#message");
const status = document.querySelector("#status");
const answer = document.querySelector("#answer");

form.addEventListener("submit", async (event) => {
  event.preventDefault();
  status.textContent = "Generando respuesta…";
  answer.textContent = "";
  try {
    const response = await fetch("/chat", {
      method: "POST",
      credentials: "same-origin",
      headers: { "Content-Type": "application/json" },
      body: JSON.stringify({ message: field.value }),
    });
    const data = await response.json();
    if (!response.ok) throw new Error(data.error);
    answer.textContent = data.answer;
    status.textContent = "Respuesta recibida.";
  } catch {
    status.textContent = "No se pudo completar la solicitud.";
  }
});

Usa textContent, no innerHTML, para evitar interpretar etiquetas o scripts generados. Asocia una etiqueta al campo, comunica el estado mediante aria-live y comprueba teclado, foco visible y lector de pantalla.

Memoria sin mezclar usuarios

Relaciona el contexto con una identidad autenticada en el servidor y aplica caducidad. No guardes conversaciones en una variable global compartida: podría mezclar historiales entre personas. Explica qué se conserva y permite reiniciar o borrar la conversación. Si el frontend usa cookies, añade protección CSRF y restringe CORS al origen previsto.

Pruebas antes de publicar

  • Confirma que la clave no aparece en JavaScript, Git, logs ni capturas.
  • Prueba mensajes vacíos, largos, maliciosos y en varios idiomas.
  • Simula respuestas 400, 401, 429 y 5xx sin revelar detalles internos.
  • Comprueba límites por usuario, presupuesto y mensajes de error.
  • En una aplicación móvil, conserva la misma separación: app autenticada → backend → OpenAI. Nunca empaquetes la clave maestra en el binario.

Referencias: generación de texto y prácticas de producción de OpenAI.