修改接口名,完善资产
This commit is contained in:
parent
80d0c8143f
commit
dbccdbf770
@ -33,7 +33,7 @@ description: >
|
|||||||
|
|
||||||
1. 调用 `get_flowData` 分别获取 `script`(剧本)和 `assets`(现有资产列表)
|
1. 调用 `get_flowData` 分别获取 `script`(剧本)和 `assets`(现有资产列表)
|
||||||
2. 根据[分镜表生成](references/storyboard-generation.md)文档中的拆分原则和字段填写指引,将剧本拆分为分镜,填写每条分镜的所有字段(id、title、description、camera、duration、frameMode、prompt、lines、sound、associateAssetsIds)
|
2. 根据[分镜表生成](references/storyboard-generation.md)文档中的拆分原则和字段填写指引,将剧本拆分为分镜,填写每条分镜的所有字段(id、title、description、camera、duration、frameMode、prompt、lines、sound、associateAssetsIds)
|
||||||
3. 调用 `set_flowData({ key: "storyboardTable", value: 分镜数组 })` 一次性保存完整分镜表
|
3. 调用 `set_flowData({ key: "storyboard", value: 分镜数组 })` 一次性保存完整分镜表
|
||||||
4. 告知用户分镜表生成完成,列出分镜概要(总条数、主要场景)
|
4. 告知用户分镜表生成完成,列出分镜概要(总条数、主要场景)
|
||||||
5. **询问用户是否需要生成分镜图片**:
|
5. **询问用户是否需要生成分镜图片**:
|
||||||
- 如果用户确认需要,调用 `generate_storyboard_images({ script: 剧本文本 })` 生成分镜图
|
- 如果用户确认需要,调用 `generate_storyboard_images({ script: 剧本文本 })` 生成分镜图
|
||||||
|
|||||||
@ -1,4 +1,4 @@
|
|||||||
# 分镜面板生成(从剧本 + 资产 → storyboardTable)
|
# 分镜面板生成(从剧本 + 资产 → storyboard)
|
||||||
|
|
||||||
本指南只做一件事:
|
本指南只做一件事:
|
||||||
根据剧本内容和已有资产,将剧本拆分为一系列分镜,生成结构化的分镜面板。
|
根据剧本内容和已有资产,将剧本拆分为一系列分镜,生成结构化的分镜面板。
|
||||||
@ -18,7 +18,7 @@
|
|||||||
|
|
||||||
```ts
|
```ts
|
||||||
set_flowData({
|
set_flowData({
|
||||||
key: "storyboardTable",
|
key: "storyboard",
|
||||||
value: [
|
value: [
|
||||||
{
|
{
|
||||||
id: 1,
|
id: 1,
|
||||||
@ -185,7 +185,7 @@ set_flowData({
|
|||||||
|
|
||||||
```ts
|
```ts
|
||||||
set_flowData({
|
set_flowData({
|
||||||
key: "storyboardTable",
|
key: "storyboard",
|
||||||
value: [
|
value: [
|
||||||
{
|
{
|
||||||
id: 1,
|
id: 1,
|
||||||
@ -232,7 +232,7 @@ set_flowData({
|
|||||||
1. `get_flowData("script")` — 获取剧本内容
|
1. `get_flowData("script")` — 获取剧本内容
|
||||||
2. `get_flowData("assets")` — 获取已有资产列表
|
2. `get_flowData("assets")` — 获取已有资产列表
|
||||||
3. 分析剧本,按照拆分原则划分分镜,并为每条分镜填写所有字段
|
3. 分析剧本,按照拆分原则划分分镜,并为每条分镜填写所有字段
|
||||||
4. 调用 `set_flowData({ key: "storyboardTable", value: 分镜数组 })` 一次性保存完整分镜面板
|
4. 调用 `set_flowData({ key: "storyboard", value: 分镜数组 })` 一次性保存完整分镜面板
|
||||||
5. 向用户汇报分镜面板概要(总共多少条分镜,覆盖的场景概括)
|
5. 向用户汇报分镜面板概要(总共多少条分镜,覆盖的场景概括)
|
||||||
6. **询问用户是否需要生成分镜图片**:
|
6. **询问用户是否需要生成分镜图片**:
|
||||||
- 如果用户确认,调用 `generate_storyboard_images({ script: 剧本文本 })` 生成分镜图
|
- 如果用户确认,调用 `generate_storyboard_images({ script: 剧本文本 })` 生成分镜图
|
||||||
|
|||||||
@ -24,7 +24,7 @@ export const assetItemSchema = z.object({
|
|||||||
derive: z.array(deriveAssetSchema).describe("衍生资产列表"),
|
derive: z.array(deriveAssetSchema).describe("衍生资产列表"),
|
||||||
});
|
});
|
||||||
export const storyboardSchema = z.object({
|
export const storyboardSchema = z.object({
|
||||||
id: z.number().optional().describe("分镜ID,未从工作区获得的分镜列表视为需要新增;如需新增则为空"),
|
id: z.number().optional().describe("分镜ID,未从工作区获得的分镜面板视为需要新增;如需新增则为空"),
|
||||||
title: z.string().describe("分镜标题"),
|
title: z.string().describe("分镜标题"),
|
||||||
description: z.string().describe("分镜描述"),
|
description: z.string().describe("分镜描述"),
|
||||||
camera: z.string().describe("镜头信息"),
|
camera: z.string().describe("镜头信息"),
|
||||||
@ -52,8 +52,8 @@ export const flowDataSchema = z.object({
|
|||||||
script: z.string().describe("剧本内容"),
|
script: z.string().describe("剧本内容"),
|
||||||
scriptPlan: z.string().describe("拍摄计划"),
|
scriptPlan: z.string().describe("拍摄计划"),
|
||||||
assets: z.array(assetItemSchema).describe("衍生资产"),
|
assets: z.array(assetItemSchema).describe("衍生资产"),
|
||||||
storyboardTable: z.string().describe("分镜面板"),
|
storyboardTable: z.string().describe("分镜表"),
|
||||||
storyboard: z.array(storyboardSchema).describe("分镜列表"),
|
storyboard: z.array(storyboardSchema).describe("分镜面板"),
|
||||||
workbench: workbenchDataSchema.describe("工作台配置"),
|
workbench: workbenchDataSchema.describe("工作台配置"),
|
||||||
poster: z
|
poster: z
|
||||||
.object({
|
.object({
|
||||||
@ -183,21 +183,21 @@ export default (resTool: ResTool, toolsNames?: string[]) => {
|
|||||||
},
|
},
|
||||||
}),
|
}),
|
||||||
set_flowData_storyboardTable: tool({
|
set_flowData_storyboardTable: tool({
|
||||||
description: "保存分镜模板到工作区",
|
description: "保存分镜表到工作区",
|
||||||
inputSchema: z.object({ value: flowDataSchema.shape.storyboardTable }),
|
inputSchema: z.object({ value: flowDataSchema.shape.storyboardTable }),
|
||||||
execute: async ({ value }) => {
|
execute: async ({ value }) => {
|
||||||
console.log("[tools] set_flowData storyboardTable", value);
|
console.log("[tools] set_flowData storyboardTable", value);
|
||||||
resTool.systemMessage("正在保存 分镜面板 数据...");
|
resTool.systemMessage("正在保存 分镜表 数据...");
|
||||||
socket.emit("setFlowData", { key: "storyboardTable", value });
|
socket.emit("setFlowData", { key: "storyboardTable", value });
|
||||||
return true;
|
return true;
|
||||||
},
|
},
|
||||||
}),
|
}),
|
||||||
set_flowData_storyboard: tool({
|
set_flowData_storyboard: tool({
|
||||||
description: "保存分镜列表到工作区",
|
description: "保存分镜面板到工作区",
|
||||||
inputSchema: z.object({ value: flowDataSchema.shape.storyboard }),
|
inputSchema: z.object({ value: flowDataSchema.shape.storyboard }),
|
||||||
execute: async ({ value }) => {
|
execute: async ({ value }) => {
|
||||||
console.log("[tools] set_flowData storyboard", value);
|
console.log("[tools] set_flowData storyboard", value);
|
||||||
resTool.systemMessage("正在保存 分镜列表 数据...");
|
resTool.systemMessage("正在保存 分镜面板 数据...");
|
||||||
for (const item of value) {
|
for (const item of value) {
|
||||||
if (!item.id) {
|
if (!item.id) {
|
||||||
const [insertedId] = await u.db("o_storyboard").insert({
|
const [insertedId] = await u.db("o_storyboard").insert({
|
||||||
@ -211,6 +211,7 @@ export default (resTool: ResTool, toolsNames?: string[]) => {
|
|||||||
sound: item.sound,
|
sound: item.sound,
|
||||||
lines: item.lines,
|
lines: item.lines,
|
||||||
state: "未生成",
|
state: "未生成",
|
||||||
|
scriptId: resTool.data.scriptId,
|
||||||
});
|
});
|
||||||
if (item.associateAssetsIds.length) {
|
if (item.associateAssetsIds.length) {
|
||||||
await u.db("o_assets2Storyboard").insert(item.associateAssetsIds.map((i) => ({ storyboardId: insertedId, assetId: i })));
|
await u.db("o_assets2Storyboard").insert(item.associateAssetsIds.map((i) => ({ storyboardId: insertedId, assetId: i })));
|
||||||
|
|||||||
@ -414,13 +414,14 @@ export default async (knex: Knex, forceInit: boolean = false): Promise<void> =>
|
|||||||
table.index(["isolationKey", "summarized"]);
|
table.index(["isolationKey", "summarized"]);
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
//分镜工作流表
|
//图片工作流表
|
||||||
{
|
{
|
||||||
name: "o_storyboardFlow",
|
name: "o_imageFlow",
|
||||||
builder: (table) => {
|
builder: (table) => {
|
||||||
table.integer("id").notNullable();
|
table.integer("id").notNullable();
|
||||||
table.text("flowData").notNullable();
|
table.text("flowData").notNullable();
|
||||||
table.integer("storyboardId").notNullable();
|
table.integer("storyboardId");
|
||||||
|
table.integer("assetsId");
|
||||||
table.primary(["id"]);
|
table.primary(["id"]);
|
||||||
table.unique(["id"]);
|
table.unique(["id"]);
|
||||||
},
|
},
|
||||||
|
|||||||
@ -1,4 +1,4 @@
|
|||||||
// @routes-hash 055f8c83508ff9dfc8b98eb5108287f7
|
// @routes-hash 27c3b6ded51fc0de03bec6512e84485b
|
||||||
import { Express } from "express";
|
import { Express } from "express";
|
||||||
|
|
||||||
import route1 from "./routes/agents/clearMemory";
|
import route1 from "./routes/agents/clearMemory";
|
||||||
@ -40,10 +40,10 @@ import route36 from "./routes/novel/updateNovel";
|
|||||||
import route37 from "./routes/other/deleteAllData";
|
import route37 from "./routes/other/deleteAllData";
|
||||||
import route38 from "./routes/other/getCaptcha";
|
import route38 from "./routes/other/getCaptcha";
|
||||||
import route39 from "./routes/production/assets/getAssetsData";
|
import route39 from "./routes/production/assets/getAssetsData";
|
||||||
import route40 from "./routes/production/editStoryboard/generateStoryboardImage";
|
import route40 from "./routes/production/editImage/generateStoryboardImage";
|
||||||
import route41 from "./routes/production/editStoryboard/getStoryboardFlow";
|
import route41 from "./routes/production/editImage/getStoryboardFlow";
|
||||||
import route42 from "./routes/production/editStoryboard/saveStoryboardFlow";
|
import route42 from "./routes/production/editImage/saveStoryboardFlow";
|
||||||
import route43 from "./routes/production/editStoryboard/updateStoryboardFlow";
|
import route43 from "./routes/production/editImage/updateStoryboardFlow";
|
||||||
import route44 from "./routes/production/exportImage";
|
import route44 from "./routes/production/exportImage";
|
||||||
import route45 from "./routes/production/getFlowData";
|
import route45 from "./routes/production/getFlowData";
|
||||||
import route46 from "./routes/production/getProductionData";
|
import route46 from "./routes/production/getProductionData";
|
||||||
@ -125,10 +125,10 @@ export default async (app: Express) => {
|
|||||||
app.use("/api/other/deleteAllData", route37);
|
app.use("/api/other/deleteAllData", route37);
|
||||||
app.use("/api/other/getCaptcha", route38);
|
app.use("/api/other/getCaptcha", route38);
|
||||||
app.use("/api/production/assets/getAssetsData", route39);
|
app.use("/api/production/assets/getAssetsData", route39);
|
||||||
app.use("/api/production/editStoryboard/generateStoryboardImage", route40);
|
app.use("/api/production/editImage/generateStoryboardImage", route40);
|
||||||
app.use("/api/production/editStoryboard/getStoryboardFlow", route41);
|
app.use("/api/production/editImage/getStoryboardFlow", route41);
|
||||||
app.use("/api/production/editStoryboard/saveStoryboardFlow", route42);
|
app.use("/api/production/editImage/saveStoryboardFlow", route42);
|
||||||
app.use("/api/production/editStoryboard/updateStoryboardFlow", route43);
|
app.use("/api/production/editImage/updateStoryboardFlow", route43);
|
||||||
app.use("/api/production/exportImage", route44);
|
app.use("/api/production/exportImage", route44);
|
||||||
app.use("/api/production/getFlowData", route45);
|
app.use("/api/production/getFlowData", route45);
|
||||||
app.use("/api/production/getProductionData", route46);
|
app.use("/api/production/getProductionData", route46);
|
||||||
|
|||||||
@ -9,10 +9,20 @@ export default router.post(
|
|||||||
"/",
|
"/",
|
||||||
validateFields({
|
validateFields({
|
||||||
id: z.number(),
|
id: z.number(),
|
||||||
|
type: z.enum(["assets", "storyboard"]),
|
||||||
}),
|
}),
|
||||||
async (req, res) => {
|
async (req, res) => {
|
||||||
const { id } = req.body;
|
const { id, type } = req.body;
|
||||||
const storyboardFlowData = await u.db("o_storyboardFlow").where("storyboardId", id).first();
|
const storyboardFlowData = await u
|
||||||
|
.db("o_imageFlow")
|
||||||
|
.modify((qb) => {
|
||||||
|
if (type === "assets") {
|
||||||
|
qb.where("assetsId", id);
|
||||||
|
} else if (type === "storyboard") {
|
||||||
|
qb.where("storyboardId", id);
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.first();
|
||||||
if (storyboardFlowData?.flowData) {
|
if (storyboardFlowData?.flowData) {
|
||||||
const parseFlow = JSON.parse(storyboardFlowData.flowData);
|
const parseFlow = JSON.parse(storyboardFlowData.flowData);
|
||||||
await Promise.all(
|
await Promise.all(
|
||||||
@ -29,7 +29,7 @@ export default router.post(
|
|||||||
filePath: new URL(imageUrl).pathname,
|
filePath: new URL(imageUrl).pathname,
|
||||||
createTime: Date.now(),
|
createTime: Date.now(),
|
||||||
});
|
});
|
||||||
await u.db("o_storyboardFlow").insert({
|
await u.db("o_imageFlow").insert({
|
||||||
storyboardId: id,
|
storyboardId: id,
|
||||||
flowData: JSON.stringify({ edges, nodes }),
|
flowData: JSON.stringify({ edges, nodes }),
|
||||||
});
|
});
|
||||||
@ -31,7 +31,7 @@ export default router.post(
|
|||||||
.where("id", id)
|
.where("id", id)
|
||||||
.update({ filePath: new URL(imageUrl).pathname });
|
.update({ filePath: new URL(imageUrl).pathname });
|
||||||
await u
|
await u
|
||||||
.db("o_storyboardFlow")
|
.db("o_imageFlow")
|
||||||
.where("storyboardId", id)
|
.where("storyboardId", id)
|
||||||
.update({
|
.update({
|
||||||
flowData: JSON.stringify({ edges, nodes }),
|
flowData: JSON.stringify({ edges, nodes }),
|
||||||
9
src/types/database.d.ts
vendored
9
src/types/database.d.ts
vendored
@ -1,4 +1,4 @@
|
|||||||
// @db-hash 1ce1a8f10cb90caac306536b78942cb3
|
// @db-hash e7f6b28afeff91fb2a3544abed8c4a73
|
||||||
//该文件由脚本自动生成,请勿手动修改
|
//该文件由脚本自动生成,请勿手动修改
|
||||||
|
|
||||||
export interface _o_storyboard_old_20260324 {
|
export interface _o_storyboard_old_20260324 {
|
||||||
@ -93,6 +93,12 @@ export interface o_image {
|
|||||||
'state'?: string | null;
|
'state'?: string | null;
|
||||||
'type'?: string | null;
|
'type'?: string | null;
|
||||||
}
|
}
|
||||||
|
export interface o_imageFlow {
|
||||||
|
'assetsId'?: number | null;
|
||||||
|
'flowData': string;
|
||||||
|
'id'?: number;
|
||||||
|
'storyboardId'?: number | null;
|
||||||
|
}
|
||||||
export interface o_novel {
|
export interface o_novel {
|
||||||
'chapter'?: string | null;
|
'chapter'?: string | null;
|
||||||
'chapterData'?: string | null;
|
'chapterData'?: string | null;
|
||||||
@ -228,6 +234,7 @@ export interface DB {
|
|||||||
"o_event": o_event;
|
"o_event": o_event;
|
||||||
"o_eventChapter": o_eventChapter;
|
"o_eventChapter": o_eventChapter;
|
||||||
"o_image": o_image;
|
"o_image": o_image;
|
||||||
|
"o_imageFlow": o_imageFlow;
|
||||||
"o_novel": o_novel;
|
"o_novel": o_novel;
|
||||||
"o_outline": o_outline;
|
"o_outline": o_outline;
|
||||||
"o_outlineNovel": o_outlineNovel;
|
"o_outlineNovel": o_outlineNovel;
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user