Skip to content

feat(MiniMax Node): Add standalone MiniMax vendor node (backport to release-candidate/2.18.x)#28868

Merged
DawidMyslak merged 1 commit into
release-candidate/2.18.xfrom
backport-28748-to-release-candidate/2.18.x
Apr 22, 2026
Merged

feat(MiniMax Node): Add standalone MiniMax vendor node (backport to release-candidate/2.18.x)#28868
DawidMyslak merged 1 commit into
release-candidate/2.18.xfrom
backport-28748-to-release-candidate/2.18.x

Conversation

@n8n-assistant
Copy link
Copy Markdown
Contributor

@n8n-assistant n8n-assistant Bot commented Apr 22, 2026

Description

Backport of #28748 to release-candidate/2.18.x.

Checklist for the author (@DawidMyslak) to go through.

  • Review the backport changes
  • Fix possible conflicts
  • Merge to target branch

After this PR has been merged, it will be picked up in the next patch release for release track.

Original description

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)

@n8n-assistant n8n-assistant Bot added automation:backport core Enhancement outside /nodes-base and /editor-ui n8n team Authored by the n8n team labels Apr 22, 2026
@n8n-assistant n8n-assistant Bot requested a review from DawidMyslak April 22, 2026 08:31
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.

No issues found across 21 files

Architecture diagram
sequenceDiagram
    participant UI as n8n Workflow Engine
    participant Node as MiniMax Node
    participant Router as NEW: Action Router
    participant Ops as NEW: Resource Operations
    participant Trans as NEW: Transport & Polling
    participant Ext as MiniMax API (External)
    participant Tool as AI Tool (Optional)

    UI->>Node: execute()
    Node->>Router: router.call()

    Note over Router,Ops: Routes by Resource (Text, Image, Video, Audio)
    Router->>Ops: NEW: execute(operation)

    alt Resource: Text (Chat)
        Ops->>Trans: apiRequest(POST /chat/completions)
        Trans->>Ext: Authorized HTTPS Request
        Ext-->>Ops: Response (content / tool_calls)
        
        loop NEW: Tool Iteration (maxToolsIterations)
            opt if finish_reason == 'tool_calls'
                Ops->>Tool: invoke(arguments)
                Tool-->>Ops: Tool Output
                Ops->>Trans: apiRequest(Submit Tool Results)
                Trans->>Ext: Next LLM Iteration
                Ext-->>Ops: Next Response
            end
        end
    
    else Resource: Video (Async)
        Ops->>Trans: apiRequest(POST /video_generation)
        Trans->>Ext: Create Video Task
        Ext-->>Ops: task_id
        
        loop NEW: pollVideoTask (Max 60 attempts)
            Ops->>Trans: GET /query/video_generation
            Trans->>Ext: Check Status
            Ext-->>Ops: Status (Processing / Success / Fail)
        end
        
        Ops->>Trans: NEW: getVideoDownloadUrl()
        Trans->>Ext: GET /files/retrieve?file_id=...
        Ext-->>Ops: download_url
    
    else Resource: Image or Audio
        Ops->>Trans: apiRequest(POST /...)
        Trans->>Ext: Generate Resource
        Ext-->>Ops: URL / Result Data
    end

    opt NEW: if download (Audio/Image/Video) == true
        Ops->>UI: helpers.httpRequest(GET URL)
        UI->>Ext: Fetch Binary Stream
        Ext-->>Ops: Buffer
        Ops->>UI: helpers.prepareBinaryData()
    end

    Ops-->>Router: INodeExecutionData[]
    Router-->>Node: returnData
    Node-->>UI: Final Node Output
Loading

@github-actions
Copy link
Copy Markdown
Contributor

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-heap-used-baseline 114.47 MB 114.27 MB 114.47 MB (σ 0.24) +0.2% +0.0%
memory-rss-baseline 282.69 MB 348.40 MB 289.80 MB (σ 40.90) -18.9% -2.5%

docker-stats

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

Idle baseline with Instance AI module loaded

Metric Current Latest Master Baseline (avg) vs Master vs Baseline Status
instance-ai-heap-used-baseline 186.60 MB 186.50 MB 186.43 MB (σ 0.25) +0.1% +0.1%
instance-ai-rss-baseline 386.41 MB 392.12 MB 368.35 MB (σ 22.82) -1.5% +4.9%
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

@DawidMyslak DawidMyslak merged commit eb70651 into release-candidate/2.18.x Apr 22, 2026
54 checks passed
@DawidMyslak DawidMyslak deleted the backport-28748-to-release-candidate/2.18.x branch April 22, 2026 09:15
@codecov
Copy link
Copy Markdown

codecov Bot commented Apr 22, 2026

Bundle Report

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

Detailed changes
Bundle name Size Change
editor-ui-esm 45.76MB 537 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/constants-*.js 225 bytes 3.14MB 0.01%
assets/users.store-*.js -2 bytes 1.06MB -0.0%
assets/usePostMessageHandler-*.js 74 bytes 137.93kB 0.05%
assets/useCanvasOperations-*.js 90 bytes 95.47kB 0.09%
assets/ProjectSettings-*.js 164 bytes 74.23kB 0.22%
assets/OAuthConsentView-*.js -14 bytes 9.99kB -0.14%

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

n8n-assistant Bot commented Apr 23, 2026

Got released with [email protected]

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

Labels

automation:backport 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.

1 participant