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

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%

{{collectdata}}

网友评论0