生产agent接入真实数据,并完善记忆、历史

This commit is contained in:
ACT丶流星雨 2026-03-23 14:24:00 +08:00
parent 2b18e066ee
commit 5c1a8bb02a
16 changed files with 307 additions and 198 deletions

View File

@ -40,6 +40,12 @@ Repository: https://github.com/vercel/ai
----------------------------- -----------------------------
Name: @huggingface/transformers
License: Apache-2.0
Repository: https://github.com/huggingface/transformers.js
-----------------------------
Name: @rmp135/sql-ts Name: @rmp135/sql-ts
License: MIT License: MIT
Repository: https://github.com/rmp135/sql-ts Repository: https://github.com/rmp135/sql-ts
@ -76,6 +82,12 @@ Repository: https://github.com/DefinitelyTyped/DefinitelyTyped
----------------------------- -----------------------------
Name: @types/lodash
License: MIT
Repository: https://github.com/DefinitelyTyped/DefinitelyTyped
-----------------------------
Name: @types/morgan Name: @types/morgan
License: MIT License: MIT
Repository: https://github.com/DefinitelyTyped/DefinitelyTyped Repository: https://github.com/DefinitelyTyped/DefinitelyTyped
@ -178,6 +190,12 @@ Repository: https://github.com/form-data/form-data
----------------------------- -----------------------------
Name: graphlib
License: MIT
Repository: https://github.com/dagrejs/graphlib
-----------------------------
Name: is-path-inside Name: is-path-inside
License: MIT License: MIT
Repository: https://github.com/sindresorhus/is-path-inside Repository: https://github.com/sindresorhus/is-path-inside
@ -208,6 +226,12 @@ Repository: https://github.com/davglass/license-checker
----------------------------- -----------------------------
Name: lodash
License: MIT
Repository: https://github.com/lodash/lodash
-----------------------------
Name: morgan Name: morgan
License: MIT License: MIT
Repository: https://github.com/expressjs/morgan Repository: https://github.com/expressjs/morgan
@ -220,9 +244,9 @@ Repository: https://github.com/remy/nodemon
----------------------------- -----------------------------
Name: qwen-ai-provider Name: qwen-ai-provider-v5
License: Apache-2.0 License: Apache-2.0
Repository: https://github.com/Younis-Ahmed/qwen-ai-provider Repository: https://github.com/bolechen/qwen-ai-provider-v5
----------------------------- -----------------------------
@ -244,12 +268,24 @@ Repository: https://github.com/lovell/sharp
----------------------------- -----------------------------
Name: socket.io
License: MIT
Repository: https://github.com/socketio/socket.io
-----------------------------
Name: sqlite3 Name: sqlite3
License: BSD-3-Clause License: BSD-3-Clause
Repository: https://github.com/TryGhost/node-sqlite3 Repository: https://github.com/TryGhost/node-sqlite3
----------------------------- -----------------------------
Name: sucrase
License: MIT
Repository: https://github.com/alangpierce/sucrase
-----------------------------
Name: tsx Name: tsx
License: MIT License: MIT
Repository: https://github.com/privatenumber/tsx Repository: https://github.com/privatenumber/tsx
@ -268,6 +304,12 @@ Repository: https://github.com/uuidjs/uuid
----------------------------- -----------------------------
Name: vm2
License: MIT
Repository: https://github.com/patriksimek/vm2
-----------------------------
Name: zhipu-ai-provider Name: zhipu-ai-provider
License: Apache-2.0 License: Apache-2.0
Repository: https://github.com/Xiang-CH/zhipu-ai-provider Repository: https://github.com/Xiang-CH/zhipu-ai-provider

View File

