mirror of
https://github.com/nomic-ai/gpt4all.git
synced 2025-09-03 17:44:34 +00:00
Show busy if models.json download taking longer than expected.
This commit is contained in:
@@ -222,6 +222,7 @@ ModelList::ModelList()
|
|||||||
: QAbstractListModel(nullptr)
|
: QAbstractListModel(nullptr)
|
||||||
, m_installedModels(new InstalledModels(this))
|
, m_installedModels(new InstalledModels(this))
|
||||||
, m_downloadableModels(new DownloadableModels(this))
|
, m_downloadableModels(new DownloadableModels(this))
|
||||||
|
, m_asyncModelRequestOngoing(false)
|
||||||
{
|
{
|
||||||
m_installedModels->setSourceModel(this);
|
m_installedModels->setSourceModel(this);
|
||||||
m_downloadableModels->setSourceModel(this);
|
m_downloadableModels->setSourceModel(this);
|
||||||
@@ -899,6 +900,9 @@ void ModelList::updateModelsFromJson()
|
|||||||
|
|
||||||
void ModelList::updateModelsFromJsonAsync()
|
void ModelList::updateModelsFromJsonAsync()
|
||||||
{
|
{
|
||||||
|
m_asyncModelRequestOngoing = true;
|
||||||
|
emit asyncModelRequestOngoingChanged();
|
||||||
|
|
||||||
#if defined(USE_LOCAL_MODELSJSON)
|
#if defined(USE_LOCAL_MODELSJSON)
|
||||||
QUrl jsonUrl("file://" + QDir::homePath() + "/dev/large_language_models/gpt4all/gpt4all-chat/metadata/models.json");
|
QUrl jsonUrl("file://" + QDir::homePath() + "/dev/large_language_models/gpt4all/gpt4all-chat/metadata/models.json");
|
||||||
#else
|
#else
|
||||||
@@ -911,17 +915,37 @@ void ModelList::updateModelsFromJsonAsync()
|
|||||||
QNetworkReply *jsonReply = m_networkManager.get(request);
|
QNetworkReply *jsonReply = m_networkManager.get(request);
|
||||||
connect(qApp, &QCoreApplication::aboutToQuit, jsonReply, &QNetworkReply::abort);
|
connect(qApp, &QCoreApplication::aboutToQuit, jsonReply, &QNetworkReply::abort);
|
||||||
connect(jsonReply, &QNetworkReply::finished, this, &ModelList::handleModelsJsonDownloadFinished);
|
connect(jsonReply, &QNetworkReply::finished, this, &ModelList::handleModelsJsonDownloadFinished);
|
||||||
|
connect(jsonReply, &QNetworkReply::errorOccurred, this, &ModelList::handleModelsJsonDownloadErrorOccurred);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ModelList::handleModelsJsonDownloadFinished()
|
void ModelList::handleModelsJsonDownloadFinished()
|
||||||
{
|
{
|
||||||
QNetworkReply *jsonReply = qobject_cast<QNetworkReply *>(sender());
|
QNetworkReply *jsonReply = qobject_cast<QNetworkReply *>(sender());
|
||||||
if (!jsonReply)
|
if (!jsonReply) {
|
||||||
|
m_asyncModelRequestOngoing = false;
|
||||||
|
emit asyncModelRequestOngoingChanged();
|
||||||
return;
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
QByteArray jsonData = jsonReply->readAll();
|
QByteArray jsonData = jsonReply->readAll();
|
||||||
jsonReply->deleteLater();
|
jsonReply->deleteLater();
|
||||||
parseModelsJsonFile(jsonData, true);
|
parseModelsJsonFile(jsonData, true);
|
||||||
|
m_asyncModelRequestOngoing = false;
|
||||||
|
emit asyncModelRequestOngoingChanged();
|
||||||
|
}
|
||||||
|
|
||||||
|
void ModelList::handleModelsJsonDownloadErrorOccurred(QNetworkReply::NetworkError code)
|
||||||
|
{
|
||||||
|
// TODO: Show what error occured in the GUI
|
||||||
|
m_asyncModelRequestOngoing = false;
|
||||||
|
emit asyncModelRequestOngoingChanged();
|
||||||
|
|
||||||
|
QNetworkReply *reply = qobject_cast<QNetworkReply *>(sender());
|
||||||
|
if (!reply)
|
||||||
|
return;
|
||||||
|
|
||||||
|
qWarning() << QString("ERROR: Modellist download failed with error code \"%1-%2\"")
|
||||||
|
.arg(code).arg(reply->errorString()).toStdString();
|
||||||
}
|
}
|
||||||
|
|
||||||
void ModelList::handleSslErrors(QNetworkReply *reply, const QList<QSslError> &errors)
|
void ModelList::handleSslErrors(QNetworkReply *reply, const QList<QSslError> &errors)
|
||||||
|
@@ -169,6 +169,7 @@ class ModelList : public QAbstractListModel
|
|||||||
Q_PROPERTY(InstalledModels* installedModels READ installedModels NOTIFY installedModelsChanged)
|
Q_PROPERTY(InstalledModels* installedModels READ installedModels NOTIFY installedModelsChanged)
|
||||||
Q_PROPERTY(DownloadableModels* downloadableModels READ downloadableModels NOTIFY downloadableModelsChanged)
|
Q_PROPERTY(DownloadableModels* downloadableModels READ downloadableModels NOTIFY downloadableModelsChanged)
|
||||||
Q_PROPERTY(QList<QString> userDefaultModelList READ userDefaultModelList NOTIFY userDefaultModelListChanged)
|
Q_PROPERTY(QList<QString> userDefaultModelList READ userDefaultModelList NOTIFY userDefaultModelListChanged)
|
||||||
|
Q_PROPERTY(bool asyncModelRequestOngoing READ asyncModelRequestOngoing NOTIFY asyncModelRequestOngoingChanged)
|
||||||
|
|
||||||
public:
|
public:
|
||||||
static ModelList *globalInstance();
|
static ModelList *globalInstance();
|
||||||
@@ -296,12 +297,14 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
QString incompleteDownloadPath(const QString &modelFile);
|
QString incompleteDownloadPath(const QString &modelFile);
|
||||||
|
bool asyncModelRequestOngoing() const { return m_asyncModelRequestOngoing; }
|
||||||
|
|
||||||
Q_SIGNALS:
|
Q_SIGNALS:
|
||||||
void countChanged();
|
void countChanged();
|
||||||
void installedModelsChanged();
|
void installedModelsChanged();
|
||||||
void downloadableModelsChanged();
|
void downloadableModelsChanged();
|
||||||
void userDefaultModelListChanged();
|
void userDefaultModelListChanged();
|
||||||
|
void asyncModelRequestOngoingChanged();
|
||||||
|
|
||||||
private Q_SLOTS:
|
private Q_SLOTS:
|
||||||
void updateModelsFromJson();
|
void updateModelsFromJson();
|
||||||
@@ -310,6 +313,7 @@ private Q_SLOTS:
|
|||||||
void updateModelsFromDirectory();
|
void updateModelsFromDirectory();
|
||||||
void updateDataForSettings();
|
void updateDataForSettings();
|
||||||
void handleModelsJsonDownloadFinished();
|
void handleModelsJsonDownloadFinished();
|
||||||
|
void handleModelsJsonDownloadErrorOccurred(QNetworkReply::NetworkError code);
|
||||||
void handleSslErrors(QNetworkReply *reply, const QList<QSslError> &errors);
|
void handleSslErrors(QNetworkReply *reply, const QList<QSslError> &errors);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
@@ -328,6 +332,7 @@ private:
|
|||||||
QList<ModelInfo*> m_models;
|
QList<ModelInfo*> m_models;
|
||||||
QHash<QString, ModelInfo*> m_modelMap;
|
QHash<QString, ModelInfo*> m_modelMap;
|
||||||
QFileSystemWatcher *m_watcher;
|
QFileSystemWatcher *m_watcher;
|
||||||
|
bool m_asyncModelRequestOngoing;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
explicit ModelList();
|
explicit ModelList();
|
||||||
|
@@ -41,7 +41,7 @@ MyDialog {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Label {
|
Label {
|
||||||
visible: !ModelList.downloadableModels.count
|
visible: !ModelList.downloadableModels.count && !ModelList.asyncModelRequestOngoing
|
||||||
Layout.fillWidth: true
|
Layout.fillWidth: true
|
||||||
Layout.fillHeight: true
|
Layout.fillHeight: true
|
||||||
horizontalAlignment: Qt.AlignHCenter
|
horizontalAlignment: Qt.AlignHCenter
|
||||||
@@ -50,6 +50,14 @@ MyDialog {
|
|||||||
color: theme.mutedTextColor
|
color: theme.mutedTextColor
|
||||||
}
|
}
|
||||||
|
|
||||||
|
MyBusyIndicator {
|
||||||
|
visible: !ModelList.downloadableModels.count && ModelList.asyncModelRequestOngoing
|
||||||
|
running: ModelList.asyncModelRequestOngoing
|
||||||
|
Accessible.role: Accessible.Animation
|
||||||
|
Accessible.name: qsTr("Busy indicator")
|
||||||
|
Accessible.description: qsTr("Displayed when the models request is ongoing")
|
||||||
|
}
|
||||||
|
|
||||||
ScrollView {
|
ScrollView {
|
||||||
id: scrollView
|
id: scrollView
|
||||||
ScrollBar.vertical.policy: ScrollBar.AlwaysOn
|
ScrollBar.vertical.policy: ScrollBar.AlwaysOn
|
||||||
|
Reference in New Issue
Block a user