aardio 文档

aardio 范例: lmarena 前沿大模型快速切换工具

import win.ui;
import win.ts;
import fonts.fontAwesome;
import key;
/*DSG{{*/
mainForm = win.form(text="lmarena 前沿大模型快速切换工具";right=1040;bottom=642;bgcolor=0xFFFFFF;border="none")
mainForm.add(
btnCopySystemPrompt={cls="plus";left=814;top=5;right=848;bottom=40;align="left";color=0xFFFFFF;dl=1;dt=1;font=LOGFONT(h=-14);iconStyle={font=LOGFONT(h=-14;name='FontAwesome')};iconText='\uF031';notify=1;paddingLeft=1;paddingRight=1;paddingTop=3;textPadding={left=39;bottom=1};x=0.5;y=0.2;z=10};
chkImage={cls="plus";text="图像";left=717;top=5;right=777;bottom=40;align="left";color=0xFFFFFF;dl=1;dt=1;font=LOGFONT(h=-14);iconStyle={align="left";font=LOGFONT(h=-14;name='FontAwesome')};iconText='\uF0C8 ';notify=1;textPadding={left=21};x=0.5;y=0.2;z=9};
chkSearch={cls="plus";text="联网";left=653;top=4;right=713;bottom=39;align="left";color=0xFFFFFF;dl=1;dt=1;font=LOGFONT(h=-14);iconStyle={align="left";font=LOGFONT(h=-14;name='FontAwesome')};iconText='\uF0C8 ';notify=1;textPadding={left=21};x=0.5;y=0.2;z=8};
nav1={cls="plus";text="Gemini 3 Flash";left=10;top=5;right=148;bottom=40;align="left";color=0xFFFFFF;dl=1;dt=1;font=LOGFONT(h=-14);iconStyle={align="left";font=LOGFONT(h=-14;name='FontAwesome');padding={left=12;top=4}};iconText='\uF1D8';notify=1;paddingLeft=1;paddingRight=1;paddingTop=3;textPadding={left=35;bottom=1};x=0.5;y=0.2;z=5};
nav2={cls="plus";text="Grok 4.20";left=149;top=5;right=265;bottom=40;align="left";color=0xFFFFFF;dl=1;dt=1;font=LOGFONT(h=-14);iconStyle={align="left";font=LOGFONT(h=-14;name='FontAwesome');padding={left=12;top=4}};iconText='\uF121';notify=1;paddingLeft=1;paddingRight=1;paddingTop=3;textPadding={left=35;bottom=1};x=0.5;y=0.2;z=3};
nav3={cls="plus";text="Claude Sonnet 4.5";left=267;top=5;right=429;bottom=40;align="left";color=0xFFFFFF;dl=1;dt=1;font=LOGFONT(h=-14);iconStyle={align="left";font=LOGFONT(h=-14;name='FontAwesome');padding={left=12;top=4}};iconText='\uF11C';notify=1;paddingLeft=1;paddingRight=1;paddingTop=3;textPadding={left=35;bottom=1};x=0.5;y=0.2;z=4};
nav4={cls="plus";text="GPT 5.2";left=429;top=5;right=523;bottom=40;align="left";color=0xFFFFFF;dl=1;dt=1;font=LOGFONT(h=-14);iconStyle={align="left";font=LOGFONT(h=-14;name='FontAwesome');padding={left=12;top=4}};iconText='\uF0E6';notify=1;paddingLeft=1;paddingRight=1;paddingTop=3;textPadding={left=35;bottom=1};x=0.5;y=0.2;z=7};
navReset={cls="plus";left=779;top=5;right=813;bottom=40;align="left";color=0xFFFFFF;dl=1;dt=1;font=LOGFONT(h=-14);iconStyle={font=LOGFONT(h=-14;name='FontAwesome')};iconText='\uF1F8';notify=1;paddingLeft=1;paddingRight=1;paddingTop=3;textPadding={left=39;bottom=1};x=0.5;y=0.2;z=6};
tabPanel={cls="static";left=0;top=40;right=1040;bottom=643;bgcolor=0xFFFFFF;color=0xFFFFFF;db=1;dl=1;dr=1;dt=1;font=LOGFONT(h=-14);z=1};
titleBar={cls="bkplus";left=0;top=0;right=1041;bottom=41;bgcolor=0xE48900;dl=1;dr=1;dt=1;z=2}
)
/*}}*/

