FIM Completion en DeepSeek: completar código entre prefijo y sufijo

Aviso de independencia: DeepSeek Español es un sitio informativo independiente operado por Ahmed Aly. No pertenece a DeepSeek, no está afiliado ni respaldado por la empresa y no ofrece la API. La referencia técnica definitiva es la documentación oficial de FIM Completion.

Última verificación documental: 25 de julio de 2026. No se ha utilizado una clave real para afirmar que una ejecución concreta funciona; los ejemplos reproducen los campos y límites publicados por DeepSeek y deben probarse en un entorno propio antes de producción.

Respuesta rápida

FIM (Fill-In-the-Middle) completa el hueco situado entre un prefijo y un sufijo opcional. Envía un POST a https://api.deepseek.com/beta/completions, usa deepseek-v4-pro, coloca el contenido anterior en prompt y el posterior en suffix, y lee la inserción desde choices[0].text. La guía oficial limita la salida FIM a 4K tokens y presenta la función como Beta.

ElementoValor documentado
Base URL Betahttps://api.deepseek.com/beta
RutaPOST /completions
Modelo expresamente enumeradodeepseek-v4-pro
Entrada izquierdaprompt, obligatoria
Entrada derechasuffix, opcional
Texto generadochoices[0].text
Salida máxima FIM4K tokens
EstadoBeta; modo non-thinking
Referencia oficial de FIM Completion de DeepSeek con endpoint beta y modelo V4 Pro
La referencia oficial muestra POST /beta/completions, la Base URL Beta y deepseek-v4-pro como valor de modelo. Captura realizada el 25 de julio de 2026.

Qué es FIM Completion y cuándo usarlo

En una solicitud FIM, el cliente proporciona el texto que queda antes del hueco y, cuando existe, el texto que debe aparecer después. El modelo devuelve únicamente una propuesta para la parte intermedia. En código, esto permite conservar firmas, comentarios, sangría y cierres de bloque que ya existen sin pedir una reescritura completa del archivo.

  • Completar el cuerpo de una función entre su firma y el siguiente bloque.
  • Proponer una condición dentro de una estructura ya creada.
  • Insertar una consulta, transformación o fragmento breve donde ambos extremos aportan contexto.
  • Completar texto técnico cuando la continuación debe encajar con un final conocido.

FIM no es un editor ni un parche estructural. La API devuelve texto; tu aplicación decide si lo inserta, lo descarta o solicita una revisión. Antes de escribirlo en disco, valida sintaxis, formato, tipos, dependencias, permisos y pruebas.

Modelo actual y estado de los identificadores antiguos

El esquema oficial de POST /completions enumera actualmente deepseek-v4-pro. Por eso todos los ejemplos de esta guía utilizan ese ID.

Discrepancia documental: la tabla general de modelos marca FIM en non-thinking para V4 Flash y V4 Pro, pero la referencia específica del endpoint solo ofrece deepseek-v4-pro como valor posible. No afirmamos que Flash sea incompatible; tampoco lo presentamos como opción confirmada mientras las dos páginas no coincidan.

DeepSeek fijó la retirada completa de deepseek-chat y deepseek-reasoner para el 24 de julio de 2026 a las 15:59 UTC. El plazo ya ha terminado y el ejemplo actual de GET /models solo enumera deepseek-v4-flash y deepseek-v4-pro. Esta página no utiliza los nombres retirados ni afirma un código de error concreto sin una prueba autenticada.

No añadas [1m] al modelo de FIM. Ese sufijo pertenece a determinadas configuraciones de Claude Code; no forma parte del ID que acepta esta referencia.

Cómo preparar prompt y suffix

  1. Localiza con exactitud el primer y el último carácter del hueco.
  2. Conserva en prompt la sangría, los comentarios y los delimitadores anteriores.
  3. Incluye en suffix el código posterior, también sus saltos de línea y cierres de bloque.
  4. Limita max_tokens al tamaño razonable de la inserción.
  5. Une prefijo, texto generado y sufijo solo después de comprobar que existe una opción válida.
  6. Ejecuta formateador, análisis estático y pruebas antes de guardar o desplegar.

