Migración a DeepSeek V4.1 Flash 1017: el error 400 de reasoning_content, el cambio silencioso de alias y la facturación en hora punta

AIHubMix9 min de lectura
Migración a DeepSeek V4.1 Flash 1017: el error 400 de reasoning_content, el cambio silencioso de alias y la facturación en hora punta

La mayoría de las migraciones empiezan cambiando el nombre del modelo. DeepSeek V4.1 Flash 1017 lo hizo al revés: el 17 de octubre de 2026, DeepSeek mantuvo el nombre deepseek-flash y cambió el modelo que hay detrás. Quien llamara a deepseek-flash, deepseek-v4-flash o deepseek-v4-flash-vision-exp en la API de DeepSeek fue migrado sin tocar ni una línea de código.

En AIHubMix, el nuevo checkpoint tiene su propio ID, deepseek-v4.1-flash-1017, así que tú decides cuándo migrar. En cualquier caso, estos son los problemas que conviene revisar:

Problema Falla Dónde se nota
reasoning_content no se devuelve De forma evidente Error 400 tras la primera llamada a una herramienta
Modelo cambiado con el mismo nombre De forma silenciosa Longitud de la salida, formatos y puntuaciones de evaluación
Precios en hora punta De forma silenciosa La factura se duplica en las horas punta de los días laborables
Esfuerzo configurado en max por defecto De forma silenciosa Las ejecuciones de agentes duran entre 1,6 y 1,8 veces más
El razonamiento cuenta para max_tokens Ambos Respuestas truncadas
Facturación de Search y Fetch De forma silenciosa Desde el 31 de octubre, 16:00 UTC

AIHubMix ejecutó un conjunto breve de solicitudes de prueba contra deepseek-v4.1-flash-1017 el 19 de octubre de 2026 (03:02 UTC). Los resultados de esa ejecución se marcan como tales más abajo.

1. El error 400 que rompe los bucles de herramientas

Lo que verás. La segunda solicitud tras una llamada a una herramienta falla con HTTP 400 y este mensaje, según un issue de GitHub contra opencodex para V4.1 Flash el 15 de octubre:

[invalid_request_error] The `reasoning_content` in the thinking mode must be passed back to the API.

El mismo texto aparece en informes anteriores contra opencode, LangChain y claude-code-router para V4 Pro y V4 Flash.

Por qué. La guía del modo de razonamiento de DeepSeek dice que, cuando una solicitud incluye tools, hay que devolver el reasoning_content de cada turno anterior del asistente, "incluso en los turnos en los que el modelo no hizo una llamada a una herramienta". Si no se envía, "la API devolverá un error 400". Sin herramientas, devolverlo es opcional y se ignora. Los clientes suelen caer en esto porque su serializador de mensajes conserva content y tool_calls, pero descarta el campo adicional.

La solicitud que lo provoca. El segundo turno de un bucle de herramientas, con el mensaje del asistente sin reasoning_content:

curl -s https://aihubmix.com/v1/chat/completions \
  -H "Authorization: Bearer $AIHUBMIX_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "deepseek-v4.1-flash-1017",
    "tools": [{"type": "function", "function": {"name": "get_weather",
      "parameters": {"type": "object", "properties": {"city": {"type": "string"}}, "required": ["city"]}}}],
    "messages": [
      {"role": "user", "content": "What is the temperature in Hangzhou? Use the tool."},
      {"role": "assistant", "content": null, "tool_calls": [{"id": "call_00_example", "type": "function",
        "function": {"name": "get_weather", "arguments": "{\"city\": \"Hangzhou\"}"}}]},
      {"role": "tool", "tool_call_id": "call_00_example", "content": "{\"celsius\": 18}"}
    ]
  }'

En la API propia de DeepSeek, esta es la forma que devuelve el 400 en los informes públicos. A través de AIHubMix, la misma forma devolvió HTTP 200 y una respuesta normal en la ejecución de prueba del 19 de octubre. Fue una sola ejecución, así que no la des por garantizada.

Cómo solucionarlo. Conserva el campo, sea cual sea la ruta que uses:

