Skip to content

feat(MiniMax Node): Add standalone MiniMax vendor node#28748

Merged
DawidMyslak merged 7 commits into
masterfrom
node-4760-minimax-standalone-node
Apr 22, 2026
Merged

feat(MiniMax Node): Add standalone MiniMax vendor node#28748
DawidMyslak merged 7 commits into
masterfrom
node-4760-minimax-standalone-node

Conversation

@DawidMyslak
Copy link
Copy Markdown
Contributor

@DawidMyslak DawidMyslak commented Apr 20, 2026

Summary

Add a standalone MiniMax vendor node following the Moonshot/AlibabaCloud pattern with four resources:

  • Text > Message a Model — Chat completions with tool calling, token tracking, reasoning_split, system messages
  • Image > Generate an Image — Text-to-image with aspect ratios, multi-image, download toggle
  • Video > Generate From Text / Image — Async video generation with polling, multiple models, binary download
  • Audio > Text to Speech — 6 speech models, voice selection, emotion/speed/pitch controls

Loom Recording

Reuses the existing minimaxApi credential and icon from PR #28305.

Note: Model lists are currently static. Switching to dynamic loading via loadOptionsMethod is non-breaking and can be done once we have more details from the MiniMax team on their model listing API.

📋 Test Workflow JSON

Import into n8n and configure your MiniMax API credentials.

