alt.freeweights.mistral / Leanstral-1.5-119B-A6B
From: mistralai <huggingface.co/mistralai>Newsgroups: alt.freeweights.mistralSubject:

Leanstral-1.5-119B-A6B

Date: 2026-11-15Commit: 81592daSigned: 2DC28CC7B26A283B ✓

Model. Safetensors weights, 121 GB in all. Published by mistralai under Apache-2.0.

mistral121GBLeanstral-1.5-119B-A6Bsafetensorspermissive
FactsParamsnot statedSize121 GBFormatssafetensorsTasknot taggedLicenseApache-2.0From sourcepermissive
$ fw get mistralai/Leanstral-1.5-119B-A6B
# manifest sha256 71850ccd7759… · 121 GB · 13 files
$ fw verify ./Leanstral-1.5-119B-A6B mistralai/Leanstral-1.5-119B-A6B
From sourceHosted (signed)mistralai/Leanstral-1.5-119B-A6BLast check: 2026-11-15 03:50 UTC

Get help: custom fine-tune or private deploy. We review your setup before we quote.

Fine-tune of Leanstral-2603.

Works with

Runs with

Ranked by fit to this model (safetensors), then by GitHub stars.

Overview

Size
121 GB
Weights
121 GB (safetensors)
Parameters
not stated
Formats
safetensors
Task
not tagged
License
Apache-2.0 (permissive)
Files
13, each with a sha256
Publisher
mistralai
Added
2026-11-15
Section
alt.freeweights.mistral
Lineage

Original release from the publisher.

Base model: mistralai/Leanstral-2603

Where these bytes come from
Publisher at the pinned commit→You

Sources are tried in order. A file counts only when its size and sha256 match the manifest. Sources are checked when you ask for them, not on a timer.

Sources
BadgeHostLast checkResult
From sourcehuggingface.co2026-11-15 03:50 UTCpassed

Model card

From the publisher at commit 81592da. Shown as plain text with links; images open at the publisher.

Leanstral 1.5 119B A6B#

Image: leanstral_benchmark_comparison

Leanstral 1.5 is an open-source code agent model designed for Lean 4, a proof assistant capable of expressing complex mathematical objects such as perfectoid spaces and software specifications like properties of Rust fragments.

Built as part of the Mistral Small 4 family, it combines multimodal capabilities and an efficient architecture, making it both performant and cost-effective compared to existing closed-source alternatives.

Note. This is an updated model of our previously released Leanstral model.

Key Features#

Leanstral incorporates the following architectural choices:

  • MoE: 128 experts, 4 active per token
  • Model Size: 119B parameters with 6.5B activated per token
  • Context Length: 256k tokens
  • Multimodal Input: Accepts text and image input, producing text output
  • Temperature: 1.0
  • Reasoning Effort:
    • 'none' → Do not use reasoning
    • 'high' → Use reasoning (recommended for complex prompts).
  • Context Length: ≤ 200k tokens recommended

Usage#

Installing Mistral Vibe and Leanstral

Using Leanstral

  • Type vibe --agent lean in the terminal (ensure Leanstral displays at the top).
    • We recommend running vibe inside vs code terminal so you can see both vibe and your code.
    • We recommend running vibe inside your Lean project directory.
    • To auto-approve model changes (be careful!), use vibe --agent lean --yolo.
  • Ask Leanstral to do any coding task for you, such as prove a given theorem or fix some code in your project.
  • Leanstral is capable of doing very long range tasks which requires hours of work. Don’t hesitate to let it work away at a problem.

Using Leanstral with the lean-lsp-mcp

We recommend trying Leanstral with the lean-lsp-mcp, a standard tool for AI agents to interact with Lean. The lean-lsp-mcp README has instructions for setting up the MCP with Mistral Vibe.

Local server#

If instead of pinging the Mistral API, you want to use your local vLLM server, you can do the following:

  • 1. Spin up a vllm server as explained in Usage - vllm
  • 2. Create a new agent file called lean.toml in ~/.vibe/agents:
mkdir ~/.vibe/agents/ && touch ~/.vibe/agents/lean.toml

And then copy-paste the following config into ~/.vibe/agents/lean.toml

display_name = "Lean (local vLLM)"
description = "Lean 4 mode using local vLLM"
safety = "neutral"

system_prompt_id = "lean"
active_model = "leanstral"

