aardio 文档

aardio 范例: AI 聊天界面

import win.ui;
import fonts.fontAwesome;
/*DSG{{*/
var winform = win.form(text="AI 助手";right=900;bottom=600;bgcolor=0xFFFFFF)
winform.add(
btnSend={cls="plus";text="发送";left=790;top=550;right=885;bottom=590;bgcolor=0xFF0078D7;border={radius=4};db=1;dr=1;font=LOGFONT(h=-14);iconStyle={align="left";font=LOGFONT(h=-13;name='FontAwesome');padding={left=15}};iconText='\uF1D8';notify=1;textPadding={left=15};z=3};
customChat={cls="custom";text="聊天区域";left=0;top=0;right=900;bottom=540;db=1;dl=1;dr=1;dt=1;z=1};
editPrompt={cls="edit";left=15;top=550;right=780;bottom=590;db=1;dl=1;dr=1;edge=1;multiline=1;z=2}
)
/*}}*/

//创建 AI 聊天界面
import web.form.chat;
var chatUi = web.form.chat(winform.customChat);
//chatUi.renderPollinationsAsImg = true; 

//添加系统指令
//chatUi.system(``);

/*
// OpenRounter 的 Claude 模式缓存设置示例。
// 如果太短的提示词,缓存不会生效。支持自动缓存的模型不必设置。
chatUi.aardioSystem()
var msg = chatUi.chatMessage[1];
msg.content = [
    {
        "type": "text",
        "text": msg.content ,
        "cache_control": {
            "type": "ephemeral"
        } 
    }
]
*/

var sendApiMessage = function(){
    var prompt = winform.editPrompt.text;

    // 检查输入是否为空(移除首尾空白)
    if(!#string.trim(prompt)){
        winform.editPrompt.setFocus();
        winform.editPrompt.showWarningTip("请输入提示词");
        return;
    }

    // UI 状态变更
    winform.editPrompt.text = ""; // 清空输入
    winform.btnSend.disabled = true; // 禁用按钮防止重复点击

    chatUi.showLoading(" 正在思考...");
    chatUi.prompt(prompt);

    // 创建 AI 对话线程
    thread.invoke( 
        function(chatUi,winform){
            import web.rest.aiChat;

            // 创建 AI API 客户端
            var aiClient = web.rest.aiChat(
                key =   '\0\1\96'; // 替换为你的 Key
                url = "https://ai.aardio.com/api/v1/";
                model = "test-model-id"; // 替换为实际模型名称
                temperature = 0.5;
            )

            // 调用接口
            var ok,err = aiClient.messages(chatUi.chatMessage,
                function(deltaText,reasoning){
                    if(reasoning) chatUi.showThinking(reasoning);
                    chatUi.assistant(deltaText);
                }
            );

            if(err){
                chatUi.errorMessage(err)
            }

            // 恢复按钮状态
            winform.btnSend.disabled = false;

        },chatUi,winform
    )

    // 发送后焦点切回输入框
    winform.editPrompt.setFocus();
}

winform.btnSend.oncommand = function(id,event){
    sendApiMessage();
}

//回车发送(Ctrl+Enter 换行)
winform.editPrompt.onOk = function(ctrl,alt,shift){
    if(ctrl){
        winform.btnSend.oncommand();
        return true;
    }
}

winform.btnSend.skin({
    background={
        default=0xFF0078D7;
        hover=0xFF0088EE;
        active=0xFF005BB5;
        disabled=0xFFCCCCCC;
    };
    color={
        default=0xFFFFFFFF;
        disabled=0xFF888888;
    }
})

winform.show();
win.loopMessage();
Markdown 格式