Migrating from Magistral
On this page
Lesson rewritten on November 2, 2026. This lesson originally described Magistral’s “always-on” reasoning. Since all Magistral models were retired on July 31, 2026, it now covers migration to
reasoning_effort. Sources: Models — deprecated and removed models · Reasoning · Native reasoning (deprecated).
Where does your code stand?
The latest Magistral versions, Small 1.2 and Medium 1.2 (-2509), were deprecated in spring 2026 and retired on July 31, 2026; versions 1.0 and 1.1 had already been retired on November 30, 2025. Any code still calling magistral-small-latest, magistral-medium-latest, or a dated identifier from that family is targeting a model that no longer exists. Migration is no longer something to plan—it’s something to do now.
The mapping table
| You were using | Mistral’s designated replacement | What we recommend today |
|---|---|---|
| Magistral Small (1.0, 1.1, 1.2) | Mistral Small 4 | mistral-small-2603 with reasoning_effort="high" |
| Magistral Medium (1.0, 1.1, 1.2) | Mistral Medium 3.5 | Small 4 if quality suffices, otherwise mistral-large-4-0 with reasoning_effort="high" |
Why not follow Mistral’s designated replacement for Magistral Medium to the letter? Because Mistral Medium 3.5 is itself deprecated as of October 31, 2026, with retirement scheduled for April 30, 2027, and Large 4 as its successor. Migrating to it means committing to a second migration six months later. Large 4 is in Public Preview: if that maturity level doesn’t suit your production environment, Medium 3.5 remains a possible stepping stone, provided you schedule the next switch now.
What changes in the code
Magistral always reasoned; current models reason only when you ask them to. The natural equivalent of “always on” is therefore reasoning_effort="high".
# Before: Magistral (retired)
response = client.chat.complete(
model="magistral-medium-latest",
messages=[
{"role": "system", "content": "You are a rigorous analyst."},
{"role": "user", "content": question},
],
prompt_mode=None, # disabled Magistral's default system prompt
)
# After: Mistral Large 4 with explicit reasoning
response = client.chat.complete(
model="mistral-large-4-0",
messages=[
{"role": "system", "content": "You are a rigorous analyst."},
{"role": "user", "content": question},
],
reasoning_effort="high",
)
Four items to address along the way:
- Model identifiers: search for
magistralin your code, configuration files, and environment variables. prompt_mode: the reasoning documentation no longer mentions it; remove it from your calls.- System prompts: delete the Magistral-specific reasoning template (the
thinkingfragment placed in the system message) and keep only the method and format instructions (Lesson 6). - Reading responses: the structure from Magistral 25.07 and 25.09 (
ThinkChunkthenTextChunk) matches current models, so your reading code remains valid. Just add handling for the plain string case, which Small 4 and Medium 3.5 return whenreasoning_effort="none". If your code came from Magistral 25.06 and looked for<think>tags in the text, replace it with theseparerfunction from Lesson 3.
Validating the migration
Don’t switch blindly. Replay a sample of your real-world cases, along with their reference answers, and compare three metrics: quality (accuracy, format compliance), tokens consumed (usage.completion_tokens), and latency. A simple script does the job:
import time
def comparer(client, cas, configs):
"""cas: list of (question, verifier); configs: list of (model, level)."""
for model, niveau in configs:
justes = tokens = 0
debut = time.perf_counter()
for question, verifier in cas:
r = client.chat.complete(
model=model,
messages=[{"role": "user", "content": question}],
reasoning_effort=niveau,
)
_, reponse = separer(r.choices[0].message.content)
justes += bool(verifier(reponse))
tokens += r.usage.completion_tokens
duree = time.perf_counter() - debut
print(f"{model} ({niveau}) : {justes}/{len(cas)} correct, {tokens} tokens, {duree:.0f} s")
comparer(client, mes_cas, [
("mistral-small-2603", "high"),
("mistral-large-4-0", "medium"),
("mistral-large-4-0", "high"),
])
The verifier function depends on your domain: comparison against an expected value, presence of required elements, or JSON validation. This is what turns an impression into a decision.
Making the most of the migration
Since you’re touching every model call anyway, use this opportunity to pin dated identifiers in production (mistral-small-2603 rather than mistral-small-latest) and to centralize the choice of model and reasoning level in a single configuration. The next deprecation—and there will be one—will then be a one-line fix.
Key takeaways
- Magistral was retired on July 31, 2026: any remaining call targets an unavailable model
- Magistral Small → Small 4; Magistral Medium → Small 4 or Large 4 rather than Medium 3.5, which is itself deprecated
- “Always on” translates to
reasoning_effort="high" - Remove
prompt_modeand the reasoning template from system prompts - Validate on your real cases (quality, tokens, latency), then pin dated identifiers