{"name":"MiniMax - Test All Actions","nodes":[{"parameters":{},"id":"trigger-main","name":"Run All Tests","type":"n8n-nodes-base.manualTrigger","typeVersion":1,"position":[0,780]},{"parameters":{"resource":"text","operation":"message","modelId":"MiniMax-M2.7","messages":{"values":[{"content":"What is the capital of France? Answer in one sentence.","role":"user"}]},"simplify":true,"options":{"temperature":0.7,"maxTokens":256,"hideThinking":true}},"id":"text-message-simple","name":"Text: Simple Message","type":"@n8n/n8n-nodes-langchain.minimax","typeVersion":1,"position":[400,0],"credentials":{"minimaxApi":{"id":"","name":"MiniMax API"}}},{"parameters":{"resource":"text","operation":"message","modelId":"MiniMax-M2.7","messages":{"values":[{"content":"You are a friendly pirate.","role":"assistant"},{"content":"Tell me about the weather today.","role":"user"}]},"simplify":true,"options":{"system":"You are a helpful assistant who always responds in a fun way.","temperature":0.9,"maxTokens":512,"hideThinking":true}},"id":"text-message-multiturn","name":"Text: Multi-turn + System","type":"@n8n/n8n-nodes-langchain.minimax","typeVersion":1,"position":[400,280],"credentials":{"minimaxApi":{"id":"","name":"MiniMax API"}}},{"parameters":{"resource":"text","operation":"message","modelId":"MiniMax-M2.7","messages":{"values":[{"content":"Explain quantum computing in 3 sentences.","role":"user"}]},"simplify":false,"options":{"hideThinking":false,"maxTokens":1024}},"id":"text-message-full","name":"Text: Full Response + Thinking","type":"@n8n/n8n-nodes-langchain.minimax","typeVersion":1,"position":[400,560],"credentials":{"minimaxApi":{"id":"","name":"MiniMax API"}}},{"parameters":{"resource":"text","operation":"message","modelId":"MiniMax-M2.5","messages":{"values":[{"content":"Say hello and tell me a joke.","role":"user"}]},"simplify":true,"options":{"temperature":0.5,"topP":0.9,"maxTokens":256}},"id":"text-message-m25","name":"Text: M2.5 Model","type":"@n8n/n8n-nodes-langchain.minimax","typeVersion":1,"position":[400,840],"credentials":{"minimaxApi":{"id":"","name":"MiniMax API"}}},{"parameters":{},"id":"tool-calculator","name":"Calculator","type":"@n8n/n8n-nodes-langchain.toolCalculator","typeVersion":1,"position":[400,1280]},{"parameters":{"resource":"text","operation":"message","modelId":"MiniMax-M2.7","messages":{"values":[{"content":"What is 1547 * 382 + 9281? Use the calculator tool to compute this precisely.","role":"user"}]},"simplify":true,"options":{"temperature":0.1,"maxTokens":512,"maxToolsIterations":5}},"id":"text-message-tools","name":"Text: With Calculator Tool","type":"@n8n/n8n-nodes-langchain.minimax","typeVersion":1,"position":[400,1120],"credentials":{"minimaxApi":{"id":"","name":"MiniMax API"}}},{"parameters":{"resource":"image","operation":"generate","prompt":"A cute golden retriever puppy playing in autumn leaves, photorealistic style","aspectRatio":"1:1","numberOfImages":1,"downloadImage":true,"options":{}},"id":"image-generate-download","name":"Image: Generate + Download","type":"@n8n/n8n-nodes-langchain.minimax","typeVersion":1,"position":[900,0],"credentials":{"minimaxApi":{"id":"","name":"MiniMax API"}}},{"parameters":{"resource":"image","operation":"generate","prompt":"A futuristic cityscape at sunset with flying cars, cyberpunk style","aspectRatio":"16:9","numberOfImages":2,"downloadImage":false,"options":{"promptOptimizer":true}},"id":"image-generate-url","name":"Image: URL Only + Optimizer","type":"@n8n/n8n-nodes-langchain.minimax","typeVersion":1,"position":[900,280],"credentials":{"minimaxApi":{"id":"","name":"MiniMax API"}}},{"parameters":{"resource":"image","operation":"generate","prompt":"A serene Japanese garden with cherry blossoms and a koi pond","aspectRatio":"9:16","numberOfImages":1,"downloadImage":true,"options":{"seed":42}},"id":"image-generate-seed","name":"Image: Portrait + Seed","type":"@n8n/n8n-nodes-langchain.minimax","typeVersion":1,"position":[900,560],"credentials":{"minimaxApi":{"id":"","name":"MiniMax API"}}},{"parameters":{"resource":"video","operation":"textToVideo","modelId":"MiniMax-Hailuo-2.3","prompt":"A cat stretching and yawning on a sunny windowsill, camera slowly zooms in","duration":6,"resolution":"768P","downloadVideo":true,"options":{"promptOptimizer":true}},"id":"video-t2v-download","name":"Video T2V: Download","type":"@n8n/n8n-nodes-langchain.minimax","typeVersion":1,"position":[1400,0],"credentials":{"minimaxApi":{"id":"","name":"MiniMax API"}}},{"parameters":{"resource":"video","operation":"textToVideo","modelId":"T2V-01-Director","prompt":"A drone shot flying over a mountain lake at sunrise [Pan right] [Push in]","duration":10,"resolution":"1080P","downloadVideo":false,"options":{}},"id":"video-t2v-url","name":"Video T2V: Director Model","type":"@n8n/n8n-nodes-langchain.minimax","typeVersion":1,"position":[1400,280],"credentials":{"minimaxApi":{"id":"","name":"MiniMax API"}}},{"parameters":{"resource":"video","operation":"imageToVideo","modelId":"MiniMax-Hailuo-2.3","imageInputType":"url","imageUrl":"https://cdn.hailuoai.com/prod/2024-09-18-16/user/multi_chat_file/9c0b5c14-ee88-4a5b-b503-4f626f018639.jpeg","prompt":"A mouse runs toward the camera, smiling and blinking","duration":6,"resolution":"768P","downloadVideo":true,"options":{}},"id":"video-i2v-url","name":"Video I2V: From URL","type":"@n8n/n8n-nodes-langchain.minimax","typeVersion":1,"position":[1400,560],"credentials":{"minimaxApi":{"id":"","name":"MiniMax API"}}},{"parameters":{"resource":"video","operation":"imageToVideo","modelId":"MiniMax-Hailuo-2.3","imageInputType":"binary","binaryPropertyName":"data","prompt":"The image comes to life with gentle animation","duration":6,"resolution":"768P","downloadVideo":false,"options":{}},"id":"video-i2v-binary","name":"Video I2V: From Binary","type":"@n8n/n8n-nodes-langchain.minimax","typeVersion":1,"position":[1400,840],"credentials":{"minimaxApi":{"id":"","name":"MiniMax API"}}},{"parameters":{"resource":"audio","operation":"textToSpeech","modelId":"speech-2.8-hd","text":"Hello! Welcome to the MiniMax text to speech demo. This is a test of the audio generation capabilities.","voiceId":"English_Graceful_Lady","downloadAudio":true,"options":{}},"id":"audio-tts-download","name":"Audio TTS: Download MP3","type":"@n8n/n8n-nodes-langchain.minimax","typeVersion":1,"position":[1900,0],"credentials":{"minimaxApi":{"id":"","name":"MiniMax API"}}},{"parameters":{"resource":"audio","operation":"textToSpeech","modelId":"speech-2.8-turbo","text":"Today is a wonderful day! The sun is shining and the birds are singing. Let us celebrate this beautiful moment together.","voiceId":"English_Graceful_Lady","downloadAudio":true,"options":{"speed":1.2,"volume":2,"pitch":3,"emotion":"happy","audioFormat":"wav","languageBoost":"English"}},"id":"audio-tts-options","name":"Audio TTS: All Options","type":"@n8n/n8n-nodes-langchain.minimax","typeVersion":1,"position":[1900,280],"credentials":{"minimaxApi":{"id":"","name":"MiniMax API"}}},{"parameters":{"resource":"audio","operation":"textToSpeech","modelId":"speech-2.6-hd","text":"This audio will not be downloaded. Only the URL will be returned for later use.","voiceId":"English_Graceful_Lady","downloadAudio":false,"options":{"audioFormat":"mp3"}},"id":"audio-tts-url","name":"Audio TTS: URL Only","type":"@n8n/n8n-nodes-langchain.minimax","typeVersion":1,"position":[1900,560],"credentials":{"minimaxApi":{"id":"","name":"MiniMax API"}}}],"connections":{"Run All Tests":{"main":[[{"node":"Text: Simple Message","type":"main","index":0},{"node":"Text: Multi-turn + System","type":"main","index":0},{"node":"Text: Full Response + Thinking","type":"main","index":0},{"node":"Text: M2.5 Model","type":"main","index":0},{"node":"Image: Generate + Download","type":"main","index":0},{"node":"Image: URL Only + Optimizer","type":"main","index":0},{"node":"Image: Portrait + Seed","type":"main","index":0},{"node":"Video T2V: Download","type":"main","index":0},{"node":"Video T2V: Director Model","type":"main","index":0},{"node":"Video I2V: From URL","type":"main","index":0},{"node":"Audio TTS: Download MP3","type":"main","index":0},{"node":"Audio TTS: All Options","type":"main","index":0},{"node":"Audio TTS: URL Only","type":"main","index":0},{"node":"Text: With Calculator Tool","type":"main","index":0}]]},"Calculator":{"ai_tool":[[{"node":"Text: With Calculator Tool","type":"ai_tool","index":0}]]},"Image: Generate + Download":{"main":[[{"node":"Video I2V: From Binary","type":"main","index":0}]]}},"active":false,"settings":{"executionOrder":"v1"},"meta":{"templateCredsSetupCompleted":true}}

