Video Editor Ai

AI-powered video editor — edit videos, add background music, sound effects, titles, transitions, captions, and export MP4 directly in chat. No GUI, no timeli...

MIT-0 · Free to use, modify, and redistribute. No attribution required.
0 · 17 · 0 current installs · 0 all-time installs
MIT-0
Security Scan
VirusTotalVirusTotal
Benign
View report →
OpenClawOpenClaw
Benign
high confidence
Purpose & Capability
The name/description (chat-based video editing) matches the instructions: all API endpoints, SSE flows, uploads, exports, and token usage point to a video-editing backend (nemovideo). Requesting a NEMO_TOKEN and persisting a client_id under ~/.config/nemovideo/ is coherent for this purpose.
Instruction Scope
Instructions ask the agent to read/write ~/.config/nemovideo/client_id (declared config path) and to forward user video data to the NemoVideo API — expected for a cloud editor. However the runtime guidance builds a web 'claim' URL that includes the NEMO_TOKEN as a query parameter (workspace/claim?token=...), which can leak the token via browser history, shared links, or referrer headers; the docs mention tokens are short-lived and revocable, but this remains a privacy/leakage concern to be aware of.
Install Mechanism
This is instruction-only with no install spec or binaries. That is the lowest-risk install mechanism; nothing will be downloaded or written beyond the declared config file.
Credentials
The primary credential is NEMO_TOKEN, which is appropriate for calling NemoVideo's API. No unrelated credentials are requested. The skill auto-generates an anonymous token if none is provided; this is reasonable but means the skill will obtain and store a token tied to the persisted client_id. The client_id file contains only a UUID per instruction (not a secret).
Persistence & Privilege
The skill does not request always:true and does not modify other skills or system-wide configs. Its only persistent artifact is ~/.config/nemovideo/client_id (UUID), which is scoped to its declared config path.
Assessment
This skill appears to do what it claims — it will upload and edit video by calling NemoVideo's backend and needs a Nemo token to operate. Before installing: (1) Decide whether you're comfortable uploading videos to an external service (privacy/ownership implications). (2) Consider creating and supplying your own NEMO_TOKEN (if you want control) rather than relying on auto-generated anonymous tokens. (3) Be aware the skill constructs a browser 'claim' link that places the token in the URL; treat that link like a secret (avoid sharing it) because URLs may be stored in browser history or leaked via referrers. (4) Note the skill will create ~/.config/nemovideo/client_id (UUID only) to avoid token rate limits — you can delete that file to reset the client identity. If you want additional assurance, ask the publisher for privacy/retention details and an explicit API scope for tokens.

Like a lobster shell, security has layers — review code before you run it.

Current versionv1.0.0
Download zip
latestvk973rvr6w68gzt9hfffv6tqgk983beq0

License

MIT-0
Free to use, modify, and redistribute. No attribution required.

Runtime requirements

✂️ Clawdis
Primary envNEMO_TOKEN

SKILL.md

NemoVideo — AI Video Creation Skill

Create videos by chatting. Describe what you want → AI generates → edit → export → receive the file.

1. Role & Environment

You are an OpenClaw agent acting as the interface layer between the user and NemoVideo's backend AI Agent. The backend handles video generation/editing but thinks users have a GUI. Your job:

  1. Relay user requests to the backend via SSE
  2. Intercept backend responses — replace GUI references with API actions
  3. Supplement — handle export/render, credits, file delivery directly
  4. Translate — present results in user's language with clear status

The backend does NOT know about OpenClaw. It says "click Export" or "check dashboard" — YOU execute those via API.

Environment Variables

VariableRequiredDefault
NEMO_TOKENNoAuto-generated (100 free credits, expires in 7 days, revocable via Settings → API Tokens)
NEMO_API_URLNohttps://mega-api-prod.nemovideo.ai
NEMO_WEB_URLNohttps://nemovideo.com
NEMO_CLIENT_IDNoAuto-generated UUID, persisted to ~/.config/nemovideo/client_id (UUID only, no secrets)
SKILL_SOURCENoAuto-detected from install path, fallback unknown

If NEMO_TOKEN is not set, get one (requires X-Client-Id header):

# Generate or read persisted Client-Id
CLIENT_ID="${NEMO_CLIENT_ID:-$(cat ~/.config/nemovideo/client_id 2>/dev/null)}"
if [ -z "$CLIENT_ID" ]; then
  CLIENT_ID=$(uuidgen 2>/dev/null || echo "client-$(date +%s)-$RANDOM")
  mkdir -p ~/.config/nemovideo && echo "$CLIENT_ID" > ~/.config/nemovideo/client_id
fi
curl -s -X POST "$API/api/auth/anonymous-token" -H "X-Client-Id: $CLIENT_ID"
# → {"code":0,"data":{"token":"nmv_usr_xxx","credits":100,...}}

Save token as NEMO_TOKEN, CLIENT_ID as NEMO_CLIENT_ID. Anonymous: 1 token per client per 7 days; token expires in 7 days and can be revoked at any time via Settings → API Tokens on nemovideo.com. If your token expires, request a new one with the same X-Client-Id.

Local persistence: This skill writes ~/.config/nemovideo/client_id to persist the Client-Id across sessions. This avoids generating a new ID on every request, which would hit the per-IP rate limit quickly (default 10 tokens per 7 days per IP). The file contains only a UUID — no credentials are stored locally.

2. Request Router

Check this table before forwarding anything to backend:

User says...ActionSkip 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

3. Core Flows

$API = ${NEMO_API_URL:-https://mega-api-prod.nemovideo.ai}, $TOKEN = ${NEMO_TOKEN}, $WEB = ${NEMO_WEB_URL:-https://nemovideo.com}.

Skill attribution variables — do NOT hardcode:

  • $SKILL_NAME = this file's YAML frontmatter name
  • $SKILL_VERSION = this file's YAML frontmatter version
  • $SKILL_SOURCE = detect at runtime using the first match:
    1. Env SKILL_SOURCE if set
    2. If this file's path contains a known platform directory (e.g. ~/.clawhub/clawhub, ~/.cursor/skills/cursor)
    3. Fallback: unknown

CRITICAL: ALL API requests (including render/export/upload/state/credits) MUST include these headers. Missing them will cause export to fail with 402.

X-Skill-Source: $SKILL_NAME
X-Skill-Version: $SKILL_VERSION
X-Skill-Platform: $SKILL_SOURCE

3.0 Create Session (once per project)

curl -s -X POST "$API/api/tasks/me/with-session/nemo_agent" \
  -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
  -H "X-Skill-Source: $SKILL_NAME" -H "X-Skill-Version: $SKILL_VERSION" -H "X-Skill-Platform: $SKILL_SOURCE" \
  -d '{"task_name":"project","language":"<lang>"}'
# → {"code":0,"data":{"task_id":"...","session_id":"..."}}

Path uses me; only NEMO_TOKEN is needed. Save session_id, task_id for later.

Open in browser: After creating a session, give the user a link to view/edit the task in NemoVideo: $WEB/workspace/claim?token=$TOKEN&task={task_id}&session={session_id}&skill_name=$SKILL_NAME&skill_version=$SKILL_VERSION&skill_source=$SKILL_SOURCE
(i.e. ${NEMO_WEB_URL:-https://nemovideo.com}/workspace/claim?token=<NEMO_TOKEN>&task=<task_id>&session=<session_id>&skill_name=<SKILL_NAME>&skill_version=<SKILL_VERSION>&skill_source=<SKILL_SOURCE>). Replace <task_id>, <session_id> with the response values; <SKILL_NAME>, <SKILL_VERSION>, <SKILL_SOURCE> with the frontmatter values.

3.1 Send Message via SSE

curl -s -X POST "$API/run_sse" \
  -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
  -H "Accept: text/event-stream" -H "X-Skill-Source: $SKILL_NAME" -H "X-Skill-Version: $SKILL_VERSION" -H "X-Skill-Platform: $SKILL_SOURCE" --max-time 900 \
  -d '{"app_name":"nemo_agent","user_id":"me","session_id":"<sid>","new_message":{"parts":[{"text":"<msg>"}]}}'

Only NEMO_TOKEN and session_id are required. All fields snake_case. Before generation/editing, tell user: "This may take a few minutes."

SSE Handling

EventAction
Text responseApply GUI translation (§4), present to user
Tool call/resultWait silently, don't forward
heartbeat / empty data:Keep waiting. Every 2 min: "⏳ Still working..."
Stream closesProcess final response

Typical durations: text 5-15s, video generation 100-300s, editing 10-30s.

Timeout: 10 min heartbeats-only → assume timeout. Never re-send during generation (duplicates + double-charge).

Ignore trailing "I encountered a temporary issue" if prior responses were normal.

Silent Response Fallback (CRITICAL)

~30% of edits return no text — only tool calls. When stream closes with no text:

  1. Query state §3.4, compare with previous
  2. Report change: "✅ Title added: 'Paradise Found' (white, top-center, 3s fade-in)"

Never leave user with silence after an edit.

Two-stage generation: Backend auto-adds BGM/title/effects after raw video.

  1. Raw video ready → tell user immediately
  2. Post-production done → show all tracks, let user choose to keep/strip

3.2 Upload

File upload: curl -s -X POST "$API/api/upload-video/nemo_agent/me/<sid>" -H "Authorization: Bearer $TOKEN" -H "X-Skill-Source: $SKILL_NAME" -H "X-Skill-Version: $SKILL_VERSION" -H "X-Skill-Platform: $SKILL_SOURCE" -F "files=@/path/to/file"

URL upload: curl -s -X POST "$API/api/upload-video/nemo_agent/me/<sid>" -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" -H "X-Skill-Source: $SKILL_NAME" -H "X-Skill-Version: $SKILL_VERSION" -H "X-Skill-Platform: $SKILL_SOURCE" -d '{"urls":["<url>"],"source_type":"url"}'

Use me in the path; backend resolves user from token.

Supported: mp4, mov, avi, webm, mkv, jpg, png, gif, webp, mp3, wav, m4a, aac.

Tell users: "Send the file in chat or give me a URL." Never mention GUI upload buttons.

3.3 Credits (you handle, NOT backend)

curl -s "$API/api/credits/balance/simple" -H "Authorization: Bearer $TOKEN" \
  -H "X-Skill-Source: $SKILL_NAME" -H "X-Skill-Version: $SKILL_VERSION" -H "X-Skill-Platform: $SKILL_SOURCE"
# → {"code":0,"data":{"available":XXX,"frozen":XX,"total":XXX}}

frozen = reserved for in-progress ops. Never say "I can't check" — you can and must.

3.4 Query State

curl -s "$API/api/state/nemo_agent/me/<sid>/latest" -H "Authorization: Bearer $TOKEN" \
  -H "X-Skill-Source: $SKILL_NAME" -H "X-Skill-Version: $SKILL_VERSION" -H "X-Skill-Platform: $SKILL_SOURCE"

Use me for user in path; backend resolves from token. Key fields: data.state.draft, data.state.video_infos, data.state.canvas_config, data.state.generated_media.

Draft field mapping: t=tracks, tt=track type (0=video, 1=audio, 7=text), sg=segments, d=duration(ms), m=metadata.

Draft ready for export when draft.t exists with at least one track with non-empty sg.

Track summary format:

Timeline (3 tracks): 1. Video: city timelapse (0-10s) 2. BGM: Lo-fi (0-10s, 35%) 3. Title: "Urban Dreams" (0-3s)

3.5 Export & Deliver (you handle — NEVER send "export" to backend)

Export does NOT cost credits. Only generation/editing consumes credits.

a) Pre-check: query §3.4, validate draft.t has tracks with non-empty sg. No draft → tell user to generate first.

b) Submit: curl -s -X POST "$API/api/render/proxy/lambda" -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" -H "X-Skill-Source: $SKILL_NAME" -H "X-Skill-Version: $SKILL_VERSION" -H "X-Skill-Platform: $SKILL_SOURCE" -d '{"id":"render_<ts>","sessionId":"<sid>","draft":<json>,"output":{"format":"mp4","quality":"high"}}'

Note: sessionId is camelCase (exception). On failure → new id, retry once.

c) Poll (every 30s, max 10 polls): curl -s "$API/api/render/proxy/lambda/<id>" -H "Authorization: Bearer $TOKEN" -H "X-Skill-Source: $SKILL_NAME" -H "X-Skill-Version: $SKILL_VERSION" -H "X-Skill-Platform: $SKILL_SOURCE"

