DeepSeek API Python: primera llamada, streaming y errores

Para usar DeepSeek API con Python, necesitas una clave de DeepSeek, la biblioteca openai y un cliente configurado con https://api.deepseek.com. La guía oficial de primera llamada documenta esta integración. Aquí crearás un programa que redacta un recordatorio en español y después probarás una versión que muestra el texto mediante streaming.

Ejemplo oficial de DeepSeek API en Python con la biblioteca OpenAI y la URL del servicio.

El ejemplo utiliza deepseek-flash y la interfaz Chat Completions. Las solicitudes se envían al servicio alojado por DeepSeek: no necesitas descargar el modelo ni instalar una GPU para seguir estos pasos.

Prepara tu clave y el entorno de Python

Necesitas conexión a internet, una terminal y Python 3.10 o posterior, según los requisitos actuales de la biblioteca oficial de OpenAI para Python. Aunque el paquete se llama openai, en este tutorial usarás una clave y un servidor de DeepSeek.

  1. Abre la plataforma oficial de DeepSeek e inicia sesión o crea una cuenta.
  2. Entra en la sección de claves API, crea una clave y guárdala de forma privada.
  3. Revisa el saldo disponible antes de ejecutar el programa. La API tiene facturación por uso; consulta las condiciones y tarifas oficiales.

Usaremos un entorno virtual de Python para mantener las dependencias del proyecto separadas. Los comandos ejecutan directamente el Python de ese entorno, por lo que no necesitas activarlo.

En Windows con PowerShell

py -3 --version
mkdir deepseek-python
cd deepseek-python
py -3 -m venv .venv
.\.venv\Scripts\python.exe -m pip install --upgrade openai

Comprueba que la versión mostrada cumpla el requisito. Si tu instalación reconoce python en lugar de py, comprueba su versión y usa python -m venv .venv para crear el entorno.

En macOS o Linux

python3 --version
mkdir deepseek-python
cd deepseek-python
python3 -m venv .venv
./.venv/bin/python -m pip install --upgrade openai

Configura DEEPSEEK_API_KEY

En la misma terminal, define la variable de entorno que leerá el programa. Sustituye PEGA_AQUI_TU_CLAVE por tu clave real. En PowerShell:

$env:DEEPSEEK_API_KEY = "PEGA_AQUI_TU_CLAVE"

En macOS o Linux:

export DEEPSEEK_API_KEY="PEGA_AQUI_TU_CLAVE"

Ejecuta los ejemplos desde esa terminal. El script usa os.getenv() para leer el entorno; no carga automáticamente un archivo .env. Si abres otra terminal, configura allí la variable también.

La clave puede quedar en el historial de comandos. Mantén privada la terminal y no incluyas el secreto en capturas, repositorios o mensajes de soporte. Para una aplicación desplegada, utiliza la configuración privada del servidor o un gestor de secretos, siguiendo prácticas como las de gestión de secretos de OWASP.

Haz tu primera llamada a DeepSeek desde Python

Crea un archivo llamado consulta_deepseek.py dentro de la carpeta deepseek-python y pega este programa completo. Pedirá un recordatorio breve con datos concretos que podrás comprobar al leer la respuesta.

import os

from openai import APIError, APIStatusError, OpenAI

clave = os.getenv("DEEPSEEK_API_KEY", "").strip()
if not clave:
    raise SystemExit("Configura DEEPSEEK_API_KEY en esta terminal.")

mensajes = [
    {"role": "system", "content": "Escribe en español latinoamericano neutro."},
    {
        "role": "user",
        "content": (
            "Redacta un recordatorio de máximo 60 palabras para una reunión "
            "del equipo: jueves, 16:00, sala Azul, duración 30 minutos. "
            "No inventes enlaces ni otros datos."
        ),
    },
]

try:
    with OpenAI(
        api_key=clave,
        base_url="https://api.deepseek.com",
        timeout=60.0,
        max_retries=0,
    ) as cliente:
        respuesta = cliente.chat.completions.create(
            model="deepseek-flash",
            messages=mensajes,
            max_tokens=512,
            stream=False,
            extra_body={"thinking": {"type": "disabled"}},
        )
