/render#
/render generates a short video with its own synced audio from a text description. It is the only command that produces a moving result, and the audio is not pasted on afterwards -- the model writes picture and sound together from the same prompt.
/render prompt: a paper boat drifting down a rain-filled gutter, soft rain ambience
Like every generation command it works in servers, in DMs, and through a user install in servers where Eimi is not added. It shares the access rules, the 15-job concurrent limit and the queue card with /imagine.
If you would rather point at a picture that is already in the channel, use the animate right-click menu instead. It feeds the same pipeline with fewer knobs.
The model#
Everything runs through MiniMax H3, a joint video-and-audio model. Output is MP4 at 24 fps with the audio track baked in.
H3 is easily the most expensive thing Eimi does. It is one model on one home GPU, and a render takes the whole card for as long as it runs (see Why it is slow). Budget accordingly, and expect the feature to be switched off from time to time.
The three modes#
Which mode you get is decided entirely by what you attach. There is no mode parameter.
| Mode | How you trigger it | What H3 does | Use it when |
|---|---|---|---|
| Text to video | Prompt only | Invents the whole clip from your description | You want something that does not exist yet, or you do not care about matching an existing image |
| First / last frame | first_frame, optionally plus last_frame |
Starts the clip on your image. With a last_frame as well, it interpolates the motion between the two |
You already have the picture and want it moving, or you want a controlled A-to-B move |
| Reference | reference1 to reference3 |
Treats your images as style, subject and content guidance rather than as literal frames | You want a character, outfit or look carried into a new scene that your images do not show |
Locally, reference mode loads a different H3 model file from the other two modes. That is why the two cannot be combined, and why a reference render makes the GPU reload from scratch even if the previous job was also a render.
Frames and references are separate modes
You cannot mix them. Attaching a first_frame and a reference in the same command is rejected with Pick One Mode / Use first/last frame OR reference images, not both -- they're separate H3 modes.
A last_frame on its own is also rejected: Missing First Frame / `last_frame` needs a `first_frame` too -- H3 interpolates the motion between them.
Text to video#
The plain path. Everything in the clip comes out of your prompt, including the sound. This is the mode most affected by enhance, because H3 has a specific prompt format and a bare sentence uses very little of it.
First / last frame#
first_frame pins the opening frame. The clip then moves away from it, so anything you want preserved has to be re-stated in the prompt -- H3 is not obliged to keep the subject on model for the whole clip.
Adding last_frame changes the job from "start here and improvise" to "get from here to there in N seconds". Two frames that are far apart in a short clip produce a fast, sometimes rubbery move. Give it more seconds or pick closer frames.
Attaching a first_frame also changes the defaults: with aspect and resolution left alone, the clip inherits the frame's shape and its pixel count (then gets tier-capped). This mirrors /edit.
Reference#
Reference mode is the "keep this thing, change everything else" path. Three slots are exposed on the command. Locally the graph is wired for up to nine and the cloud API accepts nine as well, but three is what you can actually pass.
References are guidance, not frames. None of your images will appear verbatim in the output.
Multi-shot chaining#
If enhance is on, the local backend is live, and your prompt explicitly asks for separate shots (first shot ... second shot, scene 2, then a shot of ..., three shots), the enhancer splits the idea into an ordered list and Eimi chains them into one continuous clip, carrying motion and audio across each join.
| Detail | Value |
|---|---|
| Maximum shots | 4, or the exact number you asked for if you stated one |
| Duration | duration becomes the length of each shot, not the total |
| Overlap trimmed at each join | 22 frames |
| Availability | Local backend only, and only with enhance on |
The result card's parameters line shows 3 shots and similar when this happens. Nothing else in the command changes.
Note
This triggers off wording, not a switch. "A fight scene" is one shot no matter how busy it is. "Two scenes total" is two.
Local and cloud backends#
There are two ways H3 can run, and the maintainer picks which one is live from the admin panel. You do not choose per job.
| Local (the default) | API (MiniMax's cloud) | |
|---|---|---|
| Where it runs | Eimi's own GPU, through ComfyUI | MiniMax's servers |
| Who can use it | Anyone with bot access | VIP and admin only |
| Model build | A quantised, pruned build of H3 that fits a single consumer card | MiniMax's own hosted H3 |
| Aspect ratios | Any W:H ratio or WxH pixel size, snapped to a multiple of 32 |
Snapped to the nearest of six fixed ratios: 16:9, 21:9, 4:3, 1:1, 3:4, 9:16 |
| Resolution | Your megapixel target, longest side capped at 2560 px | Snapped to 768P (2.0 MP or under) or 2K (above 2.0 MP) |
| Shortest clip | 1 second | 4 seconds -- anything shorter is raised |
| Content filter | None | MiniMax's own, and it refuses things |
| Multi-shot | Yes | No |
| Rough speed | About 60 seconds of wall time per 1 second of clip at 0.7 MP, scaling with megapixels | Roughly 35 seconds plus 6 seconds per second of clip, plus more at 2K |
| Give-up point | 1 hour | 15 minutes |
| Cost | Electricity and everyone else's queue time | Real money, billed to the maintainer |
The API backend is VIP and admin only
While the backend is set to API, a regular user who runs /render gets VIP Only / API video rendering (MiniMax H3) is available to VIP members only. If the maintainer has not configured a MiniMax key, everyone gets Not Configured / The MiniMax API key isn't set up yet. Ask an operator.
The local backend has no such gate. If /render suddenly starts refusing you, the backend was probably flipped rather than your access being revoked.
Cloud renders are billed to the maintainer's personal MiniMax account. That is the entire reason for the gate, and the reason the backend gets switched off again without notice.
Telling which one is live#
- The parameters line on the card. Cloud jobs carry an
apitag and a resolution tier (768Por2K). Local jobs carry neither. - The progress bar. On the cloud path the bar picks up a short phase label after the percentage:
queued,preparing,generating, or whatever status MiniMax reports. Local renders show a bare bar. - The details panel names the job
render (api)orrender (local). - The wait. A 5-second clip is about a minute on the cloud and several minutes locally.
The cloud content filter#
The cloud path is moderated and the local path is not. A refusal comes back through the normal error card as:
MiniMax flagged your prompt as not allowed (their content policy).
Try rephrasing it, or use the local backend for uncensored generation.
Named real people, recognisable characters and brands are the usual triggers. There is no appeal and no retry that helps -- rephrase, or wait for the local backend to come back.
All 11 parameters#
Only prompt is required.
| Parameter | Type | Default | What it does |
|---|---|---|---|
prompt |
text (required) | -- | The scene, the action, and any audio you want |
duration |
number | 3 | Clip length in seconds |
aspect |
text | 16:9, or your first/last frame's shape |
Any W:H ratio or WxH pixel size |
resolution |
text (autocomplete) | 1.0 MP, or derived from your frame | Output size in megapixels |
first_frame |
attachment | -- | Start the video on this image |
last_frame |
attachment | -- | End the video on this image. Needs first_frame |
reference1 |
attachment | -- | Reference image for style, subject or content guidance |
reference2 |
attachment | -- | Second reference image |
reference3 |
attachment | -- | Third reference image |
enhance |
true/false | from your AI features setting | Rewrites your prompt into MiniMax H3's timeline format with AI |
seed |
number | random | Seed for reproducible results |
prompt#
The only required parameter, and the one that carries the most weight, because H3 writes the soundtrack from the same sentence it draws the picture from.
- Audio lives in the prompt. "A market street at dawn" gets you a mostly quiet clip. "A market street at dawn, distant chatter and a single bicycle bell" gets you the bell. Ambience, music, footsteps, impacts and speech all go here.
- Describe motion, not just appearance. A still description gives you a nearly still clip. Say what moves and how the camera moves with it.
- Dialogue works but needs asking for. H3 will not invent speech unless you request it. If you want a line spoken, say so and quote the line.
- On-screen text goes in double quotes. That is the convention H3's prompt format uses, and the enhancer follows it.
There is no negative prompt on /render.
duration#
Clip length in seconds. Default 3.
The value is clamped to 1-15 first, then capped again by your tier (see Tier caps), then translated into a frame count. It is not exact: H3's latents live on a fixed frame grid, so the frame count is rounded up to the next valid value and the delivered clip can run slightly long. Ask for 3 seconds and you get 3.04. Ask for 5 and you get 5.17. The card reports the real length.
On the cloud backend the floor is 4 seconds instead of 1.
Short cloud clips are silently lengthened
The cloud API will not make a clip shorter than 4 seconds. Ask for 2 and you get a 4-second clip, but the card still says 2 seconds. This only affects the API backend.
Duration is the single biggest lever on how long you wait and how large the file is. Both scale roughly linearly with it.
aspect#
Two grammars, the same ones /imagine accepts:
| Form | Example | What happens |
|---|---|---|
| Ratio | 16:9, 9:16, 2.35:1 |
Sized to hit your megapixel target at that shape, then snapped to a multiple of 32 |
| Pixel size | 1280x720 |
The literal size is honoured (snapped to /32). Your resolution is ignored |
| Preset word | landscape, portrait, square, ultrawide, standard |
Shorthand for 16:9, 9:16, 1:1, 21:9, 4:3 |
Ratios more extreme than 32:1 are clamped, and the longest side is capped at 2560 px locally, so a very wide pick lands a little under its megapixel target.
Anything else gives Invalid Aspect Ratio / `{x}` isn't a ratio I understand. Use `W:H` like `16:9`, `9:16`, or `2.35:1`, or a pixel size like `1280x720`.
If you attached a first_frame and left aspect alone, the clip takes that frame's exact shape.
On the cloud backend none of this precision survives: your ratio is matched to the nearest of the API's six fixed ratios, and when you attach any image the API derives the orientation from the image and ignores aspect entirely.
resolution#
A megapixel target, not a pixel size. The autocomplete offers only the tiers your tier is allowed:
| Choice | Who sees it |
|---|---|
0.4 MP (draft, fastest) |
Everyone |
0.7 MP (low) |
Everyone |
1.0 MP (≈768P) |
VIP and admin |
3.7 MP (≈2K, slowest) |
VIP and admin |
You can type a value by hand instead of picking one. Typed values are clamped to 0.1-4.0 and then snapped to your tier, not rejected -- there is no error for asking too big. On the cloud backend the value snaps again to 768P (2.0 MP or under) or 2K (above 2.0 MP).
The nominal default is 1.0 MP, so in practice a regular user who leaves resolution alone gets 0.7 MP after the tier snap.
Cost scales with megapixels roughly as it does with duration, and the two multiply. A 15-second 3.7 MP clip is not a slightly bigger job than a 3-second 0.4 MP one, it is an enormously bigger one.
first_frame#
An image that becomes the opening frame of the clip. Switches the job into first/last-frame mode.
Also acts as a default for aspect and resolution when you have not set them: the clip inherits the frame's proportions and its pixel count. Anything you type wins over the inherited value.
last_frame#
An image that the clip ends on. Requires first_frame -- on its own it is rejected, because H3 interpolates between the two rather than working backwards from one.
With both frames set, the prompt describes the journey rather than the destination.
reference1, reference2, reference3#
Up to three images used as style, subject and content guidance. Switches the job into reference mode, which cannot be combined with frames.
The slots are not ranked -- there is no "primary" reference. Fill however many you have.
enhance#
Rewrites what you typed into H3's own T2VA timeline format before generating. Defaults to your ai_features setting in /settings.
The rewrite produces three fields rather than a sentence:
| Field | What it carries |
|---|---|
integrated_multimodal_description |
The visual timeline: style, opening composition, what happens, how the camera moves |
overall_soundscape |
Ambient sound, physical action sound, non-verbal human sound |
non_diegetic_music |
Background score only, or N/A |
That structure is most of why enhance matters more here than on the image commands. H3 was trained on this format, and a bare sentence leaves the soundscape and score fields empty.
Enhancement is tried on Gemini first and falls back to the local LLM. It runs inside the queue worker when your job starts, not when you press enter, so it does not delay the queue card. It is also what enables multi-shot chaining.
Turn it off when you have already written a proper H3-format prompt, or when you want the exact wording you typed and nothing else.
seed#
Fixes the noise. Same prompt, same settings, same seed gives the same clip on the local backend. Out-of-range values (below 0 or above 4294967295) are replaced with a random one rather than rejected.
Leaving it off means every 🔄 re-roll genuinely differs. Setting it explicitly is how you change one thing at a time.
The draft-then-commit loop
Video is slow enough that guessing is expensive. Find your prompt at 0.4 MP and 2 or 3 seconds until the motion and audio are what you wanted, note the seed from the details panel, then re-run the same seed at the length and size you actually want.
Tier caps#
Duration and resolution are limited by who you are, not by which backend is live. Since the cloud backend is VIP-only anyway, the caps only ever bite on the local path.
| Tier | Resolution tiers offered | Maximum duration |
|---|---|---|
| Regular user | 0.4 MP, 0.7 MP |
10 seconds |
| VIP and admin | the above, plus 1.0 MP and 3.7 MP |
15 seconds |
Disallowed picks are quietly snapped down, never refused. Ask for 15 seconds at 3.7 MP as a regular user and you get 10 seconds at 0.7 MP with no complaint, no warning and no note on the card. The only way to see what actually ran is the card's parameters line and the details panel.
The caps exist because a long, large render occupies the only GPU for a long time and nobody else's jobs run while it does. They are a queue-fairness measure, not a paywall.
Attaching images#
| Rule | Detail |
|---|---|
| Must be images | A non-image attachment gives Invalid Attachment / `{filename}` isn't an image. Frames and references must be images. |
| Frames or references, never both | See the three modes |
last_frame needs first_frame |
Rejected otherwise |
| Reference slots | Three exposed, three is the practical maximum |
| Odd formats | On the local backend every frame and reference is converted to a plain single-frame PNG first, so exotic stills decode and animated WebP or APNG get flattened to their first frame |
| Cloud path | Your Discord attachment URLs are handed to MiniMax, which fetches them server-side. Nothing is converted |
| Upload trouble | Upload Failed / Couldn't hand one of your images to the render backend. Try again. |
Attaching anything makes Eimi acknowledge the command before doing the work, so that reading and uploading your files cannot time the interaction out. A short pause before the queue card appears is normal and does not mean anything is wrong.
What you get back#
| Format | MP4, 24 fps, audio track included |
| Player | Discord's inline video player |
| Duration accuracy | Rounded up to H3's frame grid, so the clip is equal to or slightly longer than you asked |
| Live preview frames | Off, always |
| Give-up point | 3600 seconds (1 hour) on the local backend, against 600 seconds for every other job type. 900 seconds (15 minutes) on the cloud |
No preview images while it renders
Every other command drips a live preview into the card as it goes. Render jobs cannot: H3's combined video-and-audio latent crashes the preview step, so previews are forced off for /render regardless of your show_previews setting. You get the progress bar and nothing else.
The bar itself is real, but coarse. A local render samples in 20 steps, so it advances in 5% jumps with a long, silent gap between each one. A multi-shot chain labels its progress Shot 1/3... 12/20 and spans the whole chain rather than restarting per shot. The cloud path drives its bar from an estimate and overrides it whenever MiniMax reports a real percentage.
If the clip is too big for Discord#
Eimi knows the file size, the clip length and your server's live upload limit before it sends anything, so there is no upload-and-retry loop. Instead there is a three-rung ladder:
| Rung | Condition | What you get |
|---|---|---|
| 1 | The file already fits | Sent as-is, inline |
| 2 | Over the limit, and ffmpeg is available | One re-encode pass at a bitrate computed to land at about 92% of the limit, then sent inline |
| 3 | Over the limit and rung 2 cannot help | The card arrives with no file and a warning line |
Rung 2 gives up rather than producing mush: it reserves 64 kbps for the audio, and if the video bitrate that leaves would fall below 120 kbps it declines. Long clips at large sizes hit that wall.
The rung 3 message reads:
⚠️ clip is 31.4MB, over this server's 10MB upload limit.
try a shorter duration or smaller resolution.
The limit quoted is your server's real current one, which rises with boost level, and is 10 MB when Eimi cannot determine it. Shortening the clip helps more than shrinking it, because bitrate budget is a function of duration.
The result card#
Deliberately thin. Most of the buttons on an image card mean nothing for an MP4:
| Button | What it does |
|---|---|
| 🔄 | Re-roll -- same settings, new seed |
| 🔍 | Details -- the full parameter and timing dump |
| 🗑️ | Delete the result |
| 📤 | Replaces 🗑️ on private results, and re-posts the clip publicly |
No ⬆️ upgrade, no 🎲 remix, no 🎨 edit, no ✨ detailer. A re-roll re-reads your server's upload limit at the time you click, so re-rolling in a different server can change the size ladder outcome.
The parameters line above the video shows 🎬 followed by the duration, the shot count when there is more than one, the aspect ratio when it is not 16:9, clickable links back to any frames or references you attached, the api tag and resolution tier on cloud jobs, and your seed if you set one.
Why it is slow#
Worth understanding, because it explains most of the odd behaviour around /render.
- The local H3 stack does not share the GPU. Before a render starts, Eimi evicts every other model from the card and then polls until roughly 21 GB is actually free, re-issuing the eviction if it lags. If even a fraction of the model spills to system memory, ComfyUI streams weights back and forth every sampling step and a 90-second job becomes a 10-minute one.
- The job right after yours pays for it. The image models have to reload from disk once a render finishes.
- Renders ignore the GPU power cap. Other jobs get throttled; a render does not, because throttling roughly triples its runtime.
- Sampling is fixed at 20 steps. There is no
stepsparameter on/render.
None of this is tuned for throughput. It is one card in somebody's house being asked to do the least card-friendly thing in the bot.
Troubleshooting#
| What you see | What it means |
|---|---|
Access Denied / You don't have permission to use the bot here. |
Bot access, not a render-specific problem. See Access |
VIP Only / API video rendering (MiniMax H3) is available to VIP members only. |
The cloud backend is live and you are not VIP. Wait for the local backend, or ask the maintainer |
Not Configured / The MiniMax API key isn't set up yet. Ask an operator. |
The cloud backend is live but has no key. Nobody can render right now |
Job Limit Reached / You have N job(s) in the queue. Your limit is L. |
You already have the maximum number of jobs queued. The default limit is 15 |
| Invalid Aspect Ratio | aspect was not a W:H ratio, a WxH size or a preset word |
Invalid Attachment / `{filename}` isn't an image. |
One of your frames or references is not an image file |
| Missing First Frame | You passed last_frame without first_frame |
| Pick One Mode | You mixed frames and references |
Upload Failed / Couldn't hand one of your images to the render backend. |
ComfyUI would not accept one of your images. Usually transient, try again |
Failed to prepare the render. Please try again. |
The workflow could not be built. Usually a ComfyUI-side problem |
Workflow system not available. Please try again later. |
ComfyUI is not reachable at all |
MiniMax flagged your prompt as not allowed (their content policy)... |
Cloud content filter. Rephrase, or wait for the local backend |
MiniMax couldn't make this video: {reason} |
The cloud job failed for a reason MiniMax gave |
The video job failed on MiniMax's side. |
The cloud job failed and gave no reason |
MiniMax rejected the request ({reason}) |
The submission itself was refused. Often a key or quota problem on the maintainer's account |
The video took too long and timed out. |
The cloud job ran past 15 minutes |
The video service errored out. Try again in a bit. |
Network or cloud-side failure with no detail |
⚠️ clip is X MB, over this server's Y MB upload limit |
Not an error. The clip rendered, it just could not be attached. See the size ladder |
| The bar sits at one number for a long time | Normal. A local render is 20 sampling steps, so it moves in 5% jumps with long gaps and shows no preview frames |
| The clip is a bit longer than you asked | Normal. See duration |
| Your 15-second 3.7 MP request came back short and small | You are not VIP. See Tier caps |
Content-policy and quota failures do not ping the maintainer. Everything else does.
See also#
- animate -- the right-click way into the same pipeline, starting from an image in the channel
- /compose -- the other non-image generator, for music
- /imagine -- make the still image you want to use as a
first_frame - describe -- read an image back as text to build a render prompt from
- Enhancement -- how the prompt rewriter works across the bot