A principios de octubre de 2026, JetBrains publicó Mellum2.1, un modelo de pesos abiertos de 12B parámetros con arquitectura mixture-of-experts, 2.5B activos, licencia Apache 2.0 y ventana de contexto de 131,072 tokens. Mantiene la arquitectura de Mellum2 de junio y vuelca casi todo el esfuerzo en post-entrenamiento con aprendizaje por refuerzo para código agéntico.
El titular es el puntaje propio de JetBrains en SWE-bench Verified: 47.0, contra 2.0 de Mellum2. Acá va lo que pude verificar, los comandos exactos de vLLM de la model card, un boceto para enchufarlo a un loop de agente y dónde no conviene que reemplace a un modelo más grande. Leí las fuentes; no benchmarkeé el modelo yo mismo.
1. Qué publicó JetBrains
Mellum nació como modelo de autocompletado de código. Mellum2, lanzado en junio de 2026 con un reporte técnico en arXiv, fue el salto a un diseño mixture-of-experts de 12B que activa unos 2.5B parámetros por token. Mellum2.1 es la siguiente versión de ese modelo Thinking: misma arquitectura, post-entrenamiento nuevo.
Los pesos están en Hugging Face como JetBrains/Mellum2.1-12B-A2.5B-Thinking. El post de lanzamiento lo posiciona para agentes de código y sub-agentes rápidos en tu propio hardware. No encontré una API alojada de JetBrains ni precio por token, así que el camino es autoalojarlo.
Ficha del modelo
- • Lanzamiento: principios de octubre de 2026 (el post de JetBrains cuelga de /2026/10/; trackers de terceros fechan el release en Hugging Face el 8 de octubre) — sucesor de Mellum2, de junio de 2026
- • Modelo: JetBrains/Mellum2.1-12B-A2.5B-Thinking — 12B parámetros totales / 2.5B activos (MoE: 64 expertos, 8 activos por token)
- • Contexto: 131,072 tokens; atención de ventana deslizante (1,024) en 3 de cada 4 capas; 28 capas; bfloat16
- • Licencia: Apache 2.0 (pesos en Hugging Face)
- • Precio: no encontré API alojada ni precio por token — se autoaloja; el checkpoint BF16 pesa ~24.3 GB
- • Serving: vLLM (--reasoning-parser qwen3, parser hermes para tool calling); repo GGUF de JetBrains para llama.cpp/Ollama; el head MTP para vLLM sigue listado como próximamente
2. Qué cambió frente a Mellum2
Mismo esqueleto, entrenamiento distinto. JetBrains dice que la arquitectura no cambia y que el aprendizaje por refuerzo pasó a ser la parte principal del entrenamiento, no una etapa final corta. Los datos se ampliaron a matemática, programación competitiva, ciencia, tool use e ingeniería de software, y JetBrains armó infraestructura propia que lanzó millones de sandboxes.
El cambio práctico lo dice sin vueltas el post de lanzamiento: Mellum2 no podía trabajar dentro de un repositorio al nivel que JetBrains quería, mientras que Mellum2.1 está pensado para explorar un codebase, editar archivos y verificar sus propios cambios. Esa es la diferencia entre un modelo de completado y uno que podés meter en un loop.
Los tres saltos (model card, autoinformado)
Código agéntico
SWE-bench Verified 2.0 → 47.0, SWE-bench Pro 0.0 → 28.0, Terminal-Bench 2.1 0.6 → 17.4. Evaluado por JetBrains en un harness de agente con herramientas de shell y archivos.
Razonamiento
LiveCodeBench v6 69.4 → 82.0, AIME 25/26 60.1 → 83.3, GPQA Diamond 51.0 → 64.6, IFEval 79.5 → 90.6.
Herramientas y seguridad
BFCL v4 49.6 → 62.3, HarmBench (menor es mejor) 21.5 → 8.5. No todo subió: WorkBench queda plano (45.1 → 44.6) y XSTest bajó (91.2 → 88.8).
Regla de oro
Mismo tamaño, mismo costo de serving, comportamiento distinto: la ganancia viene del post-entrenamiento, no de escala. Si probaste Mellum2 para agentes y lo descartaste, ese veredicto quedó viejo. Si nunca necesitaste un modelo chico, nada de esto cambia eso.
3. Los números, con procedencia
Cada puntaje de abajo sale de la model card de Hugging Face y lo produjo JetBrains. Los benchmarks no agénticos usaron decodificación greedy. Los agénticos usaron un harness llamado Pi (v0.73.1) con herramientas de shell y archivos, contexto de 114K tokens, hasta 16K tokens por turno y temperatura 1.0. El set de comparación es Mellum2, Gemma 4 (E4B) y Qwen3.5 (9B).
La velocidad es un reclamo aparte del post de lanzamiento: en una H200, bajo carga alta, JetBrains dice que Mellum2.1 sirve casi el doble de tokens que Qwen3.5-9B, y que la multi-token prediction haría una request individual unas 1.6 veces más rápida. Los valores exactos aparecen solo en un gráfico, y el head MTP para vLLM figura como próximamente.
Lo que dice la card (orden: Mellum2.1 / Qwen3.5 9B / Gemma 4 E4B / Mellum2)
- • SWE-bench Verified: 47.0 / 50.0 / 23.0 / 2.0 — Qwen3.5 (9B) va adelante
- • SWE-bench Pro: 28.0 / 38.0 / 4.0 / 0.0 — Qwen3.5 (9B) va adelante
- • Terminal-Bench 2.1: 17.4 / 21.7 / 3.4 / 0.6 — Qwen3.5 (9B) va adelante
- • LiveCodeBench v6: 82.0 / 75.4 / 69.4 / 69.4 — Mellum2.1 lidera
- • BFCL v4 (tool calling): 62.3 / 58.5 / 52.5 / 49.6 — Mellum2.1 lidera
- • GPQA Diamond: 64.6 / 77.8 / 53.1 / 51.0 — Qwen3.5 (9B) va bastante adelante
- • HarmBench (menor es mejor): 8.5 / 6.6 / 38.1 / 21.5
Letra chica
Todo es vendor-run: JetBrains eligió el harness, el tope de contexto y los competidores, y al 14 de octubre de 2026 no encontré ninguna re-ejecución independiente. Tampoco mezcles números entre cards: la card de Mellum2.1 lista LiveCodeBench v6 en 69.4 para Mellum2, mientras que la card original de Mellum2 listaba 69.9; vienen de setups de evaluación distintos.
4. Quickstart: servilo con vLLM
La receta de serving de la card son dos comandos: uno sin tool calling y otro con. Para un agente querés el segundo. Ambos pasan --max-model-len 131072 y el reasoning parser qwen3, que separa la traza de razonamiento de la respuesta final. La página de modelos soportados de vLLM lista la arquitectura MellumForCausalLM; la card no indica versión mínima de vLLM, así que usá un release reciente.
La memoria es la pregunta real, y la card no da guía de VRAM. Los números de abajo son aritmética mía a partir del tamaño del checkpoint y del config.json, no mediciones. Los 2.5B parámetros activos bajan el cómputo por token, no la memoria: los 12B tienen que estar residentes.
Cuentas de memoria (mías, no de la card)
- • Pesos: 12,149,923,072 parámetros en bfloat16 son unos 24.3 GB de safetensors. Ese es el piso para servir en BF16, antes del KV cache.
- • KV cache (config: 28 capas, 4 KV heads, head_dim 128, bf16): unos 14 KiB por token si solo las 7 capas de atención completa guardan historia completa, unos 56 KiB por token si las 28 lo hicieran. A 131,072 tokens son aproximadamente entre 1.9 GB y 7.5 GB por secuencia.
- • Lectura: una placa de 40–48 GB aguanta BF16 más un contexto completo con margen; 32 GB queda justo a ventana completa; 24 GB no alcanza para BF16 una vez contados el KV cache y el overhead de CUDA.
- • Placas más chicas: el repo GGUF de JetBrains lista Q4_K_M en 8.1 GB (marcada como recomendada), Q6_K 10.9 GB, Q8_0 12.9 GB y MXFP4_MOE 7.0 GB. Sus métricas de calidad son divergencia KL y coincidencia de top-token sobre Wikitext-2, no evals de agentes de código.
vLLM, sin tool calling
Verificado contra la model card el 2026-10-14. El razonamiento llega en un campo separado.
vllm serve JetBrains/Mellum2.1-12B-A2.5B-Thinking \
--max-model-len 131072 \
--reasoning-parser qwen3vLLM, con tool calling (lo que necesita un agente)
Verificado contra la model card el 2026-10-14. Agrega auto tool choice y el parser de tool calls hermes.
vllm serve JetBrains/Mellum2.1-12B-A2.5B-Thinking \
--max-model-len 131072 \
--reasoning-parser qwen3 \
--enable-auto-tool-choice \
--tool-call-parser hermesQuickstart de cliente de la card
Verificado contra la model card el 2026-10-14. OpenAI() lee OPENAI_BASE_URL y OPENAI_API_KEY del entorno; apuntá la primera al /v1 de tu servidor (vLLM escucha en el puerto 8000 por defecto).
from openai import OpenAI
# Configured by environment variables
client = OpenAI()
messages = [
{"role": "user", "content": "Find the bug in this function and explain the fix: def mean(xs): return sum(xs) / len(xs) - 1"},
]
chat_response = client.chat.completions.create(
model="JetBrains/Mellum2.1-12B-A2.5B-Thinking",
messages=messages,
max_tokens=81920,
temperature=0.6,
top_p=0.95,
extra_body={"top_k": 20},
)
print("Chat response:", chat_response)GPU chica o laptop: el build GGUF de JetBrains
De la card del repo GGUF, 2026-10-14. El post de lanzamiento todavía lista GGUF como próximamente, pero el repo ya estaba en la colección de JetBrains; no verifiqué tool calling por este camino.
# JetBrains GGUF repo, Q4_K_M (the quant its card marks as recommended)
ollama run hf.co/JetBrains/Mellum2.1-12B-A2.5B-Thinking-GGUF:Q4_K_M
# or llama.cpp
llama-server -hf JetBrains/Mellum2.1-12B-A2.5B-Thinking-GGUF:Q4_K_M --ctx-size 131072 --temp 0.6 --top-p 0.95 --top-k 20Palanca para GPUs chicas
--max-model-len es como cambiás contexto por memoria. La card usa 131072; bajarlo achica el KV cache que reservás. No probé qué valor entra en qué placa, así que empezá bajo y subilo hasta cubrir el contexto real que necesita tu agente.
5. Enchufalo a un loop de agente de código
vLLM expone un servidor compatible con OpenAI, así que cualquier harness que acepte una base URL y hable chat-completions con tools puede apuntarle. El boceto de abajo es el loop más chico que usaría para probar el modelo: una tool, un tope de pasos, sin trucos de memoria, los ajustes de sampling de la card y un tope de tokens por turno.
Dos detalles de la doc de vLLM importan. El razonamiento vuelve en su propio campo (hoy reasoning, antes reasoning_content, así que leé ambos). Y los tool calls se parsean solo del content, no de adentro del razonamiento: si el modelo emite una llamada dentro de su bloque de thinking, tu loop no ve nada.
Loop de agente mínimo contra el endpoint local
Boceto mío, no es de la model card, y no lo corrí. Muestra la forma: tools, tool_choice auto, razonamiento logueado, turnos del asistente reenviados sin el texto de thinking.
import json
import subprocess
from openai import OpenAI
# Sketch: not from the model card, not run by me.
client = OpenAI(base_url="http://localhost:8000/v1", api_key="local")
MODEL = "JetBrains/Mellum2.1-12B-A2.5B-Thinking"
TOOLS = [{
"type": "function",
"function": {
"name": "run_shell",
"description": "Run a shell command in the repo; returns stdout and stderr.",
"parameters": {
"type": "object",
"properties": {"cmd": {"type": "string"}},
"required": ["cmd"],
},
},
}]
def run_shell(cmd: str) -> str:
# DANGER: model-written commands. Run inside a container, no secrets mounted.
p = subprocess.run(cmd, shell=True, capture_output=True, text=True, timeout=120)
return (p.stdout + p.stderr)[-8000:]
messages = [
{"role": "system", "content": "You are a coding agent. Explore with run_shell, edit files, run the tests, stop when they pass."},
{"role": "user", "content": "tests/test_mean.py fails. Find the cause and fix it."},
]
for step in range(20):
resp = client.chat.completions.create(
model=MODEL,
messages=messages,
tools=TOOLS,
tool_choice="auto",
max_tokens=16384, # per-turn cap; the card quickstart uses 81920
temperature=0.6,
top_p=0.95,
extra_body={"top_k": 20}, # same sampling as the card quickstart
)
choice = resp.choices[0]
msg = choice.message
reasoning = getattr(msg, "reasoning", None) or getattr(msg, "reasoning_content", None)
print(f"[step {step}] finish={choice.finish_reason} reasoning_chars={len(reasoning or '')} tool_calls={len(msg.tool_calls or [])}")
assistant = {"role": "assistant", "content": msg.content or ""}
if msg.tool_calls:
assistant["tool_calls"] = [
{
"id": c.id,
"type": "function",
"function": {"name": c.function.name, "arguments": c.function.arguments},
}
for c in msg.tool_calls
]
messages.append(assistant)
if not msg.tool_calls:
print(msg.content)
break
for c in msg.tool_calls:
args = json.loads(c.function.arguments)
messages.append({"role": "tool", "tool_call_id": c.id, "content": run_shell(args["cmd"])})Antes de confiar en el loop
- 1. Levantá el servidor con el comando de tool calling y confirmá que /v1/models lista JetBrains/Mellum2.1-12B-A2.5B-Thinking.
- 2. Arrancá con el sampling de la card (temperature 0.6, top_p 0.95, top_k 20) y después hacé A/B con temperature 1.0, que es lo que JetBrains usó en sus benchmarks agénticos.
- 3. Poné tope de tokens por turno y de contexto total. Los benchmarks de JetBrains corrieron a 16K por turno y 114K de contexto, muy por debajo de los 81,920 max_tokens del quickstart.
- 4. Logueá finish_reason, largo del razonamiento y fallas de parseo de tool calls. Un tope que corta el bloque de thinking te deja una respuesta vacía.
- 5. Medí el éxito con tu suite de tests, nunca con la afirmación del modelo de que terminó.
Corrélo en un sandbox
El loop ejecuta comandos de shell escritos por un modelo. Usá un contenedor o VM descartable, no montes credenciales y dejá la salida a red apagada salvo que la tarea la necesite. Un MoE chico a veces se equivoca con total seguridad.
6. Dónde encaja y los límites honestos
JetBrains presenta Mellum2.1 como un modelo para agentes de código y sub-agentes rápidos en tu propio hardware, no como reemplazo de un modelo de frontera. Su set de comparación son solo modelos chicos. No tengo números del mismo harness para modelos más grandes o cerrados, así que no voy a inventar una brecha; esa es la pregunta que tiene que responder tu propio eval.
Para Mellum2, el post de lanzamiento sugería tareas de sub-agente como planificación, validación, transformación y preparación de contexto. Mellum2.1 mantiene ese rol y suma ediciones a nivel repositorio, pero la tabla de la propia card muestra a un rival de 9B adelante en los evals agénticos más duros.
Dónde lo probaría
- • Muchos sub-agentes en paralelo con un presupuesto fijo de GPU, donde importa más el throughput por dólar que los últimos puntos de resolución.
- • Código que no puede salir de tu red: pesos Apache 2.0, una GPU, sin API externa.
- • Un primer pase barato antes de escalar: que lo intente, correr los tests y escalar a un modelo más grande si falla. Ese patrón es sugerencia mía, no de JetBrains.
- • Snippets de programación competitiva y de razonamiento pesado, donde su LiveCodeBench v6 autoinformado de 82.0 es su mejor resultado.
Límites honestos
- • Todos los benchmarks son autoinformados por JetBrains; no encontré ninguna re-ejecución independiente al 14 de octubre de 2026.
- • 47.0 en SWE-bench Verified sigue significando aproximadamente la mitad de las tareas sin resolver, en el harness de JetBrains a temperatura 1.0 y 114K de contexto. Tu repo y tu harness van a diferir.
- • El modo thinking es lento por diseño: el quickstart permite hasta 81,920 tokens de salida, y JetBrains no publicó latencia por turno, solo un gráfico de throughput en una H200.
- • El speed-up de 1.6x en una request individual depende de un head MTP que todavía no está en vLLM, así que los comandos de arriba no lo incluyen.
- • El tool calling lo empareja con el parser hermes de vLLM. Medí la tasa de parseo de tool calls con tus propias tools antes de correr sin supervisión.
- • La tabla no tiene benchmark de contexto largo: 131,072 es el límite arquitectónico y no encontré números de calidad cerca del final de la ventana.
- • Ya existen cuantizaciones de la comunidad (FP8, AWQ, MLX). No revisé ninguna; tratá los pesos de terceros como no confiables.
Veredicto
Mellum2.1 es un modelo creíble de huella chica para trabajo de agentes local: Apache 2.0, una GPU, y un salto autoinformado de 2.0 a 47.0 en SWE-bench Verified que viene solo de RL. No es un reemplazo de frontera, y la propia card muestra a Qwen3.5 (9B) adelante en SWE-bench Verified, SWE-bench Pro y Terminal-Bench 2.1.
Lo que haría: bajar los pesos, servirlos con el comando de tool calling, correr entre 20 y 50 tickets tuyos con tests como juez, y comparar tasa de resolución, tiempo de pared y costo de GPU contra lo que corrés hoy. Hasta que alguien fuera de JetBrains re-ejecute SWE-bench, tomá el 47.0 como un número prometedor, no uno cerrado.
Fuentes de este post
Primarias primero, luego secundarias
- • Blog de IA de JetBrains: Mellum2.1 Gets to Work (octubre de 2026)
- • Hugging Face: model card de Mellum2.1-12B-A2.5B-Thinking
- • Hugging Face: repo GGUF de Mellum2.1, más la card y el post de lanzamiento de Mellum2 (generación anterior)
- • arXiv: Mellum2 Technical Report (29-may-2026)
- • Docs de vLLM: reasoning outputs y tool calling
- • DataNorth AI: nota de terceros sobre el lanzamiento (secundaria)