except APIStatusError as error:
    raise SystemExit(f"Error HTTP {error.status_code}. Revisa la tabla de errores.")
except APIError as error:
    raise SystemExit(f"Error del SDK: {type(error).__name__}.")

if not respuesta.choices:
    raise SystemExit("La respuesta no contiene ninguna opción.")

opcion = respuesta.choices[0]
texto = opcion.message.content or ""
print(texto if texto.strip() else "No se recibió texto final.")
print("\nFinalización:", opcion.finish_reason)

if respuesta.usage is not None:
    print("Tokens de entrada:", respuesta.usage.prompt_tokens)
    print("Tokens de salida:", respuesta.usage.completion_tokens)
else:
    print("No se recibió información de consumo.")

if not texto.strip() or opcion.finish_reason != "stop":
    raise SystemExit("Revisa la respuesta antes de usarla como resultado completo.")

Ejecuta el archivo desde PowerShell:

.\.venv\Scripts\python.exe consulta_deepseek.py

O desde macOS o Linux:

./.venv/bin/python consulta_deepseek.py

Si la solicitud se completa, verás el recordatorio, el motivo de finalización y los datos de consumo que devuelva la API. Revisa que el texto conserve jueves, 16:00, sala Azul y 30 minutos, y que no agregue información. La redacción puede variar en cada ejecución.

Si aparece un error HTTP o del SDK, consulta la tabla de errores. Evita ejecutar el programa repetidamente sin revisar el mensaje: cada ejecución inicia una nueva solicitud.

Entiende la configuración y comprueba el resultado

Estas son las decisiones principales del ejemplo. Los límites elegidos para la demostración pueden ajustarse a tu tarea:

ElementoQué debes entender
base_urlEs la dirección base del servicio. El SDK añade la ruta de Chat Completions al hacer la llamada.
model="deepseek-flash"Es el identificador de modelo elegido para este tutorial. Comprueba los identificadores oficiales antes de adaptar ejemplos antiguos.
messagesContiene las instrucciones y el mensaje que envías. Cambia el contenido del mensaje de usuario para probar otra tarea.
max_tokens=512Es el presupuesto de generación elegido para el ejemplo; no es un número de palabras ni el máximo del servicio.
thinking: disabledSelecciona explícitamente el modo sin pensamiento para esta tarea breve.
timeout=60.0 y max_retries=0Configuran la espera de red y desactivan los reintentos automáticos del SDK en esta demostración.

DeepSeek documenta deepseek-flash y deepseek-v4-pro en su catálogo de modelos. Si cambias de modelo, revisa sus capacidades y tarifas. En el cliente, conserva la URL base: no la sustituyas por platform.deepseek.com ni le agregues /chat/completions.

El modo de pensamiento está activado de forma predeterminada. Por eso el código lo desactiva expresamente mediante extra_body, que es la forma documentada de enviar esta opción con el SDK.

Configuración del modo de pensamiento de DeepSeek y uso de extra_body con el SDK de Python.

Para interpretar la respuesta, consulta la referencia de Chat Completions y revisa estos campos:

  • choices[0].message.content: contiene el texto de la respuesta.
  • finish_reason: stop indica una finalización normal; length indica que se alcanzó un límite y el contenido puede estar truncado.
  • usage: informa el consumo. El programa muestra los tokens de entrada y salida cuando están disponibles.

Una finalización normal no garantiza que el recordatorio sea correcto. Compara siempre el resultado con los datos del mensaje. Si recibes length, reduce la tarea o ajusta el presupuesto de generación antes de volver a intentarlo.

Muestra la respuesta progresivamente con streaming

Con streaming puedes mostrar el texto mientras llega. Crea otro archivo, stream_deepseek.py, en la misma carpeta. Este ejemplo es independiente del anterior y utiliza la misma variable de entorno:

import os

from openai import APIError, APIStatusError, OpenAI

clave = os.getenv("DEEPSEEK_API_KEY", "").strip()
if not clave:
    raise SystemExit("Configura DEEPSEEK_API_KEY en esta terminal.")

partes = []
finalizacion = None
uso = None

try:
    with OpenAI(
        api_key=clave,
        base_url="https://api.deepseek.com",
        timeout=60.0,
        max_retries=0,
    ) as cliente:
        with cliente.chat.completions.create(
            model="deepseek-flash",
            messages=[
                {
                    "role": "user",
                    "content": (
                        "Redacta en español un recordatorio de máximo 60 palabras "
                        "para una reunión del equipo: jueves, 16:00, sala Azul, "
                        "duración 30 minutos. No inventes enlaces ni otros datos."
                    ),
                }
            ],
            max_tokens=512,
            stream=True,
            stream_options={"include_usage": True},
            extra_body={"thinking": {"type": "disabled"}},
        ) as flujo:
            for fragmento in flujo:
                if fragmento.usage is not None:
                    uso = fragmento.usage
                if not fragmento.choices:
                    continue

                opcion = fragmento.choices[0]
                contenido = opcion.delta.content
                if contenido:
                    partes.append(contenido)
                    print(contenido, end="", flush=True)
                if opcion.finish_reason is not None:
                    finalizacion = opcion.finish_reason
except APIStatusError as error:
    raise SystemExit(f"\nError HTTP {error.status_code}. El texto puede estar incompleto.")
except APIError as error:
    raise SystemExit(f"\n{type(error).__name__}: no se confirmó el final del texto.")
except Exception as error:
    raise SystemExit(
        f"\nError de transmisión o lectura: {type(error).__name__}. "
        "El texto puede estar incompleto."
    )

print("\n\nFinalización:", finalizacion or "sin confirmar")
if uso is not None:
    print("Tokens de entrada:", uso.prompt_tokens)
    print("Tokens de salida:", uso.completion_tokens)
else:
    print("No se recibió información de consumo.")

if finalizacion != "stop" or not "".join(partes).strip():
    raise SystemExit("La respuesta no se confirmó como completa.")

Ejecuta la versión de streaming en PowerShell:

.\.venv\Scripts\python.exe stream_deepseek.py

En macOS o Linux:

./.venv/bin/python stream_deepseek.py

El programa lee delta.content, imprime únicamente fragmentos con contenido y conserva el motivo de finalización. También recoge usage cuando aparece, de acuerdo con el formato de streaming de Chat Completions.

Parámetros stream, stream_options e include_usage en la referencia oficial de DeepSeek Chat Completions.

Si se detecta un error al leer la transmisión, el script avisa que el texto puede estar incompleto y no vuelve a enviar automáticamente la consulta. La ausencia de datos de consumo tampoco debe interpretarse como consumo cero.

Amplía el ejemplo: conversación y razonamiento

Conserva el historial al añadir otro turno

La guía de conversaciones de DeepSeek explica que Chat Completions no recupera automáticamente el contexto de solicitudes anteriores. Para pedir una modificación del recordatorio, envía de nuevo la conversación necesaria.

  1. Conserva los mensajes originales de la lista mensajes.
  2. Añade la respuesta recibida con el rol assistant.
  3. Añade la nueva instrucción con el rol user, por ejemplo: «Hazlo más breve y conserva todos los datos».
  4. Envía esa lista actualizada en messages al realizar la siguiente llamada.

Este recorrido corresponde al ejemplo de texto sin pensamiento ni herramientas. El historial enviado vuelve a formar parte de la entrada: conserva lo necesario para la tarea y revisa su consumo antes de convertir el programa en una conversación larga.

Activa el pensamiento cuando la tarea lo necesite

Para probar una tarea de razonamiento, cambia "disabled" por "enabled" en extra_body. Puedes añadir reasoning_effort="high" a la llamada según la configuración oficial del modo de pensamiento.

Revisa también el presupuesto de generación para la tarea nueva. El campo reasoning_content y el texto final content tienen funciones distintas; los ejemplos de esta guía muestran el texto final. Además, parámetros como temperature no tienen efecto en modo de pensamiento.

Si añades llamadas a herramientas, consulta las reglas específicas para conservar los mensajes y los campos de razonamiento. No extrapoles el manejo del historial del ejemplo básico a ese flujo.

Errores frecuentes de DeepSeek API en Python y cómo resolverlos

