|
|
@ -2,6 +2,8 @@
|
|
|
|
#include "mysettings.h"
|
|
|
|
#include "mysettings.h"
|
|
|
|
#include "network.h"
|
|
|
|
#include "network.h"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#include <QFile>
|
|
|
|
|
|
|
|
#include <QStandardPaths>
|
|
|
|
#include <algorithm>
|
|
|
|
#include <algorithm>
|
|
|
|
|
|
|
|
|
|
|
|
//#define USE_LOCAL_MODELSJSON
|
|
|
|
//#define USE_LOCAL_MODELSJSON
|
|
|
@ -241,6 +243,7 @@ ModelList::ModelList()
|
|
|
|
connect(MySettings::globalInstance(), &MySettings::repeatPenaltyTokensChanged, this, &ModelList::updateDataForSettings);;
|
|
|
|
connect(MySettings::globalInstance(), &MySettings::repeatPenaltyTokensChanged, this, &ModelList::updateDataForSettings);;
|
|
|
|
connect(MySettings::globalInstance(), &MySettings::promptTemplateChanged, this, &ModelList::updateDataForSettings);
|
|
|
|
connect(MySettings::globalInstance(), &MySettings::promptTemplateChanged, this, &ModelList::updateDataForSettings);
|
|
|
|
connect(MySettings::globalInstance(), &MySettings::systemPromptChanged, this, &ModelList::updateDataForSettings);
|
|
|
|
connect(MySettings::globalInstance(), &MySettings::systemPromptChanged, this, &ModelList::updateDataForSettings);
|
|
|
|
|
|
|
|
connect(&m_networkManager, &QNetworkAccessManager::sslErrors, this, &ModelList::handleSslErrors);
|
|
|
|
|
|
|
|
|
|
|
|
updateModelsFromJson();
|
|
|
|
updateModelsFromJson();
|
|
|
|
updateModelsFromSettings();
|
|
|
|
updateModelsFromSettings();
|
|
|
@ -390,6 +393,21 @@ void ModelList::addModel(const QString &id)
|
|
|
|
emit userDefaultModelListChanged();
|
|
|
|
emit userDefaultModelListChanged();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void ModelList::changeId(const QString &oldId, const QString &newId)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
const bool hasModel = contains(oldId);
|
|
|
|
|
|
|
|
Q_ASSERT(hasModel);
|
|
|
|
|
|
|
|
if (!hasModel) {
|
|
|
|
|
|
|
|
qWarning() << "ERROR: model list does not contain" << oldId;
|
|
|
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
QMutexLocker locker(&m_mutex);
|
|
|
|
|
|
|
|
ModelInfo *info = m_modelMap.take(oldId);
|
|
|
|
|
|
|
|
info->setId(newId);
|
|
|
|
|
|
|
|
m_modelMap.insert(newId, info);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
int ModelList::rowCount(const QModelIndex &parent) const
|
|
|
|
int ModelList::rowCount(const QModelIndex &parent) const
|
|
|
|
{
|
|
|
|
{
|
|
|
|
Q_UNUSED(parent)
|
|
|
|
Q_UNUSED(parent)
|
|
|
@ -857,13 +875,60 @@ void ModelList::updateModelsFromJson()
|
|
|
|
if (jsonReply->error() == QNetworkReply::NoError && jsonReply->isFinished()) {
|
|
|
|
if (jsonReply->error() == QNetworkReply::NoError && jsonReply->isFinished()) {
|
|
|
|
QByteArray jsonData = jsonReply->readAll();
|
|
|
|
QByteArray jsonData = jsonReply->readAll();
|
|
|
|
jsonReply->deleteLater();
|
|
|
|
jsonReply->deleteLater();
|
|
|
|
parseModelsJsonFile(jsonData);
|
|
|
|
parseModelsJsonFile(jsonData, true);
|
|
|
|
} else {
|
|
|
|
} else {
|
|
|
|
qWarning() << "Could not download models.json";
|
|
|
|
qWarning() << "WARNING: Could not download models.json synchronously";
|
|
|
|
|
|
|
|
updateModelsFromJsonAsync();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
QSettings settings;
|
|
|
|
|
|
|
|
QFileInfo info(settings.fileName());
|
|
|
|
|
|
|
|
QString dirPath = info.canonicalPath();
|
|
|
|
|
|
|
|
const QString modelsConfig = dirPath + "/models.json";
|
|
|
|
|
|
|
|
QFile file(modelsConfig);
|
|
|
|
|
|
|
|
if (!file.open(QIODeviceBase::ReadOnly)) {
|
|
|
|
|
|
|
|
qWarning() << "ERROR: Couldn't read models config file: " << modelsConfig;
|
|
|
|
|
|
|
|
} else {
|
|
|
|
|
|
|
|
QByteArray jsonData = file.readAll();
|
|
|
|
|
|
|
|
file.close();
|
|
|
|
|
|
|
|
parseModelsJsonFile(jsonData, false);
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
delete jsonReply;
|
|
|
|
delete jsonReply;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void ModelList::updateModelsFromJsonAsync()
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
#if defined(USE_LOCAL_MODELSJSON)
|
|
|
|
|
|
|
|
QUrl jsonUrl("file://" + QDir::homePath() + "/dev/large_language_models/gpt4all/gpt4all-chat/metadata/models.json");
|
|
|
|
|
|
|
|
#else
|
|
|
|
|
|
|
|
QUrl jsonUrl("http://gpt4all.io/models/models.json");
|
|
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
QNetworkRequest request(jsonUrl);
|
|
|
|
|
|
|
|
QSslConfiguration conf = request.sslConfiguration();
|
|
|
|
|
|
|
|
conf.setPeerVerifyMode(QSslSocket::VerifyNone);
|
|
|
|
|
|
|
|
request.setSslConfiguration(conf);
|
|
|
|
|
|
|
|
QNetworkReply *jsonReply = m_networkManager.get(request);
|
|
|
|
|
|
|
|
connect(jsonReply, &QNetworkReply::finished, this, &ModelList::handleModelsJsonDownloadFinished);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void ModelList::handleModelsJsonDownloadFinished()
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
QNetworkReply *jsonReply = qobject_cast<QNetworkReply *>(sender());
|
|
|
|
|
|
|
|
if (!jsonReply)
|
|
|
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
QByteArray jsonData = jsonReply->readAll();
|
|
|
|
|
|
|
|
jsonReply->deleteLater();
|
|
|
|
|
|
|
|
parseModelsJsonFile(jsonData, true);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void ModelList::handleSslErrors(QNetworkReply *reply, const QList<QSslError> &errors)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
QUrl url = reply->request().url();
|
|
|
|
|
|
|
|
for (const auto &e : errors)
|
|
|
|
|
|
|
|
qWarning() << "ERROR: Received ssl error:" << e.errorString() << "for" << url;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void ModelList::updateDataForSettings()
|
|
|
|
void ModelList::updateDataForSettings()
|
|
|
|
{
|
|
|
|
{
|
|
|
|
emit dataChanged(index(0, 0), index(m_models.size() - 1, 0));
|
|
|
|
emit dataChanged(index(0, 0), index(m_models.size() - 1, 0));
|
|
|
@ -887,7 +952,7 @@ static bool compareVersions(const QString &a, const QString &b) {
|
|
|
|
return aParts.size() > bParts.size();
|
|
|
|
return aParts.size() > bParts.size();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void ModelList::parseModelsJsonFile(const QByteArray &jsonData)
|
|
|
|
void ModelList::parseModelsJsonFile(const QByteArray &jsonData, bool save)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
QJsonParseError err;
|
|
|
|
QJsonParseError err;
|
|
|
|
QJsonDocument document = QJsonDocument::fromJson(jsonData, &err);
|
|
|
|
QJsonDocument document = QJsonDocument::fromJson(jsonData, &err);
|
|
|
@ -896,6 +961,20 @@ void ModelList::parseModelsJsonFile(const QByteArray &jsonData)
|
|
|
|
return;
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (save) {
|
|
|
|
|
|
|
|
QSettings settings;
|
|
|
|
|
|
|
|
QFileInfo info(settings.fileName());
|
|
|
|
|
|
|
|
QString dirPath = info.canonicalPath();
|
|
|
|
|
|
|
|
const QString modelsConfig = dirPath + "/models.json";
|
|
|
|
|
|
|
|
QFile file(modelsConfig);
|
|
|
|
|
|
|
|
if (!file.open(QIODeviceBase::WriteOnly)) {
|
|
|
|
|
|
|
|
qWarning() << "ERROR: Couldn't write models config file: " << modelsConfig;
|
|
|
|
|
|
|
|
} else {
|
|
|
|
|
|
|
|
file.write(jsonData.constData());
|
|
|
|
|
|
|
|
file.close();
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
QJsonArray jsonArray = document.array();
|
|
|
|
QJsonArray jsonArray = document.array();
|
|
|
|
const QString currentVersion = QCoreApplication::applicationVersion();
|
|
|
|
const QString currentVersion = QCoreApplication::applicationVersion();
|
|
|
|
|
|
|
|
|
|
|
@ -936,6 +1015,9 @@ void ModelList::parseModelsJsonFile(const QByteArray &jsonData)
|
|
|
|
const QString id = modelName;
|
|
|
|
const QString id = modelName;
|
|
|
|
Q_ASSERT(!id.isEmpty());
|
|
|
|
Q_ASSERT(!id.isEmpty());
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (contains(modelFilename))
|
|
|
|
|
|
|
|
changeId(modelFilename, id);
|
|
|
|
|
|
|
|
|
|
|
|
if (!contains(id))
|
|
|
|
if (!contains(id))
|
|
|
|
addModel(id);
|
|
|
|
addModel(id);
|
|
|
|
|
|
|
|
|
|
|
@ -983,6 +1065,8 @@ void ModelList::parseModelsJsonFile(const QByteArray &jsonData)
|
|
|
|
const QString modelName = "ChatGPT-3.5 Turbo";
|
|
|
|
const QString modelName = "ChatGPT-3.5 Turbo";
|
|
|
|
const QString id = modelName;
|
|
|
|
const QString id = modelName;
|
|
|
|
const QString modelFilename = "chatgpt-gpt-3.5-turbo.txt";
|
|
|
|
const QString modelFilename = "chatgpt-gpt-3.5-turbo.txt";
|
|
|
|
|
|
|
|
if (contains(modelFilename))
|
|
|
|
|
|
|
|
changeId(modelFilename, id);
|
|
|
|
if (!contains(id))
|
|
|
|
if (!contains(id))
|
|
|
|
addModel(id);
|
|
|
|
addModel(id);
|
|
|
|
updateData(id, ModelList::NameRole, modelName);
|
|
|
|
updateData(id, ModelList::NameRole, modelName);
|
|
|
@ -1003,6 +1087,8 @@ void ModelList::parseModelsJsonFile(const QByteArray &jsonData)
|
|
|
|
const QString modelName = "ChatGPT-4";
|
|
|
|
const QString modelName = "ChatGPT-4";
|
|
|
|
const QString id = modelName;
|
|
|
|
const QString id = modelName;
|
|
|
|
const QString modelFilename = "chatgpt-gpt-4.txt";
|
|
|
|
const QString modelFilename = "chatgpt-gpt-4.txt";
|
|
|
|
|
|
|
|
if (contains(modelFilename))
|
|
|
|
|
|
|
|
changeId(modelFilename, id);
|
|
|
|
if (!contains(id))
|
|
|
|
if (!contains(id))
|
|
|
|
addModel(id);
|
|
|
|
addModel(id);
|
|
|
|
updateData(id, ModelList::NameRole, modelName);
|
|
|
|
updateData(id, ModelList::NameRole, modelName);
|
|
|
|