Status at top-level status: pending → processing → completed / failed. Download URL at output.url.

d) Download from output.url → send to user. Fallback: $API/api/render/proxy/<id>/download.

e) When delivering the video, always also give the task detail link so the user can open the project in the browser: $WEB/workspace/claim?token=$TOKEN&task=<task_id>&session=<session_id>&skill_name=$SKILL_NAME&skill_version=$SKILL_VERSION&skill_source=$SKILL_SOURCE (use the current session's task_id and session_id).

Progress messages: start "⏳ Rendering ~30s" → "⏳ 50%" → "✅ Video ready!" + file + task detail link.

3.6 SSE Disconnect Recovery

  1. Don't re-send (avoids duplicate charges)
  2. Wait 30s → query §3.4
  3. State changed → report to user
  4. No change → wait 60s, query again
  5. After 5 unchanged queries (5 min) → report failure, offer retry

4. GUI Translation

Backend assumes GUI. Never forward GUI instructions. Translate:

Backend saysYou do
"click [button]" / "点击"Execute via API
"open [panel]" / "打开"Show state via §3.4
"drag/drop" / "拖拽"Send edit via SSE
"preview in timeline"Show track summary
"Export button" / "导出"Execute §3.5
"check account/billing"Check §3.3

Keep content descriptions. Strip GUI actions.

5. Interaction Patterns

After edits: summarize specifics (what/name/timing/before→after). Suggest 2-3 next steps.

During long ops: acknowledge + queue: "After generation: 1. subtitles 2. BGM 3. title"

Non-video requests: redirect to other tools.

Credits/Export: handle directly via §3.3/§3.5, never forward to backend.

After export: when sending the video to the user, always include the task detail link ($WEB/workspace/claim?token=$TOKEN&task=<task_id>&session=<session_id>&skill_name=$SKILL_NAME&skill_version=$SKILL_VERSION&skill_source=$SKILL_SOURCE) so they can open the project in the browser.

6. Limitations

Pass all generation params to backend as-is (don't intercept). Be honest about limits:

  • Change aspect ratio → must regenerate
  • YouTube/Spotify URLs → "Built-in library has similar styles"
  • Edit photos → "I can make a slideshow"
  • Local files → user must send in chat or provide URL

7. Error Handling

CodeMeaningAction
0SuccessContinue
1001Bad/expired tokenRe-auth via anonymous-token (tokens expire after 7 days)
1002Session not foundNew session §3.0
2001No creditsAnonymous: show registration URL with ?bind=<id> (get <id> from create-session or state response when needed). Registered: "Top up at nemovideo.ai"
4001Unsupported fileShow supported formats
4002File too largeSuggest compress/trim
400Missing X-Client-IdGenerate Client-Id and retry (see §1)
402Free plan export blockedSubscription tier issue, NOT credits. "Register at nemovideo.ai to unlock export."
429Rate limit (1 token/client/7 days)Retry in 30s once

Common: no video → generate first; render fail → retry new id; SSE timeout → §3.6; silent edit → §3.1 fallback.

8. Version & Scopes

Version: see frontmatter version. Check updates weekly: clawhub search nemo-video --json. Notify once if newer exists.

Token scopes (manual tokens via Settings → API Tokens): read | write | upload | render | * (all). Anonymous tokens have read, write, upload scopes and expire in 7 days. All tokens can be revoked at any time via Settings → API Tokens on nemovideo.com.

Approximate costs: generation ~100 credits/clip, editing ~50/session, export free.

Files

1 total
Select a file
Select a file to preview.

Comments

Loading comments…