博客

短剧工作室如何用 API 批量生成剧本?从任务拆分到审核交付

一个人试写时,复制提示词、等结果、贴进文档就能工作。几位编剧同时写多部剧以后,这个办法会出现管理问题:谁用的是旧人设,哪一集失败后重跑了,交稿文件是否经过审核,账单属于哪一个项目?

API 工作流可以先从“把一集交付完整”开始,再扩大批次。一次启动几十个生成任务,并不能替代输入整理和稿件检查。

把一集定义成可追溯的任务

任务至少包含项目号、集数、已确认的大纲版本、人物档案版本、上集状态、本集目标、模型和模板版本。输出再关联生成时间、调用状态、费用记录与审核结论。

同一集可能有多个候选稿,给每次生成一个单独的运行编号。业务任务可以按“项目+集数+大纲版本+模板版本”识别,运行记录额外保存模型与尝试次数。不要用新结果直接覆盖旧稿,否则难以解释最终为什么选了这一版。

连续集之间有依赖。第一集还没通过审核,第二集就沿着它的临时设定开写,后面可能一起返工。可以并行处理互不依赖的项目,或在已确认大纲下并行生成备选方案;连续正文要按实际依赖安排,不能默认所有集数都能同时完成。

约定输出字段,再写调用代码

建议把正文与状态变更建议分开,输出字段例如:episode、scenes、continuity_notes。每个场次包含 location、action、dialogue;dialogue 记录 speaker 与line。是否采用状态变更,由编剧审核后决定。

程序拿到回复后,先检查必需字段与角色名单,再交给人读稿。JSON 能解析只说明格式成立,不说明人物动机、悬念和台词已经合格。

候选模型可先选 claude-opus-5-5、gpt-6-astra 或 deepseek-v4-pro,分别测试分集初稿与改稿任务。下列代码演示 Chat Completions 格式的单集调用与基础校验,使用 Python 标准库;设置自己的 TEAMOROUTER_API_KEY、TEAMOROUTER_MODEL,并准备人物档案 characters.txt 与第一集大纲 episode-01-outline.txt。使用 Claude 等模型时按接入文档选择对应协议,不能默认只改 model 字段就能复用全部参数与功能。

python
import json
import os
import urllib.request
from pathlib import Path

character_notes = Path("characters.txt").read_text(encoding="utf-8")
outline = Path("episode-01-outline.txt").read_text(encoding="utf-8")
prompt = f"""根据人物档案与大纲写第一集,不要增加角色。
只输出JSON对象,不加代码围栏或解释:
{{"episode":1,"scenes":[{{"location":"地点","action":"可拍动作",
"dialogue":[{{"speaker":"角色名","line":"台词"}}]}}],
"continuity_notes":["需要人工确认的状态变化"]}}
人物档案:{character_notes}
本集大纲:{outline}"""
payload = {
    "model": os.environ["TEAMOROUTER_MODEL"],
    "messages": [{"role": "user", "content": prompt}],
    "stream": False,
}
request = urllib.request.Request(
    "https://api.teamorouter.com/v1/chat/completions",
    data=json.dumps(payload, ensure_ascii=False).encode("utf-8"),
    headers={
        "Authorization": "Bearer " + os.environ["TEAMOROUTER_API_KEY"],
        "Content-Type": "application/json",
    },
    method="POST",
)
with urllib.request.urlopen(request, timeout=180) as response:
    result = json.load(response)
choice = result["choices"][0]
if choice.get("finish_reason") != "stop":
    raise ValueError("未正常结束,需人工检查,不能按完成稿入库")
script = json.loads(choice["message"]["content"])
if not isinstance(script, dict) or script.get("episode") != 1:
    raise ValueError("集数或顶层结构不符合约定")
scenes = script.get("scenes")
if not isinstance(scenes, list) or not scenes:
    raise ValueError("缺少有效场次")
for scene in scenes:
    if not isinstance(scene, dict):
        raise ValueError("场次必须为对象")
    if not all(isinstance(scene.get(k), str) and scene[k].strip()
               for k in ("location", "action")):
        raise ValueError("场景或动作缺失")
    dialogue = scene.get("dialogue")
    if not isinstance(dialogue, list):
        raise ValueError("对白字段必须为列表")
    for line in dialogue:
        if not isinstance(line, dict) or not all(
            isinstance(line.get(k), str) and line[k].strip()
            for k in ("speaker", "line")
        ):
            raise ValueError("对白结构不符合约定")
notes = script.get("continuity_notes")
if not isinstance(notes, list) or not all(isinstance(n, str) for n in notes):
    raise ValueError("连续性备注结构不符合约定")
print(json.dumps({"script": script, "usage": result.get("usage")},
                 ensure_ascii=False, indent=2))

该示例用于说明请求和校验方式,本稿未发起真实计费调用;它没有实现完整的批量调度、费用对账与稿件系统。实际接入时按所选模型支持的参数设置输出预算,并进一步校验角色白名单、场次限制和终止状态。只在提示词中要求 JSON,模型仍可能返回额外文字,需要将其列为格式失败处理。

把调用失败和稿件不合格分开处理

鉴权失败、余额不足、限流、超时和内容校验失败,需要不同动作。鉴权或余额问题先暂停相关任务并处理配置;限流结合响应提示降低发送速度、延迟重试;网络超时要保留运行记录,不要假定服务端没有执行或没有费用。

格式不合格可以进入一次有次数上限的修复流程,剧情不合格则退回编剧指定修改范围。每次修复与重跑都另记费用,不能为了交付一集无限循环。

任务状态可以设为待生成、生成中、待校验、待审稿、已通过、需修改、调用异常。程序只将通过基础校验的内容送往待审稿,不因为接口返回 200 就宣布一集完成。

用自己的任务记录补齐项目账

每次调用返回的模型与用量信息,还需要关联到某部剧的具体集数。工作流自行保存项目、集数、运行编号、模型、模板版本、返回的请求标识和用量;能关联实际账单的,再完成对账。不要仅根据客户端等待时长估算费用。

TeamoRouter 已有国内 TOP 5 的 AI 短剧制作公司客户,该客户拥有在红果单剧播放量超 20 亿的作品。对于每天持续生成剧本的工作室,TeamoRouter 汇集 Claude、GPT、Gemini、DeepSeek 等主流模型,部分模型低至官方价 1 折,并面向企业生产场景提供 24 小时稳定调用服务。

如果准备把单集试稿扩成批量任务,先到企业报价页比较模型与调用价格,带着每天集数、单集用量、改稿轮次和高峰任务量咨询接入方案。低至 1 折按具体模型和渠道报价,批量任务也应先核算真实调用与重试成本。

先选一个项目跑通生成、校验、人工修改、再次提交和费用记录,再扩大到更多项目。编剧认可的稿件版本、程序保存的版本与制作人员收到的版本对得上,这条工作流才算完成了一次交付。

相关教程

准备好接入了吗?登录控制台 · 购买额度 · 创建 API Key,三步即可开始。