Repository: ollama/ollama
Pull request: test: add ministral-3

Examples:
```
go test ./integration -tags=integration,models -v -run TestModelsChat/ministral-3
=== RUN   TestModelsChat
time=2025-12-02T09:36:29.836-08:00 level=INFO msg="Setting timeouts" soft=7m59.999632292s hard=9m39.999632208s
time=2025-12-02T09:36:29.839-08:00 level=INFO msg="server connection" host=127.0.0.1 port=54156
time=2025-12-02T09:36:29.839-08:00 level=INFO msg="setting env" OLLAMA_HOST=127.0.0.1:54156
time=2025-12-02T09:36:29.840-08:00 level=INFO msg="starting server" url=127.0.0.1:54156
time=2025-12-02T09:36:30.342-08:00 level=WARN msg="No VRAM info available, testing all models, so larger ones might timeout..."
=== RUN   TestModelsChat/ministral-3
time=2025-12-02T09:36:30.342-08:00 level=INFO msg="checking status of model" model=ministral-3
time=2025-12-02T09:36:30.346-08:00 level=INFO msg="model missing" model=ministral-3
time=2025-12-02T09:36:51.208-08:00 level=INFO msg=loading model=ministral-3
time=2025-12-02T09:36:55.323-08:00 level=INFO msg="test pass" model=ministral-3 messages="[{Role:user Content:why is the sky blue? Be brief but factual in your reply Thinking: Images:[] ToolCalls:[] ToolName: ToolCallID:}]" contains="[rayleigh scatter atmosphere nitrogen oxygen wavelength interact]" response="The sky appears blue due to **Rayleigh scattering**, where shorter blue wavelengths of sunlight are scattered more by Earth's atmosphere than other colors. This scattered blue light reaches our eyes from all directions, making the sky look blue."
time=2025-12-02T09:36:55.328-08:00 level=INFO msg="shutting down server"
time=2025-12-02T09:36:55.328-08:00 level=INFO msg="waiting for server to exit"
time=2025-12-02T09:36:55.382-08:00 level=INFO msg="server exited"
time=2025-12-02T09:36:55.382-08:00 level=INFO msg="terminate complete"
time=2025-12-02T09:36:55.382-08:00 level=INFO msg="cleanup complete" failed=false
--- PASS: TestModelsChat (25.55s)
    --- PASS: TestModelsChat/ministral-3 (24.99s)
PASS
ok      github.com/ollama/ollama/integration    25.760s
```

```
go test ./integration -tags=integration,models -v -run TestVisionModels/ministral-3                 
=== RUN   TestVisionModels
=== RUN   TestVisionModels/ministral-3
time=2025-12-02T09:37:10.658-08:00 level=INFO msg="server connection" host=127.0.0.1 port=54222
time=2025-12-02T09:37:10.658-08:00 level=INFO msg="setting env" OLLAMA_HOST=127.0.0.1:54222
time=2025-12-02T09:37:10.658-08:00 level=INFO msg="starting server" url=127.0.0.1:54222
time=2025-12-02T09:37:10.783-08:00 level=INFO msg="checking status of model" model=ministral-3
time=2025-12-02T09:37:10.822-08:00 level=INFO msg="model already present" model=ministral-3
...
--- PASS: TestVisionModels (2.85s)
    --- PASS: TestVisionModels/ministral-3 (2.85s)
PASS
ok      github.com/ollama/ollama/integration    3.058s
```

```
go test ./integration -tags=integration,models -v -run TestAPIToolCalling/ministral-3
=== RUN   TestAPIToolCalling
time=2025-12-02T09:37:39.185-08:00 level=INFO msg="server connection" host=127.0.0.1 port=54239
time=2025-12-02T09:37:39.185-08:00 level=INFO msg="setting env" OLLAMA_HOST=127.0.0.1:54239
time=2025-12-02T09:37:39.185-08:00 level=INFO msg="starting server" url=127.0.0.1:54239
=== RUN   TestAPIToolCalling/ministral-3
time=2025-12-02T09:37:39.291-08:00 level=INFO msg="checking status of model" model=ministral-3
time=2025-12-02T09:37:39.332-08:00 level=INFO msg="model already present" model=ministral-3
time=2025-12-02T09:37:41.757-08:00 level=INFO msg="shutting down server"
time=2025-12-02T09:37:41.757-08:00 level=INFO msg="waiting for server to exit"
time=2025-12-02T09:37:41.805-08:00 level=INFO msg="server exited"
time=2025-12-02T09:37:41.805-08:00 level=INFO msg="terminate complete"
time=2025-12-02T09:37:41.805-08:00 level=INFO msg="cleanup complete" failed=false
--- PASS: TestAPIToolCalling (2.62s)
    --- PASS: TestAPIToolCalling/ministral-3 (2.47s)
PASS
ok      github.com/ollama/ollama/integration    2.829s
```

```
go test ./integration -tags=integration,library -v -run TestLibraryModelsChat/ministral-3
=== RUN   TestLibraryModelsChat
time=2025-12-02T09:38:29.812-08:00 level=INFO msg="Setting timeouts" soft=7m59.99952275s hard=9m39.999522667s
time=2025-12-02T09:38:29.815-08:00 level=INFO msg="server connection" host=127.0.0.1 port=54260
time=2025-12-02T09:38:29.815-08:00 level=INFO msg="setting env" OLLAMA_HOST=127.0.0.1:54260
time=2025-12-02T09:38:29.815-08:00 level=INFO msg="starting server" url=127.0.0.1:54260
=== RUN   TestLibraryModelsChat/ministral-3
time=2025-12-02T09:38:29.926-08:00 level=INFO msg="checking status of model" model=ministral-3
time=2025-12-02T09:38:29.968-08:00 level=INFO msg="model already present" model=ministral-3
time=2025-12-02T09:38:33.023-08:00 level=INFO msg="test pass" model=ministral-3 messages="[{Role:user Content:why is the sky blue? Be brief but factual in your reply Thinking: Images:[] ToolCalls:[] ToolName: ToolCallID:}]" contains="[rayleigh scatter atmosphere nitrogen oxygen wavelength interact]" response="The sky appears blue due to **Rayleigh scattering**, where shorter wavelengths of sunlight (blue and violet) are scattered more by Earth's atmosphere than longer wavelengths (red, orange). Our eyes are less sensitive to violet, so we perceive the sky as blue."
time=2025-12-02T09:38:33.024-08:00 level=INFO msg="shutting down server"
time=2025-12-02T09:38:33.024-08:00 level=INFO msg="waiting for server to exit"
time=2025-12-02T09:38:33.076-08:00 level=INFO msg="server exited"
time=2025-12-02T09:38:33.076-08:00 level=INFO msg="terminate complete"
time=2025-12-02T09:38:33.076-08:00 level=INFO msg="cleanup complete" failed=false
--- PASS: TestLibraryModelsChat (3.26s)
    --- PASS: TestLibraryModelsChat/ministral-3 (3.10s)
PASS
ok      github.com/ollama/ollama/integration    3.476s
```

```
go test ./integration -tags=integration,perf -v -run TestModelsPerf/ministral-3       
=== RUN   TestModelsPerf
time=2025-12-02T09:39:05.386-08:00 level=INFO msg="Setting timeouts" soft=7m59.999644417s hard=9m39.999644334s
time=2025-12-02T09:39:05.391-08:00 level=INFO msg="server connection" host=127.0.0.1 port=54275
time=2025-12-02T09:39:05.391-08:00 level=INFO msg="setting env" OLLAMA_HOST=127.0.0.1:54275
time=2025-12-02T09:39:05.391-08:00 level=INFO msg="starting server" url=127.0.0.1:54275
time=2025-12-02T09:39:05.517-08:00 level=WARN msg="No VRAM info available, testing all models, so larger ones might timeout..."
=== RUN   TestModelsPerf/ministral-3:latest
time=2025-12-02T09:39:05.520-08:00 level=INFO msg="checking status of model" model=ministral-3:latest
time=2025-12-02T09:39:05.561-08:00 level=INFO msg="model already present" model=ministral-3:latest
time=2025-12-02T09:39:05.598-08:00 level=INFO msg=scneario model=ministral-3:latest max_context=262144
time=2025-12-02T09:39:08.527-08:00 level=INFO msg="Model fully loaded into GPU"
MODEL_PERF_HEADER:MODEL,CONTEXT,GPU PERCENT,APPROX PROMPT COUNT,LOAD TIME,PROMPT EVAL TPS,EVAL TPS
MODEL_PERF_DATA:ministral-3:latest,4096,100,550,1.24,649.80,57.27
time=2025-12-02T09:39:23.640-08:00 level=INFO msg="Model fully loaded into GPU"
MODEL_PERF_HEADER:MODEL,CONTEXT,GPU PERCENT,APPROX PROMPT COUNT,LOAD TIME,PROMPT EVAL TPS,EVAL TPS
MODEL_PERF_DATA:ministral-3:latest,4096,100,2860,0.08,803.32,45.46
time=2025-12-02T09:39:26.768-08:00 level=INFO msg="Model fully loaded into GPU"
MODEL_PERF_HEADER:MODEL,CONTEXT,GPU PERCENT,APPROX PROMPT COUNT,LOAD TIME,PROMPT EVAL TPS,EVAL TPS
MODEL_PERF_DATA:ministral-3:latest,8192,100,550,1.43,647.20,57.16
time=2025-12-02T09:39:47.892-08:00 level=INFO msg="Model fully loaded into GPU"
MODEL_PERF_HEADER:MODEL,CONTEXT,GPU PERCENT,APPROX PROMPT COUNT,LOAD TIME,PROMPT EVAL TPS,EVAL TPS
MODEL_PERF_DATA:ministral-3:latest,8192,100,5090,0.08,655.46,38.87
time=2025-12-02T09:39:51.513-08:00 level=INFO msg="Model fully loaded into GPU"
MODEL_PERF_HEADER:MODEL,CONTEXT,GPU PERCENT,APPROX PROMPT COUNT,LOAD TIME,PROMPT EVAL TPS,EVAL TPS
MODEL_PERF_DATA:ministral-3:latest,16384,100,550,1.83,582.22,57.45
time=2025-12-02T09:40:28.142-08:00 level=INFO msg="Model fully loaded into GPU"
MODEL_PERF_HEADER:MODEL,CONTEXT,GPU PERCENT,APPROX PROMPT COUNT,LOAD TIME,PROMPT EVAL TPS,EVAL TPS
MODEL_PERF_DATA:ministral-3:latest,16384,100,9260,0.08,498.92,31.02
time=2025-12-02T09:40:45.298-08:00 level=INFO msg="Model fully loaded into GPU"
MODEL_PERF_HEADER:MODEL,CONTEXT,GPU PERCENT,APPROX PROMPT COUNT,LOAD TIME,PROMPT EVAL TPS,EVAL TPS
MODEL_PERF_DATA:ministral-3:latest,262144,100,550,15.35,590.32,57.65
...
```

Changed files:
filename: integration/llm_image_test.go
patch: @@ -33,6 +33,9 @@ func TestVisionModels(t *testing.T) {
 			// Qwen 3 VL mixture of experts
 			model: "qwen3-vl:30b",
 		},
+		{
+			model: "ministral-3",
+		},
 	}
 
 	for _, v := range testCases {

filename: integration/utils_test.go
patch: @@ -38,6 +38,7 @@ var (
 
 	// Note: add newer models at the top of the list to test them first
 	ollamaEngineChatModels = []string{
+		"ministral-3",
 		"qwen3-coder:30b",
 		"gpt-oss:20b",
 		"gemma3n:e2b",
@@ -167,6 +168,7 @@ var (
 		"medllama2",
 		"megadolphin",
 		"minicpm-v",
+		"ministral-3",
 		"mistral-large",
 		"mistral-nemo",
 		"mistral-openorca",
@@ -270,6 +272,7 @@ var (
 		"mistral",
 		"qwen2.5",
 		"qwen2",
+		"ministral-3",
 		"mistral-nemo",
 		"mistral-small",
 		"mixtral:8x22b",