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