Install any skill in seconds. Free to start, no credit card required.
Get Started Free →橙星梦工厂AI视频制作工具,通过对话式操作,用户可以创建项目、配置剧本、生成角色/分镜/视频、查询任务状态。当用户要求使用橙星梦工厂平台、创建 AI 漫剧项目、或通过 API 与平台交互时使用。触发词:橙星梦工厂、ai.fun.tv、漫剧制作、AI漫剧、FunAI。
| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-01 | ✗→✓ | ▲ Improved | 490% | 0% |
| case-02 | ✗→✓ | ▲ Improved | 432% | 0% |
| case-03 | ✗→✓ | ▲ Improved | 571% | 0% |
| case-07 | ✗→✓ | ▲ Improved | 197% | 0% |
| case-08 | ✗→✓ | ▲ Improved | 167% | 0% |
橙星梦工厂是一个 AI 驱动的漫剧制作平台。通过 API 创建项目、提交剧本、提取角色、生成分镜、配置成片并最终合成视频。
> 内测提示 > > 当前您正在使用的是 Funai-skill 内测版。 > Agent 在与用户交互时,应明确告知当前处于内测阶段。
> 重要结论 > > 真实后端不是“只看 workflow.currentStep 的线性流程”,而是: > > - 一层是项目级步骤:workflow.currentStep > - 一层是章节级隐藏任务:comicPreset.data.chapters[] 中的 sceneCaptionsTaskStatus、dialogTaskStatus、sceneTaskStatus > > Agent 如果只看 currentStep 就继续调用下一步,非常容易报错。
本地机器可读版本文件:VERSION
> 说明:对外文案不再重复写死版本号;实际版本以本地 VERSION 与远端 setup 元数据中的 latest_version / minimum_required_version 为准。
每当 Agent 准备调用本 Skill 执行任何会创建、推进、修改平台任务的操作前,必须先访问固定更新入口:
https://neirong.funshion.net/skills/setup-skill.md
至少检查以下字段:
latest_versionminimum_required_versionforce_updateskill_package_url执行规则:
minimum_required_version,必须先自动更新。引导用户访问 https://ai.fun.tv/#/openclaw 并登录,获取 Token 后由 Agent 代为写入配置文件。
bashcp config/.env.example config/.env # 编辑 config/.env # AIFUN_TOKEN=...
bash./scripts/api-client.sh setup-check ./scripts/api-client.sh check
bash./examples/create-comic.sh
> 示例脚本是自检脚本,会使用 select-options 返回的实时默认值自动创建测试项目。 > > 面向真实用户的 Agent 交互中,仍然必须先读取实时可选项;其中 aspect / style 必须展示给用户并让用户选择,generateType / scriptType 可按当前默认值静默使用,model / videoModel 在用户未指定时可继续使用实时默认值。 > > 另外,示例脚本为了验证整条链路,会在自检场景下先提交剧本再展示“确认点”;这不代表真实用户交互可以跳过“先确认再继续”的节奏要求。
除非用户明确提出要切换模式,否则 Agent 应直接使用平台默认模式:
generateType = 1(文生图)scriptType = 解说漫模式(以 select-options 返回的默认剧本模式为准)但这条“静默默认”只适用于模式层级,不适用于项目视觉配置。
创建项目时,以下两个字段不能静默默认,必须让用户明确选择:
aspect(画面比例)style(风格)重要:
select-options,并使用当次接口返回的默认值,而不是写死常量。aspect / style 不能因为接口返回了 isDefault 就直接替用户决定,必须向用户展示可选项并让用户确认。select-optionsbashPOST /service/workflow/project/story/select-options {"appCode":"ai-story","generateType":"1"}
规则:
ratios、generateTypes、models、videoModels、styles、scriptTypesisDefault 是请求相关的,不要把历史默认值写死在代码或文档里generateType / scriptTypeaspect / style 必须向用户展示并让用户选择,不能静默默认model / videoModel 若用户没有额外要求,可以继续使用 select-options 返回的当前默认值aspect / style如果用户让 AI 帮忙写剧本,而当前走的是解说剧 / 解说漫模式,Agent 必须把剧本写成旁白叙述式的小说 / 故事正文,而不是分镜脚本。
必须符合:
禁止出现这类写法:
镜头1 / 镜头2旁白:... 这种显式台本标签林舟说:...【音效:脚步声】 / 砰! / 咚—— 这类音效描述正确风格示意:
text清晨,城市公园的林荫道上,年轻人林舟正在慢跑。阳光穿过树叶,在青石板路上投下斑驳的金色光影。 他刚想加快脚步,一只金毛犬忽然从灌木旁窜了出来,差点撞上他的膝盖。林舟猛地停住脚步,呼吸一乱,循声抬头望去。 不远处,一个扎着马尾的女孩正快步跑来。她一边抓紧手里的牵引绳,一边有些不好意思地朝林舟笑了笑。
错误风格示意:
text镜头1:公园远景。 旁白:清晨的城市公园里,林舟正在跑步。 林舟说:今天一定要把状态跑出来。 镜头2:金毛犬冲出。
创建成功后必须立即把项目链接告诉用户:
texthttps://ai.fun.tv/#/comic/multiple?projectId={projectId}
workflow.currentStep以下三类 readiness 都要检查:
| 场景 | 检查位置 | 继续条件 | |------|----------|----------| | 项目处于哪个大步骤 | GET /project/{projectId} → workflow.currentStep | 当前步骤正确 | | 角色图是否完成 | GET /comic/roles/{presetResourceId} → roles[].taskStatus / imgUrl | 全部 SUCCESS 且 imgUrl 非空 | | 章节级隐藏任务是否完成 | GET /resource/comicPreset/{presetResourceId} → chapters[] | 对应状态字段为 SUCCESS |
tts / voice-clone-select 输入novel_extract_roles 不是只传 chapterNum 就够。真实可运行的做法是:
GET /comic/roles/{presetResourceId}data.voiceInputs[0] 或 data.roles[0].inputs[0] 取出 live 的 tts 输入对象chapterNum 一起提交sceneUuid 当 sceneIdscene-list 里的 sceneUuid 只是短 ID,不能直接用于分镜/视频接口。
正确流程:
textcomicPreset/{presetResourceId} → chapters[].sceneTaskId → GET /task/{sceneTaskId} → data.resourceId (storyboardId) → GET /resource/{storyboardId} → data.data.scenes[].id (完整 sceneId)
videoPlayUrl如果后端返回了新的可播放字段:
videoPlayUrlvideoPlayUrl则正确做法是:
videoPlayUrlurlscene/ai/video 必须使用 scene 当前基准分镜图图转视频的正确图片来源是当前 scene 的基准分镜图:
GET /storyboard/scene/{sceneId}/prompt/detail?sceneId={sceneId} 中的 video.imageIdGET /storyboard/scene/{sceneId}/resources 中找到与这个 imageId 对应的 image 资源selected == true 的 image,它通常就是同一张图不要直接使用:
GET /comic/roles/{presetResourceId} 返回的 roles[].imgUrl重要:这不是“后端一定会报错”的约束,而是“Agent 必须主动保证语义正确”的约束。
live 测试里,后端接受了 roles[].imgUrl + roles[].imageResourceId,并成功生成了一条 video 资源。也就是说,传错图时接口可能仍然返回 200 success,但生成出来的是语义错误的视频。
所以:
video.imageId 对应的 image)先读取 https://neirong.funshion.net/skills/setup-skill.md,确认本地 skill 版本可用。
bashPOST /service/workflow/project/story/select-options {"appCode":"ai-story","generateType":"1"}
使用上一步接口返回的实时值创建项目。
> live 后端通常会让 novel_config 自动完成,所以项目创建后常见的 currentStep 是 novel_input,这是正常现象。
> 如果用户没有特别说明,不要额外告诉用户“当前默认使用文生图 / 解说漫模式”。 > > 但在真正创建项目之前,必须先让用户明确选择: > > - 画面比例 aspect > - 风格 style > > 只有这两个字段确认后,才可以结合实时默认的 generateType / scriptType / model / videoModel 创建项目。
bashPOST /service/workflow/project/step/next { "userProjectId": "项目ID", "step": "novel_input", "inputs": [ {"name": "content", "type": "text", "value": "剧本内容"}, {"name": "scriptType", "type": "text", "value": "0"}, {"name": "isSplit", "type": "text", "value": "0"} ] }
返回 resultId 后轮询 GET /task/{resultId}。
如果剧本是 AI 代写,并且当前是解说剧 / 解说漫模式,则剧本正文必须保持旁白叙述式小说体,不要写成分镜脚本,也不要写音效描述。
bashPOST /service/workflow/project/step/next {"userProjectId":"项目ID","step":"novel_opt","inputs":[]}
返回 resultId 后轮询任务。
先调:
bashGET /service/workflow/comic/roles/{presetResourceId}
必须满足:
roles[].taskStatus == SUCCESSroles[].imgUrl 非空然后再调:
jsonPOST /service/workflow/project/step/next { "userProjectId": "项目ID", "step": "novel_extract_roles", "inputs": [ {"type": "number", "name": "chapterNum", "value": 1}, { ...来自 roles/voiceInputs 的 tts 输入对象... } ] }
如果跳过这一步,常见报错是:
角色 [xxx] 图片未完成如果用户在这一阶段要求修改角色形象,则必须满足:
workflow.currentStep == novel_extract_rolesSUCCESS 且 imgUrl 非空只生图不应用,不算修改完成。
sceneCaptionsTaskStatus=SUCCESS,再执行智能分镜先调:
bashGET /service/workflow/resource/comicPreset/{presetResourceId}
等待:
textchapters[chapterNum].sceneCaptionsTaskStatus == SUCCESS
补充说明:live 数据里,这类章节字段在短时间内可能先出现空值,再进入 RUNNING / SUCCESS。空值不一定代表异常,更不能据此提前推进下一步。
然后再调:
jsonPOST /service/workflow/project/step/next { "userProjectId": "项目ID", "step": "novel_scene_captions", "inputs": [ {"type": "number", "name": "chapterNum", "value": 1}, {"name": "imgGenTypeRef", "value": 1} ] }
这个步骤返回的是 dialogTaskId,不是 resultId。
如果调早了,常见报错是:
该章节提取分镜场景任务未完成,请稍后再试dialogTaskId 后,还要再等 sceneTaskStatus=SUCCESS轮询 dialogTaskId 成功后,仍然不能立刻推进到成片。
还需要再看:
textchapters[chapterNum].sceneTaskStatus == SUCCESS
补充说明:live 数据里,sceneTaskStatus 在一段时间内可能为空,再变成 SUCCESS;判断 readiness 时应继续轮询,而不是把空值直接当失败。
如果调早了,常见报错是:
该章节分镜图任务未完成,请稍后再试等 sceneTaskStatus=SUCCESS 后,再调:
jsonPOST /service/workflow/project/step/next { "userProjectId": "项目ID", "step": "novel_chapter_scenes", "inputs": [{"type": "number", "name": "chapterNum", "value": 1}] }
用 sceneTaskId -> task -> resourceId -> resource 链路拿到:
storyboardIdscenes[].idscenes[].image先确认:
novel_chapter_scenessceneTaskStatus == SUCCESSsceneIdprompt/detail.video.imageId,再从 resources 中找到对应 image 资源推荐 payload 形态:
json{ "sceneId": "完整 sceneId", "prompt": "来自 prompt/detail 的视频提示词", "cameraPrompt": "来自 prompt/detail 的镜头提示词", "model": "doubao-pro", "duration": "-1", "firstImage": "scene 当前基准分镜图 URL", "tailImage": "", "clarity": "720p", "imageId": "scene 当前基准 image 资源ID" }
不要写成:
textfirstImage = roles[].imgUrl imageId = roles[].imageResourceId
因为这可能不会报错,却会生成错误语义的视频。
这里必须明确区分成片设置阶段和视频合成阶段。
novel_chapter_video = 进入成片设置阶段当章节从 novel_chapter_scenes 推进到 novel_chapter_video 后,用户并不是立刻就能看到最终成片。
live 测试里,这个阶段常见特征是:
workflow.currentStep = novel_chapter_videochapters[].currentStep = novel_chapter_videochapters[].currentSubStep = setting这表示当前处于成片设置阶段,此时需要准备并确认成片参数。
顺序如下:
POST /storyboard/prepareVideoCompositeGET /storyboard/getVideoSetting?userProjectId=...&type=2&chapterNum=1POST /storyboard/saveVideoComposeConfig这一阶段主要对应:
在 live 测试中,saveVideoComposeConfig 成功后,章节仍可能保持:
currentSubStep = setting也就是说,保存设置成功 ≠ 已经开始合成视频。
只有当调用:
POST /project/step/action with step=novel_chapter_video之后,才是真正开始视频合成。
live 测试里,这一步会:
resultId(视频合成任务 ID)videoTaskId 更新为新的任务 IDcurrentSubStep 从 setting 进入 video然后才需要:
resultIdlive 自检里,这个最终合成任务可能会在 QUEUED 状态停留明显长于普通步骤;不要沿用前面普通任务的短轮询预算直接判超时。
只有在视频合成任务 SUCCESS 后:
resourceId换句话说:
novel_chapter_video 不是最终成片完成saveVideoComposeConfig 的可运行 payload 需要至少包含:
selectCovercoverListselectCoverUrlselectMusicIdselectTitleFontselectSubtitleFonttitlebgmVolumetypechapterNumuserProjectIdlive 测试确认:
novel_chapter_video 合成成功后,章节会记录当前的 videoTaskIdnovel_chapter_scenes 再做调整,重新进入 novel_chapter_video 后,旧的合成结果不会自动变成新的最终成片project/step/action 时,会产生新的 videoTaskIdresourceId这说明:
> 每次从成片步骤回退调整后,都必须重新合成视频。
Agent 的角色应该像“持续陪伴的智能漫剧助理”,而不是闷头执行器。
每完成一个用户可感知的重要任务,都应立即给用户一条简报,至少包含:
如果项目已创建,简报优先附上项目链接:
texthttps://ai.fun.tv/#/comic/multiple?projectId={projectId}
除纯技术性的中间动作外,Agent 不得在用户没有确认的情况下自动把整条链路一路做完。
正确节奏是:
text完成一个大步骤 → 详细汇报当前结果 → 询问用户是否满意、是否继续下一步;如果当前步骤支持修改,再询问是否需要修改 → 等用户确认后再继续
这里的“大步骤”至少包括:
以下三个节点完成后,Agent 必须立即停下来等待用户确认,不能自动进入下一步:
novel_extract_roles(角色与配音)步骤,应主动询问用户是否需要修改某个角色的形象novel_chapter_scenes 步骤继续调整单场景的图片提示词或视频提示词后重新生成角色确认阶段的回报,至少要包含:
不能只说“角色已生成完成”,而不把角色图片回给用户。
角色形象修改只允许在 角色与配音 步骤执行。
角色确认阶段:
novel_extract_roles场景确认阶段的回报,至少要包含:
不能只说“场景已生成完成”,而不把场景描述回给用户确认。
如果用户对某一个或多个 scene 的结果不满意,Agent 应先判断问题属于哪一类:
sceneDescription + prompt 后重生图prompt(动作) + cameraPrompt(运镜) 后重生视频重生图时,真实提示词由两部分共同组成:
sceneDescriptionprompt其中 prompt 里可能包含:
text@[人物](id:xxxx)
这类 live 人物引用用于保持角色一致性,不应随意删除。
图转视频时应区分:
prompt = 动作cameraPrompt = 运镜这里不要再使用图片侧的 @[人物](id:xxxx) 结构,而应直接写纯文本动作和镜头描述。
如果当前 Agent / 模型具备多模态看图能力,可在每次重生图或重生视频后先查看当前结果,再决定是否继续微调:
selected=true 的 scene imagevideoCover然后再针对问题定向修改 prompt,而不是盲目重试。
当分镜图已经生成完成时,Agent 不能直接默认进入成片。
必须主动问用户:
只有拿到这个选择后,才能继续往下执行。
以下仍然属于同一步内部的技术动作,可以合并在一步里完成:
comicPreset / storyboard / tasksceneId / storyboardIdselect-options但是一旦形成了新的用户可感知结果,就必须停下来等确认。
生图或生视频必须在 分镜图步骤 下执行,不能在成片步骤直接执行。
检查顺序:
GET /project/{projectId} 看 workflow.currentStepnovel_chapter_video,先 POST /project/step/prevnovel_chapter_scenes 后再继续live 测试确认:
workflow.currentStep 会变成 novel_chapter_scenescurrentSubStep 可能仍保留为 video这不代表异常。真正要继续操作前,应继续确认:
sceneTaskStatus == SUCCESS默认流程是:
text分镜图生成完成 → 直接配置成片 → 合成最终视频
但这不意味着 Agent 可以自动一路执行到底。
正确做法是:
text分镜图生成完成 → 先向用户展示分镜结果并询问是否修改 / 是否继续 → 用户确认后再进入成片配置与合成
以下操作会消耗梦想值,必须先明确征得用户同意:
check/batchAiVideo 对应的真实转视频动作scene/ai/videoscene/ai/imagecheck/batchAiVideo 只是查询,不是执行它返回的是:
noVideoCount不要把这个接口误认为“已经开始批量转视频”。
401 / 未登录或登陆状态已失效config/.env角色 [xxx] 图片未完成tts 输入GET /comic/roles/{presetResourceId},等角色就绪后把 voiceInputs[0] 一起提交该章节提取分镜场景任务未完成,请稍后再试sceneCaptionsTaskStatus=SUCCESS该章节分镜图任务未完成,请稍后再试sceneTaskStatus=SUCCESSsceneUuid 误用分镜场景资源不存在sceneIdsceneTaskId -> storyboardId -> scenes[].id 解析完整 sceneId200 success,但生成出来的视频内容与当前分镜不一致roles[].imgUrl / roles[].imageResourceId 当成了 scene/ai/video 的 firstImage / imageIdprompt/detail.video.imageId 对应的 image 资源)请选择封面saveVideoComposeConfig 缺少 coverList / selectCover / selectCoverUrlgetVideoSetting,再按返回内容构造完整 payloadscripts/api-client.sh:可复用的 API 工具函数与等待逻辑examples/create-comic.sh:按真实后端行为执行的完整自检流程references/01-project-management.md:项目创建与配置选项references/02-script-management.md:各步骤请求体与隐藏章节状态references/03-character-management.md:角色图状态与 tts 输入references/05-storyboard-management.md:storyboard / sceneId / 分镜资源references/06-video-generation.md:成片配置、批量视频检查与合成references/07-task-status.md:task 轮询与章节级隐藏状态references/09-error-codes.md:常见错误与处理方式references/10-models-and-config.md:实时配置与 workflow 总览references/11-best-practices.md:面向 Agent 的执行建议Other measured skills in the registry, with their headline benchmark lift.