2023-04-09 03:28:39 +00:00
|
|
|
#include "llm.h"
|
2023-05-08 12:23:00 +00:00
|
|
|
#include "config.h"
|
2023-06-22 19:44:49 +00:00
|
|
|
#include "sysinfo.h"
|
|
|
|
#include "chatlistmodel.h"
|
|
|
|
#include "../gpt4all-backend/llmodel.h"
|
2023-04-27 02:05:56 +00:00
|
|
|
#include "network.h"
|
2023-04-09 03:28:39 +00:00
|
|
|
|
|
|
|
#include <QCoreApplication>
|
|
|
|
#include <QDir>
|
|
|
|
#include <QFile>
|
2023-04-11 03:34:34 +00:00
|
|
|
#include <QProcess>
|
2023-04-09 03:28:39 +00:00
|
|
|
#include <QResource>
|
2023-04-27 17:52:24 +00:00
|
|
|
#include <QSettings>
|
2023-04-10 20:33:14 +00:00
|
|
|
#include <fstream>
|
2023-04-09 03:28:39 +00:00
|
|
|
|
|
|
|
class MyLLM: public LLM { };
|
|
|
|
Q_GLOBAL_STATIC(MyLLM, llmInstance)
|
|
|
|
LLM *LLM::globalInstance()
|
|
|
|
{
|
|
|
|
return llmInstance();
|
|
|
|
}
|
|
|
|
|
2023-05-01 13:10:05 +00:00
|
|
|
LLM::LLM()
|
2023-04-09 03:28:39 +00:00
|
|
|
: QObject{nullptr}
|
2023-05-04 19:31:41 +00:00
|
|
|
, m_threadCount(std::min(4, (int32_t) std::thread::hardware_concurrency()))
|
2023-05-11 20:46:25 +00:00
|
|
|
, m_serverEnabled(false)
|
2023-05-10 03:17:21 +00:00
|
|
|
, m_compatHardware(true)
|
2023-04-18 15:42:16 +00:00
|
|
|
{
|
2023-06-05 13:23:17 +00:00
|
|
|
QString llmodelSearchPaths = QCoreApplication::applicationDirPath();
|
2023-06-05 14:50:16 +00:00
|
|
|
const QString libDir = QCoreApplication::applicationDirPath() + "/../lib/";
|
|
|
|
if (directoryExists(libDir))
|
|
|
|
llmodelSearchPaths += ";" + libDir;
|
2023-06-05 13:23:17 +00:00
|
|
|
#if defined(Q_OS_MAC)
|
2023-06-05 13:30:50 +00:00
|
|
|
const QString binDir = QCoreApplication::applicationDirPath() + "/../../../";
|
2023-06-05 13:31:57 +00:00
|
|
|
if (directoryExists(binDir))
|
2023-06-05 13:30:50 +00:00
|
|
|
llmodelSearchPaths += ";" + binDir;
|
|
|
|
const QString frameworksDir = QCoreApplication::applicationDirPath() + "/../Frameworks/";
|
2023-06-05 13:31:57 +00:00
|
|
|
if (directoryExists(frameworksDir))
|
2023-06-05 13:30:50 +00:00
|
|
|
llmodelSearchPaths += ";" + frameworksDir;
|
2023-06-05 13:23:17 +00:00
|
|
|
#endif
|
|
|
|
LLModel::setImplementationsSearchPath(llmodelSearchPaths.toStdString());
|
2023-05-11 20:46:25 +00:00
|
|
|
connect(this, &LLM::serverEnabledChanged,
|
2023-06-22 19:44:49 +00:00
|
|
|
ChatListModel::globalInstance(), &ChatListModel::handleServerEnabledChanged);
|
2023-05-08 12:23:00 +00:00
|
|
|
|
2023-06-04 19:28:58 +00:00
|
|
|
#if defined(__x86_64__)
|
|
|
|
#ifndef _MSC_VER
|
|
|
|
const bool minimal(__builtin_cpu_supports("avx"));
|
|
|
|
#else
|
|
|
|
int cpuInfo[4];
|
|
|
|
__cpuid(cpuInfo, 1);
|
|
|
|
const bool minimal(cpuInfo[2] & (1 << 28));
|
|
|
|
#endif
|
|
|
|
#else
|
|
|
|
const bool minimal = true; // Don't know how to handle non-x86_64
|
2023-05-08 12:23:00 +00:00
|
|
|
#endif
|
2023-06-04 19:28:58 +00:00
|
|
|
|
|
|
|
m_compatHardware = minimal;
|
|
|
|
emit compatHardwareChanged();
|
2023-04-18 15:42:16 +00:00
|
|
|
}
|
|
|
|
|
2023-04-11 03:34:34 +00:00
|
|
|
bool LLM::checkForUpdates() const
|
|
|
|
{
|
2023-04-27 11:41:23 +00:00
|
|
|
Network::globalInstance()->sendCheckForUpdates();
|
|
|
|
|
2023-04-11 03:34:34 +00:00
|
|
|
#if defined(Q_OS_LINUX)
|
2023-04-11 16:16:04 +00:00
|
|
|
QString tool("maintenancetool");
|
2023-04-11 03:34:34 +00:00
|
|
|
#elif defined(Q_OS_WINDOWS)
|
2023-04-11 16:16:04 +00:00
|
|
|
QString tool("maintenancetool.exe");
|
2023-04-11 03:34:34 +00:00
|
|
|
#elif defined(Q_OS_DARWIN)
|
2023-04-12 21:57:02 +00:00
|
|
|
QString tool("../../../maintenancetool.app/Contents/MacOS/maintenancetool");
|
2023-04-11 03:34:34 +00:00
|
|
|
#endif
|
|
|
|
|
|
|
|
QString fileName = QCoreApplication::applicationDirPath()
|
2023-04-30 01:02:54 +00:00
|
|
|
+ "/../" + tool;
|
2023-04-11 03:34:34 +00:00
|
|
|
if (!QFileInfo::exists(fileName)) {
|
|
|
|
qDebug() << "Couldn't find tool at" << fileName << "so cannot check for updates!";
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
return QProcess::startDetached(fileName);
|
|
|
|
}
|
2023-05-01 16:41:03 +00:00
|
|
|
|
2023-06-03 02:52:55 +00:00
|
|
|
bool LLM::directoryExists(const QString &path) const
|
|
|
|
{
|
|
|
|
const QUrl url(path);
|
|
|
|
const QString localFilePath = url.isLocalFile() ? url.toLocalFile() : path;
|
|
|
|
const QFileInfo info(localFilePath);
|
|
|
|
return info.exists() && info.isDir();
|
|
|
|
}
|
|
|
|
|
|
|
|
bool LLM::fileExists(const QString &path) const
|
|
|
|
{
|
|
|
|
const QUrl url(path);
|
|
|
|
const QString localFilePath = url.isLocalFile() ? url.toLocalFile() : path;
|
|
|
|
const QFileInfo info(localFilePath);
|
|
|
|
return info.exists() && info.isFile();
|
|
|
|
}
|
|
|
|
|
2023-06-22 19:44:49 +00:00
|
|
|
qint64 LLM::systemTotalRAMInGB() const
|
|
|
|
{
|
|
|
|
return getSystemTotalRAMInGB();
|
|
|
|
}
|
|
|
|
|
|
|
|
QString LLM::systemTotalRAMInGBString() const
|
|
|
|
{
|
|
|
|
return QString::fromStdString(getSystemTotalRAMInGBString());
|
|
|
|
}
|
|
|
|
|
2023-05-04 19:31:41 +00:00
|
|
|
int32_t LLM::threadCount() const
|
2023-05-01 16:41:03 +00:00
|
|
|
{
|
2023-05-04 19:31:41 +00:00
|
|
|
return m_threadCount;
|
2023-05-01 18:24:16 +00:00
|
|
|
}
|
|
|
|
|
2023-05-04 19:31:41 +00:00
|
|
|
void LLM::setThreadCount(int32_t n_threads)
|
2023-05-01 18:24:16 +00:00
|
|
|
{
|
2023-05-04 19:31:41 +00:00
|
|
|
if (n_threads <= 0)
|
|
|
|
n_threads = std::min(4, (int32_t) std::thread::hardware_concurrency());
|
|
|
|
m_threadCount = n_threads;
|
|
|
|
emit threadCountChanged();
|
2023-05-01 16:41:03 +00:00
|
|
|
}
|
|
|
|
|
2023-05-11 20:46:25 +00:00
|
|
|
bool LLM::serverEnabled() const
|
|
|
|
{
|
|
|
|
return m_serverEnabled;
|
|
|
|
}
|
|
|
|
|
|
|
|
void LLM::setServerEnabled(bool enabled)
|
|
|
|
{
|
|
|
|
if (m_serverEnabled == enabled)
|
|
|
|
return;
|
|
|
|
m_serverEnabled = enabled;
|
|
|
|
emit serverEnabledChanged();
|
|
|
|
}
|