gpt4all/gpt4all-chat/llm.cpp

131 lines
3.5 KiB
C++
Raw Normal View History

2023-04-09 03:28:39 +00:00
#include "llm.h"
#include "config.h"
2023-04-19 01:10:06 +00:00
#include "download.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>
#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();
}
LLM::LLM()
2023-04-09 03:28:39 +00:00
: QObject{nullptr}
2023-05-01 21:13:20 +00:00
, m_chatListModel(new ChatListModel(this))
, 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)
{
QString llmodelSearchPaths = QCoreApplication::applicationDirPath();
2023-06-05 14:50:16 +00:00
const QString libDir = QCoreApplication::applicationDirPath() + "/../lib/";
if (directoryExists(libDir))
llmodelSearchPaths += ";" + libDir;
#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;
#endif
LLModel::setImplementationsSearchPath(llmodelSearchPaths.toStdString());
connect(QCoreApplication::instance(), &QCoreApplication::aboutToQuit,
this, &LLM::aboutToQuit);
2023-05-11 20:46:25 +00:00
connect(this, &LLM::serverEnabledChanged,
m_chatListModel, &ChatListModel::handleServerEnabledChanged);
#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
#endif
m_compatHardware = minimal;
emit compatHardwareChanged();
}
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);
}
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();
}
int32_t LLM::threadCount() const
{
return m_threadCount;
}
void LLM::setThreadCount(int32_t n_threads)
{
if (n_threads <= 0)
n_threads = std::min(4, (int32_t) std::thread::hardware_concurrency());
m_threadCount = n_threads;
emit threadCountChanged();
}
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();
}
void LLM::aboutToQuit()
{
m_chatListModel->saveChats();
}