aardio 文档

aardio 范例: 超级热键 - AI 自动续写补全

调用 AI 大模型指南 | 关于超级热键 | 关于发送文本

//AI 自动续写补全
//调用 AI 大模型指南: https://www.aardio.com/zh-cn/doc/library-guide/std/web/rest/aiChat.html
//web.rest.aiChat 入门范例:https://www.aardio.com/zh-cn/doc/example/AI/aiChat.html
//关于超级热键: https://www.aardio.com/zh-cn/doc/library-guide/std/key/hotkey.html
import win.ui;
/*DSG{{*/
var winform = win.form(text="超级热键 - AI 自动续写补全";right=757;bottom=467)
winform.add(
edit={cls="richedit";left=32;top=35;right=725;bottom=414;autohscroll=false;edge=1;multiline=1;vscroll=1;z=1}
)
/*}}*/

winform.edit.text = /*
从前有一个小孩,
*/


import key.hotkey;
superHotkey = key.hotkey();

superHotkey.loadTable({
    // 按 Ctrl+ I 触发热键
    ["Ctrl+Shift+I"] = function(hFocus){   

        //创建多线程以执行耗时操作,以避免阻塞键盘钩子消息导致热键失效。
        thread.invoke( 
            function(winform,hFocus){  
                //import java.accessBridge;//支持 Java 程序窗口,例如 JetBrains 系列
                import winex.editor;
                import win.version; 
                import web.rest.aiChat; 
                import key;

                //获取当前文本输入窗口光标插入点前后的文本。               
                var leftText,rightText = winex.editor.getText2(true); 
                if(!#leftText) return;

                //创建 AI 会话消息队列 
                var msg = web.rest.aiChat.message();  

                //让 AI 更聪明的一个方法就是清楚表达背景、需求、上下文环境,消耗更多 token 得到更多回报。
                msg.system(`
## 背景

当前时间为:` + tostring(..time()) + `
当前操作系统为:` + ..win.version.format() + `;
当前进程启动文件为:"` + (winex.editor.getPath() : "") + `"
当前窗口标题为:"` + (winex.editor.getTitle() : "") + `"

用户当前输入光标插入点在"""前置文本"""与"""后置文本"""中间。

## 角色

你是智能续写与补全助手。

## 任务

分析上下文("""前置文本"""与"""后置文本""")插入新的内容。

## 要求

- 你需要根据当前操作系统、当前进程的启动文件名、窗口标题、上下文推测用户的输入环境与输入目的。
- 如果生成的是代码则直接回复代码, 不要放进 Markdown 代码块中 
- 请直接返回插入的内容,回复不要包含前置文本或后置文本`)

                msg.prompt(`

## 前置文本:  

console.log("Hello,

## 后置文本: 

;//在控制台输出一句话

## 任务

分析上下文("""前置文本"""与"""后置文本""")插入新的内容

`) 

                //利用小样本学习,以 AI 助手的角色教它一遍,胜过写千万句提示词
                msg.assistant(`world!")`);

                //下面是真正的问题。
                msg.prompt("

## 前置文本  

"+leftText+" 

## 后置文本  

"+(rightText:"")+" 

## 任务

请分析前置文本与后置文本,并在前置文本与后置文本之间插入新的内容。

## 要求

- 请直接返回插入的内容,回复不要包含前置文本或后置文本 
- 如果生成的是代码则直接回复代码, 不要放进 Markdown 代码块中 。
")

                if(string.find(leftText,"<//>|<# >|<!\N[ \t]*#>|<#:>\N*[ \t]*$")){
                    winex.editor.sendString('\n')
                }

                var aiClient = web.rest.aiChat(
                    /*
                    下面的测试密钥 24 小时后失效,
                    DeepSeek 的 key 充 10 元估计能用一年,请自己申请一个吧!
                    */
                    key = '\0\48\67\91\29\5\83\2\3\4\5\0\83\8\4\85\5\4\0\83\83\9\5\9\4\1\85\3\86\6\82\5\4\83\86\2\0';
                    url = "https://api.deepseek.com/v1";//接口地址
                    model = "deepseek-chat";//模型名称首字符为 @ 则使用 Anthropic 接口
                    temperature = 0.5;//温度
                    maxTokens = 1024,//最大回复长度
                )

                import winex.loading;
                var loading = winex.loading("thinking",hFocus) //进度动画

                var ok,err = aiClient.messages(msg,function(delta){

                    if(loading.isCanceled()){
                        return false; //用户已取消(关闭进度动画窗口)
                    }

                    //以打字方式逐步输出 AI 回复的增量文本到目标输入框。
                    //关于发送文本 https://www.aardio.com/zh-cn/doc/library-guide/std/key/sendString.html
                    winex.editor.sendString(delta) 
                } ); 
            },winform,hFocus
        )

    };
})

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