@ -34,7 +34,6 @@
"license": "bun run scripts/license.ts" "license": "bun run scripts/license.ts"
}, },
"dependencies": { "dependencies": {
"@ag-ui/core": "^0.0.47",
"@ai-sdk/anthropic": "^3.0.35", "@ai-sdk/anthropic": "^3.0.35",
"@ai-sdk/deepseek": "^2.0.17", "@ai-sdk/deepseek": "^2.0.17",
"@ai-sdk/devtools": "^0.0.11", "@ai-sdk/devtools": "^0.0.11",

View File

@ -35,7 +35,7 @@ function buildSystemPrompt(skillPrompt: string, mem: Awaited<ReturnType<Memory["
const subAgentList = ["executionAI", "supervisionAI"] as const; const subAgentList = ["executionAI", "supervisionAI"] as const;
export async function decisionAI(ctx: AgentContext) { export async function decisionAI(ctx: AgentContext) {
const { socket, isolationKey, text, abortSignal } = ctx; const { isolationKey, text, abortSignal } = ctx;
const memory = new Memory("productionAgent", isolationKey); const memory = new Memory("productionAgent", isolationKey);
await memory.add("user", text); await memory.add("user", text);
const [skill, mem] = await Promise.all([useSkill("production-agent", "decision"), memory.get(text)]); const [skill, mem] = await Promise.all([useSkill("production-agent", "decision"), memory.get(text)]);
@ -55,7 +55,7 @@ export async function decisionAI(ctx: AgentContext) {
...useTools(ctx.resTool), ...useTools(ctx.resTool),
}, },
onFinish: async (completion) => { onFinish: async (completion) => {
await memory.add("decisionAI", completion.text); await memory.add("assistant:decision", completion.text);
}, },
}); });
@ -84,7 +84,7 @@ export async function executionAI(ctx: AgentContext) {
...useTools(ctx.resTool), ...useTools(ctx.resTool),
}, },
onFinish: async (completion) => { onFinish: async (completion) => {
await memory.add("executionAI", completion.text); await memory.add("assistant:execution", completion.text);
}, },
}); });
@ -94,7 +94,6 @@ export async function executionAI(ctx: AgentContext) {
export async function supervisionAI(ctx: AgentContext) { export async function supervisionAI(ctx: AgentContext) {
const { isolationKey, text, abortSignal } = ctx; const { isolationKey, text, abortSignal } = ctx;
const memory = new Memory("productionAgent", isolationKey); const memory = new Memory("productionAgent", isolationKey);
await memory.add("user", text);
const [skill, mem] = await Promise.all([useSkill("production-agent", "supervision"), memory.get(text)]); const [skill, mem] = await Promise.all([useSkill("production-agent", "supervision"), memory.get(text)]);
const systemPrompt = buildSystemPrompt(skill.prompt, mem); const systemPrompt = buildSystemPrompt(skill.prompt, mem);
@ -108,7 +107,7 @@ export async function supervisionAI(ctx: AgentContext) {
...memory.getTools(), ...memory.getTools(),
}, },
onFinish: async (completion) => { onFinish: async (completion) => {
await memory.add("supervisionAI", completion.text); await memory.add("assistant:supervision", completion.text);
}, },
}); });

View File