msg = resp.choices[0].message
messages.append(msg)  # carries content, reasoning_content, and tool_calls over
  • En tu propio código, añade el mensaje completo del asistente, no una copia reconstruida a mano.
  • En los frameworks, actualiza: opencode corrigió el ida y vuelta en versiones posteriores, y opencodex incorporó su corrección el 16 de octubre.
  • Como último recurso, configura {"thinking": {"type": "disabled"}} para los bucles de herramientas. Así se evita el error, pero se renuncia al razonamiento que hace al modelo bueno en trabajo con agentes.

2. El mismo nombre, un modelo distinto

El changelog de DeepSeek del 17 de octubre lo dice claramente: "El método de llamada a la API y el precio no cambian: basta con usar deepseek-flash para acceder al último modelo". No existe un nombre fijado para el checkpoint de septiembre, y los dos nombres antiguos de Flash ahora también usan 1017.

No aparece ningún error, pero pueden cambiar tres cosas:

  • Longitud de la salida. 1017 se entrenó para producir salidas más cortas. Los parsers, los diseños de interfaz y los prompts que esperaban las largas explicaciones del modelo de septiembre pueden recibir menos texto que antes.
  • Líneas base de evaluación. Las puntuaciones y los costes que registraste con el checkpoint de septiembre ya no describen lo que devuelve deepseek-flash.
  • Comportamiento. DeepSeek reentrenó 1017 para trabajo de proyectos de principio a fin. Los agentes pueden seguir caminos distintos hasta el mismo resultado.

Qué hacer. Registra el modelo y la fecha en cada ejecución de evaluación, y repite ahora tu conjunto de regresión. La respuesta indica qué checkpoint respondió: en la prueba del 19 de octubre, cada respuesta a través de AIHubMix incluía "model": "deepseek-v4-1-flash-261017". Registra ese campo, y un cambio no anunciado se hará visible el día que ocurra.

3. Reglas de facturación fáciles de pasar por alto

Hora punta y hora valle. DeepSeek cobra precio completo de 01:00 a 04:00 y de 06:00 a 10:00 UTC los días laborables, y medio precio en todas las demás horas, todo el fin de semana y en los festivos públicos chinos. AIHubMix sigue las mismas franjas y fija el precio de cada solicitud en el momento en que se envía, de modo que una solicitud larga en streaming que empieza en hora valle sigue en hora valle.

Concepto Hora punta Hora valle
Entrada, fallo de caché $0.3098 $0.155
Entrada, acierto de caché $0.0062 $0.0031
Salida $1.2392 $0.62

Precios de lista de AIHubMix por 1M de tokens para deepseek-v4.1-flash-1017. Hay un descuento del 30% por tiempo limitado aplicado encima.

Los aciertos de caché son 50 veces más baratos que los fallos. Los agentes reenvían el mismo prompt de sistema, las mismas definiciones de herramientas y el mismo historial en cada llamada. Mantén estable ese prefijo, coloca al final lo que cambie en cada llamada, y la mayor parte de cada solicitud se factura a la tarifa de acierto de caché.

El razonamiento se factura como salida. El razonamiento está activado por defecto, y los tokens de razonamiento cuentan tanto para la factura como para max_tokens.

Search y Fetch. DeepSeek abrió sus nuevas API de Search y Fetch el 17 de octubre a 0,75 $ por cada 1.000 llamadas exitosas de cada una. Las llamadas del lado del servidor hechas mediante DeepSeek Harness, Claude Code o Codex en la API de DeepSeek son gratuitas hasta el 31 de octubre de 2026, 16:00 UTC. Después, un agente que busca en cada turno añade un coste por llamada además de los tokens.

Cuánto suma en total. Con los supuestos indicados (40 llamadas, 1,2M de tokens de entrada con 90% de aciertos de caché, 60K tokens de salida), una sesión de agente cuesta 0,118 $ en hora punta y 0,059 $ en hora valle, a precios de lista de AIHubMix. Pasar las ejecuciones por lotes a hora valle es el ahorro individual más grande.

4. Ajustes que cuestan más de lo que aportan

Esfuerzo. La API ofrece low, high (por defecto) y max. El artículo de V4.1 Flash de DeepSeek los asigna a valores internos de esfuerzo de 50, 75 y 100, e indica que el paso a max "alarga las trayectorias de los agentes entre 1,6 y 1,8 veces por mejoras solo marginales". La guía de configuración de Claude Code de DeepSeek sigue usando CLAUDE_CODE_EFFORT_LEVEL=max. Para el trabajo diario con agentes, high es el valor por defecto más conveniente.

