常州公司做网站的流程,c 企业网站开发,介绍国外的网站有什么不同,自建网络商城MusePublic艺术创作引擎VSCode插件开发#xff1a;艺术创作辅助工具 1. 引言 如果你是一名前端开发者#xff0c;同时又对AI艺术创作感兴趣#xff0c;有没有想过把这两件事结合起来#xff1f;比如#xff0c;在你最熟悉的代码编辑器里#xff0c;直接调用MusePublic艺…MusePublic艺术创作引擎VSCode插件开发艺术创作辅助工具1. 引言如果你是一名前端开发者同时又对AI艺术创作感兴趣有没有想过把这两件事结合起来比如在你最熟悉的代码编辑器里直接调用MusePublic艺术创作引擎一边写代码一边就能生成和调整艺术作品。听起来是不是挺酷的这就是我们今天要聊的为MusePublic艺术创作引擎开发一个VSCode插件。你可能用过MusePublic的Web界面操作简单出图效果也不错。但如果你经常需要批量生成特定风格的图片或者想把艺术创作流程嵌入到自己的开发工作流里一个独立的Web应用可能就不太够用了。在VSCode里直接集成意味着你可以用代码来控制创作可以保存和复用复杂的参数组合甚至可以把生成图片的步骤写成脚本自动化执行。这篇文章就是带你从零开始一步步实现这个想法。我会假设你有一些前端和JavaScript的基础但没怎么接触过VSCode插件开发。没关系整个过程就像搭积木我们会从最简单的“Hello World”插件开始慢慢加上调用MusePublic API的功能最后做出一个能看、能用的创作面板。你不用太担心复杂的概念我会尽量用大白话把每一步讲清楚并且提供可以直接运行的代码。我们的目标是看完这篇文章你不仅能做出这个插件还能掌握VSCode插件开发的基本套路以后想给其他工具做扩展也能举一反三。好了我们开始吧。2. 开发环境与项目初始化万事开头难但第一步往往是最简单的。我们先来把开发环境准备好创建一个最基础的插件项目。2.1 环境准备你需要准备两样东西Node.js和npm这是现代前端开发的基础。去Node.js官网下载并安装最新LTS版本就行安装时会自动带上npm。Visual Studio Code这个不用说你肯定已经有了。我们就在它里面开发它自己的插件。安装好后打开终端命令行分别输入node -v和npm -v如果能看到版本号说明安装成功。2.2 使用Yeoman脚手架创建项目VSCode官方提供了一个非常方便的工具叫Yeoman生成器可以一键生成插件项目的骨架代码。我们不用自己从零配置。首先在终端里全局安装Yeoman和VSCode的插件生成器npm install -g yo generator-code安装完成后找一个你喜欢的文件夹在终端里进入这个文件夹然后运行yo code这时候命令行会进入一个交互式的创建流程你需要回答几个问题What type of extension do you want to create?(你想创建什么类型的扩展) 选择New Extension (TypeScript)。用TypeScript写代码会有更好的提示和类型检查对新手更友好。Whats the name of your extension?(你的扩展叫什么名字) 输入muse-public-helper或者你喜欢的任何名字。Whats the identifier of your extension?(扩展的标识符是什么) 直接按回车用默认的就行。Whats the description of your extension?(扩展的描述是什么) 可以输入“A VSCode extension to interact with MusePublic Art Engine”。Initialize a git repository?(初始化一个git仓库吗) 建议选Yes方便版本管理。Which package manager to use?(使用哪个包管理器) 选择npm。回答完问题后生成器会自动创建一大堆文件。别被吓到大部分文件我们暂时都不用管。核心的文件就几个我们后面会慢慢说。2.3 初始项目结构速览用VSCode打开刚刚生成的这个项目文件夹你会看到类似这样的结构muse-public-helper/ ├── .vscode/ # VSCode针对本项目的配置 ├── src/ │ └── extension.ts # 插件的入口文件所有逻辑的起点 ├── package.json # 插件的“身份证”和说明书最重要 ├── tsconfig.json # TypeScript的编译配置 └── ... (其他配置文件)现在我们先来试试这个“空壳”插件能不能跑起来。按下F5键或者点击VSCode的“运行”菜单 - “启动调试”。这会启动一个全新的、标题为“扩展开发宿主”的VSCode窗口。这个窗口里就运行着你刚刚创建的插件。在新窗口里按下CtrlShiftP(Windows/Linux) 或CmdShiftP(Mac) 打开命令面板输入Hello World你应该能看到一个名为“Hello World”的命令。选择它屏幕右下角会弹出一个提示框写着“Hello World from muse-public-helper!”。恭喜你的第一个VSCode插件已经成功运行了。虽然它现在还只会打招呼但我们已经迈出了最关键的一步。接下来我们就让这个插件和MusePublic说上话。3. 连接MusePublic引擎API调用基础我们的插件不能只是个摆设它得真能干点活。核心任务就是和MusePublic艺术创作引擎通信告诉它我们想要什么图然后拿到它生成的图片。这个过程靠的就是API调用。3.1 理解MusePublic的API简单来说API就是一个约定好的“对话方式”。我们按照MusePublic规定的格式比如用HTTP请求发送一段JSON数据把我们的创作要求提示词、风格、尺寸等发过去MusePublic的服务器处理完后会把生成好的图片地址或者数据发回来。为了模拟这个过程我们首先需要一个能接收请求并返回模拟数据的“假服务器”。在真实开发中你需要替换成MusePublic引擎部署后提供的真实API地址。我们先在项目里创建一个简单的模拟模块。在src目录下新建一个文件叫mockApi.ts// src/mockApi.ts // 这是一个模拟的MusePublic API客户端用于开发和测试 export interface GenerationRequest { prompt: string; // 正向提示词描述你想要什么 negativePrompt?: string; // 反向提示词描述你不想要什么 steps?: number; // 生成步数影响细节和耗时 cfgScale?: number; // 提示词相关性值越大越贴近描述 width?: number; // 图片宽度 height?: number; // 图片高度 seed?: number; // 随机种子相同种子产生相同图片 } export interface GenerationResponse { success: boolean; imageUrl?: string; // 生成图片的访问地址 error?: string; } // 模拟API调用函数 export async function callMusePublicAPI(request: GenerationRequest): PromiseGenerationResponse { console.log(模拟调用MusePublic API参数, request); // 模拟网络延迟 await new Promise(resolve setTimeout(resolve, 1500)); // 这里模拟一个成功的响应 // 在实际开发中这里应该是一个真实的HTTP请求例如 // const response await fetch(http://your-muse-public-server/api/generate, { method: POST, body: JSON.stringify(request) }); // return await response.json(); return { success: true, imageUrl: https://picsum.photos/seed/${request.seed || Date.now()}/${request.width || 512}/${request.height || 512} // 使用一个随机图片服务来模拟生成的图片真实情况应返回MusePublic引擎生成的图片URL或Base64数据 }; }这个模拟函数会“假装”去调用API等1.5秒后返回一个假的图片URL。这能让我们在不依赖真实后端的情况下先把前端的逻辑跑通。3.2 在插件中调用模拟API现在我们要在插件的主逻辑里使用这个模拟API。打开src/extension.ts文件这是插件的“大脑”。我们把原来那个只会说“Hello World”的命令改成一个能调用API生成图片的命令。找到activate函数里面注册命令的地方修改它// src/extension.ts import * as vscode from vscode; import { callMusePublicAPI, GenerationRequest } from ./mockApi; // 导入我们的模拟API export function activate(context: vscode.ExtensionContext) { // 原来的Hello World命令我们把它改掉 let disposable vscode.commands.registerCommand(muse-public-helper.generateImage, async () { // 1. 先弹出一个输入框让用户输入提示词 const userPrompt await vscode.window.showInputBox({ placeHolder: 请输入描述画面的提示词例如一位未来感的赛博朋克少女霓虹灯光, prompt: 提示词将发送给MusePublic引擎用于生成图像 }); // 如果用户什么都没输入就取消了直接返回 if (!userPrompt) { return; } // 2. 显示一个“正在处理”的提示因为API调用需要时间 vscode.window.withProgress({ location: vscode.ProgressLocation.Notification, title: MusePublic 正在创作..., cancellable: false }, async (progress) { // 准备请求参数 const request: GenerationRequest { prompt: userPrompt, steps: 30, cfgScale: 7.5, width: 512, height: 768, seed: Math.floor(Math.random() * 1000000) // 随机种子 }; // 3. 调用我们的模拟API const result await callMusePublicAPI(request); // 4. 处理结果 if (result.success result.imageUrl) { vscode.window.showInformationMessage(图片生成成功种子: ${request.seed}); // 这里先简单地在控制台打印出URL下一步我们会展示图片 console.log(生成的图片URL:, result.imageUrl); } else { vscode.window.showErrorMessage(生成失败: ${result.error || 未知错误}); } }); }); context.subscriptions.push(disposable); }同时我们需要更新package.json文件给这个新命令起一个用户能看到的名字。找到contributes.commands部分修改它// package.json (部分) contributes: { commands: [ { command: muse-public-helper.generateImage, title: MusePublic: 生成艺术图像 } ] }好了现在再次按下F5启动调试。在新的扩展开发宿主窗口里打开命令面板(CtrlShiftP)输入“MusePublic”你应该能看到我们刚创建的“MusePublic: 生成艺术图像”命令。运行这个命令输入一段描述比如“星空下的独角兽”。你会先看到一个“正在创作”的提示稍等片刻后会弹出成功消息并且在VSCode的“调试控制台”里看到打印出的模拟图片URL。到这一步通信的桥梁已经搭好了。虽然图片还没显示出来但我们已经成功在插件里发起了“创作请求”。接下来我们要给这个插件做个脸面——一个能展示图片和调整参数的用户界面。4. 构建插件用户界面Webview面板光在后台调用API还不够一个好用的工具需要直观的界面。在VSCode插件里我们可以用Webview来创建自定义的界面它本质上是一个内嵌的浏览器页面可以用HTML、CSS和JavaScript来构建。4.1 创建Webview面板我们要创建一个侧边栏面板专门用来进行艺术创作。在src目录下新建一个文件MusePublicPanel.ts用来管理这个面板// src/MusePublicPanel.ts import * as vscode from vscode; import { callMusePublicAPI, GenerationRequest } from ./mockApi; export class MusePublicPanel { public static currentPanel: MusePublicPanel | undefined; private readonly _panel: vscode.WebviewPanel; private _disposables: vscode.Disposable[] []; // 私有构造函数通过静态方法创建 private constructor(panel: vscode.WebviewPanel, extensionUri: vscode.Uri) { this._panel panel; // 设置Webview的HTML内容 this._panel.webview.html this._getHtmlForWebview(); // 监听Webview发来的消息 this._setWebviewMessageListener(); // 监听面板关闭事件进行清理 this._panel.onDidDispose(() this.dispose(), null, this._disposables); } // 创建或显示面板的静态方法 public static createOrShow(extensionUri: vscode.Uri) { // 如果已经存在直接显示并返回 if (MusePublicPanel.currentPanel) { MusePublicPanel.currentPanel._panel.reveal(vscode.ViewColumn.Beside); return; } // 否则创建新的面板 const panel vscode.window.createWebviewPanel( musePublicArt, // 内部标识 MusePublic 艺术创作, // 面板标题 vscode.ViewColumn.Beside, // 在侧边栏显示 { enableScripts: true, // 启用JavaScript retainContextWhenHidden: true, // 隐藏时保持状态 } ); MusePublicPanel.currentPanel new MusePublicPanel(panel, extensionUri); } // 生成Webview的HTML内容 private _getHtmlForWebview(): string { return !DOCTYPE html html langen head meta charsetUTF-8 meta nameviewport contentwidthdevice-width, initial-scale1.0 titleMusePublic创作面板/title style body { font-family: var(--vscode-font-family); padding: 20px; color: var(--vscode-foreground); background-color: var(--vscode-editor-background); } .container { max-width: 800px; margin: 0 auto; } h1 { color: var(--vscode-textLink-foreground); border-bottom: 1px solid var(--vscode-panel-border); padding-bottom: 10px; } .form-group { margin-bottom: 15px; } label { display: block; margin-bottom: 5px; font-weight: bold; } textarea, input, select { width: 100%; padding: 8px; box-sizing: border-box; background-color: var(--vscode-input-background); color: var(--vscode-input-foreground); border: 1px solid var(--vscode-input-border); border-radius: 2px; } textarea { min-height: 80px; resize: vertical; } .button-group { display: flex; gap: 10px; margin-top: 20px; } button { padding: 10px 20px; background-color: var(--vscode-button-background); color: var(--vscode-button-foreground); border: none; border-radius: 2px; cursor: pointer; flex: 1; } button:hover { background-color: var(--vscode-button-hoverBackground); } button:disabled { opacity: 0.5; cursor: not-allowed; } #generateBtn { background-color: var(--vscode-button-background); } #imageContainer { margin-top: 30px; text-align: center; } #generatedImage { max-width: 100%; max-height: 500px; border: 1px solid var(--vscode-panel-border); border-radius: 4px; display: none; /* 初始隐藏 */ } #status { margin-top: 10px; padding: 10px; border-radius: 4px; display: none; } .status-success { background-color: var(--vscode-inputValidation-infoBackground); border: 1px solid var(--vscode-inputValidation-infoBorder); } .status-error { background-color: var(--vscode-inputValidation-errorBackground); border: 1px solid var(--vscode-inputValidation-errorBorder); } /style /head body div classcontainer h1 MusePublic 艺术创作/h1 p输入你的创意描述调整参数开始生成专属艺术作品。/p div classform-group label forprompt正向提示词/label textarea idprompt placeholder详细描述你想要的画面例如一位身着汉服的少女站在樱花树下背景是水墨山水唯美风格/textarea /div div classform-group label fornegativePrompt反向提示词可选/label input typetext idnegativePrompt placeholder描述你不希望出现的元素例如丑陋模糊多手指 /div div styledisplay: grid; grid-template-columns: 1fr 1fr; gap: 20px; div classform-group label forsteps生成步数 (20-50):/label input typerange idsteps min20 max50 value30 span idstepsValue30/span /div div classform-group label forcfgScale提示词相关性 (1-20):/label input typerange idcfgScale min1 max20 step0.5 value7.5 span idcfgScaleValue7.5/span /div /div div classbutton-group button idgenerateBtn onclickgenerateImage()开始生成/button button idsaveBtn onclicksaveImage() disabled保存图片/button /div div idimageContainer img idgeneratedImage alt生成的图像 div idstatus/div /div /div script const vscode acquireVsCodeApi(); let currentImageUrl ; // 更新滑块数值显示 document.getElementById(steps).addEventListener(input, function(e) { document.getElementById(stepsValue).textContent e.target.value; }); document.getElementById(cfgScale).addEventListener(input, function(e) { document.getElementById(cfgScaleValue).textContent e.target.value; }); // 生成图片函数 function generateImage() { const prompt document.getElementById(prompt).value; if (!prompt.trim()) { showStatus(请输入提示词, error); return; } const generateBtn document.getElementById(generateBtn); generateBtn.disabled true; generateBtn.textContent 创作中...; showStatus(正在调用MusePublic引擎进行创作请稍候..., info); // 收集参数 const request { prompt: prompt, negativePrompt: document.getElementById(negativePrompt).value, steps: parseInt(document.getElementById(steps).value), cfgScale: parseFloat(document.getElementById(cfgScale).value), width: 512, height: 768, seed: Math.floor(Math.random() * 1000000) }; // 发送消息给扩展后台 vscode.postMessage({ command: generate, data: request }); } // 保存图片函数暂未实现真实保存 function saveImage() { if (currentImageUrl) { vscode.postMessage({ command: saveImage, data: { imageUrl: currentImageUrl } }); } } // 显示状态信息 function showStatus(message, type info) { const statusEl document.getElementById(status); statusEl.textContent message; statusEl.className type error ? status-error : status-success; statusEl.style.display block; } // 处理从扩展后台发来的消息 window.addEventListener(message, event { const message event.data; switch (message.command) { case generationResult: handleGenerationResult(message.data); break; } }); // 处理生成结果 function handleGenerationResult(data) { const generateBtn document.getElementById(generateBtn); const saveBtn document.getElementById(saveBtn); const imageEl document.getElementById(generatedImage); const statusEl document.getElementById(status); generateBtn.disabled false; generateBtn.textContent 开始生成; if (data.success data.imageUrl) { currentImageUrl data.imageUrl; imageEl.src data.imageUrl; imageEl.style.display block; saveBtn.disabled false; showStatus(\图片生成成功种子: \${data.seed || N/A}\, success); } else { showStatus(\生成失败: \${data.error || 未知错误}\, error); } } /script /body /html ; } // 监听Webview发来的消息 private _setWebviewMessageListener() { this._panel.webview.onDidReceiveMessage( async (message) { switch (message.command) { case generate: // 用户点击了生成按钮 const request message.data; // 调用API const result await callMusePublicAPI(request); // 将结果发送回Webview this._panel.webview.postMessage({ command: generationResult, data: { ...result, seed: request.seed } }); break; case saveImage: // 用户点击了保存按钮这里先简单提示 vscode.window.showInformationMessage(保存功能待实现图片URL已记录在控制台。); console.log(待保存的图片URL:, message.data.imageUrl); break; } }, undefined, this._disposables ); } // 清理资源 public dispose() { MusePublicPanel.currentPanel undefined; this._panel.dispose(); while (this._disposables.length) { const disposable this._disposables.pop(); if (disposable) { disposable.dispose(); } } } }这个类做了几件重要的事创建面板createOrShow方法确保只有一个创作面板。生成界面_getHtmlForWebview方法返回一个完整的HTML页面里面有输入框、滑块、按钮和图片展示区域。样式尽量匹配VSCode的主题。双向通信_setWebviewMessageListener方法监听页面里JavaScript发来的消息比如用户点击“生成”然后调用我们的模拟API再把结果发回页面进行展示。4.2 注册面板命令并更新入口现在我们需要修改src/extension.ts注册一个打开这个面板的命令// src/extension.ts (更新后的activate函数) import * as vscode from vscode; import { MusePublicPanel } from ./MusePublicPanel; export function activate(context: vscode.ExtensionContext) { // 注册打开创作面板的命令 let openPanelCommand vscode.commands.registerCommand(muse-public-helper.openPanel, () { MusePublicPanel.createOrShow(context.extensionUri); }); // 保留或移除之前的简单生成命令这里我们注释掉旧的用新的面板 // let disposable vscode.commands.registerCommand(muse-public-helper.generateImage, async () { ... }); context.subscriptions.push(openPanelCommand); }同样更新package.json中的命令配置并添加一个更显眼的“视图”容器会在VSCode活动栏显示一个图标// package.json (更新部分) contributes: { commands: [ { command: muse-public-helper.openPanel, title: 打开MusePublic创作面板, icon: $(paintcan) // 使用VSCode内置的图标 } ], viewsContainers: { activitybar: [ { id: muse-public-sidebar, title: MusePublic, icon: $(paintcan) } ] }, views: { muse-public-sidebar: [ { type: webview, id: musePublicArtView, name: 艺术创作 } ] } }再次按下F5运行。这次你会在VSCode左侧的活动栏就是放着资源管理器、搜索、Git的那个竖条看到一个油漆桶图标。点击它或者在命令面板输入“打开MusePublic创作面板”一个功能完整的创作界面就会出现在侧边栏试着输入一些提示词调整下滑块点击“开始生成”。稍等片刻你就能看到一张“生成”的图片虽然目前还是来自模拟的随机图片服务。界面会显示状态生成成功后“保存图片”按钮也会亮起。一个可视化创作工具的雏形已经诞生了。5. 功能增强与调试技巧基础功能有了但要让插件真正好用我们还得打磨一下。这里介绍几个实用的增强功能和调试方法。5.1 添加快捷参数预设每次都手动调整步数、相关性挺麻烦的。我们可以加几个“一键预设”按钮比如“快速草图”、“精细刻画”、“艺术创作”。首先在Webview的HTML里_getHtmlForWebview方法中按钮组后面添加预设按钮!-- 在 .button-group 的div后面添加 -- div classform-group label快速预设/label div styledisplay: flex; gap: 10px; margin-top: 5px; button onclickapplyPreset(quick) styleflex: none;快速草图/button button onclickapplyPreset(detailed) styleflex: none;精细刻画/button button onclickapplyPreset(artistic) styleflex: none;艺术创作/button /div /div然后在页面的script标签里添加对应的JavaScript函数function applyPreset(type) { const stepsSlider document.getElementById(steps); const cfgSlider document.getElementById(cfgScale); switch(type) { case quick: stepsSlider.value 20; cfgSlider.value 6; break; case detailed: stepsSlider.value 40; cfgSlider.value 8; break; case artistic: stepsSlider.value 30; cfgSlider.value 10; break; } // 触发input事件以更新显示值 stepsSlider.dispatchEvent(new Event(input)); cfgSlider.dispatchEvent(new Event(input)); showStatus(已应用“${type}”预设, success); }5.2 实现图片保存到本地之前的保存按钮只是个摆设。现在我们来实现它将生成的图片保存到用户选择的位置。我们需要在扩展后台MusePublicPanel.ts的_setWebviewMessageListener中处理saveImage命令// 在 _setWebviewMessageListener 的 switch-case 中添加 saveImage 的处理 case saveImage: const imageUrl message.data.imageUrl; if (imageUrl) { // 1. 让用户选择保存位置 const options: vscode.SaveDialogOptions { filters: { Images: [png, jpg, jpeg] }, defaultUri: vscode.Uri.file(muse_art_${Date.now()}.png) }; const saveUri await vscode.window.showSaveDialog(options); if (saveUri) { try { // 2. 获取图片数据模拟环境下我们直接fetch这个URL真实环境应使用MusePublic返回的数据 const response await fetch(imageUrl); const imageBuffer await response.arrayBuffer(); // 3. 写入文件 await vscode.workspace.fs.writeFile(saveUri, new Uint8Array(imageBuffer)); vscode.window.showInformationMessage(图片已保存至: ${saveUri.fsPath}); } catch (error) { vscode.window.showErrorMessage(保存失败: ${error}); } } } break;注意由于我们的图片URL来自模拟的随机图片服务这个保存功能可以工作。但在连接真实MusePublic API时你需要根据API返回的数据格式可能是Base64字符串或二进制流来调整获取图片数据的逻辑。5.3 插件调试技巧开发过程中难免遇到问题这里有几个调试小技巧使用调试控制台按下F5启动的“扩展开发宿主”窗口其开发者工具控制台是独立于你主VSCode的。你可以在插件代码中使用console.log打印信息然后在这个宿主窗口里按CtrlShiftI(或CmdShiftIon Mac) 打开开发者工具在“Console”标签页查看日志。调试WebviewWebview我们的创作面板本身也是一个网页。在宿主窗口中右键点击面板内容选择“检查”就可以像调试普通网页一样调试它的HTML、CSS和JavaScript。重载插件修改插件代码后不需要关闭宿主窗口。只需在你原来的开发窗口中停止调试ShiftF5然后再次按F5启动。宿主窗口会自动重载最新版本的插件非常方便。查看输出面板在开发窗口的VSCode中打开“输出”面板View - Output选择“Log (Extension Host)”可以看到插件运行时的更详细的日志。6. 总结与后续方向走到这里我们已经完成了一个具备基础功能的MusePublic艺术创作VSCode插件。它有了一个像模像样的界面可以输入提示词、调整参数、调用模拟的生成API、展示结果甚至能把图片保存到本地。整个过程我们从零开始经历了环境搭建、项目创建、API集成、UI构建和功能增强这几个典型的开发阶段。用下来感觉把创作工具集成到开发环境里确实能带来一些不一样的便利。比如你可以很方便地把一组成功的生成参数保存为代码片段或者写个脚本批量生成不同风格的变体。对于需要将AI创作融入特定工作流的前端开发者或技术创作者来说这种方式的灵活性和可编程性比单纯的Web界面要强不少。当然这个插件目前还是个“玩具版”。如果你有兴趣继续完善它下面这几个方向可能会很有意思连接真实后端把mockApi.ts里的模拟函数替换成指向你实际部署的MusePublic引擎的HTTP请求。你需要处理真实的认证、请求格式和响应数据。历史记录与画廊在插件内增加一个面板保存每次生成的图片和对应的参数方便回溯和复用。参数模板与分享允许用户保存多组参数预设比如“赛博朋克风格”、“水墨画风格”甚至可以导出导入方便分享。与编辑器内容联动比如选中编辑器里的一段文字右键菜单直接调用插件生成相关配图。更丰富的模型控制集成MusePublic更多的高级参数如LoRA模型选择、采样器等。开发VSCode插件本身也是一件很有成就感的事你是在为自己和他人创造工具。希望这个简单的教程能帮你打开这扇门。剩下的就交给你的创意和代码了。获取更多AI镜像想探索更多AI镜像和应用场景访问 CSDN星图镜像广场提供丰富的预置镜像覆盖大模型推理、图像生成、视频生成、模型微调等多个领域支持一键部署。