@ -3,7 +3,7 @@ import { z } from "zod";
import _ from "lodash"; import _ from "lodash";
import ResTool from "@/socket/resTool"; import ResTool from "@/socket/resTool";
const deriveAssetSchema = z.object({ export const deriveAssetSchema = z.object({
id: z.number().describe("衍生资产ID,如果新增则为空").optional(), id: z.number().describe("衍生资产ID,如果新增则为空").optional(),
assetsId: z.string().describe("关联的资产ID"), assetsId: z.string().describe("关联的资产ID"),
name: z.string().describe("衍生资产名称"), name: z.string().describe("衍生资产名称"),
@ -11,14 +11,14 @@ const deriveAssetSchema = z.object({
src: z.string().describe("衍生资产资源路径"), src: z.string().describe("衍生资产资源路径"),
state: z.enum(["未生成", "生成中", "已完成", "生成失败"]).describe("衍生资产生成状态"), state: z.enum(["未生成", "生成中", "已完成", "生成失败"]).describe("衍生资产生成状态"),
}); });
const assetItemSchema = z.object({ export const assetItemSchema = z.object({
assetsId: z.string().describe("资产唯一标识"), assetsId: z.string().describe("资产唯一标识"),
name: z.string().describe("资产名称"), name: z.string().describe("资产名称"),
desc: z.string().describe("资产描述"), desc: z.string().describe("资产描述"),
src: z.string().describe("资产资源路径"), src: z.string().describe("资产资源路径"),
derive: z.array(deriveAssetSchema).describe("衍生资产列表"), derive: z.array(deriveAssetSchema).describe("衍生资产列表"),
}); });
const storyboardSchema = z.object({ export const storyboardSchema = z.object({
id: z.number().describe("分镜ID"), id: z.number().describe("分镜ID"),
title: z.string().describe("分镜标题"), title: z.string().describe("分镜标题"),
description: z.string().describe("分镜描述"), description: z.string().describe("分镜描述"),
@ -31,7 +31,7 @@ const storyboardSchema = z.object({
associateAssetsIds: z.array(z.number()).describe("关联资产ID列表"), associateAssetsIds: z.array(z.number()).describe("关联资产ID列表"),
src: z.string().nullable().describe("分镜资源路径"), src: z.string().nullable().describe("分镜资源路径"),
}); });
const workbenchDataSchema = z.object({ export const workbenchDataSchema = z.object({
name: z.string().describe("项目名称"), name: z.string().describe("项目名称"),
duration: z.string().describe("视频时长"), duration: z.string().describe("视频时长"),
resolution: z.string().describe("分辨率"), resolution: z.string().describe("分辨率"),
@ -39,11 +39,11 @@ const workbenchDataSchema = z.object({
cover: z.string().optional().describe("封面图片路径"), cover: z.string().optional().describe("封面图片路径"),
gradient: z.string().optional().describe("渐变色配置"), gradient: z.string().optional().describe("渐变色配置"),
}); });
const posterItemSchema = z.object({ export const posterItemSchema = z.object({
id: z.number().describe("海报ID"), id: z.number().describe("海报ID"),
image: z.string().describe("海报图片路径"), image: z.string().describe("海报图片路径"),
}); });
const flowDataSchema = z.object({ 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("衍生资产"),
@ -57,7 +57,7 @@ const flowDataSchema = z.object({
.describe("海报配置"), .describe("海报配置"),
}); });
type FlowData = z.infer<typeof flowDataSchema>; export type FlowData = z.infer<typeof flowDataSchema>;
const keySchema = z.enum(Object.keys(flowDataSchema.shape) as [keyof FlowData, ...Array<keyof FlowData>]); const keySchema = z.enum(Object.keys(flowDataSchema.shape) as [keyof FlowData, ...Array<keyof FlowData>]);
const flowDataKeyLabels = Object.fromEntries( const flowDataKeyLabels = Object.fromEntries(

View File

@ -329,8 +329,12 @@ export default async (knex: Knex, forceInit: boolean = false): Promise<void> =>
name: "o_flowData", name: "o_flowData",
builder: (table) => { builder: (table) => {
table.integer("id").notNullable(); table.integer("id").notNullable();
table.string("name"); table.integer("projectId");
table.integer("espisodeId");
table.string("key"); //用户其他方式索引
table.string("data");
table.integer("createTime"); table.integer("createTime");
table.integer("updateTime");
table.primary(["id"]); table.primary(["id"]);
table.unique(["id"]); table.unique(["id"]);
}, },

View File

@ -1,4 +1,4 @@
// @routes-hash 3d0673061005074e704638efccc539d1 // @routes-hash 4e2d02be3d3fe94b8130773d32713c03
import { Express } from "express"; import { Express } from "express";
import route1 from "./routes/agents/clearMemory"; import route1 from "./routes/agents/clearMemory";
@ -38,36 +38,38 @@ import route34 from "./routes/production/editStoryboard/generateStoryboardImage"
import route35 from "./routes/production/editStoryboard/getStoryboardFlow"; import route35 from "./routes/production/editStoryboard/getStoryboardFlow";
import route36 from "./routes/production/editStoryboard/saveStoryboardFlow"; import route36 from "./routes/production/editStoryboard/saveStoryboardFlow";
import route37 from "./routes/production/editStoryboard/updateStoryboardFlow"; import route37 from "./routes/production/editStoryboard/updateStoryboardFlow";
import route38 from "./routes/production/getProductionData"; import route38 from "./routes/production/getFlowData";
import route39 from "./routes/production/getStoryboardData"; import route39 from "./routes/production/getProductionData";
import route40 from "./routes/production/workbench/generateVideo"; import route40 from "./routes/production/getStoryboardData";
import route41 from "./routes/production/workbench/getVideoModelDetail"; import route41 from "./routes/production/saveFlowData";
import route42 from "./routes/project/addProject"; import route42 from "./routes/production/workbench/generateVideo";
import route43 from "./routes/project/delProject"; import route43 from "./routes/production/workbench/getVideoModelDetail";
import route44 from "./routes/project/editProject"; import route44 from "./routes/project/addProject";
import route45 from "./routes/project/getProject"; import route45 from "./routes/project/delProject";
import route46 from "./routes/script/addScript"; import route46 from "./routes/project/editProject";
import route47 from "./routes/script/delScript"; import route47 from "./routes/project/getProject";
import route48 from "./routes/script/getScrptApi"; import route48 from "./routes/script/addScript";
import route49 from "./routes/script/updateScript"; import route49 from "./routes/script/delScript";
import route50 from "./routes/setting/agentDeploy/deployAgentModel"; import route50 from "./routes/script/getScrptApi";
import route51 from "./routes/setting/agentDeploy/getAgentDeploy"; import route51 from "./routes/script/updateScript";
import route52 from "./routes/setting/agentDeploy/updateKey"; import route52 from "./routes/setting/agentDeploy/deployAgentModel";
import route53 from "./routes/setting/dbConfig/clearData"; import route53 from "./routes/setting/agentDeploy/getAgentDeploy";
import route54 from "./routes/setting/getTextModel"; import route54 from "./routes/setting/agentDeploy/updateKey";
import route55 from "./routes/setting/loginConfig/getUser"; import route55 from "./routes/setting/dbConfig/clearData";
import route56 from "./routes/setting/loginConfig/updateUserPwd"; import route56 from "./routes/setting/getTextModel";
import route57 from "./routes/setting/memoryConfig/getMemory"; import route57 from "./routes/setting/loginConfig/getUser";
import route58 from "./routes/setting/memoryConfig/sureMemory"; import route58 from "./routes/setting/loginConfig/updateUserPwd";
import route59 from "./routes/setting/vendorConfig/addVendor"; import route59 from "./routes/setting/memoryConfig/getMemory";
import route60 from "./routes/setting/vendorConfig/deleteVendor"; import route60 from "./routes/setting/memoryConfig/sureMemory";
import route61 from "./routes/setting/vendorConfig/getVendorList"; import route61 from "./routes/setting/vendorConfig/addVendor";
import route62 from "./routes/setting/vendorConfig/modelTest"; import route62 from "./routes/setting/vendorConfig/deleteVendor";
import route63 from "./routes/setting/vendorConfig/updateVendor"; import route63 from "./routes/setting/vendorConfig/getVendorList";
import route64 from "./routes/task/getMyTaskApi"; import route64 from "./routes/setting/vendorConfig/modelTest";
import route65 from "./routes/task/getTaskCategories"; import route65 from "./routes/setting/vendorConfig/updateVendor";
import route66 from "./routes/task/taskDetails"; import route66 from "./routes/task/getTaskApi";
import route67 from "./routes/test/test"; import route67 from "./routes/task/getTaskCategories";
import route68 from "./routes/task/taskDetails";
import route69 from "./routes/test/test";
export default async (app: Express) => { export default async (app: Express) => {
app.use("/api/agents/clearMemory", route1); app.use("/api/agents/clearMemory", route1);
@ -107,34 +109,36 @@ export default async (app: Express) => {
app.use("/api/production/editStoryboard/getStoryboardFlow", route35); app.use("/api/production/editStoryboard/getStoryboardFlow", route35);
app.use("/api/production/editStoryboard/saveStoryboardFlow", route36); app.use("/api/production/editStoryboard/saveStoryboardFlow", route36);
app.use("/api/production/editStoryboard/updateStoryboardFlow", route37); app.use("/api/production/editStoryboard/updateStoryboardFlow", route37);
app.use("/api/production/getProductionData", route38); app.use("/api/production/getFlowData", route38);
app.use("/api/production/getStoryboardData", route39); app.use("/api/production/getProductionData", route39);
app.use("/api/production/workbench/generateVideo", route40); app.use("/api/production/getStoryboardData", route40);
app.use("/api/production/workbench/getVideoModelDetail", route41); app.use("/api/production/saveFlowData", route41);
app.use("/api/project/addProject", route42); app.use("/api/production/workbench/generateVideo", route42);
app.use("/api/project/delProject", route43); app.use("/api/production/workbench/getVideoModelDetail", route43);
app.use("/api/project/editProject", route44); app.use("/api/project/addProject", route44);
app.use("/api/project/getProject", route45); app.use("/api/project/delProject", route45);
app.use("/api/script/addScript", route46); app.use("/api/project/editProject", route46);
app.use("/api/script/delScript", route47); app.use("/api/project/getProject", route47);
app.use("/api/script/getScrptApi", route48); app.use("/api/script/addScript", route48);
app.use("/api/script/updateScript", route49); app.use("/api/script/delScript", route49);
app.use("/api/setting/agentDeploy/deployAgentModel", route50); app.use("/api/script/getScrptApi", route50);
app.use("/api/setting/agentDeploy/getAgentDeploy", route51); app.use("/api/script/updateScript", route51);
app.use("/api/setting/agentDeploy/updateKey", route52); app.use("/api/setting/agentDeploy/deployAgentModel", route52);
app.use("/api/setting/dbConfig/clearData", route53); app.use("/api/setting/agentDeploy/getAgentDeploy", route53);
app.use("/api/setting/getTextModel", route54); app.use("/api/setting/agentDeploy/updateKey", route54);
app.use("/api/setting/loginConfig/getUser", route55); app.use("/api/setting/dbConfig/clearData", route55);
app.use("/api/setting/loginConfig/updateUserPwd", route56); app.use("/api/setting/getTextModel", route56);
app.use("/api/setting/memoryConfig/getMemory", route57); app.use("/api/setting/loginConfig/getUser", route57);
app.use("/api/setting/memoryConfig/sureMemory", route58); app.use("/api/setting/loginConfig/updateUserPwd", route58);
app.use("/api/setting/vendorConfig/addVendor", route59); app.use("/api/setting/memoryConfig/getMemory", route59);
app.use("/api/setting/vendorConfig/deleteVendor", route60); app.use("/api/setting/memoryConfig/sureMemory", route60);
app.use("/api/setting/vendorConfig/getVendorList", route61); app.use("/api/setting/vendorConfig/addVendor", route61);
app.use("/api/setting/vendorConfig/modelTest", route62); app.use("/api/setting/vendorConfig/deleteVendor", route62);
app.use("/api/setting/vendorConfig/updateVendor", route63); app.use("/api/setting/vendorConfig/getVendorList", route63);
app.use("/api/task/getMyTaskApi", route64); app.use("/api/setting/vendorConfig/modelTest", route64);
app.use("/api/task/getTaskCategories", route65); app.use("/api/setting/vendorConfig/updateVendor", route65);
app.use("/api/task/taskDetails", route66); app.use("/api/task/getTaskApi", route66);
app.use("/api/test/test", route67); app.use("/api/task/getTaskCategories", route67);
app.use("/api/task/taskDetails", route68);
app.use("/api/test/test", route69);
} }

View File

@ -16,10 +16,20 @@ export default router.post(
const { projectId, episodesId, type = "all" } = req.body; const { projectId, episodesId, type = "all" } = req.body;
const isolationKey = `${projectId}:${episodesId ?? ""}`; const isolationKey = `${projectId}:${episodesId ?? ""}`;
const query = u.db("memories").where({ isolationKey }); if (type === "all") {
if (type !== "all") query.where("type", type); await u.db("memories").where({ isolationKey }).del();
} else if (type === "message") {
await query.del(); // 删 message 时同步删关联的 summary避免悬挂引用
await u.db("memories").where({ isolationKey, type: "message" }).del();
await u.db("memories").where({ isolationKey, type: "summary" }).del();
} else {
// 删 summary 时将关联的 message 重置为未总结,使其重新进入 shortTerm
await u
.db("memories")
.where({ isolationKey, type: "message", summarized: 1 })
.update({ summarized: 0 });
await u.db("memories").where({ isolationKey, type: "summary" }).del();
}
res.status(200).send(success(null)); res.status(200).send(success(null));
}, },

View File

@ -5,6 +5,15 @@ import { success } from "@/lib/responseFormat";
import { validateFields } from "@/middleware/middleware"; import { validateFields } from "@/middleware/middleware";
const router = express.Router(); const router = express.Router();
function normalizeRole(role?: string | null): "user" | "assistant" {
return role?.startsWith("assistant") ? "assistant" : "user";
}
function getAssistantName(role?: string | null): string | undefined {
if (!role?.startsWith("assistant:")) return undefined;
return role.split(":")[1] || "assistant";
}
export default router.post( export default router.post(
"/", "/",
validateFields({ validateFields({
@ -19,15 +28,16 @@ export default router.post(
.db("memories") .db("memories")
.where({ isolationKey, type: "message" }) .where({ isolationKey, type: "message" })
.orderBy("createTime", "asc") .orderBy("createTime", "asc")
.select("id", "content", "createTime"); .select("id", "role", "content", "createTime");
const history = rows.map((row) => ({ const history = rows.map((row) => ({
id: row.id, id: row.id,
role: "user", role: normalizeRole(row.role),
content: [{ type: "text", status: "complete", data: row.content }], name: getAssistantName(row.role),
content: [{ type: "markdown", status: "complete", data: row.content }],
createTime: row.createTime, createTime: row.createTime,
})); }));
res.status(200).send(success({ history })); res.status(200).send(success(history));
}, },
); );

View File

@ -153,6 +153,7 @@ export default router.post(
return res.status(500).send("资产已被删除"); return res.status(500).send("资产已被删除");
} }
} catch (e) { } catch (e) {
console.errork(e);
await u.db("o_image").where("id", imageId).update({ await u.db("o_image").where("id", imageId).update({
state: "生成失败", state: "生成失败",
}); });

View File

@ -0,0 +1,82 @@
import express from "express";
import u from "@/utils";
import { z } from "zod";
import { success, error } from "@/lib/responseFormat";
import { validateFields } from "@/middleware/middleware";
const router = express.Router();
import { FlowData } from "@/agents/productionAgent/tools";
export default router.post(
"/",
validateFields({
projectId: z.number(),
episodesId: z.number(),
}),
async (req, res) => {
const { projectId, episodesId } = req.body;
const sqlData = await u.db("o_flowData").where({ projectId, episodesId }).first();
const scriptData = await u.db("o_script").where("projectId", projectId).first();
const assetsData = await u
.db("o_assets")
.leftJoin("o_image", "o_assets.imageId", "o_image.id")
.select("o_assets.*", "o_image.filePath")
.where("o_assets.projectId", projectId);
let childAssetsData = await u
.db("o_assets")
.leftJoin("o_image", "o_assets.imageId", "o_image.id")
.select("o_assets.*", "o_image.filePath")
.where("o_assets.projectId", projectId)
.whereNotNull("o_assets.sonId");
if (!sqlData) {
const flowData: FlowData = {
script: scriptData?.content ?? "",
scriptPlan: "",
assets: await Promise.all(
assetsData.map(async (item) => ({
assetsId: item.id,
name: item.name ?? "",
desc: item.describe ?? "",
src: item.filePath && (await u.oss.getFileUrl(item.filePath!)),
derive: await Promise.all(
childAssetsData
.filter((child) => child.sonId === item.id)
.map(async (child) => ({
id: child.id,
assetsId: item.id,
name: child.name ?? "",
desc: child.describe ?? "",
src: child.filePath && (await u.oss.getFileUrl(child.filePath!)),
state: child.state ?? "未生成", //todo矫正状态值
})),
),
})),
),
storyboardTable: "",
storyboard: [],
//todo矫正workbench数据
workbench: {
name: scriptData?.name ?? "",
duration: "01:03",
resolution: "1920×1080",
fps: "30fps",
gradient: "linear-gradient(135deg, #667eea 0%, #764ba2 100%)",
},
//todo矫正封面数据
poster: {
items: [],
},
};
return res.status(200).send(success(flowData));
} else {
try {
const flowData = JSON.parse(sqlData!.data ?? "{}");
res.status(200).send(success(flowData));
} catch (err) {
res.status(200).send(error());
}
}
},
);

View File

@ -0,0 +1,35 @@
import express from "express";
import u from "@/utils";
import { z } from "zod";
import { success } from "@/lib/responseFormat";
import { validateFields } from "@/middleware/middleware";
const router = express.Router();
import { flowDataSchema } from "@/agents/productionAgent/tools";
export default router.post(
"/",
validateFields({
projectId: z.number(),
episodesId: z.number(),
data: flowDataSchema,
}),
async (req, res) => {
const { projectId, episodesId } = req.body;
const sqlData = await u.db("o_flowData").where({ projectId, episodesId }).first();
if (!sqlData) {
await u.db("o_flowData").insert({
projectId,
episodesId,
data: JSON.stringify(req.body.data),
});
} else {
await u
.db("o_flowData")
.where({ projectId, episodesId })
.update({
data: JSON.stringify(req.body.data),
});
}
return res.status(200).send(success());
},
);

View File

@ -28,7 +28,8 @@ export default router.post(
}) })
.select("o_tasks.*", "o_project.* ") .select("o_tasks.*", "o_project.* ")
.offset(offset) .offset(offset)
.limit(limit); .limit(limit)
.orderBy("o_tasks.id", "desc");
const totalQuery = (await u const totalQuery = (await u
.db("o_tasks") .db("o_tasks")
.andWhere((qb) => { .andWhere((qb) => {

View File

@ -1,4 +1,4 @@
// @db-hash bd46e7c381481a74efedc662a4f9049f // @db-hash db6e8dfe8be75f6c605991904268fd8d
//该文件由脚本自动生成,请勿手动修改 //该文件由脚本自动生成,请勿手动修改
export interface memories { export interface memories {
@ -35,18 +35,12 @@ export interface o_assets {
'projectId'?: number | null; 'projectId'?: number | null;
'prompt'?: string | null; 'prompt'?: string | null;
'remark'?: string | null; 'remark'?: string | null;
'scriptId'?: number | null;
'sonId'?: number | null; 'sonId'?: number | null;
'startTime'?: number | null; 'startTime'?: number | null;
'state'?: string | null; 'state'?: string | null;
'type'?: 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 { export interface o_event {
'createTime'?: number | null; 'createTime'?: number | null;
'detail'?: string | null; 'detail'?: string | null;
@ -60,40 +54,21 @@ export interface o_eventChapter {
} }
export interface o_flowData { export interface o_flowData {
'createTime'?: number | null; 'createTime'?: number | null;
'data'?: string | null;
'episodesId'?: number | null;
'id'?: number; 'id'?: number;
'name'?: string | null; 'key'?: string | null;
'projectId'?: number | null;
'updateTime'?: number | null;
} }
export interface o_image { export interface o_image {
'assetsId'?: number | null; 'assetsId'?: number | null;
'filePath'?: string | null; 'filePath'?: string | null;
'id'?: number; 'id'?: number;
'projectId'?: number | null; 'model'?: string | null;
'scriptId'?: number | null; 'resolution'?: string | null;
'state'?: string | null; 'state'?: string | null;
'type'?: 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 { export interface o_novel {
'chapter'?: string | null; 'chapter'?: string | null;
@ -126,15 +101,6 @@ export interface o_project {
'userId'?: number | null; 'userId'?: number | null;
'videoRatio'?: string | 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 { export interface o_script {
'content'?: string | null; 'content'?: string | null;
'createTime'?: number | null; 'createTime'?: number | null;
@ -142,40 +108,31 @@ export interface o_script {
'name'?: string | null; 'name'?: string | null;
'projectId'?: number | 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 { export interface o_setting {
'key'?: string | null; 'key'?: string | null;
'value'?: string | null; 'value'?: string | null;
} }
export interface o_skills {
'id'?: number;
'name'?: string | null;
'startTime'?: number | null;
}
export interface o_storyboard { export interface o_storyboard {
'associateAssetsIds'?: string | null;
'camera'?: string | null;
'createTime'?: number | null; 'createTime'?: number | null;
'duration'?: string | null;
'filePath'?: string | null;
'frameType'?: string | null;
'id'?: number; 'id'?: number;
'mode'?: string | null;
'model'?: string | null;
'name'?: string | null; 'name'?: string | null;
'prompt'?: string | null;
'resolution'?: string | null;
'scriptId'?: number | null;
'sound'?: string | null;
} }
export interface o_storyboardFlow { export interface o_storyboardFlow {
'flowData': string; 'flowData': string;
'id'?: number; 'id'?: number;
'stroryboardId': number; 'stroryboardId': number;
} }
export interface o_storyboardScript {
'id'?: number;
'scriptId'?: number | null;
'storyboardId'?: number | null;
}
export interface o_tasks { export interface o_tasks {
'describe'?: string | null; 'describe'?: string | null;
'id'?: number; 'id'?: number;
@ -204,36 +161,27 @@ export interface o_vendorConfig {
'version'?: string | null; 'version'?: string | null;
} }
export interface o_video { export interface o_video {
'configId'?: number | null;
'errorReason'?: string | null; 'errorReason'?: string | null;
'filePath'?: string | null; 'filePath'?: string | null;
'firstFrame'?: string | null;
'id'?: number; 'id'?: number;
'model'?: string | null;
'prompt'?: string | null;
'resolution'?: string | null;
'scriptId'?: number | null; 'scriptId'?: number | null;
'state'?: number | null; 'state'?: string | null;
'storyboardImgs'?: string | null; 'storyboardId'?: number | null;
'time'?: number | null; 'time'?: number | null;
} }
export interface o_videoConfig { export interface o_videoConfig {
'aiConfigId'?: number | null; 'audio'?: number | null;
'audioEnabled'?: number | null;
'createTime'?: number | null; 'createTime'?: number | null;
'data'?: string | null;
'duration'?: number | null; 'duration'?: number | null;
'endFrame'?: string | null;
'id'?: number; 'id'?: number;
'images'?: string | null;
'manufacturer'?: string | null;
'mode'?: string | null; 'mode'?: string | null;
'projectId'?: number | null; 'model'?: string | null;
'prompt'?: string | null; 'prompt'?: string | null;
'resolution'?: string | null; 'resolution'?: string | null;
'scriptId'?: number | null; 'storyboardId'?: number | null;
'selectedResultId'?: number | null;
'startFrame'?: string | null;
'updateTime'?: number | null; 'updateTime'?: number | null;
'videoId'?: number | null;
} }
export interface DB { export interface DB {
@ -241,26 +189,18 @@ export interface DB {
"o_agentDeploy": o_agentDeploy; "o_agentDeploy": o_agentDeploy;
"o_artStyle": o_artStyle; "o_artStyle": o_artStyle;
"o_assets": o_assets; "o_assets": o_assets;
"o_chatHistory": o_chatHistory;
"o_event": o_event; "o_event": o_event;
"o_eventChapter": o_eventChapter; "o_eventChapter": o_eventChapter;
"o_flowData": o_flowData; "o_flowData": o_flowData;
"o_image": o_image; "o_image": o_image;
"o_model": o_model;
"o_myTasks": o_myTasks;
"o_novel": o_novel; "o_novel": o_novel;
"o_outline": o_outline; "o_outline": o_outline;
"o_outlineNovel": o_outlineNovel; "o_outlineNovel": o_outlineNovel;
"o_project": o_project; "o_project": o_project;
"o_prompts": o_prompts;
"o_script": o_script; "o_script": o_script;
"o_scriptAssets": o_scriptAssets;
"o_scriptOutline": o_scriptOutline;
"o_setting": o_setting; "o_setting": o_setting;
"o_skills": o_skills;
"o_storyboard": o_storyboard; "o_storyboard": o_storyboard;
"o_storyboardFlow": o_storyboardFlow; "o_storyboardFlow": o_storyboardFlow;
"o_storyboardScript": o_storyboardScript;
"o_tasks": o_tasks; "o_tasks": o_tasks;
"o_user": o_user; "o_user": o_user;
"o_vendorConfig": o_vendorConfig; "o_vendorConfig": o_vendorConfig;

View File

@ -12,7 +12,6 @@ let extractor: FeatureExtractionPipeline | null = null;
export async function initEmbedding(): Promise<void> { export async function initEmbedding(): Promise<void> {
if (extractor) return; if (extractor) return;
//todo 模型配置放到这里
const modelConfigData = await db("o_setting").whereIn("key", ["modelOnnxFile", "modelDtype"]); const modelConfigData = await db("o_setting").whereIn("key", ["modelOnnxFile", "modelDtype"]);
const modelObj: Record<string, string> = {}; const modelObj: Record<string, string> = {};
Object.entries(modelConfigData).forEach(([key, value]) => { Object.entries(modelConfigData).forEach(([key, value]) => {

View File

@ -1,5 +1,5 @@
import { generateText, streamText, Output, stepCountIs, ModelMessage, LanguageModel, Tool, GenerateTextResult } from "ai"; import { generateText, streamText, wrapLanguageModel, stepCountIs } from "ai";
import { parse } from "best-effort-json-parser"; import { devToolsMiddleware } from "@ai-sdk/devtools";
import axios from "axios"; import axios from "axios";
import { transform } from "sucrase"; import { transform } from "sucrase";
import u from "@/utils"; import u from "@/utils";
@ -76,7 +76,10 @@ class AiText {
return streamText({ return streamText({
...(input.tools && { stopWhen: stepCountIs(Object.keys(input.tools).length * 5) }), ...(input.tools && { stopWhen: stepCountIs(Object.keys(input.tools).length * 5) }),
...input, ...input,
model: await getVendorTemplateFn("textRequest", modelName), model: wrapLanguageModel({
model: await getVendorTemplateFn("textRequest", modelName),
middleware: devToolsMiddleware(),
}),
} as Parameters<typeof streamText>[0]); } as Parameters<typeof streamText>[0]);
} }
} }

View File

@ -7,14 +7,6 @@
resolved "https://registry.npmmirror.com/7zip-bin/-/7zip-bin-5.2.0.tgz#7a03314684dd6572b7dfa89e68ce31d60286854d" resolved "https://registry.npmmirror.com/7zip-bin/-/7zip-bin-5.2.0.tgz#7a03314684dd6572b7dfa89e68ce31d60286854d"
integrity sha512-ukTPVhqG4jNzMro2qA9HSCSSVJN3aN7tlb+hfqYCt3ER0yWroeA2VR38MNrOHLQ/cVj+DaIMad0kFCtWWowh/A== integrity sha512-ukTPVhqG4jNzMro2qA9HSCSSVJN3aN7tlb+hfqYCt3ER0yWroeA2VR38MNrOHLQ/cVj+DaIMad0kFCtWWowh/A==
"@ag-ui/core@^0.0.47":
version "0.0.47"
resolved "https://registry.npmmirror.com/@ag-ui/core/-/core-0.0.47.tgz#0f6b8cb6bf1f90a562c64d6c0b4585ae0174e4ed"
integrity sha512-fHat7ZErAH028R90psYclTWaj6PdcvN2GJxzwWPF/j1c5ceqbF2+6xe+t06Psg+gCzZneI9QE3IkOkdJNplZ5A==
dependencies:
rxjs "7.8.1"
zod "^3.22.4"
"@ai-sdk/anthropic@^3.0.35": "@ai-sdk/anthropic@^3.0.35":
version "3.0.50" version "3.0.50"
resolved "https://registry.npmmirror.com/@ai-sdk/anthropic/-/anthropic-3.0.50.tgz#5ffdb638ae5418a2bf53d97448346af7ab77e09a" resolved "https://registry.npmmirror.com/@ai-sdk/anthropic/-/anthropic-3.0.50.tgz#5ffdb638ae5418a2bf53d97448346af7ab77e09a"
@ -4110,13 +4102,6 @@ runtime-required@^1.1.0:
resolved "https://registry.npmmirror.com/runtime-required/-/runtime-required-1.1.0.tgz#a000a50c2748dba123f4dac5105e66d4599519c4" resolved "https://registry.npmmirror.com/runtime-required/-/runtime-required-1.1.0.tgz#a000a50c2748dba123f4dac5105e66d4599519c4"
integrity sha512-yX97f5E0WfNpcQnfVjap6vzQcvErkYYCx6eTK4siqGEdC8lglwypUFgZVTX7ShvIlgfkC4XGFl9O1KTYcff0pw== integrity sha512-yX97f5E0WfNpcQnfVjap6vzQcvErkYYCx6eTK4siqGEdC8lglwypUFgZVTX7ShvIlgfkC4XGFl9O1KTYcff0pw==
rxjs@7.8.1:
version "7.8.1"
resolved "https://registry.npmmirror.com/rxjs/-/rxjs-7.8.1.tgz#6f6f3d99ea8044291efd92e7c7fcf562c4057543"
integrity sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==
dependencies:
tslib "^2.1.0"
safe-buffer@5.1.2: safe-buffer@5.1.2:
version "5.1.2" version "5.1.2"
resolved "https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" resolved "https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d"
@ -4762,7 +4747,7 @@ ts-interface-checker@^0.1.9:
resolved "https://registry.npmmirror.com/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz#784fd3d679722bc103b1b4b8030bcddb5db2a699" resolved "https://registry.npmmirror.com/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz#784fd3d679722bc103b1b4b8030bcddb5db2a699"
integrity sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA== integrity sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==
tslib@^2.1.0, tslib@^2.4.0: tslib@^2.4.0:
version "2.8.1" version "2.8.1"
resolved "https://registry.npmmirror.com/tslib/-/tslib-2.8.1.tgz#612efe4ed235d567e8aba5f2a5fab70280ade83f" resolved "https://registry.npmmirror.com/tslib/-/tslib-2.8.1.tgz#612efe4ed235d567e8aba5f2a5fab70280ade83f"
integrity sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w== integrity sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==
@ -5081,11 +5066,6 @@ zhipu-ai-provider@^0.2.2:
"@ai-sdk/provider" "^2.0.0" "@ai-sdk/provider" "^2.0.0"
"@ai-sdk/provider-utils" "^3.0.0" "@ai-sdk/provider-utils" "^3.0.0"
zod@^3.22.4:
version "3.25.76"
resolved "https://registry.npmmirror.com/zod/-/zod-3.25.76.tgz#26841c3f6fd22a6a2760e7ccb719179768471e34"
integrity sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==
zod@^4.3.5: zod@^4.3.5:
version "4.3.6" version "4.3.6"
resolved "https://registry.npmmirror.com/zod/-/zod-4.3.6.tgz#89c56e0aa7d2b05107d894412227087885ab112a" resolved "https://registry.npmmirror.com/zod/-/zod-4.3.6.tgz#89c56e0aa7d2b05107d894412227087885ab112a"