Related Linear tickets

https://linear.app/n8n/issue/NODE-4760

Review / Merge checklist

  • I have seen this code, I have run this code, and I take responsibility for this code.
  • PR title and summary are descriptive. (conventions)
  • Docs updated or follow-up ticket created.
  • Tests included.
  • PR Labeled with Backport to Beta, Backport to Stable, or Backport to v1 (if the PR is an urgent fix that needs to be backported)

Add a full-featured standalone MiniMax vendor node with four resources:
- Text: Message a Model (with tool calling, reasoning_split, token tracking)
- Image: Generate an Image (text-to-image with download toggle)
- Video: Generate From Text and From Image (async polling, first-last-frame, subject-reference)
- Audio: Text to Speech (multiple voices, emotion, speed/pitch/volume controls)

Reuses existing minimaxApi credential and minimax.svg icon from the chat model sub-node.
Follows the established Moonshot/AlibabaCloud vendor node pattern.

Made-with: Cursor
@codecov
Copy link
Copy Markdown

codecov Bot commented Apr 20, 2026

Bundle Report

Changes will increase total bundle size by 37 bytes (0.0%) ⬆️. This is within the configured threshold ✅

Detailed changes
Bundle name Size Change
editor-ui-esm 45.77MB 37 bytes (0.0%) ⬆️

Affected Assets, Files, and Routes:

view changes for bundle: editor-ui-esm

Assets Changed:

Asset Name Size Change Total Size Change (%)
assets/worker-*.js 3.15MB 3.17MB 17586.03% ⚠️
assets/worker-*.js -3.15MB 17.9kB -99.43%
assets/constants-*.js 37 bytes 3.14MB 0.0%

@n8n-assistant n8n-assistant Bot added core Enhancement outside /nodes-base and /editor-ui n8n team Authored by the n8n team labels Apr 20, 2026
@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Apr 20, 2026

Performance Comparison

Comparing currentlatest master14-day baseline

Memory consumption baseline with starter plan resources

Metric Current Latest Master Baseline (avg) vs Master vs Baseline Status
memory-rss-baseline 348.28 MB 348.40 MB 289.80 MB (σ 40.90) -0.0% +20.2% ⚠️
memory-heap-used-baseline 114.64 MB 114.27 MB 114.47 MB (σ 0.24) +0.3% +0.1%

docker-stats

