aardio 文档
aardio 范例: 自动部署 Ollama 本地模型
请参考 web.rest.aiChat
//自动部署 Ollama 本地模型
import win.ui;
/*DSG{{*/
var winform = win.form(text="自动部署 Ollama 本地模型";right=644;bottom=556)
winform.add(
cmbModels={cls="combobox";left=171;top=520;right=336;bottom=546;db=1;dl=1;edge=1;items={};mode="dropdown";z=2};
custom={cls="custom";text="自定义控件";left=3;top=3;right=638;bottom=504;db=1;dl=1;dr=1;dt=1;z=1};
goLibrary={cls="syslink";text='<a href="https://ollama.com/library?sort=popular">搜索大模型</a>';left=369;top=523;right=471;bottom=541;color=16729600;db=1;dl=1;dr=1;notify=1;z=4};
static={cls="static";text="请输入或选择模型名称:";left=9;top=520;right=166;bottom=546;align="right";db=1;dl=1;transparent=1;z=3}
)
/*}}*/
/*
下面演示怎样调用 Ollama 接口自动部署 Ollama 本地模型。
web.rest.aiChat 已兼容 Ollama,如果只是调用模型创建对话则使用 web.rest.aiChat 会更简单。
请参考 web.rest.aiChat: https://www.aardio.com/zh-cn/doc/library-guide/std/web/rest/aiChat.html
*/
//导入浏览器控件
import web.view;
var wb = web.view(winform.custom);
//几句代码创建 Ollama 接口,不需要额外封装库
import web.rest.jsonClient;
var client = web.rest.jsonClient();
var ollama = client.api("http://localhost:11434/api/")
//创建聊天上下文
import web.simpleChatUi.messages;
var messages = web.simpleChatUi.messages();
//添加消息
messages.push(
//system 角色用来写系统指令提示
role = "system";
content = "你是 Ollama 智能助理,用户的贴心小助手~。现在的时间是 " + tostring(time()) + "。"
)
//导出网页 JavaScript 可以调用的接口
wb.external = {};
wb.external.sendMessage = function(id,prompt){
//启动时 ChatUI 会发一个空消息
if(!id){
//第一次显示欢迎消息
return chatUi.emit(
content = '主人好,我是 Ollama 智能助理,您的贴心小助手~。您可以在下面输入或选择模型,如果模型尚未安装我会自动帮您下载安装。';
);
}
//加入到聊天上下文
messages.push(
role = "user";
content = prompt;
)
//非阻塞异步调用,让 JavaScript 调用先返回
wb.setTimeout(
function(){
//记录应答消息
var content = "";
//发送聊天请求
var ok,err = ollama.chat({
model = winform.cmbModels.text;
options = {
temperature = 0.7;//模型选项
}
messages = messages;
},function(result){
//流式响应,每次应答一个字
content = content ++ result.message.content;
//逐字发送聊天消息到界面,实现打字效果
chatUi.emit({
id = id;
content = content
})
} )
if(ok){
//加入到聊天记录
messages.push(
role = "assistant";
content = string.trim(content);
)
}
else{
//如果模型不存在
if(string.indexOf(err,`try pulling it first`)){
//下载模型
var ok,err = ollama.pull({
model = winform.cmbModels.text;
},function(result){
//出错了,显示错误信息
if( result.error ){
chatUi.emit({
id = id;
content = result.error
})
return;
}
//显示模型下载进度
if(result.completed) {
chatUi.emit({
id = id;
content = "正在下载模型:" + ..math.round((result.completed / result.total) * 100) + "% " + ..math.size64(result.completed).format()
})
}
elseif( result.status ){
//显示下载状态
chatUi.emit({
id = id;
content = result.status
})
//下载完成
if(result.status == "success"){
wb.external.sendMessage(id,prompt);
return;
}
}
} )
//下载成功
if(ok) return ;
}
//显示错误信息
chatUi.emit({
id = id;
content = client.lastResponseError("error"):err;
})
}
}
);
};
//加载 ChatUI 前端界面
import web.simpleChatUi;
chatUi = web.simpleChatUi(wb);
chatUi.avatar = 'https://gw.alicdn.com/tfs/TB1DYHLwMHqK1RjSZFEXXcGMXXa-56-62.svg';
//列出已安装的大模型
var ret = ollama.tags.get();
if( #ret.models){
winform.cmbModels.items = table.map(ret.models,lambda(v) v.name )
winform.cmbModels.selIndex = 1;
}
else {
winform.cmbModels.text = "qwin:0.5b";
}
//搜索在线大模型
import process;
winform.goLibrary.onHyperlinkClick = function(nmSysLink,url,id){
process.openUrl(url) //打开超链接
}
winform.show();
win.loopMessage();
Markdown 格式