diff --git a/src/lib/initDB.ts b/src/lib/initDB.ts index b5b6df6..0e10bcb 100644 --- a/src/lib/initDB.ts +++ b/src/lib/initDB.ts @@ -48,20 +48,7 @@ export default async (knex: Knex, forceInit: boolean = false): Promise => table.primary(["id"]); table.unique(["id"]); }, - initData: async (knex) => { - }, - }, - //技能表 - { - name: "o_skills", - builder: (table) => { - table.integer("id").notNullable(); - table.string("name"); - table.integer("startTime"); - table.primary(["id"]); - table.unique(["id"]); - }, - initData: async (knex) => { }, + initData: async (knex) => {}, }, //Agent配置表 { @@ -167,64 +154,9 @@ export default async (knex: Knex, forceInit: boolean = false): Promise => ]); }, }, - //模型表 - { - name: "o_model", - builder: (table) => { - table.integer("id").notNullable(); - table.text("type"); - table.text("model"); - table.text("modelType"); - table.text("apiKey"); - table.text("baseUrl"); - table.text("manufacturer"); - table.integer("createTime"); - table.integer("index"); - table.primary(["id"]); - table.unique(["id"]); - }, - initData: async (knex) => { }, - }, - //提示词表 - { - name: "o_prompts", - builder: (table) => { - table.integer("id").notNullable(); - table.text("code"); // 代号,唯一标识 - table.text("name"); // 名称/描述 - table.text("type"); // 类型:mainAgent/subAgent/system - table.text("parentCode"); // 父级代号(subAgent关联主agent) - table.text("defaultValue"); // 默认提示词 - table.text("customValue"); // 自定义修改值 - table.primary(["id"]); - table.unique(["id"]); - table.unique(["code"]); // 代号唯一 - }, - initData: async (knex) => { }, - }, - //资产表 - { - name: "o_assets", - builder: (table) => { - table.integer("id").notNullable(); - table.text("name"); - table.text("prompt"); - table.text("remark"); - table.text("type"); - table.text("describe"); - table.integer("imageId").unsigned().references("id").inTable("o_image"); - table.integer("sonId"); - table.integer("projectId"); - table.integer("startTime"); - table.text("state"); - table.primary(["id"]); - table.unique(["id"]); - }, - initData: async (knex) => { }, - }, //任务中心表 { - name: "o_myTasks", + name: "o_tasks", builder: (table) => { table.integer("id").notNullable(); table.integer("projectId"); @@ -238,7 +170,7 @@ export default async (knex: Knex, forceInit: boolean = false): Promise => table.primary(["id"]); table.unique(["id"]); }, - initData: async (knex) => { }, + initData: async (knex) => {}, }, //小说原文表 { @@ -314,24 +246,38 @@ export default async (knex: Knex, forceInit: boolean = false): Promise => table.unique(["id"]); }, }, - //剧本-大纲 + //资产表 { - name: "o_scriptOutline", + name: "o_assets", builder: (table) => { table.integer("id").notNullable(); - table.integer("scriptId").unsigned().references("id").inTable("o_script"); - table.integer("outlineId").unsigned().references("id").inTable("o_outline"); + table.text("name"); + table.text("prompt"); + table.text("remark"); + table.text("type"); + table.text("describe"); + table.integer("imageId").unsigned().references("id").inTable("o_image"); + table.integer("sonId"); + table.integer("projectId"); + table.integer("startTime"); + table.text("state"); table.primary(["id"]); table.unique(["id"]); }, + initData: async (knex) => {}, }, - //剧本-资产 + //生成图片表 { - name: "o_scriptAssets", + name: "o_image", builder: (table) => { table.integer("id").notNullable(); - table.integer("assetsId").unsigned().references("id").inTable("o_assets"); - table.integer("scriptId").unsigned().references("id").inTable("o_script"); + table.text("filePath"); + table.text("type"); + table.integer("assetsId"); + table.integer("scriptId"); + table.integer("projectId"); + table.integer("videoId"); + table.text("state"); table.primary(["id"]); table.unique(["id"]); }, @@ -347,13 +293,13 @@ export default async (knex: Knex, forceInit: boolean = false): Promise => table.unique(["id"]); }, }, - //分镜-剧本 + //flowData-剧本 { - name: "o_storyboardScript", + name: "o_flowData", builder: (table) => { table.integer("id").notNullable(); - table.integer("storyboardId").unsigned().references("id").inTable("o_storyboard"); - table.integer("scriptId").unsigned().references("id").inTable("o_script"); + table.string("name"); + table.integer("createTime"); table.primary(["id"]); table.unique(["id"]); }, @@ -378,19 +324,6 @@ export default async (knex: Knex, forceInit: boolean = false): Promise => table.unique(["id"]); }, }, - //聊天记录 - { - name: "o_chatHistory", - builder: (table) => { - table.integer("id").notNullable(); - table.text("type"); - table.text("data"); - table.text("novel"); - table.integer("projectId"); - table.primary(["id"]); - table.unique(["id"]); - }, - }, //视频配置 { name: "o_videoConfig", @@ -415,18 +348,19 @@ export default async (knex: Knex, forceInit: boolean = false): Promise => table.unique(["id"]); }, }, - //生成图片表 + //供应商配置表 { - name: "o_image", + name: "o_vendorConfig", builder: (table) => { table.integer("id").notNullable(); - table.text("filePath"); - table.text("type"); - table.integer("assetsId"); - table.integer("scriptId"); - table.integer("projectId"); - table.integer("videoId"); - table.text("state"); + table.text("name"); + table.text("version"); + table.text("icon"); + table.text("inputs"); // 输入项配置 JSON + table.text("inputValues"); // 输入项值 JSON + table.text("models"); // 模型配置 JSON + table.text("code"); // 模型配置 JSON + table.integer("createTime"); table.primary(["id"]); table.unique(["id"]); }, @@ -460,7 +394,7 @@ export default async (knex: Knex, forceInit: boolean = false): Promise => table.text("embedding"); // 向量嵌入 JSON table.text("relatedMessageIds"); // summary关联的message id列表 JSON table.integer("summarized").defaultTo(0); // message是否已被总结 0/1 - table.integer("createdAt").notNullable(); + table.integer("createTime").notNullable(); table.primary(["id"]); table.index(["isolationKey", "type"]); table.index(["isolationKey", "summarized"]); diff --git a/src/routes/agents/getMemory.ts b/src/routes/agents/getMemory.ts index 2dfeef8..5768ca8 100644 --- a/src/routes/agents/getMemory.ts +++ b/src/routes/agents/getMemory.ts @@ -18,14 +18,14 @@ export default router.post( const rows = await u .db("memories") .where({ isolationKey, type: "message" }) - .orderBy("createdAt", "asc") - .select("id", "content", "createdAt"); + .orderBy("createTime", "asc") + .select("id", "content", "createTime"); const history = rows.map((row) => ({ id: row.id, role: "user", content: [{ type: "text", status: "complete", data: row.content }], - createdAt: row.createdAt, + createTime: row.createTime, })); res.status(200).send(success({ history })); diff --git a/src/routes/project/delProject.ts b/src/routes/project/delProject.ts index 4acd5bf..c80c1fa 100644 --- a/src/routes/project/delProject.ts +++ b/src/routes/project/delProject.ts @@ -26,7 +26,7 @@ export default router.post( await u.db("o_project").where("id", id).delete(); await u.db("o_novel").where("projectId", id).delete(); await u.db("o_outline").where("projectId", id).delete(); - await u.db("o_myTasks").where("projectId", id).delete(); + await u.db("o_tasks").where("projectId", id).delete(); await u.db("o_script").where("projectId", id).delete(); await u.db("o_assets").where("projectId", id).delete(); @@ -45,8 +45,6 @@ export default router.post( await u.db("o_video").whereIn("scriptId", scriptIds).delete(); - await u.db("o_chatHistory").where("projectId", id).delete(); - try { await u.oss.deleteDirectory(`${id}/`); console.log(`项目 ${id} 的OSS文件夹删除成功`); diff --git a/src/routes/task/getMyTaskApi.ts b/src/routes/task/getMyTaskApi.ts index eeb68f4..ea9c94c 100644 --- a/src/routes/task/getMyTaskApi.ts +++ b/src/routes/task/getMyTaskApi.ts @@ -16,27 +16,27 @@ export default router.post( const { taskClass, state, page = 1, limit = 10 }: any = req.body; const offset = (page - 1) * limit; const data = await u - .db("o_myTasks") - .leftJoin("o_project", "o_project.id", "o_myTasks.projectId") + .db("o_tasks") + .leftJoin("o_project", "o_project.id", "o_tasks.projectId") .andWhere((qb) => { if (taskClass) { - qb.andWhere("o_myTasks.taskClass", taskClass); + qb.andWhere("o_tasks.taskClass", taskClass); } if (state) { - qb.andWhere("o_myTasks.state", state); + qb.andWhere("o_tasks.state", state); } }) - .select("o_myTasks.*", "o_project.* ") + .select("o_tasks.*", "o_project.* ") .offset(offset) .limit(limit); const totalQuery = (await u - .db("o_myTasks") + .db("o_tasks") .andWhere((qb) => { if (taskClass) { - qb.andWhere("o_myTasks.taskClass", taskClass); + qb.andWhere("o_tasks.taskClass", taskClass); } if (state) { - qb.andWhere("o_myTasks.state", state); + qb.andWhere("o_tasks.state", state); } }) .count("* as total") diff --git a/src/routes/task/getTaskCategories.ts b/src/routes/task/getTaskCategories.ts index 3e97170..cb60760 100644 --- a/src/routes/task/getTaskCategories.ts +++ b/src/routes/task/getTaskCategories.ts @@ -11,7 +11,7 @@ export default router.post( projectId: z.number(), }), async (req, res) => { - const data = await u.db("o_myTasks").where("projectId", req.body.projectId).select("taskClass").groupBy("taskClass"); + const data = await u.db("o_tasks").where("projectId", req.body.projectId).select("taskClass").groupBy("taskClass"); res.status(200).send(success(data)); }, ); diff --git a/src/routes/task/taskDetails.ts b/src/routes/task/taskDetails.ts index b84d3f1..3d9a38b 100644 --- a/src/routes/task/taskDetails.ts +++ b/src/routes/task/taskDetails.ts @@ -12,7 +12,7 @@ export default router.post( }), async (req, res) => { const { taskId } = req.body; - const data = await u.db("o_myTasks").where("id", taskId).select("*").first(); + const data = await u.db("o_tasks").where("id", taskId).select("*").first(); res.status(200).send(success(data)); } ); diff --git a/src/types/database.d.ts b/src/types/database.d.ts index ddd1ec9..ffaa589 100644 --- a/src/types/database.d.ts +++ b/src/types/database.d.ts @@ -1,4 +1,4 @@ -// @db-hash ad26ece2cf8002d48518ba2b8cd908f8 +// @db-hash 2f9e6a9e9145cead00652858cafb9159 //该文件由脚本自动生成,请勿手动修改 export interface memories { @@ -58,6 +58,11 @@ export interface o_eventChapter { 'id'?: number; 'novelId'?: number | null; } +export interface o_flowData { + 'createTime'?: number | null; + 'id'?: number; + 'name'?: string | null; +} export interface o_image { 'assetsId'?: number | null; 'filePath'?: string | null; @@ -166,6 +171,17 @@ export interface o_storyboardScript { 'scriptId'?: number | null; 'storyboardId'?: number | null; } +export interface o_tasks { + '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_user { 'id'?: number; 'name'?: string | null; @@ -223,6 +239,7 @@ export interface DB { "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; @@ -238,6 +255,7 @@ export interface DB { "o_skills": o_skills; "o_storyboard": o_storyboard; "o_storyboardScript": o_storyboardScript; + "o_tasks": o_tasks; "o_user": o_user; "o_vendorConfig": o_vendorConfig; "o_video": o_video; diff --git a/src/utils/agent/memory.ts b/src/utils/agent/memory.ts index 4e3eab2..e0b6458 100644 --- a/src/utils/agent/memory.ts +++ b/src/utils/agent/memory.ts @@ -58,7 +58,6 @@ class Memory { async add( role: string = "user",content: string) { const id = uuidv4(); const embedding = await getEmbedding(content); - const now = Date.now(); const isolationKey = this.isolationKey; await u.db("memories").insert({ @@ -70,11 +69,11 @@ class Memory { embedding: JSON.stringify(embedding), relatedMessageIds: null, summarized: 0, - createdAt: now, + createTime: Date.now(), } as any); // 检查未总结消息数量 - const unsummarized = await u.db("memories").where({ isolationKey, type: "message", summarized: 0 }).orderBy("createdAt", "asc"); + const unsummarized = await u.db("memories").where({ isolationKey, type: "message", summarized: 0 }).orderBy("createTime", "asc"); if (unsummarized.length >= messagesPerSummary) { const batch = unsummarized.slice(0, messagesPerSummary); @@ -93,7 +92,7 @@ class Memory { embedding: JSON.stringify(summaryEmbedding), relatedMessageIds: JSON.stringify(batchIds), summarized: 0, - createdAt: Date.now(), + createTime: Date.now(), }); // 标记已总结 @@ -107,12 +106,12 @@ class Memory { const shortTerm = await u .db("memories") .where({ isolationKey, type: "message", summarized: 0 }) - .orderBy("createdAt", "desc") + .orderBy("createTime", "desc") .limit(shortTermLimit); shortTerm.reverse(); // 最旧在前 // summaries: 最近的 summary - const summaries = await u.db("memories").where({ isolationKey, type: "summary" }).orderBy("createdAt", "desc").limit(summaryLimit); + const summaries = await u.db("memories").where({ isolationKey, type: "summary" }).orderBy("createTime", "desc").limit(summaryLimit); summaries.reverse(); // rag: 向量搜索所有 messages @@ -121,12 +120,12 @@ class Memory { const ragResults = vectorSearch(allMessages, queryEmbedding, ragLimit); return { - shortTerm: shortTerm.map((m: any) => ({ id: m.id, role: m.role, content: m.content, createdAt: m.createdAt })), + shortTerm: shortTerm.map((m: any) => ({ id: m.id, role: m.role, content: m.content, createTime: m.createTime })), summaries: summaries.map((s) => ({ id: s.id, content: s.content, relatedMessageIds: JSON.parse(s.relatedMessageIds || "[]"), - createdAt: s.createdAt, + createTime: s.createTime, })), rag: ragResults.map((r) => ({ id: r.id, content: r.content, similarity: r.similarity })), }; @@ -155,9 +154,9 @@ class Memory { if (messageIds.length === 0) return []; - const messages = await u.db("memories").whereIn("id", messageIds).orderBy("createdAt", "asc"); + const messages = await u.db("memories").whereIn("id", messageIds).orderBy("createTime", "asc"); - return messages.map((m) => ({ id: m.id, content: m.content, createdAt: m.createdAt })); + return messages.map((m) => ({ id: m.id, content: m.content, createTime: m.createTime })); } getTools() { diff --git a/src/utils/taskRecord.ts b/src/utils/taskRecord.ts index 9aa6d10..a097ab0 100644 --- a/src/utils/taskRecord.ts +++ b/src/utils/taskRecord.ts @@ -38,7 +38,7 @@ export default async function taskRecord( } } - const [id] = await db("o_myTasks").insert({ + const [id] = await db("o_tasks").insert({ projectId, taskClass, relatedObjects: opteorContent, @@ -50,7 +50,7 @@ export default async function taskRecord( /** 任务成功时调用 done(1),失败时调用 done(-1, '原因') */ return async function done(state: 1 | -1, reason?: string) { - await db("o_myTasks") + await db("o_tasks") .where("id", id) .update({ state: taskStateMap[state],