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

View File

@ -119,7 +119,7 @@ declare const createMinimax: any;
declare const createGoogleGenerativeAI: any; declare const createGoogleGenerativeAI: any;
declare const exports: { declare const exports: {
vendor: VendorConfig; vendor: VendorConfig;
textRequest: (m: TextModel) => any; textRequest: (m: TextModel, t: boolean, tl: 0 | 1 | 2 | 3) => any;
imageRequest: (c: ImageConfig, m: ImageModel) => Promise<string>; imageRequest: (c: ImageConfig, m: ImageModel) => Promise<string>;
videoRequest: (c: VideoConfig, m: VideoModel) => Promise<string>; videoRequest: (c: VideoConfig, m: VideoModel) => Promise<string>;
ttsRequest: (c: TTSConfig, m: TTSModel) => 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不支持文本模型"); throw new Error("可灵AI不支持文本模型");
}; };

View File

@ -119,7 +119,7 @@ declare const createMinimax: any;
declare const createGoogleGenerativeAI: any; declare const createGoogleGenerativeAI: any;
declare const exports: { declare const exports: {
vendor: VendorConfig; 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>; uploadReference: (base64: string, fileType: "image" | "audio" | "video") => Promise<ReferenceList>;
imageRequest: (c: ImageConfig, m: ImageModel) => Promise<string>; imageRequest: (c: ImageConfig, m: ImageModel) => Promise<string>;
videoRequest: (c: VideoConfig, m: VideoModel) => 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"); if (!vendor.inputValues.apiKey) throw new Error("缺少API Key");
const apiKey = vendor.inputValues.apiKey.replace(/^Bearer\s+/i, ""); const apiKey = vendor.inputValues.apiKey.replace(/^Bearer\s+/i, "");
const baseUrl = getBaseUrl(); 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 createGoogleGenerativeAI: any;
declare const exports: { declare const exports: {
vendor: VendorConfig; 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字符串 imageRequest: (c: ImageConfig, m: ImageModel) => Promise<string>; //图片模型返回有头base64字符串
videoRequest: (c: VideoConfig, m: VideoModel) => Promise<string>; //视频模型返回有头base64字符串 videoRequest: (c: VideoConfig, m: VideoModel) => Promise<string>; //视频模型返回有头base64字符串
ttsRequest: (c: TTSConfig, m: TTSModel) => Promise<string>; //暂未开放语音模型返回有头base64字符串 ttsRequest: (c: TTSConfig, m: TTSModel) => Promise<string>; //暂未开放语音模型返回有头base64字符串
@ -132,11 +132,11 @@ declare const exports: {
// ============================================================ // ============================================================
const vendor: VendorConfig = { const vendor: VendorConfig = {
id: "bull", id: "null",
version: "2.0", version: "2.0",
author: "Toonflow", author: "Toonflow",
name: "空模板", name: "空模板",
description: "## OpenAI标准格式接口可修改请求地址并手动添加模型。", description: "## 开发模板您可以使用此模板进行Vibe Coding",
inputs: [ inputs: [
{ key: "apiKey", label: "API密钥", type: "password", required: true }, { key: "apiKey", label: "API密钥", type: "password", required: true },
{ key: "baseUrl", label: "请求地址", type: "url", required: true, placeholder: "示例https://api.openai.com/v1" }, { 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"); if (!vendor.inputValues.apiKey) throw new Error("缺少API Key");
const apiKey = vendor.inputValues.apiKey.replace(/^Bearer\s+/i, ""); const apiKey = vendor.inputValues.apiKey.replace(/^Bearer\s+/i, "");
return createOpenAI({ baseURL: vendor.inputValues.baseUrl, apiKey }).chat(model.modelName); 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 createGoogleGenerativeAI: any;
declare const exports: { declare const exports: {
vendor: VendorConfig; vendor: VendorConfig;
textRequest: (m: TextModel) => any; textRequest: (m: TextModel, t: boolean, tl: 0 | 1 | 2 | 3) => any;
imageRequest: (c: ImageConfig, m: ImageModel) => Promise<string>; imageRequest: (c: ImageConfig, m: ImageModel) => Promise<string>;
videoRequest: (c: VideoConfig, m: VideoModel) => Promise<string>; videoRequest: (c: VideoConfig, m: VideoModel) => Promise<string>;
ttsRequest: (c: TTSConfig, m: TTSModel) => 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"); if (!vendor.inputValues.apiKey) throw new Error("缺少API Key");
const apiKey = vendor.inputValues.apiKey.replace(/^Bearer\s+/i, ""); const apiKey = vendor.inputValues.apiKey.replace(/^Bearer\s+/i, "");
return createOpenAI({ baseURL: vendor.inputValues.baseUrl, apiKey }).chat(model.modelName); 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 createGoogleGenerativeAI: any;
declare const exports: { declare const exports: {
vendor: VendorConfig; vendor: VendorConfig;
textRequest: (m: TextModel) => any; textRequest: (m: TextModel, t: boolean, tl: 0 | 1 | 2 | 3) => any;
imageRequest: (c: ImageConfig, m: ImageModel) => Promise<string>; imageRequest: (c: ImageConfig, m: ImageModel) => Promise<string>;
videoRequest: (c: VideoConfig, m: VideoModel) => Promise<string>; videoRequest: (c: VideoConfig, m: VideoModel) => Promise<string>;
ttsRequest: (c: TTSConfig, m: TTSModel) => 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"); if (!vendor.inputValues.apiKey) throw new Error("缺少API Key");
const apiKey = vendor.inputValues.apiKey.replace(/^Bearer\s+/i, ""); const apiKey = vendor.inputValues.apiKey.replace(/^Bearer\s+/i, "");
return createOpenAI({ baseURL: vendor.inputValues.baseUrl, apiKey }).chat(model.modelName); 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 createGoogleGenerativeAI: any;
declare const exports: { declare const exports: {
vendor: VendorConfig; vendor: VendorConfig;
textRequest: (m: TextModel) => any; textRequest: (m: TextModel, t: boolean, tl: 0 | 1 | 2 | 3) => any;
imageRequest: (c: ImageConfig, m: ImageModel) => Promise<string>; imageRequest: (c: ImageConfig, m: ImageModel) => Promise<string>;
videoRequest: (c: VideoConfig, m: VideoModel) => Promise<string>; videoRequest: (c: VideoConfig, m: VideoModel) => Promise<string>;
ttsRequest: (c: TTSConfig, m: TTSModel) => 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-gpu-shader-disk-cache");
app.commandLine.appendSwitch("disable-features", "CalculateNativeWinOcclusion"); 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 { function copyDir(src: string, dest: string): void {
if (!fs.existsSync(src)) return; 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 { Express } from "express";
import route1 from "./routes/agents/clearMemory"; 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 route60 from "./routes/production/editImage/updateImageFlow";
import route61 from "./routes/production/editImage/uploadImage"; import route61 from "./routes/production/editImage/uploadImage";
import route62 from "./routes/production/getFlowData"; import route62 from "./routes/production/getFlowData";
import route63 from "./routes/production/getProductionData"; import route63 from "./routes/production/getStoryboardData";
import route64 from "./routes/production/getStoryboardData"; import route64 from "./routes/production/saveFlowData";
import route65 from "./routes/production/saveFlowData"; import route65 from "./routes/production/storyboard/addStoryboard";
import route66 from "./routes/production/storyboard/addStoryboard"; import route66 from "./routes/production/storyboard/batchAddStoryboardInfo";
import route67 from "./routes/production/storyboard/batchAddStoryboardInfo"; import route67 from "./routes/production/storyboard/batchGenerateImage";
import route68 from "./routes/production/storyboard/batchGenerateImage"; import route68 from "./routes/production/storyboard/downPreviewImage";
import route69 from "./routes/production/storyboard/downPreviewImage"; import route69 from "./routes/production/storyboard/editStoryboardInfo";
import route70 from "./routes/production/storyboard/editStoryboardInfo"; import route70 from "./routes/production/storyboard/getStoryboardData";
import route71 from "./routes/production/storyboard/getStoryboardData"; import route71 from "./routes/production/storyboard/pollingImage";
import route72 from "./routes/production/storyboard/pollingImage"; import route72 from "./routes/production/storyboard/previewImage";
import route73 from "./routes/production/storyboard/previewImage"; import route73 from "./routes/production/storyboard/removeFrame";
import route74 from "./routes/production/storyboard/removeFrame"; import route74 from "./routes/production/storyboard/updateStoryboardUrl";
import route75 from "./routes/production/storyboard/updateStoryboardUrl"; import route75 from "./routes/production/workbench/addTrack";
import route76 from "./routes/production/workbench/addTrack"; import route76 from "./routes/production/workbench/deleteTrack";
import route77 from "./routes/production/workbench/deleteTrack"; import route77 from "./routes/production/workbench/delVideo";
import route78 from "./routes/production/workbench/delVideo"; import route78 from "./routes/production/workbench/generateVideo";
import route79 from "./routes/production/workbench/generateVideo"; import route79 from "./routes/production/workbench/generateVideoPrompt";
import route80 from "./routes/production/workbench/generateVideoPrompt"; import route80 from "./routes/production/workbench/getGenerateData";
import route81 from "./routes/production/workbench/getGenerateData"; import route81 from "./routes/production/workbench/getVideoList";
import route82 from "./routes/production/workbench/getVideoList"; import route82 from "./routes/production/workbench/selectVideo";
import route83 from "./routes/production/workbench/getVideoModelDetail"; import route83 from "./routes/production/workbench/updateVideoPrompt";
import route84 from "./routes/production/workbench/selectVideo"; import route84 from "./routes/project/addDirectorManual";
import route85 from "./routes/production/workbench/updateVideoPrompt"; import route85 from "./routes/project/addProject";
import route86 from "./routes/project/addDirectorManual"; import route86 from "./routes/project/addVisualManual";
import route87 from "./routes/project/addProject"; import route87 from "./routes/project/deleteDirectorManual";
import route88 from "./routes/project/addVisualManual"; import route88 from "./routes/project/deleteVisualManual";
import route89 from "./routes/project/deleteDirectorManual"; import route89 from "./routes/project/delProject";
import route90 from "./routes/project/deleteVisualManual"; import route90 from "./routes/project/editDirectorlManual";
import route91 from "./routes/project/delProject"; import route91 from "./routes/project/editProject";
import route92 from "./routes/project/editDirectorlManual"; import route92 from "./routes/project/editVisualManual";
import route93 from "./routes/project/editProject"; import route93 from "./routes/project/getProject";
import route94 from "./routes/project/editVisualManual"; import route94 from "./routes/project/getVisualManual";
import route95 from "./routes/project/getProject"; import route95 from "./routes/project/queryDirectorManual";
import route96 from "./routes/project/getVisualManual"; import route96 from "./routes/project/visualManual";
import route97 from "./routes/project/queryDirectorManual"; import route97 from "./routes/script/addScript";
import route98 from "./routes/project/visualManual"; import route98 from "./routes/script/batchAddScript";
import route99 from "./routes/script/addScript"; import route99 from "./routes/script/delScript";
import route100 from "./routes/script/batchAddScript"; import route100 from "./routes/script/exportScript";
import route101 from "./routes/script/delScript"; import route101 from "./routes/script/extractAssets";
import route102 from "./routes/script/exportScript"; import route102 from "./routes/script/getScrptApi";
import route103 from "./routes/script/extractAssets"; import route103 from "./routes/script/pollScriptAssets";
import route104 from "./routes/script/getScrptApi"; import route104 from "./routes/script/updateScript";
import route105 from "./routes/script/pollScriptAssets"; import route105 from "./routes/scriptAgent/getPlanData";
import route106 from "./routes/script/updateScript"; import route106 from "./routes/scriptAgent/setPlanData";
import route107 from "./routes/scriptAgent/getPlanData"; import route107 from "./routes/scriptAgent/updateData";
import route108 from "./routes/scriptAgent/setPlanData"; import route108 from "./routes/setting/about/checkUpdate";
import route109 from "./routes/scriptAgent/updateData"; import route109 from "./routes/setting/about/downloadApp";
import route110 from "./routes/setting/about/checkUpdate"; import route110 from "./routes/setting/agentDeploy/agentSetKey";
import route111 from "./routes/setting/about/downloadApp"; import route111 from "./routes/setting/agentDeploy/deployAgentModel";
import route112 from "./routes/setting/agentDeploy/agentSetKey"; import route112 from "./routes/setting/agentDeploy/getAgentDeploy";
import route113 from "./routes/setting/agentDeploy/deployAgentModel"; import route113 from "./routes/setting/dbConfig/clearData";
import route114 from "./routes/setting/agentDeploy/getAgentDeploy"; import route114 from "./routes/setting/dev/getSwitchAiDevTool";
import route115 from "./routes/setting/dbConfig/clearData"; import route115 from "./routes/setting/dev/updateSwitchAiDevTool";
import route116 from "./routes/setting/dev/getSwitchAiDevTool"; import route116 from "./routes/setting/fileManagement/openFolder";
import route117 from "./routes/setting/dev/updateSwitchAiDevTool"; import route117 from "./routes/setting/getTextModel";
import route118 from "./routes/setting/fileManagement/openFolder"; import route118 from "./routes/setting/loginConfig/getUser";
import route119 from "./routes/setting/getTextModel"; import route119 from "./routes/setting/loginConfig/updateUserPwd";
import route120 from "./routes/setting/loginConfig/getUser"; import route120 from "./routes/setting/memoryConfig/delAllMemory";
import route121 from "./routes/setting/loginConfig/updateUserPwd"; import route121 from "./routes/setting/memoryConfig/getMemory";
import route122 from "./routes/setting/memoryConfig/delAllMemory"; import route122 from "./routes/setting/memoryConfig/sureMemory";
import route123 from "./routes/setting/memoryConfig/getMemory"; import route123 from "./routes/setting/promptManage/getPrompt";
import route124 from "./routes/setting/memoryConfig/sureMemory"; import route124 from "./routes/setting/promptManage/updatePrompt";
import route125 from "./routes/setting/promptManage/getPrompt"; import route125 from "./routes/setting/skillManagement/getSkillContent";
import route126 from "./routes/setting/promptManage/updatePrompt"; import route126 from "./routes/setting/skillManagement/getSkillList";
import route127 from "./routes/setting/skillManagement/getSkillContent"; import route127 from "./routes/setting/skillManagement/saveSkillContent";
import route128 from "./routes/setting/skillManagement/getSkillList"; import route128 from "./routes/setting/vendorConfig/addVendor";
import route129 from "./routes/setting/skillManagement/saveSkillContent"; import route129 from "./routes/setting/vendorConfig/addVendorModel";
import route130 from "./routes/setting/vendorConfig/addVendor"; import route130 from "./routes/setting/vendorConfig/deleteVendor";
import route131 from "./routes/setting/vendorConfig/deleteVendor"; import route131 from "./routes/setting/vendorConfig/delVendorModel";
import route132 from "./routes/setting/vendorConfig/enableVendor"; import route132 from "./routes/setting/vendorConfig/enableVendor";
import route133 from "./routes/setting/vendorConfig/getCodeByLink"; import route133 from "./routes/setting/vendorConfig/getCodeByLink";
import route134 from "./routes/setting/vendorConfig/getVendorList"; import route134 from "./routes/setting/vendorConfig/getVendorList";
import route135 from "./routes/setting/vendorConfig/modelTest"; import route135 from "./routes/setting/vendorConfig/modelTest";
import route136 from "./routes/setting/vendorConfig/updateCode"; import route136 from "./routes/setting/vendorConfig/updateCode";
import route137 from "./routes/setting/vendorConfig/updateVendor"; import route137 from "./routes/setting/vendorConfig/updateVendorInputs";
import route138 from "./routes/task/getProject"; import route138 from "./routes/setting/vendorConfig/upVendorModel";
import route139 from "./routes/task/getTaskApi"; import route139 from "./routes/task/getProject";
import route140 from "./routes/task/getTaskCategories"; import route140 from "./routes/task/getTaskApi";
import route141 from "./routes/task/taskDetails"; import route141 from "./routes/task/getTaskCategories";
import route142 from "./routes/test/test"; import route142 from "./routes/task/taskDetails";
import route143 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);
@ -207,84 +208,85 @@ export default async (app: Express) => {
app.use("/api/production/editImage/updateImageFlow", route60); app.use("/api/production/editImage/updateImageFlow", route60);
app.use("/api/production/editImage/uploadImage", route61); app.use("/api/production/editImage/uploadImage", route61);
app.use("/api/production/getFlowData", route62); app.use("/api/production/getFlowData", route62);
app.use("/api/production/getProductionData", route63); app.use("/api/production/getStoryboardData", route63);
app.use("/api/production/getStoryboardData", route64); app.use("/api/production/saveFlowData", route64);
app.use("/api/production/saveFlowData", route65); app.use("/api/production/storyboard/addStoryboard", route65);
app.use("/api/production/storyboard/addStoryboard", route66); app.use("/api/production/storyboard/batchAddStoryboardInfo", route66);
app.use("/api/production/storyboard/batchAddStoryboardInfo", route67); app.use("/api/production/storyboard/batchGenerateImage", route67);
app.use("/api/production/storyboard/batchGenerateImage", route68); app.use("/api/production/storyboard/downPreviewImage", route68);
app.use("/api/production/storyboard/downPreviewImage", route69); app.use("/api/production/storyboard/editStoryboardInfo", route69);
app.use("/api/production/storyboard/editStoryboardInfo", route70); app.use("/api/production/storyboard/getStoryboardData", route70);
app.use("/api/production/storyboard/getStoryboardData", route71); app.use("/api/production/storyboard/pollingImage", route71);
app.use("/api/production/storyboard/pollingImage", route72); app.use("/api/production/storyboard/previewImage", route72);
app.use("/api/production/storyboard/previewImage", route73); app.use("/api/production/storyboard/removeFrame", route73);
app.use("/api/production/storyboard/removeFrame", route74); app.use("/api/production/storyboard/updateStoryboardUrl", route74);
app.use("/api/production/storyboard/updateStoryboardUrl", route75); app.use("/api/production/workbench/addTrack", route75);
app.use("/api/production/workbench/addTrack", route76); app.use("/api/production/workbench/deleteTrack", route76);
app.use("/api/production/workbench/deleteTrack", route77); app.use("/api/production/workbench/delVideo", route77);
app.use("/api/production/workbench/delVideo", route78); app.use("/api/production/workbench/generateVideo", route78);
app.use("/api/production/workbench/generateVideo", route79); app.use("/api/production/workbench/generateVideoPrompt", route79);
app.use("/api/production/workbench/generateVideoPrompt", route80); app.use("/api/production/workbench/getGenerateData", route80);
app.use("/api/production/workbench/getGenerateData", route81); app.use("/api/production/workbench/getVideoList", route81);
app.use("/api/production/workbench/getVideoList", route82); app.use("/api/production/workbench/selectVideo", route82);
app.use("/api/production/workbench/getVideoModelDetail", route83); app.use("/api/production/workbench/updateVideoPrompt", route83);
app.use("/api/production/workbench/selectVideo", route84); app.use("/api/project/addDirectorManual", route84);
app.use("/api/production/workbench/updateVideoPrompt", route85); app.use("/api/project/addProject", route85);
app.use("/api/project/addDirectorManual", route86); app.use("/api/project/addVisualManual", route86);
app.use("/api/project/addProject", route87); app.use("/api/project/deleteDirectorManual", route87);
app.use("/api/project/addVisualManual", route88); app.use("/api/project/deleteVisualManual", route88);
app.use("/api/project/deleteDirectorManual", route89); app.use("/api/project/delProject", route89);
app.use("/api/project/deleteVisualManual", route90); app.use("/api/project/editDirectorlManual", route90);
app.use("/api/project/delProject", route91); app.use("/api/project/editProject", route91);
app.use("/api/project/editDirectorlManual", route92); app.use("/api/project/editVisualManual", route92);
app.use("/api/project/editProject", route93); app.use("/api/project/getProject", route93);
app.use("/api/project/editVisualManual", route94); app.use("/api/project/getVisualManual", route94);
app.use("/api/project/getProject", route95); app.use("/api/project/queryDirectorManual", route95);
app.use("/api/project/getVisualManual", route96); app.use("/api/project/visualManual", route96);
app.use("/api/project/queryDirectorManual", route97); app.use("/api/script/addScript", route97);
app.use("/api/project/visualManual", route98); app.use("/api/script/batchAddScript", route98);
app.use("/api/script/addScript", route99); app.use("/api/script/delScript", route99);
app.use("/api/script/batchAddScript", route100); app.use("/api/script/exportScript", route100);
app.use("/api/script/delScript", route101); app.use("/api/script/extractAssets", route101);
app.use("/api/script/exportScript", route102); app.use("/api/script/getScrptApi", route102);
app.use("/api/script/extractAssets", route103); app.use("/api/script/pollScriptAssets", route103);
app.use("/api/script/getScrptApi", route104); app.use("/api/script/updateScript", route104);
app.use("/api/script/pollScriptAssets", route105); app.use("/api/scriptAgent/getPlanData", route105);
app.use("/api/script/updateScript", route106); app.use("/api/scriptAgent/setPlanData", route106);
app.use("/api/scriptAgent/getPlanData", route107); app.use("/api/scriptAgent/updateData", route107);
app.use("/api/scriptAgent/setPlanData", route108); app.use("/api/setting/about/checkUpdate", route108);
app.use("/api/scriptAgent/updateData", route109); app.use("/api/setting/about/downloadApp", route109);
app.use("/api/setting/about/checkUpdate", route110); app.use("/api/setting/agentDeploy/agentSetKey", route110);
app.use("/api/setting/about/downloadApp", route111); app.use("/api/setting/agentDeploy/deployAgentModel", route111);
app.use("/api/setting/agentDeploy/agentSetKey", route112); app.use("/api/setting/agentDeploy/getAgentDeploy", route112);
app.use("/api/setting/agentDeploy/deployAgentModel", route113); app.use("/api/setting/dbConfig/clearData", route113);
app.use("/api/setting/agentDeploy/getAgentDeploy", route114); app.use("/api/setting/dev/getSwitchAiDevTool", route114);
app.use("/api/setting/dbConfig/clearData", route115); app.use("/api/setting/dev/updateSwitchAiDevTool", route115);
app.use("/api/setting/dev/getSwitchAiDevTool", route116); app.use("/api/setting/fileManagement/openFolder", route116);
app.use("/api/setting/dev/updateSwitchAiDevTool", route117); app.use("/api/setting/getTextModel", route117);
app.use("/api/setting/fileManagement/openFolder", route118); app.use("/api/setting/loginConfig/getUser", route118);
app.use("/api/setting/getTextModel", route119); app.use("/api/setting/loginConfig/updateUserPwd", route119);
app.use("/api/setting/loginConfig/getUser", route120); app.use("/api/setting/memoryConfig/delAllMemory", route120);
app.use("/api/setting/loginConfig/updateUserPwd", route121); app.use("/api/setting/memoryConfig/getMemory", route121);
app.use("/api/setting/memoryConfig/delAllMemory", route122); app.use("/api/setting/memoryConfig/sureMemory", route122);
app.use("/api/setting/memoryConfig/getMemory", route123); app.use("/api/setting/promptManage/getPrompt", route123);
app.use("/api/setting/memoryConfig/sureMemory", route124); app.use("/api/setting/promptManage/updatePrompt", route124);
app.use("/api/setting/promptManage/getPrompt", route125); app.use("/api/setting/skillManagement/getSkillContent", route125);
app.use("/api/setting/promptManage/updatePrompt", route126); app.use("/api/setting/skillManagement/getSkillList", route126);
app.use("/api/setting/skillManagement/getSkillContent", route127); app.use("/api/setting/skillManagement/saveSkillContent", route127);
app.use("/api/setting/skillManagement/getSkillList", route128); app.use("/api/setting/vendorConfig/addVendor", route128);
app.use("/api/setting/skillManagement/saveSkillContent", route129); app.use("/api/setting/vendorConfig/addVendorModel", route129);
app.use("/api/setting/vendorConfig/addVendor", route130); app.use("/api/setting/vendorConfig/deleteVendor", route130);
app.use("/api/setting/vendorConfig/deleteVendor", route131); app.use("/api/setting/vendorConfig/delVendorModel", route131);
app.use("/api/setting/vendorConfig/enableVendor", route132); app.use("/api/setting/vendorConfig/enableVendor", route132);
app.use("/api/setting/vendorConfig/getCodeByLink", route133); app.use("/api/setting/vendorConfig/getCodeByLink", route133);
app.use("/api/setting/vendorConfig/getVendorList", route134); app.use("/api/setting/vendorConfig/getVendorList", route134);
app.use("/api/setting/vendorConfig/modelTest", route135); app.use("/api/setting/vendorConfig/modelTest", route135);
app.use("/api/setting/vendorConfig/updateCode", route136); app.use("/api/setting/vendorConfig/updateCode", route136);
app.use("/api/setting/vendorConfig/updateVendor", route137); app.use("/api/setting/vendorConfig/updateVendorInputs", route137);
app.use("/api/task/getProject", route138); app.use("/api/setting/vendorConfig/upVendorModel", route138);
app.use("/api/task/getTaskApi", route139); app.use("/api/task/getProject", route139);
app.use("/api/task/getTaskCategories", route140); app.use("/api/task/getTaskApi", route140);
app.use("/api/task/taskDetails", route141); app.use("/api/task/getTaskCategories", route141);
app.use("/api/test/test", route142); 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) => { async (req, res) => {
const { modelId } = req.body; const { modelId } = req.body;
const [id, name] = modelId.split(":"); const [id, name] = modelId.split(":");
const data = await u.db("o_vendorConfig").where("id", id).andWhere("enable", 1).select("models").first(); const models = await u.vendor.getModelList(id);
if (!data) {
return res.status(404).send({ error: "模型未找到" });
}
const models = JSON.parse(data.models!);
const findData = models.find((i: any) => i.modelName == name); const findData = models.find((i: any) => i.modelName == name);
res.status(200).send(success(findData)); res.status(200).send(success(findData));
}, },

View File

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

View File

@ -1,6 +1,6 @@
import express from "express"; import express from "express";
import u from "@/utils"; import u from "@/utils";
import { base64, z } from "zod"; import { z } from "zod";
import { success } from "@/lib/responseFormat"; import { success } from "@/lib/responseFormat";
import { validateFields } from "@/middleware/middleware"; import { validateFields } from "@/middleware/middleware";
import axios from "axios"; import axios from "axios";
@ -28,8 +28,13 @@ export default router.post(
const imageClass = await u.Ai.Image(model).run( const imageClass = await u.Ai.Image(model).run(
{ {
prompt: prompt, prompt: prompt,
referenceList: referenceList: await (async () => {
references && references.length ? await Promise.all(references.map((url: string) => ({ type: "image", base64: urlToBase64(url) }))) : [], 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, size: quality,
aspectRatio: ratio, 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("项目未配置视频模型")); return res.status(400).json(success("项目未配置视频模型"));
} }
const [videoId, videoModelName] = projectData.videoModel.split(":"); const [videoId, videoModelName] = projectData.videoModel.split(":");
const vendorData = await u.db("o_vendorConfig").where("id", videoId).select("models").first(); const models = await u.vendor.getModelList(videoId);
const models = JSON.parse(vendorData!.models!);
const findData = models.find((i: any) => i.modelName == videoModelName); const findData = models.find((i: any) => i.modelName == videoModelName);
const isRef = findData.mode.every((i: any) => Array.isArray(i)); 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(); const router = express.Router();
export default router.post("/", async (req, res) => { 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)); res.status(200).send(success(data));
}); });

View File

@ -80,7 +80,14 @@ export default router.post(
let detail = issue.message; let detail = issue.message;
if (issue.code === "invalid_union") { 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) { if (unionDetails.length > 0) {
detail = `${issue.message}${unionDetails.join("")}`; 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不能包含英文冒号")); 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(); const data = await u.db("o_vendorConfig").where("id", vendor.id).first();
if (data) return res.status(500).send(error("供应商id已存在")); 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, 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 ?? {}), inputValues: JSON.stringify(vendor.inputValues ?? {}),
models: JSON.stringify(vendor.models ?? []), models: JSON.stringify([]),
createTime: Date.now(),
enable: vendor.id == "toonflow" ? 1 : 0, enable: vendor.id == "toonflow" ? 1 : 0,
}); });
u.vendor.writeCode(vendor.id, tsCode);
res.status(200).send(success(result.data)); 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) => { async (req, res) => {
const { id, enable } = req.body; const { id, enable } = req.body;
await u.db("o_vendorConfig").where("id", id).update({ await u.db("o_vendorConfig").where("id", id).update({ enable });
enable,
});
res.status(200).send(success("更新成功")); 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 data = await u.db("o_vendorConfig").select("*");
const list = await Promise.all( const list = await Promise.all(
data.map(async (item) => ({ data.map(async (item) => {
...item, const vendor = u.vendor.getVendor(item.id!);
inputValues: JSON.parse(item.inputValues ?? "{}"), return {
models: await u.vendor.getModelList(item.id!), ...item,
code: u.vendor.getCode(item.id!), inputValues: JSON.parse(item.inputValues ?? "{}"),
description: u.vendor.getVendor(item.id!).description, models: await u.vendor.getModelList(item.id!),
inputs: u.vendor.getVendor(item.id!).inputs, code: u.vendor.getCode(item.id!),
author: u.vendor.getVendor(item.id!).author, description: vendor.description,
name: u.vendor.getVendor(item.id!).name, 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)); res.status(200).send(success(list));
}); });

View File

@ -25,7 +25,7 @@ export default router.post(
modelData: { modelData: {
prompt: prompt:
"一张16:9比例的图片完美等分为2x2四宫格布局各区域无缝衔接\n左上宫格一只可爱的猫毛发蓬松眼睛明亮姿态俏皮\n右上宫格一只友善的狗金毛犬表情愉悦摇着尾巴\n左下宫格一头健壮的牛田园背景目光温和皮毛光泽\n右下宫格一匹骏马姿态优雅鬃毛飘逸肌肉健美\n风格要求四个宫格风格统一色彩鲜艳饱和高清画质细节清晰锐利专业插画风格线条干净统一的左上方光源柔和阴影和谐配色卡通/半写实风格,宫格间用白色或浅灰细线分隔", //图片提示词 "一张16:9比例的图片完美等分为2x2四宫格布局各区域无缝衔接\n左上宫格一只可爱的猫毛发蓬松眼睛明亮姿态俏皮\n右上宫格一只友善的狗金毛犬表情愉悦摇着尾巴\n左下宫格一头健壮的牛田园背景目光温和皮毛光泽\n右下宫格一匹骏马姿态优雅鬃毛飘逸肌肉健美\n风格要求四个宫格风格统一色彩鲜艳饱和高清画质细节清晰锐利专业插画风格线条干净统一的左上方光源柔和阴影和谐配色卡通/半写实风格,宫格间用白色或浅灰细线分隔", //图片提示词
imageBase64: [], //输入的图片提示词 referenceList: [], //输入的图片提示词
size: "1K", // 图片尺寸 size: "1K", // 图片尺寸
aspectRatio: "16:9", aspectRatio: "16:9",
}, },
@ -48,7 +48,7 @@ export default router.post(
aspectRatio: "16:9", aspectRatio: "16:9",
prompt: 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.", "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, audio: false,
mode: "text", 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") .db("o_vendorConfig")
.where("id", id) .where("id", id)
.update({ .update({
author: vendor.author,
description: vendor.description || "",
name: vendor.name,
icon: vendor.icon || "",
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 ?? []),
createTime: Date.now(),
}); });
u.vendor.upCode(id, tsCode); u.vendor.writeCode(id, tsCode);
res.status(200).send(success(result.data)); res.status(200).send(success(result.data));
} catch (err) { } 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 { export interface memories {
@ -201,17 +201,10 @@ export interface o_user {
'password'?: string | null; 'password'?: string | null;
} }
export interface o_vendorConfig { export interface o_vendorConfig {
'author'?: string | null;
'code'?: string | null;
'createTime'?: number | null;
'description'?: string | null;
'enable'?: number | null; 'enable'?: number | null;
'icon'?: string | null;
'id'?: string; 'id'?: string;
'inputs'?: string | null;
'inputValues'?: string | null; 'inputValues'?: string | null;
'models'?: string | null; 'models'?: string | null;
'name'?: string | null;
} }
export interface o_video { export interface o_video {
'errorReason'?: string | null; '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 }; type ReferenceList = { type: "image"; base64: string } | { type: "audio"; base64: string } | { type: "video"; base64: string };
interface ImageConfig { interface ImageConfig {
@ -159,6 +168,7 @@ class AiImage {
const modelName = await resolveModelName(this.key); const modelName = await resolveModelName(this.key);
const exec = async (mn: `${string}:${string}`) => { const exec = async (mn: `${string}:${string}`) => {
const fn = await getVendorTemplateFn("imageRequest", mn); const fn = await getVendorTemplateFn("imageRequest", mn);
await referenceList2imageBase642(mn.split(":")[0], input);
this.result = await fn(input); this.result = await fn(input);
if (this.result.startsWith("http")) this.result = await urlToBase64(this.result); if (this.result.startsWith("http")) this.result = await urlToBase64(this.result);
return this; return this;
@ -202,6 +212,7 @@ class AiVideo {
const modelName = await resolveModelName(this.key); const modelName = await resolveModelName(this.key);
const exec = async (mn: `${string}:${string}`) => { const exec = async (mn: `${string}:${string}`) => {
const fn = await getVendorTemplateFn("videoRequest", mn); const fn = await getVendorTemplateFn("videoRequest", mn);
await referenceList2imageBase642(mn.split(":")[0], input);
this.result = await fn(input); this.result = await fn(input);
if (this.result.startsWith("http")) this.result = await urlToBase64(this.result); if (this.result.startsWith("http")) this.result = await urlToBase64(this.result);
return this; return this;
@ -226,6 +237,7 @@ class AiAudio {
const modelName = await resolveModelName(this.key); const modelName = await resolveModelName(this.key);
const exec = async (mn: `${string}:${string}`) => { const exec = async (mn: `${string}:${string}`) => {
const fn = await getVendorTemplateFn("ttsRequest", mn); const fn = await getVendorTemplateFn("ttsRequest", mn);
await referenceList2imageBase642(mn.split(":")[0], input);
this.result = await fn(input); this.result = await fn(input);
if (this.result.startsWith("http")) this.result = await urlToBase64(this.result); if (this.result.startsWith("http")) this.result = await urlToBase64(this.result);
return this; return this;

View File

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

View File

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