GPT Image 2.5 Flare & Sunburst are live on EvoLinkTry GPT Image 2.5
A five-position selector beside a shared reasoning and final-answer budget chamber
Tutorial

MiniMax M3.1 Flash Thinking Levels: Set and Check Effort

EvoLink Team
EvoLink Team
Product Team
October 19, 2026
9 min read
Set thinking depth explicitly, inspect the request your client sends, then judge the returned answer against one fixed task. MiniMax M3.1 Flash offers five levels: low, medium, high, xhigh and max. Its documented default is max, and thinking cannot be disabled.

This guide uses EvoLink Chat Completions as the main configuration path. The request is based on the current documentation and has not been submitted as a paid model call for this article. It gives you a request to adapt, a local way to inspect its response and a task with checkable requirements; it does not supply an invented successful run.

What do MiniMax M3.1 Flash thinking levels control?

MiniMax's invocation guide describes effort as thinking depth. It is not a choice of five models or a fixed token allowance. The output limit is a separate control.

Use the following as starting hypotheses for your own evaluation. The task assignments are editorial recommendations, not official optimal settings or guaranteed latency bands.

LevelPossible starting useEvidence to collect before changing it
lowA narrow transformation with explicit rulesRequired fields, format and boundary cases all pass
mediumA bounded repair with a known reproductionThe patch addresses the cause and passes its checks
highA task combining several dependenciesThe answer connects the evidence rather than inventing missing details
xhighA difficult case that still fails after input and tool problems are resolvedRepeating the task yields a useful improvement worth the expense
maxA hard case where a deeper attempt is justified, or a deliberate default-setting baselineAcceptance, total elapsed time and actual usage remain within your budget

Start with the task's failure cost and a setting you can compare consistently. If a screenshot is missing or a test runner cannot start, changing effort does not supply the missing evidence or tool. Resolve that gap first.

Use the field for your protocol

The official invocation reference distinguishes the fields below. This is a protocol map, not proof that every client or service implements every path identically.
ProtocolThinking-depth fieldReasoning representationOutput limit
Chat Completionsreasoning_effortreasoning_contentEvoLink recommends max_completion_tokens
Anthropic-compatible Messagesoutput_config.effortthinking content blockmax_tokens
Responsesreasoning.effortReasoning output itemmax_output_tokens
The complete example below uses only the EvoLink Chat Completions reference. For Messages, use the separate EvoLink reference. Confirm service support in its current documentation before translating a configuration into another protocol.

Send one explicit Chat Completions configuration

Prepare an EvoLink API key in the EVOLINK_API_KEY environment variable, a terminal with curl and Python 3, and a writable working directory for the response file. Use an account authorized to make the request. Running the following request can incur model charges.

The task is deliberately small: extract three ticket fields from supplied text. It lets you check answer formatting and required values before involving a repository or tools. Passing it does not establish coding-agent quality.

curl --silent --show-error --fail-with-body \
  'https://api.evolink.ai/v1/chat/completions' \
  -H "Authorization: Bearer ${EVOLINK_API_KEY:?Set EVOLINK_API_KEY first}" \
  -H 'Content-Type: application/json' \
  --data '{
    "model": "MiniMax-M3.1-Flash",
    "reasoning_effort": "low",
    "max_completion_tokens": 4096,
    "stream": false,
    "messages": [{
      "role": "user",
      "content": "Extract the ticket below. Return only a JSON object with exactly these string fields: ticket_id, status, priority. Do not add Markdown or invent values. Ticket: INC-1042. Status: open. Priority: high."
    }]
  }' \
  --output m31-flash-response.json
The endpoint is one of the hosts listed in the EvoLink reference. The 4096 limit is an illustrative test budget, not a recommended limit for every task. The generation budget includes reasoning and the final answer, so it can be exhausted before usable answer text appears. If you use an existing client, inspect its serialized request for the same model, setting and budget; its UI alone cannot show whether the adapter forwarded them.

Keep the request configuration and the response file together, with credentials excluded from any shared record. If curl reports an HTTP failure, inspect the error before applying the success-response checker below.

Five explicit settings lead to a transmitted request, separated response regions and final-answer inspection
Five explicit settings lead to a transmitted request, separated response regions and final-answer inspection
Conceptual illustration, not an actual model run.

Check the returned answer and the task separately

EvoLink's reference documents message.content separately from reasoning_content, plus usage and finish information. Inspect those fields rather than parsing reasoning text out of the answer. An optional or absent field should not crash your application.

Run this local inspection only after a successful request. It prints observed values and checks this example's exact answer requirements; it does not contain a fabricated model response.

python3 - <<'PY'
import json
from pathlib import Path

response = json.loads(Path("m31-flash-response.json").read_text())
choices = response.get("choices") or []
if not choices:
    raise SystemExit("No choices returned; inspect the response before scoring.")

choice = choices[0]
message = choice.get("message") or {}
answer = message.get("content")
finish = choice.get("finish_reason")
print("model:", response.get("model"))
print("finish_reason:", finish)
print("reasoning_present:", bool(message.get("reasoning_content")))
print("usage:", json.dumps(response.get("usage"), ensure_ascii=False))

if finish != "stop" or not isinstance(answer, str) or not answer.strip():
    raise SystemExit("Incomplete or unexpected completion; inspect before scoring.")

try:
    extracted = json.loads(answer)
except json.JSONDecodeError:
    raise SystemExit("Task failed: final answer is not a plain JSON object.")

expected = {"ticket_id": "INC-1042", "status": "open", "priority": "high"}
if extracted != expected:
    raise SystemExit("Task failed: keys or values do not match the supplied ticket.")

print("Task acceptance: PASS")
PY

For this non-streaming, text-only task, require a normal completion and the exact object. A tool-using or streamed application needs its own completion logic. Do not copy this small checker's termination rule into every agent loop.

A passing answer establishes the extraction result for that request. It does not prove the server's internal reasoning allocation, the optimal setting or reliability on new inputs. To verify client forwarding, inspect the outgoing request as well; reasoning text being present is not an echo of the effort setting.

Diagnose a slow or incomplete result in this order

SymptomCheck firstNext action
The request is rejected after changing modelsUnsupported thinking-off settings and protocol-specific field namesCompare the actual request against the chosen protocol's documentation
No final answer or a length-related terminationOutput budget and returned finish informationSeparate truncation from an incorrect answer; adjust the budget for a new recorded run
A valid answer takes too longNetwork timing, retries, tool time and the explicit settingMeasure model and application time separately before attributing the delay
The client shows low but behavior seems unchangedSerialized request, SDK version and configuration overridesConfirm the field reaches the service; do not infer a bug from latency alone
The answer is complete but wrongInput completeness, instructions and acceptance criteriaFix evidence or instruction problems before evaluating a higher level
The official guide rejects attempts to disable thinking, including effort: "none". Lower effort is the documented control to investigate instead. Exact errors and supported fields must still be checked on the service and protocol you use.

For budget-related failures, keep the original failure record. A larger budget may allow completion, but it is a new configuration and may change expense. Repeatedly increasing it without checking the answer's requirements obscures the source of failure.

Compare levels with the same task

Save the example input, then choose a second level to evaluate only after the first request and answer can be inspected. Keep the prompt, protocol, model, output limit and tooling fixed unless the purpose of the experiment is to change one of them.

Task revisionExplicit levelRequest field checkedAcceptanceTotal timeUsage/actual chargesRetries
Fill from your runSave the valueYes/no/unverifiedPassed/failed/unverifiedMeasuredRecordedCount

Repeat on representative inputs before selecting a default. Record failed attempts and avoid presenting one quick response as a general latency finding. A higher setting is worth adopting only if the improvement matters to your task and fits its expense and time limits.

Use the existing M3.1 Flash pricing section for current rates. Reconcile token usage with the actual charge rather than assigning a savings percentage to a level. EvoLink's unified gateway provides the model connection; your application decides when to escalate and how to handle a failed task.

FAQ

Is low equivalent to turning thinking off?

No. It is one of the supported depth settings. Do not migrate a thinking-disabled workflow by treating low as the same contract.

What if my client has no thinking-level selector?

Check whether its current provider configuration can send the required field. Inspect the request or use a documented direct API path to isolate the client layer. This guide does not claim that a particular client's issue has been fixed.

Does a successful response prove that the chosen level took effect?

It proves that the request completed at the transport level. Check what was sent and any service-provided validation. Without an explicit returned setting, response length or reasoning presence alone cannot establish internal allocation.

How do I know whether to raise effort or fix the prompt?

First make sure the input contains the evidence needed to answer, the instruction is unambiguous and the tools work. If the complete answer is still wrong under those conditions, compare another level on the same task and retain both records.

Sources

Documentation checked October 19, 2026. Examples explain documented configuration; no paid model requests or performance measurements were made for this article.

Connect AI models through one API

Compare models and current pricing, then follow the API documentation to integrate your chosen model.