Metric Current Latest Master Baseline (avg) vs Master vs Baseline Status
docker-image-size-runners 386.00 MB 386.00 MB 392.13 MB (σ 11.18) +0.0% -1.6%
docker-image-size-n8n 1269.76 MB 1269.76 MB 1273.60 MB (σ 10.49) +0.0% -0.3%

Idle baseline with Instance AI module loaded

Metric Current Latest Master Baseline (avg) vs Master vs Baseline Status
instance-ai-heap-used-baseline 187.16 MB 186.50 MB 186.43 MB (σ 0.25) +0.4% +0.4% 🔴
instance-ai-rss-baseline 343.34 MB 392.12 MB 368.35 MB (σ 22.82) -12.4% -6.8% ⚠️
How to read this table
  • Current: This PR's value (or latest master if PR perf tests haven't run)
  • Latest Master: Most recent nightly master measurement
  • Baseline: Rolling 14-day average from master
  • vs Master: PR impact (current vs latest master)
  • vs Baseline: Drift from baseline (current vs rolling avg)
  • Status: ✅ within 1σ | ⚠️ 1-2σ | 🔴 >2σ regression

Sort dropdown options alphabetically per n8n eslint rules and
suppress false positive on URL containing lowercase 'id'.

Made-with: Cursor
@DawidMyslak
Copy link
Copy Markdown
Contributor Author

/size-limit-override

- Delete unused prepareBinaryPropertyList helper
- Fix dead link to MiniMax voice ID documentation

Made-with: Cursor
@codspeed-hq
Copy link
Copy Markdown

codspeed-hq Bot commented Apr 21, 2026

Merging this PR will degrade performance by 15.02%

❌ 1 regressed benchmark
✅ 31 untouched benchmarks
⏩ 20 skipped benchmarks1

⚠️ Please fix the performance issues or acknowledge them on CodSpeed.

Performance Changes

Benchmark BASE HEAD Efficiency
vm: Simple Property - small data 1.9 ms 2.2 ms -15.02%

Comparing node-4760-minimax-standalone-node (3870943) with master (345ce7f)

Open in CodSpeed

Footnotes

  1. 20 benchmarks were skipped, so the baseline results were used instead. If they were deleted from the codebase, click here and archive them to remove them from the performance reports.

@DawidMyslak DawidMyslak marked this pull request as ready for review April 21, 2026 11:22
Copy link
Copy Markdown
Contributor

@cubic-dev-ai cubic-dev-ai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

5 issues found across 21 files

Prompt for AI agents (unresolved issues)

Check if these issues are valid — if so, understand the root cause of each and fix them. If appropriate, use sub-agents to investigate and fix each issue separately.


<file name="packages/@n8n/nodes-langchain/nodes/vendors/MiniMax/actions/image/generate.operation.ts">

<violation number="1" location="packages/@n8n/nodes-langchain/nodes/vendors/MiniMax/actions/image/generate.operation.ts:118">
P2: The seed filter incorrectly drops a valid seed value (`0`), so an explicit seed of 0 is sent as omitted/random instead of deterministic.</violation>
</file>

<file name="packages/@n8n/nodes-langchain/nodes/vendors/MiniMax/actions/video/generate.i2v.operation.ts">

<violation number="1" location="packages/@n8n/nodes-langchain/nodes/vendors/MiniMax/actions/video/generate.i2v.operation.ts:300">
P2: Validate model compatibility before sending `last_frame_image`; unsupported model combinations are currently allowed and can cause avoidable API request failures.</violation>

<violation number="2" location="packages/@n8n/nodes-langchain/nodes/vendors/MiniMax/actions/video/generate.i2v.operation.ts:311">
P2: Restrict `subject_reference` to `MiniMax-Hailuo-2.3` before building the request body to prevent invalid model/option combinations.</violation>
</file>

<file name="packages/@n8n/nodes-langchain/nodes/vendors/MiniMax/actions/text/message.operation.ts">

<violation number="1" location="packages/@n8n/nodes-langchain/nodes/vendors/MiniMax/actions/text/message.operation.ts:339">
P2: Fail when a requested tool is not connected instead of sending an empty tool response.</violation>
</file>

<file name="packages/@n8n/nodes-langchain/nodes/vendors/MiniMax/actions/router.ts">

<violation number="1" location="packages/@n8n/nodes-langchain/nodes/vendors/MiniMax/actions/router.ts:45">
P2: Preserve richer error details in `continueOnFail()` instead of serializing only `error.message`.

