MiniMax M3.1 Flash Preview review: 15 text tasks, 3 coding tasks and a free trial
TOKRACE tested MiniMax-M3.1-Flash-Preview on 15 text tasks and three executable JavaScript tasks. Includes 1.127s median first content, original answers, coding checks, exact API settings and a quota-limited free trial.
Updated: 2026-10-03
Verdict: useful on small constrained tasks; broader claims remain untested
MiniMax M3.1 Flash Preview passed 15/15 short text tasks, with 1.127 seconds median time to first visible content, in this TOKRACE first look. It also generated three JavaScript functions that passed all 26 checks we wrote before requesting the answers. These results support trying it for exact JSON extraction, formatting and small function implementations. They do not establish repository-level coding performance or a general capability ranking.
There is no matched competitor, tool-call evaluation, image input or million-token stress test here. This is one time window, one exact API endpoint and default reasoning effort. TOKRACE now offers a quota-limited free trial without requiring your own API key.
Model identity and access
The official invocation guide lists MiniMax-M3.1-Flash-Preview, 1M-token context and multimodal capabilities, currently available through M Plan and MiniMax Code. This is a distinct ID from MiniMax M3; specifications and scores for M3 cannot be silently assigned to this preview.
Official docs list low, medium, high, xhigh and max effort, defaulting to max when omitted, with thinking always on. For OpenAI Chat Completions, the field is reasoning_effort; Responses uses a different field. See the Chat Completions documentation. These are documented capabilities, not all independently established by our tests.
On October 3, 2026 in Beijing time, both /v1/models and /v1/chat/completions returned HTTP 200 using the same credential. The catalog did not include the preview, while the completion returned the exact requested model ID. Catalog absence therefore did not mean this account could not call it. It also does not prove that every account has access.
For your own connection, use base URL https://api.minimax.io/v1/, model MiniMax-M3.1-Flash-Preview and a credential with access. TOKRACE injects its trial credential on the server.
Text test conditions and latency
We used suite tasks-2026-09-26.1, five cases each for JSON extraction, instruction following and grounded QA. Requests ran sequentially from 00:26:47 to 00:27:08 Beijing time on October 3, 2026, once per case, with temperature 0, max_tokens 2048, an empty system prompt and no effort override.
Measurements came from a local macOS client calling MiniMax's international endpoint through TOKRACE's existing streaming parser. They include waiting along this network path. We did not establish the provider datacenter location. These are not measurements from the Hong Kong standard benchmark node or total browser wait.
| Category | Passed / attempted | Median first content | Median completion |
|---|---|---|---|
| JSON extraction | 5 / 5 | 1.764 s | 1.805 s |
| Instruction following | 5 / 5 | 0.825 s | 0.887 s |
| Grounded QA | 5 / 5 | 1.662 s | 1.668 s |
Across all 15, median first content and completion both round to 1.127 seconds. Completion includes stream termination. These very short answers sometimes arrived together, so we avoid a misleading tokens-per-second headline and do not report small-sample P95.
The first extraction preserved Hangzhou as the current city, rejected the historic Beijing distraction and left email null. Prompt and output. Stable deduplication returned exactly B2,A1,C3,D4, without commentary. Evidence. The warehouse answer calculated nine usable items, selected Tuesday over the superseded Sunday plan and did not invent the manager. Evidence.
The cases are deliberately simple and structurally similar. A full pass here is not a guarantee on noisy documents or production inputs.
Executable coding checks
Three supplementary JavaScript tasks used temperature 0, max_tokens 4096 and default effort. All passed. First-content times were 8.133, 3.089 and 7.305 seconds respectively. The different output limit and task type mean these times should remain separate from the text aggregate.
| Task | Checks passed | Boundaries covered |
|---|---|---|
| Parse money into cents | 18 / 18 | Decimal accuracy, whitespace, invalid types and formats, maximum safe integer |
| Stable deduplication by id | 3 / 3 | Original identity/order, empty input, special keys and frozen input |
| Merge closed intervals | 5 / 5 | Unordered touching intervals, nesting, zero length, negatives, empty input; frozen arrays |
The money function validated input with a regular expression, used BigInt for cents and rejected values beyond the safe integer limit. It did not round an invalid three-decimal amount into an accepted input. Code and checks. Deduplication handled __proto__, constructor and empty IDs. The interval function was exercised on frozen input arrays. Deduplication · Intervals.
Checks ran in a separate JavaScript context without supplied credentials or network APIs and with an execution timeout. Results were judged by our predetermined checks. We did not test cross-file editing, dependency installation, tool calls or sustained agent tasks. These three functions cannot be converted into a SWE-bench score.
Free trial and unknown upstream cost
TOKRACE's existing limits apply: five anonymous base runs or fifteen after sign-in; a comparison round counts once even with multiple models. Provider rate limits and subscription exhaustion can affect availability.
M Plan usage rules describe five-hour and weekly subscription windows. We have not verified a separate per-token price for this preview. We therefore do not assign a zero token price, fabricate an invocation cost or include it in a price-performance ranking. The text responses reported 4,008 prompt tokens and 506 completion tokens. These are API usage fields, not reconciled invoices; absent reasoning-token details remain unknown.
Frequently asked questions
Is it better than MiniMax M3? There is no matched M3 test here, so this review cannot answer that. Compare your own workloads in the arena.
Did you test vision, long context or tools? No. Official descriptions do not replace those measurements.
Can thinking be disabled? Official docs say no. Lower reasoning_effort for shorter reasoning when using your own endpoint. This shared trial and review preserve the default.
Where can I try it? Use the rerun button below, or select MiniMax M3.1 Flash Preview in the arena. The model profile retains the exact identity and endpoint.
Original evidence
All 18 prompts and answers, timestamps and coding checks are retained below. This single-window first look leaves cross-window reliability, multimodality, long context and production load untested.
Download complete evidence (JSON)
extract-1 · Passed · 1.764s
2026-10-02T16:26:47.043Z · Prompt / completion tokens:267 / 19 · Finish reason:stop
Prompt
从以下资料提取联系信息。只输出一个 JSON 对象,恰好包含 name、age、city、email 四个字段;age 为数字,未提供的 email 为 null。不要 Markdown 或解释。 资料:林桐,28 岁,目前居住在杭州。未提供电子邮件。历史备注提到曾在北京出差,不是现居城市。
Original answer
{"name":"林桐","age":28,"city":"杭州","email":null}extract-2 · Passed · 0.941s
2026-10-02T16:26:48.952Z · Prompt / completion tokens:269 / 21 · Finish reason:stop
Prompt
从以下资料提取联系信息。只输出一个 JSON 对象,恰好包含 name、age、city、email 四个字段;age 为数字,未提供的 email 为 null。不要 Markdown 或解释。 资料:李明,36 岁,目前居住在成都。电子邮件为 li@example.test。历史备注提到曾在北京出差,不是现居城市。
Original answer
{"name":"李明","age":36,"city":"成都","email":"li@example.test"}extract-3 · Passed · 0.883s
2026-10-02T16:26:49.958Z · Prompt / completion tokens:266 / 19 · Finish reason:stop
Prompt
从以下资料提取联系信息。只输出一个 JSON 对象,恰好包含 name、age、city、email 四个字段;age 为数字,未提供的 email 为 null。不要 Markdown 或解释。 资料:陈夏,22 岁,目前居住在南京。未提供电子邮件。历史备注提到曾在北京出差,不是现居城市。
Original answer
{"name":"陈夏","age":22,"city":"南京","email":null}extract-4 · Passed · 1.805s
2026-10-02T16:26:51.028Z · Prompt / completion tokens:271 / 60 · Finish reason:stop
Prompt
从以下资料提取联系信息。只输出一个 JSON 对象,恰好包含 name、age、city、email 四个字段;age 为数字,未提供的 email 为 null。不要 Markdown 或解释。 资料:周舟,41 岁,目前居住在苏州。电子邮件为 zhou@example.test。历史备注提到曾在北京出差,不是现居城市。
Original answer
{"name":"周舟","age":41,"city":"苏州","email":"zhou@example.test"}extract-5 · Passed · 2.238s
2026-10-02T16:26:52.835Z · Prompt / completion tokens:267 / 54 · Finish reason:stop
Prompt
从以下资料提取联系信息。只输出一个 JSON 对象,恰好包含 name、age、city、email 四个字段;age 为数字,未提供的 email 为 null。不要 Markdown 或解释。 资料:吴雨,30 岁,目前居住在武汉。未提供电子邮件。历史备注提到曾在北京出差,不是现居城市。
Original answer
{"name":"吴雨","age":30,"city":"武汉","email":null}format-1 · Passed · 1.127s
2026-10-02T16:26:55.431Z · Prompt / completion tokens:241 / 9 · Finish reason:stop
Prompt
把以下编号去重并保持首次出现的顺序:B2,A1,B2,C3,A1,D4。只输出用英文逗号连接的编号,不要空格、标题或解释。
Original answer
B2,A1,C3,D4
format-2 · Passed · 0.887s
2026-10-02T16:26:56.558Z · Prompt / completion tokens:240 / 10 · Finish reason:stop
Prompt
仅输出 JSON 对象,且恰好包含 status 和 count 两个字段。status 的值必须为字符串 "ready",count 必须为数字 3。不要 Markdown、解释或额外字段。
Original answer
{"status":"ready","count":3}format-3 · Passed · 0.825s
2026-10-02T16:26:57.446Z · Prompt / completion tokens:234 / 13 · Finish reason:stop
Prompt
将数值 12、3、25、8 按从小到大排序。只输出 JSON 数组,元素为数字。不要解释或代码围栏。
Original answer
[3, 8, 12, 25]
format-4 · Passed · 0.761s
2026-10-02T16:26:58.332Z · Prompt / completion tokens:238 / 9 · Finish reason:stop
Prompt
按原顺序将 apple、pear、plum 转为英文大写,每行一个单词。总共三行,不要编号、标点、空行或解释。
Original answer
APPLE PEAR PLUM
format-5 · Passed · 0.772s
2026-10-02T16:26:59.253Z · Prompt / completion tokens:250 / 12 · Finish reason:stop
Prompt
提取下面三个工单号,保持顺序:工单 TX-103 已关闭;工单 TX-207 正在处理;工单 TX-309 待分配。只用英文竖线连接三个编号,不要空格或解释。
Original answer
TX-103|TX-207|TX-309
grounded-1 · Passed · 1.668s
2026-10-02T16:27:00.052Z · Prompt / completion tokens:293 / 65 · Finish reason:stop
Prompt
只根据以下材料回答。输出恰好包含 usable、nextDelivery、manager 三个字段的 JSON 对象,不要额外文字。usable 是可用件数(数字),nextDelivery 是下一次送货时间(字符串),材料未说明的信息用 null,不能猜测。 材料:北区仓库今天收到 12 件货物,其中 3 件损坏,不可使用。下一次送货安排在周二。仓库负责人姓名没有记载。旧计划曾写周日,已作废。
Original answer
{"usable":9,"nextDelivery":"周二","manager":null}grounded-2 · Passed · 1.662s
2026-10-02T16:27:01.721Z · Prompt / completion tokens:293 / 74 · Finish reason:stop
Prompt
只根据以下材料回答。输出恰好包含 usable、nextDelivery、manager 三个字段的 JSON 对象,不要额外文字。usable 是可用件数(数字),nextDelivery 是下一次送货时间(字符串),材料未说明的信息用 null,不能猜测。 材料:南区仓库今天收到 20 件货物,其中 4 件损坏,不可使用。下一次送货安排在周三。仓库负责人姓名没有记载。旧计划曾写周日,已作废。
Original answer
{"usable":16,"nextDelivery":"周三","manager":null}grounded-3 · Passed · 0.828s
2026-10-02T16:27:03.386Z · Prompt / completion tokens:293 / 15 · Finish reason:stop
Prompt
只根据以下材料回答。输出恰好包含 usable、nextDelivery、manager 三个字段的 JSON 对象,不要额外文字。usable 是可用件数(数字),nextDelivery 是下一次送货时间(字符串),材料未说明的信息用 null,不能猜测。 材料:东区仓库今天收到 18 件货物,其中 6 件损坏,不可使用。下一次送货安排在周四。仓库负责人姓名没有记载。旧计划曾写周日,已作废。
Original answer
{"usable":12,"nextDelivery":"周四","manager":null}grounded-4 · Passed · 1.331s
2026-10-02T16:27:04.215Z · Prompt / completion tokens:293 / 62 · Finish reason:stop
Prompt
只根据以下材料回答。输出恰好包含 usable、nextDelivery、manager 三个字段的 JSON 对象,不要额外文字。usable 是可用件数(数字),nextDelivery 是下一次送货时间(字符串),材料未说明的信息用 null,不能猜测。 材料:西区仓库今天收到 25 件货物,其中 5 件损坏,不可使用。下一次送货安排在周五。仓库负责人姓名没有记载。旧计划曾写周日,已作废。
Original answer
{"usable":20,"nextDelivery":"周五","manager":null}grounded-5 · Passed · 1.964s
2026-10-02T16:27:06.048Z · Prompt / completion tokens:293 / 64 · Finish reason:stop
Prompt
只根据以下材料回答。输出恰好包含 usable、nextDelivery、manager 三个字段的 JSON 对象,不要额外文字。usable 是可用件数(数字),nextDelivery 是下一次送货时间(字符串),材料未说明的信息用 null,不能猜测。 材料:中区仓库今天收到 16 件货物,其中 2 件损坏,不可使用。下一次送货安排在周一。仓库负责人姓名没有记载。旧计划曾写周日,已作废。
Original answer
{"usable":14,"nextDelivery":"周一","manager":null}Money parsing without rounding invalid inputs · Passed
2026-10-02T16:28:17.475Z · First content:8.133s · Checks:18
Prompt
写 JavaScript 函数 parseCents(value)。value 必须是字符串:允许两端空白;只接受非负十进制金额,整数部分至少一位,小数最多两位;拒绝指数写法、符号、千分位、Infinity、空串、超过两位小数。返回整数分数,超过 Number.MAX_SAFE_INTEGER 则返回 null。非法类型或格式返回 null。不能把非法值四舍五入成合法值。只输出函数代码,不要 Markdown 或解释。
Original code
function parseCents(value) {
if (typeof value !== "string") return null;
const match = value.trim().match(/^([0-9]+)(?:\.([0-9]{1,2}))?$/);
if (!match) return null;
const cents = BigInt(match[1]) * 100n
+ BigInt((match[2] || "").padEnd(2, "0"));
return cents > BigInt(Number.MAX_SAFE_INTEGER) ? null : Number(cents);
}Executable checks
const cases=[['0',0],[' 12.30 ',1230],['0.29',29],['1.2',120],['0001.02',102],['1.234',null],['-1',null],['+1',null],['1e3',null],['',null],['.5',null],['1.',null],['Infinity',null],['1,000',null],[null,null],[1,null],['90071992547409.91',9007199254740991],['90071992547409.92',null]]; for (const [input,want] of cases) if(parseCents(input)!==want) throw Error('Failed '+JSON.stringify(input));Stable deduplication with special property names · Passed
2026-10-02T16:28:26.113Z · First content:3.089s · Checks:3
Prompt
写 JavaScript 函数 uniqueById(items)。items 是对象数组,每个对象有字符串 id 字段。保留每个 id 首次出现的原对象和原顺序,不修改输入或任何对象;空数组返回空数组。id 可为 __proto__、constructor 或空字符串。只输出函数代码,不要 Markdown 或解释。
Original code
function uniqueById(items) {
const seen = new Set();
const result = [];
for (const item of items) {
if (!seen.has(item.id)) {
seen.add(item.id);
result.push(item);
}
}
return result;
}Executable checks
const a={id:'__proto__',value:1},b={id:'constructor'},c={id:''},d={id:'x'};const input=Object.freeze([a,b,{id:'__proto__'},c,{id:''},d,{id:'constructor'}]);const got=uniqueById(input);if(got.length!==4||got[0]!==a||got[1]!==b||got[2]!==c||got[3]!==d)throw Error('Wrong identity or order');if(uniqueById([]).length!==0)throw Error('Empty');if(input.length!==7||a.value!==1)throw Error('Mutation');Interval merging, touching intervals and immutability · Passed
2026-10-02T16:28:29.349Z · First content:7.305s · Checks:5
Prompt
写 JavaScript 函数 mergeIntervals(intervals)。输入为有限数字组成的闭区间 [start,end] 数组,保证 start<=end,输入可能乱序。返回按 start 排序的合并闭区间,相接区间也合并;不要修改输入或任何内层数组,空数组返回空数组。只输出函数代码,不要 Markdown 或解释。
Original code
function mergeIntervals(intervals) {
const sorted = intervals
.map(([start, end]) => [start, end])
.sort((a, b) => {
if (a[0] < b[0]) return -1;
if (a[0] > b[0]) return 1;
if (a[1] < b[1]) return -1;
if (a[1] > b[1]) return 1;
return 0;
});
const merged = [];
for (const [start, end] of sorted) {
if (merged.length === 0 || start > merged[merged.length - 1][1]) {
merged.push([start, end]);
} else if (end > merged[merged.length - 1][1]) {
const last = merged[merged.length - 1];
merged[merged.length - 1] = [last[0], end];
}
}
return merged;
}Executable checks
const cases=[[[[5,7],[1,3],[3,5]],[[1,7]]],[[[1,4],[2,3]],[[1,4]]],[[[0,0],[2,2]],[[0,0],[2,2]]],[[[-3,-1],[-2,0],[3,4]],[[-3,0],[3,4]]],[[],[]]];for(const [input,want] of cases){input.forEach(Object.freeze);Object.freeze(input);if(JSON.stringify(mergeIntervals(input))!==JSON.stringify(want))throw Error('Wrong merge');}