Zopia 是一个项目制的 AI 视频创作平台。每个项目包含完整的创作流水线: 剧本 → 角色 → 分镜 → 视频,由后端 AI Agent 自动驱动。你通过脚本管理项目、传达用户意图、追踪进度、获取成果。
bash
export ZOPIA_ACCESS_KEY="zopia-xxxxxxxxxxxx" # 必需,30天有效
export ZOPIA_BASE_URL="https://zopia.ai" # 可选
仅使用 Python 标准库,无需额外安装。
概念说明Project (Base)创作项目,包含设置、剧集、所有资产。创建时自动生成首集Episode剧集,同一项目下可创建多集,每集有独立的剧本/角色/分镜Session一次 Agent 对话。异步执行,通过轮询获取进展Workspace项目的实时工作区快照,包含角色(entities)、分镜(storyboard)、各媒体的生成状态
脚本用途关键参数create_project.py创建项目[名称]``save_settings.py项目设置--base-id --style --aspect-ratio --video-model --storyboard-image-model --entity-image-model ...send_message.py发送创作指令(异步)--base-id --episode-id 消息``query_session.py查询进展SESSION_ID --poll --after-seq N``download_results.py下载媒体资源SESSION_ID --output-dir --type image|video``get_balance.py余额查询—list_projects.py列出项目--page --page-size``manage_episodes.py剧集管理list|create|delete``render_episode.py合成最终视频trigger|status --base-id --episode-id --poll
创建项目后,必须配置基础设置(locale / aspect_ratio / style)才能开始创作。
bash
python3 {baseDir}/scripts/save_settings.py --base-id BASE_ID \
--locale zh-CN --aspect-ratio 16:9 --style realistic_3d_cg
ID说明anime_japanese_korean日韩动漫realistic_3d_cg3D CG 写实 🔥pixar_3d_cartoonPixar 3D 卡通photorealistic_real_human真人写实3D_CG_Animation3D CG 动画 🔥anime_chibiQ版可爱anime_shinkai新海诚anime_ghibli吉卜力stylized_pixel像素艺术
别名支持: realistic → realistic_3d_cg, ghibli → anime_ghibli, shinkai → anime_shinkai, pixel → stylized_pixel
不同模型支持不同的生成方式(generation_method),不匹配会报错。
模型 ID名称支持的方式默认generate_video_by_seedance_20Seedance 2.0 Pro ⭐n_grid, video_ref, multi_ref, multi_ref_v2video_refgenerate_video_by_seedance_20_fastSeedance 2.0 Fastn_grid, video_ref, multi_ref, multi_ref_v2video_refgenerate_video_by_kling_o3Kling O3start_frame, n_grid, multi_ref, multi_ref_v2n_gridgenerate_video_by_kling_v3_0Kling V3.0start_frame, n_gridn_gridgenerate_video_by_pixverse_c1PixVerse C1start_frame, multi_refstart_framegenerate_video_by_hailuo_02Hailuo 2.3start_framestart_framegenerate_video_by_wan26_i2vWan 2.6start_framestart_framegenerate_video_by_wan26_i2v_flashWan 2.6 Flashstart_framestart_framegenerate_video_by_viduq2_proVidu Q2 Prostart_framestart_framegenerate_video_by_viduq3_proVidu Q3 Prostart_framestart_framegenerate_video_by_viduq3Vidu Q3n_grid, multi_ref, multi_ref_v2n_gridgenerate_video_by_seedance_15Seedance 1.5 Prostart_framestart_frame
分镜关键帧( storyboard_image_model)与角色/场景设定图( entity_image_model)使用独立的图片模型,可分别配置。
模型 ID名称默认场景generate_image_by_nano_banana_2Nano Banana 2storyboard 默认generate_image_by_doubao_seedream_4Doubao Seedream 4entity 默认generate_image_by_nano_bananaNano Banana—generate_image_by_gpt_image_2 ⭐GPT Image 2—
不传则后端使用默认值。传非法 ID 后端会返回 invalid_storyboard_image_model / invalid_entity_image_model 400 错误,并在响应的 allowed_values 字段给出当前可用列表。
字段可选值--aspect-ratio``16:9, 9:16``--image-size``1k, 2K, 4K(注意 1k 小写)--video-resolution``480p, 720p, 1080p``--generation-method``n_grid, multi_ref, multi_ref_v2, start_frame, video_ref``--storyboard-image-model见上方"图片模型"表--entity-image-model见上方"图片模型"表
理解这些场景,才能正确组合脚本完成用户需求。
text
1. get_balance.py → 确认余额 ≥ 10
2. create_project.py "赛博朋克短剧" → 拿到 baseId, episodeId
3. save_settings.py --base-id B \
--locale zh-CN --aspect-ratio 16:9 \
--style anime_japanese_korean → 配置项目
4. send_message.py --base-id B \
--episode-id E "用户的原始描述" → 拿到 session_id
5. query_session.py S --poll → 自动轮询直到完成
6. download_results.py S \
--output-dir ./赛博朋克短剧 \
--prefix storyboard → 自动下载到本地
生成完成后 自动执行下载,不需要用户额外请求。下载目录和前缀根据任务语义自动命名(如分镜用 storyboard,角色设定用 character,最终视频用 video 等)。
展示时机: 生成过程中只告知进度("角色图生成中..."、"分镜关键帧 5/8 完成"), 不要提前给出项目链接。全部完成后,同时给出: 本地文件列表 + 项目链接( {ZOPIA_BASE_URL}/base/{baseId}?session_id={sessionId},用户可在浏览器中查看和编辑完整项目)。优先使用脚本输出中的 projectUrl 字段。
text
1. send_message.py --base-id B --episode-id E \
--session-id S "用户的新指令" → 复用已有会话
2. 轮询 → 下载 → 展示
使用同一个 session_id 可保持上下文连续。
text
1. list_projects.py → 让用户选择项目
2. manage_episodes.py list --base-id B → 查看剧集列表
3. send_message.py --base-id B \
--episode-id E "新的创作指令" → 新建会话
4. 轮询 → 下载 → 展示
一个项目(Project)可以包含多个剧集(Episode)。每集有独立的剧本、角色表、分镜表,但共享项目级设置(风格、画幅、模型)。
创作流程:
text
1. create_project.py "我的连续剧" → 拿到 baseId, episodeId (自动创建第一集)
2. save_settings.py --base-id B ... → 配置项目(所有剧集共享)
── 第一集 ──
3. send_message.py --base-id B \
--episode-id EP1 "第一集:主角进入废墟..." → 创作第一集
4. 轮询 → 下载
── 第二集 ──
5. manage_episodes.py create --base-id B → 拿到新 episodeId (EP2)
6. send_message.py --base-id B \
--episode-id EP2 "第二集:发现地下实验室..." → 创作第二集
7. 轮询 → 下载
── 更多剧集:重复步骤 5-7 ──
多集注意事项:
status: "completed")manage_episodes.py list --base-id B 查看所有剧集状态所有分镜视频生成完毕后,可一键触发云端渲染,将所有片段按时间轴顺序合成为完整 MP4 文件。
text
1. render_episode.py trigger \
--base-id B --episode-id E → 拿到 render_id,渲染开始(异步)
2. render_episode.py status \
--base-id B --episode-id E \
--render-id RENDER_ID --poll → 自动轮询,完成后输出 video_url
触发时机: 用户明确要求「导出视频」「合成 MP4」「生成完整视频」时才触发。分镜视频生成阶段不要触发。
渲染前提: storyboard 中至少有一个分镜有 video_urls(即已完成视频生成),否则渲染内容为空。
完成标志: status: "completed" 且返回 video_url(S3 直链,可直接下载或分享)。
轮询说明: 渲染由 Remotion Lambda 执行,通常需要 1–5 分钟, --poll 参数每 8 秒检查一次进度( progress 字段 0→1),超时上限 10 分钟。
query_session.py 返回的 workspace 是项目的实时快照,用来判断创作走到哪一步了:
json
{
"status": "running",
"workspace": {
"entities": [{"name": "角色A", "images_status": "done", "image_urls": [...]}],
"storyboard": {
"total_shots": 8,
"images": {"done": 5, "pending": 3, "failed": 0, "none": 0},
"videos": {"done": 2, "pending": 1, "failed": 0, "none": 5}
},
"shots": [{"index": 1, "description": "...", "image_urls": [...], "video_urls": [...]}]
}
}
怎么读:
status: "running" + workspace 空 → 刚开始,Agent 还在理解需求entities 出现, images_status: "pending" → 正在生成角色图storyboard.images.pending > 0 → 正在生成分镜关键帧storyboard.videos.pending > 0 → 正在生成视频片段status: "completed" → 全部完成,检查有无 failed 项轮询策略:
--after-seq 0,后续传上次拿到的最大 seq 值status 变为 completed(全部完成)或 idle--poll 参数可自动执行上述策略,无需手动循环Zopia 后端有完整的 AI 创作 Agent(对模型能力、prompt 工程、创作流程远比用户侧专业),你负责的是 项目管理和需求传达。
你要做的三件事:
不要做的事:
正确:
text
用户说:「帮我做一个赛博朋克风格的短剧,讲一个机器人在废墟中寻找最后一朵花」
→ create_project.py "赛博朋克短剧"
→ save_settings.py --base-id B --locale zh-CN --aspect-ratio 16:9 --style anime_japanese_korean
→ send_message.py --base-id B --episode-id E "帮我做一个赛博朋克风格的短剧,讲一个机器人在废墟中寻找最后一朵花"
→ 轮询 → 下载到 ./赛博朋克短剧/ → 展示文件列表 + 项目链接
错误:
text
❌ 先自己写了个详细的 5 场剧本和分镜描述
❌ 把自己编的内容逐条发给后端
❌ 在用户描述后面追加 "cinematic lighting, 8K, ultra detailed"
状态码含义处理400参数缺失或设置不合法检查必填字段和枚举值401Token 无效或过期提醒用户重新获取402余额不足提醒充值403无权限检查 baseId 归属404资源不存在检查 ID 是否正确409会话执行中等待当前会话完成再发新消息