TL;DR Un nivel por modelo. Corre
/efforten cada modelo que uses y confirma con Enter: se guarda enmodelSettings.<modelo>.effortLevely esa entrada gana aleffortLevelglobal del mismo archivo.slo deja en esta sesión y/effort autoborra el del modelo activo.
Si usas más de un modelo, llevas tiempo moviendo dos mandos. Primero /model, luego /effort, porque el nivel de razonamiento que quieres en el modelo que investiga una hora no es el que quieres en el que te renombra tres variables. Desde la v2.1.251 el segundo mando viaja pegado al primero: Claude Code guarda el nivel por modelo, así que lo pones una vez en cada uno y cambiar de modelo ya te trae el nivel que le corresponde.
Mismo archivo de settings, dos modelos, dos niveles:
$ claude --model sonnet --settings '{"effortLevel":"high","modelSettings":{
"claude-sonnet-5":{"effortLevel":"low"},
"claude-opus-5":{"effortLevel":"xhigh"}}}' -p "/whicheffort"
EFFORT=low
$ claude --model opus (el mismo --settings)
EFFORT=xhigh
Ni toqué /effort ni cambié el archivo entre las dos líneas. Cambié de modelo. (/whicheffort es la skill de seis líneas del tip de la precedencia: sigue siendo la única forma de leer el nivel real desde un script.)
Dónde se guarda el nivel
Abre tu configuración de usuario y mira las dos claves que deciden esto:
$ jq '{effortLevel, modelSettings}' ~/.claude/settings.json
{
"effortLevel": "high",
"modelSettings": {
"claude-opus-5": { "effortLevel": "high" },
"claude-fable-5": { "effortLevel": "high" },
"claude-fable-5-1": { "effortLevel": "high" }
}
}
El effortLevel de arriba lo escribí yo hace meses. Las tres entradas de abajo no: las ha ido escribiendo /effort solo, cada vez que confirmaba un nivel con Enter estando en un modelo distinto. Y como las tres dicen lo mismo que la clave global, llevo meses con un único nivel de razonamiento para tres modelos que uso para cosas que no se parecen. Escribir este tip es lo que me ha hecho abrir el archivo.
Dos detalles que importan al leerlo:
- La entrada del modelo gana a la clave global dentro del mismo archivo. Es lo que prueba la primera línea de la prueba de arriba:
effortLevel: "high"y aun asíEFFORT=low, porqueclaude-sonnet-5teníalow. - Se guarda con el nombre canónico (
claude-opus-5) y aplica igual cuando arrancas con el alias: esa prueba salió de un--model sonnetcontra una entradaclaude-sonnet-5.
Y una cosa que no cambia: una entrada de otro modelo no te toca nada. Con claude-opus-5 en xhigh y corriendo Sonnet, sigues en lo que diga Sonnet.
Cómo dejarlo puesto
1. Mira en qué nivel estás ahora
/effort sin argumentos te lo dice para el modelo que tienes puesto. Si hay algo guardado, Current effort level: high. Si no hay nada, Effort level: auto (currently high), que es el default del modelo.
2. Guarda el nivel de ese modelo
/effort medium
Claude Code responde Set effort level to medium (saved as your default for new sessions) y escribe la entrada. El slider de /effort (y el de /model, con las flechas) hace lo mismo al confirmar con Enter. Si solo lo quieres para esta sesión, pulsa s en el slider: la respuesta cambia a (this session only) y no se guarda nada. Para un único turno ni siquiera hace falta s: con ultrathink ese turno razona como en high y el nivel no cambia. Es el mismo reparto Enter / s que /model tiene para el modelo.
Un caso aparte: en Fable 5, Opus 4.8 y Opus 4.7, el modelo imponía su propio default hasta que confirmabas un nivel a mano. Desde la v2.1.280 ya no se impone al nivel guardado para ese modelo, ni a un effortLevel de proyecto o pasado con --settings, ni en -p.
3. Repite en el siguiente modelo
/model para cambiar, /effort <nivel> para fijarlo ahí. Cuál merece cuál es la conversación de Sonnet 5, Opus 5 y Fable: el que delega y verifica aguanta un nivel bajo mucho mejor que el que investiga solo. Y en Opus 5.5, medium rinde lo mismo que xhigh en el trabajo de repo.
4. Si te arrepientes
/effort auto
Borra lo guardado del modelo activo y lo devuelve a su default. No toca las entradas de los otros modelos ni la clave global.
Referencia
| Cómo lo pones | Alcance | Qué deja escrito |
|---|---|---|
/effort <nivel> o Enter en el slider |
Ese modelo, también en sesiones nuevas | modelSettings.<modelo>.effortLevel |
s en el slider de /effort o /model |
Solo esta sesión | Nada |
/effort max |
Solo esta sesión | Nada, max no se acepta en settings |
/effort auto |
Vuelve al default de ese modelo | Quita esa entrada |
effortLevel a mano en settings |
Los modelos sin entrada propia | Lo que escribas |
--effort al lanzar |
Solo esa sesión | Nada |
CLAUDE_CODE_EFFORT_LEVEL |
La sesión, y pisa todo lo de arriba | Nada |
El tope por modelo: maxEffortLevel
Dentro de la entrada del modelo cabe otra cosa: maxEffortLevel. Recorta cualquier nivel que pidas por encima, incluido el flag con el que arrancas.
$ claude --model sonnet --effort xhigh \
--settings '{"modelSettings":{"claude-sonnet-5":{"maxEffortLevel":"low"}}}' \
-p "/whicheffort"
Effort 'xhigh' exceeds the cap for claude-sonnet-5 set by your settings or organization; using 'low'
EFFORT=low
El aviso es la excepción: el effort en settings falla callado cuando escribes un nivel que no existe, y este tope es el único que te dice que ha recortado lo que pediste.
El modelo de tus subagentes
Tus subagentes no heredan tu nivel por defecto. Corren en el modelo que Claude les pase al invocarlos, o en el de su definición, y solo si nada de eso aplica heredan el de tu conversación. CLAUDE_CODE_SUBAGENT_MODEL entra por detrás de los dos primeros: desde la v2.1.251 es un valor por defecto, no una imposición. Si quieres que gane a todo, acompáñala:
{
"env": {
"CLAUDE_CODE_SUBAGENT_MODEL": "haiku",
"CLAUDE_CODE_SUBAGENT_MODEL_FORCE": "1"
}
}
Una regla deny con Agent(model:opus) no sustituye a estas dos variables: solo frena cuando Claude pasa el modelo en la llamada.
Con haiku ahí, desde la v2.1.293 tus subagentes corren en Haiku 5.5, que les sale un 90% más económico que Haiku 4.5. Y el sitio donde compruebas que se aplicó es el panel /tasks. La fila de cada subagente lleva el modelo en el que corre, y le añade el nivel de effort cuando su definición, o la skill de la que salió, trae effort en el frontmatter. La fila, tal como sale en el panel:
craft:review › Adversarial review of cache-marker patch
9m 21s · 118.4k tokens · 45 tools · Opus 5 (1M context)
Queda un motivo viejo para no tocar el mando a mitad de tarea: cambiar el effort rompía la caché y la siguiente petición releía la conversación entera. En Opus 5.5 y Fable 5.1 con API key o suscripción ya no: Claude Code aplica el nivel nuevo sin preguntarte. En los demás modelos sigue preguntando antes de romperla, y por eso conviene que el nivel esté puesto de antes. Y si aceptaste la advertencia y luego quieres saber qué te costó, la línea Prompt cache (main) de /cost lo deja apuntado como likely cause: effort changed.
Un modelo nuevo no hereda nada de esto. Cuando salió Opus 5.5 arrancó en su propio default, medium: el effortLevel global de tu settings de usuario es la forma que escribía /effort antes de guardar por modelo, y desde la v2.1.280 no llega a Opus 5.5 ni a los modelos que salgan después hasta que les eliges un nivel. Un effortLevel de proyecto, local o pasado con --settings sí les llega. Cada lanzamiento es una entrada más en modelSettings.
Documentación oficial: Model configuration: adjust effort level ·
modelSettings· Sub-agents: choose a model
Si en tu CLAUDE.md pides a Opus 5.5 que piense más, o menos, esa frase no controla nada: el mando es este. /claude-api prompt-audit te encuentra esas líneas.
Requisitos
- Comprobado en Claude Code v2.1.269. Lo ejecutado son las pruebas con
--settingsde este tip, incluido el aviso del tope. Las respuestas de/effort,sy/effort autoson las cadenas exactas del binario de la v2.1.269, no una sesión interactiva capturada, y la fila de/taskssale del propio panel. modelSettingsnecesita la v2.1.251, la teclasdel slider la v2.1.257, elmaxEffortLevelpor modelo la v2.1.267 y el modelo en la fila de/tasksla v2.1.242.- Lo de Opus 5.5 (el effort que no rompe la caché y el
effortLevelde usuario que no le llega) sale de la documentación y del changelog de la v2.1.280, no de una prueba mía. - Sonnet 5.5 (v2.1.284) se comporta igual, y ese sí lo comprobé:
effortLevelde usuario enhighy la sonda enEFFORT=medium(el benchmark de Sonnet 5.5). - Guardar el nivel con Enter es cosa de una sesión interactiva en tu máquina: con
-p,/effortsolo vale para esa sesión y no escribe nada.