(Based on your team's feedback about preserving rich error details in continueOnFail paths.) [FEEDBACK_USED]</violation>
</file>
Architecture diagram
sequenceDiagram
    participant User as n8n Workflow Engine
    participant Router as MiniMax Router
    participant Op as Resource Operations<br/>(Text/Image/Video/Audio)
    participant Transport as Transport Helper<br/>(Polling & Auth)
    participant MiniMax as MiniMax External API
    participant Tools as Connected AI Tools

    Note over User, MiniMax: NEW: MiniMax Standalone Vendor Node Flow

    User->>Router: execute() with Resource & Operation
    Router->>Router: NEW: Resolve resource handler

    alt Resource: Text (Chat)
        Router->>Op: execute(message)
        Op->>Transport: apiRequest('/chat/completions')
        Transport->>MiniMax: POST with auth & messages
        MiniMax-->>Transport: Response with choices/tool_calls
        
        loop Tool Iteration (maxToolsIterations)
            opt If finish_reason == 'tool_calls'
                Op->>Tools: NEW: invoke(arguments)
                Tools-->>Op: tool result
                Op->>Transport: apiRequest() with tool output
                Transport->>MiniMax: POST next turn
                MiniMax-->>Transport: Updated response
            end
        end
        Op-->>Router: Final text/simplified output
    
    else Resource: Video (Async Generation)
        Router->>Op: execute(textToVideo/imageToVideo)
        Op->>Transport: apiRequest('/video_generation')
        Transport->>MiniMax: POST prompt/image
        MiniMax-->>Transport: Returns task_id
        
        loop NEW: Polling (pollVideoTask)
            Transport->>Transport: sleep(15s)
            Transport->>MiniMax: GET /query/video_generation?task_id
            MiniMax-->>Transport: status (Processing/Success/Fail)
        end
        
        Op->>Transport: getVideoDownloadUrl(file_id)
        Transport->>MiniMax: GET /files/retrieve
        MiniMax-->>Transport: download_url
        Op-->>Router: videoUrl + metadata
        
    else Resource: Image/Audio (Direct)
        Router->>Op: execute()
        Op->>Transport: apiRequest()
        Transport->>MiniMax: POST parameters
        MiniMax-->>Transport: Response with URL/Data
        
        opt NEW: If download requested
            Op->>User: helpers.httpRequest(url, arraybuffer)
            User-->>Op: binary buffer
            Op->>User: helpers.prepareBinaryData()
        end
        Op-->>Router: JSON + Optional Binary
    end

    Router-->>User: Return INodeExecutionData[]
Loading

Reply with feedback, questions, or to request a fix. Tag @cubic-dev-ai to re-run a review, or fix all with cubic.

Comment on lines +208 to +211
stream: false,
output_format: 'url',
voice_setting: {
voice_id: voiceId,
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

because of hardcoded output_format: 'url', execution would always take this routeif (audioData.startsWith('http')) {- we should either add option or remove unused logic

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Agreed, removed the dead hex branch in 9e4d2dd.

Comment on lines +105 to +108

const body: IDataObject = {
model: 'image-01',
prompt,
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

so, only one model is supported for image generation? I wonder if it still worth to have this as options for consistency

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes, MiniMax currently only offers image-01 for image generation. Added it as a dropdown anyway in 9e4d2dd for consistency with other operations and to make it easy to add new models later.

Copy link
Copy Markdown
Member

@alexander-gekov alexander-gekov left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Works great! Also tested with AI Gateway and looks solid there as well!

…de, image model dropdown

- Fix seed=0 being incorrectly filtered out in image generation
- Remove unreachable hex decoding branch in TTS (output_format is always 'url')
- Add model dropdown for image generation instead of hardcoding 'image-01'

Made-with: Cursor
Copy link
Copy Markdown
Contributor

@michael-radency michael-radency left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

thanks for updates, LGTM 👍

@DawidMyslak DawidMyslak added this pull request to the merge queue Apr 22, 2026
Merged via the queue into master with commit 0295369 Apr 22, 2026
57 checks passed
@DawidMyslak DawidMyslak deleted the node-4760-minimax-standalone-node branch April 22, 2026 08:30
@n8n-assistant
Copy link
Copy Markdown
Contributor

n8n-assistant Bot commented Apr 22, 2026

Successfully created backport PR for release-candidate/2.18.x:

@n8n-assistant
Copy link
Copy Markdown
Contributor

n8n-assistant Bot commented Apr 22, 2026

Successfully created backport PR for release-candidate/2.17.x:

@n8n-assistant n8n-assistant Bot mentioned this pull request Apr 28, 2026
@n8n-assistant
Copy link
Copy Markdown
Contributor

n8n-assistant Bot commented Apr 28, 2026

Got released with n8n@2.19.0

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Backport to Beta Backport to Stable core Enhancement outside /nodes-base and /editor-ui n8n team Authored by the n8n team Released

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants