Repository navigation
MiniMax-M3.1-Flash: Max effort sent as xhigh, stale minimax capabilities, empty agent vision #366
Description
MiniMax-M3.1-Flash goes live through the API on 2026-10-19 at noon EDT. Registry entry: AtomicBot-ai/atomic-chat-conf#29. The model works on current clients through the registry alone. The items below are app-side gaps that make it work worse than it could. They also affect MiniMax-M3. Traced on origin/main @ 5651cdc.
MiniMax API facts (https://platform.minimax.io/docs/api-reference/text-openai-api):
- Thinking cannot be switched off.
reasoning_efforttakeslow|medium|high|xhigh|max(documented for M3.1-Flash only) and defaults tomax.none, orthinking: {type: "disabled"}, returns 400. - Reasoning comes back separately. It arrives in
reasoning_contentand must be sent back unchanged in history, tool-call turns included. - Inputs. Images go in as
image_url, video asvideo_url.temperaturetakes values in [0, 2].
Already fine:
- The app never sends
none/disabledtominimax:canDisableReasoningis false. - The SDK parses
reasoning_contentand@ai-sdk/openai-compatiblesends it back on assistant messages. - Chat sends no temperature to cloud providers.
Worth fixing
-
UI "Max" is sent as
reasoning_effort: "xhigh".CLOUD_EFFORT_VALUE.max = 'xhigh'lives inweb-app/src/lib/reasoning-effort.ts:303-310, and onlymoonshotpasses the level through (cloudReasoningEffortValue,:324). As a result, MiniMax's own defaultmaxcannot be reached from the app. Suggested fix: pass the level through forminimaxas formoonshot, and add a case toweb-app/src/lib/__tests__/reasoning-effort.test.tsnext to the moonshotmaxcase (~:333). Before applying it to M2.x/M3, check item 5 of the smoke check in the registry PR, which tests whether those models acceptmax. Today they getlow…xhighwith no per-model gating. -
Hard-coded
minimaxcapabilities know only M2.x. The list is inweb-app/src/constants/models.ts:1050. Three paths go throughgetModelCapabilities, and each creates an M3 or M3.1-Flash entry with only['completion']:- Refresh (
lib/refresh-provider-models.ts:98-106;minimaxhas nosupports_model_listing: false); - Add Model (
containers/dialogs/AddModel.tsx:54); - loopback auto-load (
routes/settings/providers/$providerName.tsx:742).
That entry has no tools, no image button and no agent vision. Registry capabilities never overwrite a saved entry (
hooks/useModelProvider.ts:140-149), so it stays broken. Suggested fix: addMiniMax-M3andMiniMax-M3.1-Flashtomodels,supportsStreaming,supportsToolCallsandsupportsImagesthere. - Refresh (
-
Agent image description will likely come back empty.
vision_payloadinsrc-tauri/src/core/agent/openai_client.rs:766-810sendsmax_tokens: VISION_MAX_TOKENS = 1024and noreasoning_effort. MiniMax then thinks atmax, which can use up the whole budget, so the call fails with "vision response did not contain message content". Suggested fix: for catalogue cloud reasoning providers, send the lowest effort with the vision call and/or a larger budget.
Minor, not blocking
- Effort defaults differ between chat and agent. With default settings (
disableReasoning: true), chat sendslowwhile the agent sendsmedium:buildAgentReasoningRequestmaps onlylevel === 'off'tolow(reasoning-effort.ts:429). - Video can't be sent. Non-image file parts are dropped in
custom-chat-transport.ts:186-217, so video input, which the model supports, is unreachable. - Latent stream crash. The SDK's
reasoning_contentstream andextractReasoningMiddleware(model-factory.ts:1470) both use the idreasoning-0. A response that mixedreasoning_contentwith<think>incontentwould break the stream. M3.1-Flash is documented not to do this.
Activity