DeepSeek también asigna otros nombres de esfuerzo a sus tres niveles: minimal pasa a low, mientras que medium y xhigh pasan a high. Una herramienta que ofrece cinco niveles, en la práctica, te da dos o tres. En la prueba del 19 de octubre, AIHubMix aceptó low, high y max en Chat Completions.

max_tokens. La ficha del modelo recomienda al menos 256K para ejecuciones largas de agentes, porque el razonamiento comparte el presupuesto de salida. Con un límite pequeño, un paso difícil puede gastar todo el presupuesto razonando. Revisa si aparece finish_reason: "length".

Parámetros de muestreo. En modo de razonamiento, temperature, presence_penalty y frequency_penalty se aceptan sin error y no tienen efecto. top_p se limita al rango 0,95–1,0. Si un pipeline dependía de una temperatura baja para obtener salidas deterministas, ya no la obtiene.

5. Agentes con permisos reales

1017 se entrenó con aprendizaje por refuerzo sobre proyectos completos, así que tiende a seguir construyendo hasta que el trabajo parece terminado. Además, sus respuestas son más breves, lo que significa menos explicación de lo que cambió. Dos hábitos ayudan:

  • Revisa los diffs y los registros de comandos, no el resumen que hace el modelo de ellos.
  • Ejecútalo en un sandbox con una lista permitida de comandos, y exige aprobación para cualquier acción destructiva (borrados, force push, migraciones, llamadas de red salientes).

El propio DeepSeek señala la fortaleza de la línea Flash en tareas de seguridad; el checkpoint de septiembre obtuvo 88,1 en CyberGym en la tabla del propio DeepSeek. Eso es útil para el trabajo defensivo, y otra razón para acotar sus permisos con rigor.

6. Herramientas de programación

AIHubMix sirve deepseek-v4.1-flash-1017 en los tres protocolos que necesitan las herramientas de programación. En la prueba del 19 de octubre, Chat Completions, Anthropic Messages (incluida una llamada a herramienta de dos turnos) y la API de Responses devolvieron todas 200.

Claude Code (Anthropic Messages). Apúntalo a AIHubMix como en la guía de Claude Code y configura el modelo:

export ANTHROPIC_BASE_URL="https://aihubmix.com"
export ANTHROPIC_AUTH_TOKEN="$AIHUBMIX_API_KEY"
export ANTHROPIC_MODEL="deepseek-v4.1-flash-1017"
export ANTHROPIC_DEFAULT_HAIKU_MODEL="deepseek-v4.1-flash-1017"
export CLAUDE_CODE_SUBAGENT_MODEL="deepseek-v4.1-flash-1017"
export CLAUDE_CODE_EFFORT_LEVEL="high"
  • Razonamiento: en la prueba, una solicitud de Messages sin ajuste de esfuerzo volvió sin bloque de razonamiento, mientras que una con output_config.effort devolvió razonamiento. Mantén un nivel de esfuerzo configurado para que 1017 razone, y revisa los registros de solicitudes.
  • Contexto: la guía de DeepSeek añade el sufijo [1m] al nombre del modelo para su propio endpoint; ese sufijo no se probó a través de AIHubMix.
  • Problema conocido: a través de algunos routers, Claude Code ha descartado el contenido de razonamiento y ha provocado el error 400 mencionado arriba (issue 1378 de claude-code-router). La prueba de herramientas de dos turnos a través del endpoint Messages de AIHubMix no lo provocó.

Codex (API de Responses). Sigue la guía de Codex CLI: un proveedor aihubmix con base_url = "https://aihubmix.com/v1" y wire_api = "responses", y model = "deepseek-v4.1-flash-1017". Para seleccionarlo desde /model, añádelo a un archivo model_catalog_json con context_window configurado en 1,000,000.

  • Esfuerzo: el script de catálogo de la guía ofrece low, medium y high. Según la asignación de DeepSeek, medium y high caen ambos en high de DeepSeek, así que obtienes solo dos niveles reales.
  • Problema conocido: las versiones más recientes de Codex descartan todo el catálogo si falta un solo campo obligatorio. El script de la guía evita ese problema.

DeepSeek Harness (Chat Completions). DeepSeek indica que 1017 funciona mejor con Harness 0.2.1-rc.1 o posterior. Añade AIHubMix como proveedor compatible con OpenAI siguiendo la guía de DeepSeek Harness y añade deepseek-v4.1-flash-1017 como modelo. Esa guía se escribió para una versión anterior de Harness, así que revisa los nombres de los campos si la interfaz ha cambiado.

