Appearance
暂不可用
网关翻译层尚未适配 Video Edit 模型的视频输入字段映射(T2V/I2V/R2V 已适配)。当前调用会返回 "video-edit requires exactly 1 video media item" 错误。需等待网关侧更新后方可使用。以下文档基于 DashScope 官方 API 推导,待适配完成后 video_url 字段格式可能会调整。
下载原始 Skill 文件
bash
curl https://ai.ospreyai.cn/docs/raw/skills/happyhorse-video-edit.md -o happyhorse-video-edit.md对话式接入
本 Skill 文件可被 AI 助手(Claude Code、Cursor、ChatGPT 等)学习,通过自然语言对话完成视频编辑。
在 AI 对话中发送以下指令即可:
学习:https://ai.ospreyai.cn/docs/raw/skills/happyhorse-video-edit.md,保存为本地的技能 skills更多接入方式和使用示例详见 API 文档 — AI 助手对话式接入。
HappyHorse 1.0 视频编辑 (Video Edit) — 暂不可用
Overview
通过 Open.OspreyAI 网关 https://open.ospreyai.cn 使用 HappyHorse 1.0 模型,对已有视频进行编辑:风格变换、局部替换等。支持输入视频 + 可选参考图 + 文字指令。
HappyHorse Video Edit 是视频编辑模型,输入一段待编辑视频,可选 0-5 张参考图片,配合文字指令完成各种编辑任务。输出视频时长 3-15 秒(输入视频 ≤15 秒时,输出与输入时长一致)。采用异步任务模式:提交任务 → 轮询状态 → 下载视频。
核心特性:
- 视频编辑:对已有视频进行风格变换、局部替换等编辑
- 参考图引导:可选 0-5 张参考图片,引导编辑效果
- 文字指令:prompt 描述编辑意图(风格转换、替换物体等)
- 高清输出:支持 720P、1080P 分辨率
- 保持时长:输入视频 ≤15 秒时,输出时长与输入一致
- 异步任务:提交后立即返回 task_id,后台编辑完成后通过 OSS 临时链接下载
API 参考文档:阿里云 — HappyHorse 视频编辑 API
与其他 HappyHorse Skill 的对比:
| Skill | 模型 | 输入 | 输出 | 适用场景 |
|---|---|---|---|---|
| HappyHorse 文生视频 | T2V | 文字提示词 | 1-10s 视频 | 纯文字驱动 |
| HappyHorse 图生视频 | I2V | 1 张首帧 + 文字 | 3-15s 视频 | 图片动态化 |
| HappyHorse 参考视频 | R2V | 1-6 张参考图 + 文字 | 3-15s 视频 | 多图融合 |
| 本 Skill | Video Edit | 视频 + 可选参考图 + 文字 | 3-15s 视频 | 视频编辑、风格变换 |
⚠️ 注意:Video Edit 模型的网关请求格式(
video_url字段)尚未完成端到端验证。网关翻译层目前对 T2V/I2V/R2V 已完成适配,Video Edit 可能尚需等待网关侧更新。以下文档基于 DashScope 官方 API 和已有 HappyHorse 模型的适配规律推导,实际调用时如遇格式错误,请联系网关管理员确认最新适配状态。
所有 API 均需 Bearer Token 鉴权(Authorization: Bearer sk-xxx)。
Quick Start
bash
export GW="https://open.ospreyai.cn"
export API_KEY="sk-your-api-key"
# 1. 提交视频编辑任务
curl -s -X POST "$GW/v1/video/generations" \
-H "X-DashScope-Async: enable" \
-H "Authorization: Bearer $API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "happyhorse-1.0-video-edit",
"prompt": "让视频中的角色穿上图片中的条纹毛衣",
"video_url": "https://example.com/video.mp4",
"images": ["https://example.com/clothes.png"],
"resolution": "720P",
"watermark": false
}'
# 响应: {"task_id": "task_xxx", "status": "queued"}
# 2. 轮询任务状态(视频编辑通常需要数分钟)
curl -s "$GW/v1/video/generations/{task_id}" \
-H "Authorization: Bearer $API_KEY"
# 3. 下载编辑后的视频
curl -sL "{result_url}" -o edited_video.mp4Task Routing
| 场景 | 动作 |
|---|---|
| 首次编辑视频 | → Route A: Submit Task |
| 需要查看任务是否完成 | → Route B: Check Status |
| 需要获取或下载视频 | → Route C: Download |
| 需要调优参数 | → Route D: Tune Parameters |
| 需要排查错误 | → Route E: Troubleshoot |
Route A: Submit Task
服务信息
- 网关地址:
https://open.ospreyai.cn - 提交接口:
POST /v1/video/generations - 查询接口:
GET /v1/video/generations/{task_id} - 鉴权方式:
Authorization: Bearer sk-xxx - 异步头:
X-DashScope-Async: enable
Step 1: 提交视频编辑任务
bash
curl -s -X POST "$GW/v1/video/generations" \
-H "X-DashScope-Async: enable" \
-H "Authorization: Bearer $API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "happyhorse-1.0-video-edit",
"prompt": "将视频转换为水彩画风格",
"video_url": "https://example.com/video.mp4",
"resolution": "720P",
"watermark": false
}'响应:
json
{
"id": "task_xxxxxxxxxxxxxxxxxxxxxxxxx",
"task_id": "task_xxxxxxxxxxxxxxxxxxxxxxxxx",
"object": "video",
"model": "happyhorse-1.0-video-edit",
"status": "queued",
"progress": 0,
"created_at": 1780000000
}记住
task_id,用于后续查询任务状态和获取视频。
请求参数
| 字段 | 类型 | 必填 | 说明 | 示例值 |
|---|---|---|---|---|
| model | string | ✅ | 模型名称 | "happyhorse-1.0-video-edit" |
| prompt | string | ✅ | 编辑指令(描述编辑意图) | "将视频转换为水彩画风格" |
| video_url | string | ✅ | 待编辑视频 URL | "https://example.com/video.mp4" |
| images | array | ❌ | 参考图片 URL 数组,0-5 张 | ["https://..."] |
| resolution | string | ❌ | 分辨率:720P / 1080P | "720P" |
| watermark | boolean | ❌ | 是否添加水印,默认 true | false |
| seed | integer | ❌ | 随机种子 [0, 2147483647] | 42 |
video_url 字段说明
video_url 是待编辑视频的 URL,支持两种格式:
公网 URL:HTTP 或 HTTPS 协议
json"video_url": "https://example.com/video.mp4"Base64 编码(不推荐,视频文件较大):
json"video_url": "data:video/mp4;base64,AAAA..."
视频要求
| 限制项 | 要求 |
|---|---|
| 时长 | 3-60 秒 |
| 分辨率 | 长边不超过 1920 像素 |
| 文件大小 | 不超过 100MB |
| 格式 | MP4(推荐)、MOV |
⚠️ 输出视频时长为 3-15 秒。当输入视频 ≤15 秒时,输出时长与输入一致;超过 15 秒时,输出固定为 15 秒。
images 字段说明(可选)
images 是参考图片 URL 数组,用于引导编辑效果:
json
"images": [
"https://example.com/reference1.png",
"https://example.com/reference2.png"
]在 prompt 中通过 [Image N] 引用对应图片:
让视频中的角色穿上[Image 1]中的衣服,背景换成[Image 2]的风格参考图片要求
| 限制项 | 要求 |
|---|---|
| 格式 | JPEG、JPG、PNG、WEBP |
| 分辨率 | 宽和高均不小于 300 像素 |
| 宽高比 | 1:2.5 ~ 2.5:1 |
| 文件大小 | 不超过 20MB |
| 数量 | 0-5 张(可选) |
请求头
| Header | 说明 |
|---|---|
X-DashScope-Async: enable | 启用异步任务模式(必传) |
Authorization: Bearer sk-xxx | API 鉴权 |
Content-Type: application/json | JSON 请求体 |
Route B: Check Status
查询任务状态
bash
curl -s "$GW/v1/video/generations/{task_id}" \
-H "Authorization: Bearer $API_KEY"进行中:
json
{
"code": "success",
"data": {
"task_id": "task_xxxxxxxxxxxxxxxxxxxxxxxxx",
"status": "IN_PROGRESS",
"progress": "50%",
"submit_time": 1780000000,
"start_time": 1780000001,
"finish_time": 0,
"data": {
"output": {
"task_id": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"task_status": "RUNNING"
}
}
}
}已完成:
json
{
"code": "success",
"data": {
"task_id": "task_xxxxxxxxxxxxxxxxxxxxxxxxx",
"status": "SUCCESS",
"progress": "100%",
"result_url": "https://dashscope-a717.oss-accelerate.aliyuncs.com/...",
"submit_time": 1780000000,
"start_time": 1780000001,
"finish_time": 1780000120,
"data": {
"usage": {
"SR": 720,
"duration": 13.24,
"input_video_duration": 6.62,
"output_video_duration": 6.62,
"video_count": 1
},
"output": {
"task_id": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"video_url": "https://dashscope-a717.oss-accelerate.aliyuncs.com/...",
"orig_prompt": "让视频中的角色穿上图片中的条纹毛衣",
"task_status": "SUCCEEDED"
}
}
}
}任务状态流转
queued → IN_PROGRESS (50%) → SUCCESS (100%) / FAILED| 状态 | 说明 |
|---|---|
queued | 任务已提交,排队等待 |
IN_PROGRESS | 正在编辑中 |
SUCCESS | 编辑成功,可下载视频 |
FAILED | 编辑失败,查看 fail_reason |
⚠️ 视频编辑任务耗时较长(通常 2-10 分钟),比 T2V/I2V/R2V 更久,请耐心等待。
Route C: Download
任务成功后,从响应中获取视频下载链接:
data.result_url:顶层字段,直接的下载 URLdata.data.output.video_url:嵌套字段,同上
两个 URL 相同,均为阿里云 OSS 临时链接(有效期约 24 小时)。
bash
# 直接下载
curl -sL "{result_url}" -o edited_video.mp4⚠️ 视频 URL 带签名参数,有效期约 24 小时(
Expires参数控制),过期后需重新查询任务获取新链接。
Python 调用示例
python
import requests
import time
GW = "https://open.ospreyai.cn"
API_KEY = "sk-your-api-key"
headers = {
"Authorization": f"Bearer {API_KEY}",
"Content-Type": "application/json",
"X-DashScope-Async": "enable"
}
# 1. 提交视频编辑任务
resp = requests.post(f"{GW}/v1/video/generations", headers=headers, json={
"model": "happyhorse-1.0-video-edit",
"prompt": "让视频中的角色穿上[Image 1]中的条纹毛衣",
"video_url": "https://example.com/video.mp4",
"images": ["https://example.com/clothes.png"],
"resolution": "720P",
"watermark": false
})
task = resp.json()
task_id = task["task_id"]
print(f"Task submitted: {task_id}")
# 2. 轮询任务状态(视频编辑耗时较长,间隔可设大些)
headers_query = {"Authorization": f"Bearer {API_KEY}"}
while True:
resp = requests.get(f"{GW}/v1/video/generations/{task_id}", headers=headers_query)
data = resp.json().get("data", {})
status = data.get("status", "")
progress = data.get("progress", "")
if status == "SUCCESS":
video_url = data.get("result_url") or data.get("data", {}).get("output", {}).get("video_url")
print(f"Video ready: {video_url}")
break
elif status == "FAILED":
print(f"Failed: {data.get('fail_reason')}")
break
print(f"Status: {status} ({progress})")
time.sleep(10) # 视频编辑耗时长,10秒轮询
# 3. 下载视频
if status == "SUCCESS":
resp = requests.get(video_url)
with open("edited_video.mp4", "wb") as f:
f.write(resp.content)
print(f"Downloaded: edited_video.mp4 ({len(resp.content)} bytes)")Route D: Tune Parameters
分辨率
| 值 | 说明 | 生成时间 |
|---|---|---|
720P | 720p 标清 | 较快 |
1080P | 1080p 高清 | 较慢 |
⚠️ Video Edit 不支持
duration和ratio参数。输出视频时长由输入视频决定(≤15 秒时保持一致),画面比例与输入视频一致。
水印
| 值 | 说明 |
|---|---|
false | 不添加水印(推荐,示例中默认使用) |
true | 添加水印,右下角显示 "Happy Horse"(API 默认值) |
种子
| 值 | 说明 |
|---|---|
0 - 2147483647 | 固定 seed 可提高结果复现性 |
| 不传 | 系统自动生成随机种子 |
Prompt 编写技巧
Video Edit 的 prompt 用于描述编辑意图:
风格转换:
"将视频转换为水彩画风格"
"将视频转换为赛博朋克风格,增加霓虹灯光效果"
"将视频转换为黑白电影风格"局部替换(配合参考图):
"让视频中的角色穿上[Image 1]中的条纹毛衣"
"将视频中的汽车替换为[Image 1]中的红色跑车"
"将视频中的天空替换为[Image 1]中的星空"添加/移除元素:
"在视频背景中添加樱花飘落的效果"
"移除视频中的文字水印"
"为视频中的角色添加墨镜"运动调整:
"将视频转换为慢动作效果"
"增加镜头推进效果"
"让视频中的角色动作更加流畅"视频编辑示例
纯视频 + 指令(无参考图):
json
{
"model": "happyhorse-1.0-video-edit",
"prompt": "将视频转换为水彩画风格",
"video_url": "https://example.com/video.mp4",
"resolution": "720P"
}视频 + 参考图 + 指令:
json
{
"model": "happyhorse-1.0-video-edit",
"prompt": "让视频中的马头人身角色穿上[Image 1]中的条纹毛衣",
"video_url": "https://example.com/video.mp4",
"images": ["https://example.com/clothes.png"],
"resolution": "720P"
}视频 + 多张参考图 + 复杂指令:
json
{
"model": "happyhorse-1.0-video-edit",
"prompt": "将视频中的角色服装替换为[Image 1]中的西装,背景替换为[Image 2]中的办公室场景",
"video_url": "https://example.com/video.mp4",
"images": [
"https://example.com/suit.png",
"https://example.com/office.png"
],
"resolution": "1080P"
}输出视频参数
- 分辨率: 720P 或 1080P(按请求参数)
- 比例: 与输入视频一致(无
ratio参数) - 时长: 3-15 秒(输入 ≤15 秒时保持一致,超过 15 秒时输出 15 秒)
- 格式: MP4
- 文件大小: 约 5-30 MB
Route E: Troubleshoot
| 问题 | 排查方法 |
|---|---|
Invalid URL | 检查 URL 是否为 /v1/video/generations(不是 /v1/services/aigc/...) |
prompt is required | prompt 是必填字段,必须在顶层 |
video_url is required | video_url 是必填字段,必须提供待编辑视频的 URL |
happyhorse supports video task relay only | 不能走 /v1/chat/completions 或 /v1/images/generations,必须走 /v1/video/generations |
| 401 鉴权失败 | 检查 Bearer Token 是否有效 |
| 任务长时间 IN_PROGRESS | 视频编辑通常需要 2-10 分钟,比生成任务更久,耐心等待 |
| 任务 FAILED | 检查 fail_reason 字段,可能是视频不合规或模型过载 |
| 视频 URL 过期 | 重新查询任务状态获取新的 result_url |
| 视频不符合要求 | 检查时长(3-60s)、分辨率(长边≤1920px)、大小(≤100MB) |
| 图片不符合要求 | 检查格式(JPEG/PNG/WEBP)、分辨率(≥300px)、宽高比(1:2.5~2.5:1)、大小(≤20MB) |
请求格式对比(常见错误)
| 项目 | ❌ 错误(DashScope 原始格式) | ✅ 正确(网关适配格式) |
|---|---|---|
| URL | /v1/services/aigc/video-generation/video-synthesis | /v1/video/generations |
| prompt | {"input": {"prompt": "..."}} | {"prompt": "..."} |
| 视频 | {"input": {"media": [{"type": "video", "url": "..."}]}} | {"video_url": "..."} |
| 参考图 | {"input": {"media": [..., {"type": "reference_image", "url": "..."}]}} | {"images": ["..."]} |
| 参数 | {"parameters": {"resolution": "720P"}} | {"resolution": "720P"} |
⚠️ 关键差异:网关将 DashScope 的
input.media拆分为:
video_url:视频 URL(对应type: "video")images:参考图片 URL 数组(对应type: "reference_image")
与其他 HappyHorse 模型的关键差异
| 特性 | Video Edit(本 Skill) | T2V | I2V | R2V |
|---|---|---|---|---|
| 模型 | happyhorse-1.0-video-edit | happyhorse-1.0-t2v | happyhorse-1.0-i2v | happyhorse-1.0-r2v |
| 输入 | 视频 + 可选参考图 + 文字 | 纯文字 | 首帧图 + 文字 | 1-6 张参考图 + 文字 |
| 视频输入 | ✅ video_url | 无 | 无 | 无 |
| 图片输入 | images(0-5 张) | 无 | images(1 张) | images(1-6 张) |
| ratio | 无(由输入视频决定) | ✅ | 无 | ✅ |
| duration | 无(由输入视频决定) | ✅ 1-10s | ✅ 3-15s | ✅ 3-15s |
| 生成时间 | 2-10 分钟 | 1-3 分钟 | 1-3 分钟 | 1-5 分钟 |
| 适合场景 | 视频编辑、风格变换 | 创意视频 | 图片动态化 | 多图融合 |
Verification Checklist
- [ ] 请求 URL 为
POST /v1/video/generations(不是 DashScope 原始路径) - [ ] 请求头包含
X-DashScope-Async: enable - [ ]
prompt在顶层(必填,描述编辑意图) - [ ]
video_url在顶层(必填,待编辑视频 URL) - [ ]
images在顶层(可选,参考图片 URL 数组,0-5 张) - [ ] 视频 URL 可公网访问,格式符合要求(时长 3-60s,≤100MB)
- [ ] 图片 URL 可公网访问,格式符合要求(≥300px,≤20MB)
- [ ] 提交成功,返回
task_id和status: "queued" - [ ] 轮询
GET /v1/video/generations/{task_id}直到status: "SUCCESS"(间隔建议 10 秒) - [ ] 从
result_url获取视频下载链接 - [ ] 下载 MP4 文件并可正常播放
- [ ] 编辑效果符合 prompt 描述