aardio 文档

aardio 范例: 八字(AI 版)

import time.lunar;
import time.ganzhi;
import fonts.fontAwesome;
import win.ui;
/*DSG{{*/
var winform = win.form(text="AI 八字命理";right=960;bottom=640;bgcolor=0xF5F0EB;border="none")
winform.add(
baziPanel={cls="plus";left=32;top=580;right=324;bottom=610;border={color=0xFFD4C4B0;radius=6;width=1};db=1;dl=1;z=21};
btnStart={cls="plus";text="开始推算命理";left=32;top=520;right=324;bottom=572;bgcolor=0x8B5A2B;border={radius=10};color=0xFFFFFF;db=1;dl=1;font=LOGFONT(h=-18;weight=600);iconStyle={align="left";font=LOGFONT(h=-20;name='FontAwesome');padding={left=60}};iconText='\uF005';notify=1;textPadding={left=90};z=20};
chatPanel={cls="custom";left=364;top=70;right=936;bottom=616;bgcolor=0xFAF9F8;db=1;dl=1;dr=1;dt=1;z=23};
comboSex={cls="combobox";left=221;top=297;right=275;bottom=321;dl=1;dt=1;edge=1;items={"男","女"};mode="dropdown";z=15};
editDate={cls="edit";left=32;top=115;right=324;bottom=145;bgcolor=0xFAFDFF;dl=1;dt=1;edge=1;z=7};
editLunarDate={cls="edit";left=32;top=217;right=324;bottom=247;bgcolor=0xFAFDFF;dl=1;dt=1;edge=1;z=11};
editName={cls="edit";left=32;top=293;right=190;bottom=323;bgcolor=0xFAFDFF;dl=1;dt=1;edge=1;z=14};
editQuestion={cls="edit";left=32;top=388;right=324;bottom=480;bgcolor=0xFAFDFF;db=1;dl=1;edge=1;multiline=1;z=18};
hintDate={cls="bkplus";text="格式:1990-01-15 08:30 或 19900115";left=32;top=154;right=324;bottom=172;align="left";color=0x999999;dl=1;dt=1;font=LOGFONT(h=-11);z=8};
hintQuestion={cls="bkplus";text="可写近日困惑、期望或任意想法";left=32;top=484;right=324;bottom=502;align="left";color=0x999999;db=1;dl=1;font=LOGFONT(h=-11);z=19};
iconDate={cls="bkplus";text='\uF073';left=32;top=82;right=52;bottom=104;color=0x8B5A2B;dl=1;dt=1;font=LOGFONT(h=-16;name='FontAwesome');z=5};
iconLunar={cls="bkplus";text='\uF186';left=32;top=187;right=52;bottom=209;color=0x8B5A2B;dl=1;dt=1;font=LOGFONT(h=-16;name='FontAwesome');z=9};
iconName={cls="bkplus";text='\uF007';left=32;top=259;right=52;bottom=281;color=0x8B5A2B;dl=1;dt=1;font=LOGFONT(h=-16;name='FontAwesome');z=12};
iconQuestion={cls="bkplus";text='\uF0E6';left=32;top=346;right=52;bottom=368;color=0x8B5A2B;db=1;dl=1;font=LOGFONT(h=-16;name='FontAwesome');z=16};
inputPanelBg={cls="bkplus";left=16;top=64;right=340;bottom=624;bgcolor=0xFAFDFF;border=1;db=1;dl=1;dt=1;z=1};
labelDate={cls="bkplus";text="出生日期(公历)";left=56;top=82;right=200;bottom=104;align="left";color=0x5A4030;dl=1;dt=1;font=LOGFONT(h=-14;weight=600);z=6};
labelLunar={cls="bkplus";text="农历日期(自动转换)";left=56;top=185;right=240;bottom=207;align="left";color=0x5A4030;dl=1;dt=1;font=LOGFONT(h=-14;weight=600);z=10};
labelName={cls="bkplus";text="姓名";left=56;top=259;right=120;bottom=281;align="left";color=0x5A4030;dl=1;dt=1;font=LOGFONT(h=-14;weight=600);z=13};
labelQuestion={cls="bkplus";text="心中所想(随缘一语)";left=56;top=346;right=280;bottom=368;align="left";color=0x5A4030;db=1;dl=1;font=LOGFONT(h=-14;weight=600);z=17};
resultPanelBg={cls="plus";left=358;top=64;right=946;bottom=625;bgcolor=0xFAF9F8;border={color=0xFFE0D5C8;radius=8;width=1};db=1;dl=1;dr=1;dt=1;z=22};
titleBar={cls="bkplus";left=0;top=0;right=962;bottom=48;bgcolor=0x2B4B6F;dl=1;dr=1;dt=1;z=2};
titleIcon={cls="bkplus";text='\uF0C8';left=16;top=10;right=46;bottom=40;color=0xE8C170;dl=1;dt=1;font=LOGFONT(h=-22;name='FontAwesome');z=3};
titleText={cls="bkplus";text="八字命理分析";left=50;top=6;right=220;bottom=42;align="left";color=0xFFFFFF;dl=1;dt=1;font=LOGFONT(h=-20;weight=600);z=4}
)
/*}}*/