Una prueba rápida de 15 minutos. Crea un repositorio pequeño con una prueba fallida:

mkdir flash-smoke && cd flash-smoke && git init -q
printf 'def mean(xs):\n    return sum(xs) / len(xs)\n' > stats.py
printf 'from stats import mean\n\ndef test_mean():\n    assert mean([1, 2, 3]) == 2\n\ndef test_empty():\n    assert mean([]) == 0\n' > test_stats.py

Inicia tu herramienta en esa carpeta y pide: "Ejecuta pytest, corrige la prueba fallida cambiando solo stats.py y luego vuelve a ejecutar pytest". La prueba se supera si:

  • el agente realiza al menos dos llamadas a herramientas (ejecutar las pruebas, editar el archivo) sin ningún 400;
  • ambas pruebas pasan al final;
  • el registro de solicitudes de AIHubMix muestra deepseek-v4.1-flash-1017, y el costo de la sesión es de unos pocos centavos como mucho.

Lista de verificación para la migración

  • Decide el ID del modelo: deepseek-v4.1-flash-1017 en AIHubMix.
  • Añade mensajes completos del asistente en los bucles de herramientas para que reasoning_content se envíe de vuelta en cada turno.
  • Vuelve a ejecutar tu conjunto de regresión y evaluación; registra el modelo, la fecha y el campo del modelo de respuesta.
  • Revisa los analizadores y las interfaces por si aparecen salidas más cortas.
  • Establece el esfuerzo en high por defecto; reserva max para las tareas más difíciles.
  • Aumenta max_tokens para los turnos de los agentes y configura una alerta para finish_reason length.
  • Elimina las suposiciones de determinismo basadas en temperature en el modo de razonamiento.
  • Programa las ejecuciones por lotes y nocturnas de los agentes fuera de las horas punta.
  • Mantén estables los prefijos de los prompts para aprovechar los aciertos de caché.
  • Presupuesta las llamadas de Search y Fetch desde el 31 de octubre si usas las herramientas del lado del servidor de DeepSeek.
  • Aísla los agentes en un entorno sandbox con permisos reales y revisa los diffs, no los resúmenes.
  • Ejecuta la prueba rápida de 15 minutos en cada herramienta de programación que uses.

Preguntas frecuentes

¿Necesito cambiar el código para usar DeepSeek V4.1 Flash 1017?
En la API de DeepSeek, no: deepseek-flash ya apunta a 1017. En AIHubMix, cambia el nombre del modelo a deepseek-v4.1-flash-1017.

¿Por qué recibo un error 400 sobre reasoning_content?
DeepSeek exige que el reasoning_content de todos los turnos anteriores del asistente se envíe de vuelta cuando una solicitud incluye herramientas. Los clientes que descartan ese campo fallan en la llamada posterior a la primera llamada a una herramienta.

¿El error 400 de reasoning_content ocurre a través de AIHubMix?
No ocurrió en la prueba de AIHubMix del 19 de octubre de 2026, en la que un turno sin reasoning_content devolvió 200. Aun así, sigue enviando el campo, ya que es una norma documentada por DeepSeek.

¿Puedo seguir usando el V4.1 Flash de septiembre en la API de DeepSeek?
No. DeepSeek trasladó deepseek-flash y los nombres Flash anteriores a 1017 y no ofrece un nombre fijo para el punto de control de septiembre.

¿Cuándo es más barato DeepSeek V4.1 Flash?
Fuera de 01:00 a 04:00 y de 06:00 a 10:00 UTC en días laborables. Cada otra hora, los fines de semana y los días festivos públicos chinos cuestan la mitad.

¿Qué nivel de esfuerzo deben usar los agentes de programación?
High, que es el valor por defecto. El propio artículo de DeepSeek indica que max alarga las ejecuciones de los agentes entre 1,6 y 1,8 veces a cambio de mejoras pequeñas.

¿Funciona 1017 en Claude Code y Codex a través de AIHubMix?
Sí. AIHubMix lo sirve con los protocolos Anthropic Messages y Responses que usan esas herramientas, y ambos superaron una prueba básica el 19 de octubre de 2026.

Sigue leyendo: la serie DeepSeek V4.1 Flash 1017

Fuentes