import win.ui.tabs;
var tabs = win.ui.tabs( mainForm.nav1,mainForm.nav2,mainForm.nav3,mainForm.nav4);
mainForm.show();

/*自动发现SOCKS5代理{{*/
var knownPorts = { [135] = true; [445] = true;[3389] = true;}
var knownSocks5Ports = function (p) {
    if( knownPorts[p] ) return false;
    if( p < 1080 || p >= 49152 ) return false;

    return (
           (p >= 1080 && p < 1090) 
        || (p >= 7890 && p < 7900) 
        || (p >= 10800 && p < 10810) 
        || (p >= 2080 && p <= 2081) 
        || (p >= 8888 && p <= 8890) 
        || (p == 9050 || p == 9150) 
        || (p == 2334 || p == 10085) 
        || (p == 51837) 
        || (p == 6153)  
        || (p == 20170) 
        || (p == 2801) 
    );
}

import inet.stat;
var stat = inet.stat();
var listeningPorts = table.filter(
    stat.tcp, 
    lambda(conn) 
        conn.state == "LISTENING" 
        && knownSocks5Ports(conn.localPort)
        && (conn.local == "0.0.0.0" || conn.local = "127.0.0.1" || conn.local == "::") 
);

listeningPorts = table.map(listeningPorts,lambda(v) v.localPort );
table.sort(listeningPorts);

var sock5Proxy;
import wsock.tcp.socks5Client; 
for i, port in listeningPorts { 
    if( wsock.tcp.socks5Client.test("127.0.0.1",port)){
         sock5Proxy = "SOCKS5://127.0.0.1:"+port;
         break
    }
}
/*}}*/

/*获取最新版本号{{*/
var edgeProductVersionUpdateTime = time("2026/01/24 00:00:00") ; 
lastEdgeProductVersion = function(){
    if(..time().diffDays(edgeProductVersionUpdateTime)<180){
        return "145.0.3800.70";
    }

    import web.rest.jsonLiteClient;
    var http = ..web.rest.jsonLiteClient();
    var products = http.get("http://edgeupdates.microsoft.com/api/products");
    http.close();

    if(products){ 
        for i,product in ..table.eachIndex(products){
            if(product[["Product"]] == "Stable"){
                var releases = product[["Releases"]]
                var version = releases[1].ProductVersion; 
                if(version){
                    latestEdgeVersion = version;
                    return version;
                }
            }
        }
    }   
}
var latestEdgeVersion = lastEdgeProductVersion();
/*}}*/

//修改浏览器指纹以避免被误伤
var deviceProfile = {
    name = "Android Phone";
    mobile = true;
    platform = "Android";
    platformVersion = "14.0.0";
    majorPlatformVersion = lambda () string.map(owner.platformVersion)[1];
    arch = "";
    bitness = "";
    model = "Pixel 8 Pro";
    acceptLang = "en-US,en;q=0.9";
    locale = "en-US";
    timezone = "America/Los_Angeles";
    width = 412;
    height = 915;
    deviceScaleFactor = 2.625;
    touchPoints = 5;
    hardwareConcurrency = 8;
    deviceMemory = 8; 
    version = latestEdgeVersion;
    majorVersion = lambda () string.map(owner.version)[1];
    userAgent = lambda () "Mozilla/5.0 (Linux; Android "+owner.majorPlatformVersion()+"; Pixel 8 Pro) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/"+owner.version+" Mobile Safari/537.36";
};

import web.view;
var wb = web.view(mainForm.tabPanel,{
    language =  deviceProfile.locale; 
    startArguments = {
        acceptLang =  deviceProfile.acceptLang;
        userAgent = deviceProfile.userAgent();
        proxyServer = sock5Proxy//指定代理服务器
    };
    userDataDir = _STUDIO_INVOKED ? io.appData("/aardio/webview2/user-data/ide/example/lmarena")
})

/*修改浏览器指纹{{*/