El espacio en blanco forma parte del contexto. Si el prefijo termina dentro de un bloque con dos espacios de sangría, consérvalos. Si el sufijo comienza con un salto de línea y una llave, inclúyelos. Esta precisión reduce repeticiones y cierres duplicados, aunque no garantiza una salida correcta.

Ejemplo de FIM con Python

Instala el cliente compatible y guarda la clave exclusivamente en una variable de entorno del servidor:

python3 -m venv .venv
source .venv/bin/activate
pip install openai
export DEEPSEEK_API_KEY="sustituir-por-la-clave-real"
import os
from openai import OpenAI

api_key = os.environ.get("DEEPSEEK_API_KEY")
if not api_key:
    raise RuntimeError("Falta la variable DEEPSEEK_API_KEY")

client = OpenAI(
    api_key=api_key,
    base_url="https://api.deepseek.com/beta",
)

prefix = "def normalizar_slug(texto: str) -> str:\n    "
suffix = "\n\nprint(normalizar_slug('Guía de API'))"

response = client.completions.create(
    model="deepseek-v4-pro",
    prompt=prefix,
    suffix=suffix,
    echo=False,
    max_tokens=128,
    temperature=0.2,
)

if not response.choices:
    raise RuntimeError("DeepSeek no devolvió ninguna opción")

choice = response.choices[0]
if choice.text is None:
    raise RuntimeError("La opción no contiene texto")

resultado = prefix + choice.text + suffix
print("finish_reason:", choice.finish_reason)
print(resultado)

El método correcto es client.completions.create. client.chat.completions.create llama a una ruta distinta y no convierte una solicitud de chat en FIM.

Ejemplo equivalente con Node.js

npm install openai
export DEEPSEEK_API_KEY="sustituir-por-la-clave-real"
import OpenAI from "openai";

const apiKey = process.env.DEEPSEEK_API_KEY;
if (!apiKey) {
  throw new Error("Falta la variable DEEPSEEK_API_KEY");
}

const client = new OpenAI({
  apiKey,
  baseURL: "https://api.deepseek.com/beta",
});

const prefix = "function normalizarSlug(texto) {\n  ";
const suffix = "\n}\n\nconsole.log(normalizarSlug('Guía de API'));";

const response = await client.completions.create({
  model: "deepseek-v4-pro",
  prompt: prefix,
  suffix,
  echo: false,
  max_tokens: 128,
  temperature: 0.2,
});

const choice = response.choices?.[0];
if (!choice || typeof choice.text !== "string") {
  throw new Error("DeepSeek no devolvió una inserción válida");
}

const resultado = prefix + choice.text + suffix;
console.log("finish_reason:", choice.finish_reason);
console.log(resultado);

Solicitud FIM con cURL

curl https://api.deepseek.com/beta/completions \
  -H "Authorization: Bearer ${DEEPSEEK_API_KEY}" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "deepseek-v4-pro",
    "prompt": "function normalizarSlug(texto) {\n  ",
    "suffix": "\n}\n",
    "echo": false,
    "max_tokens": 128,
    "temperature": 0.2
  }'

La URL final debe contener /beta/completions. Durante el diagnóstico conserva el estado HTTP y el cuerpo de error, pero elimina la cabecera de autorización antes de compartir registros.

Parámetros documentados de FIM

ParámetroUso y límite publicado
modelObligatorio; la referencia específica enumera deepseek-v4-pro.
promptObligatorio; contenido anterior al hueco.
suffixOpcional; contenido posterior al hueco.
max_tokensLimita la generación; la guía FIM fija un máximo de 4K.
echoPuede incluir el prompt junto con la finalización. Usa false si solo necesitas la inserción.
logprobsHasta 20 alternativas probables, además del token elegido.
stopUna cadena o una lista de hasta 16 secuencias; la secuencia de parada no se devuelve.
streamEnvía progreso mediante Server-Sent Events y termina con data: [DONE].
stream_options.include_usageCon streaming, añade un bloque de uso antes de [DONE]; ese bloque tiene choices vacío.
temperatureDe 0 a 2; valor predeterminado 1.
top_pHasta 1; valor predeterminado 1. Ajusta este o temperature, no ambos a la vez.

frequency_penalty y presence_penalty están obsoletos y no producen efecto. El esquema FIM tampoco incluye thinking, reasoning_effort ni reasoning_content. No los añadas por analogía con Chat Completions.

