From 696f0f61159fc9fc0b2a8619993a9bba5842d8e5 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: Thu, 26 Mar 2026 15:47:15 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E6=B8=85=E7=A9=BA=E8=AE=B0?= =?UTF-8?q?=E5=BF=86=E7=BC=BA=E5=A4=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- data/skills/references/cooke.md | 77 ------------------- src/lib/initDB.ts | 2 +- src/router.ts | 76 +++++++++--------- .../setting/memoryConfig/delAllMemory.ts | 9 +++ .../setting/skillManagement/getSkillList.ts | 11 ++- .../setting/skillManagement/scanSkills.ts | 34 ++++---- .../setting/skillManagement/updateSkill.ts | 9 +++ src/types/database.d.ts | 3 +- src/utils/vm.ts | 5 -- 9 files changed, 84 insertions(+), 142 deletions(-) delete mode 100644 data/skills/references/cooke.md create mode 100644 src/routes/setting/memoryConfig/delAllMemory.ts diff --git a/data/skills/references/cooke.md b/data/skills/references/cooke.md deleted file mode 100644 index 712bc09..0000000 --- a/data/skills/references/cooke.md +++ /dev/null @@ -1,77 +0,0 @@ -# 烤龙肉的做法 - -## 前言 - -龙肉,作为幻想世界中最珍贵的食材之一,其烹饪方法自古以来就是冒险者和宫廷厨师们追求的终极秘技。以下是一份经典的烤龙肉食谱。 - ---- - -## 食材准备 - -| 食材 | 用量 | 备注 | -|------|------|------| -| 龙肉(里脊或腿肉) | 2公斤 | 需提前放血处理 | -| 龙息椒粉 | 2大勺 | 普通辣椒粉可替代 | -| 凤凰蛋黄 | 3个 | 鸡蛋黄可替代 | -| 精灵橄榄油 | 100毫升 | 特级初榨橄榄油可替代 | -| 矮人黑盐 | 适量 | 海盐可替代 | -| 迷迭香、百里香 | 各一把 | 新鲜为佳 | -| 蒜头 | 8瓣 | 拍碎 | -| 蜂蜜 | 3大勺 | 用于表面刷酱 | - ---- - -## 烹饪步骤 - -### 第一步:腌制龙肉(需提前一天) - -1. 将龙肉洗净,用厨房纸巾吸干表面水分 -2. 用锋利的刀在肉面划几道深约1厘米的斜纹,便于入味 -3. 将蛋黄、橄榄油、龙息椒粉、黑盐混合,调成腌料 -4. 均匀涂抹在龙肉表面,放入密封容器 -5. 冷藏腌制12-24小时 - -### 第二步:准备香草束 - -1. 将迷迭香、百里香捆扎成束 -2. 蒜瓣拍碎备用 -3. 准备好蜂蜜刷酱 - -### 第三步:烤制 - -1. **预热烤炉**:将烤炉预热至220°C(若使用龙焰烤炉,调至"青龙"档位) - -2. **初次高温烤制**: - - 将腌制好的龙肉放入烤盘 - - 铺上香草束和蒜瓣 - - 220°C烤制20分钟,封住肉汁 - -3. **转中温慢烤**: - - 温度降至160°C - - 每隔20分钟翻面一次,并刷上蜂蜜 - - 继续烤制约1.5-2小时(视肉块大小调整) - -4. **检验熟度**: - - 用探针温度计测量中心温度达65°C为五分熟 - - 达75°C为全熟 - - 龙肉建议七分熟(约70°C),口感最佳 - -### 第四步:静置与切片 - -1. 出炉后用锡纸包裹,静置15分钟 -2. 逆着纹理切成1厘米厚的片状 -3. 摆盘,淋上烤盘中的肉汁 - ---- - -## 小贴士 - -- ⚠️ **安全提示**:处理龙肉时请佩戴防火手套,残余龙息可能引发灼伤 -- 🍷 **搭配推荐**:建议搭配精灵白葡萄酒或矮人麦芽啤酒 -- 🔥 若龙肉带有冰属性(如霜龙),烤制时间需延长30% - ---- - -## 成品效果 - -外皮金黄酥脆,内部肉质鲜嫩多汁,带有独特的硫磺香气与蜂蜜的甜润,回味中隐约有龙息的微辣感。 \ No newline at end of file diff --git a/src/lib/initDB.ts b/src/lib/initDB.ts index 530d42b..b6c3863 100644 --- a/src/lib/initDB.ts +++ b/src/lib/initDB.ts @@ -443,7 +443,7 @@ export default async (knex: Knex, forceInit: boolean = false): Promise => table.text("type").notNullable(); // "main" | "references" table.integer("createTime").notNullable(); table.integer("updateTime").notNullable(); - table.integer("state").notNullable(); // 1正常,0正在生成description,-1description为空。-2归属为空,-3md5变动 + table.integer("state").notNullable(); // 1正常,0正在生成description,-1description为空。-2归属为空,-3md5变动,-4文件不存在 table.primary(["id"]); }, initData: async (knex) => { diff --git a/src/router.ts b/src/router.ts index 9026722..9556805 100644 --- a/src/router.ts +++ b/src/router.ts @@ -1,4 +1,4 @@ -// @routes-hash 7cec68ede825a3753ef93dc3bab8f7ad +// @routes-hash fd1b3ec2552be041f1b6e9582eb842b6 import { Express } from "express"; import route1 from "./routes/agents/clearMemory"; @@ -77,24 +77,25 @@ import route73 from "./routes/setting/fileManagement/openFolder"; import route74 from "./routes/setting/getTextModel"; import route75 from "./routes/setting/loginConfig/getUser"; import route76 from "./routes/setting/loginConfig/updateUserPwd"; -import route77 from "./routes/setting/memoryConfig/getMemory"; -import route78 from "./routes/setting/memoryConfig/sureMemory"; -import route79 from "./routes/setting/skillManagement/addSkill"; -import route80 from "./routes/setting/skillManagement/deleteSkill"; -import route81 from "./routes/setting/skillManagement/embeddingSkill"; -import route82 from "./routes/setting/skillManagement/generateDescription"; -import route83 from "./routes/setting/skillManagement/getSkillList"; -import route84 from "./routes/setting/skillManagement/scanSkills"; -import route85 from "./routes/setting/skillManagement/updateSkill"; -import route86 from "./routes/setting/vendorConfig/addVendor"; -import route87 from "./routes/setting/vendorConfig/deleteVendor"; -import route88 from "./routes/setting/vendorConfig/getVendorList"; -import route89 from "./routes/setting/vendorConfig/modelTest"; -import route90 from "./routes/setting/vendorConfig/updateVendor"; -import route91 from "./routes/task/getTaskApi"; -import route92 from "./routes/task/getTaskCategories"; -import route93 from "./routes/task/taskDetails"; -import route94 from "./routes/test/test"; +import route77 from "./routes/setting/memoryConfig/delAllMemory"; +import route78 from "./routes/setting/memoryConfig/getMemory"; +import route79 from "./routes/setting/memoryConfig/sureMemory"; +import route80 from "./routes/setting/skillManagement/addSkill"; +import route81 from "./routes/setting/skillManagement/deleteSkill"; +import route82 from "./routes/setting/skillManagement/embeddingSkill"; +import route83 from "./routes/setting/skillManagement/generateDescription"; +import route84 from "./routes/setting/skillManagement/getSkillList"; +import route85 from "./routes/setting/skillManagement/scanSkills"; +import route86 from "./routes/setting/skillManagement/updateSkill"; +import route87 from "./routes/setting/vendorConfig/addVendor"; +import route88 from "./routes/setting/vendorConfig/deleteVendor"; +import route89 from "./routes/setting/vendorConfig/getVendorList"; +import route90 from "./routes/setting/vendorConfig/modelTest"; +import route91 from "./routes/setting/vendorConfig/updateVendor"; +import route92 from "./routes/task/getTaskApi"; +import route93 from "./routes/task/getTaskCategories"; +import route94 from "./routes/task/taskDetails"; +import route95 from "./routes/test/test"; export default async (app: Express) => { app.use("/api/agents/clearMemory", route1); @@ -173,22 +174,23 @@ export default async (app: Express) => { app.use("/api/setting/getTextModel", route74); app.use("/api/setting/loginConfig/getUser", route75); app.use("/api/setting/loginConfig/updateUserPwd", route76); - app.use("/api/setting/memoryConfig/getMemory", route77); - app.use("/api/setting/memoryConfig/sureMemory", route78); - app.use("/api/setting/skillManagement/addSkill", route79); - app.use("/api/setting/skillManagement/deleteSkill", route80); - app.use("/api/setting/skillManagement/embeddingSkill", route81); - app.use("/api/setting/skillManagement/generateDescription", route82); - app.use("/api/setting/skillManagement/getSkillList", route83); - app.use("/api/setting/skillManagement/scanSkills", route84); - app.use("/api/setting/skillManagement/updateSkill", route85); - app.use("/api/setting/vendorConfig/addVendor", route86); - app.use("/api/setting/vendorConfig/deleteVendor", route87); - app.use("/api/setting/vendorConfig/getVendorList", route88); - app.use("/api/setting/vendorConfig/modelTest", route89); - app.use("/api/setting/vendorConfig/updateVendor", route90); - app.use("/api/task/getTaskApi", route91); - app.use("/api/task/getTaskCategories", route92); - app.use("/api/task/taskDetails", route93); - app.use("/api/test/test", route94); + app.use("/api/setting/memoryConfig/delAllMemory", route77); + app.use("/api/setting/memoryConfig/getMemory", route78); + app.use("/api/setting/memoryConfig/sureMemory", route79); + app.use("/api/setting/skillManagement/addSkill", route80); + app.use("/api/setting/skillManagement/deleteSkill", route81); + app.use("/api/setting/skillManagement/embeddingSkill", route82); + app.use("/api/setting/skillManagement/generateDescription", route83); + app.use("/api/setting/skillManagement/getSkillList", route84); + app.use("/api/setting/skillManagement/scanSkills", route85); + app.use("/api/setting/skillManagement/updateSkill", route86); + app.use("/api/setting/vendorConfig/addVendor", route87); + app.use("/api/setting/vendorConfig/deleteVendor", route88); + app.use("/api/setting/vendorConfig/getVendorList", route89); + app.use("/api/setting/vendorConfig/modelTest", route90); + app.use("/api/setting/vendorConfig/updateVendor", route91); + app.use("/api/task/getTaskApi", route92); + app.use("/api/task/getTaskCategories", route93); + app.use("/api/task/taskDetails", route94); + app.use("/api/test/test", route95); } diff --git a/src/routes/setting/memoryConfig/delAllMemory.ts b/src/routes/setting/memoryConfig/delAllMemory.ts new file mode 100644 index 0000000..5de4f8f --- /dev/null +++ b/src/routes/setting/memoryConfig/delAllMemory.ts @@ -0,0 +1,9 @@ +import express from "express"; +import { error, success } from "@/lib/responseFormat"; +import u from "@/utils"; +const router = express.Router(); + +export default router.post("/", async (req, res) => { + await u.db("memories").del(); + res.status(200).send(success(true)); +}); diff --git a/src/routes/setting/skillManagement/getSkillList.ts b/src/routes/setting/skillManagement/getSkillList.ts index 4dd0cf0..7a19513 100644 --- a/src/routes/setting/skillManagement/getSkillList.ts +++ b/src/routes/setting/skillManagement/getSkillList.ts @@ -51,7 +51,16 @@ export default router.post( }); } - const list = await query.select("*").orderBy("updateTime", "desc").orderBy("type", "desc").limit(limit).offset(offset); + const list = await query + .select("*") + .orderByRaw(` + CASE type WHEN 'main' THEN 1 ELSE 0 END ASC, + CASE WHEN id NOT IN (SELECT skillId FROM o_skillAttribution) THEN 0 ELSE 1 END ASC, + CASE WHEN state = 1 THEN 1 ELSE 0 END ASC, + updateTime DESC + `) + .limit(limit) + .offset(offset); // 查询每个技能的归属 const skillIds = list.map((item: any) => item.id); diff --git a/src/routes/setting/skillManagement/scanSkills.ts b/src/routes/setting/skillManagement/scanSkills.ts index 8208888..32750c0 100644 --- a/src/routes/setting/skillManagement/scanSkills.ts +++ b/src/routes/setting/skillManagement/scanSkills.ts @@ -44,19 +44,19 @@ export default router.post("/", async (req, res) => { let updatedCount = 0; let removedCount = 0; - const scannedIds = new Set(); + const scannedPaths = new Set(); const existingRows = await u.db("o_skillList").whereIn("type", ["main", "references"]).select("id", "md5", "type", "path"); for (const item of scanItems) { - const id = crypto.createHash("md5").update(item.relativePath).digest("hex"); - const name = path.basename(item.entry, ".md"); + scannedPaths.add(item.relativePath); + + const existing = existingRows.find((row: any) => row.path === item.relativePath); const content = await fs.readFile(item.fullPath, "utf-8"); const md5 = crypto.createHash("md5").update(content).digest("hex"); - const existing = existingRows.find((row: any) => row.id === id); - - scannedIds.add(id); if (!existing) { + const id = crypto.createHash("md5").update(item.relativePath).digest("hex"); + const name = path.basename(item.entry, ".md"); await u.db("o_skillList").insert({ id, path: item.relativePath, @@ -70,25 +70,19 @@ export default router.post("/", async (req, res) => { state: -1, }); insertedCount++; - continue; - } - - if (existing.md5 !== md5 || existing.path !== item.relativePath || existing.type !== item.type) { - await u.db("o_skillList").where("id", id).update({ - path: item.relativePath, - name, - md5, - type: item.type, - updateTime: now, - state: -3, - }); + } else { + const updateData: Record = { md5, updateTime: now }; + if (existing.md5 !== md5) { + updateData.state = -3; + } + await u.db("o_skillList").where("id", existing.id).update(updateData); updatedCount++; } } - const removedIds = existingRows.map((row: any) => row.id).filter((id: string) => !scannedIds.has(id)); + const removedIds = existingRows.filter((row: any) => !scannedPaths.has(row.path)).map((row: any) => row.id); if (removedIds.length > 0) { - await u.db("o_skillList").whereIn("id", removedIds).delete(); + await u.db("o_skillList").whereIn("id", removedIds).update({ state: -4, updateTime: now }); removedCount = removedIds.length; } diff --git a/src/routes/setting/skillManagement/updateSkill.ts b/src/routes/setting/skillManagement/updateSkill.ts index e389b24..f47e855 100644 --- a/src/routes/setting/skillManagement/updateSkill.ts +++ b/src/routes/setting/skillManagement/updateSkill.ts @@ -6,6 +6,7 @@ import { validateFields } from "@/middleware/middleware"; import fs from "fs/promises"; import path from "path"; import crypto from "crypto"; +import { getEmbedding } from "@/utils/agent/embedding"; const router = express.Router(); @@ -99,6 +100,14 @@ export default router.post( state: resolveState(finalDescription, finalAttributions), }); + if (finalDescription && !current.embedding) { + const embedding = await getEmbedding(finalDescription); + await u + .db("o_skillList") + .where("id", nextId) + .update({ embedding: JSON.stringify(embedding) }); + } + await u.db("o_skillAttribution").where("skillId", nextId).delete(); if (finalAttributions.length > 0) { await u.db("o_skillAttribution").insert( diff --git a/src/types/database.d.ts b/src/types/database.d.ts index 864c260..70b079c 100644 --- a/src/types/database.d.ts +++ b/src/types/database.d.ts @@ -1,4 +1,4 @@ -// @db-hash f9f1fb9b0fc04331ecf65d34c1e4b6af +// @db-hash d807205fbb27fc5ddb04cae060fb4430 //该文件由脚本自动生成,请勿手动修改 export interface memories { @@ -156,6 +156,7 @@ export interface o_storyboard { 'filePath'?: string | null; 'frameMode'?: string | null; 'id'?: number; + 'index'?: string | null; 'lines'?: string | null; 'mode'?: string | null; 'model'?: string | null; diff --git a/src/utils/vm.ts b/src/utils/vm.ts index dde5021..a8ab519 100644 --- a/src/utils/vm.ts +++ b/src/utils/vm.ts @@ -30,13 +30,8 @@ export default function runCode(code: string) { urlToBase64, mergeImages, pollTask, - - Response, exports, - - fetch, axios, - FormData, }, compiler: "javascript",