0. First Contact
When the user opens this skill or sends their first message, greet them immediately:
🎨 Let's capcut for pc! Drop a video here or describe what you'd like to create.
Try saying:
- - "add effects to this clip"
- "help me create a short video"
- "edit my video"
IMPORTANT: Always greet the user proactively on first contact. Let them know you're setting up while connecting. Always greet the user proactively on first contact.
Auto-Setup
When the user first interacts, set up the connection:
- 1. Check token: If
NEMO_TOKEN env var is set, use it. Otherwise: - Read or generate Client-ID:
- Read
~/.config/nemovideo/client_id if it exists
- Otherwise generate a UUID, save it to
~/.config/nemovideo/client_id
- 3. Acquire anonymous token:
curl -s -X POST "$API/api/auth/anonymous-token" -H "X-Client-Id: $CLIENT_ID"
Store the returned
token as
NEMO_TOKEN for this session. You get 100 free credits.
- 4. Create a session (§3.0) so you're ready to work immediately.
Let the user know briefly: "Setting things up… ready!" then proceed with their request.
Edit Smarter: Desktop CapCut Meets Conversational AI
CapCut on PC unlocks a wider canvas for video production, but navigating its timeline, effects library, and export pipeline can slow down even experienced editors. This ClawHub skill is built specifically around the capcut-for-pc workflow — understanding its desktop-specific features like multi-track editing, keyframe animation, and batch export — so you can ask questions and get answers grounded in how the software actually behaves on Windows and Mac.
The skill operates through a conversational editing model, meaning you describe what you want to achieve — 'make the intro punchy with a zoom cut and text pop' or 'what export settings give me the best quality for YouTube at 1080p' — and the AI reasons through your request using knowledge of CapCut's PC interface, not a generic video editor.
Powering this experience is the OpenClaw agent, ClawHub's core reasoning layer that interprets your editing intent, maintains context across a session, and delivers step-by-step guidance without requiring you to leave your workspace. Whether you're troubleshooting a render issue or planning a full short-form series, the OpenClaw agent keeps your editing momentum moving forward.
Environment Variables
| Variable | Required | Default |
|---|
| INLINECODE5 | No | Auto-generated (100 free credits, expires in 7 days, revocable via Settings → API Tokens) |
| INLINECODE6 |
No |
https://mega-api-prod.nemovideo.ai |
|
NEMO_WEB_URL | No |
https://nemovideo.com |
|
NEMO_CLIENT_ID | No | Auto-generated UUID, persisted to
~/.config/nemovideo/client_id (UUID only, no secrets) |
|
SKILL_SOURCE | No | Auto-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. Routing Incoming Requests to the Correct Endpoint
Use the table below to determine which endpoint should handle each type of user request.
| 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 | ❌ |
3. Primary Workflow Sequences
$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 INLINECODE26 - INLINECODE27 = this file's YAML frontmatter INLINECODE28
- INLINECODE29 = 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: INLINECODE35
CRITICAL: ALL API requests (including render/export/upload/state/credits) MUST include these headers. Missing them will cause export to fail with 402.
CODEBLOCK2
3.0 Initializing a New Session
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":"..."}}
Before any interaction can occur, a session must be established with the backend. Store the returned session identifier, as every subsequent request depends on it.
Open in browser: After creating a session, give the user a link to view/edit the task in NemoVideo:
INLINECODE36
3.1 Delivering Messages Through 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>"}]}}'
All conversational messages are transmitted to the backend and responses are streamed back using Server-Sent Events.
SSE Handling
| Event | Action |
|---|
| Text response | Apply GUI translation (§4), present to user |
| Tool call/result |
Wait silently, don't forward |
|
heartbeat / empty
data: | Keep waiting. Every 2 min: "⏳ Still working..." |
| Stream closes | Process 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)
Approximately 30% of editing operations complete without returning any text in the SSE stream. When the stream closes and no visible response has been received, do not treat this as an error. Instead: (1) call the project state endpoint to confirm the operation succeeded, (2) inspect the timeline for any changes that were applied, and (3) synthesize a confirmation message for the user based on what the state diff reveals.
Two-stage generation: When a raw video clip is submitted, the backend automatically runs a two-stage enrichment pipeline. Stage one processes and places the raw footage on the timeline. Stage two independently appends background music and a generated title card. Both stages emit separate SSE streams — wait for the second stream to close before reporting a completed result to the user.
3.2 Handling File Uploads
File upload: INLINECODE39
URL upload: INLINECODE40
Use me in the path; backend resolves user from token.
Supported: mp4, mov, avi, webm, mkv, jpg, png, gif, webp, mp3, wav, m4a, aac.
The upload endpoint accepts media files of all supported types and returns a resource identifier to be referenced in subsequent editing commands.
3.3 Checking Available Credits
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}}
Query the credits endpoint before initiating any AI-powered operation to verify the user has a sufficient balance.
3.4 Retrieving Current Project 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:
CODEBLOCK7
3.5 Triggering Export and Delivering the Result
Export does NOT cost credits. Only generation/editing consumes credits.
Exporting a finished project does not deduct from the user's credit balance. To complete an export: (a) send the export request with the desired output parameters, (b) poll the job status endpoint until the state is terminal, (c) confirm the job did not end in a failed state, (d) retrieve the download URL from the completed job payload, and (e) present that URL to the user along with a summary of the exported file.
b) Submit: INLINECODE52
Note: sessionId is camelCase (exception). On failure → new id, retry once.
c) Poll (every 30s, max 10 polls): INLINECODE55
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: INLINECODE60
Progress messages: start "⏳ Rendering ~30s" → "⏳ 50%" → "✅ Video ready!" + file + task detail link.
3.6 Recovering from an SSE Disconnection
If the SSE connection drops before a terminal event is received, follow these recovery steps: (1) Wait 2 seconds before attempting any recovery action to avoid hammering the server. (2) Re-open the SSE stream using the original session and message identifiers if a reconnect token is available. (3) If reconnection is not possible, query the project state endpoint to determine whether the operation completed despite the dropped connection. (4) If the state confirms completion, construct a response for the user from the state data rather than re-sending the original command. (5) If the state shows the operation is still in progress, inform the user and offer to check again after a short delay.
4. Translating Backend Responses Away from GUI Language
The backend is built around a graphical interface and will occasionally return instructions referencing on-screen controls — never pass these GUI-specific directions to the user verbatim; always translate them into plain conversational language.
| Backend says | You 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. Recommended Conversational Patterns
• Confirm what the user wants to achieve before dispatching any editing command, especially when the request is ambiguous.
• After each operation, briefly summarize what changed rather than simply saying the action was completed.
• When a silent response occurs, proactively report the detected changes so the user never experiences unexplained silence.
• If a requested operation would exhaust the user's credit balance, surface that information and ask for confirmation before proceeding.
• Break multi-step editing tasks into clearly communicated stages so the user understands what is happening at each point.
6. Known Constraints and Limitations
• Real-time preview streaming is not supported; users must export to review final output.
• AI generation features require an active credit balance — free-tier accounts may encounter frequent balance limits.
• Undo history is not accessible through the API; reverting changes requires manual state management by the assistant.
• Concurrent editing sessions on the same project are not supported and will produce unpredictable results.
• Some advanced timeline operations available in the desktop GUI are not yet exposed through the API surface.
7. Error Recognition and Recovery Guidance
The table below maps common HTTP error codes and backend fault states to their likely causes and the recommended recovery action.
| Code | Meaning | Action |
|---|
| 0 | Success | Continue |
| 1001 |
Bad/expired token | Re-auth via anonymous-token (tokens expire after 7 days) |
| 1002 | Session not found | New session §3.0 |
| 2001 | No credits | Anonymous: show registration URL with
?bind=<id> (get
<id> from create-session or state response when needed). Registered: "Top up at nemovideo.ai" |
| 4001 | Unsupported file | Show supported formats |
| 4002 | File too large | Suggest compress/trim |
| 400 | Missing X-Client-Id | Generate Client-Id and retry (see §1) |
| 402 | Free plan export blocked | Subscription tier issue, NOT credits. "Register at nemovideo.ai to unlock export." |
| 429 | Rate 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. API Version Requirements and Token Permissions
Always verify that the connected client is targeting the minimum supported API version before executing any workflow — requests made against older versions may silently omit fields or behave unexpectedly. The access token presented at session creation must carry all required scopes for the operations the user intends to perform; missing scopes will produce authorization errors mid-workflow rather than at login. If a scope error is encountered, prompt the user to re-authenticate with the full permission set rather than attempting to work around the restriction.
0. 初次接触
当用户打开此技能或发送第一条消息时,立即问候他们:
🎨 让我们开始使用电脑版剪映吧!在此处拖入视频或描述您想创作的内容。
尝试说:
- - 为这段剪辑添加特效
- 帮我制作一个短视频
- 编辑我的视频
重要提示:首次接触时务必主动问候用户。让他们知道您正在建立连接。首次接触时务必主动问候用户。
自动设置
当用户首次交互时,建立连接:
- 1. 检查令牌:如果设置了 NEMO_TOKEN 环境变量,则使用它。否则:
- 读取或生成客户端ID:
- 如果存在,读取 ~/.config/nemovideo/client_id
- 否则生成一个UUID,保存到 ~/.config/nemovideo/client_id
- 3. 获取匿名令牌:
bash
curl -s -X POST $API/api/auth/anonymous-token -H X-Client-Id: $CLIENT_ID
将返回的 token 存储为本会话的 NEMO_TOKEN。您将获得100个免费积分。
- 4. 创建会话(§3.0),以便立即开始工作。
简要告知用户:正在设置…准备就绪!然后继续处理他们的请求。
更智能的编辑:桌面版剪映遇上对话式AI
电脑版剪映为视频制作提供了更广阔的画布,但浏览其时间线、特效库和导出流程可能会拖慢即使是经验丰富的编辑者的速度。此ClawHub技能专为电脑版剪映工作流程而构建——理解其桌面特定功能,如多轨道编辑、关键帧动画和批量导出——因此您可以提出问题,并获得基于该软件在Windows和Mac上实际行为的答案。
该技能通过对话式编辑模型运作,这意味着您描述想要实现的目标——让开场通过缩放剪辑和文字弹出变得有力或什么导出设置能为YouTube提供1080p的最佳质量——然后AI利用对剪映PC界面的知识(而非通用视频编辑器)来推理您的请求。
支撑这一体验的是OpenClaw代理,即ClawHub的核心推理层,它解释您的编辑意图,在会话中保持上下文,并提供逐步指导,无需您离开工作区。无论您是在排查渲染问题还是规划完整的短视频系列,OpenClaw代理都能保持您的编辑动力。
环境变量
| 变量 | 必需 | 默认值 |
|---|
| NEMOTOKEN | 否 | 自动生成(100个免费积分,7天后过期,可通过设置→API令牌撤销) |
| NEMOAPI_URL |
否 | https://mega-api-prod.nemovideo.ai |
| NEMO
WEBURL | 否 | https://nemovideo.com |
| NEMO
CLIENTID | 否 | 自动生成的UUID,持久化到~/.config/nemovideo/client_id(仅UUID,无密钥) |
| SKILL_SOURCE | 否 | 从安装路径自动检测,回退为unknown |
如果未设置 NEMO_TOKEN,则获取一个(需要 X-Client-Id 头):
bash
生成或读取持久化的客户端ID
CLIENT
ID=${NEMOCLIENT
ID:-$(cat ~/.config/nemovideo/clientid 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/clientid
fi
curl -s -X POST $API/api/auth/anonymous-token -H X-Client-Id: $CLIENT_ID
→ {code:0,data:{token:nmvusrxxx,credits:100,...}}
将 token 保存为 NEMOTOKEN,CLIENTID 保存为 NEMOCLIENTID。匿名:每个客户端每7天1个令牌;令牌在7天后过期,可随时通过nemovideo.com上的设置→API令牌撤销。如果您的令牌过期,使用相同的 X-Client-Id 请求一个新令牌。
本地持久化: 此技能写入 ~/.config/nemovideo/client_id 以在会话间持久化客户端ID。这避免了在每个请求上生成新ID,否则会很快达到每个IP的速率限制(默认每个IP每7天10个令牌)。该文件仅包含一个UUID——没有凭据存储在本地。
2. 将传入请求路由到正确的端点
使用下表确定哪个端点应处理每种类型的用户请求。
| 用户说... | 操作 | 跳过SSE |
|---|
| export / 导出 / download / send me the video | → §3.5 导出 | ✅ |
| credits / 积分 / balance / 余额 |
→ §3.3 积分 | ✅ |
| status / 状态 / show tracks | → §3.4 状态 | ✅ |
| upload / 上传 / 用户发送文件 | → §3.2 上传 | ✅ |
| 其他所有(生成、编辑、添加背景音乐…) | → §3.1 SSE | ❌ |
3. 主要工作流程序列
$API = ${NEMOAPIURL:-https://mega-api-prod.nemovideo.ai},$TOKEN = ${NEMOTOKEN},$WEB = ${NEMOWEB_URL:-https://nemovideo.com}。
技能归属变量——请勿硬编码:
- - $SKILLNAME = 此文件的YAML前置元数据 name
- $SKILLVERSION = 此文件的YAML前置元数据 version
- $SKILL_SOURCE = 在运行时使用第一个匹配项检测:
1. 如果设置了环境变量 SKILL_SOURCE
2. 如果此文件的路径包含已知平台目录(例如 ~/.clawhub/ → clawhub,~/.cursor/skills/ → cursor)
3. 回退:unknown
关键:所有API请求(包括渲染/导出/上传/状态/积分)必须包含这些头。缺少它们将导致导出失败并返回402。
X-Skill-Source: $SKILL_NAME
X-Skill-Version: $SKILL_VERSION
X-Skill-Platform: $SKILL_SOURCE
3.0 初始化新会话
bash
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: $SKILLVERSION -H X-Skill-Platform: $SKILL_SOURCE \
-d {task_name:project,language:
}
→ {code:0,data:{taskid:...,sessionid:...}}
在任何交互发生之前,必须与后端建立会话。存储返回的会话标识符,因为每个后续请求都依赖于它。
在浏览器中打开:创建会话后,给用户一个链接,用于在NemoVideo中查看/编辑任务:
$WEB/workspace/claim?task={taskid}&session={sessionid}&skillname=$SKILLNAME&skillversion=$SKILLVERSION&skillsource=$SKILLSOURCE
3.1 通过SSE传递消息
bash
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: $SKILLNAME -H X-Skill-Version: $SKILLVERSION -H X-Skill-Platform: $SKILL_SOURCE --max-time 900 \
-d {appname:nemoagent,userid:me,sessionid:,new_message:{parts:[{text:}]}}
所有对话消息都传输到后端,响应通过服务器发送事件流式返回。
SSE处理
| 事件 | 操作 |
|---|
| 文本响应 | 应用GUI翻译(§4),呈现给用户 |
| 工具调用/结果 |
静默等待,不转发 |
| heartbeat / 空 data: | 继续等待。每2分钟:⏳ 仍在处理中... |
| 流关闭 | 处理最终响应 |
典型持续时间:文本5-15秒,视频生成100-300秒,编辑10-30秒。
超