Cómo interpretar la respuesta

El objeto devuelto tiene el tipo text_completion. La inserción se encuentra en choices[].text y cada opción incluye un finish_reason que debes revisar antes de aceptar el resultado.

finish_reasonInterpretación documentadaAcción segura
stopParada natural o por una secuencia configurada.Validar la inserción completa.
lengthSe alcanzó el límite de generación.No asumir que el código está completo; revisar o dividir el hueco.
content_filterSe omitió contenido por filtrado.No presentar la salida como completa.
insufficient_system_resourceLa inferencia fue interrumpida por falta de recursos.Registrar el fallo sin secretos y aplicar un reintento limitado si procede.

El bloque usage informa tokens de entrada, salida y totales, además de contadores de caché. Para estimar el gasto consulta la guía de precios de DeepSeek API y confirma las tarifas en la fuente oficial; no calcules tokens a partir del número de caracteres.

FIM frente a Chat Prefix Completion

CriterioFIM CompletionChat Prefix Completion
Ruta Beta/completions/chat/completions
Entradaprompt y suffixÚltimo mensaje assistant con prefix: true
ObjetivoInsertar texto entre dos extremosForzar el comienzo de una respuesta de chat
Salida principalchoices[].textchoices[].message

Ambas funciones usan la Base URL Beta, pero no son intercambiables. Para autenticación, Chat Completions y selección general de modelos, consulta la guía de DeepSeek API en español.

Seguridad y control de calidad antes de guardar

  • No envíes claves, contraseñas, tokens, datos personales innecesarios ni archivos completos si basta un fragmento.
  • Mantén DEEPSEEK_API_KEY en el servidor o en un gestor de secretos; las condiciones de la plataforma prohíben exponerla en código del navegador.
  • Trata la salida como texto no confiable. No la conviertas directamente en SQL, comandos del sistema o cambios de producción.
  • Limita el tamaño del fragmento, el tiempo de ejecución, los reintentos y el gasto por usuario.
  • Ejecuta formatters, linters, analizadores de seguridad y pruebas relevantes antes de aceptar la propuesta.
  • Conserva el modelo, la fecha, finish_reason y el consumo para poder reproducir una incidencia sin registrar secretos.

Solución de problemas frecuentes

La ruta no reconoce FIM

Comprueba que el cliente utiliza https://api.deepseek.com/beta como Base URL y llama a Completions. No añadas el cuerpo FIM a /chat/completions.

El resultado repite el principio o el final

Usa echo: false, verifica dónde termina prompt y conserva los bordes exactos. Si el modelo repite parte del sufijo, detecta la superposición mediante una regla comprobable; no elimines texto de forma heurística sin pruebas.

Errores HTTP

DeepSeek documenta 400 para formato, 401 para autenticación, 402 para saldo, 422 para parámetros, 429 para límites y 500/503 para fallos transitorios del servidor. Corrige 400, 401 y 422 antes de repetir. Para 429, 500, 503 o fallos de red, usa una cola y reintentos limitados con espera exponencial. Consulta la guía de códigos de error.

Preguntas frecuentes

¿El sufijo es obligatorio?

No. La referencia lo define como opcional. Proporcionarlo es lo que permite al modelo usar el contexto posterior al hueco.

¿Puedo activar Thinking Mode en FIM?

No según la matriz vigente: FIM figura como función non-thinking y el esquema específico no incluye el campo thinking.

¿Debo usar V4 Flash o V4 Pro?

Usa deepseek-v4-pro en una integración basada en la referencia actual porque es el único valor expresamente enumerado por el endpoint. La tabla general también marca Flash, pero esa discrepancia impide presentarlo como opción confirmada.

¿FIM modifica mi archivo?

No. La API devuelve texto. Solo el cliente o la aplicación que programes puede insertarlo o escribirlo en disco.

¿Puedo generar más de 4K tokens en una operación FIM?

No conforme a la guía oficial consultada. Reduce o divide el hueco, o utiliza un flujo distinto para una generación extensa.

Fuentes oficiales verificadas

Guías relacionadas: DeepSeek API en español · DeepSeek V4 · Precios de DeepSeek API · DeepSeek con Anthropic SDK.