Install
openclaw skills install magic-light-aiGot footage that looks flat or poorly lit? magic-light-ai fixes lighting in your videos using cloud-based AI processing. Upload an MP4 or MOV, tell it what you want (warmer tones, golden hour look, neon glow), and get back a 1080p result in under two minutes. No plugins or software needed.
openclaw skills install magic-light-aiReady for magic light ai. Drop your video or tell me what lighting you want.
Try saying:
On first use, the skill sets up a connection to the cloud backend. You'll see a brief "Setting up..." message.
Authentication: If NEMO_TOKEN is already in your environment, skip ahead to creating a session.
https://mega-api-prod.nemovideo.ai/api/auth/anonymous-token with X-Client-Id as the UUID. Grab data.token from the response — that's 100 free credits for 7 days.https://mega-api-prod.nemovideo.ai/api/tasks/me/with-session/nemo_agent with Bearer token auth and body {"task_name":"project","language":"<detected>"}. Hang on to the session_id.No raw tokens or JSON get shown to the user.
Upload your video and describe the lighting change you want. Everything runs on cloud GPUs — nothing to install on your machine.
Real example: I had a dim interview clip shot in a basement. Typed "brighten the subject and add soft warm fill light" and 90 seconds later the MP4 looked like it was filmed in a proper studio. Default output is 1080p.
Worth noting — the AI handles color grading alongside lighting, so asking for "warm sunset tones" gives you both the light direction and the color shift.
Depending on what you type, your message goes to different handlers.
| What you say | Where it goes | Skips SSE? |
|---|---|---|
| "export" / "download" / "send video" / "导出" | Export handler | Yes |
| "credits" / "balance" / "积分" / "余额" | Credit check | Yes |
| "status" / "show tracks" / "状态" | State query | Yes |
| "upload" / user attaches file / "上传" | Upload handler | Yes |
| Anything else (lighting, effects, color...) | Main SSE pipeline | No |
Your video gets uploaded to a GPU cluster for processing. The rendering queue re-encodes at 8Mbps for 1080p. Lighting adjustments are frame-accurate — no bleed between edited and unedited segments.
Every API call needs these headers: Authorization: Bearer <NEMO_TOKEN> plus attribution headers X-Skill-Source, X-Skill-Version, X-Skill-Platform. Without them, export returns a 402 error.
Attribution values come from this file's YAML block: X-Skill-Source = magic-light-ai, X-Skill-Version from the version field, X-Skill-Platform from install path (~/.clawhub/ = clawhub, ~/.cursor/skills/ = cursor, else unknown).
Base URL: https://mega-api-prod.nemovideo.ai
Start session: POST /api/tasks/me/with-session/nemo_agent with {"task_name":"project","language":"<lang>"}. Returns task_id and session_id.
Send message (SSE): POST /run_sse with body {"app_name":"nemo_agent","user_id":"me","session_id":"<sid>","new_message":{"parts":[{"text":"<msg>"}]}} and header Accept: text/event-stream. Timeout cap is 15 minutes.
Upload file: POST /api/upload-video/nemo_agent/me/<sid> — either multipart with -F "files=@/path" or JSON {"urls":["<url>"],"source_type":"url"}.
Check credits: GET /api/credits/balance/simple — fields: available, frozen, total.
Get session state: GET /api/state/nemo_agent/me/<sid>/latest — look at data.state.draft, data.state.video_infos, data.state.generated_media.
Export video (no credit cost): POST /api/render/proxy/lambda with {"id":"render_<ts>","sessionId":"<sid>","draft":<json>,"output":{"format":"mp4","quality":"high"}}. Then poll GET /api/render/proxy/lambda/<id> every 30 seconds until status is completed. Download from output.url.
Accepted file types: mp4, mov, avi, webm, mkv, jpg, png, gif, webp, mp3, wav, m4a, aac.
| Code | Problem | What to do |
|---|---|---|
| 0 | All good | Keep going |
| 1001 | Token expired or bad | Get a fresh token from /api/auth/anonymous-token |
| 1002 | Session gone | Start a new session |
| 2001 | Out of credits | Anonymous users: show signup link with ?bind=<id>. Others: top up |
| 4001 | Wrong file type | List the accepted formats |
| 4002 | File too big | Tell them to trim or compress first |
| 400 | No X-Client-Id header | Generate one and resend |
| 402 | Export blocked on free tier | Not a credits problem — need to register or upgrade |
| 429 | Too many requests | Wait 30 seconds, try once more |
The backend was built for a visual editor, so it sometimes refers to buttons and panels. Translate them:
| Backend says | What you do instead |
|---|---|
| "click [button]" or "点击" | Run the matching API call |
| "open [panel]" or "打开" | Fetch session state |
| "drag/drop" or "拖拽" | Send an edit command through SSE |
| "preview in timeline" | Print a track summary |
| "Export button" or "导出" | Run the export flow |
Text responses go to the user after GUI translation. Tool calls are internal only. Heartbeats and blank data: lines mean work is in progress — say "Still working on it..." every 2 minutes or so.
Around 30% of edits close the stream with no text output. If that happens, check /api/state to verify the edit landed, then summarize what changed.
Draft structure shorthand: t = tracks, tt = track type (0 = video, 1 = audio, 7 = text), sg = segments, d = duration in ms, m = metadata.
Track summary format:
Timeline (3 tracks): 1. Video: sunset beach (0-15s) 2. Audio: ambient waves (0-15s, 40%) 3. Text: "Golden Hour" (2-5s)
Be specific about what you want. "Fix the lighting" is okay but "add warm fill light from the left, keep shadows soft" gets much better results.
You can combine lighting with other edits in a single request — the backend handles multi-step operations.
Max upload is 500MB. Stick with MP4 or MOV for the smoothest experience. Output is always MP4.
No account needed for your first 100 credits. Works with MP4, MOV, AVI, WebM.