diff --git a/src/lib/initDB.ts b/src/lib/initDB.ts index 207f524..21901a2 100644 --- a/src/lib/initDB.ts +++ b/src/lib/initDB.ts @@ -220,6 +220,19 @@ export default async (knex: Knex, forceInit: boolean = false): Promise => ]); }, }, + //模型绑定提示词表 + { + name: "o_modelPrompt", + builder: (table) => { + table.integer("id").notNullable(); + table.string("vendorId"); + table.string("model"); + table.text("prompt"); + table.primary(["id"]); + table.unique(["id"]); + }, + initData: async (knex) => {}, + }, //小说原文表 { name: "o_novel", diff --git a/src/router.ts b/src/router.ts index 2e05c13..6b6e7c3 100644 --- a/src/router.ts +++ b/src/router.ts @@ -1,4 +1,4 @@ -// @routes-hash 0693afa45240a846389e06cf3b11dc91 +// @routes-hash 03f1781a722f0e9e08213aec7ac1c10c import { Express } from "express"; import route1 from "./routes/agents/clearMemory"; @@ -123,28 +123,29 @@ import route119 from "./routes/setting/loginConfig/updateUserPwd"; import route120 from "./routes/setting/memoryConfig/delAllMemory"; import route121 from "./routes/setting/memoryConfig/getMemory"; import route122 from "./routes/setting/memoryConfig/sureMemory"; -import route123 from "./routes/setting/modelMap/getImageAndVideoModel"; -import route124 from "./routes/setting/promptManage/getPrompt"; -import route125 from "./routes/setting/promptManage/updatePrompt"; -import route126 from "./routes/setting/skillManagement/getSkillContent"; -import route127 from "./routes/setting/skillManagement/getSkillList"; -import route128 from "./routes/setting/skillManagement/saveSkillContent"; -import route129 from "./routes/setting/vendorConfig/addVendor"; -import route130 from "./routes/setting/vendorConfig/addVendorModel"; -import route131 from "./routes/setting/vendorConfig/deleteVendor"; -import route132 from "./routes/setting/vendorConfig/delVendorModel"; -import route133 from "./routes/setting/vendorConfig/enableVendor"; -import route134 from "./routes/setting/vendorConfig/getCodeByLink"; -import route135 from "./routes/setting/vendorConfig/getVendorList"; -import route136 from "./routes/setting/vendorConfig/modelTest"; -import route137 from "./routes/setting/vendorConfig/updateCode"; -import route138 from "./routes/setting/vendorConfig/updateVendorInputs"; -import route139 from "./routes/setting/vendorConfig/upVendorModel"; -import route140 from "./routes/task/getProject"; -import route141 from "./routes/task/getTaskApi"; -import route142 from "./routes/task/getTaskCategories"; -import route143 from "./routes/task/taskDetails"; -import route144 from "./routes/test/test"; +import route123 from "./routes/setting/modelMap/bindingPrompt"; +import route124 from "./routes/setting/modelMap/getImageAndVideoModel"; +import route125 from "./routes/setting/promptManage/getPrompt"; +import route126 from "./routes/setting/promptManage/updatePrompt"; +import route127 from "./routes/setting/skillManagement/getSkillContent"; +import route128 from "./routes/setting/skillManagement/getSkillList"; +import route129 from "./routes/setting/skillManagement/saveSkillContent"; +import route130 from "./routes/setting/vendorConfig/addVendor"; +import route131 from "./routes/setting/vendorConfig/addVendorModel"; +import route132 from "./routes/setting/vendorConfig/deleteVendor"; +import route133 from "./routes/setting/vendorConfig/delVendorModel"; +import route134 from "./routes/setting/vendorConfig/enableVendor"; +import route135 from "./routes/setting/vendorConfig/getCodeByLink"; +import route136 from "./routes/setting/vendorConfig/getVendorList"; +import route137 from "./routes/setting/vendorConfig/modelTest"; +import route138 from "./routes/setting/vendorConfig/updateCode"; +import route139 from "./routes/setting/vendorConfig/updateVendorInputs"; +import route140 from "./routes/setting/vendorConfig/upVendorModel"; +import route141 from "./routes/task/getProject"; +import route142 from "./routes/task/getTaskApi"; +import route143 from "./routes/task/getTaskCategories"; +import route144 from "./routes/task/taskDetails"; +import route145 from "./routes/test/test"; export default async (app: Express) => { app.use("/api/agents/clearMemory", route1); @@ -269,26 +270,27 @@ export default async (app: Express) => { app.use("/api/setting/memoryConfig/delAllMemory", route120); app.use("/api/setting/memoryConfig/getMemory", route121); app.use("/api/setting/memoryConfig/sureMemory", route122); - app.use("/api/setting/modelMap/getImageAndVideoModel", route123); - app.use("/api/setting/promptManage/getPrompt", route124); - app.use("/api/setting/promptManage/updatePrompt", route125); - app.use("/api/setting/skillManagement/getSkillContent", route126); - app.use("/api/setting/skillManagement/getSkillList", route127); - app.use("/api/setting/skillManagement/saveSkillContent", route128); - app.use("/api/setting/vendorConfig/addVendor", route129); - app.use("/api/setting/vendorConfig/addVendorModel", route130); - app.use("/api/setting/vendorConfig/deleteVendor", route131); - app.use("/api/setting/vendorConfig/delVendorModel", route132); - app.use("/api/setting/vendorConfig/enableVendor", route133); - app.use("/api/setting/vendorConfig/getCodeByLink", route134); - app.use("/api/setting/vendorConfig/getVendorList", route135); - app.use("/api/setting/vendorConfig/modelTest", route136); - app.use("/api/setting/vendorConfig/updateCode", route137); - app.use("/api/setting/vendorConfig/updateVendorInputs", route138); - app.use("/api/setting/vendorConfig/upVendorModel", route139); - app.use("/api/task/getProject", route140); - app.use("/api/task/getTaskApi", route141); - app.use("/api/task/getTaskCategories", route142); - app.use("/api/task/taskDetails", route143); - app.use("/api/test/test", route144); + app.use("/api/setting/modelMap/bindingPrompt", route123); + app.use("/api/setting/modelMap/getImageAndVideoModel", route124); + app.use("/api/setting/promptManage/getPrompt", route125); + app.use("/api/setting/promptManage/updatePrompt", route126); + app.use("/api/setting/skillManagement/getSkillContent", route127); + app.use("/api/setting/skillManagement/getSkillList", route128); + app.use("/api/setting/skillManagement/saveSkillContent", route129); + app.use("/api/setting/vendorConfig/addVendor", route130); + app.use("/api/setting/vendorConfig/addVendorModel", route131); + app.use("/api/setting/vendorConfig/deleteVendor", route132); + app.use("/api/setting/vendorConfig/delVendorModel", route133); + app.use("/api/setting/vendorConfig/enableVendor", route134); + app.use("/api/setting/vendorConfig/getCodeByLink", route135); + app.use("/api/setting/vendorConfig/getVendorList", route136); + app.use("/api/setting/vendorConfig/modelTest", route137); + app.use("/api/setting/vendorConfig/updateCode", route138); + app.use("/api/setting/vendorConfig/updateVendorInputs", route139); + app.use("/api/setting/vendorConfig/upVendorModel", route140); + app.use("/api/task/getProject", route141); + app.use("/api/task/getTaskApi", route142); + app.use("/api/task/getTaskCategories", route143); + app.use("/api/task/taskDetails", route144); + app.use("/api/test/test", route145); } diff --git a/src/routes/setting/modelMap/bindingPrompt.ts b/src/routes/setting/modelMap/bindingPrompt.ts new file mode 100644 index 0000000..82ba5ea --- /dev/null +++ b/src/routes/setting/modelMap/bindingPrompt.ts @@ -0,0 +1,26 @@ +import express from "express"; +import { error, success } from "@/lib/responseFormat"; +import u from "@/utils"; +import { z } from "zod"; +import { validateFields } from "@/middleware/middleware"; +const router = express.Router(); + +export default router.post( + "/", + validateFields({ + vendorId: z.string(), + model: z.string(), + prompt: z.string(), + }), + async (req, res) => { + const { vendorId, model, prompt } = req.body; + const data = await u.db("o_modelPrompt").where("model", model).andWhere("vendorId", vendorId).select("*").first(); + if (data) { + await u.db("o_modelPrompt").where("model", model).andWhere("vendorId", vendorId).update({ prompt }); + res.status(200).send(success("绑定成功")); + } else { + await u.db("o_modelPrompt").insert({ vendorId, model, prompt }); + res.status(200).send(success("绑定成功")); + } + }, +); diff --git a/src/routes/setting/modelMap/getImageAndVideoModel.ts b/src/routes/setting/modelMap/getImageAndVideoModel.ts index 95f0156..b1c06b7 100644 --- a/src/routes/setting/modelMap/getImageAndVideoModel.ts +++ b/src/routes/setting/modelMap/getImageAndVideoModel.ts @@ -1,38 +1,33 @@ 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(); -export default router.post( - "/", - async (req, res) => { - const dataList = await u.db("o_vendorConfig").select("id").where("enable", 1); - if (!dataList || dataList.length === 0) { - return res.status(404).send({ error: "模型未找到" }); - } - const types = ['image', 'video']; - const modelList = await Promise.all(dataList.map((i) => u.vendor.getModelList(i.id!))); - const result = await Promise.all( - dataList.map(async (data, index) => { - const vendorData = await u.vendor.getVendor(data.id!); - console.log("%c Line:20 🌶 vendorData", "background:#42b983", vendorData); - const models = modelList[index]; - const filtered = - models.filter((item: { type: string }) => types.includes(item.type)); - console.log("%c Line:30 🍺 vendorData.mode", "background:#42b983", vendorData.mode); - - return filtered.map((item: { name: string; modelName: string; type: string }) => ({ - id: data.id, - label: item.name, - value: item.modelName, - type: item.type, - name: vendorData.name, - mode: item.mode - })); - }), - ); - res.status(200).send(success(result.flat())); - }, -); +export default router.post("/", async (req, res) => { + const dataList = await u.db("o_vendorConfig").select("id").where("enable", 1); + if (!dataList || dataList.length === 0) { + return res.status(404).send({ error: "模型未找到" }); + } + const data = await Promise.all( + dataList.map(async (item) => { + const vendor = u.vendor.getVendor(item.id!); + const promptList = await u.db("o_modelPrompt").andWhere("vendorId", vendor.id).select("*"); + const promptMap = new Map(promptList.map((p) => [p.model, p.prompt])); + const models = await u.vendor.getModelList(item.id!); + const filteredModels = models + .filter((m: any) => m.type === "image" || m.type === "video") + .map((m: any) => ({ + name: m.name, + type: m.type as "image" | "video", + model: m.modelName, + prompt: promptMap.get(m.modelName) ?? "", + })); + return { + id: item.id, + name: vendor.name, + promptList: filteredModels, + }; + }), + ); + res.status(200).send(success(data)); +}); diff --git a/src/types/database.d.ts b/src/types/database.d.ts index 551db81..5f47e0b 100644 --- a/src/types/database.d.ts +++ b/src/types/database.d.ts @@ -1,4 +1,4 @@ -// @db-hash 9248d7bcfe0a1bc57e5b9bc33d8c7d83 +// @db-hash 630ea42aa4b21853ca104d1fbdb87706 //该文件由脚本自动生成,请勿手动修改 export interface memories { @@ -88,6 +88,12 @@ export interface o_imageFlow { 'flowData': string; 'id'?: number; } +export interface o_modelPrompt { + 'id'?: number; + 'model'?: string | null; + 'prompt'?: string | null; + 'vendorId'?: string | null; +} export interface o_novel { 'chapter'?: string | null; 'chapterData'?: string | null; @@ -240,6 +246,7 @@ export interface DB { "o_eventChapter": o_eventChapter; "o_image": o_image; "o_imageFlow": o_imageFlow; + "o_modelPrompt": o_modelPrompt; "o_novel": o_novel; "o_outline": o_outline; "o_outlineNovel": o_outlineNovel;