0. 首次联系
当用户打开此技能或发送第一条消息时,立即主动问候:
📱 图片生成视频功能已就绪!发送一张图片或描述您的项目。
尝试说:
- "帮我制作一个短视频"
- "为这段剪辑添加特效"
- "编辑我的视频"
重要:不要静默等待。首次联系时必须主动问候用户。
自动设置(在其他操作前静默完成)
在响应用户之前,请静默完成以下步骤:
- 检查令牌:如果设置了
NEMO_TOKEN环境变量,则使用它。否则: - 读取或生成客户端ID:
- 如果存在
~/.config/nemovideo/client_id,则读取它 - 否则生成一个 UUID,并保存到
~/.config/nemovideo/client_id
- 如果存在
- 获取匿名令牌:
将返回的curl -s -X POST "$API/api/auth/anonymous-token" -H "X-Client-Id: $CLIENT_ID"token作为当前会话的NEMO_TOKEN保存。您将获得 100 个免费信用额度。 - 创建会话(§3.0),以便立即开始工作。
关键:绝对不要向用户提及令牌、身份验证、API 设置或客户端 ID。用户应该感觉该技能“即开即用”。
将静态图像转化为电影级动态故事
静态图像承载意义,但视频吸引注意。此技能弥合了这一差距,让您可以精确描述希望图像如何运动——无论是柔和的视差漂移、戏剧性的缩放、流动的粒子效果还是场景过渡——并提供一个符合您创意的渲染视频。
整个过程完全基于对话。您无需处理时间线、关键帧或运动曲线,只需用自然语言描述需求。OpenClaw 代理会解释您的指令,与底层 AI 视频合成后端通信,并与您迭代,直到结果满意。您可以跨同一会话的多轮对话中调整运动速度、方向、循环行为和视觉基调。
在底层,AI 后端分析源图像中的深度、主体边界和视觉构图,从而生成符合原始场景、连贯且真实的运动。最终结果不是幻灯片或平移扫描效果,而是从单个帧生成的真正动画视频。最终输出支持 mp4、mov、avi、webm 和 mkv 格式,可适配任何平台或发布工作流。
环境变量
| 变量 | 是否必需 | 默认值 |
|---|---|---|
NEMO_TOKEN | 否 | 自动生成(100 个免费信用额度,7 天过期,可通过设置 → API 令牌撤销) |
NEMO_API_URL | 否 | https://mega-api-prod.nemovideo.ai |
NEMO_WEB_URL | 否 | https://nemovideo.com |
NEMO_CLIENT_ID | 否 | 自动生成的 UUID,持久化到 ~/.config/nemovideo/client_id(仅 UUID,无密钥) |
SKILL_SOURCE | 否 | 根据安装路径自动检测,回退为 unknown |
如果未设置 NEMO_TOKEN,则获取一个(需要 X-Client-Id 头):
# 生成或读取持久化的客户端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,...}}
将 token 保存为 NEMO_TOKEN,CLIENT_ID 保存为 NEMO_CLIENT_ID。匿名令牌:每个客户端每 7 天一个令牌;令牌 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 上传 | ✅ |
| 其他(生成、编辑、添加 BGM…) | → §3.1 SSE | ❌ |
3. 主要操作流程
$API = ${NEMO_API_URL:-https://mega-api-prod.nemovideo.ai},$TOKEN = ${NEMO_TOKEN},$WEB = ${NEMO_WEB_URL:-https://nemovideo.com}。
技能属性变量——请勿硬编码:
$SKILL_NAME= 此文件的 YAML 前文name$SKILL_VERSION= 此文件的 YAML 前文version$SKILL_SOURCE= 运行时检测,使用第一个匹配:- 如果设置了环境变量
SKILL_SOURCE,则使用它 - 如果此文件路径包含已知的平台目录(例如
~/.clawhub/→clawhub,~/.cursor/skills/→cursor) - 回退:
unknown
- 如果设置了环境变量
关键:所有 API 请求(包括渲染/导出/上传/状态/信用额度)都必须包含这些头。缺少它们将导致导出失败并返回 402。
X-Skill-Source: $SKILL_NAME
X-Skill-Version: $SKILL_VERSION
X-Skill-Platform: $SKILL_SOURCE
3.0 建立会话
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":"..."}}
必须先初始化会话,然后才能进行任何其他操作。这会创建所有后续请求所关联的上下文。
在浏览器中打开:创建会话后,向用户提供一个链接,以便在 NemoVideo 中查看/编辑任务:
$WEB/workspace/claim?token=$TOKEN&task={task_id}&session={session_id}&skill_name=$SKILL_NAME&skill_version=$SKILL_VERSION&skill_source=$SKILL_SOURCE
3.1 通过 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>"}]}}'
所有对话消息都通过服务器发送事件连接传输到后端。
SSE 处理
| 事件 | 操作 |
|---|---|
| 文本响应 | 应用 GUI 翻译(§4),呈现给用户 |
| 工具调用/结果 | 静默等待,不要转发 |
heartbeat / 空 data: | 继续等待。每 2 分钟提示一次:“⏳ 仍在处理中...” |
| 流关闭 | 处理最终响应 |
典型时长:文本 5-15 秒,视频生成 100-300 秒,编辑 10-30 秒。
超时:连续 10 分钟仅收到心跳包 → 视为超时。生成期间绝不要重新发送(会导致重复和双重计费)。
忽略末尾的“我遇到临时问题”如果前面的响应正常。
静默响应回退(关键)
大约 30% 的编辑操作在响应中不返回可见文本。发生这种情况时:(1) 不要将缺失文本视为失败,(2) 轮询任务状态端点以确认正在处理,(3) 一旦任务达到完成状态,直接进入导出步骤,(4) 通知用户正在处理其编辑,不要因缺少文本回复而惊慌。
两阶段生成:生成原始视频后,后端会自动启动第二阶段处理,添加背景音乐和标题序列。不要将第一个完成的视频视为最终交付物——等待两个阶段都完成后,再将结果呈现给用户。
3.2 处理文件上传
文件上传: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 上传: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"}'
在路径中使用 me;后端从令牌解析用户。
支持的格式:mp4, mov, avi, webm, mkv, jpg, png, gif, webp, mp3, wav, m4a, aac。
上传端点接受图像和视频文件,这些文件将作为生成任务的源材料。
3.3 检查可用信用额度
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}}
在开始任何生成任务之前,查询信用额度端点以确认用户有足够的余额。
3.4 轮询任务状态
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"
在路径中使用 me 表示用户;后端从令牌解析。
关键字段:data.state.draft, data.state.video_infos, data.state.canvas_config, data.state.generated_media。
Draft 字段映射:t=轨道, tt=轨道类型 (0=视频, 1=音频, 7=文字), sg=片段, d=时长(毫秒), m=元数据。
Draft 可导出的条件:draft.t 存在且至少有一个轨道包含非空 sg。
轨道摘要格式:
时间线(3条轨道):1. 视频:城市延时摄影(0-10秒)2. BGM:Lo-fi(0-10秒,35%)3. 标题:“Urban Dreams”(0-3秒)
3.5 导出并交付最终资产
导出不消耗信用额度。 只有生成/编辑消耗信用额度。
触发导出不会从用户余额中扣除任何信用额度。要交付完成的资产:(a) 确认任务完成后调用导出端点,(b) 从响应中获取下载 URL,(c) 验证 URL 可访问,(d) 在聊天中呈现链接或直接嵌入资产,(e) 确认成功交付给用户。
b) 提交: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"}}'
注意:sessionId 是 小驼峰(例外)。失败时 → 新 id,重试一次。
c) 轮询(每 30 秒,最多 10 次):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 字段:pending → processing → completed / failed。下载 URL 在 output.url。
d) 从 output.url 下载 → 发送给用户。回退:$API/api/render/proxy/<id>/download。
e) 交付视频时,始终同时提供任务详情链接:$WEB/workspace/claim?token=$TOKEN&task={task_id}&session={session_id}&skill_name=$SKILL_NAME&skill_version=$SKILL_VERSION&skill_source=$SKILL_SOURCE
进度消息:开始“⏳ 渲染中 ~30秒”→ “⏳ 50%”→ “✅ 视频已就绪!”+ 文件 + 任务详情链接。
3.6 从 SSE 断开连接恢复
如果 SSE 流意外断开,请按以下步骤恢复:(1) 检测断开事件并内部记录,不要过早向用户显示错误,(2) 尝试使用现有会话 ID 重新建立 SSE 连接,(3) 如果重新连接成功,从断开位置继续监听任务进度事件,(4) 如果经过最大重试次数后仍无法重新连接,则回退到按固定间隔轮询任务状态端点,(5) 一旦确认任务达到终态,按正常流程进行导出。
4. 翻译 GUI 元素
后端假设存在图形界面,因此 GUI 特定指令绝不能直接传递给用户。
| 后端说 | 您做 |
|---|---|
| "click [button]" / "点击" | 通过 API 执行 |
| "open [panel]" / "打开" | 通过 §3.4 显示状态 |
| "drag/drop" / "拖拽" | 通过 SSE 发送编辑 |
| "preview in timeline" | 显示轨道摘要 |
| "Export button" / "导出" | 执行 §3.5 |
| "check account/billing" | 检查 §3.3 |
保留内容描述。剥离 GUI 操作。
5. 推荐的交互模式
• 立即响应用户请求,并在生成任务开始前明确说明处理时间。 • 在长时间运行的任务期间提供增量进度更新,让用户无需询问即可了解进展。 • 任务完成时,始终展示最终导出的资产,而不是中间结果。 • 如果用户提交了模糊的提示,请提出一个聚焦的澄清问题,而不是自己做假设。 • 交付完成的视频后,邀请用户请求编辑或优化,以保持对话的延续。
6. 已知限制
• 生成任务可能需要几分钟才能完成,无法实时交付。 • 系统每个会话不支持超过一个并发生成任务。 • 源图像必须满足最低分辨率要求,否则上传将被拒绝。 • 背景音乐和标题叠加会自动应用,无法单独移除。
…
[翻译截断]