Skills video-compressor-ezgif
git clone https://github.com/openclaw/skills
T=$(mktemp -d) && git clone --depth=1 https://github.com/openclaw/skills "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills/bwbernardweston18/video-compressor-ezgif" ~/.claude/skills/openclaw-skills-video-compressor-ezgif && rm -rf "$T"
T=$(mktemp -d) && git clone --depth=1 https://github.com/openclaw/skills "$T" && mkdir -p ~/.openclaw/skills && cp -r "$T/skills/bwbernardweston18/video-compressor-ezgif" ~/.openclaw/skills/openclaw-skills-video-compressor-ezgif && rm -rf "$T"
skills/bwbernardweston18/video-compressor-ezgif/SKILL.mdGetting Started
Share your video files and I'll get started on AI video compression. Or just tell me what you're thinking.
Try saying:
- "compress my video files"
- "export 720p MP4"
- "compress this video to under 10MB"
First-Time Connection
When a user first opens this skill, connect to the processing backend automatically. Briefly let them know (e.g. "Setting up...").
Authentication: Check if
NEMO_TOKEN is set in the environment. If it is, skip to step 2.
- Obtain a free token: Generate a random UUID as client identifier. POST to
with headerhttps://mega-api-prod.nemovideo.ai/api/auth/anonymous-token
set to that UUID. The responseX-Client-Id
is your NEMO_TOKEN — 100 free credits, valid 7 days.data.token - Create a session: POST to
withhttps://mega-api-prod.nemovideo.ai/api/tasks/me/with-session/nemo_agent
,Authorization: Bearer <token>
, and bodyContent-Type: application/json
. Store the returned{"task_name":"project","language":"<detected>"}
for all subsequent requests.session_id
Keep setup communication brief. Don't display raw API responses or token values to the user.
Video Compressor Ezgif — Compress and Export Smaller Videos
Drop your video files in the chat and tell me what you need. I'll handle the AI video compression on cloud GPUs — you don't need anything installed locally.
Here's a typical use: you send a a 50MB GIF or MP4 clip, ask for compress this video to under 10MB without losing too much quality, and about 20-40 seconds later you've got a MP4 file ready to download. The whole thing runs at 720p by default.
One thing worth knowing — shorter clips compress faster and give better quality-to-size results.
Matching Input to Actions
User prompts referencing video compressor ezgif, aspect ratio, text overlays, or audio tracks get routed to the corresponding action via keyword and intent classification.
| User says... | Action | Skip SSE? |
|---|---|---|
| "export" / "导出" / "download" / "send me the video" | → §3.5 Export | ✅ |
| "credits" / "积分" / "balance" / "余额" | → §3.3 Credits | ✅ |
| "status" / "状态" / "show tracks" | → §3.4 State | ✅ |
| "upload" / "上传" / user sends file | → §3.2 Upload | ✅ |
| Everything else (generate, edit, add BGM…) | → §3.1 SSE | ❌ |
Cloud Render Pipeline Details
Each export job queues on a cloud GPU node that composites video layers, applies platform-spec compression (H.264, up to 1080x1920), and returns a download URL within 30-90 seconds. The session token carries render job IDs, so closing the tab before completion orphans the job.
Every API call needs
Authorization: Bearer <NEMO_TOKEN> plus the three attribution headers above. If any header is missing, exports return 402.
Headers are derived from this file's YAML frontmatter.
X-Skill-Source is video-compressor-ezgif, X-Skill-Version comes from the version field, and X-Skill-Platform is detected from the install path (~/.clawhub/ = clawhub, ~/.cursor/skills/ = cursor, otherwise unknown).
API base:
https://mega-api-prod.nemovideo.ai
Create session: POST
/api/tasks/me/with-session/nemo_agent — body {"task_name":"project","language":"<lang>"} — returns task_id, session_id.
Send message (SSE): POST
/run_sse — body {"app_name":"nemo_agent","user_id":"me","session_id":"<sid>","new_message":{"parts":[{"text":"<msg>"}]}} with Accept: text/event-stream. Max timeout: 15 minutes.
Upload: POST
/api/upload-video/nemo_agent/me/<sid> — file: multipart -F "files=@/path", or URL: {"urls":["<url>"],"source_type":"url"}
Credits: GET
/api/credits/balance/simple — returns available, frozen, total
Session state: GET
/api/state/nemo_agent/me/<sid>/latest — key fields: data.state.draft, data.state.video_infos, data.state.generated_media
Export (free, no credits): POST
/api/render/proxy/lambda — body {"id":"render_<ts>","sessionId":"<sid>","draft":<json>,"output":{"format":"mp4","quality":"high"}}. Poll GET /api/render/proxy/lambda/<id> every 30s until status = completed. Download URL at output.url.
Supported formats: mp4, mov, avi, webm, mkv, jpg, png, gif, webp, mp3, wav, m4a, aac.
Error Codes
— success, continue normally0
— token expired or invalid; re-acquire via1001/api/auth/anonymous-token
— session not found; create a new one1002
— out of credits; anonymous users get a registration link with2001
, registered users top up?bind=<id>
— unsupported file type; show accepted formats4001
— file too large; suggest compressing or trimming4002
— missing400
; generate one and retryX-Client-Id
— free plan export blocked; not a credit issue, subscription tier402
— rate limited; wait 30s and retry once429
Translating GUI Instructions
The backend responds as if there's a visual interface. Map its instructions to API calls:
- "click" or "点击" → execute the action via the relevant endpoint
- "open" or "打开" → query session state to get the data
- "drag/drop" or "拖拽" → send the edit command through SSE
- "preview in timeline" → show a text summary of current tracks
- "Export" or "导出" → run the export workflow
Reading the SSE Stream
Text events go straight to the user (after GUI translation). Tool calls stay internal. Heartbeats and empty
data: lines mean the backend is still working — show "⏳ Still working..." every 2 minutes.
About 30% of edit operations close the stream without any text. When that happens, poll
/api/state to confirm the timeline changed, then tell the user what was updated.
Draft field mapping:
t=tracks, tt=track type (0=video, 1=audio, 7=text), sg=segments, d=duration(ms), m=metadata.
Timeline (3 tracks): 1. Video: city timelapse (0-10s) 2. BGM: Lo-fi (0-10s, 35%) 3. Title: "Urban Dreams" (0-3s)
Common Workflows
Quick edit: Upload → "compress this video to under 10MB without losing too much quality" → Download MP4. Takes 20-40 seconds for a 30-second clip.
Batch style: Upload multiple files in one session. Process them one by one with different instructions. Each gets its own render.
Iterative: Start with a rough cut, preview the result, then refine. The session keeps your timeline state so you can keep tweaking.
Tips and Tricks
The backend processes faster when you're specific. Instead of "make it look better", try "compress this video to under 10MB without losing too much quality" — concrete instructions get better results.
Max file size is 500MB. Stick to MP4, GIF, MOV, AVI for the smoothest experience.
H.264 codec gives the best balance of quality and size.