From 2b18e066eed9ba51616149afe9f23043024e2c36 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?ACT=E4=B8=B6=E6=B5=81=E6=98=9F=E9=9B=A8?= <1340145680@qq.com> Date: Mon, 23 Mar 2026 12:28:43 +0800 Subject: [PATCH] =?UTF-8?q?=E5=B0=86tools=E8=A7=A3=E8=80=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../skills/production-agent/decision/SKILL.md | 46 +--- .../production-agent/execution/SKILL.md | 2 +- src/agents/productionAgent/index.ts | 4 +- src/agents/productionAgent/tools.ts | 199 +++++++++++++----- src/socket/resTool.ts | 4 +- src/types/database.d.ts | 126 ++++++++--- 6 files changed, 254 insertions(+), 127 deletions(-) diff --git a/data/skills/production-agent/decision/SKILL.md b/data/skills/production-agent/decision/SKILL.md index 1226750..fe3fb98 100644 --- a/data/skills/production-agent/decision/SKILL.md +++ b/data/skills/production-agent/decision/SKILL.md @@ -7,20 +7,6 @@ description: 短剧漫剧制作决策层。负责分析用户需求、制定执 短剧漫剧制作的指挥层,负责整体决策和协调。始终以用户当前指令为最终目标推进:默认直接协调执行,只有用户明确提出需要新增或修改拍摄计划时,才进入计划编辑与确认流程。 -## 可用工具 - -| 工具 | 说明 | -| ---------------------------- | ----------------------------------------------------------------------------------------------------------- | -| `activate_skill` | 激活技能,加载完整指令和资源列表到上下文 | -| `read_skill_file` | 读取已激活技能目录下的参考资料文件 | -| `deepRetrieve` | 深度检索记忆,通过关键词回忆历史对话详情 | -| `run_sub_agent` | 启动子 Agent 执行任务(可用:`executionAI`、`supervisionAI`) | -| `get_flowData` | 获取工作区数据(key: `script` 剧本 / `scriptPlan` 拍摄计划 / `assets` 资产列表 / `storyboardTable` 分镜表) | -| `get_flowData_schema` | 获取工作区数据的类型结构 | -| `set_flowData` | 保存数据到工作区(lodash 路径) | -| `generate_assets_images` | 生成衍生资产图片(传入资产 id 列表) | -| `generate_storyboard_images` | 生成分镜图(传入剧本文本) | - ## 核心工作流程(必须严格遵循) ### 首先:判断用户意图 @@ -30,34 +16,30 @@ description: 短剧漫剧制作决策层。负责分析用户需求、制定执 - **用户发起执行类需求**(如"开始制作第 4 集"、"继续生成分镜"、"提取角色资产") → 直接进入阶段三,按用户目标执行 - **用户明确要求新增/修改拍摄计划**(如"给我出一版拍摄计划"、"第 2 步改一下"、"加一个镜头") → 进入阶段二,更新 `scriptPlan` 并与用户确认 - **用户确认拍摄计划**(如"可以"、"确认"、"开始吧"、"没问题") → 在不重做计划的前提下进入阶段三执行 - + **禁止**:在用户未提出计划诉求时,主动生成或反复重生成拍摄计划。 ### 阶段一:收集信息(仅首次进入会话或上下文不足时触发) -1. 调用 `get_flowData`(key: `script`)获取当前剧本内容 -2. 调用 `get_flowData`(key: `scriptPlan`)获取已有拍摄计划(可能为空) -3. 调用 `get_flowData`(key: `assets`)获取资产数据,了解项目现状 -4. 调用 `deepRetrieve` 检索相关历史记忆,了解已完成的工作进度 -5. 使用 `read_skill_file` 加载 `references/plan.md` 获取计划制定规范 +1. 调用 `deepRetrieve` 检索相关历史记忆,了解已完成的工作进度 ### 阶段二:编辑拍摄计划并对话确认(仅用户明确提出时触发) -1. 根据剧本内容、工作区数据、历史记忆和用户需求,新增或修改**拍摄计划**(scriptPlan) -2. 调用 `set_flowData`(key: `scriptPlan`, value: 最新拍摄计划文本)将拍摄计划同步到前端工作区 +1. 根据历史记忆和用户需求,新增或修改**拍摄计划** +2. 调用 `set_plane` 将拍摄计划同步到前端工作区 3. **将拍摄计划回复给用户**,请求确认 4. 输出拍摄计划后**停止并等待用户回复**,不要自行继续 5. 如果用户要求调整: - 根据用户反馈修改拍摄计划 - - 再次调用 `set_flowData`(key: `scriptPlan`, value: 修改后的拍摄计划)同步到前端 + - 再次调用 `set_plane` 同步到前端 - 重新回复修改后的拍摄计划,继续等待确认 - **循环此过程**,直到用户明确确认 ### 阶段三:按用户目标执行(默认阶段) -以用户当前指令为目标,优先执行用户要求;若 `scriptPlan` 已存在则按其作为参考,不存在时也可直接执行当前任务。需要分步时再拆解为执行步骤,并按顺序调用 `run_sub_agent` 工具: +以用户当前指令为目标,优先执行用户要求;若拍摄计划已存在则按其作为参考,不存在时也可直接执行当前任务。需要分步时再拆解为执行步骤,并按顺序调用 `run_sub_agent`: -1. 每次调用 `run_sub_agent` 时,选择 `executionAI` 作为子 Agent,将当前步骤的任务描述作为 `prompt` 参数传入 +1. 每次调用 `run_sub_agent` 时,选择 `executionAI` 作为子 Agent,将当前步骤的任务描述作为 `prompt` 传入 2. 检查返回结果是否符合预期,不符合则调整指令重试 3. 将上一步的输出作为上下文传入下一步(如有依赖) 4. 全部步骤完成后,向用户汇报整体结果 @@ -69,14 +51,6 @@ description: 短剧漫剧制作决策层。负责分析用户需求、制定执 - 关注步骤间的依赖关系,确保顺序合理 - 利用 `deepRetrieve` 检索历史记忆,避免重复已完成的工作 - **用户目标优先**:默认直接响应并推进用户当前任务,不要为了流程完整性而强制先生成计划 -- **计划按需维护**:仅当用户明确要求新增/修改拍摄计划时,才更新 `scriptPlan`,且每次改动都调用 `set_flowData` 同步到前端 -- **提取衍生资产后**:计划中必须包含"询问用户是否生成资产图片"步骤。若用户确认,执行层将调用 `generate_assets_images` 工具批量生成衍生资产图片 -- **生成分镜表后**:计划中必须包含"询问用户是否生成分镜图片"步骤。若用户确认,执行层将调用 `generate_storyboard_images` 工具生成分镜图 - -## 参考资料 - -使用 `read_skill_file` 按需加载: - -- [生成计划](references/plan.md) — 计划制定规范和回复模板 - -**注意**:按需加载参考资料,不要一次性全部加载。 +- **计划按需维护**:仅当用户明确要求新增/修改拍摄计划时,才更新拍摄计划,且每次改动都调用 `set_plane` 同步到前端 +- **提取衍生资产后**:计划中必须包含"询问用户是否生成资产图片"步骤。若用户确认,执行层将调用相应工具批量生成衍生资产图片 +- **生成分镜表后**:计划中必须包含"询问用户是否生成分镜图片"步骤。若用户确认,执行层将调用相应工具生成分镜图 diff --git a/data/skills/production-agent/execution/SKILL.md b/data/skills/production-agent/execution/SKILL.md index c89abc8..002985c 100644 --- a/data/skills/production-agent/execution/SKILL.md +++ b/data/skills/production-agent/execution/SKILL.md @@ -22,7 +22,7 @@ description: > 1. 调用 `get_flowData` 分别获取 `script`(剧本)和 `assets`(现有资产列表) 2. 根据[衍生资产提取](references/derive-assets-extraction.md)文档中的提取原则,分析剧本内容,为每个角色资产识别出关联的衍生资产(道具、服饰、法器、座驾、场景物件等) -3. 对每个有衍生状态的资产调用 `set_flowData({ key: "assets[N].derive", value: derive数组 })` 逐个保存 +3. 对每个有衍生状态的资产调用 `set_flowData_assets` 保存 4. 告知用户提取完成,列出为每个角色提取的衍生资产概要 5. **询问用户是否需要生成衍生资产图片**: - 如果用户确认需要,收集所有需要生成图片的资产 id,调用 `generate_assets_images({ ids: [资产id列表] })` 生成图片 diff --git a/src/agents/productionAgent/index.ts b/src/agents/productionAgent/index.ts index c8f2cc7..5d2191e 100644 --- a/src/agents/productionAgent/index.ts +++ b/src/agents/productionAgent/index.ts @@ -52,7 +52,7 @@ export async function decisionAI(ctx: AgentContext) { ...skill.tools, ...memory.getTools(), run_sub_agent: runSubAgent(ctx), - ...useTools(ctx.socket), + ...useTools(ctx.resTool), }, onFinish: async (completion) => { await memory.add("decisionAI", completion.text); @@ -81,7 +81,7 @@ export async function executionAI(ctx: AgentContext) { tools: { ...skill.tools, ...memory.getTools(), - ...useTools(ctx.socket), + ...useTools(ctx.resTool), }, onFinish: async (completion) => { await memory.add("executionAI", completion.text); diff --git a/src/agents/productionAgent/tools.ts b/src/agents/productionAgent/tools.ts index d5fd9ae..7cedf37 100644 --- a/src/agents/productionAgent/tools.ts +++ b/src/agents/productionAgent/tools.ts @@ -1,60 +1,151 @@ import { tool, Tool } from "ai"; -import { z, toJSONSchema } from "zod"; +import { z } from "zod"; import _ from "lodash"; -import { Socket } from "socket.io"; +import ResTool from "@/socket/resTool"; -const deriveSchema = z.object({ name: z.string().min(1).max(20), desc: z.string().min(1).max(100) }); -const assetSchema = z.object({ assetsId: z.string(), name: z.string(), desc: z.string(), src: z.string(), derive: z.array(deriveSchema).optional() }); -const storyboardTableSchema = z.string().describe("分镜表的markdown文本"); -const flowDataSchema = z.object({ script: z.string(), scriptPlan: z.string(), assets: z.array(assetSchema), storyboardTable: storyboardTableSchema }); +const deriveAssetSchema = z.object({ + id: z.number().describe("衍生资产ID,如果新增则为空").optional(), + assetsId: z.string().describe("关联的资产ID"), + name: z.string().describe("衍生资产名称"), + desc: z.string().describe("衍生资产描述"), + src: z.string().describe("衍生资产资源路径"), + state: z.enum(["未生成", "生成中", "已完成", "生成失败"]).describe("衍生资产生成状态"), +}); +const assetItemSchema = z.object({ + assetsId: z.string().describe("资产唯一标识"), + name: z.string().describe("资产名称"), + desc: z.string().describe("资产描述"), + src: z.string().describe("资产资源路径"), + derive: z.array(deriveAssetSchema).describe("衍生资产列表"), +}); +const storyboardSchema = z.object({ + id: z.number().describe("分镜ID"), + title: z.string().describe("分镜标题"), + description: z.string().describe("分镜描述"), + camera: z.string().describe("镜头信息"), + duration: z.number().describe("持续时长(秒)"), + frameMode: z.enum(["firstFrame", "endFrame", "linesSoundEffects"]).describe("帧模式: 首帧/尾帧/台词音效"), + prompt: z.string().describe("生成提示词"), + lines: z.string().nullable().describe("台词内容"), + sound: z.string().nullable().describe("音效内容"), + associateAssetsIds: z.array(z.number()).describe("关联资产ID列表"), + src: z.string().nullable().describe("分镜资源路径"), +}); +const workbenchDataSchema = z.object({ + name: z.string().describe("项目名称"), + duration: z.string().describe("视频时长"), + resolution: z.string().describe("分辨率"), + fps: z.string().describe("帧率"), + cover: z.string().optional().describe("封面图片路径"), + gradient: z.string().optional().describe("渐变色配置"), +}); +const posterItemSchema = z.object({ + id: z.number().describe("海报ID"), + image: z.string().describe("海报图片路径"), +}); +const flowDataSchema = z.object({ + script: z.string().describe("剧本内容"), + scriptPlan: z.string().describe("拍摄计划"), + assets: z.array(assetItemSchema).describe("衍生资产"), + storyboardTable: z.string().describe("分镜表"), + storyboard: z.array(storyboardSchema).describe("分镜列表"), + workbench: workbenchDataSchema.describe("工作台配置"), + poster: z + .object({ + items: z.array(posterItemSchema).describe("海报项目列表"), + }) + .describe("海报配置"), +}); type FlowData = z.infer; -const keySchema = z.object({ - key: z - .enum(["script", "scriptPlan", "assets", "storyboardTable"]) - .describe("script=剧本,scriptPlan=拍摄计划,assets=资产列表,storyboardTable=分镜表"), -}); -const valueSchema = z - .union([z.string(), z.array(assetSchema), assetSchema, z.array(deriveSchema), z.array(storyboardTableSchema)]) - .describe("路径对应的值"); +const keySchema = z.enum(Object.keys(flowDataSchema.shape) as [keyof FlowData, ...Array]); +const flowDataKeyLabels = Object.fromEntries( + Object.entries(flowDataSchema.shape).map(([key, schema]) => [key, (schema as z.ZodTypeAny).description ?? key]), +) as Record; -export default (socket: Socket, toolsNames?: string[]) => { +export default (resTool: ResTool, toolsNames?: string[]) => { + const { socket } = resTool; const tools: Record = { get_flowData: tool({ description: "获取工作区数据", - inputSchema: keySchema, + inputSchema: z.object({ + key: keySchema.describe("数据key"), + }), execute: async ({ key }) => { + resTool.systemMessage(`正在阅读 ${flowDataKeyLabels[key]} 数据...`); console.log("[tools] get_flowData", key); const flowData: FlowData = await new Promise((resolve) => socket.emit("getFlowData", { key }, (res: any) => resolve(res))); return flowData[key]; }, }), - get_flowData_schema: tool({ - description: "获取工作区数据的类型结构,在使用set_flowData前应先调用", - inputSchema: keySchema, - execute: async ({ key }) => { - console.log("[tools] get_flowData_schema", key); - return toJSONSchema(flowDataSchema.shape[key]); + set_flowData_script: tool({ + description: "保存剧本内容到工作区", + inputSchema: z.object({ value: flowDataSchema.shape.script }), + execute: async ({ value }) => { + console.log("[tools] set_flowData script", value); + resTool.systemMessage("正在保存 剧本 数据"); + socket.emit("setFlowData", { key: "script", value }); + return true; }, }), - set_flowData: tool({ - description: "保存数据到工作区,key为lodash路径,先调用get_flowData_schema了解可用路径和类型", - inputSchema: z.object({ - key: z.string().describe("lodash路径,如 script、assets[0].derive"), - value: valueSchema, - }), - execute: async ({ key, value }) => { - console.log("[tools] set_flowData", key, value); - const flowData: FlowData = await new Promise((resolve) => socket.emit("getFlowData", { key }, (res: any) => resolve(res))); - const backup = _.cloneDeep(_.get(flowData, key)); - _.set(flowData, key, value); - const r = flowDataSchema.safeParse(flowData); - if (!r.success) { - _.set(flowData, key, backup); - return { error: r.error.issues.map((i) => `[${i.path.join(".")}] ${i.message}`).join("; ") }; - } - socket.emit("setFlowData", { key, value }); + set_flowData_scriptPlan: tool({ + description: "保存拍摄计划到工作区", + inputSchema: z.object({ value: flowDataSchema.shape.scriptPlan }), + execute: async ({ value }) => { + console.log("[tools] set_flowData scriptPlan", value); + resTool.systemMessage("正在保存 拍摄计划 数据"); + socket.emit("setFlowData", { key: "scriptPlan", value }); + return true; + }, + }), + set_flowData_assets: tool({ + description: "保存衍生资产列表到工作区", + inputSchema: z.object({ value: flowDataSchema.shape.assets }), + execute: async ({ value }) => { + console.log("[tools] set_flowData assets", value); + resTool.systemMessage("正在保存 衍生资产 数据"); + socket.emit("setFlowData", { key: "assets", value }); + return true; + }, + }), + set_flowData_storyboardTable: tool({ + description: "保存分镜表到工作区", + inputSchema: z.object({ value: flowDataSchema.shape.storyboardTable }), + execute: async ({ value }) => { + console.log("[tools] set_flowData storyboardTable", value); + resTool.systemMessage("正在保存 分镜表 数据..."); + socket.emit("setFlowData", { key: "storyboardTable", value }); + return true; + }, + }), + set_flowData_storyboard: tool({ + description: "保存分镜列表到工作区", + inputSchema: z.object({ value: flowDataSchema.shape.storyboard }), + execute: async ({ value }) => { + console.log("[tools] set_flowData storyboard", value); + resTool.systemMessage("正在保存 分镜列表 数据..."); + socket.emit("setFlowData", { key: "storyboard", value }); + return true; + }, + }), + set_flowData_workbench: tool({ + description: "保存工作台配置数据到工作区", + inputSchema: z.object({ value: flowDataSchema.shape.workbench }), + execute: async ({ value }) => { + console.log("[tools] set_flowData workbench", value); + resTool.systemMessage("正在保存 工作台配置 数据..."); + socket.emit("setFlowData", { key: "workbench", value }); + return true; + }, + }), + set_flowData_poster: tool({ + description: "保存海报配置到工作区", + inputSchema: z.object({ value: flowDataSchema.shape.poster }), + execute: async ({ value }) => { + console.log("[tools] set_flowData poster", value); + resTool.systemMessage("正在保存 海报 数据..."); + socket.emit("setFlowData", { key: "poster", value }); return true; }, }), @@ -62,23 +153,23 @@ export default (socket: Socket, toolsNames?: string[]) => { generate_storyboard_images: tool({ description: `生成一组图片任务,支持图片间的依赖关系(以图生图)。 -参数说明: -- images: 图片任务数组 - - id: 图片唯一标识符 - - prompt: 图片生成提示词 - - referenceIds: 依赖的参考图id数组,无依赖填空数组[] - - assetIds: 参考的资产图id数组(可选) + 参数说明: + - images: 图片任务数组 + - id: 图片唯一标识符 + - prompt: 图片生成提示词 + - referenceIds: 依赖的参考图id数组,无依赖填空数组[] + - assetIds: 参考的资产图id数组(可选) -依赖规则: -1. referenceIds中的id必须存在于images数组中 -2. 禁止循环依赖(如A依赖B,B依赖A) -3. 被依赖的图片会先生成,其结果作为参考图传入 + 依赖规则: + 1. referenceIds中的id必须存在于images数组中 + 2. 禁止循环依赖(如A依赖B,B依赖A) + 3. 被依赖的图片会先生成,其结果作为参考图传入 -示例:生成猫图,再以猫图为参考生成狗图 -images: [ - {id: "cat", prompt: "一只橘猫", referenceIds: [], assetIds: []}, - {id: "dog", prompt: "风格相同的金毛犬", referenceIds: ["cat"], assetIds: []} -]`, + 示例:生成猫图,再以猫图为参考生成狗图 + images: [ + {id: "cat", prompt: "一只橘猫", referenceIds: [], assetIds: []}, + {id: "dog", prompt: "风格相同的金毛犬", referenceIds: ["cat"], assetIds: []} + ]`, inputSchema: z.object({ images: z.array( z.object({ diff --git a/src/socket/resTool.ts b/src/socket/resTool.ts index 920d904..91d2e47 100644 --- a/src/socket/resTool.ts +++ b/src/socket/resTool.ts @@ -1,10 +1,8 @@ import u from "@/utils"; import { Socket } from "socket.io"; -type Role = "developer" | "system" | "assistant" | "user"; - class ResTool { - constructor(private socket: Socket) {} + constructor(public socket: Socket) {} textMessage(name: string = "AI") { const messageId = u.uuid(); diff --git a/src/types/database.d.ts b/src/types/database.d.ts index 069be36..552d31b 100644 --- a/src/types/database.d.ts +++ b/src/types/database.d.ts @@ -1,4 +1,4 @@ -// @db-hash bea1bd617996a9e12ad951edcce03880 +// @db-hash bd46e7c381481a74efedc662a4f9049f //该文件由脚本自动生成,请勿手动修改 export interface memories { @@ -35,12 +35,18 @@ export interface o_assets { 'projectId'?: number | null; 'prompt'?: string | null; 'remark'?: string | null; - 'scriptId'?: number | null; 'sonId'?: number | null; 'startTime'?: number | null; 'state'?: string | null; 'type'?: string | null; } +export interface o_chatHistory { + 'data'?: string | null; + 'id'?: number; + 'novel'?: string | null; + 'projectId'?: number | null; + 'type'?: string | null; +} export interface o_event { 'createTime'?: number | null; 'detail'?: string | null; @@ -61,10 +67,33 @@ export interface o_image { 'assetsId'?: number | null; 'filePath'?: string | null; 'id'?: number; - 'model'?: string | null; - 'resolution'?: string | null; + 'projectId'?: number | null; + 'scriptId'?: number | null; 'state'?: string | null; 'type'?: string | null; + 'videoId'?: number | null; +} +export interface o_model { + 'apiKey'?: string | null; + 'baseUrl'?: string | null; + 'createTime'?: number | null; + 'id'?: number; + 'index'?: number | null; + 'manufacturer'?: string | null; + 'model'?: string | null; + 'modelType'?: string | null; + 'type'?: string | null; +} +export interface o_myTasks { + 'describe'?: string | null; + 'id'?: number; + 'model'?: string | null; + 'projectId'?: number | null; + 'reason'?: string | null; + 'relatedObjects'?: string | null; + 'startTime'?: number | null; + 'state'?: string | null; + 'taskClass'?: string | null; } export interface o_novel { 'chapter'?: string | null; @@ -97,6 +126,15 @@ export interface o_project { 'userId'?: number | null; 'videoRatio'?: string | null; } +export interface o_prompts { + 'code'?: string | null; + 'customValue'?: string | null; + 'defaultValue'?: string | null; + 'id'?: number; + 'name'?: string | null; + 'parentCode'?: string | null; + 'type'?: string | null; +} export interface o_script { 'content'?: string | null; 'createTime'?: number | null; @@ -104,31 +142,40 @@ export interface o_script { 'name'?: string | null; 'projectId'?: number | null; } +export interface o_scriptAssets { + 'assetsId'?: number | null; + 'id'?: number; + 'scriptId'?: number | null; +} +export interface o_scriptOutline { + 'id'?: number; + 'outlineId'?: number | null; + 'scriptId'?: number | null; +} export interface o_setting { 'key'?: string | null; 'value'?: string | null; } -export interface o_storyboard { - 'associateAssetsIds'?: string | null; - 'camera'?: string | null; - 'createTime'?: number | null; - 'duration'?: string | null; - 'filePath'?: string | null; - 'frameType'?: string | null; +export interface o_skills { + 'id'?: number; + 'name'?: string | null; + 'startTime'?: number | null; +} +export interface o_storyboard { + 'createTime'?: number | null; 'id'?: number; - 'mode'?: string | null; - 'model'?: string | null; 'name'?: string | null; - 'prompt'?: string | null; - 'resolution'?: string | null; - 'scriptId'?: number | null; - 'sound'?: string | null; } export interface o_storyboardFlow { 'flowData': string; 'id'?: number; 'stroryboardId': number; } +export interface o_storyboardScript { + 'id'?: number; + 'scriptId'?: number | null; + 'storyboardId'?: number | null; +} export interface o_tasks { 'describe'?: string | null; 'id'?: number; @@ -157,27 +204,36 @@ export interface o_vendorConfig { 'version'?: string | null; } export interface o_video { + 'configId'?: number | null; 'errorReason'?: string | null; 'filePath'?: string | null; + 'firstFrame'?: string | null; 'id'?: number; - 'scriptId'?: number | null; - 'state'?: string | null; - 'storyboardId'?: number | null; - 'time'?: number | null; -} -export interface o_videoConfig { - 'audio'?: number | null; - 'createTime'?: number | null; - 'data'?: string | null; - 'duration'?: number | null; - 'id'?: number; - 'mode'?: string | null; 'model'?: string | null; 'prompt'?: string | null; 'resolution'?: string | null; - 'storyboardId'?: number | null; + 'scriptId'?: number | null; + 'state'?: number | null; + 'storyboardImgs'?: string | null; + 'time'?: number | null; +} +export interface o_videoConfig { + 'aiConfigId'?: number | null; + 'audioEnabled'?: number | null; + 'createTime'?: number | null; + 'duration'?: number | null; + 'endFrame'?: string | null; + 'id'?: number; + 'images'?: string | null; + 'manufacturer'?: string | null; + 'mode'?: string | null; + 'projectId'?: number | null; + 'prompt'?: string | null; + 'resolution'?: string | null; + 'scriptId'?: number | null; + 'selectedResultId'?: number | null; + 'startFrame'?: string | null; 'updateTime'?: number | null; - 'videoId'?: number | null; } export interface DB { @@ -185,18 +241,26 @@ export interface DB { "o_agentDeploy": o_agentDeploy; "o_artStyle": o_artStyle; "o_assets": o_assets; + "o_chatHistory": o_chatHistory; "o_event": o_event; "o_eventChapter": o_eventChapter; "o_flowData": o_flowData; "o_image": o_image; + "o_model": o_model; + "o_myTasks": o_myTasks; "o_novel": o_novel; "o_outline": o_outline; "o_outlineNovel": o_outlineNovel; "o_project": o_project; + "o_prompts": o_prompts; "o_script": o_script; + "o_scriptAssets": o_scriptAssets; + "o_scriptOutline": o_scriptOutline; "o_setting": o_setting; + "o_skills": o_skills; "o_storyboard": o_storyboard; "o_storyboardFlow": o_storyboardFlow; + "o_storyboardScript": o_storyboardScript; "o_tasks": o_tasks; "o_user": o_user; "o_vendorConfig": o_vendorConfig;