diff --git a/gpt4all-chat/download.cpp b/gpt4all-chat/download.cpp index d04fdb71..3d08475d 100644 --- a/gpt4all-chat/download.cpp +++ b/gpt4all-chat/download.cpp @@ -343,6 +343,15 @@ void Download::parseModelsJsonFile(const QByteArray &jsonData) ModelList::globalInstance()->updateData(modelFilename, ModelList::QuantRole, "NA"); ModelList::globalInstance()->updateData(modelFilename, ModelList::TypeRole, "GPT"); } + + if (ModelList::globalInstance()->installedModels()->count()) { + const QString firstModel = + ModelList::globalInstance()->installedModels()->firstFilename(); + QSettings settings; + settings.sync(); + settings.setValue("defaultModel", firstModel); + settings.sync(); + } } void Download::handleReleaseJsonDownloadFinished() diff --git a/gpt4all-chat/modellist.cpp b/gpt4all-chat/modellist.cpp index 1ed55f61..5fe8735b 100644 --- a/gpt4all-chat/modellist.cpp +++ b/gpt4all-chat/modellist.cpp @@ -24,6 +24,16 @@ int InstalledModels::count() const return rowCount(); } +QString InstalledModels::firstFilename() const +{ + if (rowCount() > 0) { + QModelIndex firstIndex = index(0, 0); + return sourceModel()->data(firstIndex, ModelList::FilenameRole).toString(); + } else { + return QString(); + } +} + DownloadableModels::DownloadableModels(QObject *parent) : QSortFilterProxyModel(parent) , m_expanded(false) @@ -141,15 +151,28 @@ ModelInfo ModelList::defaultModelInfo() const // The user default model can be set by the user in the settings dialog. The "default" user // default model is "Application default" which signals we should use the default model that was // specified by the models.json file. - const QString defaultModelName = settings.value("userDefaultModel").toString(); - const bool hasDefaultName = !defaultModelName.isEmpty() && defaultModelName != "Application default"; + const QString userDefaultModelName = settings.value("userDefaultModel").toString(); + const bool hasUserDefaultName = !userDefaultModelName.isEmpty() && userDefaultModelName != "Application default"; + const QString defaultModelName = settings.value("defaultModel").toString(); + const bool hasDefaultName = hasUserDefaultName ? false : !defaultModelName.isEmpty(); + ModelInfo *defaultModel = nullptr; for (ModelInfo *info : m_models) { if (!info->installed) continue; defaultModel = info; - if (!hasDefaultName) break; - if (hasDefaultName && (defaultModel->name == defaultModelName || defaultModel->filename == defaultModelName)) break; + + // If we don't have either setting, then just use the first model that is installed + if (!hasUserDefaultName && !hasDefaultName) + break; + + // If we don't have a user specified default, but *do* have a default setting and match, then use it + if (!hasUserDefaultName && hasDefaultName && (defaultModel->name == defaultModelName || defaultModel->filename == defaultModelName)) + break; + + // If we have a user specified default and match, then use it + if (hasUserDefaultName && (defaultModel->name == userDefaultModelName || defaultModel->filename == userDefaultModelName)) + break; } if (defaultModel) return *defaultModel; diff --git a/gpt4all-chat/modellist.h b/gpt4all-chat/modellist.h index de42014d..ea8fb82b 100644 --- a/gpt4all-chat/modellist.h +++ b/gpt4all-chat/modellist.h @@ -73,6 +73,7 @@ class InstalledModels : public QSortFilterProxyModel public: explicit InstalledModels(QObject *parent); int count() const; + QString firstFilename() const; Q_SIGNALS: void countChanged();