Skip to content

Mistral Large 4

Mistral Large 4 is Mistral's open-weight model that combines instruction following, reasoning and tool-using agent work in a single model. On LLMTR it is called through /v1/chat/completions; it takes text and image input and returns text.

Model Context Max output
mistral/mistral-large-4 524,288 262,144
Terminal window
curl "$LLMTR_BASE_URL/v1/chat/completions" \
-H "Authorization: Bearer llmtr-your_key" \
-H "Content-Type: application/json" \
-d '{
"model": "mistral/mistral-large-4",
"messages": [
{ "role": "user", "content": "Find the race condition in this function." }
],
"max_tokens": 4096
}'
from openai import OpenAI
client = OpenAI(base_url="https://llmtr.com/v1", api_key="llmtr-your_key")
response = client.chat.completions.create(
model="mistral/mistral-large-4",
messages=[{"role": "user", "content": "Find the race condition in this function."}],
max_tokens=4096,
)
print(response.choices[0].message.content)
print(response.usage)

The model is offered on two dated price cards. The switch is automatic; the card in effect when the request is processed applies.

Model Period Input / Cache read / Output ($/1M)
mistral/mistral-large-4 Until 20 October 2026, 00:00 UTC 0.68 / 0.07 / 2.09
mistral/mistral-large-4 From 20 October 2026, 00:00 UTC 1.36 / 0.14 / 4.18

20 October 2026, 00:00 UTC is 03:00 Turkey time. Reasoning tokens are billed at the output price.

If you send nothing, the model reasons before it answers. The reasoning trace is returned in reasoning_content and the final answer in content.

Reasoning tokens are counted in completion_tokens and billed as output; your max_tokens covers the reasoning and the answer together. A response that ends with finish_reason: "length" is incomplete: raise max_tokens or turn reasoning off.

The model accepts two levels:

Level When
none Reasoning off. Short, cheap answers, classification, format conversion.
high Hard problems, multi-step analysis.

You can send the level in any of three ways:

{ "model": "mistral/mistral-large-4:none", "messages": [{ "role": "user", "content": "What is 17 + 25? Number only." }] }
{ "model": "mistral/mistral-large-4", "reasoning_effort": "high", "messages": [{ "role": "user", "content": "Find the deadlock risk in this schema." }] }
{ "model": "mistral/mistral-large-4", "reasoning": { "effort": "none" }, "messages": [{ "role": "user", "content": "What is 17 + 25? Number only." }] }

Controls that do not work on this model:

  • The minimal, low, medium, xhigh and max levels return 400 invalid_request; the error message lists the two accepted levels.
  • "reasoning": true and "reasoning": false return 400 invalid_request. To turn reasoning off, send reasoning_effort: "none".
  • include_reasoning is not applied: the field is removed from the request and reported in llmtr_dropped_parameters in the response. Whenever the model reasoned, the trace is returned in reasoning_content.

For the general rules on levels, see Reasoning Effort.

In multi-turn conversations, send earlier assistant messages back as you received them, reasoning_content included. The model reads its earlier reasoning from that field; in tool-calling loops, consistency across turns depends on it. Replayed reasoning is billed as input tokens. If you remove the field you spend fewer tokens, but the model no longer knows what it decided in the earlier turn.

Images are sent as image_url parts; base64 data URLs and https:// addresses are accepted.

Terminal window
curl "$LLMTR_BASE_URL/v1/chat/completions" \
-H "Authorization: Bearer llmtr-your_key" \
-H "Content-Type: application/json" \
-d '{
"model": "mistral/mistral-large-4",
"reasoning_effort": "none",
"messages": [
{
"role": "user",
"content": [
{ "type": "text", "text": "What does the error message in this screenshot say?" },
{ "type": "image_url", "image_url": { "url": "data:image/png;base64,iVBORw0KGgo..." } }
]
}
],
"max_tokens": 512
}'

An https:// address is downloaded by the provider itself, and it may not be able to reach every address. When an address cannot be downloaded the request fails with 400; in that case send the image as a base64 data URL.

There is no document (PDF), audio or video input on this model: file_url, input_audio and video_url parts return 400 unsupported_input.

Tool calling is supported. For tool_choice, "auto", "none" and a named function work. The model can return more than one tool call in a single response; handle the whole tool_calls array or send parallel_tool_calls: false.

tool_choice: "required" is not available on this model. The request is refused with 400 invalid_request, and error.details.reason carries tool_choice_required_unsupported. To make a tool call mandatory, name the function:

Terminal window
curl "$LLMTR_BASE_URL/v1/chat/completions" \
-H "Authorization: Bearer llmtr-your_key" \
-H "Content-Type: application/json" \
-d '{
"model": "mistral/mistral-large-4",
"reasoning_effort": "none",
"messages": [{ "role": "user", "content": "Fetch order 12345." }],
"tools": [{
"type": "function",
"function": {
"name": "lookup_order",
"description": "Fetches an order by its order number",
"parameters": {
"type": "object",
"properties": { "orderId": { "type": "string" } },
"required": ["orderId"]
}
}
}],
"tool_choice": { "type": "function", "function": { "name": "lookup_order" } },
"max_tokens": 512
}'

If you have several tools and the model should decide which one to call, use "auto" and say in the prompt when the tool should be used. See Tool Calling for details.

response_format accepts both json_object and json_schema; you can send strict: true with json_schema.

{
"response_format": {
"type": "json_schema",
"json_schema": {
"name": "capital",
"strict": true,
"schema": {
"type": "object",
"properties": {
"country": { "type": "string" },
"capital": { "type": "string" }
},
"required": ["country", "capital"],
"additionalProperties": false
}
}
}
}

Repeated prompt prefixes are cached automatically; you do not need to send a separate parameter. Tokens read from the cache are reported in usage.prompt_tokens_details.cached_tokens and billed at the cache read price instead of the input price.

A cache hit is not guaranteed and may not come on the first repeat of the same prefix. If you work with a long, fixed system prompt, keep that prefix byte-for-byte identical in every request.

stream: true is supported. The reasoning trace streams in delta.reasoning_content and the answer in delta.content. Send stream_options: { "include_usage": true } and usage arrives in the final chunk.

  • Context is 524,288 tokens.
  • Output is at most 262,144 tokens. A higher max_tokens is refused with 400.
  • temperature must be between 0 and 1.5. A higher value fails with 422.
  • Do not send seed or user. A request that carries either fails with 422.
  • There is no input other than text and images.