// 启用 CDP 的 Emulation 域
wb.cdp("Emulation.enable");

// 启用 CDP 的 Network 域
wb.cdp("Network.enable");

var chromeVersions = [deviceProfile.version]
var nextChromeVersion = function(){
    if(!#chromeVersions) chromeVersions = ["145.0.3800.70",
        "145.0.7632.110",
        "145.0.7632.77" ,
        "144.0.7559.220",
        "144.0.7559.37",
        "144.0.3719.92", 
        "143.0.7499.150", 
        "140.0.7339.80"
    ]

    return table.pop(chromeVersions);
}

var updateDeviceProfile = function(){
deviceProfile.version = nextChromeVersion();

// Client Hints brands 信息
var brands = {
    {brand = "Google Chrome"; version = deviceProfile.majorVersion()};
    {brand = "Chromium"; version = deviceProfile.majorVersion()};
    {brand = "Not_A Brand"; version = "24"};
};

var fullVersionList = {
    {brand = "Google Chrome"; version = deviceProfile.version};
    {brand = "Chromium"; version = deviceProfile.version};
    {brand = "Not_A Brand"; version = "24.0.0.0"};
};

// 设置 User-Agent 和 Client Hints 元数据
wb.cdp("Emulation.setUserAgentOverride", {
    userAgent = deviceProfile.userAgent();
    acceptLanguage = deviceProfile.acceptLang;
    platform = deviceProfile.platform;
    userAgentMetadata = {
        brands = brands;
        fullVersionList = fullVersionList;
        platform = deviceProfile.platform;
        platformVersion = deviceProfile.platformVersion;
        architecture = deviceProfile.arch;
        model = deviceProfile.model;
        mobile = deviceProfile.mobile;
        bitness = deviceProfile.bitness;
        wow64 = false;
    };
});

// 模拟手机设备指标
wb.cdp("Emulation.setDeviceMetricsOverride", { 
    deviceScaleFactor = 2.625; //不会影响页面布局,不要改 width 这些影响布局的字段
    mobile = true; // 声明为移动设备
});

// 设置 HTTP 请求头
var headers = {
    ["Sec-CH-UA"] = '"Google Chrome";v="'+deviceProfile.majorVersion()+'", "Chromium";v="'+deviceProfile.majorVersion()+'", "Not_A Brand";v="24"';
    ["Sec-CH-UA-Mobile"] = deviceProfile.mobile ? "?1" : "?0"; // "?1" 表示 true
    ["Sec-CH-UA-Platform"] = '"' ++ deviceProfile.platform ++ '"'; // 注意平台名称需要用双引号包围
    ["Sec-CH-UA-Platform-Version"] = '"' ++ deviceProfile.platformVersion ++ '"';
    ["Accept-Language"] = deviceProfile.acceptLang;
};

// 可选字段(非空时添加)
if(#deviceProfile.arch > 0){
    headers["Sec-CH-UA-Arch"] = '"' ++ deviceProfile.arch ++ '"';
}

if(#deviceProfile.bitness > 0){
    headers["Sec-CH-UA-Bitness"] = '"' ++ deviceProfile.bitness ++ '"';
}

if(#deviceProfile.model > 0){
    headers["Sec-CH-UA-Model"] = '"' ++ deviceProfile.model ++ '"';
}

wb.cdp("Network.setExtraHTTPHeaders", {
    headers = headers;
});

// 设置语言区域
wb.cdp("Emulation.setLocaleOverride", {
    locale = deviceProfile.locale;
}); 

// 设置时区
wb.cdp("Emulation.setTimezoneOverride", {
    timezoneId = deviceProfile.timezone;
});

// 设置硬件并发数(CPU 核心数)
wb.cdp("Emulation.setHardwareConcurrencyOverride", {
    hardwareConcurrency = deviceProfile.hardwareConcurrency;
});

}

updateDeviceProfile();

// 注入 JavaScript 修改 navigator 属性(覆盖无法通过 CDP 直接修改的指纹)
var jsTemplate  = /**
    Object.defineProperty(navigator, 'deviceMemory', { get: () => %d });
    Object.defineProperty(navigator, 'hardwareConcurrency', { get: () => %d });
    Object.defineProperty(navigator, 'maxTouchPoints', { get: () => %d });
    Object.defineProperty(navigator, 'platform', { get: () => '%s' });
    Object.defineProperty(navigator, 'vendor', { get: () => 'Google Inc.' });
    Object.defineProperty(navigator, 'language', { get: () => '%s' });
    Object.defineProperty(navigator, 'languages', { get: () => ['%s', 'en'] });

    // 覆盖 WebGL 渲染器信息
    const getParameterProxyHandler = {
        apply: function(target, thisArg, args) {
            const param = args[0];
            const gl = thisArg;
            if (param === 37445) return '%s'; // UNMASKED_VENDOR_WEBGL
            if (param === 37446) return '%s'; // UNMASKED_RENDERER_WEBGL
            return Reflect.apply(target, thisArg, args);
        }
    };

    const canvasProto = HTMLCanvasElement.prototype;
    const origGetContext = canvasProto.getContext;
    canvasProto.getContext = function(type, ...args) {
        const ctx = origGetContext.call(this, type, ...args);
        if (ctx && (type === 'webgl' || type === 'webgl2' || type === 'experimental-webgl')) {
            ctx.getParameter = new Proxy(ctx.getParameter, getParameterProxyHandler);
        }
        return ctx;
    };
**/

var jsSource = string.format(jsTemplate,
        deviceProfile.deviceMemory,
        deviceProfile.hardwareConcurrency,
        deviceProfile.touchPoints,
        deviceProfile.mobile ? (deviceProfile.platform == "iOS" ? "iPhone" : "Linux armv8l") : (deviceProfile.platform == "macOS" ? "MacIntel" : "Win32"),
        deviceProfile.locale,
        deviceProfile.locale,
        deviceProfile.mobile ? "Google Inc." : (deviceProfile.platform == "macOS" ? "Apple Inc." : "Google Inc."),
        deviceProfile.mobile ? "Adreno (TM) 740" : (deviceProfile.platform == "macOS" ? "Apple M2 Pro" : "ANGLE (Intel, Intel(R) UHD Graphics 630)")
    );

wb.cdp("Page.addScriptToEvaluateOnNewDocument", {
    Source = jsSource
});
/*}}*/

//订阅 CDP 事件,拦截并自动关闭网页对话框。
wb.cdp("Page.enable");
wb.cdpSubscribe("Page.javascriptDialogOpening",function(dlg){   
    return function(){
        wb.cdp("Page.handleJavaScriptDialog",{accept=true})

        if(tabs.selText=="lmarena"){
            wb.doScript(`document.documentElement.scrollTop = document.documentElement.scrollHeight;`);
        }
    } 
})  

wb.export({
    clearErrorsAndResetSession = function(){
        mainForm.navReset.disabledText = ['\uF254','\uF251','\uF252','\uF253','\uF250']

        mainForm.setTimeout( 
            function(){ 
                mainForm.navReset.oncommand();  
            },500
        )
    };
    tecentLighthouse = function(){
        import process;
        process.openUrl("https://cloud.tencent.com/act/pro/double12-2025#CH")
    };
    mstsc = function(){
        raw.execute("mstsc.exe");
    };
})

wb.onDocumentInit = function(url){
    if(url=="chrome-error://chromewebdata/"){
        return mainForm.setTimeout(
            function(){ wb.html = $"~/lib/web/view/.res/socks-error.html" }
        );  
    }
}

if(!win.ts.session.isRemote()){
    wb.html = $"~/lib/web/view/.res/socks-try.html"
}
else{
    wb.html = "<body style='text-align: center;margin:50px'><progress></progress></body>"
}

//自动选择网页上的 模型 ID,自动关闭 JS/React 对话框。
var selectModel = function(model,chatModality){
    wb.currentAiModel = model;
    wb.currentAiChatModality = chatModality;

    mainForm.chkSearch.disabled = true;
    mainForm.chkImage.disabled = true;
    mainForm.navReset.disabled = true;

    tabs.disabledText = {'\uF254';'\uF251';'\uF252';'\uF253';'\uF250'};
    if(!model) return;

    wb.go("https://arena.ai/?mode=direct",{"chat-modality":chatModality});

    var title = wb.eval("document.title");
    if(title){
        if(string.startsWith(title,"404")){
            wb.cdp("Page.reload");
        }
        elseif(title=="Attention Required! | Cloudflare"){
            wb.html = $"~/lib/web/view/.res/socks-error.html" 

            mainForm.chkSearch.disabled = false;
            mainForm.chkImage.disabled = false;
            mainForm.navReset.disabled = false
            tabs.disabled = false;
            return;
        }
    }

    //跨页面等待指定节点
    wb.waitEle2(`button[type="button"][aria-haspopup="dialog"][aria-expanded="false"],button[role="combobox"][aria-haspopup="dialog"],button[role="combobox"][aria-haspopup="dialog"],button[data-sentry-source-file="model-selector-trigger.tsx"],button[data-sentry-source-file="model-selected.tsx"],button[role="combobox"][data-sentry-source-file="model-dropdown.tsx"]`);

    wb.doScript($"/lmarena-translate.js");

    //点击 `Accept Cookies` 按钮
    wb.waitEle(`//div[@role="dialog"]//button[contains(., "Accept Cookies") or contains(., "Agree")]`
        ,`this.click()`);

    //点击 `Agreen` 按钮(点发送按钮才会弹出)
    wb.doScript(`
(function(){
    let timer = setInterval(() => {
        let path = '//div[@role="dialog"]//button[contains(., "Accept Cookies") or contains(., "Agree")]';
        let accept = document.evaluate(path, document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue;
        if(accept) {
            accept.click();
            clearInterval(timer); // 点击成功后清除定时器
        }
    }, 1000);
})()`);

    //清除已选择的模型
    wb.doScript( `
    const closeButtons = document.querySelectorAll('button[data-sentry-source-file="model-selected.tsx"][data-state="closed"]');

    if (closeButtons.length > 0) { 
        buttonsToClick.forEach((button, index) => { 
            button.click();
        }); 
    } `)

    wb.wait();//等待页面加载,不能省略

    //让网页获得输入焦点
    wb.focus();

    //查找并模拟点击 React 下拉框组件
    wb.waitEle(`button[type="button"][aria-haspopup="dialog"][aria-expanded="false"],button[role="combobox"][aria-haspopup="dialog"],button[data-sentry-source-file="model-selector-trigger.tsx"],button[role="combobox"][data-sentry-source-file="model-dropdown.tsx"]`,`
    this.click();`); //参数 2 指定的 JS 是异步非阴塞回调

    wb.waitEle(`input[placeholder="Search models"]`,`
function selectModelOption(modelName) {
  const options = document.querySelectorAll('[cmdk-item]');
  let targetOption = null;

  for (const option of options) {
    const textElement = option.querySelector('span.truncate');
    if (textElement && textElement.textContent.trim() === modelName) {
      targetOption = option;
      break;
    }
  }

  if (!targetOption) {

    return false;
  }

  const events = ['mousedown', 'mouseup', 'click'];
  events.forEach(eventType => {
    const event = new MouseEvent(eventType, {
      view: window,
      bubbles: true,
      cancelable: true
    });
    targetOption.dispatchEvent(event);
  });

  const nativeInputValueSetter = Object.getOwnPropertyDescriptor(
    window.HTMLElement.prototype,
    'value'
  )?.set;

  if (nativeInputValueSetter) {
    nativeInputValueSetter.call(targetOption, modelName);
    const inputEvent = new Event('input', { bubbles: true });
    targetOption.dispatchEvent(inputEvent);
  }

  return true;
}

selectModelOption('`+model+`'); 
`); 

    thread.delay(200); 

    wb.focus();
    wb.waitEle(`textarea`,`this.focus();
    this.placeholder = "请输入提示词,按 Shift+Enter 换行 ..."
    const modelList = document.querySelector('div[data-sentry-source-file="model-selector-popover.tsx"]');
    if(modelList){
        modelList.style.display="none"
    }

    const dismissButton = document.querySelector('button[aria-label="Dismiss banner"]');
    if (dismissButton) {
        dismissButton.click();
    }
    `);

    tabs.disabledText = null;
    mainForm.chkSearch.disabled = false;
    mainForm.chkImage.disabled = false;
    mainForm.navReset.disabled = false;
}

//切换选项卡回调此函数
tabs.onSelchange = function(idx,tab,form){

    if(mainForm.chkSearch.checked){
        select(idx){
            case 1 {
                selectModel("gemini-3-flash-grounding","search");
            }
            case 2 {

                selectModel("grok-4.20-multi-agent-beta-0309","search");
            }
            case 3 {
                selectModel("claude-sonnet-4-6-search","search"); 
            }
            case 4 {
                selectModel("gpt-5.2-search","search");
            }
        }
    }
    elseif(mainForm.chkImage.checked){
        select(idx){
            case 1 {
                selectModel("gemini-3.1-flash-image-preview (nano-banana-2) [web-search]","image"); 
            }
            case 2 {
                selectModel("flux-2-max","image");
            }
            case 3 {
                selectModel("hunyuan-image-3.0","image");
            }
            case 4 {
                selectModel("gpt-image-2 (medium)","image");
            }
        }
    }
    else{
        select(idx){
            case 1 {
                selectModel("gemini-3-flash");  
            }
            case 2 { 
                selectModel("grok-4.20-beta1");
            }
            case 3 {
                selectModel("claude-sonnet-4-5-20250929-thinking-32k"); 
            }
            case 4 {
                selectModel("gpt-5.2"); 
            }
        }   
    } 
}

mainForm.navReset.oncommand = function(){  
    mainForm.navReset.disabledText = ['\uF254','\uF251','\uF252','\uF253','\uF250']

    updateDeviceProfile();

    /*
    清空网站数据,
    如果对话报错,清空网站数据以后可以解决。
    同时会清空对话记录(网站将对话记录保存在本地)。
    */
    wb.cdp("Storage.clearDataForOrigin",  {
        "origin": "https://lmarena.ai",
        "storageTypes": "all"
        });
    wb.cdp("Storage.clearDataForOrigin",  {
        "origin": "https://arena.ai",
        "storageTypes": "all"
        });
    wb.cdp("Storage.clearCookies" );

    thread.delay(2000);
    mainForm.navReset.disabledText = null;
    wb.cdp("Page.reload");
    if(wb.currentAiModel) selectModel(wb.currentAiModel,wb.currentAiChatModality)
} 

//设置选项卡样式
tabs.skin({
    foreground={
        active=0xFFFFFFFF;
        default=0x00FFFFFF;
        hover=0x38FFFFFF
    };
    color={
        default=0xFFFFFFFF;
    };
    checked={
        foreground={default=0xFFFFFFFF;}; 
        color={default=0xFF42A875;};
    }
})

//为无边框窗口添加标题栏按钮、可拖动缩放的窗体边框等。
import win.ui.simpleWindow;
win.ui.simpleWindow( mainForm );

var onCheckedChanged = function(){  
    if(mainForm.chkSearch.checked){ 
        mainForm.nav1.text = "Gemini 3 Flash";
        mainForm.nav2.text = "Grok 4.20";
        mainForm.nav3.text = "Claude Sonnet 4.6";
        mainForm.nav4.text = "GPT 5.2"; 
    }
    elseif(mainForm.chkImage.checked){
        mainForm.nav1.text = "Banana 2"
        mainForm.nav2.text = "Flux 2 Max";
        mainForm.nav3.text = "Hunyuan 3.0"
        mainForm.nav4.text = "GPT 2"     
    }
    else{
        mainForm.nav1.text = "Gemini 3 Flash";
        mainForm.nav2.text = "Grok 4.20";
        mainForm.nav3.text = "Claude Sonnet 4.5";
        mainForm.nav4.text = "GPT 5.2";     
    } 

    tabs.onSelchange(tabs.selIndex,tabs.selTab,tabs.selForm)
}

mainForm.chkSearch.oncommand = function(id,event){
    if(owner.checked){
        mainForm.chkImage.checked = false;
    }

    onCheckedChanged();
}

mainForm.chkImage.oncommand = function(id,event){
    if(owner.checked){
        mainForm.chkSearch.checked = false;
    }

    onCheckedChanged();
}

mainForm.btnCopySystemPrompt.oncommand = function(id,event){

    var insertSystemPrompt = function(prompt){
        import win.clip;
        var oldCipText = win.clip.read();

        win.clip.write(prompt)

        if(!wb.waitEle(`textarea`,500))  {

            mainForm.msgbox("已复制 aardio 提示词");
            return;
        }

        wb.focus();
        wb.waitEle(`textarea`,"this.focus();",500)

        import key;
        key.combine("CTRL","V")

        if(#oldCipText){
            thread.delay(300);
            win.clip.write(oldCipText)
        }       
    }

    var prompt = ..string.removeBom(string.load("~\doc\guide\ide\system-prompt.md"));
    prompt = string.replace(prompt,"\#\#\s*aardio\s*作者联系方式.*$",'');


    var menuFile = win.ui.popmenu(mainForm);
    menuFile.add(
        "插入 aardio 提示词",
        function(id){
            prompt = prompt + '## 任务\n\n';
            insertSystemPrompt(prompt);
        } 
    ) 

    menuFile.add(
        "插入 aardio 提示词(自绘、小游戏)",
        function(id){
            prompt = prompt + '\n\n## plus 控件自绘示例\n\n```aardio\n' 
            +string.load("~/example/plus/draw/base.aardio")
            + '\n```\n\n## plus 控件自绘小游戏示例\n\n```aardio\n'
            +string.load("~/example/plus/draw/game/trap-the-cat.aardio")+ '\n```\n\n'

            prompt = prompt + '## 任务\n请使用 plus 控件的自绘功能完成以下任务:\n\n';
            insertSystemPrompt(prompt);
        } 
    ) 

    menuFile.add(
        "插入 aardio 提示词(网页前端)",
        function(id){
            prompt = prompt + '\n\n## web.view 示例\n\n在 aardio 开发环境新建 WebView2 窗体的生成的示例代码如下:\n\n```aardio\n' 
            +string.load("~\extensions\wizard\files\webform-blank.aardio")
            + '\n```\n\n'

            prompt = prompt + '## 任务\n\n';
            insertSystemPrompt(prompt);
        } 
    ) 

    var dpiX = mainForm.dpiScale(1);
    var x,y,cx,cy = mainForm.btnCopySystemPrompt.getPos();
    menuFile.popup(x-50*dpiX,y+cy+3*dpiX);
    return;
}

mainForm.chkSearch.skin({
    color={
        active=0xFF00FF00;
        default=0xFFFFFFFF;
        disabled=0xFF42A875;
        hover=0xFFFF0000        
    };
    checked={
        iconText='\uF14A';
        color={
            active=0xFF00FF00;
            default=0xFFFFFFFF;
            disabled=0xFF42A875;
            hover=0xFFFF0000        
        };      
    }
})

mainForm.chkImage.skin({
    color={
        active=0xFF00FF00;
        default=0xFFFFFFFF;
        disabled=0xFF42A875;
        hover=0xFFFF0000        
    };
    checked={
        iconText='\uF14A';
        color={
            active=0xFF00FF00;
            default=0xFFFFFFFF;
            disabled=0xFF42A875;
            hover=0xFFFF0000        
        };      
    }
})

mainForm.navReset.skin({
    foreground={
        active=0xFFFFFFFF;
        default=0x00FFFFFF;
        hover=0x38FFFFFF
    };
    iconColor={
        default=0xFFFFFFFF; 
        active=0xFFCCCCCC; 
        disabled=0xFF42A875;
    };
})

mainForm.btnCopySystemPrompt.skin({
    foreground={
        active=0xFFFFFFFF;
        default=0x00FFFFFF;
        hover=0x38FFFFFF
    };
    iconColor={
        default=0xFFFFFFFF; 
        active=0xFFCCCCCC; 
        disabled=0xFF42A875;
    };
})

var x,y,cx,cy = mainForm.navReset.getPos(true);

import winex.tooltip;
winex.tooltip.balloon("清除会话记录
对话报错点这里重置 / 修复",x+cx/2,y+cy*0.75,7000);

tabs.selIndex = 3;

win.loopMessage();
Markdown 格式