# Conflicts:
#	src/router.ts
This commit is contained in:
zhishi 2026-03-27 17:05:47 +08:00
commit ab0db069b5
17 changed files with 1475 additions and 1779 deletions

File diff suppressed because one or more lines are too long

View File

@ -91,5 +91,10 @@
"nodemon": "^3.1.11", "nodemon": "^3.1.11",
"tsx": "^4.21.0", "tsx": "^4.21.0",
"typescript": "^5.9.3" "typescript": "^5.9.3"
},
"overrides": {
"@rmp135/sql-ts": {
"better-sqlite3": "^12.8.0"
}
} }
} }

View File

@ -164,6 +164,10 @@ app.whenReady().then(async () => {
windowismaximized: () => ({ windowismaximized: () => ({
maximized: mainWindow?.isMaximized() ?? false, maximized: mainWindow?.isMaximized() ?? false,
}), }),
openDevTool: () => {
mainWindow?.webContents.openDevTools();
return { ok: true };
},
}; };
const handler = handlers[pathname]; const handler = handlers[pathname];
const responseData = handler ? handler() : { error: "未知接口" }; const responseData = handler ? handler() : { error: "未知接口" };

View File

@ -159,6 +159,10 @@ export default async (knex: Knex, forceInit: boolean = false): Promise<void> =>
key: "modelDtype", key: "modelDtype",
value: "fp16", value: "fp16",
}, },
{
key: "switchAiDevTool",
value: "0",
},
]); ]);
}, },
}, },
@ -371,26 +375,10 @@ export default async (knex: Knex, forceInit: boolean = false): Promise<void> =>
{ {
name: "o_vendorConfig", name: "o_vendorConfig",
builder: (table) => { builder: (table) => {
table.integer("id").notNullable(); table.string("id").notNullable();
table.text("author");
table.text("description");
table.text("name"); 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"]);
},
},
//供应商配置表
{
name: "o_vendorConfig",
builder: (table) => {
table.integer("id").notNullable();
table.text("name");
table.text("version");
table.text("icon"); table.text("icon");
table.text("inputs"); // 输入项配置 JSON table.text("inputs"); // 输入项配置 JSON
table.text("inputValues"); // 输入项值 JSON table.text("inputValues"); // 输入项值 JSON

View File

@ -1,4 +1,4 @@
// @routes-hash 9559cc3a8cb0291f04970e9ba299265f // @routes-hash 57463134da0d81d65d10c163ee8a2b26
import { Express } from "express"; import { Express } from "express";
import route1 from "./routes/agents/clearMemory"; import route1 from "./routes/agents/clearMemory";
@ -76,30 +76,32 @@ import route72 from "./routes/setting/agentDeploy/agentSetKey";
import route73 from "./routes/setting/agentDeploy/deployAgentModel"; import route73 from "./routes/setting/agentDeploy/deployAgentModel";
import route74 from "./routes/setting/agentDeploy/getAgentDeploy"; import route74 from "./routes/setting/agentDeploy/getAgentDeploy";
import route75 from "./routes/setting/dbConfig/clearData"; import route75 from "./routes/setting/dbConfig/clearData";
import route76 from "./routes/setting/fileManagement/openFolder"; import route76 from "./routes/setting/dev/getSwitchAiDevTool";
import route77 from "./routes/setting/getTextModel"; import route77 from "./routes/setting/dev/updateSwitchAiDevTool";
import route78 from "./routes/setting/loginConfig/getUser"; import route78 from "./routes/setting/fileManagement/openFolder";
import route79 from "./routes/setting/loginConfig/updateUserPwd"; import route79 from "./routes/setting/getTextModel";
import route80 from "./routes/setting/memoryConfig/delAllMemory"; import route80 from "./routes/setting/loginConfig/getUser";
import route81 from "./routes/setting/memoryConfig/getMemory"; import route81 from "./routes/setting/loginConfig/updateUserPwd";
import route82 from "./routes/setting/memoryConfig/sureMemory"; import route82 from "./routes/setting/memoryConfig/delAllMemory";
import route83 from "./routes/setting/skillManagement/addSkill"; import route83 from "./routes/setting/memoryConfig/getMemory";
import route84 from "./routes/setting/skillManagement/deleteSkill"; import route84 from "./routes/setting/memoryConfig/sureMemory";
import route85 from "./routes/setting/skillManagement/embeddingSkill"; import route85 from "./routes/setting/skillManagement/addSkill";
import route86 from "./routes/setting/skillManagement/generateDescription"; import route86 from "./routes/setting/skillManagement/deleteSkill";
import route87 from "./routes/setting/skillManagement/getSkillList"; import route87 from "./routes/setting/skillManagement/embeddingSkill";
import route88 from "./routes/setting/skillManagement/scanSkills"; import route88 from "./routes/setting/skillManagement/generateDescription";
import route89 from "./routes/setting/skillManagement/updateSkill"; import route89 from "./routes/setting/skillManagement/getSkillList";
import route90 from "./routes/setting/vendorConfig/addVendor"; import route90 from "./routes/setting/skillManagement/scanSkills";
import route91 from "./routes/setting/vendorConfig/deleteVendor"; import route91 from "./routes/setting/skillManagement/updateSkill";
import route92 from "./routes/setting/vendorConfig/getVendorList"; import route92 from "./routes/setting/vendorConfig/addVendor";
import route93 from "./routes/setting/vendorConfig/modelTest"; import route93 from "./routes/setting/vendorConfig/deleteVendor";
import route94 from "./routes/setting/vendorConfig/updateVendor"; import route94 from "./routes/setting/vendorConfig/getVendorList";
import route95 from "./routes/task/getProject"; import route95 from "./routes/setting/vendorConfig/modelTest";
import route96 from "./routes/task/getTaskApi"; import route96 from "./routes/setting/vendorConfig/updateVendor";
import route97 from "./routes/task/getTaskCategories"; import route97 from "./routes/task/getProject";
import route98 from "./routes/task/taskDetails"; import route98 from "./routes/task/getTaskApi";
import route99 from "./routes/test/test"; import route99 from "./routes/task/getTaskCategories";
import route100 from "./routes/task/taskDetails";
import route101 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);
@ -177,28 +179,30 @@ export default async (app: Express) => {
app.use("/api/setting/agentDeploy/deployAgentModel", route73); app.use("/api/setting/agentDeploy/deployAgentModel", route73);
app.use("/api/setting/agentDeploy/getAgentDeploy", route74); app.use("/api/setting/agentDeploy/getAgentDeploy", route74);
app.use("/api/setting/dbConfig/clearData", route75); app.use("/api/setting/dbConfig/clearData", route75);
app.use("/api/setting/fileManagement/openFolder", route76); app.use("/api/setting/dev/getSwitchAiDevTool", route76);
app.use("/api/setting/getTextModel", route77); app.use("/api/setting/dev/updateSwitchAiDevTool", route77);
app.use("/api/setting/loginConfig/getUser", route78); app.use("/api/setting/fileManagement/openFolder", route78);
app.use("/api/setting/loginConfig/updateUserPwd", route79); app.use("/api/setting/getTextModel", route79);
app.use("/api/setting/memoryConfig/delAllMemory", route80); app.use("/api/setting/loginConfig/getUser", route80);
app.use("/api/setting/memoryConfig/getMemory", route81); app.use("/api/setting/loginConfig/updateUserPwd", route81);
app.use("/api/setting/memoryConfig/sureMemory", route82); app.use("/api/setting/memoryConfig/delAllMemory", route82);
app.use("/api/setting/skillManagement/addSkill", route83); app.use("/api/setting/memoryConfig/getMemory", route83);
app.use("/api/setting/skillManagement/deleteSkill", route84); app.use("/api/setting/memoryConfig/sureMemory", route84);
app.use("/api/setting/skillManagement/embeddingSkill", route85); app.use("/api/setting/skillManagement/addSkill", route85);
app.use("/api/setting/skillManagement/generateDescription", route86); app.use("/api/setting/skillManagement/deleteSkill", route86);
app.use("/api/setting/skillManagement/getSkillList", route87); app.use("/api/setting/skillManagement/embeddingSkill", route87);
app.use("/api/setting/skillManagement/scanSkills", route88); app.use("/api/setting/skillManagement/generateDescription", route88);
app.use("/api/setting/skillManagement/updateSkill", route89); app.use("/api/setting/skillManagement/getSkillList", route89);
app.use("/api/setting/vendorConfig/addVendor", route90); app.use("/api/setting/skillManagement/scanSkills", route90);
app.use("/api/setting/vendorConfig/deleteVendor", route91); app.use("/api/setting/skillManagement/updateSkill", route91);
app.use("/api/setting/vendorConfig/getVendorList", route92); app.use("/api/setting/vendorConfig/addVendor", route92);
app.use("/api/setting/vendorConfig/modelTest", route93); app.use("/api/setting/vendorConfig/deleteVendor", route93);
app.use("/api/setting/vendorConfig/updateVendor", route94); app.use("/api/setting/vendorConfig/getVendorList", route94);
app.use("/api/task/getProject", route95); app.use("/api/setting/vendorConfig/modelTest", route95);
app.use("/api/task/getTaskApi", route96); app.use("/api/setting/vendorConfig/updateVendor", route96);
app.use("/api/task/getTaskCategories", route97); app.use("/api/task/getProject", route97);
app.use("/api/task/taskDetails", route98); app.use("/api/task/getTaskApi", route98);
app.use("/api/test/test", route99); app.use("/api/task/getTaskCategories", route99);
app.use("/api/task/taskDetails", route100);
app.use("/api/test/test", route101);
} }

View File

@ -88,7 +88,6 @@ export default router.post(
} else { } else {
try { try {
const storyboardData = await u.db("o_storyboard").where("scriptId", episodesId); const storyboardData = await u.db("o_storyboard").where("scriptId", episodesId);
console.log("%c Line:90 🍡 storyboardData", "background:#ed9ec7", storyboardData.length);
await Promise.all( await Promise.all(
storyboardData.map(async (i) => { storyboardData.map(async (i) => {
if (i.filePath) { if (i.filePath) {
@ -165,6 +164,7 @@ export default router.post(
const buildStoryboardItem = (i: (typeof storyboardData)[number], existing: any = {}) => ({ const buildStoryboardItem = (i: (typeof storyboardData)[number], existing: any = {}) => ({
...existing, ...existing,
id: i.id, id: i.id,
index: i.index,
title: i.title, title: i.title,
description: i.description, description: i.description,
camera: i.camera, camera: i.camera,
@ -199,8 +199,7 @@ export default router.post(
orderedStoryboard.push(buildStoryboardItem(i)); orderedStoryboard.push(buildStoryboardItem(i));
} }
}); });
flowData.storyboard = orderedStoryboard.sort((a, b) => (a.index ?? 0) - (b.index ?? 0));
flowData.storyboard = orderedStoryboard;
res.status(200).send(success(flowData)); res.status(200).send(success(flowData));
} catch (err) { } catch (err) {
res.status(400).send(error()); res.status(400).send(error());

View File

@ -13,7 +13,7 @@ export default router.post(
const { scriptId } = req.body; const { scriptId } = req.body;
//查询分镜数据 //查询分镜数据
const storyboards = await u.db("o_storyboard").where("o_storyboard.scriptId", scriptId).select("*").orderBy("o_storyboard.createTime", "asc"); const storyboards = await u.db("o_storyboard").where("o_storyboard.scriptId", scriptId).select("*").orderBy("index", "asc");
const storyboardsList = await Promise.all( const storyboardsList = await Promise.all(
storyboards.map(async (item) => { storyboards.map(async (item) => {

View File

@ -12,7 +12,7 @@ export default router.post(
}), }),
async (req, res) => { async (req, res) => {
const { scriptId } = req.body; const { scriptId } = req.body;
const storyboardData = await u.db("o_storyboard").where({ scriptId }); const storyboardData = await u.db("o_storyboard").where({ scriptId }).orderBy("index", "asc");
const data = await Promise.all( const data = await Promise.all(
storyboardData.map(async (i) => { storyboardData.map(async (i) => {
return { return {
@ -83,7 +83,6 @@ export default router.post(
}; };
}), }),
); );
res.status(200).send(success(result)); res.status(200).send(success(result));
}, },
); );

View File

@ -0,0 +1,11 @@
import express from "express";
import { success, error } from "@/lib/responseFormat";
import u from "@/utils";
import initDB from "@/lib/initDB";
const router = express.Router();
export default router.get("/", async (req, res) => {
const switchAiDevTool = await u.db("o_setting").where("key", "switchAiDevTool").first();
res.status(200).send(success(switchAiDevTool?.value || "0"));
});

View File

@ -0,0 +1,20 @@
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(
"/",
validateFields({
switchAiDevTool: z.string(),
}),
async (req, res) => {
const { switchAiDevTool } = req.body;
await u.db("o_setting").where("key", "switchAiDevTool").update({
value: switchAiDevTool,
});
res.status(200).send(success("保存设置成功"));
},
);

View File

@ -8,9 +8,11 @@ import { transform } from "sucrase";
const router = express.Router(); const router = express.Router();
const vendorConfigSchema = z.object({ const vendorConfigSchema = z.object({
version: z.number(), id: z.string(),
icon: z.string().optional(), author: z.string(),
description: z.string().optional(),
name: z.string(), name: z.string(),
icon: z.string().optional(),
inputs: z.array( inputs: z.array(
z.object({ z.object({
key: z.string(), key: z.string(),
@ -41,6 +43,7 @@ const vendorConfigSchema = z.object({
modelName: z.string(), modelName: z.string(),
type: z.literal("video"), type: z.literal("video"),
mode: z.array( mode: z.array(
z.union([
z.enum([ z.enum([
"singleImage", "singleImage",
"multiImage", "multiImage",
@ -52,6 +55,8 @@ const vendorConfigSchema = z.object({
"audioReference", "audioReference",
"videoReference", "videoReference",
]), ]),
z.array(z.enum(["video", "image", "audio", "text"])),
]),
), ),
audio: z.union([z.literal("optional"), z.boolean()]), audio: z.union([z.literal("optional"), z.boolean()]),
durationResolutionMap: z.array( durationResolutionMap: z.array(
@ -87,12 +92,14 @@ export default router.post(
return res.status(400).send(error(`vendor配置校验失败: ${errorMsg}`)); return res.status(400).send(error(`vendor配置校验失败: ${errorMsg}`));
} }
await u.db("o_vendorConfig").insert({ await u.db("o_vendorConfig").insert({
id: vendor.id,
author: vendor.author,
description: vendor.description || "",
name: vendor.name, name: vendor.name,
version: vendor.version.toString(),
icon: vendor.icon || "", icon: vendor.icon || "",
inputs: JSON.stringify(vendor.inputs), inputs: JSON.stringify(vendor.inputs ?? []),
inputValues: JSON.stringify(vendor.inputValues), inputValues: JSON.stringify(vendor.inputValues ?? {}),
models: JSON.stringify(vendor.models), models: JSON.stringify(vendor.models ?? []),
code: tsCode, code: tsCode,
createTime: Date.now(), createTime: Date.now(),
}); });

View File

@ -7,7 +7,7 @@ const router = express.Router();
export default router.post( export default router.post(
"/", "/",
validateFields({ validateFields({
id: z.number(), id: z.string(),
}), }),
async (req, res) => { async (req, res) => {
const { id } = req.body; const { id } = req.body;

View File

@ -11,12 +11,11 @@ export default router.post(
"/", "/",
validateFields({ validateFields({
modelName: z.string(), modelName: z.string(),
apiKey: z.string(),
type: z.enum(["text", "video", "image"]), type: z.enum(["text", "video", "image"]),
id: z.number(), id: z.string(),
}), }),
async (req, res) => { async (req, res) => {
const { modelName, apiKey, type, id } = req.body; const { modelName, type, id } = req.body;
try { try {
const requestFn: Record<string, { fnName: string; modelData?: any }> = { const requestFn: Record<string, { fnName: string; modelData?: any }> = {
@ -69,12 +68,16 @@ export default router.post(
}); });
if (type == "text") { if (type == "text") {
const resTextData = await u.Ai.Text(`${id}:${modelName}`).invoke({ const { textStream } = await u.Ai.Text(`${id}:${modelName}`).stream({
prompt: "请调用工具获取火星的天气,并回答我多少气温", prompt: "请调用工具获取火星的天气,并回答我多少气温",
tools: { getWeatherTool }, tools: { getWeatherTool },
}); });
let fullResponse = "";
res.status(200).send(success(resTextData.text)); for await (const chunk of textStream) {
fullResponse += chunk;
}
console.log("%c Line:78 🥝 fullResponse", "background:#ea7e5c", fullResponse);
res.status(200).send(success(fullResponse));
} else { } else {
const aiTypeFn = { const aiTypeFn = {
image: "Image", image: "Image",

View File

@ -7,9 +7,11 @@ import { transform } from "sucrase";
const router = express.Router(); const router = express.Router();
const vendorConfigSchema = z.object({ const vendorConfigSchema = z.object({
version: z.number(), id: z.string(),
icon: z.string().optional(), author: z.string(),
description: z.string().optional(),
name: z.string(), name: z.string(),
icon: z.string().optional(),
inputs: z.array( inputs: z.array(
z.object({ z.object({
key: z.string(), key: z.string(),
@ -41,8 +43,18 @@ const vendorConfigSchema = z.object({
type: z.literal("video"), type: z.literal("video"),
mode: z.array( mode: z.array(
z.union([ z.union([
z.enum(["singleImage", "multiImage", "gridImage", "startEndRequired", "endFrameOptional", "startFrameOptional", "text"]), z.enum([
z.array(z.enum(["audioReference", "videoReference", "textReference", "imageReference"])), "singleImage",
"multiImage",
"gridImage",
"startEndRequired",
"endFrameOptional",
"startFrameOptional",
"text",
"audioReference",
"videoReference",
]),
z.array(z.enum(["video", "image", "audio", "text"])),
]), ]),
), ),
audio: z.union([z.literal("optional"), z.boolean()]), audio: z.union([z.literal("optional"), z.boolean()]),
@ -60,9 +72,8 @@ const vendorConfigSchema = z.object({
export default router.post( export default router.post(
"/", "/",
validateFields({ validateFields({
id: z.number(), id: z.string(),
tsCode: z.string(), tsCode: z.string(),
icon: z.string().optional(),
inputValues: z.record(z.string(), z.string()), inputValues: z.record(z.string(), z.string()),
inputs: z.array( inputs: z.array(
z.object({ z.object({
@ -108,11 +119,9 @@ export default router.post(
}), }),
]), ]),
), ),
name: z.string().optional(),
version: z.string().optional(),
}), }),
async (req, res) => { async (req, res) => {
const { id, tsCode, name, version, models, inputs, inputValues, icon } = req.body; const { id, tsCode, name, models, inputs, inputValues, icon } = req.body;
const jsCode = transform(tsCode, { transforms: ["typescript"] }).code; const jsCode = transform(tsCode, { transforms: ["typescript"] }).code;
const exports = u.vm(jsCode); const exports = u.vm(jsCode);
@ -158,9 +167,6 @@ export default router.post(
}; };
let updatedTsCode = tsCode; let updatedTsCode = tsCode;
updatedTsCode = replacePrimitiveValue(updatedTsCode, "name", name ?? vendor.name);
updatedTsCode = replacePrimitiveValue(updatedTsCode, "version", version ? Number(version) : vendor.version);
updatedTsCode = replacePrimitiveValue(updatedTsCode, "icon", icon ?? vendor.icon ?? "");
updatedTsCode = replaceBlockValue(updatedTsCode, "inputs", JSON.stringify(inputs ?? vendor.inputs, null, 2)); updatedTsCode = replaceBlockValue(updatedTsCode, "inputs", JSON.stringify(inputs ?? vendor.inputs, null, 2));
updatedTsCode = replaceBlockValue(updatedTsCode, "inputValues", JSON.stringify(inputValues ?? vendor.inputValues, null, 2)); updatedTsCode = replaceBlockValue(updatedTsCode, "inputValues", JSON.stringify(inputValues ?? vendor.inputValues, null, 2));
updatedTsCode = replaceBlockValue(updatedTsCode, "models", JSON.stringify(models ?? vendor.models, null, 2)); updatedTsCode = replaceBlockValue(updatedTsCode, "models", JSON.stringify(models ?? vendor.models, null, 2));
@ -169,9 +175,6 @@ export default router.post(
.db("o_vendorConfig") .db("o_vendorConfig")
.where("id", id) .where("id", id)
.update({ .update({
name: name ? name : vendor.name,
version: version ? version.toString() : vendor.version.toString(),
icon: icon ? icon : vendor.icon || "",
inputs: inputs ? JSON.stringify(inputs) : JSON.stringify(vendor.inputs), inputs: inputs ? JSON.stringify(inputs) : JSON.stringify(vendor.inputs),
inputValues: inputValues ? JSON.stringify(inputValues) : JSON.stringify(vendor.inputValues), inputValues: inputValues ? JSON.stringify(inputValues) : JSON.stringify(vendor.inputValues),
models: models ? JSON.stringify(models) : JSON.stringify(vendor.models), models: models ? JSON.stringify(models) : JSON.stringify(vendor.models),

View File

@ -1,36 +1,6 @@
// @db-hash 579a004cc745580469a24ee71f5f51c3 // @db-hash 0041ea9843a4bb46f03412c516ec323b
//该文件由脚本自动生成,请勿手动修改 //该文件由脚本自动生成,请勿手动修改
export interface _o_project_old_20260326 {
'artStyle'?: string | null;
'createTime'?: number | null;
'id'?: number | null;
'intro'?: string | null;
'name'?: string | null;
'projectType'?: string | null;
'type'?: string | null;
'userId'?: number | null;
'videoRatio'?: string | null;
}
export interface _o_storyboard_old_20260325 {
'camera'?: string | null;
'createTime'?: number | null;
'description'?: string | null;
'duration'?: string | null;
'filePath'?: string | null;
'frameMode'?: string | null;
'id'?: number;
'lines'?: string | null;
'mode'?: string | null;
'model'?: string | null;
'prompt'?: string | null;
'reason'?: string | null;
'resolution'?: string | null;
'scriptId'?: number | null;
'sound'?: string | null;
'state'?: string | null;
'title'?: string | null;
}
export interface memories { export interface memories {
'content': string; 'content': string;
'createTime': number; 'createTime': number;
@ -215,15 +185,16 @@ export interface o_user {
'password'?: string | null; 'password'?: string | null;
} }
export interface o_vendorConfig { export interface o_vendorConfig {
'author'?: string | null;
'code'?: string | null; 'code'?: string | null;
'createTime'?: number | null; 'createTime'?: number | null;
'description'?: string | null;
'icon'?: string | null; 'icon'?: string | null;
'id'?: number; 'id'?: string;
'inputs'?: string | null; 'inputs'?: string | null;
'inputValues'?: string | null; 'inputValues'?: string | null;
'models'?: string | null; 'models'?: string | null;
'name'?: string | null; 'name'?: string | null;
'version'?: string | null;
} }
export interface o_video { export interface o_video {
'errorReason'?: string | null; 'errorReason'?: string | null;
@ -250,8 +221,6 @@ export interface o_videoConfig {
} }
export interface DB { export interface DB {
"_o_project_old_20260326": _o_project_old_20260326;
"_o_storyboard_old_20260325": _o_storyboard_old_20260325;
"memories": memories; "memories": memories;
"o_agentDeploy": o_agentDeploy; "o_agentDeploy": o_agentDeploy;
"o_agentWorkData": o_agentWorkData; "o_agentWorkData": o_agentWorkData;

View File

@ -8,7 +8,7 @@ type AiType = "scriptAgent" | "productionAgent" | "universalAgent";
type FnName = "textRequest" | "imageRequest" | "videoRequest" | "ttsRequest"; type FnName = "textRequest" | "imageRequest" | "videoRequest" | "ttsRequest";
const AiTypeValues: AiType[] = ["scriptAgent", "productionAgent", "universalAgent"]; const AiTypeValues: AiType[] = ["scriptAgent", "productionAgent", "universalAgent"];
async function resolveModelName(value: AiType | `${number}:${string}`): Promise<`${number}:${string}`> { async function resolveModelName(value: AiType | `${string}:${string}`): Promise<`${string}:${string}`> {
if (AiTypeValues.includes(value as AiType)) { if (AiTypeValues.includes(value as AiType)) {
const agentDeployData = await u.db("o_agentDeploy").where("key", value).first(); const agentDeployData = await u.db("o_agentDeploy").where("key", value).first();
if (!agentDeployData?.modelName) throw new Error(`${value}模型未配置`); if (!agentDeployData?.modelName) throw new Error(`${value}模型未配置`);
@ -17,7 +17,7 @@ async function resolveModelName(value: AiType | `${number}:${string}`): Promise<
return value as `${number}:${string}`; return value as `${number}:${string}`;
} }
async function getVendorTemplateFn(fnName: FnName, modelName: `${number}:${string}`) { async function getVendorTemplateFn(fnName: FnName, modelName: `${string}:${string}`) {
const [id, name] = modelName.split(":"); const [id, name] = modelName.split(":");
const vendorConfigData = await u.db("o_vendorConfig").where("id", id).first(); const vendorConfigData = await u.db("o_vendorConfig").where("id", id).first();
if (!vendorConfigData) throw new Error(`未找到供应商配置 id=${id}`); if (!vendorConfigData) throw new Error(`未找到供应商配置 id=${id}`);
@ -37,7 +37,7 @@ async function withTaskRecord<T>(
describe: string, describe: string,
relatedObjects: string, relatedObjects: string,
projectId: number, projectId: number,
fn: (modelName: `${number}:${string}`) => Promise<T>, fn: (modelName: `${string}:${string}`) => Promise<T>,
): Promise<T> { ): Promise<T> {
const modelName = await resolveModelName(modelKey); const modelName = await resolveModelName(modelKey);
const [id, model] = modelName.split(":"); const [id, model] = modelName.split(":");
@ -59,27 +59,38 @@ async function urlToBase64(url: string): Promise<string> {
} }
class AiText { class AiText {
private AiType: AiType | `${number}:${string}`; private AiType: AiType | `${string}:${string}`;
constructor(AiType: AiType | `${number}:${string}`) { constructor(AiType: AiType | `${string}:${string}`) {
this.AiType = AiType; this.AiType = AiType;
} }
async invoke(input: Omit<Parameters<typeof generateText>[0], "model">) { async invoke(input: Omit<Parameters<typeof generateText>[0], "model">) {
const switchAiDevTool = await u.db("o_setting").where("key", "switchAiDevTool").first();
const modelName = await resolveModelName(this.AiType); const modelName = await resolveModelName(this.AiType);
return generateText({ return generateText({
...(input.tools && { stopWhen: stepCountIs(Object.keys(input.tools).length * 50) }), ...(input.tools && { stopWhen: stepCountIs(Object.keys(input.tools).length * 50) }),
...input, ...input,
model:
switchAiDevTool?.value === "1"
? wrapLanguageModel({
model: await getVendorTemplateFn("textRequest", modelName), model: await getVendorTemplateFn("textRequest", modelName),
middleware: devToolsMiddleware(),
})
: await getVendorTemplateFn("textRequest", modelName),
} as Parameters<typeof generateText>[0]); } as Parameters<typeof generateText>[0]);
} }
async stream(input: Omit<Parameters<typeof streamText>[0], "model">) { async stream(input: Omit<Parameters<typeof streamText>[0], "model">) {
const switchAiDevTool = await u.db("o_setting").where("key", "switchAiDevTool").first();
const modelName = await resolveModelName(this.AiType); const modelName = await resolveModelName(this.AiType);
return streamText({ return streamText({
...(input.tools && { stopWhen: stepCountIs(Object.keys(input.tools).length * 50) }), ...(input.tools && { stopWhen: stepCountIs(Object.keys(input.tools).length * 50) }),
...input, ...input,
model: wrapLanguageModel({ model:
switchAiDevTool?.value == "1"
? wrapLanguageModel({
model: await getVendorTemplateFn("textRequest", modelName), model: await getVendorTemplateFn("textRequest", modelName),
middleware: devToolsMiddleware(), middleware: devToolsMiddleware(),
}), })
: await getVendorTemplateFn("textRequest", modelName),
} as Parameters<typeof streamText>[0]); } as Parameters<typeof streamText>[0]);
} }
} }
@ -168,7 +179,7 @@ class AiAudio {
} }
export default { export default {
Text: (AiType: AiType | `${number}:${string}`) => new AiText(AiType), Text: (AiType: AiType | `${string}:${string}`) => new AiText(AiType),
Image: (key: `${number}:${string}`) => new AiImage(key), Image: (key: `${number}:${string}`) => new AiImage(key),
Video: (key: `${number}:${string}`) => new AiVideo(key), Video: (key: `${number}:${string}`) => new AiVideo(key),
Audio: (key: `${number}:${string}`) => new AiAudio(key), Audio: (key: `${number}:${string}`) => new AiAudio(key),

View File

@ -34,6 +34,7 @@ export default function runCode(code: string) {
exports, exports,
axios, axios,
FormData, FormData,
logger,
}, },
compiler: "javascript", compiler: "javascript",
eval: false, eval: false,
@ -44,6 +45,10 @@ export default function runCode(code: string) {
return exports as Record<string, any>; return exports as Record<string, any>;
} }
export function logger(logstring: string) {
console.log("【VM】" + logstring);
}
/** /**
* size * size
*/ */