Getting Started
Welcome! Ready to make your footage look perfect on mobile Drop your video file and tell me how you'd like it reframed — whether it's cropping for Reels, adjusting for Shorts, or repositioning a subject for a 9:16 layout, let's get your vertical video edit started.
Try saying:
- - "Crop this landscape interview video to 9:16 and keep the speaker centered throughout"
- "Convert this 16:9 product demo to vertical format and add space at the top for a text overlay"
- "Reframe this travel clip for Instagram Reels — the horizon should stay level and cut out the dead space on the sides"
First-Time Connection
When a user first opens this skill, connect to the NemoVideo backend automatically. Briefly let them know (e.g. "Connecting to NemoVideo...").
Authentication: Check if NEMO_TOKEN is set in the environment. If it is, skip to step 3.
- 1. Client identifier: Look for
~/.config/nemovideo/client_id. If missing, generate a UUID and save it there. This file stores only a UUID for rate-limit tracking. - Obtain a free token: POST to
https://mega-api-prod.nemovideo.ai/api/auth/anonymous-token with header X-Client-Id set to your identifier. The response data.token is your NEMO_TOKEN — 100 free credits, valid 7 days. - Create a session: POST to
https://mega-api-prod.nemovideo.ai/api/tasks/me/with-session/nemo_agent with Authorization: Bearer <token>, Content-Type: application/json, and body {"task_name":"project","language":"<detected>"}. Store the returned session_id for all subsequent requests.
Keep setup communication brief. Don't display raw API responses or token values to the user.
Turn Any Footage Into Scroll-Stopping Vertical Content
Most video is shot wide — but audiences scroll tall. This skill exists to close that gap without making you relearn an editing suite or wrestle with export presets. Whether you're repurposing a landscape interview, a product demo, or a travel clip, the vertical-video-editor intelligently identifies the focal point of each scene and repositions the frame so nothing important gets cut off.
You stay in control of the creative decisions. Want the subject anchored to the left third Need safe zones respected for caption overlays Prefer a cinematic crop that follows motion Just describe it. The skill interprets your instructions and applies them consistently across the full clip — not just a single keyframe.
The result is a video that looks like it was composed for vertical from the start, not squeezed or letterboxed into an awkward format. For content teams publishing across multiple platforms, this means one source file can feed every channel without a separate manual edit for each.
Routing Your Reframe Requests
Every crop, reframe, and aspect-ratio conversion request is parsed for intent — whether you're punching in on a subject, converting 16:9 landscape footage to 9:16 vertical, or trimming dead space from the frame — and routed to the matching NemoVideo processing endpoint automatically.
| 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 | ❌ |
NemoVideo API Under the Hood
The NemoVideo backend handles all the heavy lifting: smart reframing with subject-tracking, lossless crop calculations, and mobile-optimized rendering for Reels, Shorts, and TikTok specs. Each API call passes your clip metadata, target resolution, and reframe parameters directly to the processing pipeline, so output stays frame-accurate every time.
Skill attribution — read from this file's YAML frontmatter at runtime:
- -
X-Skill-Source: INLINECODE11 - INLINECODE12 : from frontmatter INLINECODE13
- INLINECODE14 : detect from install path (
~/.clawhub/ → clawhub, ~/.cursor/skills/ → cursor, else unknown)
All requests must include: Authorization: Bearer <NEMO_TOKEN>, X-Skill-Source, X-Skill-Version, X-Skill-Platform. Missing attribution headers will cause export to fail with 402.
API base: INLINECODE24
Create session: POST /api/tasks/me/with-session/nemo_agent — body {"task_name":"project","language":"<lang>"} — returns task_id, session_id. After creating a session, give the user a link: INLINECODE29
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: INLINECODE35
Credits: GET /api/credits/balance/simple — returns available, frozen, INLINECODE39
Session state: GET /api/state/nemo_agent/me/<sid>/latest — key fields: data.state.draft, data.state.video_infos, INLINECODE43
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.
SSE Event 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 |
~30% of editing operations return no text in the SSE stream. When this happens: poll session state to verify the edit was applied, then summarize changes to the user.
Backend Response Translation
The backend assumes a GUI exists. Translate these into API actions:
| Backend says | You do |
|---|
| "click [button]" / "点击" | Execute via API |
| "open [panel]" / "打开" |
Query session state |
| "drag/drop" / "拖拽" | Send edit via SSE |
| "preview in timeline" | Show track summary |
| "Export button" / "导出" | Execute export workflow |
Draft field mapping: t=tracks, tt=track type (0=video, 1=audio, 7=text), sg=segments, d=duration(ms), m=metadata.
CODEBLOCK0
Error Handling
| 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 |
Integration Guide
The vertical-video-editor skill fits naturally into content production pipelines where footage is captured on traditional cameras or screen recorders and then distributed to mobile-first platforms. You can feed it raw exports directly from your editing software — no special pre-processing required before upload.
If you're working across a team, the skill accepts the same source file multiple times with different framing instructions, making it straightforward to produce platform-specific variants (TikTok, Reels, Shorts) from a single master clip without duplicating manual work.
Output files are returned in a format ready for direct upload to social platforms or for import back into your editing timeline as a treated asset. This makes it practical as a mid-pipeline step rather than only a final export tool — you can reframe first, then layer in graphics or music in your preferred software afterward.
Performance Notes
Processing time scales with file size and the complexity of the reframing instructions. A 60-second mp4 under 200MB with a static subject typically completes quickly, while longer clips with fast motion or multi-subject scenes require more analysis to maintain accurate focal tracking throughout.
For best results, upload the highest quality source file you have — the skill works from the original resolution and outputs at the target aspect ratio without unnecessary compression artifacts. If your clip contains rapid cuts between scenes, specifying per-scene framing preferences in your prompt will produce more precise results than a single global instruction.
Supported formats include mp4, mov, avi, webm, and mkv. Very large files (over 1GB) may benefit from being trimmed to the relevant segment before upload to reduce turnaround time.
Common Workflows
The most frequent use case is repurposing existing horizontal content — taking a YouTube video, webinar recording, or brand film and extracting a vertical cut for social distribution. Users typically prompt with the subject to track, the desired safe zones for captions, and whether they want hard cuts to match the original edit or a smoother, trimmed-down version.
A second common workflow is live-event or interview footage where a single wide shot needs to become multiple vertical clips, each focused on a different speaker or moment. Describing the timestamps and subjects in your prompt lets the skill handle each segment with the right framing independently.
Creators also use this skill to fix aspect ratio mismatches when footage was accidentally recorded in the wrong orientation or exported with black bars — a quick reframe pass removes the bars and produces a clean, properly composed vertical file without re-shooting.
开始使用
欢迎!准备好让你的视频素材在手机上呈现完美效果了吗?上传你的视频文件,告诉我你希望如何重新构图——无论是裁剪成Reels格式、调整为Shorts规格,还是为9:16布局重新定位主体,让我们开始你的竖版视频编辑之旅。
试试这样说:
- - 将这段横屏采访视频裁剪为9:16,并保持演讲者始终居中
- 将这段16:9的产品演示转换为竖版格式,并在顶部为文字叠加留出空间
- 将这段旅行片段重新构图以适应Instagram Reels——保持地平线水平,裁掉两侧的空白区域
首次连接
当用户首次打开此技能时,自动连接到NemoVideo后端。简要告知用户(例如:正在连接NemoVideo...)。
身份验证:检查环境中是否设置了NEMO_TOKEN。如果已设置,跳至第3步。
- 1. 客户端标识符:查找~/.config/nemovideo/clientid。如果不存在,生成一个UUID并保存在该位置。此文件仅存储用于速率限制追踪的UUID。
- 获取免费令牌:向https://mega-api-prod.nemovideo.ai/api/auth/anonymous-token发送POST请求,请求头X-Client-Id设置为你标识符。响应中的data.token即为你的NEMOTOKEN——100个免费积分,有效期7天。
- 创建会话:向https://mega-api-prod.nemovideo.ai/api/tasks/me/with-session/nemoagent发送POST请求,包含Authorization: Bearer 、Content-Type: application/json以及请求体{taskname:project,language:<检测到的语言>}。存储返回的session_id用于所有后续请求。
保持设置沟通简洁。不要向用户显示原始API响应或令牌值。
将任何视频素材转化为令人驻足的竖版内容
大多数视频以宽屏格式拍摄——但观众以竖屏方式浏览。此技能旨在弥合这一差距,无需你重新学习编辑套件或与导出预设搏斗。无论是重新利用横屏采访、产品演示还是旅行片段,竖版视频编辑器都能智能识别每个场景的焦点并重新定位画面,确保重要内容不被裁切。
你始终掌控创作决策。希望主体固定在左侧三分之一处?需要为字幕叠加保留安全区域?偏好跟随运动的电影级裁剪?只需描述即可。该技能会解读你的指令,并在整个片段中一致应用——而不仅仅是单个关键帧。
最终效果是视频看起来从一开始就是为竖屏构图,而非被挤压或加黑边成尴尬格式。对于跨多个平台发布的内容团队而言,这意味着一个源文件可以供给所有渠道,无需为每个平台单独手动编辑。
路由你的重新构图请求
每个裁剪、重新构图和宽高比转换请求都会被解析意图——无论是放大主体、将16:9横屏素材转换为9:16竖版,还是裁切画面中的空白区域——并自动路由到匹配的NemoVideo处理端点。
| 用户说... | 操作 | 跳过SSE |
|---|
| export / 导出 / download / send me the video | → §3.5 导出 | ✅ |
| credits / 积分 / balance / 余额 |
→ §3.3 积分 | ✅ |
| status / 状态 / show tracks | → §3.4 状态 | ✅ |
| upload / 上传 / 用户发送文件 | → §3.2 上传 | ✅ |
| 其他所有内容(生成、编辑、添加背景音乐等) | → §3.1 SSE | ❌ |
NemoVideo API 底层机制
NemoVideo后端处理所有繁重工作:带主体追踪的智能重新构图、无损裁剪计算,以及针对Reels、Shorts和TikTok规格的移动端优化渲染。每次API调用都将你的片段元数据、目标分辨率和重新构图参数直接传递给处理管道,确保每次输出都保持帧级精度。
技能归属——运行时从此文件的YAML前置元数据读取:
- - X-Skill-Source:vertical-video-editor
- X-Skill-Version:来自前置元数据version
- X-Skill-Platform:从安装路径检测(~/.clawhub/ → clawhub,~/.cursor/skills/ → cursor,否则 → unknown)
所有请求必须包含:Authorization: Bearer 、X-Skill-Source、X-Skill-Version、X-Skill-Platform。缺少归属头将导致导出失败并返回402错误。
API基础地址:https://mega-api-prod.nemovideo.ai
创建会话:POST /api/tasks/me/with-session/nemoagent — 请求体{taskname:project,language:<语言>} — 返回taskid、sessionid。创建会话后,给用户一个链接:https://nemovideo.com/workspace/claim?task=id>&session=id>&skillname=vertical-video-editor&skillversion=1.0.0&skill_source=<平台>
发送消息(SSE):POST /runsse — 请求体{appname:nemoagent,userid:me,sessionid:,newmessage:{parts:[{text:<消息>}]}},包含Accept: text/event-stream。最大超时时间:15分钟。
上传:POST /api/upload-video/nemoagent/me/ — 文件:multipart -F files=@/路径,或URL:{urls:[],sourcetype:url}
积分:GET /api/credits/balance/simple — 返回available、frozen、total
会话状态:GET /api/state/nemoagent/me//latest — 关键字段:data.state.draft、data.state.videoinfos、data.state.generated_media
导出(免费,不消耗积分):POST /api/render/proxy/lambda — 请求体{id:render_<时间戳>,sessionId:,draft:,output:{format:mp4,quality:high}}。每30秒轮询GET /api/render/proxy/lambda/,直到status = completed。下载URL位于output.url。
支持的格式:mp4、mov、avi、webm、mkv、jpg、png、gif、webp、mp3、wav、m4a、aac。
SSE事件处理
| 事件 | 操作 |
|---|
| 文本响应 | 应用GUI翻译(§4),呈现给用户 |
| 工具调用/结果 |
内部处理,不转发 |
| heartbeat / 空data: | 继续等待。每2分钟:⏳ 仍在处理中... |
| 流关闭 | 处理最终响应 |
约30%的编辑操作在SSE流中不返回文本。当发生这种情况时:轮询会话状态以验证编辑是否已应用,然后向用户总结更改内容。
后端响应翻译
后端假设存在GUI。将这些翻译为API操作:
| 后端说 | 你执行 |
|---|
| click [button] / 点击 | 通过API执行 |
| open [panel] / 打开 |
查询会话状态 |
| drag/drop / 拖拽 | 通过SSE发送编辑 |
| preview in timeline | 显示轨道摘要 |
| Export button / 导出 | 执行导出工作流 |
草稿字段映射:t=轨道,tt=轨道类型(0=视频,1=音频,7=文字),sg=片段,d=时长(毫秒),m=元数据。
时间线(3条轨道):1. 视频:城市延时摄影(0-10秒)2. 背景音乐:Lo-fi(0-10秒,35%)3. 标题:都市梦想(0-3秒)
错误处理
令牌错误/过期 | 通过anonymous-token重新认证(令牌7天后过期) |
| 1002 | 会话未找到 | 新建会话 §3.0 |
| 2001 | 无积分 | 匿名用户:显示注册URL,附带?bind=
(需要时从create-session或state响应获取)。已注册用户:请在nemovideo.ai充值 |
| 4001 | 不支持的文件 | 显示