node+vue打造一个家庭内部离线可用的ai助理ollamaiui

现在开源大模型这么强大,而且也在不断的更新升级,我们下载一个ollama,就能离线使用各种开源的大模型,而且各大人工智能公司也在不断地将模型蒸馏压缩,让普通人的电脑都能运行ai大模型,今天我想写一个程序,让ai大模型不仅能在本地电脑上用,而且还能让其他的家庭成员手机上也能访问,这样孩子可以与大模型交流学习,家长能用大模型进行办公,大模型都是本地离线运行,数据又很安全,我们使用nodejs开发,搭建了一个本地的http服务,然后调用ollama的api接口进行ai问答。
完整的代码我让到最后,大家可以下载体验下这个本地离线ai交互助手:https://github.com/bfwadmin/ollamaiui/releases

一、主要特点:
1、支持windows、mac、linux、手机运行,局域网能其他电脑手机等设备都能使用

2、支持语音聊天,推荐edge浏览器

3、多音色选择,推荐edge浏览器

4、支持图片理解

5、支持工具插件调用,可扩展

6、支持自定义智能体和大模型参数及提示词

7、支持语音唤醒

8、支持数据本地存储,存储在浏览器的indexdb中
9、支持pdf、word、ppt、excel等文件的在线ai问答

10、支持代码的在线运行预览

11、支持语音播报

12、支持一键复制

13、界面清爽
二、主体代码
nodejs主体代码:
const http = require('http');
const url = require('url');
const fs = require('fs');
const path = require('path');
const { exec, spawn } = require('child_process');
const httpProxy = require('http-proxy');
const os = require('os');
const qrcode = require('qrcode');
const axios = require('axios');
const { setTimeout } = require('timers');
function isProcessRunning(processName, callback) {
const platform = process.platform;
let cmd = '';
if (platform === 'win32') {
// Windows 命令
cmd = `tasklist`;
} else if (platform === 'darwin' || platform === 'linux') {
// macOS 和 Linux 命令
cmd = `ps -A`;
} else {
callback(new Error(`Unsupported platform: ${platform}`));
return;
}
exec(cmd, (err, stdout, stderr) => {
if (err) {
callback(err);
return;
}
const processList = stdout.toLowerCase();
const isRunning = processList.includes(processName.toLowerCase());
callback(null, isRunning);
});
}
function openBrowser(url) {
const platform = process.platform;
let cmd = '';
if (platform === 'win32') {
// Windows 命令
cmd = `start`;
} else if (platform === 'darwin') {
// macOS 和 Linux 命令
cmd = `open `;
}
if (cmd != "") {
exec(cmd + ` ${url}`, (error, stdout, stderr) => { });
}
}
// 使用示例
const processName = 'ollama'; // 要检测的进程名
const startCommand = 'ollama list'; // 启动进程的命令
const failureUrl = 'https://ollama.com'; // 启动失败时打开的 URL
isProcessRunning(processName, (err, isRunning) => {
if (err) {
console.error('Error:', err);
return;
}
if (isRunning) {
console.log(`${processName} is already running.`);
startServer();
} else {
console.log(`${processName} is not running. Starting it now...`);
// const cmdexec = spawn('ollama', ['list']);
// cmdexec.stdout.on('data', (data) => {
// console.log(`stdout: ${data}`);
// startServer();
// });
// cmdexec.stderr.on('data', (data) => {
// console.error(`stderr: ${data}`);
// });
// cmdexec.on('close', (code) => {
// console.log(`child process exited with code ${code}`);
// openBrowser(failureUrl);
// });
let isrunerr = false;
exec(startCommand, (error, stdout, stderr) => {
if (error) {
isrunerr = true;
console.error(`exec error: ${error}`);
openBrowser(failureUrl);
return;
}
console.log(`stdout: ${stdout}`);
console.error(`stderr: ${stderr}`);
});
se...点击查看剩余70%
网友评论0