用途 本技能用于在 Starchild 上处理所有视频生成请求,底层通过 Starchild 付费代理调用 fal.ai。核心原则是:调用随附脚本,不要重新实现代理、计费、上传等底层管线。
主要能力 支持文生视频(最常见)、图生视频、视频生视频等任务。generate_video 会自动执行“提交 → 轮询 → 获取结果 → 下载 mp4 到 output/videos/”的完整流程。参考素材场景下,会基于 image_url 自动把模型路径从 */text-to-video 改写为 */image-to-video,视频生视频同样适用,传入 mp4 URL 即可。
使用方式
- 文生视频: exec(open('skills/video/generate_video.py').read()) result = generate_video( prompt="A cinematic drone shot over snowy mountains at sunrise", model="balanced", # "budget" | "balanced" | "premium" duration=5, )
result -> {"success": True, "cost": 0.70, "video_url": "...", "local_path": "output/videos/..."}
- 图生视频 / 视频生视频(参考素材): fal.ai 需要参考素材以公开 https URL 提供。由于 fal storage 上传需要 Serverless 权限而当前密钥不具备,可靠做法是通过已发布的 Starchild 预览来暴露素材。标准流程:用 publish_asset.py 把素材放入 output/fal_assets/;确保名为 fal-assets 的预览正在运行且已发布(一次性设置);构造公开 URL <preview_base>/<filename>;调用 generate_video(..., image_url=public_url)。 exec(open('skills/video/publish_asset.py').read()) asset = publish_local('/path/to/your/photo.jpg')
或: publish_from_url('https://example.com/photo.jpg')
filename = asset['filename'] public_url = f"https://community.iamstarchild.com/<user_slug>-fal-assets/{filename}" exec(open('skills/video/generate_video.py').read()) result = generate_video( prompt="gentle cinematic camera push-in", model="balanced", duration=5, image_url=public_url, ) 素材限制(由 publish_asset.py 强制):图片支持 .jpg .jpeg .png .webp .gif .bmp,最大 10 MB;视频支持 .mp4 .mov .webm .mkv .m4v,最大 100 MB;超出范围在发布前被拒绝。
- fal-assets 公开预览的一次性设置(每个工作区运行一次,预览跨会话保持运行): import os, pathlib pathlib.Path('output/fal_assets').mkdir(parents=True, exist_ok=True) if not os.path.exists('output/fal_assets/index.html'): open('output/fal_assets/index.html', 'w').write( '<!doctype html><html><body><h1>fal asset host</h1></body></html>' ) preview(action='serve', dir='output/fal_assets', title='fal-assets') preview(action='publish', preview_id='<id from step 3.2>', slug='fal-assets', title='fal-assets')
→ public base: https://community.iamstarchild.com/<user_slug>-fal-assets/
发布后,公开基础 URL 可复用于后续所有图生视频/视频生视频任务,放入 output/fal_assets/ 的文件立即可通过 <base>/<filename> 访问,无需重新发布。可用 curl -sI 验证(期望 HTTP/2 200,content-type 为 image/* 或 video/*)。若 preview(action='serve') 返回 No available ports in pool,应询问用户可停止哪个已有预览来释放端口,切勿静默终止。
-
模型选择:budget 对应 fal-ai/wan/v2.5/text-to-video,约 $0.25/5s,最快最便宜,适合提示词迭代;balanced 对应 alibaba/happy-horse/text-to-video,约 $0.70/5s,为默认档,唇形同步最佳、适用多数场景;premium 对应 bytedance/seedance-2.0/fast/text-to-video,约 $1.20/5s,运动与镜头调度最佳。可通过传入完整模型 id 覆盖;图生视频变体通过把 text-to-video 替换为 image-to-video 自动推导。价格细节与模型注册表见 generate_video.py::estimate_cost。
-
轮询已有请求: exec(open('skills/video/poll_status.py').read()) result = poll_video("019ded6c-d871-7290-bbf1-ddc6993f8958") 适用于此前 generate_video 超时或仅有 request_id 的情况。
-
随附脚本:generate_video.py(提交 → 轮询 → 下载,处理文生视频与图生视频);publish_asset.py(把本地文件复制或远程 URL 下载到 output/fal_assets/,供 fal-assets 预览提供访问);poll_status.py(按 request_id 恢复轮询,完成后下载结果)。
-
故障排查:image_url 必须为公开 HTTP(S) URL(用 publish_asset.py + fal-assets 预览后传公开 URL);preview serve 返回 No available ports in pool(询问用户停止哪个预览,不要自动终止);COMPLETED 后出现 downstream_service_error(参考素材主机渲染中途失败,可重新编码/缩放为 16:9、重新发布后重试);HTTP 402 insufficient_credits(充值余额,费用在提交时预扣);HTTP 403 endpoint_not_allowed(sc-proxy 仅允许已批准的 fal 视频端点,从模型表中选择);上游 Generation FAILED(缩短提示词、去掉异常词元,改模型前先重试一次);任务 IN_PROGRESS 超过 15 分钟(保存 request_id,稍后用 poll_status.py 恢复)。
-
基础设施(参考):调用方 → sc-proxy → queue.fal.run(以及 api.fal.ai)→ fal 模型提供方。所有请求须带 Authorization: Key fake-falai-key-12345(代理会注入真实的 FAL_KEY)。提交时预扣费用,轮询/结果调用免费。允许的端点:已注册模型的 video text-to-video / image-to-video / video-to-video / edit-video,其他返回 403 endpoint_not_allowed。最终 mp4 位于 https://*.fal.media/... 公共 CDN,下载无需鉴权。
-
维护:新增模型需在 generate_video.py::estimate_cost 与 transparent-proxy/apis/falai.py::_VIDEO_PRICING 中登记价格。本技能刻意不使用 fal storage 上传进行素材托管,因为生产 FAL_KEY 缺少 Serverless 权限;在该情况改变前继续使用基于预览的方式。
适用场景与限制 适用于在 Starchild 环境内发起文生视频、图生视频、视频生视频等生成任务,并需要统一处理计费、模型选择、素材托管与结果轮询的场景。限制包括:参考素材必须可公开访问的 https URL,且需先完成 fal-assets 预览的一次性设置;素材类型与体积受 publish_asset.py 约束;仅允许已注册且获批的 fal 视频端点;费用在提交时预扣;不支持通过 fal storage 上传托管素材。