// 美化开始按钮
winform.btnStart.skin({
    background={
        default=0xFF8B5A2B;
        hover=0xFFA0704A;
        active=0xFF6B4A1B;
        disabled=0xFFBBBBBB
    };
    color={
        default=0xFFFFFFFF;
        disabled=0xFF888888
    }
});

// 聊天界面
import web.form.chat;
var chatUi = web.form.chat(winform.chatPanel);

// 设置默认值
winform.comboSex.selIndex = 1;
winform.editName.text = "";
winform.editQuestion.text = "";
winform.editDate.setCueBannerText("1990-01-1 00:00",true);
winform.editLunarDate.setCueBannerText("1989-12-05 00:00",true);

// 更新八字显示
var updateBaziDisplay = function(dateStr){

    var gz = time.ganzhi(dateStr);
    if(!gz) {
        winform.baziPanel.text = "";
        return;
    }

    winform.baziPanel.text = "八字:" + gz.bazi + "  |  生肖:" + gz.zodiac;
    winform.baziPanel.color = 0x8B5A2B;
};

// 公历日期变化
winform.editDate.onChange = function(){
    if(!owner.modified) return;

    var tm = time(owner.text,"%Y-%m-%d %H:%M") || time(owner.text,"%Y-%m-%d %H");
    if(tm){
        var lunarDate = time.lunar(tm);
        winform.editLunarDate.text = lunarDate.format(`%Lyyyy-%Lmm-%Ldd %H:%M`);
        updateBaziDisplay(owner.text);
    }
};

// 农历日期变化
winform.editLunarDate.onChange = function(){
    if(!owner.modified) return;

    var tm = time.lunar.toSolar(owner.text);
    if(tm){
        winform.editDate.text = tm.format("%Y-%m-%d %H:%M");
        updateBaziDisplay(winform.editDate.text);
    }
};

// 初始化显示
updateBaziDisplay(winform.editDate.text);
var lunarDate = time.lunar(winform.editDate.text);
if(lunarDate){
    winform.editLunarDate.text = lunarDate.format(`%Lyyyy-%Lmm-%Ldd %H:%M`);
}