[[providers]]
name = "vllm"
api_base = "http://<your-host-url>:8000/v1"
api_key_env_var = ""
backend = "generic"
reasoning_field_name = "reasoning_content"

[[models]]
name = "mistralai/Leanstral-1.5-119B-A6B"
provider = "vllm"
alias = "leanstral"
thinking = "high"
temperature = 1.0
auto_compact_threshold = 168000

[tools.bash]
default_timeout = 1200

Note: Make sure to overwrite <your-host-url> with your server's url.

Then restart vibe and "tab-shift" to "lean" mode.

Give it a try on some "lean" code such as, e.g.: PrimeNumberTheoremAnd

Local Deployment#

The model can also be deployed with vLLM, we advise everyone to use the Mistral AI API if the model is subpar with local serving:

vLLM#

Let's use this model with the vLLM library to implement production-ready inference pipelines.

  1. Installation

Make sure to install vllm >= 0.24.0:

uv pip install -U vllm --torch-backend=auto

Doing so should automatically install mistral_common >= 1.11.5.

To check:

python -c "import mistral_common; print(mistral_common.__version__)"

You can also make use of a ready-to-go docker image or on the docker hub.

  1. Launch server

We recommend that you use Leanstral in a server/client setting.

vllm serve mistralai/Leanstral-1.5-119B-A6B \
  --max-model-len 200000 \
  --tensor-parallel-size 4 \
  --attention-backend FLASH_ATTN_MLA \
  --tool-call-parser mistral \
  --enable-auto-tool-choice \
  --reasoning-parser mistral
  1. Client
from openai import OpenAI
from huggingface_hub import hf_hub_download

# Modify OpenAI's API key and API base to use vLLM's API server.
openai_api_key = "EMPTY"
openai_api_base = "<your-host-url>"

client = OpenAI(
    api_key=openai_api_key,
    base_url=openai_api_base,
)

TEMP = 1.0
MAX_TOK = 32000
REASONING = "high" # switch to 'none' for faster answers

models = client.models.list()
model = models.data[0].id


prompt = """Define the transition rules as an inductive proposition.

This choice provides better support for proving properties about valid transitions and is generally more natural for modeling state machines in Lean, where you want to express logical rules rather than just computing a yes/no vale for each possible transition."""
messages = [
    {
        "role": "user",
        "content": [
            {
                "type": "text",
                "text": prompt,
            },
        ],
    },
]



response = client.chat.completions.create(
    model=model,
    messages=messages,
    temperature=TEMP,
    max_tokens=MAX_TOK,
    reasoning_effort=REASONING,
)

print("Content")
print(response.choices[0].message.content)

print("Reasoning")
print(response.choices[0].message.reasoning)

Example Content:

Expand</summary To define transaction rules as an inductive proposition in Lean, you can create an inductive type that captures the valid transitions between states. This approach is particularly useful for modeling state machines and proving properties about transitions, such as invariants.

Here is an example of how to define an inductive proposition for valid transitions in a simple counter machine:

-- Example: Counter that can only increment by 1 (no decrement, no shortcuts)
inductive ValidTransition : Nat → Nat → Prop
  | step1 : ∀ s, ValidTransition s (s + 1)   -- Core transition: s → s+1
  | step2 : ∀ s, ValidTransition s (2 * s)    -- Bonus: s → 2s (optional)
  | zero_step : ValidTransition 0 0          -- Additional special case

lemma reach_any_positive : ∀ n > 0, ValidTransition 0 n := by
  induction n with
  | zero => contradiction
  | succ n ih =>
    cases' Nat.eq_zero_or_pos n with h h
    · simp [h]
    · have : ValidTransition 0 (n + 1) := by
        cases' h with _ ih    -- Wait, this is messy...

In this example, ValidTransition is defined as an inductive proposition with constructors step1, step2, and zero_step. The step1 constructor allows for any state to transition to the next state by incrementing by 1, while step2 allows for doubling the state. The zero_step constructor is a special case for the initial state 0.

The lemma reach_any_positive aims to prove that any positive natural number is reachable from the initial state 0 through valid transitions. The proof uses induction on n, but due to simplification issues, the current approach may not be the most effective.

A more concise and effective way to define and prove properties about transitions is to use a simpler model, such as the following:

-- Simpler model for counter transitions (suffices for proofs)
inductive CounterTrans : Nat → Nat → Prop
  | valid : ∀ n, CounterTrans n (n + 1)

lemma reach_positive : ∀ n > 0, CounterTrans 0 n
  -- Proof is now trivial (by induction)

In this simpler model, CounterTrans is defined with a single constructor valid, which allows for any state to transition to the next state by incrementing by 1. The lemma reach_positive is straightforward to prove by induction, leveraging the simplicity of the transition rules.

This approach ensures that the proof remains concise and effective, avoiding unnecessary complexity in the transition rules. By using inductive propositions, we can effectively reason about state transitions and prove properties about the system.

Tool-Calling

You can add tools to the chat completion as follows:

prompt = """I have the following Lean 4 code snippet and want to check if it compiles and runs without errors. Can you run it for me and let me know the result?

tools = [{ "type": "function", "function": { "name": "lean_run_code", "description": "Run or compile an independent Lean code snippet or file and return the result or error message.", "parameters": { "type": "object", "properties": { "code": { "type": "string", "description": "Lean code snippet to run or compile. Either this or file_path must be provided." }, "file_path": { "type": "string", "description": "Path to the Lean file to run or compile. Either this or code must be provided." } }, } } }]

messages = [ { "role": "user", "content": [ { "type": "text", "text": prompt, }, ], }, ]

response = client.chat.completions.create( model=model, messages=messages, temperature=TEMP, max_tokens=MAX_TOK, reasoning_effort=REASONING, tools=tools, )

print("Tool Calls") print(response.choices[0].message.tool_calls)

print("Reasoning") print(response.choices[0].message.reasoning)


_Example Tool Calls_:

Expand</summary

`Function(arguments='{"code": "inductive State where\\n  | idle\\n  | busy\\n  | error\\n\\ndef transition : State → State → Bool\\n  | .idle, .busy => true\\n  | .busy, .idle => true\\n  | .busy, .error => true\\n  | _, _ => false\\n\\n#eval transition .idle .busy"}', name='lean_run_code')`





## License

This model is licensed under the [Apache 2.0 License](https://www.apache.org/licenses/LICENSE-2.0.txt).

*You must not use this model in a manner that infringes, misappropriates, or otherwise violates any third party’s rights, including intellectual property rights.*

Files

13 files · 121 GBWeights 121 GB (safetensors). Sizes and sha256 from the signed manifest.
Hide all 13 files with their sha256
FileSizesha256
.gitattributes1.57 KBa1533fad1fb49e1230aff61a60028ea63bc924b4cc4501447351b50b9c840683
README.md12.0 KB47cd16682705fc03a475e6e7466eaa6fc6704ea812fb59ce432fc8415ac5ea14
chat_template.jinja12.8 KB7a5a4bc329e302425fb7067edc861fc9a5fe941fced171983ed789af2c10b357
consolidated-00001-of-00007.safetensors20.0 GB44cd9c050a3a07bef741728726b89aad8c7024eccd016606f58eded62a5e6189
consolidated-00002-of-00007.safetensors20.0 GB47a59780b2b014322309465e2caa71e84dda869662c9bd3353d9b1d62a1e2351
consolidated-00003-of-00007.safetensors20.0 GB91df3ddbeedc8e2752800bd35c99da3d14121135a656c0aea7c7cec3d95bbf31
consolidated-00004-of-00007.safetensors20.0 GB28bdd6b8cd706bec682c3e426407dd02cc67248862fb9214297bdf4f2f49cd3a
consolidated-00005-of-00007.safetensors20.0 GBc5b9a4c1252ed70ee497764534867a7b12aea60d570e2b3e45cf24745fe43f47
consolidated-00006-of-00007.safetensors19.9 GB7113675767165db3accc16fee163dc19bb77b5e22f34d834d703cc88ea60c2b6
consolidated-00007-of-00007.safetensors1.07 GB9b12240bd395114753fb80d7ac9469528352253d7a58397ff5949dca6f059b28
consolidated.safetensors.index.json3.62 MB6b0ba100e201d970c10483266286695c5bbb535b413ed5905019dcb9ef36b7a7
params.json1.51 KB93f5e26c0d88ccf6f46f3a6e7794f1c9e082f66e43980688dcde1a6ca973d0c9
tekken.json16.3 MBb1272b956bd6edd2d2c674c76896c7661308c9e723997b0afb55ecb429cb5dc7
VersionsEach time the pinned upstream commit or file list changed in this repo. Newest first.
Upstream commitDateContents
81592da95d pinned now2026-11-15 03:50 UTC13 files · 121 GB

Use it

$ fw get mistralai/Leanstral-1.5-119B-A6B
# manifest sha256 71850ccd7759… · 121 GB · 13 files
$ fw verify ./Leanstral-1.5-119B-A6B mistralai/Leanstral-1.5-119B-A6B
fw.pyChecks the signature and every sha256, tries each source in order, resumes.
$ python3 fw.py get https://freeweights.allternit.com/manifests/mistralai/Leanstral-1.5-119B-A6B.json --dir ./Leanstral-1.5-119B-A6B $ python3 fw.py verify ./Leanstral-1.5-119B-A6B ./mistralai__Leanstral-1.5-119B-A6B.json
hfThe Hugging Face CLI with one setting. Same repo id.
$ HF_ENDPOINT=https://freeweights.allternit.com hf download mistralai/Leanstral-1.5-119B-A6B --revision 81592da95d94ab0439bfce16df1d55b402e598b6 --local-dir ./Leanstral-1.5-119B-A6B

License

Name
Apache License 2.0
Id
Apache-2.0
Class
Permissive
Redistribution
yes
Listing
Hosted (signed)
Decided
License as declared by the publisher. No person read it. 2026-11-15
Text in
README.md
Text sha256
47cd16682705fc03a475e6e7466eaa6fc6704ea812fb59ce432fc8415ac5ea14
Terms gate
No extra terms beyond the license.

Read the license text

Licenses are checked against the license table. A custom license passes only after a person reads it.

Provenance

From: mistralai <huggingface.co/mistralai>Newsgroups: alt.freeweights.mistralSubject: Leanstral-1.5-119B-A6BDate: 2026-11-15Commit: 81592daSigned: 2DC28CC7B26A283B ✓
Upstream
mistralai/Leanstral-1.5-119B-A6B
Pinned commit
81592da95d94ab0439bfce16df1d55b402e598b6
Manifest
Leanstral-1.5-119B-A6B.json · .minisig
Manifest sha256
71850ccd77592aec649db801a2fd06b8efec9536c22d291aeeefff63fc6b9b66
Signature
minisign, Ed25519, key 2DC28CC7B26A283B
Created
2026-11-15 03:50 UTC
Generator
freeweights-manifest/0.1.0
Takedowns
None.

How to verify

$ curl -O https://freeweights.allternit.com/manifests/mistralai/Leanstral-1.5-119B-A6B.json $ curl -O https://freeweights.allternit.com/manifests/mistralai/Leanstral-1.5-119B-A6B.json.minisig $ minisign -Vm Leanstral-1.5-119B-A6B.json -P RWQ7KGqyx4zCLXtUFOqvfv8L3g+8fpKJ1FsuxPyOYMF+4KufbUxKq1Oq $ shasum -a 256 <file> # compare with the Files tab

A manifest whose signature fails must be rejected. A file whose size or sha256 does not match must be discarded. Verify a download

Model tree

Parent

mistralai/Leanstral-2603 · this model is a finetune of it

No model in the catalog names this one as its parent.

Get it
Download
$ HF_ENDPOINT=https://freeweights.allternit.com hf download mistralai/Leanstral-1.5-119B-A6B
Open in Freeweights Studio

Pull, verify and run it in the Allternit app on Desktop, web or phone.

Signed manifest
minisign, key 2DC28CC7B26A283B. Leanstral-1.5-119B-A6B.json. Provenance. Takedown history: none.
From: bartowski <huggingface.co/bartowski>Subject: alamios_Mistral-Small-3.1-DRAFT-0.5B-GGUF
From: microsoft <huggingface.co/microsoft>Subject: chatbench-mistral-7b
From: NousResearch <huggingface.co/NousResearch>Subject: DeepHermes-3-Mistral-24B-Preview
From: mistralai <huggingface.co/mistralai>Subject: Devstral-Small-2-24B-Instruct-2512
From: mlx-community <huggingface.co/mlx-community>Subject: Devstral-Small-2-24B-Instruct-2512-4bit
From: mlx-community <huggingface.co/mlx-community>Subject: Devstral-Small-2-24B-Instruct-2512-6bit