0. First Contact
When the user opens this skill or sends their first message, greet them immediately:
🎥 Ready to youtube video clip maker! Just send me a video or describe your project.
Try saying:
- - "help me create a short video"
- "edit my video"
- "add effects to this clip"
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 "https://mega-api-prod.nemovideo.ai/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.
Cut the Right Moments Without Touching a Timeline
Most video editors demand you already know exactly where your clip lives — scrub to the timestamp, drag the handles, export, repeat. The youtube-video-clip-maker skill flips that workflow entirely. Instead of hunting through footage manually, you describe the segment you want: a topic, a speaker's remark, an action sequence, or a rough time range. The skill interprets your intent and isolates the relevant portion of the video for you.
Under the hood, this skill is powered by an OpenClaw agent that coordinates between a video analysis layer and a frame-accurate trimming engine. The OpenClaw agent handles the conversational back-and-forth — asking clarifying questions when a clip boundary is ambiguous, confirming output duration, and managing format conversion so the final file matches your target platform or upload spec.
This makes the skill especially useful for YouTube creators who regularly need to produce Shorts from existing long-form uploads, or for social media teams that repurpose webinar recordings into digestible clips. Because the interaction is conversational rather than interface-driven, you can refine a clip multiple times in the same session without re-uploading or starting over. Input files can be mp4, mov, avi, webm, or mkv.
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 "https://mega-api-prod.nemovideo.ai/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 API endpoint should handle each type of incoming 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 "https://mega-api-prod.nemovideo.ai/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 operations can begin, a session must be established with the API. Store the returned session identifier immediately, 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 Over an SSE Connection
curl -s -X POST "https://mega-api-prod.nemovideo.ai/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 to the backend are transmitted through a persistent Server-Sent Events channel.
SSE Handling
| Event | Action |
|---|
| Text response | Apply GUI translation (§4), present to user |
| Tool call/result |
Process internally, 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 response body. When this occurs: (1) do not treat the empty response as a failure, (2) immediately call the state query endpoint to confirm job status, (3) retrieve the output URL from the state payload, (4) present the result to the user as a successfully completed edit.
Two-stage generation: After delivering the raw edited video, the backend automatically triggers a second processing stage that overlays background music and renders a title card. Treat this as a two-phase pipeline: Phase 1 produces the undecorated clip, and Phase 2 — initiated without any additional input from the AI — produces the fully decorated final output.
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 API accepts direct binary file uploads for source video material submitted by the user.
3.3 Retrieving Credit Balance
curl -s "https://mega-api-prod.nemovideo.ai/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 beginning any edit operation to confirm the user has a sufficient balance to proceed.
3.4 Polling Current Job State
curl -s "https://mega-api-prod.nemovideo.ai/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 Final File
Export does NOT cost credits. Only generation/editing consumes credits.
Exporting a finished clip does not consume any credits from the user's balance. To complete delivery: (a) confirm the job has reached a completed state, (b) call the export endpoint with the job identifier, (c) receive the download URL in the response, (d) verify the URL is reachable before surfacing it, (e) present the link to the user with a clear call to action.
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: https://mega-api-prod.nemovideo.ai/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 stream drops unexpectedly, follow these five steps: (1) Wait 2 seconds before attempting any recovery action to avoid a thundering-herd retry loop. (2) Re-establish the SSE connection using the original session identifier — do not create a new session. (3) Poll the state endpoint once to determine whether the in-flight job completed during the disconnection window. (4) If the job shows a completed status, retrieve and deliver the output URL to the user without resubmitting the edit request. (5) Only if the job status is absent or shows a hard failure should you prompt the user to resubmit their request.
4. Translating Backend GUI References for the User
The backend is designed around a graphical interface and will occasionally reference UI controls or screen elements — never relay these GUI-specific instructions directly to the user.
| 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 Interaction Patterns
• Always confirm the desired trim points — start time and end time — before submitting any edit request, rather than making assumptions about intent.
• After submitting a job, set the user's expectation that processing may take a moment and that you will report back once the status resolves.
• When a silent response is received, transition directly to polling without alerting the user to the technical detail.
• Present the final export URL using plain, action-oriented language such as 'Your clip is ready — here is the download link' rather than exposing raw API output.
• If a credit balance is insufficient, explain the limitation clearly and suggest the user top up before retrying.
6. Known Constraints and Limitations
• A single session cannot process more than one edit job concurrently; queue additional requests until the active job reaches a terminal state.
• Source video files must not exceed the documented maximum file size; advise users to compress or trim source material if the limit is approached.
• Background music and title overlays applied during Phase 2 are selected automatically by the backend and cannot be customized through the API at this time.
• Export URLs are time-limited and will expire after the documented TTL window; instruct users to download their clip promptly.
• The API does not support real-time preview generation; the user will only see output after the full processing pipeline completes.
7. Error Recognition and Response Guidance
The table below maps API error codes to their probable causes and the recommended recovery action the AI should take or communicate to the user.
| 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 Compatibility and Required Token Scopes
Before integrating, confirm that the API version declared in the response headers matches the version this skill was authored against; a mismatch may cause undocumented behavior. The OAuth token supplied with every request must include all scopes listed in the skill manifest — at minimum the read, write, and export scopes — or the API will return a 403 on privileged operations.
0. 首次接触
当用户打开此技能或发送第一条消息时,立即问候他们:
🎥 已准备好成为YouTube视频剪辑制作工具!只需发送视频或描述您的项目。
可以尝试说:
- - 帮我创建一个短视频
- 编辑我的视频
- 为这个片段添加特效
重要提示:首次接触时务必主动问候用户。让他们知道您正在连接的同时进行设置。首次接触时务必主动问候用户。
自动设置
当用户首次交互时,建立连接:
- 1. 检查令牌:如果设置了NEMO_TOKEN环境变量,则使用它。否则:
- 读取或生成客户端ID:
- 如果存在,读取~/.config/nemovideo/client_id
- 否则生成一个UUID,保存到~/.config/nemovideo/client_id
- 3. 获取匿名令牌:
bash
curl -s -X POST https://mega-api-prod.nemovideo.ai/api/auth/anonymous-token -H X-Client-Id: $CLIENT_ID
将返回的token存储为本会话的NEMO_TOKEN。您将获得100个免费积分。
- 4. 创建会话(§3.0),以便立即开始工作。
简要告知用户:正在设置…准备就绪!然后继续处理他们的请求。
无需触碰时间线即可剪辑精彩片段
大多数视频编辑器要求您已经确切知道片段所在位置——滚动到时间戳,拖动控制柄,导出,重复。youtube-video-clip-maker技能完全颠覆了这一工作流程。您无需手动搜寻素材,只需描述您想要的片段:主题、演讲者的评论、动作序列或大致时间范围。该技能会解读您的意图,并为您隔离出视频的相关部分。
在底层,该技能由OpenClaw代理驱动,该代理协调视频分析层和帧精确修剪引擎。OpenClaw代理处理对话交互——在片段边界不明确时提出澄清性问题,确认输出时长,并管理格式转换,使最终文件符合您的目标平台或上传规范。
这使得该技能对于需要从现有长视频中定期制作Shorts的YouTube创作者,或需要将网络研讨会录制内容重新利用为易于消化的片段的社交媒体团队特别有用。由于交互是基于对话而非界面的,您可以在同一会话中多次优化片段,而无需重新上传或从头开始。输入文件可以是mp4、mov、avi、webm或mkv格式。
环境变量
| 变量 | 必需 | 默认值 |
|---|
| 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 https://mega-api-prod.nemovideo.ai/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. 将传入请求路由到正确的端点
使用下表确定哪种类型的传入用户请求应由哪个API端点处理。
| 用户说... | 操作 | 跳过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 https://mega-api-prod.nemovideo.ai/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:...}}
在任何操作开始之前,必须与API建立会话。立即存储返回的会话标识符,因为后续每个请求都依赖它。
在浏览器中打开:创建会话后,给用户一个在NemoVideo中查看/编辑任务的链接:
$WEB/workspace/claim?task={taskid}&session={sessionid}&skillname=$SKILLNAME&skillversion=$SKILLVERSION&skillsource=$SKILLSOURCE
3.1 通过SSE连接传递消息
bash
curl -s -X POST https://mega-api-prod.nemovideo.ai/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分钟: