# aardio 范例: Z-Image - AI 图像生成，Hugging Face 接口

```aardio
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();
```