var tip = /*
八字,即出生年、月、日、时的天干地支,共八个字。  

> 命理八字以立春为一年起点,而民俗农历、生肖以正月初一为起点

- 年柱(年干+年支): 代表根基、祖业、父母,对应幼年时期(约0-16岁)。
- 月柱(月干+月支): 代表成长环境、兄弟姐妹,对应青年时期(约17-32岁)。
- 日柱(日干+日支): 日干代表本我(核心性格),日支为夫妻宫(配偶),对应中年时期(约33-48岁)。
- 时柱(时干+时支): 代表子女、晚年运势,对应49岁之后的晚年生活。 

整个命盘就是围绕日主,分析其他七个字与它的关系,这些关系用“十神”来命名。十神依据是根据天干(或地支所藏天干)的五行(金木水火土)生克和阴阳属性确定。

- 生我(长辈、保护):正印(异性相生)、偏印(同性相生)
- 我生(才华、表达):伤官(异性相生)、食神(同性相生)
- 克我(约束、事业):正官(异性相克)、七杀(同性相克,也叫偏官)
- 我克(财富、掌控):正财(异性相克)、偏财(同性相克)
- 同我(同辈、竞争):劫财(异性相同)、比肩(同性相同)

> 阴阳不同为“正”(异性相吸,作用温和),阴阳相同为“偏”(同性相斥,作用激烈)

举例:假如你的日主是丁火(阴性火),那么:  
见甲木(阳木)为正印(生我者,木生火,阴阳不同),见己土(阴土)为食神(我生者,火生土,阴阳相同)
*/

// 开始推算按钮
winform.btnStart.oncommand = function(id,event){
    // 输入验证
    var dateStr = winform.editDate.text;
    var tm = time.date(dateStr);
    if(!tm){
        winform.editLunarDate.showWarningTip("请输入正确的出生日期");
        winform.editLunarDate.setFocus();
        return;
    }

    if(!#winform.editName.text){
        winform.editName.showWarningTip("请输入姓名");
        winform.editName.setFocus();
        return;
    }

    if(!#winform.editQuestion.text){
        winform.editQuestion.showWarningTip("请输入此时此刻心中所想");
        winform.editQuestion.setFocus();
        return;
    }

    var name = winform.editName.text;
    var sex = winform.comboSex.selText;
    var question = winform.editQuestion.text;

    // 系统提示词
    chatUi.system(`# 角色
你是来自中国的算命先生,一个传统八字命理大师,精通四柱八字、五行生克、十神论命。

# 任务
用户会发送他的出生日期、命理八字,以及用户此时此刻心中所想。
你需要根据中国传统八字命理学分析用户的命理,结合年龄、性别以及用户心中所想来推断其性格特点、人生运势。

# 要求
1. 分析要有理有据,引用八字命理知识
2. 语言要有古韵雅致,但通俗易懂
3. 给出正面积极的建议
4. 适当使用传统术语,但要解释含义

# 八字简介

` + tip);

    var lunarDate = time.lunar(dateStr);
    var dateInfo = tostring(lunarDate, "%Y/%m/%d %H:%M 农历%Ly年(%LY)%Lm月%Ld日 %LH时");

    var gz = time.ganzhi(dateStr);

    // 用户提示词
    var prompt = '## 我的信息\n\n';
    prompt += '- **出生日期**:' + dateInfo + '\n';
    prompt += '- **命理八字**:' + gz.bazi + '\n';
    prompt += '- **生肖**:' + gz.zodiac + '\n';
    if(#name > 0){
        prompt += '- **姓名**:' + name + '\n';
    }
    prompt += '- **性别**:' + sex + '\n';
    if(#question > 0){
        prompt += '- **此时此刻心中所想**:' + question + '\n';
    }
    prompt += '\n请大师帮我分析命理,指点迷津!';

    chatUi.chatMessage.prompt(prompt);

    // 禁用按钮并显示加载动画
    winform.btnStart.disabledText = ['\uF254','\uF251','\uF252','\uF253','\uF250']

    thread.invoke(
        function(winform, chatUi, dateStr, name, sex, question){

            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 = 2048
            );

            // 发送请求
            var resp, err = aiClient.messages(chatUi.chatMessage,
                function(deltaText, reasoning){
                    if(reasoning) chatUi.showThinking(reasoning);
                    chatUi.assistant(deltaText);
                }
            );

            if(err){
                chatUi.assistant("\n\n⚠️ " + err);
            }

            // 恢复按钮
            winform.btnStart.disabledText = null;

        }, winform, chatUi, dateStr, name, sex, question
    );
};

chatUi.write(tip)


// 标题栏按钮(无边框窗口)
import win.ui.simpleWindow;
win.ui.simpleWindow(winform);

winform.show(3/*_SW_MAXIMIZE*/);
win.loopMessage();
Markdown 格式