no message

This commit is contained in:
ACT丶流星雨 2026-04-11 02:43:51 +08:00
parent b6694df5c8
commit 851fb6253d
33 changed files with 2048 additions and 1808 deletions

View File

@ -119,7 +119,7 @@ declare const createMinimax: any;
declare const createGoogleGenerativeAI: any;
declare const exports: {
vendor: VendorConfig;
textRequest: (m: TextModel) => any; //文本模型
textRequest: (m: TextModel, t: boolean, tl: 0 | 1 | 2 | 3) => any; //文本模型
imageRequest: (c: ImageConfig, m: ImageModel) => Promise<string>; //图片模型返回有头base64字符串
videoRequest: (c: VideoConfig, m: VideoModel) => Promise<string>; //视频模型返回有头base64字符串
ttsRequest: (c: TTSConfig, m: TTSModel) => Promise<string>; //暂未开放语音模型返回有头base64字符串
@ -133,7 +133,7 @@ declare const exports: {
const vendor: VendorConfig = {
id: "grsai",
version: "1.0",
version: "2.0",
author: "Toonflow",
name: "Grsai",
description: "Grsai AI平台适配支持文生图、图生图、文生视频、Gemini兼容文本模型 \n [前往中转平台](https://tf.grsai.ai/zh)",
@ -165,7 +165,7 @@ const getHeaders = () => {
// 适配器函数
// ============================================================
const textRequest = (model: TextModel) => {
const textRequest = (model: TextModel, think: boolean, thinkLevel: 0 | 1 | 2 | 3) => {
if (!vendor.inputValues.apiKey) throw new Error("缺少API Key");
const apiKey = vendor.inputValues.apiKey.replace(/^Bearer\s+/i, "");
return createGoogleGenerativeAI({

View File

@ -119,7 +119,7 @@ declare const createMinimax: any;
declare const createGoogleGenerativeAI: any;
declare const exports: {
vendor: VendorConfig;
textRequest: (m: TextModel) => any;
textRequest: (m: TextModel, t: boolean, tl: 0 | 1 | 2 | 3) => any;
imageRequest: (c: ImageConfig, m: ImageModel) => Promise<string>;
videoRequest: (c: VideoConfig, m: VideoModel) => Promise<string>;
ttsRequest: (c: TTSConfig, m: TTSModel) => Promise<string>;
@ -436,7 +436,7 @@ const submitAndPoll = async (submitUrl: string, queryUrlBase: string, requestBod
// 适配器函数
// ============================================================
const textRequest = (model: TextModel) => {
const textRequest = (model: TextModel, think: boolean, thinkLevel: 0 | 1 | 2 | 3) => {
throw new Error("可灵AI不支持文本模型");
};

View File

@ -119,7 +119,7 @@ declare const createMinimax: any;
declare const createGoogleGenerativeAI: any;
declare const exports: {
vendor: VendorConfig;
textRequest: (m: TextModel) => any;
textRequest: (m: TextModel, t: boolean, tl: 0 | 1 | 2 | 3) => any;
uploadReference: (base64: string, fileType: "image" | "audio" | "video") => Promise<ReferenceList>;
imageRequest: (c: ImageConfig, m: ImageModel) => Promise<string>;
videoRequest: (c: VideoConfig, m: VideoModel) => Promise<string>;
@ -225,7 +225,7 @@ const extractBase64WithHead = (ref: ReferenceList): string => {
// 适配器函数
// ============================================================
const textRequest = (model: TextModel) => {
const textRequest = (model: TextModel, think: boolean, thinkLevel: 0 | 1 | 2 | 3) => {
if (!vendor.inputValues.apiKey) throw new Error("缺少API Key");
const apiKey = vendor.inputValues.apiKey.replace(/^Bearer\s+/i, "");
const baseUrl = getBaseUrl();

8
data/vendor/null.ts vendored
View File

@ -119,7 +119,7 @@ declare const createMinimax: any;
declare const createGoogleGenerativeAI: any;
declare const exports: {
vendor: VendorConfig;
textRequest: (m: TextModel) => any; //文本模型
textRequest: (m: TextModel, t: boolean, tl: 0 | 1 | 2 | 3) => any; //文本模型
imageRequest: (c: ImageConfig, m: ImageModel) => Promise<string>; //图片模型返回有头base64字符串
videoRequest: (c: VideoConfig, m: VideoModel) => Promise<string>; //视频模型返回有头base64字符串
ttsRequest: (c: TTSConfig, m: TTSModel) => Promise<string>; //暂未开放语音模型返回有头base64字符串
@ -132,11 +132,11 @@ declare const exports: {
// ============================================================
const vendor: VendorConfig = {
id: "bull",
id: "null",
version: "2.0",
author: "Toonflow",
name: "空模板",
description: "## OpenAI标准格式接口可修改请求地址并手动添加模型。",
description: "## 开发模板您可以使用此模板进行Vibe Coding",
inputs: [
{ key: "apiKey", label: "API密钥", type: "password", required: true },
{ key: "baseUrl", label: "请求地址", type: "url", required: true, placeholder: "示例https://api.openai.com/v1" },
@ -149,7 +149,7 @@ const vendor: VendorConfig = {
// 适配器函数
// ============================================================
const textRequest = (model: TextModel) => {
const textRequest = (model: TextModel, think: boolean, thinkLevel: 0 | 1 | 2 | 3) => {
if (!vendor.inputValues.apiKey) throw new Error("缺少API Key");
const apiKey = vendor.inputValues.apiKey.replace(/^Bearer\s+/i, "");
return createOpenAI({ baseURL: vendor.inputValues.baseUrl, apiKey }).chat(model.modelName);

View File

@ -100,7 +100,7 @@ declare const createMinimax: any;
declare const createGoogleGenerativeAI: any;
declare const exports: {
vendor: VendorConfig;
textRequest: (m: TextModel) => any;
textRequest: (m: TextModel, t: boolean, tl: 0 | 1 | 2 | 3) => any;
imageRequest: (c: ImageConfig, m: ImageModel) => Promise<string>;
videoRequest: (c: VideoConfig, m: VideoModel) => Promise<string>;
ttsRequest: (c: TTSConfig, m: TTSModel) => Promise<string>;
@ -136,7 +136,7 @@ const vendor: VendorConfig = {
// ============================================================
// 适配器函数
// ============================================================
const textRequest = (model: TextModel) => {
const textRequest = (model: TextModel, think: boolean, thinkLevel: 0 | 1 | 2 | 3) => {
if (!vendor.inputValues.apiKey) throw new Error("缺少API Key");
const apiKey = vendor.inputValues.apiKey.replace(/^Bearer\s+/i, "");
return createOpenAI({ baseURL: vendor.inputValues.baseUrl, apiKey }).chat(model.modelName);

View File

@ -119,7 +119,7 @@ declare const createMinimax: any;
declare const createGoogleGenerativeAI: any;
declare const exports: {
vendor: VendorConfig;
textRequest: (m: TextModel) => any;
textRequest: (m: TextModel, t: boolean, tl: 0 | 1 | 2 | 3) => any;
imageRequest: (c: ImageConfig, m: ImageModel) => Promise<string>;
videoRequest: (c: VideoConfig, m: VideoModel) => Promise<string>;
ttsRequest: (c: TTSConfig, m: TTSModel) => Promise<string>;
@ -235,7 +235,7 @@ function extractFirstImageFromMd(content: string) {
// 适配器函数
// ============================================================
const textRequest = (model: TextModel) => {
const textRequest = (model: TextModel, think: boolean, thinkLevel: 0 | 1 | 2 | 3) => {
if (!vendor.inputValues.apiKey) throw new Error("缺少API Key");
const apiKey = vendor.inputValues.apiKey.replace(/^Bearer\s+/i, "");
return createOpenAI({ baseURL: vendor.inputValues.baseUrl, apiKey }).chat(model.modelName);

View File

@ -119,7 +119,7 @@ declare const createMinimax: any;
declare const createGoogleGenerativeAI: any;
declare const exports: {
vendor: VendorConfig;
textRequest: (m: TextModel) => any;
textRequest: (m: TextModel, t: boolean, tl: 0 | 1 | 2 | 3) => any;
imageRequest: (c: ImageConfig, m: ImageModel) => Promise<string>;
videoRequest: (c: VideoConfig, m: VideoModel) => Promise<string>;
ttsRequest: (c: TTSConfig, m: TTSModel) => Promise<string>;

File diff suppressed because one or more lines are too long

View File

@ -7,7 +7,7 @@ import Module from "module";
app.commandLine.appendSwitch("disable-gpu-shader-disk-cache");
app.commandLine.appendSwitch("disable-features", "CalculateNativeWinOcclusion");
const TARGET_ENTRIES = new Set(["assets", "models", "serve", "skills", "web"]);
const TARGET_ENTRIES = new Set(["assets", "models", "serve", "skills", "web", "vendor"]);
function copyDir(src: string, dest: string): void {
if (!fs.existsSync(src)) return;

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -1,4 +1,4 @@
// @routes-hash 04a067f990aac8e584acabe110983618
// @routes-hash 62534cff632db5d31442f1bca1932925
import { Express } from "express";
import route1 from "./routes/agents/clearMemory";
@ -63,86 +63,87 @@ import route59 from "./routes/production/editImage/saveImageFlow";
import route60 from "./routes/production/editImage/updateImageFlow";
import route61 from "./routes/production/editImage/uploadImage";
import route62 from "./routes/production/getFlowData";
import route63 from "./routes/production/getProductionData";
import route64 from "./routes/production/getStoryboardData";
import route65 from "./routes/production/saveFlowData";
import route66 from "./routes/production/storyboard/addStoryboard";
import route67 from "./routes/production/storyboard/batchAddStoryboardInfo";
import route68 from "./routes/production/storyboard/batchGenerateImage";
import route69 from "./routes/production/storyboard/downPreviewImage";
import route70 from "./routes/production/storyboard/editStoryboardInfo";
import route71 from "./routes/production/storyboard/getStoryboardData";
import route72 from "./routes/production/storyboard/pollingImage";
import route73 from "./routes/production/storyboard/previewImage";
import route74 from "./routes/production/storyboard/removeFrame";
import route75 from "./routes/production/storyboard/updateStoryboardUrl";
import route76 from "./routes/production/workbench/addTrack";
import route77 from "./routes/production/workbench/deleteTrack";
import route78 from "./routes/production/workbench/delVideo";
import route79 from "./routes/production/workbench/generateVideo";
import route80 from "./routes/production/workbench/generateVideoPrompt";
import route81 from "./routes/production/workbench/getGenerateData";
import route82 from "./routes/production/workbench/getVideoList";
import route83 from "./routes/production/workbench/getVideoModelDetail";
import route84 from "./routes/production/workbench/selectVideo";
import route85 from "./routes/production/workbench/updateVideoPrompt";
import route86 from "./routes/project/addDirectorManual";
import route87 from "./routes/project/addProject";
import route88 from "./routes/project/addVisualManual";
import route89 from "./routes/project/deleteDirectorManual";
import route90 from "./routes/project/deleteVisualManual";
import route91 from "./routes/project/delProject";
import route92 from "./routes/project/editDirectorlManual";
import route93 from "./routes/project/editProject";
import route94 from "./routes/project/editVisualManual";
import route95 from "./routes/project/getProject";
import route96 from "./routes/project/getVisualManual";
import route97 from "./routes/project/queryDirectorManual";
import route98 from "./routes/project/visualManual";
import route99 from "./routes/script/addScript";
import route100 from "./routes/script/batchAddScript";
import route101 from "./routes/script/delScript";
import route102 from "./routes/script/exportScript";
import route103 from "./routes/script/extractAssets";
import route104 from "./routes/script/getScrptApi";
import route105 from "./routes/script/pollScriptAssets";
import route106 from "./routes/script/updateScript";
import route107 from "./routes/scriptAgent/getPlanData";
import route108 from "./routes/scriptAgent/setPlanData";
import route109 from "./routes/scriptAgent/updateData";
import route110 from "./routes/setting/about/checkUpdate";
import route111 from "./routes/setting/about/downloadApp";
import route112 from "./routes/setting/agentDeploy/agentSetKey";
import route113 from "./routes/setting/agentDeploy/deployAgentModel";
import route114 from "./routes/setting/agentDeploy/getAgentDeploy";
import route115 from "./routes/setting/dbConfig/clearData";
import route116 from "./routes/setting/dev/getSwitchAiDevTool";
import route117 from "./routes/setting/dev/updateSwitchAiDevTool";
import route118 from "./routes/setting/fileManagement/openFolder";
import route119 from "./routes/setting/getTextModel";
import route120 from "./routes/setting/loginConfig/getUser";
import route121 from "./routes/setting/loginConfig/updateUserPwd";
import route122 from "./routes/setting/memoryConfig/delAllMemory";
import route123 from "./routes/setting/memoryConfig/getMemory";
import route124 from "./routes/setting/memoryConfig/sureMemory";
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/deleteVendor";
import route63 from "./routes/production/getStoryboardData";
import route64 from "./routes/production/saveFlowData";
import route65 from "./routes/production/storyboard/addStoryboard";
import route66 from "./routes/production/storyboard/batchAddStoryboardInfo";
import route67 from "./routes/production/storyboard/batchGenerateImage";
import route68 from "./routes/production/storyboard/downPreviewImage";
import route69 from "./routes/production/storyboard/editStoryboardInfo";
import route70 from "./routes/production/storyboard/getStoryboardData";
import route71 from "./routes/production/storyboard/pollingImage";
import route72 from "./routes/production/storyboard/previewImage";
import route73 from "./routes/production/storyboard/removeFrame";
import route74 from "./routes/production/storyboard/updateStoryboardUrl";
import route75 from "./routes/production/workbench/addTrack";
import route76 from "./routes/production/workbench/deleteTrack";
import route77 from "./routes/production/workbench/delVideo";
import route78 from "./routes/production/workbench/generateVideo";
import route79 from "./routes/production/workbench/generateVideoPrompt";
import route80 from "./routes/production/workbench/getGenerateData";
import route81 from "./routes/production/workbench/getVideoList";
import route82 from "./routes/production/workbench/selectVideo";
import route83 from "./routes/production/workbench/updateVideoPrompt";
import route84 from "./routes/project/addDirectorManual";
import route85 from "./routes/project/addProject";
import route86 from "./routes/project/addVisualManual";
import route87 from "./routes/project/deleteDirectorManual";
import route88 from "./routes/project/deleteVisualManual";
import route89 from "./routes/project/delProject";
import route90 from "./routes/project/editDirectorlManual";
import route91 from "./routes/project/editProject";
import route92 from "./routes/project/editVisualManual";
import route93 from "./routes/project/getProject";
import route94 from "./routes/project/getVisualManual";
import route95 from "./routes/project/queryDirectorManual";
import route96 from "./routes/project/visualManual";
import route97 from "./routes/script/addScript";
import route98 from "./routes/script/batchAddScript";
import route99 from "./routes/script/delScript";
import route100 from "./routes/script/exportScript";
import route101 from "./routes/script/extractAssets";
import route102 from "./routes/script/getScrptApi";
import route103 from "./routes/script/pollScriptAssets";
import route104 from "./routes/script/updateScript";
import route105 from "./routes/scriptAgent/getPlanData";
import route106 from "./routes/scriptAgent/setPlanData";
import route107 from "./routes/scriptAgent/updateData";
import route108 from "./routes/setting/about/checkUpdate";
import route109 from "./routes/setting/about/downloadApp";
import route110 from "./routes/setting/agentDeploy/agentSetKey";
import route111 from "./routes/setting/agentDeploy/deployAgentModel";
import route112 from "./routes/setting/agentDeploy/getAgentDeploy";
import route113 from "./routes/setting/dbConfig/clearData";
import route114 from "./routes/setting/dev/getSwitchAiDevTool";
import route115 from "./routes/setting/dev/updateSwitchAiDevTool";
import route116 from "./routes/setting/fileManagement/openFolder";
import route117 from "./routes/setting/getTextModel";
import route118 from "./routes/setting/loginConfig/getUser";
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/promptManage/getPrompt";
import route124 from "./routes/setting/promptManage/updatePrompt";
import route125 from "./routes/setting/skillManagement/getSkillContent";
import route126 from "./routes/setting/skillManagement/getSkillList";
import route127 from "./routes/setting/skillManagement/saveSkillContent";
import route128 from "./routes/setting/vendorConfig/addVendor";
import route129 from "./routes/setting/vendorConfig/addVendorModel";
import route130 from "./routes/setting/vendorConfig/deleteVendor";
import route131 from "./routes/setting/vendorConfig/delVendorModel";
import route132 from "./routes/setting/vendorConfig/enableVendor";
import route133 from "./routes/setting/vendorConfig/getCodeByLink";
import route134 from "./routes/setting/vendorConfig/getVendorList";
import route135 from "./routes/setting/vendorConfig/modelTest";
import route136 from "./routes/setting/vendorConfig/updateCode";
import route137 from "./routes/setting/vendorConfig/updateVendor";
import route138 from "./routes/task/getProject";
import route139 from "./routes/task/getTaskApi";
import route140 from "./routes/task/getTaskCategories";
import route141 from "./routes/task/taskDetails";
import route142 from "./routes/test/test";
import route137 from "./routes/setting/vendorConfig/updateVendorInputs";
import route138 from "./routes/setting/vendorConfig/upVendorModel";
import route139 from "./routes/task/getProject";
import route140 from "./routes/task/getTaskApi";
import route141 from "./routes/task/getTaskCategories";
import route142 from "./routes/task/taskDetails";
import route143 from "./routes/test/test";
export default async (app: Express) => {
app.use("/api/agents/clearMemory", route1);
@ -207,84 +208,85 @@ export default async (app: Express) => {
app.use("/api/production/editImage/updateImageFlow", route60);
app.use("/api/production/editImage/uploadImage", route61);
app.use("/api/production/getFlowData", route62);
app.use("/api/production/getProductionData", route63);
app.use("/api/production/getStoryboardData", route64);
app.use("/api/production/saveFlowData", route65);
app.use("/api/production/storyboard/addStoryboard", route66);
app.use("/api/production/storyboard/batchAddStoryboardInfo", route67);
app.use("/api/production/storyboard/batchGenerateImage", route68);
app.use("/api/production/storyboard/downPreviewImage", route69);
app.use("/api/production/storyboard/editStoryboardInfo", route70);
app.use("/api/production/storyboard/getStoryboardData", route71);
app.use("/api/production/storyboard/pollingImage", route72);
app.use("/api/production/storyboard/previewImage", route73);
app.use("/api/production/storyboard/removeFrame", route74);
app.use("/api/production/storyboard/updateStoryboardUrl", route75);
app.use("/api/production/workbench/addTrack", route76);
app.use("/api/production/workbench/deleteTrack", route77);
app.use("/api/production/workbench/delVideo", route78);
app.use("/api/production/workbench/generateVideo", route79);
app.use("/api/production/workbench/generateVideoPrompt", route80);
app.use("/api/production/workbench/getGenerateData", route81);
app.use("/api/production/workbench/getVideoList", route82);
app.use("/api/production/workbench/getVideoModelDetail", route83);
app.use("/api/production/workbench/selectVideo", route84);
app.use("/api/production/workbench/updateVideoPrompt", route85);
app.use("/api/project/addDirectorManual", route86);
app.use("/api/project/addProject", route87);
app.use("/api/project/addVisualManual", route88);
app.use("/api/project/deleteDirectorManual", route89);
app.use("/api/project/deleteVisualManual", route90);
app.use("/api/project/delProject", route91);
app.use("/api/project/editDirectorlManual", route92);
app.use("/api/project/editProject", route93);
app.use("/api/project/editVisualManual", route94);
app.use("/api/project/getProject", route95);
app.use("/api/project/getVisualManual", route96);
app.use("/api/project/queryDirectorManual", route97);
app.use("/api/project/visualManual", route98);
app.use("/api/script/addScript", route99);
app.use("/api/script/batchAddScript", route100);
app.use("/api/script/delScript", route101);
app.use("/api/script/exportScript", route102);
app.use("/api/script/extractAssets", route103);
app.use("/api/script/getScrptApi", route104);
app.use("/api/script/pollScriptAssets", route105);
app.use("/api/script/updateScript", route106);
app.use("/api/scriptAgent/getPlanData", route107);
app.use("/api/scriptAgent/setPlanData", route108);
app.use("/api/scriptAgent/updateData", route109);
app.use("/api/setting/about/checkUpdate", route110);
app.use("/api/setting/about/downloadApp", route111);
app.use("/api/setting/agentDeploy/agentSetKey", route112);
app.use("/api/setting/agentDeploy/deployAgentModel", route113);
app.use("/api/setting/agentDeploy/getAgentDeploy", route114);
app.use("/api/setting/dbConfig/clearData", route115);
app.use("/api/setting/dev/getSwitchAiDevTool", route116);
app.use("/api/setting/dev/updateSwitchAiDevTool", route117);
app.use("/api/setting/fileManagement/openFolder", route118);
app.use("/api/setting/getTextModel", route119);
app.use("/api/setting/loginConfig/getUser", route120);
app.use("/api/setting/loginConfig/updateUserPwd", route121);
app.use("/api/setting/memoryConfig/delAllMemory", route122);
app.use("/api/setting/memoryConfig/getMemory", route123);
app.use("/api/setting/memoryConfig/sureMemory", 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/deleteVendor", route131);
app.use("/api/production/getStoryboardData", route63);
app.use("/api/production/saveFlowData", route64);
app.use("/api/production/storyboard/addStoryboard", route65);
app.use("/api/production/storyboard/batchAddStoryboardInfo", route66);
app.use("/api/production/storyboard/batchGenerateImage", route67);
app.use("/api/production/storyboard/downPreviewImage", route68);
app.use("/api/production/storyboard/editStoryboardInfo", route69);
app.use("/api/production/storyboard/getStoryboardData", route70);
app.use("/api/production/storyboard/pollingImage", route71);
app.use("/api/production/storyboard/previewImage", route72);
app.use("/api/production/storyboard/removeFrame", route73);
app.use("/api/production/storyboard/updateStoryboardUrl", route74);
app.use("/api/production/workbench/addTrack", route75);
app.use("/api/production/workbench/deleteTrack", route76);
app.use("/api/production/workbench/delVideo", route77);
app.use("/api/production/workbench/generateVideo", route78);
app.use("/api/production/workbench/generateVideoPrompt", route79);
app.use("/api/production/workbench/getGenerateData", route80);
app.use("/api/production/workbench/getVideoList", route81);
app.use("/api/production/workbench/selectVideo", route82);
app.use("/api/production/workbench/updateVideoPrompt", route83);
app.use("/api/project/addDirectorManual", route84);
app.use("/api/project/addProject", route85);
app.use("/api/project/addVisualManual", route86);
app.use("/api/project/deleteDirectorManual", route87);
app.use("/api/project/deleteVisualManual", route88);
app.use("/api/project/delProject", route89);
app.use("/api/project/editDirectorlManual", route90);
app.use("/api/project/editProject", route91);
app.use("/api/project/editVisualManual", route92);
app.use("/api/project/getProject", route93);
app.use("/api/project/getVisualManual", route94);
app.use("/api/project/queryDirectorManual", route95);
app.use("/api/project/visualManual", route96);
app.use("/api/script/addScript", route97);
app.use("/api/script/batchAddScript", route98);
app.use("/api/script/delScript", route99);
app.use("/api/script/exportScript", route100);
app.use("/api/script/extractAssets", route101);
app.use("/api/script/getScrptApi", route102);
app.use("/api/script/pollScriptAssets", route103);
app.use("/api/script/updateScript", route104);
app.use("/api/scriptAgent/getPlanData", route105);
app.use("/api/scriptAgent/setPlanData", route106);
app.use("/api/scriptAgent/updateData", route107);
app.use("/api/setting/about/checkUpdate", route108);
app.use("/api/setting/about/downloadApp", route109);
app.use("/api/setting/agentDeploy/agentSetKey", route110);
app.use("/api/setting/agentDeploy/deployAgentModel", route111);
app.use("/api/setting/agentDeploy/getAgentDeploy", route112);
app.use("/api/setting/dbConfig/clearData", route113);
app.use("/api/setting/dev/getSwitchAiDevTool", route114);
app.use("/api/setting/dev/updateSwitchAiDevTool", route115);
app.use("/api/setting/fileManagement/openFolder", route116);
app.use("/api/setting/getTextModel", route117);
app.use("/api/setting/loginConfig/getUser", route118);
app.use("/api/setting/loginConfig/updateUserPwd", route119);
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/promptManage/getPrompt", route123);
app.use("/api/setting/promptManage/updatePrompt", route124);
app.use("/api/setting/skillManagement/getSkillContent", route125);
app.use("/api/setting/skillManagement/getSkillList", route126);
app.use("/api/setting/skillManagement/saveSkillContent", route127);
app.use("/api/setting/vendorConfig/addVendor", route128);
app.use("/api/setting/vendorConfig/addVendorModel", route129);
app.use("/api/setting/vendorConfig/deleteVendor", route130);
app.use("/api/setting/vendorConfig/delVendorModel", route131);
app.use("/api/setting/vendorConfig/enableVendor", route132);
app.use("/api/setting/vendorConfig/getCodeByLink", route133);
app.use("/api/setting/vendorConfig/getVendorList", route134);
app.use("/api/setting/vendorConfig/modelTest", route135);
app.use("/api/setting/vendorConfig/updateCode", route136);
app.use("/api/setting/vendorConfig/updateVendor", route137);
app.use("/api/task/getProject", route138);
app.use("/api/task/getTaskApi", route139);
app.use("/api/task/getTaskCategories", route140);
app.use("/api/task/taskDetails", route141);
app.use("/api/test/test", route142);
app.use("/api/setting/vendorConfig/updateVendorInputs", route137);
app.use("/api/setting/vendorConfig/upVendorModel", route138);
app.use("/api/task/getProject", route139);
app.use("/api/task/getTaskApi", route140);
app.use("/api/task/getTaskCategories", route141);
app.use("/api/task/taskDetails", route142);
app.use("/api/test/test", route143);
}

View File

@ -13,11 +13,7 @@ export default router.post(
async (req, res) => {
const { modelId } = req.body;
const [id, name] = modelId.split(":");
const data = await u.db("o_vendorConfig").where("id", id).andWhere("enable", 1).select("models").first();
if (!data) {
return res.status(404).send({ error: "模型未找到" });
}
const models = JSON.parse(data.models!);
const models = await u.vendor.getModelList(id);
const findData = models.find((i: any) => i.modelName == name);
res.status(200).send(success(findData));
},

View File

@ -12,25 +12,28 @@ export default router.post(
}),
async (req, res) => {
const { type } = req.body;
const dataList = await u.db("o_vendorConfig").select("id", "models", "name").where("enable", 1);
const dataList = await u.db("o_vendorConfig").select("id").where("enable", 1);
if (!dataList || dataList.length === 0) {
return res.status(404).send({ error: "模型未找到" });
}
const modelList = await Promise.all(dataList.map(i=> u.vendor.getModelList(i.id!)));
const result = dataList.flatMap((data, index) => {
const models = modelList[index];
const filtered =
type === "all"
? models.filter((item: { type: string }) => item.type !== "video")
: models.filter((item: { type: string }) => item.type === type);
return filtered.map((item: { name: string; modelName: string; type: string }) => ({
id: data.id,
label: item.name,
value: item.modelName,
type: item.type,
name: data.name,
}));
});
res.status(200).send(success(result));
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!);
const models = modelList[index];
const filtered =
type === "all"
? models.filter((item: { type: string }) => item.type !== "video")
: models.filter((item: { type: string }) => item.type === type);
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,
}));
}),
);
res.status(200).send(success(result.flat()));
},
);

View File

@ -1,6 +1,6 @@
import express from "express";
import u from "@/utils";
import { base64, z } from "zod";
import { z } from "zod";
import { success } from "@/lib/responseFormat";
import { validateFields } from "@/middleware/middleware";
import axios from "axios";
@ -28,8 +28,13 @@ export default router.post(
const imageClass = await u.Ai.Image(model).run(
{
prompt: prompt,
referenceList:
references && references.length ? await Promise.all(references.map((url: string) => ({ type: "image", base64: urlToBase64(url) }))) : [],
referenceList: await (async () => {
const list: { type: "image"; base64: string }[] = [];
for (const url of references) {
list.push({ type: "image" as const, base64: await urlToBase64(url) });
}
return list;
})(),
size: quality,
aspectRatio: ratio,
},

View File

@ -1,74 +0,0 @@
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({
ids: z.array(z.number()),
}),
async (req, res) => {
const { ids } = req.body;
//查询分镜配置
const storyboardConfigs = await u.db("o_videoConfig").whereIn("storyboardId", ids).select("*");
//查询视频数据
const videos = await u.db("o_video").whereIn("storyboardId", ids).select("*");
//组装数据
const data = await Promise.all(
ids.map(async (storyboardId: number) => {
// 处理配置
const configRow = storyboardConfigs.find((item) => item.storyboardId === storyboardId) || null;
let config = null;
if (configRow?.data) {
const parsedData = JSON.parse(configRow.data);
const dataWithFilePath = await Promise.all(
parsedData.map(async (d: { type: string; id: number }) => {
if (d.type === "assets" && d.id) {
const row = await u
.db("o_assets")
.where("o_assets.id", d.id)
.leftJoin("o_image", "o_assets.imageId", "o_image.id")
.select("o_image.filePath as imageFilePath")
.first();
if (row?.imageFilePath) {
return { id: d.id, type: "assets", url: await u.oss.getFileUrl(row.imageFilePath) };
}
return null;
}
if (d.type === "storyboard" && d.id) {
const row = await u.db("o_storyboard").where("id", d.id).select("filePath").first();
if (row?.filePath) {
return { id: d.id, type: "storyboard", url: await u.oss.getFileUrl(row.filePath) };
}
return null;
}
return null;
}),
);
config = { ...configRow, data: dataWithFilePath };
}
// 处理视频
const storyboardVideos = videos.filter((v) => v.storyboardId === storyboardId);
const videosList = await Promise.all(
storyboardVideos.map(async (item) => ({
...item,
filePath: item.filePath ? await u.oss.getFileUrl(item.filePath) : null,
})),
);
return {
id: storyboardId,
config,
videos: videosList,
};
}),
);
return res.status(200).send(success(data));
},
);

View File

@ -42,8 +42,7 @@ export default router.post(
return res.status(400).json(success("项目未配置视频模型"));
}
const [videoId, videoModelName] = projectData.videoModel.split(":");
const vendorData = await u.db("o_vendorConfig").where("id", videoId).select("models").first();
const models = JSON.parse(vendorData!.models!);
const models = await u.vendor.getModelList(videoId);
const findData = models.find((i: any) => i.modelName == videoModelName);
const isRef = findData.mode.every((i: any) => Array.isArray(i));

View File

@ -1,17 +0,0 @@
import express from "express";
import u from "@/utils";
const router = express.Router();
export default router.post("/", async (req, res) => {
const { type } = req.body;
const vendorData = await u.db("o_vendorConfig").select("id", "models", "name");
if (!vendorData) {
return res.status(404).send({ error: "模型未找到" });
}
for (const item of vendorData) {
const modelsData = JSON.parse(item.models! ?? "[]");
const filterData = modelsData.filter((item: { type: string }) => item.type === type);
if (filterData.length > 0) {
}
}
});

View File

@ -4,6 +4,6 @@ import u from "@/utils";
const router = express.Router();
export default router.post("/", async (req, res) => {
const data = await u.db("o_agentDeploy").leftJoin("o_vendorConfig", "o_vendorConfig.id", "o_agentDeploy.vendorId").select("o_agentDeploy.*", "o_vendorConfig.icon");
const data = await u.db("o_agentDeploy").leftJoin("o_vendorConfig", "o_vendorConfig.id", "o_agentDeploy.vendorId").select("o_agentDeploy.*");
res.status(200).send(success(data));
});

View File

@ -80,7 +80,14 @@ export default router.post(
let detail = issue.message;
if (issue.code === "invalid_union") {
const unionDetails = [...new Set(issue.errors.flat().map((e) => e.message).filter(Boolean))];
const unionDetails = [
...new Set(
issue.errors
.flat()
.map((e) => e.message)
.filter(Boolean),
),
];
if (unionDetails.length > 0) {
detail = `${issue.message}${unionDetails.join("")}`;
}
@ -94,18 +101,13 @@ export default router.post(
if ((vendor.id as string).includes(":")) return res.status(400).send(error("id不能包含英文冒号"));
const data = await u.db("o_vendorConfig").where("id", vendor.id).first();
if (data) return res.status(500).send(error("供应商id已存在"));
await u.db("o_vendorConfig").insert({
const [id] = await u.db("o_vendorConfig").insert({
id: vendor.id,
author: vendor.author,
description: vendor.description || "",
name: vendor.name,
icon: vendor.icon || "",
inputs: JSON.stringify(vendor.inputs ?? []),
inputValues: JSON.stringify(vendor.inputValues ?? {}),
models: JSON.stringify(vendor.models ?? []),
createTime: Date.now(),
models: JSON.stringify([]),
enable: vendor.id == "toonflow" ? 1 : 0,
});
u.vendor.writeCode(vendor.id, tsCode);
res.status(200).send(success(result.data));
},
);

View File

@ -0,0 +1,61 @@
import express from "express";
import { success, error } from "@/lib/responseFormat";
import { validateFields } from "@/middleware/middleware";
import u from "@/utils";
import { z } from "zod";
const router = express.Router();
export default router.post(
"/",
validateFields({
id: z.string(),
model: z.discriminatedUnion("type", [
z.object({
name: z.string(),
modelName: z.string(),
type: z.literal("text"),
think: z.boolean(),
}),
z.object({
name: z.string(),
modelName: z.string(),
type: z.literal("image"),
mode: z.array(z.enum(["text", "singleImage", "multiReference"])),
}),
z.object({
name: z.string(),
modelName: z.string(),
type: z.literal("video"),
mode: z.array(
z.union([
z.enum(["singleImage", "startEndRequired", "endFrameOptional", "startFrameOptional", "text", "audioReference", "videoReference"]),
z.array(z.string().regex(/^(videoReference|imageReference|audioReference):\d+$/)),
]),
),
audio: z.union([z.literal("optional"), z.boolean()]),
durationResolutionMap: z.array(
z.object({
duration: z.array(z.number()),
resolution: z.array(z.string()),
}),
),
}),
]),
}),
async (req, res) => {
const { id, model } = req.body;
const models = await u.db("o_vendorConfig").where("id", id).first("models");
if (models?.models) {
const existingModels = JSON.parse(models.models);
existingModels.push(model);
await u
.db("o_vendorConfig")
.where("id", id)
.update({
models: JSON.stringify(existingModels),
});
}
res.status(200).send(success("更新成功"));
},
);

View File

@ -0,0 +1,33 @@
import express from "express";
import { success, error } from "@/lib/responseFormat";
import { validateFields } from "@/middleware/middleware";
import u from "@/utils";
import { z } from "zod";
const router = express.Router();
export default router.post(
"/",
validateFields({
id: z.string(),
modelName: z.string(),
}),
async (req, res) => {
const { id, modelName } = req.body;
const models = await u.db("o_vendorConfig").where("id", id).first("models");
if (models?.models) {
const existingModels = JSON.parse(models.models);
if (!existingModels.some((model: any) => model.modelName === modelName)) {
return res.status(400).send(error("基本模型不允许删除"));
}
const updatedModels = existingModels.filter((model: any) => model.modelName !== modelName);
await u
.db("o_vendorConfig")
.where("id", id)
.update({
models: JSON.stringify(updatedModels),
});
}
res.status(200).send(success("更新成功"));
},
);

View File

@ -12,9 +12,7 @@ export default router.post(
}),
async (req, res) => {
const { id, enable } = req.body;
await u.db("o_vendorConfig").where("id", id).update({
enable,
});
await u.db("o_vendorConfig").where("id", id).update({ enable });
res.status(200).send(success("更新成功"));
},
);

View File

@ -7,17 +7,22 @@ export default router.post("/", async (req, res) => {
const data = await u.db("o_vendorConfig").select("*");
const list = await Promise.all(
data.map(async (item) => ({
...item,
inputValues: JSON.parse(item.inputValues ?? "{}"),
models: await u.vendor.getModelList(item.id!),
code: u.vendor.getCode(item.id!),
description: u.vendor.getVendor(item.id!).description,
inputs: u.vendor.getVendor(item.id!).inputs,
author: u.vendor.getVendor(item.id!).author,
name: u.vendor.getVendor(item.id!).name,
})),
data.map(async (item) => {
const vendor = u.vendor.getVendor(item.id!);
return {
...item,
inputValues: JSON.parse(item.inputValues ?? "{}"),
models: await u.vendor.getModelList(item.id!),
code: u.vendor.getCode(item.id!),
description: vendor.description,
inputs: vendor.inputs,
author: vendor.author,
name: vendor.name,
version: vendor.version ?? "1.0",
};
}),
);
list.sort((a, b) => (a.id === "toonflow" ? -1 : b.id === "toonflow" ? 1 : 0));
res.status(200).send(success(list));
});

View File

@ -25,7 +25,7 @@ export default router.post(
modelData: {
prompt:
"一张16:9比例的图片完美等分为2x2四宫格布局各区域无缝衔接\n左上宫格一只可爱的猫毛发蓬松眼睛明亮姿态俏皮\n右上宫格一只友善的狗金毛犬表情愉悦摇着尾巴\n左下宫格一头健壮的牛田园背景目光温和皮毛光泽\n右下宫格一匹骏马姿态优雅鬃毛飘逸肌肉健美\n风格要求四个宫格风格统一色彩鲜艳饱和高清画质细节清晰锐利专业插画风格线条干净统一的左上方光源柔和阴影和谐配色卡通/半写实风格,宫格间用白色或浅灰细线分隔", //图片提示词
imageBase64: [], //输入的图片提示词
referenceList: [], //输入的图片提示词
size: "1K", // 图片尺寸
aspectRatio: "16:9",
},
@ -48,7 +48,7 @@ export default router.post(
aspectRatio: "16:9",
prompt:
"A shirtless middle-aged man with a horse head is standing in a supermarket, carefully comparing two identical bottles of shampoo for 3 seconds, then suddenly bursts into tears, drops to his knees dramatically, a flock of pigeons explodes out of nowhere from behind him, the supermarket lights flicker, an old grandma nearby continues shopping completely unbothered, the horse head man instantly stops crying, puts both shampoo bottles back, and moonwalks away disappearing into the vegetable section. Security camera footage style, slightly grainy, 5 seconds.",
imageBase64: [],
referenceList: [],
audio: false,
mode: "text",
};

View File

@ -0,0 +1,66 @@
import express from "express";
import { success, error } from "@/lib/responseFormat";
import { validateFields } from "@/middleware/middleware";
import u from "@/utils";
import { z } from "zod";
const router = express.Router();
export default router.post(
"/",
validateFields({
id: z.string(),
modelName: z.string(),
model: z.discriminatedUnion("type", [
z.object({
name: z.string(),
modelName: z.string(),
type: z.literal("text"),
think: z.boolean(),
}),
z.object({
name: z.string(),
modelName: z.string(),
type: z.literal("image"),
mode: z.array(z.enum(["text", "singleImage", "multiReference"])),
}),
z.object({
name: z.string(),
modelName: z.string(),
type: z.literal("video"),
mode: z.array(
z.union([
z.enum(["singleImage", "startEndRequired", "endFrameOptional", "startFrameOptional", "text", "audioReference", "videoReference"]),
z.array(z.string().regex(/^(videoReference|imageReference|audioReference):\d+$/)),
]),
),
audio: z.union([z.literal("optional"), z.boolean()]),
durationResolutionMap: z.array(
z.object({
duration: z.array(z.number()),
resolution: z.array(z.string()),
}),
),
}),
]),
}),
async (req, res) => {
const { id, modelName, model } = req.body;
const models = await u.db("o_vendorConfig").where("id", id).first("models");
if (models?.models) {
const existingModels = JSON.parse(models.models);
const modelIndex = existingModels.findIndex((m: any) => m.modelName !== modelName);
if (modelIndex === -1) {
existingModels.push(model);
}
existingModels[modelIndex] = model;
await u
.db("o_vendorConfig")
.where("id", id)
.update({
models: JSON.stringify(existingModels),
});
}
res.status(200).send(success("更新成功"));
},
);

View File

@ -85,16 +85,10 @@ export default router.post(
.db("o_vendorConfig")
.where("id", id)
.update({
author: vendor.author,
description: vendor.description || "",
name: vendor.name,
icon: vendor.icon || "",
inputs: JSON.stringify(vendor.inputs ?? []),
inputValues: JSON.stringify(vendor.inputValues ?? {}),
models: JSON.stringify(vendor.models ?? []),
createTime: Date.now(),
});
u.vendor.upCode(id, tsCode);
u.vendor.writeCode(id, tsCode);
res.status(200).send(success(result.data));
} catch (err) {

View File

@ -1,71 +0,0 @@
import express from "express";
import { success, error } from "@/lib/responseFormat";
import { validateFields } from "@/middleware/middleware";
import u from "@/utils";
import { z } from "zod";
import { transform } from "sucrase";
const router = express.Router();
export default router.post(
"/",
validateFields({
id: z.string(),
inputValues: z.record(z.string(), z.string()),
inputs: z.array(
z.object({
key: z.string(),
label: z.string(),
type: z.enum(["text", "password", "url"]),
required: z.boolean(),
placeholder: z.string().optional(),
}),
),
models: z.array(
z.discriminatedUnion("type", [
z.object({
name: z.string(),
modelName: z.string(),
type: z.literal("text"),
think: z.boolean(),
}),
z.object({
name: z.string(),
modelName: z.string(),
type: z.literal("image"),
mode: z.array(z.enum(["text", "singleImage", "multiReference"])),
}),
z.object({
name: z.string(),
modelName: z.string(),
type: z.literal("video"),
mode: z.array(
z.union([
z.enum(["singleImage", "startEndRequired", "endFrameOptional", "startFrameOptional", "text"]),
z.array(z.string().regex(/^(videoReference|imageReference|audioReference):\d+$/)),
]),
),
audio: z.union([z.literal("optional"), z.boolean()]),
durationResolutionMap: z.array(
z.object({
duration: z.array(z.number()),
resolution: z.array(z.string()),
}),
),
}),
]),
),
}),
async (req, res) => {
const { id, models, inputs, inputValues } = req.body;
await u
.db("o_vendorConfig")
.where("id", id)
.update({
inputs: JSON.stringify(inputs),
inputValues: JSON.stringify(inputValues),
models: JSON.stringify(models),
});
res.status(200).send(success("更新成功"));
},
);

View File

@ -0,0 +1,26 @@
import express from "express";
import { success, error } from "@/lib/responseFormat";
import { validateFields } from "@/middleware/middleware";
import u from "@/utils";
import { z } from "zod";
import { transform } from "sucrase";
const router = express.Router();
export default router.post(
"/",
validateFields({
id: z.string(),
inputValues: z.record(z.string(), z.string()),
}),
async (req, res) => {
const { id, inputValues } = req.body;
await u
.db("o_vendorConfig")
.where("id", id)
.update({
inputValues: JSON.stringify(inputValues),
});
res.status(200).send(success("更新成功"));
},
);

View File

@ -1,4 +1,4 @@
// @db-hash 71e339c0a728c10bedb294a93976dcd8
// @db-hash 9248d7bcfe0a1bc57e5b9bc33d8c7d83
//该文件由脚本自动生成,请勿手动修改
export interface memories {
@ -201,17 +201,10 @@ export interface o_user {
'password'?: string | null;
}
export interface o_vendorConfig {
'author'?: string | null;
'code'?: string | null;
'createTime'?: number | null;
'description'?: string | null;
'enable'?: number | null;
'icon'?: string | null;
'id'?: string;
'inputs'?: string | null;
'inputValues'?: string | null;
'models'?: string | null;
'name'?: string | null;
}
export interface o_video {
'errorReason'?: string | null;

View File

@ -133,6 +133,15 @@ class AiText {
}
}
function referenceList2imageBase642(id: string, input: any) {
const version = u.vendor.getVendor(id).version;
if (!version || isNaN(parseFloat(version)) || parseFloat(version) < 2.0) {
input.imageBase64 = input.referenceList.map((item: any) => item.base64);
return input;
}
return input;
}
type ReferenceList = { type: "image"; base64: string } | { type: "audio"; base64: string } | { type: "video"; base64: string };
interface ImageConfig {
@ -159,6 +168,7 @@ class AiImage {
const modelName = await resolveModelName(this.key);
const exec = async (mn: `${string}:${string}`) => {
const fn = await getVendorTemplateFn("imageRequest", mn);
await referenceList2imageBase642(mn.split(":")[0], input);
this.result = await fn(input);
if (this.result.startsWith("http")) this.result = await urlToBase64(this.result);
return this;
@ -202,6 +212,7 @@ class AiVideo {
const modelName = await resolveModelName(this.key);
const exec = async (mn: `${string}:${string}`) => {
const fn = await getVendorTemplateFn("videoRequest", mn);
await referenceList2imageBase642(mn.split(":")[0], input);
this.result = await fn(input);
if (this.result.startsWith("http")) this.result = await urlToBase64(this.result);
return this;
@ -226,6 +237,7 @@ class AiAudio {
const modelName = await resolveModelName(this.key);
const exec = async (mn: `${string}:${string}`) => {
const fn = await getVendorTemplateFn("ttsRequest", mn);
await referenceList2imageBase642(mn.split(":")[0], input);
this.result = await fn(input);
if (this.result.startsWith("http")) this.result = await urlToBase64(this.result);
return this;

View File

@ -3,19 +3,18 @@ import fs from "fs";
import path from "path";
import u from "@/utils";
export function upCode(id: string, tsCode: string) {
const rootDir = u.getPath();
const vendor = u.vendor.getVendor(id);
if (!vendor) throw new Error("供应商不存在");
if (fs.existsSync(path.join(rootDir, "vendor", `${id}.ts`))) {
fs.writeFileSync(path.join(rootDir, "vendor", `${id}.ts`), tsCode);
export function writeCode(id: string | number, tsCode: string) {
const rootDir = u.getPath("vendor")
fs.mkdirSync(rootDir, { recursive: true })
if (fs.existsSync(path.join(rootDir, `${id}.ts`))) {
fs.writeFileSync(path.join(rootDir, `${id}.ts`), tsCode);
}
fs.writeFileSync(path.join(rootDir, "vendor", `${id}.ts`), tsCode);
fs.writeFileSync(path.join(rootDir, `${id}.ts`), tsCode);
}
export function getCode(id: string): string {
const rootDir = u.getPath();
const targetFile = path.join(rootDir, "vendor", `${id}.ts`);
const rootDir = u.getPath("vendor");
const targetFile = path.join(rootDir, `${id}.ts`);
if (!fs.existsSync(targetFile)) return "";
return fs.readFileSync(targetFile, "utf-8");
}
@ -26,7 +25,7 @@ export async function getModelList(id: string): Promise<Array<any>> {
const code = getCode(id);
const jsCode = transform(code, { transforms: ["typescript"] }).code;
const vendorData = u.vm(jsCode);
const combined = [...vendorData.vendor.models, ...JSON.parse(models?.models ?? "[]")];
const combined = [...JSON.parse(JSON.stringify(vendorData.vendor.models)), ...JSON.parse(models?.models ?? "[]")];
const map = new Map<string, any>();
for (const m of combined) {
map.set(m.modelName, m);

View File

@ -26,6 +26,8 @@
},
"exclude": [
"node_modules",
"data/**/*.ts"
"data/**/*.ts",
"dist",
"build"
]
}