aardio 文档
aardio 范例: Z-Image - AI 图像生成,Hugging Face 接口
import win.ui;
import win.ui.simpleWindow;
import fonts.fontAwesome;
import inet.http; // 必须导入,使 plus 控件支持远程图像 URL
//import gdip.webp; //导入此库 plus 控件自动支持 webp 图像
/*DSG{{*/
var winform = win.form(text="Z-Image - AI 图像生成,Hugging Face 接口";right=1150;bottom=700;bgcolor=0xF5F5F5;border="none")
winform.add(
btnCopy={cls="plus";text="复制图像 / 图像文件";left=921;top=631;right=1110;bottom=680;align="left";bgcolor=0x27AE60;border={radius=6};color=0xFFFFFF;db=1;disabled=1;dr=1;font=LOGFONT(h=-14;weight=600);iconStyle={align="left";font=LOGFONT(h=-14;name='FontAwesome');padding={left=17;top=1}};iconText='\uF0EA';notify=1;textPadding={left=37};z=20};
btnF1={cls="plus";text="AI 重写此软件";left=561;top=538;right=697;bottom=561;align="left";color=0x3498DB;db=1;dr=1;iconStyle={align="left";font=LOGFONT(h=-13;name='FontAwesome')};iconText='\uF121';notify=1;textPadding={left=18};z=25};
btnGenerate={cls="plus";text="生成图像";left=748;top=630;right=908;bottom=679;align="left";bgcolor=0x3498DB;border={radius=6};color=0xFFFFFF;db=1;dr=1;font=LOGFONT(h=-15;weight=600);iconStyle={align="left";font=LOGFONT(h=-16;name='FontAwesome');padding={left=17;top=1}};iconText='\uF1FC';notify=1;textPadding={left=37};z=19};
btnHelp={cls="plus";text="参数说明";left=867;top=341;right=987;bottom=364;align="left";color=0x3498DB;dr=1;dt=1;iconStyle={align="left";font=LOGFONT(h=-13;name='FontAwesome')};iconText='\uF059';notify=1;textPadding={left=18};z=22};
chkRandomSeed={cls="plus";text="随机种子";left=746;top=341;right=849;bottom=366;align="left";color=0x3C3C3C;dr=1;dt=1;font=LOGFONT(h=-13);iconStyle={align="left";font=LOGFONT(h=-15;name='FontAwesome');padding={left=8}};iconText='\uF096';notify=1;textPadding={left=28};z=18};
chkTranslate={cls="plus";text="英文";left=268;top=538;right=342;bottom=563;align="left";color=0x3498DB;db=1;dl=1;font=LOGFONT(h=-13);iconStyle={align="left";font=LOGFONT(h=-15;name='FontAwesome');padding={left=8}};iconText='\uF204';notify=1;textPadding={left=28};z=24};
comboResolution={cls="combobox";left=745;top=120;right=1105;bottom=145;dr=1;dt=1;edge=1;items={"1024x1024 ( 1:1 )","864x1152 ( 3:4 )","1152x864 ( 4:3 )","1248x832 ( 3:2 )","832x1248 ( 2:3 )","1152x896 ( 9:7 )","896x1152 ( 7:9 )","1280x720 ( 16:9 )","720x1280 ( 9:16 )","1344x576 ( 21:9 )","576x1344 ( 9:21 )","1280x1280 ( 1:1 )","1104x1472 ( 3:4 )","1472x1104 ( 4:3 )","1536x1024 ( 3:2 )","1024x1536 ( 2:3 )","1440x1120 ( 9:7 )","1120x1440 ( 7:9 )","1536x864 ( 16:9 )","864x1536 ( 9:16 )","1680x720 ( 21:9 )","720x1680 ( 9:21 )","1536x1536 ( 1:1 )","1296x1728 ( 3:4 )","1728x1296 ( 4:3 )","1872x1248 ( 3:2 )","1248x1872 ( 2:3 )","1728x1344 ( 9:7 )","1344x1728 ( 7:9 )","2048x1152 ( 16:9 )","1152x2048 ( 9:16 )","2016x864 ( 21:9 )","864x2016 ( 9:21 )"};mode="dropdownlist";z=11};
editPrompt={cls="edit";left=30;top=565;right=710;bottom=680;autohscroll=false;bgcolor=0xFFFFFF;db=1;dl=1;dr=1;edge=1;multiline=1;vscroll=1;z=8};
editSeed={cls="edit";text="42";left=745;top=304;right=1105;bottom=329;dr=1;dt=1;edge=1;z=13};
editStep={cls="edit";text="8";left=745;top=181;right=1105;bottom=206;dr=1;dt=1;edge=1;z=15};
editTimeShift={cls="edit";text="3.0";left=745;top=243;right=1105;bottom=268;dr=1;dt=1;edge=1;z=17};
labelResolution={cls="bkplus";text="分辨率 (Resolution):";left=745;top=95;right=900;bottom=115;align="left";color=0x666666;dr=1;dt=1;z=10};
labelSeed={cls="bkplus";text="种子 (Seed):";left=745;top=280;right=900;bottom=300;align="left";color=0x666666;dr=1;dt=1;z=12};
labelSettings={cls="bkplus";text="生成设置";left=745;top=65;right=900;bottom=85;align="left";color=0x999999;dr=1;dt=1;font=LOGFONT(h=-13;weight=600);z=9};
labelTimeShif={cls="bkplus";text="时间偏移 (Time Shift):";left=745;top=218;right=900;bottom=238;align="left";color=0x666666;dr=1;dt=1;z=16};
labelTip={cls="plus";left=767;top=546;right=1069;bottom=597;border={color=0xFF008000;radius=16;width=1};db=1;dr=1;hide=1;z=23};
optimizeLink={cls="plus";text="优化提示词";left=167;top=538;right=269;bottom=561;align="left";color=0x3498DB;db=1;dl=1;iconStyle={align="left";font=LOGFONT(h=-13;name='FontAwesome')};iconText='\uF0D0 ';notify=1;textPadding={left=18};z=21};
picturebox={cls="plus";text="请在下方输入提示词生成图像";left=30;top=57;right=710;bottom=500;border={color=0xFFEEEEEE;radius=8;width=1};color=0x999999;db=1;dl=1;dr=1;dt=1;font=LOGFONT(h=-16);iconStyle={font=LOGFONT(h=-60;name='FontAwesome')};iconText='\uF03E';notify=1;repeat="scale";textPadding={top=100};z=3};
progressBar={cls="plus";left=812;top=382;right=1023;bottom=593;bgcolor=0xECF0F1;border={radius=3};db=1;dr=1;forecolor=0x3498DB;hide=1;z=6};
promptLabel={cls="bkplus";text="提示词 (Prompt):";left=30;top=540;right=200;bottom=560;align="left";color=0x999999;db=1;dl=1;font=LOGFONT(h=-13;weight=600);z=7};
settingsGroup={cls="bkplus";left=730;top=57;right=1120;bottom=612;bgcolor=0xFFFFFF;border=1;db=1;dr=1;dt=1;z=1};
stepsLabel={cls="bkplus";text="步数 (Steps):";left=745;top=157;right=900;bottom=177;align="left";color=0x666666;dr=1;dt=1;z=14};
titleBar={cls="bkplus";left=0;top=0;right=1150;bottom=46;bgcolor=0x2C3E50;dl=1;dr=1;dt=1;z=2};
titleIcon={cls="bkplus";text='\uF03E';left=326;top=6;right=366;bottom=42;color=0x3498DB;dl=1;dt=1;font=LOGFONT(h=-20;name='FontAwesome');z=5};
titleText={cls="bkplus";text="造相(Z-Image Turbo)文生图 HF 接口";left=16;top=10;right=332;bottom=34;color=0xFFFFFF;dl=1;dt=1;font=LOGFONT(h=-16;weight=700);z=4}
)
/*}}*/
// UI 初始化设置
winform.editPrompt.setPadding(5,5,5,5); // 提示词输入框内边距
winform.editPrompt.text = `A cute 3D rendered cat, wearing sunglasses, cyberpunk style, neon lights.`; // 默认提示词
// 分辨率下拉框默认选中项
winform.comboResolution.selText = "1024x1024 ( 1:1 )";
// 生成按钮点击事件
winform.btnGenerate.oncommand = function(){
var prompt = winform.editPrompt.text;
if(!#string.trim(prompt)) {
return winform.msgbox("请输入提示词", "提示", "warn");
}
winform.btnCopy.text = "复制图像 / 图像文件";
winform.btnCopy.iconText = '\uF0EA'
winform.btnCopy.disabled = true; // 生成期间禁止下载
winform.picturebox.imageCreateTime = time();
// 从 UI 控件获取生成参数
var resolution = winform.comboResolution.selText;
var seed = tonumber(winform.editSeed.text) || 42;
var steps = tonumber(winform.editStep.text) || 8;
var timeShift = tonumber(winform.editTimeShift.text) || 3.0;
var randomSeed = winform.chkRandomSeed.checked;
// 更新 UI 状态:禁用按钮,显示加载动画
winform.btnGenerate.disabledText = {'\uF254';'\uF251';'\uF252';'\uF253';'\uF250'}; // 沙漏动画
// 初始化图片框和进度条
winform.picturebox.background = null;
winform.picturebox.iconText = '\uF03E'; // 默认图片图标
winform.picturebox.text = "正在连接 AI 模型...";
// 设置进度条为无限循环模式 (Gradio 具体的进度难以精确获取)
winform.progressBar.startProgress();
// 开启线程调用 Gradio API
thread.invoke(
function(winform, prompt, resolution, seed, steps, timeShift, randomSeed){
import web.rest.gradioClient;
// 创建 Gradio 客户端,参数 1 指定 Hugging Face Space ID
var gradio = web.rest.gradioClient("Tongyi-MAI/Z-Image-Turbo",{
// proxy = "socks=127.0.0.1:1081",// 可选指定代理服务器
// token = "hf_********" // 可选指定 token 以提高配额
});
winform.picturebox.text = "正在生成图像 (需排队)...";
// 调用 Gradio API,参数顺序必须严格对应 API 定义
// [prompt, resolution, seed, steps, shift, random_seed, gallery_images]
var result, err = gradio.xcall.generate({
data = [
prompt, // 提示词
resolution, // 分辨率
seed, // 种子
steps, // 步数
timeShift, // 时间偏移
randomSeed, // 开启随机种子
[] // Gallery (传空数组)
]
});
//不同 Space 的 API 接口与参数定义略有不同,
// 可用下面的方法打印接口可用端点发给 AI 修改
//console.dumpJson( gradio.getInfo() )
// 处理返回结果
var imageInfo = result[[1]][[1]];//直接下标用于 null 值不会报错
if( imageInfo ){
var imageUrl = imageInfo.image.url;
var seedUsed = result[2]; // Gradio API 返回的实际种子
if(imageUrl){
// 设置 plus 控件背景图,界面线程会自动导入 inet.http 支持自动下载远程图片
winform.picturebox.background = imageUrl;
// 清除文字和图标
winform.picturebox.text = null;
winform.picturebox.iconText = null;
// 启用下载按钮
winform.btnCopy.disabled = false;
// 在标题栏提示成功
winform.text = "造相 Z-Image - 生成成功 (Seed: " + seedUsed + ")";
// 如果是随机种子,更新 UI 上的种子输入框为实际使用的种子
if(randomSeed) winform.editSeed.text = tostring(seedUsed);
winform.showTip('已生成图像,双击图像放大。');
}
} else {
winform.msgboxErr(err || "生成图像失败,请检查网络连接或提示词是否符合要求。");
winform.picturebox.text = "生成失败";
winform.picturebox.iconText = '\uF057'; // 错误图标 (FontAwesome circle-xmark)
}
// 恢复 UI 状态
winform.btnGenerate.disabledText = null; // 停止沙漏动画
winform.progressBar.stopProgress(); // 停止进度条
winform.progressBar.hide = true; // 隐藏进度条
}, winform, prompt, resolution, seed, steps, timeShift, randomSeed // 将 UI 控件值作为参数传入线程
);
};
// 下载按钮点击事件
var tempImageDir = io.tmpname();
io.createDir(tempImageDir)
winform.onDestroy = function(){
import fsys;
fsys.delete(tempImageDir);
}
winform.btnCopy.oncommand = function(){
if(winform.picturebox.background){
var filename = (winform.picturebox.imageCreateTime||time()).format("%Y%m%d_%H%M%S.png")
var imagePath = io.joinpath(tempImageDir,filename);
winform.picturebox.background.save(imagePath);
if(winform.btnCopy.text == "打开图像文件"){
raw.explore(imagePath);
winform.showTip('已打开图像');
winform.btnCopy.text = "复制图像 / 图像文件";
winform.btnCopy.iconText = '\uF0EA'
}
else{
import win.clip.bitmap;
win.clip.bitmap.writeHtml(winform.picturebox.background);
import win.clip.file;
win.clip.file.write(imagePath,"move",false);
winform.btnCopy.text = "打开图像文件";
winform.btnCopy.iconText = '\uF1C5';
winform.showTip('已复制图像与图像文件');
}
}
else {
winform.showTip('请先生成图像。');
}
};
winform.showTip = function(str){
winform.labelTip.text = str;
winform.labelTip.show(true);
winform.setTimeout(
function(){
winform.labelTip.show(false);
},5000
)
}
// 应用简单无边框窗口样式(最大化、最小化、关闭按钮等)
win.ui.simpleWindow(winform);
winform.progressBar.setPieRange(0,100);
winform.btnHelp.onMouseClick = function(){
import web.form.simpleMarkdown;
var frmHelp = win.form(text="Z-Image 参数说明";right=580;bottom=644;parent=winform)
var wb = web.form.simpleMarkdown(frmHelp);
var md = /***
简单来说,AI 生成图像的过程,可以想象成一个画家从一团随机的“数字噪音”(像电视没信号时的雪花点)开始,一步步地根据你的“提示词”把它修改成一幅清晰、具体的画。
这几个参数就是用来控制这个“绘画”过程的。
---
### 1. 步数 (Steps)
* **是什么?**
“步数”指的是 AI 从一团噪音中“提炼”出最终图像所经历的**迭代或优化的次数**。每一步,AI 都会根据你的提示词,对图像进行一次去噪和修正,让它离最终目标更近一点。
* **它如何影响图像?**
* **步数太少**:就像画家只画了个草稿。图像可能会模糊、细节缺失、出现奇怪的伪影,或者看起来“没画完”。
* **步数适中**:图像会变得清晰、细节丰富、内容完整。这是质量和速度的平衡点。
* **步数太多**:在达到一定质量后,再增加步数对画质的提升会变得微乎其微(收益递减),但生成时间会显著增加。有时过多的步数甚至可能导致细节“过曝”或不自然。
* **实用建议**
对于像 Z-Image-Turbo 这样的**“加速”模型**,它被特别设计为可以用**非常少**的步数(例如 4-8 步)就能生成高质量的图像。这是它的核心优势。对于其他常规模型,通常需要 20-30 步。所以,在这个软件里,**保持默认的 8 步通常是最佳选择**。
---
### 2. 种子 (Seed)
* **是什么?**
“种子”是一个数字,它决定了 AI 开始绘画前那团**初始“数字噪音”的具体模式**。你可以把它理解为一副扑克牌的“初始排列顺序”。
* **它如何影响图像?**
* **相同的种子 + 相同的提示词 + 相同的设置 = 100% 相同的图像**。
* **不同的种子**,即使其他一切都相同,也会生成一张**构图、角色、姿势等完全不同**的全新图像。
* **实用建议**
* **探索创意时**:勾选“随机种子”(Random Seed),让 AI 每次都给你不同的结果,就像开盲盒一样充满惊喜。
* **优化作品时**:当你生成了一张很喜欢的图,但想微调一下细节(比如把“红色的车”改成“蓝色的车”),就**取消勾选“随机种子”,并使用生成那张图时返回的种子号**。这样,AI 会在保持整体构图和风格不变的情况下,只修改你指定的细节。这是非常强大的功能!
---
### 3. 时间偏移 (Time Shift)
* **是什么?**
这是一个相对更技术的参数,与扩散模型内部的“时间步(timestep)”调度有关。你可以把它想象成一个**精细的调节旋钮**,它影响 AI 在“绘画”的不同阶段(从早期勾勒轮廓到晚期添加细节)如何分配它的“注意力”。
* **它如何影响图像?**
这个参数主要是由模型开发者为了在**极低的步数下**达到最佳效果而调整出来的。对于 Z-Image-Turbo 模型,开发者发现将这个值设置在 `3.0` 左右时,可以在很少的步数内(如 4-8 步)最好地平衡图像的细节和整体结构。偏离这个值可能会导致在低步数下效果变差。
* **实用建议**
对于普通用户来说,**这个参数最好保持默认值 `3.0` 不变**。它不像“步数”和“种子”那样需要经常调整。你可以把它看作是这个模型的“最佳出厂设置”之一。
### 总结
| 参数 | 通俗比喻 | 作用 | 建议 |
| :--- | :--- | :--- | :--- |
| **步数 (Steps)** | 画家绘画的精细度 | 控制图像质量和生成时间 | 使用模型推荐值(如 8) |
| **种子 (Seed)** | 牌局的初始发牌顺序 | 控制图像的随机性和可复现性 | 探索时用“随机”,优化时用“固定” |
| **时间偏移 (Time Shift)** | 引擎的最佳点火时机 | 微调模型在生成过程中的内部行为 | **保持默认值**,无需修改 |
***/
wb.doScript(`window.onWriteEnd = function(){}` )
wb.write(md);
frmHelp.show(3/*_SW_SHOWMAXIMIZED*/);
}
winform.optimizeLink.oncommand = function(id,event){
var prompt = string.trim(winform.editPrompt.text);
if(!#prompt) {
return winform.editPrompt.showWarningTip("请先输入提示词");
}
winform.btnGenerate.disabled = true;
winform.chkTranslate.disabled = true;
winform.btnCopy.disabled = true;
winform.optimizeLink.disabledText = ['\uF254','\uF251','\uF252','\uF253','\uF250']
thread.invoke(
function(winform,prompt){
import web.rest.aiChat;
var aiClient = web.rest.aiChat(
key = '\0\1\96';
url = "https://ai.aardio.com/api/v1/";//接口地址
model = "prompt";
temperature = 0.5;//温度
maxTokens = 1024 //最大回复长度
)
//2. 第二步:创建消息队列,必须在这里保存对话,不然 AI 的回复没有上下文。
//---------------------------------------------------------------------
var msg = web.rest.aiChat.message();
//可调用 msg.system() 函数添加系统提示词。
msg.system(`# 角色
你是一位顶级的 AI 绘画提示词(Prompt)优化师。
# 任务
你的核心任务是分析、重构并优化用户输入的初步提示词,旨在显著提升生成图像的艺术感、细节丰富度和整体质量。
# 工作流程
1. **保持核心意图**:精确理解并保留用户提示词的原始核心创意。
2. **丰富关键细节**:围绕核心创意,从以下至少三个维度进行扩展和具象化:
* **主体细节**:为核心主体增添更具体的特征、服装、表情或动作。
* **环境与背景**:构建一个生动、有故事感的背景环境。
* **光照与氛围**:设定明确的光线(如“清晨柔和的光”、“霓虹灯闪烁的夜晚”)和整体氛围(如“神秘”、“宁静”、“赛博朋克”)。
* **构图与视角**:指定一个有趣的视角(如“特写”、“广角”、“从下往上”)。
* **艺术风格**:定义一种清晰的艺术风格(如“照片级真实感”、“吉卜力动画风格”、“水彩画”)。
3. **提升画质词缀**:添加行业通用的高画质描述词,如 "best quality", "masterpiece", "ultra-detailed"。
# 要求
* 无需解释你的思考过程。
* 请始终用` +(winform.chkTranslate.checked?"英文":"中文")+ `输出回复
# 背景
- 用户当前选择的大模型是 Z-Image-Turbo 。
- 用户当前选择图像分辨率为:`+winform.comboResolution.selText)
//添加用户提示词
msg.prompt( "请优化: " + prompt );
winform.editPrompt.text = "";
var resp,err = aiClient.messages(msg,
function(deltaText,reasoning){
if(deltaText) winform.editPrompt.appendText(deltaText);
}
);
winform.btnGenerate.disabled = false;
winform.btnCopy.disabled = false;
winform.chkTranslate.disabled = false;
winform.optimizeLink.disabledText = null;
},winform,prompt
)
}
winform.picturebox.onMouseDoubleClick = function(wParam,lParam){
if(!winform.picturebox.background){
return winform.msgboxErr("请先生成图像。", "错误");
}
var frmPreview = win.form(text="aardio form";right=757;bottom=466;bgcolor=0xFFFFFF;border="none")
frmPreview.add(
btnClose={cls="close";text="×";left=725;top=3;right=753;bottom=31;bgcolor=0xCC8B94;dr=1;dt=1;font=LOGFONT(h=-21);notify=1;z=2};
picturebox={cls="plus";left=0;top=0;right=758;bottom=467;bgcolor=0xFFFFFF;db=1;dl=1;dr=1;dt=1;foreRepeat="scale";notify=1;repeat="scale";z=1}
)
frmPreview.onActivateApp = function(activated){ if(!activated)frmPreview.close() }
frmPreview.onCancel = function(){ frmPreview.close() }
frmPreview.picturebox.onMouseDoubleClick = function(){ frmPreview.close() }
frmPreview.picturebox.foreground = winform.picturebox.background;
frmPreview.fullscreen()
frmPreview.btnClose.oncommand = function(id,event){
frmPreview.close();
}
frmPreview.btnClose.show(true);
}
// 随机种子复选框样式及默认状态
winform.chkRandomSeed.skin({
color={
default=0xFF3C3C3C;
hover=0xFF0078D4;
active=0xFF005A9E;
disabled=0xFFAAAAAA;
};
checked={ // 选中状态的样式
iconText='\uF046' // Checkmark icon (FontAwesome solid square check)
}
});
winform.chkRandomSeed.checked = true; // 默认开启随机种子
// 生成按钮皮肤设置
winform.btnGenerate.skin({
background={
default=0xFF3498DB; // 蓝色
hover=0xFF2980B9;
active=0xFF1F618D;
disabled=0xFFBDC3C7 // 禁用状态灰色
};
color={
default=0xFFFFFFFF; // 白色文字
disabled=0xFF7F8C8D // 禁用状态深灰色文字
}
});
winform.btnCopy.skin({
background={
default=0xFF27AE60; // 绿色
hover=0xFF229954;
active=0xFF1E8449;
disabled=0xFFBDC3C7 // 禁用状态灰色
};
color={
default=0xFFFFFFFF; // 白色文字
disabled=0xFF7F8C8D // 禁用状态深灰色文字
}
});
winform.btnF1.skin({
color = {
default = 0xFF3498DB;
hover = 0xFF2980B9;
active = 0xFF1F618D;
disabled=0xFFAAAAAA;
}
})
winform.optimizeLink.skin({
color = {
default = 0xFF3498DB;
hover = 0xFF2980B9;
active = 0xFF1F618D;
disabled=0xFFAAAAAA;
}
})
winform.btnHelp.skin({
color = {
default = 0xFF3498DB;
hover = 0xFF2980B9;
active = 0xFF1F618D;
}
})
winform.chkTranslate.skin({
color={
default=0xFF3498DB;
hover=0xFF0078D4;
active=0xFF005A9E;
disabled=0xFFAAAAAA;
};
checked={ // 选中状态的样式
iconText='\uF205';
color={
default=0xFF3498DB;
hover=0xFF0078D4;
active=0xFF005A9E;
disabled=0xFFAAAAAA;
};
}
});
winform.btnF1.oncommand = function(id,event){
winform.show(6/*_SW_MINIMIZE*/);
import ide;
ide.openCode("//调用 Z-Image-Turbo 生图")
thread.delay(200);
var codeEditor = ide.getActiveCodeEditor();
codeEditor.setFocus();
thread.delay(500);
import winex;
var caret = winex.getCaret(codeEditor.hwnd)
if(!caret){
caret = codeEditor.getRect(true);
caret.height = winform.dpiScale(16);
}
import winex.tooltip;
winex.tooltip.balloon("请按 F1 键,AI 助手将自动续写代码",caret.left,caret.bottom,4000);
}
winform.chkTranslate.checked = true;
winform.show();
win.loopMessage();
Markdown 格式