Primero identifica si el problema ocurre en tu entorno local o si DeepSeek respondió con un estado HTTP. La referencia oficial de errores permite distinguir problemas de formato, autenticación, saldo y capacidad.

Error o síntomaQué revisar
ModuleNotFoundError: openaiInstala el paquete con el mismo Python de .venv que ejecuta el archivo.
Importación circular o módulo parcialmente inicializadoEvita llamar openai.py al archivo o crear una carpeta local openai que oculte la biblioteca.
Falta DEEPSEEK_API_KEYDefine la variable en la terminal desde la que ejecutas Python. Estos scripts no cargan archivos .env.
400 o 422Corrige el formato o los parámetros. Comprueba el modelo, la interfaz y el modo elegidos.
401Revisa la clave de DeepSeek, la variable que lee el programa y la URL de destino.
402Comprueba el saldo de la cuenta. Crear otra clave no añade fondos.
429Reduce la frecuencia o la cantidad de solicitudes simultáneas. Organiza una cola si automatizas muchas tareas.
500 o 503Puede haber un fallo del servicio o sobrecarga. Espera antes de reintentar y limita los intentos.
APITimeoutError o APIConnectionErrorRevisa la conexión y el tiempo de espera. No supongas que el problema es la clave.
Tabla oficial de errores de DeepSeek API con sus causas y soluciones recomendadas.

Para comprobar qué intérprete y versión del paquete está usando el proyecto, ejecuta en PowerShell:

.\.venv\Scripts\python.exe -c "import sys, openai; print(sys.executable); print(openai.__version__)"

En macOS o Linux:

./.venv/bin/python -c "import sys, openai; print(sys.executable); print(openai.__version__)"

Estos comandos muestran la configuración local y no envían una solicitud a DeepSeek. Si el intérprete no corresponde al entorno del proyecto, corrige primero la instalación o el comando de ejecución.

Controla consumo, tiempos de espera y reintentos

El acceso al chat de DeepSeek y el consumo de su API son servicios distintos. Para calcular el costo de una integración, consulta las tarifas del modelo: distinguen entrada, salida y entrada con caché, además de las condiciones de horario aplicables. No presupongas que tendrás crédito promocional.

Tarifas de DeepSeek Flash y DeepSeek V4 Pro por millón de tokens, con notas sobre los horarios pico y fuera de pico.

Usa los valores de usage para observar el consumo real de tus solicitudes. La explicación oficial de tokens ayuda a entender la unidad de facturación; no conviertas una cantidad de palabras en un costo exacto mediante una proporción fija.

Los ejemplos utilizan timeout=60.0 como configuración de espera de red. No es una promesa de que toda la generación termine en 60 segundos. También establecen max_retries=0 para que el SDK no repita automáticamente una solicitud fallida durante el diagnóstico.

El SDK permite configurar los reintentos y los tiempos de espera. Cuando automatices el proceso, define una política limitada para fallos temporales y evita superponer varios mecanismos de reintento. Un timeout no confirma por sí solo que el servidor haya dejado de procesar la solicitud.

DeepSeek también aplica límites de concurrencia por cuenta. Si aumentas el volumen, limita las solicitudes simultáneas y revisa los errores antes de aumentar la carga.

Qué revisar al adaptar código de otro tutorial

Mantén juntos el servidor, la clave, el modelo y la estructura de la interfaz utilizada. Un ejemplo de un proveedor intermediario puede requerir otros identificadores y credenciales. Para esta integración, vuelve a la configuración oficial de DeepSeek.

DeepSeek también documenta Responses API, que utiliza client.responses.create(), entradas como input y una salida accesible mediante output_text. Si adaptas un ejemplo de esa interfaz, revisa sus parámetros y eventos de streaming: no son los mismos objetos que procesa el código de Chat Completions de esta guía.

Empieza modificando la tarea del primer programa y comprueba que conserva la información solicitada. Cuando el resultado y el consumo sean adecuados para tu caso, incorpora streaming o historial según lo que necesite tu aplicación.

Verificación documental: 10 de noviembre de 2026. Los dos scripts se revisaron con las fuentes oficiales y se comprobó su sintaxis localmente. No se ejecutaron solicitudes autenticadas contra la API durante esta revisión.