diff --git a/gpt4all-chat/CHANGELOG.md b/gpt4all-chat/CHANGELOG.md
index 2fada9064e76..5278d4d999fd 100644
--- a/gpt4all-chat/CHANGELOG.md
+++ b/gpt4all-chat/CHANGELOG.md
@@ -6,6 +6,9 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).
## [Unreleased]
+### Added
+- Create separate download pages for built-in and HuggingFace models ([#3269](https://github.com/nomic-ai/gpt4all/pull/3269))
+
### Fixed
- Fix API server ignoring assistant messages in history after v3.5.0 ([#3256](https://github.com/nomic-ai/gpt4all/pull/3256))
- Fix API server replying with incorrect token counts and stop reason after v3.5.0 ([#3256](https://github.com/nomic-ai/gpt4all/pull/3256))
diff --git a/gpt4all-chat/CMakeLists.txt b/gpt4all-chat/CMakeLists.txt
index afbd59a4f414..a9b060b3f33f 100644
--- a/gpt4all-chat/CMakeLists.txt
+++ b/gpt4all-chat/CMakeLists.txt
@@ -221,6 +221,8 @@ qt_add_qml_module(chat
main.qml
qml/AddCollectionView.qml
qml/AddModelView.qml
+ qml/AddGPT4AllModelView.qml
+ qml/AddHFModelView.qml
qml/ApplicationSettings.qml
qml/ChatDrawer.qml
qml/ChatItemView.qml
@@ -244,6 +246,7 @@ qt_add_qml_module(chat
qml/ToastManager.qml
qml/MyBusyIndicator.qml
qml/MyButton.qml
+ qml/MyTabButton.qml
qml/MyCheckBox.qml
qml/MyComboBox.qml
qml/MyDialog.qml
diff --git a/gpt4all-chat/main.qml b/gpt4all-chat/main.qml
index b035e5d9bb29..2dc4410c6129 100644
--- a/gpt4all-chat/main.qml
+++ b/gpt4all-chat/main.qml
@@ -674,9 +674,6 @@ Window {
function show() {
stackLayout.currentIndex = 2;
- // FIXME This expanded code should be removed and we should be changing the names of
- // the classes here in ModelList for the proxy/filter models
- ModelList.downloadableModels.expanded = true
}
function isShown() {
diff --git a/gpt4all-chat/qml/AddGPT4AllModelView.qml b/gpt4all-chat/qml/AddGPT4AllModelView.qml
new file mode 100644
index 000000000000..dd8da3ed90f5
--- /dev/null
+++ b/gpt4all-chat/qml/AddGPT4AllModelView.qml
@@ -0,0 +1,546 @@
+import QtCore
+import QtQuick
+import QtQuick.Controls
+import QtQuick.Controls.Basic
+import QtQuick.Layouts
+import QtQuick.Dialogs
+import Qt.labs.folderlistmodel
+import Qt5Compat.GraphicalEffects
+
+import llm
+import chatlistmodel
+import download
+import modellist
+import network
+import gpt4all
+import mysettings
+import localdocs
+
+ColumnLayout {
+ Layout.fillWidth: true
+ Layout.alignment: Qt.AlignTop
+ spacing: 5
+
+ Label {
+ Layout.topMargin: 0
+ Layout.bottomMargin: 25
+ Layout.rightMargin: 150 * theme.fontScale
+ Layout.alignment: Qt.AlignTop
+ Layout.fillWidth: true
+ verticalAlignment: Text.AlignTop
+ text: qsTr("These models have been specifically configured for use in GPT4All. The first few models on the " +
+ "list are known to work the best, but you should only attempt to use models that will fit in your " +
+ "available memory.")
+ font.pixelSize: theme.fontSizeLarger
+ color: theme.textColor
+ wrapMode: Text.WordWrap
+ }
+
+ Label {
+ visible: !ModelList.gpt4AllDownloadableModels.count && !ModelList.asyncModelRequestOngoing
+ Layout.fillWidth: true
+ Layout.fillHeight: true
+ horizontalAlignment: Qt.AlignHCenter
+ verticalAlignment: Qt.AlignVCenter
+ text: qsTr("Network error: could not retrieve %1").arg("http://gpt4all.io/models/models3.json")
+ font.pixelSize: theme.fontSizeLarge
+ color: theme.mutedTextColor
+ }
+
+ MyBusyIndicator {
+ visible: !ModelList.gpt4AllDownloadableModels.count && ModelList.asyncModelRequestOngoing
+ running: ModelList.asyncModelRequestOngoing
+ Accessible.role: Accessible.Animation
+ Layout.alignment: Qt.AlignCenter
+ Accessible.name: qsTr("Busy indicator")
+ Accessible.description: qsTr("Displayed when the models request is ongoing")
+ }
+
+ ScrollView {
+ id: scrollView
+ ScrollBar.vertical.policy: ScrollBar.AsNeeded
+ Layout.fillWidth: true
+ Layout.fillHeight: true
+ clip: true
+
+ ListView {
+ id: modelListView
+ model: ModelList.gpt4AllDownloadableModels
+ boundsBehavior: Flickable.StopAtBounds
+ spacing: 30
+
+ delegate: Rectangle {
+ id: delegateItem
+ width: modelListView.width
+ height: childrenRect.height + 60
+ color: theme.conversationBackground
+ radius: 10
+ border.width: 1
+ border.color: theme.controlBorder
+
+ ColumnLayout {
+ anchors.top: parent.top
+ anchors.left: parent.left
+ anchors.right: parent.right
+ anchors.margins: 30
+
+ Text {
+ Layout.fillWidth: true
+ Layout.alignment: Qt.AlignLeft
+ text: name
+ elide: Text.ElideRight
+ color: theme.titleTextColor
+ font.pixelSize: theme.fontSizeLargest
+ font.bold: true
+ Accessible.role: Accessible.Paragraph
+ Accessible.name: qsTr("Model file")
+ Accessible.description: qsTr("Model file to be downloaded")
+ }
+
+
+ Rectangle {
+ Layout.fillWidth: true
+ height: 1
+ color: theme.dividerColor
+ }
+
+ RowLayout {
+ Layout.topMargin: 10
+ Layout.fillWidth: true
+ Text {
+ id: descriptionText
+ text: description
+ font.pixelSize: theme.fontSizeLarge
+ Layout.fillWidth: true
+ wrapMode: Text.WordWrap
+ textFormat: Text.StyledText
+ color: theme.textColor
+ linkColor: theme.textColor
+ Accessible.role: Accessible.Paragraph
+ Accessible.name: qsTr("Description")
+ Accessible.description: qsTr("File description")
+ onLinkActivated: function(link) { Qt.openUrlExternally(link); }
+ MouseArea {
+ anchors.fill: parent
+ acceptedButtons: Qt.NoButton // pass clicks to parent
+ cursorShape: parent.hoveredLink ? Qt.PointingHandCursor : Qt.ArrowCursor
+ }
+ }
+
+ // FIXME Need to overhaul design here which must take into account
+ // features not present in current figma including:
+ // * Ability to cancel a current download
+ // * Ability to resume a download
+ // * The presentation of an error if encountered
+ // * Whether to show already installed models
+ // * Install of remote models with API keys
+ // * The presentation of the progress bar
+ Rectangle {
+ id: actionBox
+ width: childrenRect.width + 20
+ color: "transparent"
+ border.width: 1
+ border.color: theme.dividerColor
+ radius: 10
+ Layout.rightMargin: 20
+ Layout.bottomMargin: 20
+ Layout.minimumHeight: childrenRect.height + 20
+ Layout.alignment: Qt.AlignRight | Qt.AlignTop
+
+ ColumnLayout {
+ spacing: 0
+ MySettingsButton {
+ id: downloadButton
+ text: isDownloading ? qsTr("Cancel") : isIncomplete ? qsTr("Resume") : qsTr("Download")
+ font.pixelSize: theme.fontSizeLarge
+ Layout.topMargin: 20
+ Layout.leftMargin: 20
+ Layout.minimumWidth: 200
+ Layout.fillWidth: true
+ Layout.alignment: Qt.AlignTop | Qt.AlignHCenter
+ visible: !isOnline && !installed && !calcHash && downloadError === ""
+ Accessible.description: qsTr("Stop/restart/start the download")
+ onClicked: {
+ if (!isDownloading) {
+ Download.downloadModel(filename);
+ } else {
+ Download.cancelDownload(filename);
+ }
+ }
+ }
+
+ MySettingsDestructiveButton {
+ id: removeButton
+ text: qsTr("Remove")
+ Layout.topMargin: 20
+ Layout.leftMargin: 20
+ Layout.minimumWidth: 200
+ Layout.fillWidth: true
+ Layout.alignment: Qt.AlignTop | Qt.AlignHCenter
+ visible: !isDownloading && (installed || isIncomplete)
+ Accessible.description: qsTr("Remove model from filesystem")
+ onClicked: {
+ Download.removeModel(filename);
+ }
+ }
+
+ MySettingsButton {
+ id: installButton
+ visible: !installed && isOnline
+ Layout.topMargin: 20
+ Layout.leftMargin: 20
+ Layout.minimumWidth: 200
+ Layout.fillWidth: true
+ Layout.alignment: Qt.AlignTop | Qt.AlignHCenter
+ text: qsTr("Install")
+ font.pixelSize: theme.fontSizeLarge
+ onClicked: {
+ var apiKeyText = apiKey.text.trim(),
+ baseUrlText = baseUrl.text.trim(),
+ modelNameText = modelName.text.trim();
+
+ var apiKeyOk = apiKeyText !== "",
+ baseUrlOk = !isCompatibleApi || baseUrlText !== "",
+ modelNameOk = !isCompatibleApi || modelNameText !== "";
+
+ if (!apiKeyOk)
+ apiKey.showError();
+ if (!baseUrlOk)
+ baseUrl.showError();
+ if (!modelNameOk)
+ modelName.showError();
+
+ if (!apiKeyOk || !baseUrlOk || !modelNameOk)
+ return;
+
+ if (!isCompatibleApi)
+ Download.installModel(
+ filename,
+ apiKeyText,
+ );
+ else
+ Download.installCompatibleModel(
+ modelNameText,
+ apiKeyText,
+ baseUrlText,
+ );
+ }
+ Accessible.role: Accessible.Button
+ Accessible.name: qsTr("Install")
+ Accessible.description: qsTr("Install online model")
+ }
+
+ ColumnLayout {
+ spacing: 0
+ Label {
+ Layout.topMargin: 20
+ Layout.leftMargin: 20
+ visible: downloadError !== ""
+ textFormat: Text.StyledText
+ text: qsTr("Error")
+ color: theme.textColor
+ font.pixelSize: theme.fontSizeLarge
+ linkColor: theme.textErrorColor
+ Accessible.role: Accessible.Paragraph
+ Accessible.name: text
+ Accessible.description: qsTr("Describes an error that occurred when downloading")
+ onLinkActivated: {
+ downloadingErrorPopup.text = downloadError;
+ downloadingErrorPopup.open();
+ }
+ }
+
+ Label {
+ visible: LLM.systemTotalRAMInGB() < ramrequired
+ Layout.topMargin: 20
+ Layout.leftMargin: 20
+ Layout.maximumWidth: 300
+ textFormat: Text.StyledText
+ text: qsTr("WARNING: Not recommended for your hardware. Model requires more memory (%1 GB) than your system has available (%2).").arg(ramrequired).arg(LLM.systemTotalRAMInGBString())
+ color: theme.textErrorColor
+ font.pixelSize: theme.fontSizeLarge
+ wrapMode: Text.WordWrap
+ Accessible.role: Accessible.Paragraph
+ Accessible.name: text
+ Accessible.description: qsTr("Error for incompatible hardware")
+ onLinkActivated: {
+ downloadingErrorPopup.text = downloadError;
+ downloadingErrorPopup.open();
+ }
+ }
+ }
+
+ ColumnLayout {
+ visible: isDownloading && !calcHash
+ Layout.topMargin: 20
+ Layout.leftMargin: 20
+ Layout.minimumWidth: 200
+ Layout.fillWidth: true
+ Layout.alignment: Qt.AlignTop | Qt.AlignHCenter
+ spacing: 20
+
+ ProgressBar {
+ id: itemProgressBar
+ Layout.fillWidth: true
+ width: 200
+ value: bytesReceived / bytesTotal
+ background: Rectangle {
+ implicitHeight: 45
+ color: theme.progressBackground
+ radius: 3
+ }
+ contentItem: Item {
+ implicitHeight: 40
+
+ Rectangle {
+ width: itemProgressBar.visualPosition * parent.width
+ height: parent.height
+ radius: 2
+ color: theme.progressForeground
+ }
+ }
+ Accessible.role: Accessible.ProgressBar
+ Accessible.name: qsTr("Download progressBar")
+ Accessible.description: qsTr("Shows the progress made in the download")
+ }
+
+ Label {
+ id: speedLabel
+ color: theme.textColor
+ Layout.alignment: Qt.AlignRight
+ text: speed
+ font.pixelSize: theme.fontSizeLarge
+ Accessible.role: Accessible.Paragraph
+ Accessible.name: qsTr("Download speed")
+ Accessible.description: qsTr("Download speed in bytes/kilobytes/megabytes per second")
+ }
+ }
+
+ RowLayout {
+ visible: calcHash
+ Layout.topMargin: 20
+ Layout.leftMargin: 20
+ Layout.minimumWidth: 200
+ Layout.maximumWidth: 200
+ Layout.fillWidth: true
+ Layout.alignment: Qt.AlignTop | Qt.AlignHCenter
+ clip: true
+
+ Label {
+ id: calcHashLabel
+ color: theme.textColor
+ text: qsTr("Calculating...")
+ font.pixelSize: theme.fontSizeLarge
+ Accessible.role: Accessible.Paragraph
+ Accessible.name: text
+ Accessible.description: qsTr("Whether the file hash is being calculated")
+ }
+
+ MyBusyIndicator {
+ id: busyCalcHash
+ running: calcHash
+ Accessible.role: Accessible.Animation
+ Accessible.name: qsTr("Busy indicator")
+ Accessible.description: qsTr("Displayed when the file hash is being calculated")
+ }
+ }
+
+ MyTextField {
+ id: apiKey
+ visible: !installed && isOnline
+ Layout.topMargin: 20
+ Layout.leftMargin: 20
+ Layout.minimumWidth: 200
+ Layout.alignment: Qt.AlignTop | Qt.AlignHCenter
+ wrapMode: Text.WrapAnywhere
+ function showError() {
+ messageToast.show(qsTr("ERROR: $API_KEY is empty."));
+ apiKey.placeholderTextColor = theme.textErrorColor;
+ }
+ onTextChanged: {
+ apiKey.placeholderTextColor = theme.mutedTextColor;
+ }
+ placeholderText: qsTr("enter $API_KEY")
+ Accessible.role: Accessible.EditableText
+ Accessible.name: placeholderText
+ Accessible.description: qsTr("Whether the file hash is being calculated")
+ }
+
+ MyTextField {
+ id: baseUrl
+ visible: !installed && isOnline && isCompatibleApi
+ Layout.topMargin: 20
+ Layout.leftMargin: 20
+ Layout.minimumWidth: 200
+ Layout.alignment: Qt.AlignTop | Qt.AlignHCenter
+ wrapMode: Text.WrapAnywhere
+ function showError() {
+ messageToast.show(qsTr("ERROR: $BASE_URL is empty."));
+ baseUrl.placeholderTextColor = theme.textErrorColor;
+ }
+ onTextChanged: {
+ baseUrl.placeholderTextColor = theme.mutedTextColor;
+ }
+ placeholderText: qsTr("enter $BASE_URL")
+ Accessible.role: Accessible.EditableText
+ Accessible.name: placeholderText
+ Accessible.description: qsTr("Whether the file hash is being calculated")
+ }
+
+ MyTextField {
+ id: modelName
+ visible: !installed && isOnline && isCompatibleApi
+ Layout.topMargin: 20
+ Layout.leftMargin: 20
+ Layout.minimumWidth: 200
+ Layout.alignment: Qt.AlignTop | Qt.AlignHCenter
+ wrapMode: Text.WrapAnywhere
+ function showError() {
+ messageToast.show(qsTr("ERROR: $MODEL_NAME is empty."))
+ modelName.placeholderTextColor = theme.textErrorColor;
+ }
+ onTextChanged: {
+ modelName.placeholderTextColor = theme.mutedTextColor;
+ }
+ placeholderText: qsTr("enter $MODEL_NAME")
+ Accessible.role: Accessible.EditableText
+ Accessible.name: placeholderText
+ Accessible.description: qsTr("Whether the file hash is being calculated")
+ }
+ }
+ }
+ }
+
+ Item {
+ Layout.minimumWidth: childrenRect.width
+ Layout.minimumHeight: childrenRect.height
+ Layout.bottomMargin: 10
+ RowLayout {
+ id: paramRow
+ anchors.centerIn: parent
+ ColumnLayout {
+ Layout.topMargin: 10
+ Layout.bottomMargin: 10
+ Layout.leftMargin: 20
+ Layout.rightMargin: 20
+ Text {
+ text: qsTr("File size")
+ font.pixelSize: theme.fontSizeSmall
+ color: theme.mutedDarkTextColor
+ }
+ Text {
+ text: filesize
+ color: theme.textColor
+ font.pixelSize: theme.fontSizeSmall
+ font.bold: true
+ }
+ }
+ Rectangle {
+ width: 1
+ Layout.fillHeight: true
+ color: theme.dividerColor
+ }
+ ColumnLayout {
+ Layout.topMargin: 10
+ Layout.bottomMargin: 10
+ Layout.leftMargin: 20
+ Layout.rightMargin: 20
+ Text {
+ text: qsTr("RAM required")
+ font.pixelSize: theme.fontSizeSmall
+ color: theme.mutedDarkTextColor
+ }
+ Text {
+ text: ramrequired >= 0 ? qsTr("%1 GB").arg(ramrequired) : qsTr("?")
+ color: theme.textColor
+ font.pixelSize: theme.fontSizeSmall
+ font.bold: true
+ }
+ }
+ Rectangle {
+ width: 1
+ Layout.fillHeight: true
+ color: theme.dividerColor
+ }
+ ColumnLayout {
+ Layout.topMargin: 10
+ Layout.bottomMargin: 10
+ Layout.leftMargin: 20
+ Layout.rightMargin: 20
+ Text {
+ text: qsTr("Parameters")
+ font.pixelSize: theme.fontSizeSmall
+ color: theme.mutedDarkTextColor
+ }
+ Text {
+ text: parameters !== "" ? parameters : qsTr("?")
+ color: theme.textColor
+ font.pixelSize: theme.fontSizeSmall
+ font.bold: true
+ }
+ }
+ Rectangle {
+ width: 1
+ Layout.fillHeight: true
+ color: theme.dividerColor
+ }
+ ColumnLayout {
+ Layout.topMargin: 10
+ Layout.bottomMargin: 10
+ Layout.leftMargin: 20
+ Layout.rightMargin: 20
+ Text {
+ text: qsTr("Quant")
+ font.pixelSize: theme.fontSizeSmall
+ color: theme.mutedDarkTextColor
+ }
+ Text {
+ text: quant
+ color: theme.textColor
+ font.pixelSize: theme.fontSizeSmall
+ font.bold: true
+ }
+ }
+ Rectangle {
+ width: 1
+ Layout.fillHeight: true
+ color: theme.dividerColor
+ }
+ ColumnLayout {
+ Layout.topMargin: 10
+ Layout.bottomMargin: 10
+ Layout.leftMargin: 20
+ Layout.rightMargin: 20
+ Text {
+ text: qsTr("Type")
+ font.pixelSize: theme.fontSizeSmall
+ color: theme.mutedDarkTextColor
+ }
+ Text {
+ text: type
+ color: theme.textColor
+ font.pixelSize: theme.fontSizeSmall
+ font.bold: true
+ }
+ }
+ }
+
+ Rectangle {
+ color: "transparent"
+ anchors.fill: paramRow
+ border.color: theme.dividerColor
+ border.width: 1
+ radius: 10
+ }
+ }
+
+ Rectangle {
+ Layout.fillWidth: true
+ height: 1
+ color: theme.dividerColor
+ }
+ }
+ }
+ }
+ }
+}
diff --git a/gpt4all-chat/qml/AddHFModelView.qml b/gpt4all-chat/qml/AddHFModelView.qml
new file mode 100644
index 000000000000..0435e2b5f8c8
--- /dev/null
+++ b/gpt4all-chat/qml/AddHFModelView.qml
@@ -0,0 +1,703 @@
+import QtCore
+import QtQuick
+import QtQuick.Controls
+import QtQuick.Controls.Basic
+import QtQuick.Layouts
+import QtQuick.Dialogs
+import Qt.labs.folderlistmodel
+import Qt5Compat.GraphicalEffects
+
+import llm
+import chatlistmodel
+import download
+import modellist
+import network
+import gpt4all
+import mysettings
+import localdocs
+
+ColumnLayout {
+ Layout.fillWidth: true
+ Layout.fillHeight: true
+ Layout.alignment: Qt.AlignTop
+ spacing: 5
+
+ Label {
+ Layout.topMargin: 0
+ Layout.bottomMargin: 25
+ Layout.rightMargin: 150 * theme.fontScale
+ Layout.alignment: Qt.AlignTop
+ Layout.fillWidth: true
+ verticalAlignment: Text.AlignTop
+ text: qsTr("Use the search to find and download models from HuggingFace. There is NO GUARANTEE that these " +
+ "will work. Many will require additional configuration before they can be used.")
+ font.pixelSize: theme.fontSizeLarger
+ color: theme.textColor
+ wrapMode: Text.WordWrap
+ }
+
+ RowLayout {
+ Layout.fillWidth: true
+ Layout.fillHeight: true
+ Layout.alignment: Qt.AlignCenter
+ Layout.margins: 0
+ spacing: 10
+ MyTextField {
+ id: discoverField
+ property string textBeingSearched: ""
+ readOnly: ModelList.discoverInProgress
+ Layout.alignment: Qt.AlignCenter
+ Layout.fillWidth: true
+ font.pixelSize: theme.fontSizeLarger
+ placeholderText: qsTr("Discover and download models by keyword search...")
+ Accessible.role: Accessible.EditableText
+ Accessible.name: placeholderText
+ Accessible.description: qsTr("Text field for discovering and filtering downloadable models")
+ Connections {
+ target: ModelList
+ function onDiscoverInProgressChanged() {
+ if (ModelList.discoverInProgress) {
+ discoverField.textBeingSearched = discoverField.text;
+ discoverField.text = qsTr("Searching \u00B7 %1").arg(discoverField.textBeingSearched);
+ } else {
+ discoverField.text = discoverField.textBeingSearched;
+ discoverField.textBeingSearched = "";
+ }
+ }
+ }
+ background: ProgressBar {
+ id: discoverProgressBar
+ indeterminate: ModelList.discoverInProgress && ModelList.discoverProgress === 0.0
+ value: ModelList.discoverProgress
+ background: Rectangle {
+ color: theme.controlBackground
+ border.color: theme.controlBorder
+ radius: 10
+ }
+ contentItem: Item {
+ Rectangle {
+ visible: ModelList.discoverInProgress
+ anchors.bottom: parent.bottom
+ width: discoverProgressBar.visualPosition * parent.width
+ height: 10
+ radius: 2
+ color: theme.progressForeground
+ }
+ }
+ }
+
+ Keys.onReturnPressed: (event)=> {
+ if (event.modifiers & Qt.ControlModifier || event.modifiers & Qt.ShiftModifier)
+ event.accepted = false;
+ else {
+ editingFinished();
+ sendDiscovery()
+ }
+ }
+ function sendDiscovery() {
+ ModelList.huggingFaceDownloadableModels.discoverAndFilter(discoverField.text);
+ }
+ RowLayout {
+ spacing: 0
+ anchors.right: discoverField.right
+ anchors.verticalCenter: discoverField.verticalCenter
+ anchors.rightMargin: 15
+ visible: !ModelList.discoverInProgress
+ MyMiniButton {
+ id: clearDiscoverButton
+ backgroundColor: theme.textColor
+ backgroundColorHovered: theme.iconBackgroundDark
+ visible: discoverField.text !== ""
+ source: "qrc:/gpt4all/icons/close.svg"
+ onClicked: {
+ discoverField.text = ""
+ discoverField.sendDiscovery() // should clear results
+ }
+ }
+ MyMiniButton {
+ backgroundColor: theme.textColor
+ backgroundColorHovered: theme.iconBackgroundDark
+ source: "qrc:/gpt4all/icons/settings.svg"
+ onClicked: {
+ discoveryTools.visible = !discoveryTools.visible
+ }
+ }
+ MyMiniButton {
+ id: sendButton
+ enabled: !ModelList.discoverInProgress
+ backgroundColor: theme.textColor
+ backgroundColorHovered: theme.iconBackgroundDark
+ source: "qrc:/gpt4all/icons/send_message.svg"
+ Accessible.name: qsTr("Initiate model discovery and filtering")
+ Accessible.description: qsTr("Triggers discovery and filtering of models")
+ onClicked: {
+ discoverField.sendDiscovery()
+ }
+ }
+ }
+ }
+ }
+
+ RowLayout {
+ id: discoveryTools
+ Layout.fillWidth: true
+ Layout.alignment: Qt.AlignCenter
+ Layout.margins: 0
+ spacing: 20
+ visible: false
+ MyComboBox {
+ id: comboSort
+ model: ListModel {
+ ListElement { name: qsTr("Default") }
+ ListElement { name: qsTr("Likes") }
+ ListElement { name: qsTr("Downloads") }
+ ListElement { name: qsTr("Recent") }
+ }
+ currentIndex: ModelList.discoverSort
+ contentItem: Text {
+ anchors.horizontalCenter: parent.horizontalCenter
+ rightPadding: 30
+ color: theme.textColor
+ text: {
+ return qsTr("Sort by: %1").arg(comboSort.displayText)
+ }
+ font.pixelSize: theme.fontSizeLarger
+ verticalAlignment: Text.AlignVCenter
+ horizontalAlignment: Text.AlignHCenter
+ elide: Text.ElideRight
+ }
+ onActivated: function (index) {
+ ModelList.discoverSort = index;
+ }
+ }
+ MyComboBox {
+ id: comboSortDirection
+ model: ListModel {
+ ListElement { name: qsTr("Asc") }
+ ListElement { name: qsTr("Desc") }
+ }
+ currentIndex: {
+ if (ModelList.discoverSortDirection === 1)
+ return 0
+ else
+ return 1;
+ }
+ contentItem: Text {
+ anchors.horizontalCenter: parent.horizontalCenter
+ rightPadding: 30
+ color: theme.textColor
+ text: {
+ return qsTr("Sort dir: %1").arg(comboSortDirection.displayText)
+ }
+ font.pixelSize: theme.fontSizeLarger
+ verticalAlignment: Text.AlignVCenter
+ horizontalAlignment: Text.AlignHCenter
+ elide: Text.ElideRight
+ }
+ onActivated: function (index) {
+ if (index === 0)
+ ModelList.discoverSortDirection = 1;
+ else
+ ModelList.discoverSortDirection = -1;
+ }
+ }
+ MyComboBox {
+ id: comboLimit
+ model: ListModel {
+ ListElement { name: "5" }
+ ListElement { name: "10" }
+ ListElement { name: "20" }
+ ListElement { name: "50" }
+ ListElement { name: "100" }
+ ListElement { name: qsTr("None") }
+ }
+
+ currentIndex: {
+ if (ModelList.discoverLimit === 5)
+ return 0;
+ else if (ModelList.discoverLimit === 10)
+ return 1;
+ else if (ModelList.discoverLimit === 20)
+ return 2;
+ else if (ModelList.discoverLimit === 50)
+ return 3;
+ else if (ModelList.discoverLimit === 100)
+ return 4;
+ else if (ModelList.discoverLimit === -1)
+ return 5;
+ }
+ contentItem: Text {
+ anchors.horizontalCenter: parent.horizontalCenter
+ rightPadding: 30
+ color: theme.textColor
+ text: {
+ return qsTr("Limit: %1").arg(comboLimit.displayText)
+ }
+ font.pixelSize: theme.fontSizeLarger
+ verticalAlignment: Text.AlignVCenter
+ horizontalAlignment: Text.AlignHCenter
+ elide: Text.ElideRight
+ }
+ onActivated: function (index) {
+ switch (index) {
+ case 0:
+ ModelList.discoverLimit = 5; break;
+ case 1:
+ ModelList.discoverLimit = 10; break;
+ case 2:
+ ModelList.discoverLimit = 20; break;
+ case 3:
+ ModelList.discoverLimit = 50; break;
+ case 4:
+ ModelList.discoverLimit = 100; break;
+ case 5:
+ ModelList.discoverLimit = -1; break;
+ }
+ }
+ }
+ }
+
+ ScrollView {
+ id: scrollView
+ ScrollBar.vertical.policy: ScrollBar.AsNeeded
+ Layout.fillWidth: true
+ Layout.fillHeight: true
+ clip: true
+
+ ListView {
+ id: modelListView
+ model: ModelList.huggingFaceDownloadableModels
+ boundsBehavior: Flickable.StopAtBounds
+ spacing: 30
+
+ delegate: Rectangle {
+ id: delegateItem
+ width: modelListView.width
+ height: childrenRect.height + 60
+ color: theme.conversationBackground
+ radius: 10
+ border.width: 1
+ border.color: theme.controlBorder
+
+ ColumnLayout {
+ anchors.top: parent.top
+ anchors.left: parent.left
+ anchors.right: parent.right
+ anchors.margins: 30
+
+ Text {
+ Layout.fillWidth: true
+ Layout.alignment: Qt.AlignLeft
+ text: name
+ elide: Text.ElideRight
+ color: theme.titleTextColor
+ font.pixelSize: theme.fontSizeLargest
+ font.bold: true
+ Accessible.role: Accessible.Paragraph
+ Accessible.name: qsTr("Model file")
+ Accessible.description: qsTr("Model file to be downloaded")
+ }
+
+
+ Rectangle {
+ Layout.fillWidth: true
+ height: 1
+ color: theme.dividerColor
+ }
+
+ RowLayout {
+ Layout.topMargin: 10
+ Layout.fillWidth: true
+ Text {
+ id: descriptionText
+ text: description
+ font.pixelSize: theme.fontSizeLarge
+ Layout.fillWidth: true
+ wrapMode: Text.WordWrap
+ textFormat: Text.StyledText
+ color: theme.textColor
+ linkColor: theme.textColor
+ Accessible.role: Accessible.Paragraph
+ Accessible.name: qsTr("Description")
+ Accessible.description: qsTr("File description")
+ onLinkActivated: function(link) { Qt.openUrlExternally(link); }
+ MouseArea {
+ anchors.fill: parent
+ acceptedButtons: Qt.NoButton // pass clicks to parent
+ cursorShape: parent.hoveredLink ? Qt.PointingHandCursor : Qt.ArrowCursor
+ }
+ }
+
+ // FIXME Need to overhaul design here which must take into account
+ // features not present in current figma including:
+ // * Ability to cancel a current download
+ // * Ability to resume a download
+ // * The presentation of an error if encountered
+ // * Whether to show already installed models
+ // * Install of remote models with API keys
+ // * The presentation of the progress bar
+ Rectangle {
+ id: actionBox
+ width: childrenRect.width + 20
+ color: "transparent"
+ border.width: 1
+ border.color: theme.dividerColor
+ radius: 10
+ Layout.rightMargin: 20
+ Layout.bottomMargin: 20
+ Layout.minimumHeight: childrenRect.height + 20
+ Layout.alignment: Qt.AlignRight | Qt.AlignTop
+
+ ColumnLayout {
+ spacing: 0
+ MySettingsButton {
+ id: downloadButton
+ text: isDownloading ? qsTr("Cancel") : isIncomplete ? qsTr("Resume") : qsTr("Download")
+ font.pixelSize: theme.fontSizeLarge
+ Layout.topMargin: 20
+ Layout.leftMargin: 20
+ Layout.minimumWidth: 200
+ Layout.fillWidth: true
+ Layout.alignment: Qt.AlignTop | Qt.AlignHCenter
+ visible: !isOnline && !installed && !calcHash && downloadError === ""
+ Accessible.description: qsTr("Stop/restart/start the download")
+ onClicked: {
+ if (!isDownloading) {
+ Download.downloadModel(filename);
+ } else {
+ Download.cancelDownload(filename);
+ }
+ }
+ }
+
+ MySettingsDestructiveButton {
+ id: removeButton
+ text: qsTr("Remove")
+ Layout.topMargin: 20
+ Layout.leftMargin: 20
+ Layout.minimumWidth: 200
+ Layout.fillWidth: true
+ Layout.alignment: Qt.AlignTop | Qt.AlignHCenter
+ visible: !isDownloading && (installed || isIncomplete)
+ Accessible.description: qsTr("Remove model from filesystem")
+ onClicked: {
+ Download.removeModel(filename);
+ }
+ }
+
+ MySettingsButton {
+ id: installButton
+ visible: !installed && isOnline
+ Layout.topMargin: 20
+ Layout.leftMargin: 20
+ Layout.minimumWidth: 200
+ Layout.fillWidth: true
+ Layout.alignment: Qt.AlignTop | Qt.AlignHCenter
+ text: qsTr("Install")
+ font.pixelSize: theme.fontSizeLarge
+ onClicked: {
+ var apiKeyText = apiKey.text.trim(),
+ baseUrlText = baseUrl.text.trim(),
+ modelNameText = modelName.text.trim();
+
+ var apiKeyOk = apiKeyText !== "",
+ baseUrlOk = !isCompatibleApi || baseUrlText !== "",
+ modelNameOk = !isCompatibleApi || modelNameText !== "";
+
+ if (!apiKeyOk)
+ apiKey.showError();
+ if (!baseUrlOk)
+ baseUrl.showError();
+ if (!modelNameOk)
+ modelName.showError();
+
+ if (!apiKeyOk || !baseUrlOk || !modelNameOk)
+ return;
+
+ if (!isCompatibleApi)
+ Download.installModel(
+ filename,
+ apiKeyText,
+ );
+ else
+ Download.installCompatibleModel(
+ modelNameText,
+ apiKeyText,
+ baseUrlText,
+ );
+ }
+ Accessible.role: Accessible.Button
+ Accessible.name: qsTr("Install")
+ Accessible.description: qsTr("Install online model")
+ }
+
+ ColumnLayout {
+ spacing: 0
+ Label {
+ Layout.topMargin: 20
+ Layout.leftMargin: 20
+ visible: downloadError !== ""
+ textFormat: Text.StyledText
+ text: qsTr("Error")
+ color: theme.textColor
+ font.pixelSize: theme.fontSizeLarge
+ linkColor: theme.textErrorColor
+ Accessible.role: Accessible.Paragraph
+ Accessible.name: text
+ Accessible.description: qsTr("Describes an error that occurred when downloading")
+ onLinkActivated: {
+ downloadingErrorPopup.text = downloadError;
+ downloadingErrorPopup.open();
+ }
+ }
+
+ Label {
+ visible: LLM.systemTotalRAMInGB() < ramrequired
+ Layout.topMargin: 20
+ Layout.leftMargin: 20
+ Layout.maximumWidth: 300
+ textFormat: Text.StyledText
+ text: qsTr("WARNING: Not recommended for your hardware. Model requires more memory (%1 GB) than your system has available (%2).").arg(ramrequired).arg(LLM.systemTotalRAMInGBString())
+ color: theme.textErrorColor
+ font.pixelSize: theme.fontSizeLarge
+ wrapMode: Text.WordWrap
+ Accessible.role: Accessible.Paragraph
+ Accessible.name: text
+ Accessible.description: qsTr("Error for incompatible hardware")
+ onLinkActivated: {
+ downloadingErrorPopup.text = downloadError;
+ downloadingErrorPopup.open();
+ }
+ }
+ }
+
+ ColumnLayout {
+ visible: isDownloading && !calcHash
+ Layout.topMargin: 20
+ Layout.leftMargin: 20
+ Layout.minimumWidth: 200
+ Layout.fillWidth: true
+ Layout.alignment: Qt.AlignTop | Qt.AlignHCenter
+ spacing: 20
+
+ ProgressBar {
+ id: itemProgressBar
+ Layout.fillWidth: true
+ width: 200
+ value: bytesReceived / bytesTotal
+ background: Rectangle {
+ implicitHeight: 45
+ color: theme.progressBackground
+ radius: 3
+ }
+ contentItem: Item {
+ implicitHeight: 40
+
+ Rectangle {
+ width: itemProgressBar.visualPosition * parent.width
+ height: parent.height
+ radius: 2
+ color: theme.progressForeground
+ }
+ }
+ Accessible.role: Accessible.ProgressBar
+ Accessible.name: qsTr("Download progressBar")
+ Accessible.description: qsTr("Shows the progress made in the download")
+ }
+
+ Label {
+ id: speedLabel
+ color: theme.textColor
+ Layout.alignment: Qt.AlignRight
+ text: speed
+ font.pixelSize: theme.fontSizeLarge
+ Accessible.role: Accessible.Paragraph
+ Accessible.name: qsTr("Download speed")
+ Accessible.description: qsTr("Download speed in bytes/kilobytes/megabytes per second")
+ }
+ }
+
+ RowLayout {
+ visible: calcHash
+ Layout.topMargin: 20
+ Layout.leftMargin: 20
+ Layout.minimumWidth: 200
+ Layout.maximumWidth: 200
+ Layout.fillWidth: true
+ Layout.alignment: Qt.AlignTop | Qt.AlignHCenter
+ clip: true
+
+ Label {
+ id: calcHashLabel
+ color: theme.textColor
+ text: qsTr("Calculating...")
+ font.pixelSize: theme.fontSizeLarge
+ Accessible.role: Accessible.Paragraph
+ Accessible.name: text
+ Accessible.description: qsTr("Whether the file hash is being calculated")
+ }
+
+ MyBusyIndicator {
+ id: busyCalcHash
+ running: calcHash
+ Accessible.role: Accessible.Animation
+ Accessible.name: qsTr("Busy indicator")
+ Accessible.description: qsTr("Displayed when the file hash is being calculated")
+ }
+ }
+
+ MyTextField {
+ id: apiKey
+ visible: !installed && isOnline
+ Layout.topMargin: 20
+ Layout.leftMargin: 20
+ Layout.minimumWidth: 200
+ Layout.alignment: Qt.AlignTop | Qt.AlignHCenter
+ wrapMode: Text.WrapAnywhere
+ function showError() {
+ messageToast.show(qsTr("ERROR: $API_KEY is empty."));
+ apiKey.placeholderTextColor = theme.textErrorColor;
+ }
+ onTextChanged: {
+ apiKey.placeholderTextColor = theme.mutedTextColor;
+ }
+ placeholderText: qsTr("enter $API_KEY")
+ Accessible.role: Accessible.EditableText
+ Accessible.name: placeholderText
+ Accessible.description: qsTr("Whether the file hash is being calculated")
+ }
+
+ MyTextField {
+ id: baseUrl
+ visible: !installed && isOnline && isCompatibleApi
+ Layout.topMargin: 20
+ Layout.leftMargin: 20
+ Layout.minimumWidth: 200
+ Layout.alignment: Qt.AlignTop | Qt.AlignHCenter
+ wrapMode: Text.WrapAnywhere
+ function showError() {
+ messageToast.show(qsTr("ERROR: $BASE_URL is empty."));
+ baseUrl.placeholderTextColor = theme.textErrorColor;
+ }
+ onTextChanged: {
+ baseUrl.placeholderTextColor = theme.mutedTextColor;
+ }
+ placeholderText: qsTr("enter $BASE_URL")
+ Accessible.role: Accessible.EditableText
+ Accessible.name: placeholderText
+ Accessible.description: qsTr("Whether the file hash is being calculated")
+ }
+
+ MyTextField {
+ id: modelName
+ visible: !installed && isOnline && isCompatibleApi
+ Layout.topMargin: 20
+ Layout.leftMargin: 20
+ Layout.minimumWidth: 200
+ Layout.alignment: Qt.AlignTop | Qt.AlignHCenter
+ wrapMode: Text.WrapAnywhere
+ function showError() {
+ messageToast.show(qsTr("ERROR: $MODEL_NAME is empty."))
+ modelName.placeholderTextColor = theme.textErrorColor;
+ }
+ onTextChanged: {
+ modelName.placeholderTextColor = theme.mutedTextColor;
+ }
+ placeholderText: qsTr("enter $MODEL_NAME")
+ Accessible.role: Accessible.EditableText
+ Accessible.name: placeholderText
+ Accessible.description: qsTr("Whether the file hash is being calculated")
+ }
+ }
+ }
+ }
+
+ Item {
+ Layout.minimumWidth: childrenRect.width
+ Layout.minimumHeight: childrenRect.height
+ Layout.bottomMargin: 10
+ RowLayout {
+ id: paramRow
+ anchors.centerIn: parent
+ ColumnLayout {
+ Layout.topMargin: 10
+ Layout.bottomMargin: 10
+ Layout.leftMargin: 20
+ Layout.rightMargin: 20
+ Text {
+ text: qsTr("File size")
+ font.pixelSize: theme.fontSizeSmall
+ color: theme.mutedDarkTextColor
+ }
+ Text {
+ text: filesize
+ color: theme.textColor
+ font.pixelSize: theme.fontSizeSmall
+ font.bold: true
+ }
+ }
+ Rectangle {
+ width: 1
+ Layout.fillHeight: true
+ color: theme.dividerColor
+ }
+ ColumnLayout {
+ Layout.topMargin: 10
+ Layout.bottomMargin: 10
+ Layout.leftMargin: 20
+ Layout.rightMargin: 20
+ Text {
+ text: qsTr("Quant")
+ font.pixelSize: theme.fontSizeSmall
+ color: theme.mutedDarkTextColor
+ }
+ Text {
+ text: quant
+ color: theme.textColor
+ font.pixelSize: theme.fontSizeSmall
+ font.bold: true
+ }
+ }
+ Rectangle {
+ width: 1
+ Layout.fillHeight: true
+ color: theme.dividerColor
+ }
+ ColumnLayout {
+ Layout.topMargin: 10
+ Layout.bottomMargin: 10
+ Layout.leftMargin: 20
+ Layout.rightMargin: 20
+ Text {
+ text: qsTr("Type")
+ font.pixelSize: theme.fontSizeSmall
+ color: theme.mutedDarkTextColor
+ }
+ Text {
+ text: type
+ color: theme.textColor
+ font.pixelSize: theme.fontSizeSmall
+ font.bold: true
+ }
+ }
+ }
+
+ Rectangle {
+ color: "transparent"
+ anchors.fill: paramRow
+ border.color: theme.dividerColor
+ border.width: 1
+ radius: 10
+ }
+ }
+
+ Rectangle {
+ Layout.fillWidth: true
+ height: 1
+ color: theme.dividerColor
+ }
+ }
+ }
+ }
+ }
+}
diff --git a/gpt4all-chat/qml/AddModelView.qml b/gpt4all-chat/qml/AddModelView.qml
index d366b8f9626c..223d703791a9 100644
--- a/gpt4all-chat/qml/AddModelView.qml
+++ b/gpt4all-chat/qml/AddModelView.qml
@@ -42,12 +42,12 @@ Rectangle {
anchors.top: parent.top
anchors.bottom: parent.bottom
anchors.margins: 30
- spacing: 30
+ spacing: 10
ColumnLayout {
Layout.fillWidth: true
Layout.alignment: Qt.AlignTop
- spacing: 30
+ spacing: 10
MyButton {
id: backButton
@@ -76,732 +76,60 @@ Rectangle {
font.pixelSize: theme.fontSizeBanner
color: theme.titleTextColor
}
+ }
- RowLayout {
- Layout.fillWidth: true
- Layout.alignment: Qt.AlignCenter
- Layout.margins: 0
- spacing: 10
- MyTextField {
- id: discoverField
- property string textBeingSearched: ""
- readOnly: ModelList.discoverInProgress
- Layout.alignment: Qt.AlignCenter
- Layout.fillWidth: true
- font.pixelSize: theme.fontSizeLarger
- placeholderText: qsTr("Discover and download models by keyword search...")
- Accessible.role: Accessible.EditableText
- Accessible.name: placeholderText
- Accessible.description: qsTr("Text field for discovering and filtering downloadable models")
- Connections {
- target: ModelList
- function onDiscoverInProgressChanged() {
- if (ModelList.discoverInProgress) {
- discoverField.textBeingSearched = discoverField.text;
- discoverField.text = qsTr("Searching \u00B7 %1").arg(discoverField.textBeingSearched);
- } else {
- discoverField.text = discoverField.textBeingSearched;
- discoverField.textBeingSearched = "";
- }
- }
- }
- background: ProgressBar {
- id: discoverProgressBar
- indeterminate: ModelList.discoverInProgress && ModelList.discoverProgress === 0.0
- value: ModelList.discoverProgress
- background: Rectangle {
- color: theme.controlBackground
- border.color: theme.controlBorder
- radius: 10
- }
- contentItem: Item {
- Rectangle {
- visible: ModelList.discoverInProgress
- anchors.bottom: parent.bottom
- width: discoverProgressBar.visualPosition * parent.width
- height: 10
- radius: 2
- color: theme.progressForeground
- }
- }
- }
-
- Keys.onReturnPressed: (event)=> {
- if (event.modifiers & Qt.ControlModifier || event.modifiers & Qt.ShiftModifier)
- event.accepted = false;
- else {
- editingFinished();
- sendDiscovery()
- }
- }
- function sendDiscovery() {
- ModelList.downloadableModels.discoverAndFilter(discoverField.text);
- }
- RowLayout {
- spacing: 0
- anchors.right: discoverField.right
- anchors.verticalCenter: discoverField.verticalCenter
- anchors.rightMargin: 15
- visible: !ModelList.discoverInProgress
- MyMiniButton {
- id: clearDiscoverButton
- backgroundColor: theme.textColor
- backgroundColorHovered: theme.iconBackgroundDark
- visible: discoverField.text !== ""
- source: "qrc:/gpt4all/icons/close.svg"
- onClicked: {
- discoverField.text = ""
- discoverField.sendDiscovery() // should clear results
- }
- }
- MyMiniButton {
- backgroundColor: theme.textColor
- backgroundColorHovered: theme.iconBackgroundDark
- source: "qrc:/gpt4all/icons/settings.svg"
- onClicked: {
- discoveryTools.visible = !discoveryTools.visible
- }
- }
- MyMiniButton {
- id: sendButton
- enabled: !ModelList.discoverInProgress
- backgroundColor: theme.textColor
- backgroundColorHovered: theme.iconBackgroundDark
- source: "qrc:/gpt4all/icons/send_message.svg"
- Accessible.name: qsTr("Initiate model discovery and filtering")
- Accessible.description: qsTr("Triggers discovery and filtering of models")
- onClicked: {
- discoverField.sendDiscovery()
- }
- }
- }
+ RowLayout {
+ id: bar
+ implicitWidth: 600
+ spacing: 10
+ MyTabButton {
+ text: qsTr("GPT4All")
+ isSelected: gpt4AllModelView.isShown()
+ onPressed: {
+ gpt4AllModelView.show();
}
}
-
- RowLayout {
- id: discoveryTools
- Layout.fillWidth: true
- Layout.alignment: Qt.AlignCenter
- Layout.margins: 0
- spacing: 20
- visible: false
- MyComboBox {
- id: comboSort
- model: ListModel {
- ListElement { name: qsTr("Default") }
- ListElement { name: qsTr("Likes") }
- ListElement { name: qsTr("Downloads") }
- ListElement { name: qsTr("Recent") }
- }
- currentIndex: ModelList.discoverSort
- contentItem: Text {
- anchors.horizontalCenter: parent.horizontalCenter
- rightPadding: 30
- color: theme.textColor
- text: {
- return qsTr("Sort by: %1").arg(comboSort.displayText)
- }
- font.pixelSize: theme.fontSizeLarger
- verticalAlignment: Text.AlignVCenter
- horizontalAlignment: Text.AlignHCenter
- elide: Text.ElideRight
- }
- onActivated: function (index) {
- ModelList.discoverSort = index;
- }
- }
- MyComboBox {
- id: comboSortDirection
- model: ListModel {
- ListElement { name: qsTr("Asc") }
- ListElement { name: qsTr("Desc") }
- }
- currentIndex: {
- if (ModelList.discoverSortDirection === 1)
- return 0
- else
- return 1;
- }
- contentItem: Text {
- anchors.horizontalCenter: parent.horizontalCenter
- rightPadding: 30
- color: theme.textColor
- text: {
- return qsTr("Sort dir: %1").arg(comboSortDirection.displayText)
- }
- font.pixelSize: theme.fontSizeLarger
- verticalAlignment: Text.AlignVCenter
- horizontalAlignment: Text.AlignHCenter
- elide: Text.ElideRight
- }
- onActivated: function (index) {
- if (index === 0)
- ModelList.discoverSortDirection = 1;
- else
- ModelList.discoverSortDirection = -1;
- }
- }
- MyComboBox {
- id: comboLimit
- model: ListModel {
- ListElement { name: "5" }
- ListElement { name: "10" }
- ListElement { name: "20" }
- ListElement { name: "50" }
- ListElement { name: "100" }
- ListElement { name: qsTr("None") }
- }
-
- currentIndex: {
- if (ModelList.discoverLimit === 5)
- return 0;
- else if (ModelList.discoverLimit === 10)
- return 1;
- else if (ModelList.discoverLimit === 20)
- return 2;
- else if (ModelList.discoverLimit === 50)
- return 3;
- else if (ModelList.discoverLimit === 100)
- return 4;
- else if (ModelList.discoverLimit === -1)
- return 5;
- }
- contentItem: Text {
- anchors.horizontalCenter: parent.horizontalCenter
- rightPadding: 30
- color: theme.textColor
- text: {
- return qsTr("Limit: %1").arg(comboLimit.displayText)
- }
- font.pixelSize: theme.fontSizeLarger
- verticalAlignment: Text.AlignVCenter
- horizontalAlignment: Text.AlignHCenter
- elide: Text.ElideRight
- }
- onActivated: function (index) {
- switch (index) {
- case 0:
- ModelList.discoverLimit = 5; break;
- case 1:
- ModelList.discoverLimit = 10; break;
- case 2:
- ModelList.discoverLimit = 20; break;
- case 3:
- ModelList.discoverLimit = 50; break;
- case 4:
- ModelList.discoverLimit = 100; break;
- case 5:
- ModelList.discoverLimit = -1; break;
- }
- }
+ MyTabButton {
+ text: qsTr("HuggingFace")
+ isSelected: huggingfaceModelView.isShown()
+ onPressed: {
+ huggingfaceModelView.show();
}
}
}
- Label {
- visible: !ModelList.downloadableModels.count && !ModelList.asyncModelRequestOngoing
- Layout.fillWidth: true
- Layout.fillHeight: true
- horizontalAlignment: Qt.AlignHCenter
- verticalAlignment: Qt.AlignVCenter
- text: qsTr("Network error: could not retrieve %1").arg("http://gpt4all.io/models/models3.json")
- font.pixelSize: theme.fontSizeLarge
- color: theme.mutedTextColor
- }
-
- MyBusyIndicator {
- visible: !ModelList.downloadableModels.count && ModelList.asyncModelRequestOngoing
- running: ModelList.asyncModelRequestOngoing
- Accessible.role: Accessible.Animation
- Layout.alignment: Qt.AlignCenter
- Accessible.name: qsTr("Busy indicator")
- Accessible.description: qsTr("Displayed when the models request is ongoing")
- }
-
- ScrollView {
- id: scrollView
- ScrollBar.vertical.policy: ScrollBar.AsNeeded
+ StackLayout {
+ id: stackLayout
Layout.fillWidth: true
Layout.fillHeight: true
- clip: true
-
- ListView {
- id: modelListView
- model: ModelList.downloadableModels
- boundsBehavior: Flickable.StopAtBounds
- spacing: 30
-
- delegate: Rectangle {
- id: delegateItem
- width: modelListView.width
- height: childrenRect.height + 60
- color: theme.conversationBackground
- radius: 10
- border.width: 1
- border.color: theme.controlBorder
-
- ColumnLayout {
- anchors.top: parent.top
- anchors.left: parent.left
- anchors.right: parent.right
- anchors.margins: 30
-
- Text {
- Layout.fillWidth: true
- Layout.alignment: Qt.AlignLeft
- text: name
- elide: Text.ElideRight
- color: theme.titleTextColor
- font.pixelSize: theme.fontSizeLargest
- font.bold: true
- Accessible.role: Accessible.Paragraph
- Accessible.name: qsTr("Model file")
- Accessible.description: qsTr("Model file to be downloaded")
- }
-
-
- Rectangle {
- Layout.fillWidth: true
- height: 1
- color: theme.dividerColor
- }
-
- RowLayout {
- Layout.topMargin: 10
- Layout.fillWidth: true
- Text {
- id: descriptionText
- text: description
- font.pixelSize: theme.fontSizeLarge
- Layout.fillWidth: true
- wrapMode: Text.WordWrap
- textFormat: Text.StyledText
- color: theme.textColor
- linkColor: theme.textColor
- Accessible.role: Accessible.Paragraph
- Accessible.name: qsTr("Description")
- Accessible.description: qsTr("File description")
- onLinkActivated: function(link) { Qt.openUrlExternally(link); }
- MouseArea {
- anchors.fill: parent
- acceptedButtons: Qt.NoButton // pass clicks to parent
- cursorShape: parent.hoveredLink ? Qt.PointingHandCursor : Qt.ArrowCursor
- }
- }
-
- // FIXME Need to overhaul design here which must take into account
- // features not present in current figma including:
- // * Ability to cancel a current download
- // * Ability to resume a download
- // * The presentation of an error if encountered
- // * Whether to show already installed models
- // * Install of remote models with API keys
- // * The presentation of the progress bar
- Rectangle {
- id: actionBox
- width: childrenRect.width + 20
- color: "transparent"
- border.width: 1
- border.color: theme.dividerColor
- radius: 10
- Layout.rightMargin: 20
- Layout.bottomMargin: 20
- Layout.minimumHeight: childrenRect.height + 20
- Layout.alignment: Qt.AlignRight | Qt.AlignTop
-
- ColumnLayout {
- spacing: 0
- MySettingsButton {
- id: downloadButton
- text: isDownloading ? qsTr("Cancel") : isIncomplete ? qsTr("Resume") : qsTr("Download")
- font.pixelSize: theme.fontSizeLarge
- Layout.topMargin: 20
- Layout.leftMargin: 20
- Layout.minimumWidth: 200
- Layout.fillWidth: true
- Layout.alignment: Qt.AlignTop | Qt.AlignHCenter
- visible: !isOnline && !installed && !calcHash && downloadError === ""
- Accessible.description: qsTr("Stop/restart/start the download")
- onClicked: {
- if (!isDownloading) {
- Download.downloadModel(filename);
- } else {
- Download.cancelDownload(filename);
- }
- }
- }
-
- MySettingsDestructiveButton {
- id: removeButton
- text: qsTr("Remove")
- Layout.topMargin: 20
- Layout.leftMargin: 20
- Layout.minimumWidth: 200
- Layout.fillWidth: true
- Layout.alignment: Qt.AlignTop | Qt.AlignHCenter
- visible: !isDownloading && (installed || isIncomplete)
- Accessible.description: qsTr("Remove model from filesystem")
- onClicked: {
- Download.removeModel(filename);
- }
- }
- MySettingsButton {
- id: installButton
- visible: !installed && isOnline
- Layout.topMargin: 20
- Layout.leftMargin: 20
- Layout.minimumWidth: 200
- Layout.fillWidth: true
- Layout.alignment: Qt.AlignTop | Qt.AlignHCenter
- text: qsTr("Install")
- font.pixelSize: theme.fontSizeLarge
- onClicked: {
- var apiKeyText = apiKey.text.trim(),
- baseUrlText = baseUrl.text.trim(),
- modelNameText = modelName.text.trim();
-
- var apiKeyOk = apiKeyText !== "",
- baseUrlOk = !isCompatibleApi || baseUrlText !== "",
- modelNameOk = !isCompatibleApi || modelNameText !== "";
-
- if (!apiKeyOk)
- apiKey.showError();
- if (!baseUrlOk)
- baseUrl.showError();
- if (!modelNameOk)
- modelName.showError();
-
- if (!apiKeyOk || !baseUrlOk || !modelNameOk)
- return;
-
- if (!isCompatibleApi)
- Download.installModel(
- filename,
- apiKeyText,
- );
- else
- Download.installCompatibleModel(
- modelNameText,
- apiKeyText,
- baseUrlText,
- );
- }
- Accessible.role: Accessible.Button
- Accessible.name: qsTr("Install")
- Accessible.description: qsTr("Install online model")
- }
-
- ColumnLayout {
- spacing: 0
- Label {
- Layout.topMargin: 20
- Layout.leftMargin: 20
- visible: downloadError !== ""
- textFormat: Text.StyledText
- text: qsTr("Error")
- color: theme.textColor
- font.pixelSize: theme.fontSizeLarge
- linkColor: theme.textErrorColor
- Accessible.role: Accessible.Paragraph
- Accessible.name: text
- Accessible.description: qsTr("Describes an error that occurred when downloading")
- onLinkActivated: {
- downloadingErrorPopup.text = downloadError;
- downloadingErrorPopup.open();
- }
- }
-
- Label {
- visible: LLM.systemTotalRAMInGB() < ramrequired
- Layout.topMargin: 20
- Layout.leftMargin: 20
- Layout.maximumWidth: 300
- textFormat: Text.StyledText
- text: qsTr("WARNING: Not recommended for your hardware. Model requires more memory (%1 GB) than your system has available (%2).").arg(ramrequired).arg(LLM.systemTotalRAMInGBString())
- color: theme.textErrorColor
- font.pixelSize: theme.fontSizeLarge
- wrapMode: Text.WordWrap
- Accessible.role: Accessible.Paragraph
- Accessible.name: text
- Accessible.description: qsTr("Error for incompatible hardware")
- onLinkActivated: {
- downloadingErrorPopup.text = downloadError;
- downloadingErrorPopup.open();
- }
- }
- }
-
- ColumnLayout {
- visible: isDownloading && !calcHash
- Layout.topMargin: 20
- Layout.leftMargin: 20
- Layout.minimumWidth: 200
- Layout.fillWidth: true
- Layout.alignment: Qt.AlignTop | Qt.AlignHCenter
- spacing: 20
-
- ProgressBar {
- id: itemProgressBar
- Layout.fillWidth: true
- width: 200
- value: bytesReceived / bytesTotal
- background: Rectangle {
- implicitHeight: 45
- color: theme.progressBackground
- radius: 3
- }
- contentItem: Item {
- implicitHeight: 40
-
- Rectangle {
- width: itemProgressBar.visualPosition * parent.width
- height: parent.height
- radius: 2
- color: theme.progressForeground
- }
- }
- Accessible.role: Accessible.ProgressBar
- Accessible.name: qsTr("Download progressBar")
- Accessible.description: qsTr("Shows the progress made in the download")
- }
-
- Label {
- id: speedLabel
- color: theme.textColor
- Layout.alignment: Qt.AlignRight
- text: speed
- font.pixelSize: theme.fontSizeLarge
- Accessible.role: Accessible.Paragraph
- Accessible.name: qsTr("Download speed")
- Accessible.description: qsTr("Download speed in bytes/kilobytes/megabytes per second")
- }
- }
-
- RowLayout {
- visible: calcHash
- Layout.topMargin: 20
- Layout.leftMargin: 20
- Layout.minimumWidth: 200
- Layout.maximumWidth: 200
- Layout.fillWidth: true
- Layout.alignment: Qt.AlignTop | Qt.AlignHCenter
- clip: true
-
- Label {
- id: calcHashLabel
- color: theme.textColor
- text: qsTr("Calculating...")
- font.pixelSize: theme.fontSizeLarge
- Accessible.role: Accessible.Paragraph
- Accessible.name: text
- Accessible.description: qsTr("Whether the file hash is being calculated")
- }
-
- MyBusyIndicator {
- id: busyCalcHash
- running: calcHash
- Accessible.role: Accessible.Animation
- Accessible.name: qsTr("Busy indicator")
- Accessible.description: qsTr("Displayed when the file hash is being calculated")
- }
- }
-
- MyTextField {
- id: apiKey
- visible: !installed && isOnline
- Layout.topMargin: 20
- Layout.leftMargin: 20
- Layout.minimumWidth: 200
- Layout.alignment: Qt.AlignTop | Qt.AlignHCenter
- wrapMode: Text.WrapAnywhere
- function showError() {
- messageToast.show(qsTr("ERROR: $API_KEY is empty."));
- apiKey.placeholderTextColor = theme.textErrorColor;
- }
- onTextChanged: {
- apiKey.placeholderTextColor = theme.mutedTextColor;
- }
- placeholderText: qsTr("enter $API_KEY")
- Accessible.role: Accessible.EditableText
- Accessible.name: placeholderText
- Accessible.description: qsTr("Whether the file hash is being calculated")
- }
-
- MyTextField {
- id: baseUrl
- visible: !installed && isOnline && isCompatibleApi
- Layout.topMargin: 20
- Layout.leftMargin: 20
- Layout.minimumWidth: 200
- Layout.alignment: Qt.AlignTop | Qt.AlignHCenter
- wrapMode: Text.WrapAnywhere
- function showError() {
- messageToast.show(qsTr("ERROR: $BASE_URL is empty."));
- baseUrl.placeholderTextColor = theme.textErrorColor;
- }
- onTextChanged: {
- baseUrl.placeholderTextColor = theme.mutedTextColor;
- }
- placeholderText: qsTr("enter $BASE_URL")
- Accessible.role: Accessible.EditableText
- Accessible.name: placeholderText
- Accessible.description: qsTr("Whether the file hash is being calculated")
- }
-
- MyTextField {
- id: modelName
- visible: !installed && isOnline && isCompatibleApi
- Layout.topMargin: 20
- Layout.leftMargin: 20
- Layout.minimumWidth: 200
- Layout.alignment: Qt.AlignTop | Qt.AlignHCenter
- wrapMode: Text.WrapAnywhere
- function showError() {
- messageToast.show(qsTr("ERROR: $MODEL_NAME is empty."))
- modelName.placeholderTextColor = theme.textErrorColor;
- }
- onTextChanged: {
- modelName.placeholderTextColor = theme.mutedTextColor;
- }
- placeholderText: qsTr("enter $MODEL_NAME")
- Accessible.role: Accessible.EditableText
- Accessible.name: placeholderText
- Accessible.description: qsTr("Whether the file hash is being calculated")
- }
- }
- }
- }
-
- Item {
- Layout.minimumWidth: childrenRect.width
- Layout.minimumHeight: childrenRect.height
- Layout.bottomMargin: 10
- RowLayout {
- id: paramRow
- anchors.centerIn: parent
- ColumnLayout {
- Layout.topMargin: 10
- Layout.bottomMargin: 10
- Layout.leftMargin: 20
- Layout.rightMargin: 20
- Text {
- text: qsTr("File size")
- font.pixelSize: theme.fontSizeSmall
- color: theme.mutedDarkTextColor
- }
- Text {
- text: filesize
- color: theme.textColor
- font.pixelSize: theme.fontSizeSmall
- font.bold: true
- }
- }
- Rectangle {
- width: 1
- Layout.fillHeight: true
- color: theme.dividerColor
- }
- ColumnLayout {
- Layout.topMargin: 10
- Layout.bottomMargin: 10
- Layout.leftMargin: 20
- Layout.rightMargin: 20
- Text {
- text: qsTr("RAM required")
- font.pixelSize: theme.fontSizeSmall
- color: theme.mutedDarkTextColor
- }
- Text {
- text: ramrequired >= 0 ? qsTr("%1 GB").arg(ramrequired) : qsTr("?")
- color: theme.textColor
- font.pixelSize: theme.fontSizeSmall
- font.bold: true
- }
- }
- Rectangle {
- width: 1
- Layout.fillHeight: true
- color: theme.dividerColor
- }
- ColumnLayout {
- Layout.topMargin: 10
- Layout.bottomMargin: 10
- Layout.leftMargin: 20
- Layout.rightMargin: 20
- Text {
- text: qsTr("Parameters")
- font.pixelSize: theme.fontSizeSmall
- color: theme.mutedDarkTextColor
- }
- Text {
- text: parameters !== "" ? parameters : qsTr("?")
- color: theme.textColor
- font.pixelSize: theme.fontSizeSmall
- font.bold: true
- }
- }
- Rectangle {
- width: 1
- Layout.fillHeight: true
- color: theme.dividerColor
- }
- ColumnLayout {
- Layout.topMargin: 10
- Layout.bottomMargin: 10
- Layout.leftMargin: 20
- Layout.rightMargin: 20
- Text {
- text: qsTr("Quant")
- font.pixelSize: theme.fontSizeSmall
- color: theme.mutedDarkTextColor
- }
- Text {
- text: quant
- color: theme.textColor
- font.pixelSize: theme.fontSizeSmall
- font.bold: true
- }
- }
- Rectangle {
- width: 1
- Layout.fillHeight: true
- color: theme.dividerColor
- }
- ColumnLayout {
- Layout.topMargin: 10
- Layout.bottomMargin: 10
- Layout.leftMargin: 20
- Layout.rightMargin: 20
- Text {
- text: qsTr("Type")
- font.pixelSize: theme.fontSizeSmall
- color: theme.mutedDarkTextColor
- }
- Text {
- text: type
- color: theme.textColor
- font.pixelSize: theme.fontSizeSmall
- font.bold: true
- }
- }
- }
+ AddGPT4AllModelView {
+ id: gpt4AllModelView
+ Layout.fillWidth: true
+ Layout.fillHeight: true
- Rectangle {
- color: "transparent"
- anchors.fill: paramRow
- border.color: theme.dividerColor
- border.width: 1
- radius: 10
- }
- }
+ function show() {
+ stackLayout.currentIndex = 0;
+ }
+ function isShown() {
+ return stackLayout.currentIndex === 0
+ }
+ }
- Rectangle {
- Layout.fillWidth: true
- height: 1
- color: theme.dividerColor
- }
- }
+ AddHFModelView {
+ id: huggingfaceModelView
+ Layout.fillWidth: true
+ Layout.fillHeight: true
+ // FIXME: This generates a warning and should not be used inside a layout, but without
+ // it the text field inside this qml does not display at full width so it looks like
+ // a bug in stacklayout
+ anchors.fill: parent
+
+ function show() {
+ stackLayout.currentIndex = 1;
+ }
+ function isShown() {
+ return stackLayout.currentIndex === 1
}
}
}
diff --git a/gpt4all-chat/qml/HomeView.qml b/gpt4all-chat/qml/HomeView.qml
index 69ef16e23f58..8d76d5dbfd46 100644
--- a/gpt4all-chat/qml/HomeView.qml
+++ b/gpt4all-chat/qml/HomeView.qml
@@ -47,7 +47,7 @@ Rectangle {
id: welcome
Layout.alignment: Qt.AlignHCenter
text: qsTr("Welcome to GPT4All")
- font.pixelSize: theme.fontSizeBanner
+ font.pixelSize: theme.fontSizeBannerLarge
color: theme.titleTextColor
}
diff --git a/gpt4all-chat/qml/MyTabButton.qml b/gpt4all-chat/qml/MyTabButton.qml
new file mode 100644
index 000000000000..2a4609524741
--- /dev/null
+++ b/gpt4all-chat/qml/MyTabButton.qml
@@ -0,0 +1,26 @@
+import QtCore
+import QtQuick
+import QtQuick.Controls
+import QtQuick.Controls.Basic
+import mysettings
+import mysettingsenums
+
+MySettingsButton {
+ property bool isSelected: false
+ contentItem: Text {
+ text: parent.text
+ horizontalAlignment: Qt.AlignCenter
+ color: isSelected ? theme.titleTextColor : theme.styledTextColor
+ font.pixelSize: theme.fontSizeLarger
+ }
+ background: Item {
+ visible: isSelected || hovered
+ Rectangle {
+ anchors.bottom: parent.bottom
+ anchors.left: parent.left
+ anchors.right: parent.right
+ height: 3
+ color: isSelected ? theme.titleTextColor : theme.styledTextColorLighter
+ }
+ }
+}
diff --git a/gpt4all-chat/qml/Theme.qml b/gpt4all-chat/qml/Theme.qml
index e2675820449a..4a33bd8c168c 100644
--- a/gpt4all-chat/qml/Theme.qml
+++ b/gpt4all-chat/qml/Theme.qml
@@ -1017,6 +1017,17 @@ QtObject {
}
}
+ property color styledTextColorLighter: {
+ switch (MySettings.chatTheme) {
+ case MySettingsEnums.ChatTheme.LegacyDark:
+ return purple50
+ case MySettingsEnums.ChatTheme.Dark:
+ return yellow0
+ default:
+ return grayRed400
+ }
+ }
+
property color styledTextColor2: {
switch (MySettings.chatTheme) {
case MySettingsEnums.ChatTheme.LegacyDark:
@@ -1256,5 +1267,6 @@ QtObject {
property real fontSizeLarger: 14 * fontScale
property real fontSizeLargest: 18 * fontScale
property real fontSizeBannerSmall: 24 * fontScale**.8
- property real fontSizeBanner: 48 * fontScale**.8
+ property real fontSizeBanner: 32 * fontScale**.8
+ property real fontSizeBannerLarge: 48 * fontScale**.8
}
diff --git a/gpt4all-chat/src/modellist.cpp b/gpt4all-chat/src/modellist.cpp
index 1f2c4e35bc6d..a6c5a620a070 100644
--- a/gpt4all-chat/src/modellist.cpp
+++ b/gpt4all-chat/src/modellist.cpp
@@ -465,47 +465,54 @@ bool InstalledModels::filterAcceptsRow(int sourceRow,
return (isInstalled || (!m_selectable && isDownloading)) && !isEmbeddingModel;
}
-DownloadableModels::DownloadableModels(QObject *parent)
+GPT4AllDownloadableModels::GPT4AllDownloadableModels(QObject *parent)
: QSortFilterProxyModel(parent)
- , m_expanded(false)
- , m_limit(5)
{
- connect(this, &DownloadableModels::rowsInserted, this, &DownloadableModels::countChanged);
- connect(this, &DownloadableModels::rowsRemoved, this, &DownloadableModels::countChanged);
- connect(this, &DownloadableModels::modelReset, this, &DownloadableModels::countChanged);
+ connect(this, &GPT4AllDownloadableModels::rowsInserted, this, &GPT4AllDownloadableModels::countChanged);
+ connect(this, &GPT4AllDownloadableModels::rowsRemoved, this, &GPT4AllDownloadableModels::countChanged);
+ connect(this, &GPT4AllDownloadableModels::modelReset, this, &GPT4AllDownloadableModels::countChanged);
}
-bool DownloadableModels::filterAcceptsRow(int sourceRow,
+bool GPT4AllDownloadableModels::filterAcceptsRow(int sourceRow,
const QModelIndex &sourceParent) const
{
- // FIXME We can eliminate the 'expanded' code as the UI no longer uses this
- bool withinLimit = sourceRow < (m_expanded ? sourceModel()->rowCount() : m_limit);
QModelIndex index = sourceModel()->index(sourceRow, 0, sourceParent);
bool hasDescription = !sourceModel()->data(index, ModelList::DescriptionRole).toString().isEmpty();
bool isClone = sourceModel()->data(index, ModelList::IsCloneRole).toBool();
- return withinLimit && hasDescription && !isClone;
+ bool isDiscovered = sourceModel()->data(index, ModelList::IsDiscoveredRole).toBool();
+ return !isDiscovered && hasDescription && !isClone;
}
-int DownloadableModels::count() const
+int GPT4AllDownloadableModels::count() const
{
return rowCount();
}
-bool DownloadableModels::isExpanded() const
+HuggingFaceDownloadableModels::HuggingFaceDownloadableModels(QObject *parent)
+ : QSortFilterProxyModel(parent)
+ , m_limit(5)
{
- return m_expanded;
+ connect(this, &HuggingFaceDownloadableModels::rowsInserted, this, &HuggingFaceDownloadableModels::countChanged);
+ connect(this, &HuggingFaceDownloadableModels::rowsRemoved, this, &HuggingFaceDownloadableModels::countChanged);
+ connect(this, &HuggingFaceDownloadableModels::modelReset, this, &HuggingFaceDownloadableModels::countChanged);
}
-void DownloadableModels::setExpanded(bool expanded)
+bool HuggingFaceDownloadableModels::filterAcceptsRow(int sourceRow,
+ const QModelIndex &sourceParent) const
{
- if (m_expanded != expanded) {
- m_expanded = expanded;
- invalidateFilter();
- emit expandedChanged(m_expanded);
- }
+ QModelIndex index = sourceModel()->index(sourceRow, 0, sourceParent);
+ bool hasDescription = !sourceModel()->data(index, ModelList::DescriptionRole).toString().isEmpty();
+ bool isClone = sourceModel()->data(index, ModelList::IsCloneRole).toBool();
+ bool isDiscovered = sourceModel()->data(index, ModelList::IsDiscoveredRole).toBool();
+ return isDiscovered && hasDescription && !isClone;
+}
+
+int HuggingFaceDownloadableModels::count() const
+{
+ return rowCount();
}
-void DownloadableModels::discoverAndFilter(const QString &discover)
+void HuggingFaceDownloadableModels::discoverAndFilter(const QString &discover)
{
m_discoverFilter = discover;
ModelList *ml = qobject_cast(parent());
@@ -523,7 +530,8 @@ ModelList::ModelList()
: QAbstractListModel(nullptr)
, m_installedModels(new InstalledModels(this))
, m_selectableModels(new InstalledModels(this, /*selectable*/ true))
- , m_downloadableModels(new DownloadableModels(this))
+ , m_gpt4AllDownloadableModels(new GPT4AllDownloadableModels(this))
+ , m_huggingFaceDownloadableModels(new HuggingFaceDownloadableModels(this))
, m_asyncModelRequestOngoing(false)
, m_discoverLimit(20)
, m_discoverSortDirection(-1)
@@ -536,7 +544,8 @@ ModelList::ModelList()
m_installedModels->setSourceModel(this);
m_selectableModels->setSourceModel(this);
- m_downloadableModels->setSourceModel(this);
+ m_gpt4AllDownloadableModels->setSourceModel(this);
+ m_huggingFaceDownloadableModels->setSourceModel(this);
auto *mySettings = MySettings::globalInstance();
connect(mySettings, &MySettings::nameChanged, this, &ModelList::updateDataForSettings );
diff --git a/gpt4all-chat/src/modellist.h b/gpt4all-chat/src/modellist.h
index 121a8433cf62..0e22b931d934 100644
--- a/gpt4all-chat/src/modellist.h
+++ b/gpt4all-chat/src/modellist.h
@@ -294,17 +294,28 @@ class InstalledModels : public QSortFilterProxyModel
bool m_selectable;
};
-class DownloadableModels : public QSortFilterProxyModel
+class GPT4AllDownloadableModels : public QSortFilterProxyModel
{
Q_OBJECT
Q_PROPERTY(int count READ count NOTIFY countChanged)
- Q_PROPERTY(bool expanded READ isExpanded WRITE setExpanded NOTIFY expandedChanged)
public:
- explicit DownloadableModels(QObject *parent);
+ explicit GPT4AllDownloadableModels(QObject *parent);
int count() const;
- bool isExpanded() const;
- void setExpanded(bool expanded);
+Q_SIGNALS:
+ void countChanged();
+
+protected:
+ bool filterAcceptsRow(int sourceRow, const QModelIndex &sourceParent) const override;
+};
+
+class HuggingFaceDownloadableModels : public QSortFilterProxyModel
+{
+ Q_OBJECT
+ Q_PROPERTY(int count READ count NOTIFY countChanged)
+public:
+ explicit HuggingFaceDownloadableModels(QObject *parent);
+ int count() const;
Q_INVOKABLE void discoverAndFilter(const QString &discover);
@@ -314,11 +325,7 @@ class DownloadableModels : public QSortFilterProxyModel
protected:
bool filterAcceptsRow(int sourceRow, const QModelIndex &sourceParent) const override;
-Q_SIGNALS:
- void expandedChanged(bool expanded);
-
private:
- bool m_expanded;
int m_limit;
QString m_discoverFilter;
};
@@ -329,7 +336,8 @@ class ModelList : public QAbstractListModel
Q_PROPERTY(int count READ count NOTIFY countChanged)
Q_PROPERTY(InstalledModels* installedModels READ installedModels NOTIFY installedModelsChanged)
Q_PROPERTY(InstalledModels* selectableModels READ selectableModels NOTIFY selectableModelsChanged)
- Q_PROPERTY(DownloadableModels* downloadableModels READ downloadableModels NOTIFY downloadableModelsChanged)
+ Q_PROPERTY(GPT4AllDownloadableModels* gpt4AllDownloadableModels READ gpt4AllDownloadableModels CONSTANT)
+ Q_PROPERTY(HuggingFaceDownloadableModels* huggingFaceDownloadableModels READ huggingFaceDownloadableModels CONSTANT)
Q_PROPERTY(QList selectableModelList READ selectableModelList NOTIFY selectableModelListChanged)
Q_PROPERTY(bool asyncModelRequestOngoing READ asyncModelRequestOngoing NOTIFY asyncModelRequestOngoingChanged)
Q_PROPERTY(int discoverLimit READ discoverLimit WRITE setDiscoverLimit NOTIFY discoverLimitChanged)
@@ -482,7 +490,8 @@ class ModelList : public QAbstractListModel
InstalledModels *installedModels() const { return m_installedModels; }
InstalledModels *selectableModels() const { return m_selectableModels; }
- DownloadableModels *downloadableModels() const { return m_downloadableModels; }
+ GPT4AllDownloadableModels *gpt4AllDownloadableModels() const { return m_gpt4AllDownloadableModels; }
+ HuggingFaceDownloadableModels *huggingFaceDownloadableModels() const { return m_huggingFaceDownloadableModels; }
static inline QString toFileSize(quint64 sz) {
if (sz < 1024) {
@@ -520,7 +529,6 @@ class ModelList : public QAbstractListModel
void countChanged();
void installedModelsChanged();
void selectableModelsChanged();
- void downloadableModelsChanged();
void selectableModelListChanged();
void asyncModelRequestOngoingChanged();
void discoverLimitChanged();
@@ -570,7 +578,8 @@ private Q_SLOTS:
QNetworkAccessManager m_networkManager;
InstalledModels *m_installedModels;
InstalledModels *m_selectableModels;
- DownloadableModels *m_downloadableModels;
+ GPT4AllDownloadableModels *m_gpt4AllDownloadableModels;
+ HuggingFaceDownloadableModels *m_huggingFaceDownloadableModels;
QList m_models;
QHash m_modelMap;
bool m_asyncModelRequestOngoing;
diff --git a/gpt4all-chat/translations/gpt4all_en_US.ts b/gpt4all-chat/translations/gpt4all_en_US.ts
index 5f998cc865bb..33ce242a5671 100644
--- a/gpt4all-chat/translations/gpt4all_en_US.ts
+++ b/gpt4all-chat/translations/gpt4all_en_US.ts
@@ -60,291 +60,486 @@
- AddModelView
+ AddGPT4AllModelView
-
-
+
+
-
-
+
+
-
-
+
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ AddHFModelView
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
-
+
+
-
-
+
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
-
+
+
-
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
-
+
+
-
-
+
+
-
-
+
+
+
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
-
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
+
+
+ AddModelView
-
-
+
+
-
-
+
+
-
-
+
+
+
+
+
+
+
@@ -1602,78 +1797,78 @@ model to get started
ModelList
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
-
+
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
@@ -2658,12 +2853,12 @@ model release that uses your data!
-
+
-
+
diff --git a/gpt4all-chat/translations/gpt4all_es_MX.ts b/gpt4all-chat/translations/gpt4all_es_MX.ts
index 070a4e5d083f..8112b7149df5 100644
--- a/gpt4all-chat/translations/gpt4all_es_MX.ts
+++ b/gpt4all-chat/translations/gpt4all_es_MX.ts
@@ -63,6 +63,467 @@
Crear colección
+
+ AddGPT4AllModelView
+
+
+
+
+
+
+
+
+ Error de red: no se pudo recuperar %1
+
+
+
+
+
+ Indicador de ocupado
+
+
+
+
+ Se muestra cuando la solicitud de modelos está en curso
+
+
+
+
+ Archivo del modelo
+
+
+
+
+ Archivo del modelo a descargar
+
+
+
+
+ Descripción
+
+
+
+
+ Descripción del archivo
+
+
+
+
+ Cancelar
+
+
+
+
+ Reanudar
+
+
+
+
+ Descargar
+
+
+
+
+ Detener/reiniciar/iniciar la descarga
+
+
+
+
+ Eliminar
+
+
+
+
+ Eliminar modelo del sistema de archivos
+
+
+
+
+
+ Instalar
+
+
+
+
+ Instalar modelo en línea
+
+
+
+
+ <strong><font size="1"><a href="#error">Error</a></strong></font>
+
+
+
+
+ Describe un error que ocurrió durante la descarga
+
+
+
+
+
+
+
+
+
+ Error por hardware incompatible
+
+
+
+
+ Barra de progreso de descarga
+
+
+
+
+ Muestra el progreso realizado en la descarga
+
+
+
+
+ Velocidad de descarga
+
+
+
+
+ Velocidad de descarga en bytes/kilobytes/megabytes por segundo
+
+
+
+
+ Calculando...
+
+
+
+
+
+
+
+ Si se está calculando el hash del archivo
+
+
+
+
+ Se muestra cuando se está calculando el hash del archivo
+
+
+
+
+
+
+
+
+
+ ingrese $API_KEY
+
+
+
+
+
+
+
+
+
+ ingrese $BASE_URL
+
+
+
+
+ ERROR: $MODEL_NAME está vacío.
+
+
+
+
+ ingrese $MODEL_NAME
+
+
+
+
+ Tamaño del archivo
+
+
+
+
+ RAM requerida
+
+
+
+
+ %1 GB
+
+
+
+
+
+ ?
+
+
+
+
+ Parámetros
+
+
+
+
+ Cuantificación
+
+
+
+
+ Tipo
+
+
+
+ AddHFModelView
+
+
+
+
+
+
+
+
+ Descubre y descarga modelos mediante búsqueda por palabras clave...
+
+
+
+
+ Campo de texto para descubrir y filtrar modelos descargables
+
+
+
+
+ Buscando · %1
+
+
+
+
+ Iniciar descubrimiento y filtrado de modelos
+
+
+
+
+ Activa el descubrimiento y filtrado de modelos
+
+
+
+
+ Predeterminado
+
+
+
+
+ Me gusta
+
+
+
+
+ Descargas
+
+
+
+
+ Reciente
+
+
+
+
+ Ordenar por: %1
+
+
+
+
+ Asc
+
+
+
+
+ Desc
+
+
+
+
+ Dirección de ordenamiento: %1
+
+
+
+
+ Ninguno
+
+
+
+
+ Límite: %1
+
+
+
+
+ Archivo del modelo
+
+
+
+
+ Archivo del modelo a descargar
+
+
+
+
+ Descripción
+
+
+
+
+ Descripción del archivo
+
+
+
+
+ Cancelar
+
+
+
+
+ Reanudar
+
+
+
+
+ Descargar
+
+
+
+
+ Detener/reiniciar/iniciar la descarga
+
+
+
+
+ Eliminar
+
+
+
+
+ Eliminar modelo del sistema de archivos
+
+
+
+
+
+ Instalar
+
+
+
+
+ Instalar modelo en línea
+
+
+
+
+ <strong><font size="1"><a href="#error">Error</a></strong></font>
+
+
+
+
+ Describe un error que ocurrió durante la descarga
+
+
+
+
+
+
+
+
+
+ Error por hardware incompatible
+
+
+
+
+ Barra de progreso de descarga
+
+
+
+
+ Muestra el progreso realizado en la descarga
+
+
+
+
+ Velocidad de descarga
+
+
+
+
+ Velocidad de descarga en bytes/kilobytes/megabytes por segundo
+
+
+
+
+ Calculando...
+
+
+
+
+
+
+
+ Si se está calculando el hash del archivo
+
+
+
+
+ Indicador de ocupado
+
+
+
+
+ Se muestra cuando se está calculando el hash del archivo
+
+
+
+
+
+
+
+
+
+ ingrese $API_KEY
+
+
+
+
+
+
+
+
+
+ ingrese $BASE_URL
+
+
+
+
+ ERROR: $MODEL_NAME está vacío.
+
+
+
+
+ ingrese $MODEL_NAME
+
+
+
+
+ Tamaño del archivo
+
+
+
+
+ Cuantificación
+
+
+
+
+ Tipo
+
+
AddModelView
@@ -76,280 +537,230 @@
Explorar modelos
-
+
+
+ GPT4All
+
+
+
+
+
+
+
- Descubre y descarga modelos mediante búsqueda por palabras clave...
+ Descubre y descarga modelos mediante búsqueda por palabras clave...
-
- Campo de texto para descubrir y filtrar modelos descargables
+ Campo de texto para descubrir y filtrar modelos descargables
-
- Iniciar descubrimiento y filtrado de modelos
+ Iniciar descubrimiento y filtrado de modelos
-
- Activa el descubrimiento y filtrado de modelos
+ Activa el descubrimiento y filtrado de modelos
-
- Predeterminado
+ Predeterminado
-
- Me gusta
+ Me gusta
-
- Descargas
+ Descargas
-
- Reciente
+ Reciente
-
- Asc
+ Asc
-
- Desc
+ Desc
-
- Ninguno
+ Ninguno
-
- Buscando · %1
+ Buscando · %1
-
- Ordenar por: %1
+ Ordenar por: %1
-
- Dirección de ordenamiento: %1
+ Dirección de ordenamiento: %1
-
- Límite: %1
+ Límite: %1
-
- Error de red: no se pudo recuperar %1
+ Error de red: no se pudo recuperar %1
-
-
- Indicador de ocupado
+ Indicador de ocupado
-
- Se muestra cuando la solicitud de modelos está en curso
+ Se muestra cuando la solicitud de modelos está en curso
-
- Archivo del modelo
+ Archivo del modelo
-
- Archivo del modelo a descargar
+ Archivo del modelo a descargar
-
- Descripción
+ Descripción
-
- Descripción del archivo
+ Descripción del archivo
-
- Cancelar
+ Cancelar
-
- Reanudar
+ Reanudar
-
- Descargar
+ Descargar
-
- Detener/reiniciar/iniciar la descarga
+ Detener/reiniciar/iniciar la descarga
-
- Eliminar
+ Eliminar
-
- Eliminar modelo del sistema de archivos
+ Eliminar modelo del sistema de archivos
-
-
- Instalar
+ Instalar
-
- Instalar modelo en línea
+ Instalar modelo en línea
-
- <strong><font size="1"><a href="#error">Error</a></strong></font>
+ <strong><font size="1"><a href="#error">Error</a></strong></font>
-
- <strong><font size="2">ADVERTENCIA: No recomendado para tu hardware. El modelo requiere más memoria (%1 GB) de la que tu sistema tiene disponible (%2).</strong></font>
+ <strong><font size="2">ADVERTENCIA: No recomendado para tu hardware. El modelo requiere más memoria (%1 GB) de la que tu sistema tiene disponible (%2).</strong></font>
-
- %1 GB
+ %1 GB
-
-
- ?
+ ?
-
- Describe un error que ocurrió durante la descarga
+ Describe un error que ocurrió durante la descarga
-
- Error por hardware incompatible
+ Error por hardware incompatible
-
- Barra de progreso de descarga
+ Barra de progreso de descarga
-
- Muestra el progreso realizado en la descarga
+ Muestra el progreso realizado en la descarga
-
- Velocidad de descarga
+ Velocidad de descarga
-
- Velocidad de descarga en bytes/kilobytes/megabytes por segundo
+ Velocidad de descarga en bytes/kilobytes/megabytes por segundo
-
- Calculando...
+ Calculando...
-
-
-
-
- Si se está calculando el hash del archivo
+ Si se está calculando el hash del archivo
-
- Se muestra cuando se está calculando el hash del archivo
+ Se muestra cuando se está calculando el hash del archivo
-
- ingrese $API_KEY
+ ingrese $API_KEY
-
- Tamaño del archivo
+ Tamaño del archivo
-
- RAM requerida
+ RAM requerida
-
- Parámetros
+ Parámetros
-
- Cuantificación
+ Cuantificación
-
- Tipo
+ Tipo
-
- ERROR: $API_KEY está vacío.
+ ERROR: $API_KEY está vacío.
-
- ERROR: $BASE_URL está vacío.
+ ERROR: $BASE_URL está vacío.
-
- ingrese $BASE_URL
+ ingrese $BASE_URL
-
- ERROR: $MODEL_NAME está vacío.
+ ERROR: $MODEL_NAME está vacío.
-
- ingrese $MODEL_NAME
+ ingrese $MODEL_NAME
@@ -1696,78 +2107,78 @@ modelo para comenzar
ModelList
-
+
<ul><li>Requiere clave API personal de OpenAI.</li><li>ADVERTENCIA: ¡Enviará sus chats a OpenAI!</li><li>Su clave API se almacenará en el disco</li><li>Solo se usará para comunicarse con OpenAI</li><li>Puede solicitar una clave API <a href="https://platform.openai.com/account/api-keys">aquí.</a></li>
-
+
<strong>Modelo ChatGPT GPT-3.5 Turbo de OpenAI</strong><br> %1
-
+
<br><br><i>* Aunque pagues a OpenAI por ChatGPT-4, esto no garantiza el acceso a la clave API. Contacta a OpenAI para más información.
-
+
<strong>Modelo ChatGPT GPT-4 de OpenAI</strong><br> %1 %2
-
+
<ul><li>Requiere una clave API personal de Mistral.</li><li>ADVERTENCIA: ¡Enviará tus chats a Mistral!</li><li>Tu clave API se almacenará en el disco</li><li>Solo se usará para comunicarse con Mistral</li><li>Puedes solicitar una clave API <a href="https://console.mistral.ai/user/api-keys">aquí</a>.</li>
-
+
<strong>Modelo Mistral Tiny</strong><br> %1
-
+
<strong>Modelo Mistral Small</strong><br> %1
-
+
<strong>Modelo Mistral Medium</strong><br> %1
-
+
<strong>Creado por %1.</strong><br><ul><li>Publicado el %2.<li>Este modelo tiene %3 me gusta.<li>Este modelo tiene %4 descargas.<li>Más información puede encontrarse <a href="https://huggingface.co/%5">aquí.</a></ul>
-
+
%1 (%2)
-
-
+
+
no se puede abrir "%1": %2
-
+
no se puede crear "%1": %2
-
+
<strong>Modelo de API compatible con OpenAI</strong><br><ul><li>Clave API: %1</li><li>URL base: %2</li><li>Nombre del modelo: %3</li></ul>
-
+
<ul><li>Requiere una clave API personal y la URL base de la API.</li><li>ADVERTENCIA: ¡Enviará sus chats al servidor de API compatible con OpenAI que especificó!</li><li>Su clave API se almacenará en el disco</li><li>Solo se utilizará para comunicarse con el servidor de API compatible con OpenAI</li>
-
+
<strong>Conectar al servidor de API compatible con OpenAI</strong><br> %1
@@ -2827,12 +3238,12 @@ Locales
El modo servidor está habilitado
-
+
Modelos instalados
-
+
Vista de modelos instalados
diff --git a/gpt4all-chat/translations/gpt4all_it_IT.ts b/gpt4all-chat/translations/gpt4all_it_IT.ts
index 075abcd9cb27..4522b20f6c4e 100644
--- a/gpt4all-chat/translations/gpt4all_it_IT.ts
+++ b/gpt4all-chat/translations/gpt4all_it_IT.ts
@@ -59,6 +59,467 @@
Crea raccolta
+
+ AddGPT4AllModelView
+
+
+
+ Questi modelli sono stati specificamente configurati per l'uso in GPT4All. I primi modelli dell'elenco sono noti per funzionare meglio, ma dovresti utilizzare solo modelli che possano rientrare nella memoria disponibile.
+
+
+
+
+ Errore di rete: impossibile recuperare %1
+
+
+
+
+
+ Indicatore di occupato
+
+
+
+
+ Visualizzato quando la richiesta dei modelli è in corso
+
+
+
+
+ File del modello
+
+
+
+
+ File del modello da scaricare
+
+
+
+
+ Descrizione
+
+
+
+
+ Descrizione del file
+
+
+
+
+ Annulla
+
+
+
+
+ Riprendi
+
+
+
+
+ Scarica
+
+
+
+
+ Arresta/riavvia/avvia il download
+
+
+
+
+ Rimuovi
+
+
+
+
+ Rimuovi il modello dal sistema dei file
+
+
+
+
+
+ Installa
+
+
+
+
+ Installa il modello online
+
+
+
+
+ <strong><font size="1"><a href="#error">Errore</a></strong></font>
+
+
+
+
+ Descrive un errore che si è verificato durante lo scaricamento
+
+
+
+
+ <strong><font size="2">AVVISO: non consigliato per il tuo hardware. Il modello richiede più memoria (%1 GB) di quella disponibile nel sistema (%2).</strong></font>
+
+
+
+
+ Errore per hardware incompatibile
+
+
+
+
+ Barra di avanzamento dello scaricamento
+
+
+
+
+ Mostra lo stato di avanzamento dello scaricamento
+
+
+
+
+ Velocità di scaricamento
+
+
+
+
+ Velocità di scaricamento in byte/kilobyte/megabyte al secondo
+
+
+
+
+ Calcolo in corso...
+
+
+
+
+
+
+
+ Se viene calcolato l'hash del file
+
+
+
+
+ Visualizzato durante il calcolo dell'hash del file
+
+
+
+
+ ERRORE: $API_KEY è vuoto.
+
+
+
+
+ Inserire $API_KEY
+
+
+
+
+ ERRORE: $BASE_URL non è valido.
+
+
+
+
+ inserisci $BASE_URL
+
+
+
+
+ ERRORE: $MODEL_NAME è vuoto.
+
+
+
+
+ inserisci $MODEL_NAME
+
+
+
+
+ Dimensione del file
+
+
+
+
+ RAM richiesta
+
+
+
+
+ %1 GB
+
+
+
+
+
+ ?
+
+
+
+
+ Parametri
+
+
+
+
+ Quant
+
+
+
+
+ Tipo
+
+
+
+ AddHFModelView
+
+
+
+ Usa la ricerca per trovare e scaricare modelli da HuggingFace. NON C'È ALCUNA GARANZIA che funzioneranno. Molti richiederanno configurazioni aggiuntive prima di poter essere utilizzati.
+
+
+
+
+ Scopri e scarica i modelli tramite ricerca per parole chiave...
+
+
+
+
+ Campo di testo per scoprire e filtrare i modelli scaricabili
+
+
+
+
+ Ricerca · %1
+
+
+
+
+ Avvia rilevamento e filtraggio dei modelli
+
+
+
+
+ Attiva la scoperta e il filtraggio dei modelli
+
+
+
+
+ Predefinito
+
+
+
+
+ Mi piace
+
+
+
+
+ Scaricamenti
+
+
+
+
+ Recenti
+
+
+
+
+ Ordina per: %1
+
+
+
+
+ Asc
+
+
+
+
+ Disc
+
+
+
+
+ Direzione ordinamento: %1
+
+
+
+
+ Niente
+
+
+
+
+ Limite: %1
+
+
+
+
+ File del modello
+
+
+
+
+ File del modello da scaricare
+
+
+
+
+ Descrizione
+
+
+
+
+ Descrizione del file
+
+
+
+
+ Annulla
+
+
+
+
+ Riprendi
+
+
+
+
+ Scarica
+
+
+
+
+ Arresta/riavvia/avvia il download
+
+
+
+
+ Rimuovi
+
+
+
+
+ Rimuovi il modello dal sistema dei file
+
+
+
+
+
+ Installa
+
+
+
+
+ Installa il modello online
+
+
+
+
+ <strong><font size="1"><a href="#error">Errore</a></strong></font>
+
+
+
+
+ Descrive un errore che si è verificato durante lo scaricamento
+
+
+
+
+ <strong><font size="2">AVVISO: non consigliato per il tuo hardware. Il modello richiede più memoria (%1 GB) di quella disponibile nel sistema (%2).</strong></font>
+
+
+
+
+ Errore per hardware incompatibile
+
+
+
+
+ Barra di avanzamento dello scaricamento
+
+
+
+
+ Mostra lo stato di avanzamento dello scaricamento
+
+
+
+
+ Velocità di scaricamento
+
+
+
+
+ Velocità di scaricamento in byte/kilobyte/megabyte al secondo
+
+
+
+
+ Calcolo in corso...
+
+
+
+
+
+
+
+ Se viene calcolato l'hash del file
+
+
+
+
+ Indicatore di occupato
+
+
+
+
+ Visualizzato durante il calcolo dell'hash del file
+
+
+
+
+ ERRORE: $API_KEY è vuoto.
+
+
+
+
+ Inserire $API_KEY
+
+
+
+
+ ERRORE: $BASE_URL non è valido.
+
+
+
+
+ inserisci $BASE_URL
+
+
+
+
+ ERRORE: $MODEL_NAME è vuoto.
+
+
+
+
+ inserisci $MODEL_NAME
+
+
+
+
+ Dimensione del file
+
+
+
+
+ Quant
+
+
+
+
+ Tipo
+
+
AddModelView
@@ -72,280 +533,218 @@
Esplora modelli
-
+
+
+ GPT4All
+
+
+
+
+ HuggingFace
+
+
- Scopri e scarica i modelli tramite ricerca per parole chiave...
+ Scopri e scarica i modelli tramite ricerca per parole chiave...
-
- Campo di testo per scoprire e filtrare i modelli scaricabili
+ Campo di testo per scoprire e filtrare i modelli scaricabili
-
- Avvia rilevamento e filtraggio dei modelli
+ Avvia rilevamento e filtraggio dei modelli
-
- Attiva la scoperta e il filtraggio dei modelli
+ Attiva la scoperta e il filtraggio dei modelli
-
- Predefinito
+ Predefinito
-
- Mi piace
+ Mi piace
-
- Scaricamenti
+ Scaricamenti
-
- Recenti
+ Recenti
-
- Asc
+ Asc
-
- Disc
+ Disc
-
- Niente
+ Niente
-
- Ricerca · %1
+ Ricerca · %1
-
- Ordina per: %1
+ Ordina per: %1
-
- Direzione ordinamento: %1
+ Direzione ordinamento: %1
-
- Limite: %1
+ Limite: %1
-
- Errore di rete: impossibile recuperare %1
+ Errore di rete: impossibile recuperare %1
-
-
- Indicatore di occupato
+ Indicatore di occupato
-
- Visualizzato quando la richiesta dei modelli è in corso
+ Visualizzato quando la richiesta dei modelli è in corso
-
- File del modello
+ File del modello
-
- File del modello da scaricare
+ File del modello da scaricare
-
- Descrizione
+ Descrizione
-
- Descrizione del file
+ Descrizione del file
-
- Annulla
+ Annulla
-
- Riprendi
+ Riprendi
-
- Scarica
+ Scarica
-
- Arresta/riavvia/avvia il download
+ Arresta/riavvia/avvia il download
-
- Rimuovi
+ Rimuovi
-
- Rimuovi il modello dal sistema dei file
+ Rimuovi il modello dal sistema dei file
-
-
- Installa
+ Installa
-
- Installa il modello online
-
-
-
-
- <strong><font size="2">AVVERTENZA: non consigliato per il tuo hardware. Il modello richiede più memoria (%1 GB) di quella disponibile nel sistema (%2).</strong></font>
+ Installa il modello online
-
- ERRORE: $API_KEY è vuoto.
+ ERRORE: $API_KEY è vuoto.
-
- ERRORE: $BASE_URL non è valido.
+ ERRORE: $BASE_URL non è valido.
-
- inserisci $BASE_URL
+ inserisci $BASE_URL
-
- ERRORE: $MODEL_NAME è vuoto.
+ ERRORE: $MODEL_NAME è vuoto.
-
- inserisci $MODEL_NAME
-
-
-
-
-
+ inserisci $MODEL_NAME
-
-
-
-
-
-
-
- Descrive un errore che si è verificato durante lo scaricamento
+ Descrive un errore che si è verificato durante lo scaricamento
-
- <strong><font size="1"><a href="#error">Errore</a></strong></font>
+ <strong><font size="1"><a href="#error">Errore</a></strong></font>
-
- Errore per hardware incompatibile
+ Errore per hardware incompatibile
-
- Barra di avanzamento dello scaricamento
+ Barra di avanzamento dello scaricamento
-
- Mostra lo stato di avanzamento dello scaricamento
+ Mostra lo stato di avanzamento dello scaricamento
-
- Velocità di scaricamento
+ Velocità di scaricamento
-
- Velocità di scaricamento in byte/kilobyte/megabyte al secondo
+ Velocità di scaricamento in byte/kilobyte/megabyte al secondo
-
- Calcolo in corso...
+ Calcolo in corso...
-
-
-
-
- Se viene calcolato l'hash del file
+ Se viene calcolato l'hash del file
-
- Visualizzato durante il calcolo dell'hash del file
+ Visualizzato durante il calcolo dell'hash del file
-
- Inserire $API_KEY
+ Inserire $API_KEY
-
- Dimensione del file
+ Dimensione del file
-
- RAM richiesta
+ RAM richiesta
-
- Parametri
+ Parametri
-
- Quant
+ Quant
-
- Tipo
+ Tipo
@@ -1598,78 +1997,78 @@ modello per iniziare
ModelList
-
+
<ul><li>Richiede una chiave API OpenAI personale.</li><li>ATTENZIONE: invierà le tue chat a OpenAI!</li><li>La tua chiave API verrà archiviata su disco</li><li> Verrà utilizzato solo per comunicare con OpenAI</li><li>Puoi richiedere una chiave API <a href="https://platform.openai.com/account/api-keys">qui.</a> </li>
-
+
-
+
-
+
-
+
-
+
-
+
<br><br><i>* Anche se paghi OpenAI per ChatGPT-4 questo non garantisce l'accesso alla chiave API. Contatta OpenAI per maggiori informazioni.
-
-
+
+
impossibile aprire "%1": %2
-
+
impossibile creare "%1": %2
-
+
%1 (%2)
-
+
<strong>Modello API compatibile con OpenAI</strong><br><ul><li>Chiave API: %1</li><li>URL di base: %2</li><li>Nome modello: %3</li></ul>
-
+
<ul><li>Richiede una chiave API Mistral personale.</li><li>ATTENZIONE: invierà le tue chat a Mistral!</li><li>La tua chiave API verrà archiviata su disco</li><li> Verrà utilizzato solo per comunicare con Mistral</li><li>Puoi richiedere una chiave API <a href="https://console.mistral.ai/user/api-keys">qui</a>. </li>
-
+
<ul><li>Richiede una chiave API personale e l'URL di base dell'API.</li><li>ATTENZIONE: invierà le tue chat al server API compatibile con OpenAI che hai specificato!</li><li>La tua chiave API verrà archiviata su disco</li><li>Verrà utilizzata solo per comunicare con il server API compatibile con OpenAI</li>
-
+
<strong>Connetti al server API compatibile con OpenAI</strong><br> %1
-
+
<strong>Creato da %1.</strong><br><ul><li>Pubblicato il %2.<li>Questo modello ha %3 Mi piace.<li>Questo modello ha %4 download.<li>Altro informazioni possono essere trovate <a href="https://huggingface.co/%5">qui.</a></ul>
@@ -2447,7 +2846,7 @@ NOTA: attivando questa funzione, invierai i tuoi dati al Datalake Open Source di
-
+ Acconsenti all'analisi anonima dell'uso per migliorare GPT4All
@@ -2485,7 +2884,7 @@ NOTA: attivando questa funzione, invierai i tuoi dati al Datalake Open Source di
-
+ Acconsenti alla condivisione anonima delle chat con il GPT4All Datalake
@@ -2673,12 +3072,12 @@ NOTA: attivando questa funzione, invierai i tuoi dati al Datalake Open Source di
La modalità server è abilitata
-
+
Modelli installati
-
+
Vista dei modelli installati
diff --git a/gpt4all-chat/translations/gpt4all_pt_BR.ts b/gpt4all-chat/translations/gpt4all_pt_BR.ts
index 621dfc9356b1..9e3fd1c97ee7 100644
--- a/gpt4all-chat/translations/gpt4all_pt_BR.ts
+++ b/gpt4all-chat/translations/gpt4all_pt_BR.ts
@@ -63,6 +63,467 @@
Criar Coleção
+
+ AddGPT4AllModelView
+
+
+
+
+
+
+
+
+ Erro de rede: não foi possível obter %1
+
+
+
+
+
+
+
+
+
+
+ xibido enquanto os modelos estão sendo carregados
+
+
+
+
+ Arquivo do modelo
+
+
+
+
+ Arquivo do modelo a ser baixado
+
+
+
+
+ Descrição
+
+
+
+
+ Descrição do arquivo
+
+
+
+
+ Cancelar
+
+
+
+
+ Retomar
+
+
+
+
+ Baixar
+
+
+
+
+ Parar/reiniciar/iniciar o download
+
+
+
+
+ Remover
+
+
+
+
+
+
+
+
+
+
+ Instalar
+
+
+
+
+ Instalar modelo online
+
+
+
+
+ <strong><font size="1"><a href="#error">Erro</a></strong></font>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Mostra o progresso do download
+
+
+
+
+ Velocidade de download
+
+
+
+
+ Velocidade de download em bytes/kilobytes/megabytes por segundo
+
+
+
+
+ Calculando...
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ inserir $API_KEY
+
+
+
+
+ ERRO: A $BASE_URL está vazia.
+
+
+
+
+ inserir a $BASE_URL
+
+
+
+
+
+
+
+
+
+ inserir o $MODEL_NAME
+
+
+
+
+ Tamanho do arquivo
+
+
+
+
+ RAM necessária
+
+
+
+
+ %1 GB
+
+
+
+
+
+ ?
+
+
+
+
+ Parâmetros
+
+
+
+
+ Quant
+
+
+
+
+ Tipo
+
+
+
+ AddHFModelView
+
+
+
+
+
+
+
+
+ Pesquisar modelos...
+
+
+
+
+ Campo de texto para descobrir e filtrar modelos para download
+
+
+
+
+ Pesquisando · %1
+
+
+
+
+ Pesquisar e filtrar modelos
+
+
+
+
+ Aciona a descoberta e filtragem de modelos
+
+
+
+
+ Padrão
+
+
+
+
+ Curtidas
+
+
+
+
+ Downloads
+
+
+
+
+ Recentes
+
+
+
+
+ Ordenar por: %1
+
+
+
+
+ Asc
+
+
+
+
+ Desc
+
+
+
+
+ Ordenar diretório: %1
+
+
+
+
+ Nenhum
+
+
+
+
+ Limite: %1
+
+
+
+
+ Arquivo do modelo
+
+
+
+
+ Arquivo do modelo a ser baixado
+
+
+
+
+ Descrição
+
+
+
+
+ Descrição do arquivo
+
+
+
+
+ Cancelar
+
+
+
+
+ Retomar
+
+
+
+
+ Baixar
+
+
+
+
+ Parar/reiniciar/iniciar o download
+
+
+
+
+ Remover
+
+
+
+
+
+
+
+
+
+
+ Instalar
+
+
+
+
+ Instalar modelo online
+
+
+
+
+ <strong><font size="1"><a href="#error">Erro</a></strong></font>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Mostra o progresso do download
+
+
+
+
+ Velocidade de download
+
+
+
+
+ Velocidade de download em bytes/kilobytes/megabytes por segundo
+
+
+
+
+ Calculando...
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ inserir $API_KEY
+
+
+
+
+ ERRO: A $BASE_URL está vazia.
+
+
+
+
+ inserir a $BASE_URL
+
+
+
+
+
+
+
+
+
+ inserir o $MODEL_NAME
+
+
+
+
+ Tamanho do arquivo
+
+
+
+
+ Quant
+
+
+
+
+ Tipo
+
+
AddModelView
@@ -76,280 +537,230 @@
Descobrir Modelos
-
+
+
+ GPT4All
+
+
+
+
+
+
+
- Pesquisar modelos...
+ Pesquisar modelos...
-
- Campo de texto para descobrir e filtrar modelos para download
+ Campo de texto para descobrir e filtrar modelos para download
-
- Pesquisar e filtrar modelos
+ Pesquisar e filtrar modelos
-
- Aciona a descoberta e filtragem de modelos
+ Aciona a descoberta e filtragem de modelos
-
- Padrão
+ Padrão
-
- Curtidas
+ Curtidas
-
- Downloads
+ Downloads
-
- Recentes
+ Recentes
-
- Asc
+ Asc
-
- Desc
+ Desc
-
- Nenhum
+ Nenhum
-
- Pesquisando · %1
+ Pesquisando · %1
-
- Ordenar por: %1
+ Ordenar por: %1
-
- Ordenar diretório: %1
+ Ordenar diretório: %1
-
- Limite: %1
+ Limite: %1
-
- Erro de rede: não foi possível obter %1
+ Erro de rede: não foi possível obter %1
-
-
- Indicador de processamento
+ Indicador de processamento
-
- xibido enquanto os modelos estão sendo carregados
+ xibido enquanto os modelos estão sendo carregados
-
- Arquivo do modelo
+ Arquivo do modelo
-
- Arquivo do modelo a ser baixado
+ Arquivo do modelo a ser baixado
-
- Descrição
+ Descrição
-
- Descrição do arquivo
+ Descrição do arquivo
-
- Cancelar
+ Cancelar
-
- Retomar
+ Retomar
-
- Baixar
+ Baixar
-
- Parar/reiniciar/iniciar o download
+ Parar/reiniciar/iniciar o download
-
- Remover
+ Remover
-
- Remover modelo do sistema
+ Remover modelo do sistema
-
-
- Instalar
+ Instalar
-
- Instalar modelo online
+ Instalar modelo online
-
- <strong><font size="2">ATENÇÃO: Este modelo não é recomendado para seu hardware. Ele exige mais memória (%1 GB) do que seu sistema possui (%2).</strong></font>
+ <strong><font size="2">ATENÇÃO: Este modelo não é recomendado para seu hardware. Ele exige mais memória (%1 GB) do que seu sistema possui (%2).</strong></font>
-
- ERRO: A $API_KEY está vazia.
+ ERRO: A $API_KEY está vazia.
-
- ERRO: A $BASE_URL está vazia.
+ ERRO: A $BASE_URL está vazia.
-
- inserir a $BASE_URL
+ inserir a $BASE_URL
-
- ERRO: O $MODEL_NAME está vazio.
+ ERRO: O $MODEL_NAME está vazio.
-
- inserir o $MODEL_NAME
+ inserir o $MODEL_NAME
-
- %1 GB
+ %1 GB
-
-
- ?
+ ?
-
- Mostra informações sobre o erro no download
+ Mostra informações sobre o erro no download
-
- <strong><font size="1"><a href="#error">Erro</a></strong></font>
+ <strong><font size="1"><a href="#error">Erro</a></strong></font>
-
- Aviso: Hardware não compatível
+ Aviso: Hardware não compatível
-
- Progresso do download
+ Progresso do download
-
- Mostra o progresso do download
+ Mostra o progresso do download
-
- Velocidade de download
+ Velocidade de download
-
- Velocidade de download em bytes/kilobytes/megabytes por segundo
+ Velocidade de download em bytes/kilobytes/megabytes por segundo
-
- Calculando...
+ Calculando...
-
-
-
-
- Quando o hash do arquivo está sendo calculado
+ Quando o hash do arquivo está sendo calculado
-
- Exibido durante o cálculo do hash do arquivo
+ Exibido durante o cálculo do hash do arquivo
-
- inserir $API_KEY
+ inserir $API_KEY
-
- Tamanho do arquivo
+ Tamanho do arquivo
-
- RAM necessária
+ RAM necessária
-
- Parâmetros
+ Parâmetros
-
- Quant
+ Quant
-
- Tipo
+ Tipo
@@ -1698,78 +2109,78 @@ modelo instalado para funcionar
ModelList
-
+
<ul><li>É necessária uma chave de API da OpenAI.</li><li>AVISO: Seus chats serão enviados para a OpenAI!</li><li>Sua chave de API será armazenada localmente</li><li>Ela será usada apenas para comunicação com a OpenAI</li><li>Você pode solicitar uma chave de API <a href="https://platform.openai.com/account/api-keys">aqui.</a></li>
-
+
<strong>Modelo ChatGPT GPT-3.5 Turbo da OpenAI</strong><br> %1
-
+
<strong>Modelo ChatGPT GPT-4 da OpenAI</strong><br> %1 %2
-
+
<strong>Modelo Mistral Tiny</strong><br> %1
-
+
<strong>Modelo Mistral Small</strong><br> %1
-
+
<strong>Modelo Mistral Medium</strong><br> %1
-
+
<br><br><i>* Mesmo que você pague pelo ChatGPT-4 da OpenAI, isso não garante acesso à chave de API. Contate a OpenAI para mais informações.
-
-
+
+
não é possível abrir "%1": %2
-
+
não é possível criar "%1": %2
-
+
%1 (%2)
-
+
<strong>Modelo de API Compatível com OpenAI</strong><br><ul><li>Chave da API: %1</li><li>URL Base: %2</li><li>Nome do Modelo: %3</li></ul>
-
+
<ul><li>É necessária uma chave de API da Mistral.</li><li>AVISO: Seus chats serão enviados para a Mistral!</li><li>Sua chave de API será armazenada localmente</li><li>Ela será usada apenas para comunicação com a Mistral</li><li>Você pode solicitar uma chave de API <a href="https://console.mistral.ai/user/api-keys">aqui</a>.</li>
-
+
<ul><li>É necessária uma chave de API e a URL da API.</li><li>AVISO: Seus chats serão enviados para o servidor de API compatível com OpenAI que você especificou!</li><li>Sua chave de API será armazenada no disco</li><li>Será usada apenas para comunicação com o servidor de API compatível com OpenAI</li>
-
+
<strong>Conectar a um servidor de API compatível com OpenAI</strong><br> %1
-
+
<strong>Criado por %1.</strong><br><ul><li>Publicado em %2.<li>Este modelo tem %3 curtidas.<li>Este modelo tem %4 downloads.<li>Mais informações podem ser encontradas <a href="https://huggingface.co/%5">aqui.</a></ul>
@@ -2829,12 +3240,12 @@ versão do modelo GPT4All que utilize seus dados!
Modo servidor ativado
-
+
Modelos instalados
-
+
Exibe os modelos instalados
diff --git a/gpt4all-chat/translations/gpt4all_ro_RO.ts b/gpt4all-chat/translations/gpt4all_ro_RO.ts
index adea95478f66..199fa6aad1f7 100644
--- a/gpt4all-chat/translations/gpt4all_ro_RO.ts
+++ b/gpt4all-chat/translations/gpt4all_ro_RO.ts
@@ -64,292 +64,615 @@
- AddModelView
+ AddGPT4AllModelView
-
-
- ← Modelele curente/instalate
+
+
+ Aceste modele au fost configurate special pentru utilizarea în GPT4All. Primele câteva modele din listă sunt cunoscute ca fiind cele mai bune, dar ar trebui să încercați să utilizați doar modele care se încadrează în RAM.
-
-
- Caută modele
+
+
+ Eroare de reţea: nu se poate prelua %1
+
+
+
+
+
+ Indicator de activitate
+
+
+
+
+ Afişat în timpul solicitării modelului
+
+
+
+
+ Fişierul modelului
+
+
+
+
+ Fişierul modelului ce va fi descărcat
+
+
+
+
+ Descriere
+
+
+
+
+ Descrierea fişierului
+
+
+
+
+ Anulare
+
+
+
+
+ Continuare
+
+
+
+
+ Download
+
+
+
+
+ Oprirea/Repornirea/Iniţierea descărcării
+
+
+
+
+ Şterg
+
+
+
+
+ Şterg modelul din sistemul de fişiere
+
+
+
+
+
+ Instalare
+
+
+
+
+ Instalez un model din online
+
+
+
+
+ <strong><font size="1"><a href="#error">Eroare</a></strong></font>
+
+
+
+
+ Descrie eroarea apărută în timpul descărcării
+
+
+
+
+ <strong><font size="2">ATENŢIE: Nerecomandat pentru acest hardware. Modelul necesită mai multă memorie (%1 GB) decât are acest sistem (%2).</strong></font>
+
+
+
+
+ Eroare: hardware incompatibil
+
+
+
+
+ Progresia descărcării
+
+
+
+
+ Afişează progresia descărcării
+
+
+
+
+ Viteza de download
+
+
+
+
+ Viteza de download în bytes/kilobytes/megabytes pe secundă
+
+
+
+
+ Calculare...
+
+
+
+
+
+
+
+ Dacă se calculează hash-ul fişierului
+
+
+
+
+ Se afişează când se calculează hash-ul fişierului
+
+
+
+
+ EROARE: $API_KEY absentă.
+
+
+
+
+ introdu cheia $API_KEY
+
+
+
+
+ EROARE: $BASE_URL absentă.
-
+
+
+ introdu $BASE_URL
+
+
+
+
+ EROARE: $MODEL_NAME absent
+
+
+
+
+ introdu $MODEL_NAME
+
+
+
+
+ Dimensiunea fişierului
+
+
+
+
+ RAM necesară
+
+
+
+
+ %1 GB
+
+
+
+
+
+ ?
+
+
+
+
+ Parametri
+
+
+
+
+ Quant(ificare)
+
+
+
+
+ Tip
+
+
+
+ AddHFModelView
+
+
+
+ Utilizați funcția de căutare pentru a găsi și descărca modele de pe HuggingFace. NU E GARANTAT că acestea vor funcționa. Multe dintre ele vor necesita configurări suplimentare înainte de a putea fi utilizate.
+
+
+
Caută şi descarcă modele după un cuvânt-cheie...
-
+
Câmp pentru căutarea şi filtrarea modelelor ce pot fi descărcate
-
+
+
+ Căutare · %1
+
+
+
Iniţiază căutarea şi filtrarea modelelor
-
+
Activează căutarea şi filtrarea modelelor
-
+
Implicit
-
+
Likes
-
+
Download-uri
-
+
Recent/e
-
+
+
+ Ordonare după: %1
+
+
+
Asc. (A->Z)
-
+
Desc. (Z->A)
-
-
- Niciunul
-
-
-
-
- Căutare · %1
-
-
-
-
- Ordonare după: %1
-
-
-
+
Sensul ordonării: %1
-
-
- Límită: %1
-
-
-
-
- Eroare de reţea: nu se poate prelua %1
-
-
-
-
-
- Indicator de activitate
+
+
+ Niciunul
-
-
- Afişat în timpul solicitării modelului
+
+
+ Límită: %1
-
+
Fişierul modelului
-
+
- Fişierul modelului de descărcat
+ Fişierul modelului ce va fi descărcat
-
+
Descriere
-
+
Descrierea fişierului
-
+
Anulare
-
+
Continuare
-
+
Download
-
+
- Opreşte/Reporneşte/Începe descărcarea
+ Oprirea/Repornirea/Iniţierea descărcării
-
+
- Şterge
+ Şterg
-
+
- Şterge modelul din sistemul de fişiere
+ Şterg modelul din sistemul de fişiere
-
-
+
+
Instalare
-
+
Instalez un model din online
-
+
<strong><font size="1"><a href="#error">Eroare</a></strong></font>
-
-
- <strong><font size="2">ATENŢIE: Nerecomandat pentru acest hardware. Modelul necesită mai multă memorie (%1 GB) decât are acest sistem (%2).</strong></font>
-
-
-
-
- %1 GB
-
-
-
-
-
- ?
+
+
+ Descrie o eroare aparută la download
-
-
- Descrie eroarea apărută în timpul descărcării
+
+
+ <strong><font size="2">ATENŢIE: Nerecomandat pentru acest hardware. Modelul necesită mai multă memorie (%1 GB) decât are acest sistem (%2).</strong></font>
-
+
- Eroare: hardware incompatibil
+ Eroare - hardware incompatibil
-
+
- Progresia descărcării
+ Bara de progresie a descărcării
-
+
Afişează progresia descărcării
-
+
Viteza de download
-
+
Viteza de download în bytes/kilobytes/megabytes pe secundă
-
+
Calculare...
-
-
-
-
+
+
+
+
Dacă se calculează hash-ul fişierului
-
+
+
+ Indicator de activitate
+
+
+
- Se afişează când se calculează hash-ul fişierului
+ Afişat la calcularea hash-ului fişierului
-
+
EROARE: $API_KEY absentă
-
+
introdu cheia $API_KEY
-
+
EROARE: $BASE_URL absentă
-
+
introdu $BASE_URL
-
-
- EROARE: $MODEL_NAME absent
+
+
+ EROARE: $API_KEY absentă
-
+
introdu $MODEL_NAME
-
+
Dimensiunea fişierului
-
+
+
+ Quant(ificare)
+
+
+
+
+ Tip
+
+
+
+ AddModelView
+
+
+
+ ← Modelele curente/instalate
+
+
+
+
+ Caută modele
+
+
+
+
+ GPT4All
+
+
+
+
+ HuggingFace
+
+
+
+ Caută şi descarcă modele după un cuvânt-cheie...
+
+
+
+ Câmp pentru căutarea şi filtrarea modelelor ce pot fi descărcate
+
+
+
+ Iniţiază căutarea şi filtrarea modelelor
+
+
+
+ Activează căutarea şi filtrarea modelelor
+
+
+
+ Implicit
+
+
+
+ Likes
+
+
+
+ Download-uri
+
+
+
+ Recent/e
+
+
+
+ Asc. (A->Z)
+
+
+
+ Desc. (Z->A)
+
+
+
+ Niciunul
+
+
+
+ Căutare · %1
+
+
+
+ Ordonare după: %1
+
+
+
+ Sensul ordonării: %1
+
+
+
+ Límită: %1
+
+
+
+ Eroare de reţea: nu se poate prelua %1
+
+
+
+ Indicator de activitate
+
+
+
+ Afişat în timpul solicitării modelului
+
+
+
+ Fişierul modelului
+
+
+
+ Fişierul modelului de descărcat
+
+
+
+ Instalez un model din online
+
+
+
+ %1 GB
+
+
+
+ ?
+
+
+
+ Afişează progresia descărcării
+
+
+
+ Viteza de download
+
+
+
+ Viteza de download în bytes/kilobytes/megabytes pe secundă
+
+
+
+ introdu cheia $API_KEY
+
+
+
+ Dimensiunea fişierului
+
+
- RAM necesară
+ RAM necesară
-
- Parametri
+ Parametri
-
- Quant(ificare)
+ Quant(ificare)
-
- Tip
+ Tip
@@ -1749,78 +2072,78 @@ model to get started
ModelList
-
-
+
+
nu se poate deschide „%1”: %2
-
+
nu se poate crea „%1”: %2
-
+
%1 (%2)
-
+
<strong>Model API compatibil cu OpenAI</strong><br><ul><li>Cheia API: %1</li><li>Base URL: %2</li><li>Numele modelului: %3</li></ul>
-
+
<ul><li>Necesită o cheie API OpenAI personală. </li><li>ATENŢIE: Conversaţiile tale vor fi trimise la OpenAI!</li><li>Cheia ta API va fi stocată pe disc (local) </li><li>Va fi utilizată numai pentru comunicarea cu OpenAI</li><li>Poţi solicita o cheie API aici: <a href="https://platform.openai.com/account/api-keys">aici.</a></li>
-
+
<strong>Modelul OpenAI's ChatGPT GPT-3.5 Turbo</strong><br> %1
-
+
<br><br><i>* Chiar dacă plăteşti la OpenAI pentru ChatGPT-4, aceasta nu garantează accesul la cheia API. Contactează OpenAI pentru mai multe informaţii.
-
+
<strong>Modelul ChatGPT GPT-4 al OpenAI</strong><br> %1 %2
-
+
<ul><li>Necesită cheia personală Mistral API. </li><li>ATENŢIE: Conversaţiile tale vor fi trimise la Mistral!</li><li>Cheia ta API va fi stocată pe disc (local)</li><li>Va fi utilizată numai pentru comunicarea cu Mistral</li><li>Poţi solicita o cheie API aici: <a href="https://console.mistral.ai/user/api-keys">aici</a>.</li>
-
+
<strong>Modelul Mistral Tiny</strong><br> %1
-
+
<strong>Modelul Mistral Small</strong><br> %1
-
+
<strong>Modelul Mistral Medium</strong><br> %1
-
+
<ul><li>Necesită cheia personală API si base-URL a API.</li><li>ATENŢIE: Conversaţiile tale vor fi trimise la serverul API compatibil cu OpenAI specificat!</li><li>Cheia ta API va fi stocată pe disc (local)</li><li>Va fi utilizată numai pentru comunicarea cu serverul API compatibil cu OpenAI</li>
-
+
<strong>Conectare la un server API compatibil cu OpenAI</strong><br> %1
-
+
<strong>Creat de către %1.</strong><br><ul><li>Publicat in: %2.<li>Acest model are %3 Likes.<li>Acest model are %4 download-uri.<li>Mai multe informaţii pot fi găsite la: <a href="https://huggingface.co/%5">aici.</a></ul>
@@ -2678,7 +3001,7 @@ care foloseşte datele tale!
-
+ Optați pentru trimiterea anonimă a evidenței utilizării, folosite pentru a îmbunătăți GPT4All
@@ -2716,7 +3039,7 @@ care foloseşte datele tale!
-
+ Optați pentru partajarea anonimă a conversațiilor în GPT4All Datalake
@@ -2923,12 +3246,12 @@ care foloseşte datele tale!
Modul Server: ACTIV
-
+
Modele instalate
-
+
Secţiunea modelelor instalate
diff --git a/gpt4all-chat/translations/gpt4all_zh_CN.ts b/gpt4all-chat/translations/gpt4all_zh_CN.ts
index e8ed57386dbb..c1537e5779e0 100644
--- a/gpt4all-chat/translations/gpt4all_zh_CN.ts
+++ b/gpt4all-chat/translations/gpt4all_zh_CN.ts
@@ -63,6 +63,467 @@
创建集合
+
+ AddGPT4AllModelView
+
+
+
+
+
+
+
+
+ 网络错误:无法检索 %1
+
+
+
+
+
+ 繁忙程度
+
+
+
+
+ 在模型请求进行中时显示
+
+
+
+
+ 模型文件
+
+
+
+
+
+
+
+
+
+ 描述
+
+
+
+
+ 文件描述
+
+
+
+
+ 取消
+
+
+
+
+ 继续
+
+
+
+
+ 下载
+
+
+
+
+ 停止/重启/开始下载
+
+
+
+
+ 删除
+
+
+
+
+ 从系统中删除模型
+
+
+
+
+
+
+
+
+
+
+ 安装在线模型
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 硬件不兼容的错误
+
+
+
+
+ 下载进度
+
+
+
+
+ 显示下载进度
+
+
+
+
+ 下载速度
+
+
+
+
+ 下载速度 b/kb/mb /s
+
+
+
+
+
+
+
+
+
+
+
+
+ 是否正在计算文件哈希
+
+
+
+
+ 在计算文件哈希时显示
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 错误:$BASE_URL 为空
+
+
+
+
+ 输入 $BASE_URL
+
+
+
+
+
+
+
+
+
+ 输入:$MODEL_NAME
+
+
+
+
+ 文件大小
+
+
+
+
+
+
+
+
+
+ %1 GB
+
+
+
+
+
+ ?
+
+
+
+
+ 参数
+
+
+
+
+ 量化
+
+
+
+
+ 类型
+
+
+
+ AddHFModelView
+
+
+
+
+
+
+
+
+ 通过关键词查找并下载模型 ...
+
+
+
+
+ 用于发现和筛选可下载模型的文本字段
+
+
+
+
+ 搜索中 · %1
+
+
+
+
+ 启动模型发现和过滤
+
+
+
+
+ 触发模型的发现和筛选
+
+
+
+
+ 默认
+
+
+
+
+ 喜欢
+
+
+
+
+ 下载
+
+
+
+
+ 近期
+
+
+
+
+ 排序: %1
+
+
+
+
+ 升序
+
+
+
+
+ 倒序
+
+
+
+
+ 排序目录: %1
+
+
+
+
+ 无
+
+
+
+
+ 数量: %1
+
+
+
+
+ 模型文件
+
+
+
+
+
+
+
+
+
+ 描述
+
+
+
+
+ 文件描述
+
+
+
+
+ 取消
+
+
+
+
+ 继续
+
+
+
+
+ 下载
+
+
+
+
+ 停止/重启/开始下载
+
+
+
+
+ 删除
+
+
+
+
+ 从系统中删除模型
+
+
+
+
+
+
+
+
+
+
+ 安装在线模型
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 硬件不兼容的错误
+
+
+
+
+ 下载进度
+
+
+
+
+ 显示下载进度
+
+
+
+
+ 下载速度
+
+
+
+
+ 下载速度 b/kb/mb /s
+
+
+
+
+
+
+
+
+
+
+
+
+ 是否正在计算文件哈希
+
+
+
+
+ 繁忙程度
+
+
+
+
+ 在计算文件哈希时显示
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 错误:$BASE_URL 为空
+
+
+
+
+ 输入 $BASE_URL
+
+
+
+
+
+
+
+
+
+ 输入:$MODEL_NAME
+
+
+
+
+ 文件大小
+
+
+
+
+ 量化
+
+
+
+
+ 类型
+
+
AddModelView
@@ -76,280 +537,230 @@
发现模型
-
+
+
+ GPT4All
+
+
+
+
+
+
+
- 通过关键词查找并下载模型 ...
+ 通过关键词查找并下载模型 ...
-
- 用于发现和筛选可下载模型的文本字段
+ 用于发现和筛选可下载模型的文本字段
-
- 启动模型发现和过滤
+ 启动模型发现和过滤
-
- 触发模型的发现和筛选
+ 触发模型的发现和筛选
-
- 默认
+ 默认
-
- 喜欢
+ 喜欢
-
- 下载
+ 下载
-
- 近期
+ 近期
-
- 升序
+ 升序
-
- 倒序
+ 倒序
-
- 无
+ 无
-
- 搜索中 · %1
+ 搜索中 · %1
-
- 排序: %1
+ 排序: %1
-
- 排序目录: %1
+ 排序目录: %1
-
- 数量: %1
+ 数量: %1
-
- 网络错误:无法检索 %1
+ 网络错误:无法检索 %1
-
-
- 繁忙程度
+ 繁忙程度
-
- 在模型请求进行中时显示
+ 在模型请求进行中时显示
-
- 模型文件
+ 模型文件
-
- 待下载模型
+ 待下载模型
-
- 描述
+ 描述
-
- 文件描述
+ 文件描述
-
- 取消
+ 取消
-
- 继续
+ 继续
-
- 下载
+ 下载
-
- 停止/重启/开始下载
+ 停止/重启/开始下载
-
- 删除
+ 删除
-
- 从系统中删除模型
+ 从系统中删除模型
-
-
- 安装
+ 安装
-
- 安装在线模型
+ 安装在线模型
-
- <strong><font size="1"><a href="#error">错误</a></strong></font>
+ <strong><font size="1"><a href="#error">错误</a></strong></font>
-
- <strong><font size="2">警告: 你的设备硬件不推荐 ,模型需要的内存 (%1 GB)比你的系统还要多 (%2).</strong></font>
+ <strong><font size="2">警告: 你的设备硬件不推荐 ,模型需要的内存 (%1 GB)比你的系统还要多 (%2).</strong></font>
-
- 错误:$API_KEY 为空
+ 错误:$API_KEY 为空
-
- 错误:$BASE_URL 为空
+ 错误:$BASE_URL 为空
-
- 输入 $BASE_URL
+ 输入 $BASE_URL
-
- 错误:$MODEL_NAME为空
+ 错误:$MODEL_NAME为空
-
- 输入:$MODEL_NAME
+ 输入:$MODEL_NAME
-
- %1 GB
+ %1 GB
-
-
- ?
+ ?
-
- 描述下载过程中发生的错误
+ 描述下载过程中发生的错误
-
- 硬件不兼容的错误
+ 硬件不兼容的错误
-
- 下载进度
+ 下载进度
-
- 显示下载进度
+ 显示下载进度
-
- 下载速度
+ 下载速度
-
- 下载速度 b/kb/mb /s
+ 下载速度 b/kb/mb /s
-
- 计算中
+ 计算中
-
-
-
-
- 是否正在计算文件哈希
+ 是否正在计算文件哈希
-
- 在计算文件哈希时显示
+ 在计算文件哈希时显示
-
- 输入$API_KEY
+ 输入$API_KEY
-
- 文件大小
+ 文件大小
-
- RAM 需要
+ RAM 需要
-
- 参数
+ 参数
-
- 量化
+ 量化
-
- 类型
+ 类型
@@ -1698,78 +2109,78 @@ model to get started
ModelList
-
-
+
+
无法打开“%1”:%2
-
+
无法创建“%1”:%2
-
+
%1 (%2)
-
+
<strong>与 OpenAI 兼容的 API 模型</strong><br><ul><li>API 密钥:%1</li><li>基本 URL:%2</li><li>模型名称:%3</li></ul>
-
+
<ul><li>需要个人 OpenAI API 密钥。</li><li>警告:将把您的聊天内容发送给 OpenAI!</li><li>您的 API 密钥将存储在磁盘上</li><li>仅用于与 OpenAI 通信</li><li>您可以在此处<a href="https://platform.openai.com/account/api-keys">申请 API 密钥。</a></li>
-
+
<strong>OpenAI's ChatGPT model GPT-3.5 Turbo</strong><br> %1
-
+
<strong>OpenAI's ChatGPT model GPT-4</strong><br> %1 %2
-
+
<strong>Mistral Tiny model</strong><br> %1
-
+
<strong>Mistral Small model</strong><br> %1
-
+
<strong>Mistral Medium model</strong><br> %1
-
+
<ul><li>需要个人 API 密钥和 API 基本 URL。</li><li>警告:将把您的聊天内容发送到您指定的与 OpenAI 兼容的 API 服务器!</li><li>您的 API 密钥将存储在磁盘上</li><li>仅用于与与 OpenAI 兼容的 API 服务器通信</li>
-
+
<strong>连接到与 OpenAI 兼容的 API 服务器</strong><br> %1
-
+
<br><br><i>* 即使您为ChatGPT-4向OpenAI付款,这也不能保证API密钥访问。联系OpenAI获取更多信息。
-
+
<ul><li>Requires personal Mistral API key.</li><li>WARNING: Will send your chats to Mistral!</li><li>Your API key will be stored on disk</li><li>Will only be used to communicate with Mistral</li><li>You can apply for an API key <a href="https://console.mistral.ai/user/api-keys">here</a>.</li>
-
+
<strong>Created by %1.</strong><br><ul><li>Published on %2.<li>This model has %3 likes.<li>This model has %4 downloads.<li>More info can be found <a href="https://huggingface.co/%5">here.</a></ul>
@@ -2821,12 +3232,12 @@ model release that uses your data!
服务器模式已开
-
+
安装模型
-
+
查看已安装模型
diff --git a/gpt4all-chat/translations/gpt4all_zh_TW.ts b/gpt4all-chat/translations/gpt4all_zh_TW.ts
index 0f86f7df73ab..2e7e8eb90023 100644
--- a/gpt4all-chat/translations/gpt4all_zh_TW.ts
+++ b/gpt4all-chat/translations/gpt4all_zh_TW.ts
@@ -59,6 +59,467 @@
建立收藏
+
+ AddGPT4AllModelView
+
+
+
+
+
+
+
+
+ 網路錯誤:無法取得 %1
+
+
+
+
+
+ 忙線指示器
+
+
+
+
+ 當模型請求正在進行時顯示
+
+
+
+
+ 模型檔案
+
+
+
+
+ 即將下載的模型檔案
+
+
+
+
+ 描述
+
+
+
+
+ 檔案描述
+
+
+
+
+ 取消
+
+
+
+
+ 恢復
+
+
+
+
+ 下載
+
+
+
+
+ 停止/重啟/開始下載
+
+
+
+
+ 移除
+
+
+
+
+ 從檔案系統移除模型
+
+
+
+
+
+ 安裝
+
+
+
+
+ 安裝線上模型
+
+
+
+
+ <strong><font size="1"><a href="#error">錯誤</a></strong></font>
+
+
+
+
+ 解釋下載時發生的錯誤
+
+
+
+
+ <strong><font size="2">警告:不推薦在您的硬體上運作。模型需要比較多的記憶體(%1 GB),但您的系統記憶體空間不足(%2)。</strong></font>
+
+
+
+
+ 錯誤,不相容的硬體
+
+
+
+
+ 下載進度條
+
+
+
+
+ 顯示下載進度
+
+
+
+
+ 下載速度
+
+
+
+
+ 下載速度每秒 bytes/kilobytes/megabytes
+
+
+
+
+ 計算中......
+
+
+
+
+
+
+
+ 是否正在計算檔案雜湊
+
+
+
+
+ 計算檔案雜湊值時顯示
+
+
+
+
+ 錯誤:$API_KEY 未填寫。
+
+
+
+
+ 請輸入 $API_KEY
+
+
+
+
+ 錯誤:$BASE_URL 未填寫。
+
+
+
+
+ 請輸入 $BASE_URL
+
+
+
+
+ 錯誤:$MODEL_NAME 未填寫。
+
+
+
+
+ 請輸入 $MODEL_NAME
+
+
+
+
+ 檔案大小
+
+
+
+
+ 所需的記憶體
+
+
+
+
+ %1 GB
+
+
+
+
+
+ ?
+
+
+
+
+ 參數
+
+
+
+
+ 量化
+
+
+
+
+ 類型
+
+
+
+ AddHFModelView
+
+
+
+
+
+
+
+
+ 透過關鍵字搜尋探索並下載模型......
+
+
+
+
+ 用於探索與過濾可下載模型的文字字段
+
+
+
+
+ 搜尋 · %1
+
+
+
+
+ 探索與過濾模型
+
+
+
+
+ 觸發探索與過濾模型
+
+
+
+
+ 預設
+
+
+
+
+ 讚
+
+
+
+
+ 下載次數
+
+
+
+
+ 最新
+
+
+
+
+ 排序依據:%1
+
+
+
+
+ 升序
+
+
+
+
+ 降序
+
+
+
+
+ 排序順序:%1
+
+
+
+
+ 無
+
+
+
+
+ 上限:%1
+
+
+
+
+ 模型檔案
+
+
+
+
+ 即將下載的模型檔案
+
+
+
+
+ 描述
+
+
+
+
+ 檔案描述
+
+
+
+
+ 取消
+
+
+
+
+ 恢復
+
+
+
+
+ 下載
+
+
+
+
+ 停止/重啟/開始下載
+
+
+
+
+ 移除
+
+
+
+
+ 從檔案系統移除模型
+
+
+
+
+
+ 安裝
+
+
+
+
+ 安裝線上模型
+
+
+
+
+ <strong><font size="1"><a href="#error">錯誤</a></strong></font>
+
+
+
+
+ 解釋下載時發生的錯誤
+
+
+
+
+ <strong><font size="2">警告:不推薦在您的硬體上運作。模型需要比較多的記憶體(%1 GB),但您的系統記憶體空間不足(%2)。</strong></font>
+
+
+
+
+ 錯誤,不相容的硬體
+
+
+
+
+ 下載進度條
+
+
+
+
+ 顯示下載進度
+
+
+
+
+ 下載速度
+
+
+
+
+ 下載速度每秒 bytes/kilobytes/megabytes
+
+
+
+
+ 計算中......
+
+
+
+
+
+
+
+ 是否正在計算檔案雜湊
+
+
+
+
+ 忙線指示器
+
+
+
+
+ 計算檔案雜湊值時顯示
+
+
+
+
+ 錯誤:$API_KEY 未填寫。
+
+
+
+
+ 請輸入 $API_KEY
+
+
+
+
+ 錯誤:$BASE_URL 未填寫。
+
+
+
+
+ 請輸入 $BASE_URL
+
+
+
+
+ 錯誤:$MODEL_NAME 未填寫。
+
+
+
+
+ 請輸入 $MODEL_NAME
+
+
+
+
+ 檔案大小
+
+
+
+
+ 量化
+
+
+
+
+ 類型
+
+
AddModelView
@@ -72,281 +533,231 @@
探索模型
-
+
+
+ GPT4All
+
+
+
+
+
+
+
- 透過關鍵字搜尋探索並下載模型......
+ 透過關鍵字搜尋探索並下載模型......
-
- 用於探索與過濾可下載模型的文字字段
+ 用於探索與過濾可下載模型的文字字段
-
- 搜尋 · %1
+ 搜尋 · %1
-
- 探索與過濾模型
+ 探索與過濾模型
-
- 觸發探索與過濾模型
+ 觸發探索與過濾模型
-
- 預設
+ 預設
-
- 讚
+ 讚
-
- 下載次數
+ 下載次數
-
- 最新
+ 最新
-
- 排序依據:%1
+ 排序依據:%1
-
- 升序
+ 升序
-
- 降序
+ 降序
-
- 排序順序:%1
+ 排序順序:%1
-
- 無
+ 無
-
- 上限:%1
+ 上限:%1
-
- 網路錯誤:無法取得 %1
+ 網路錯誤:無法取得 %1
-
- <strong><font size="1"><a href="#error">錯誤</a></strong></font>
+ <strong><font size="1"><a href="#error">錯誤</a></strong></font>
-
- <strong><font size="2">警告:不推薦在您的硬體上運作。模型需要比較多的記憶體(%1 GB),但您的系統記憶體空間不足(%2)。</strong></font>
+ <strong><font size="2">警告:不推薦在您的硬體上運作。模型需要比較多的記憶體(%1 GB),但您的系統記憶體空間不足(%2)。</strong></font>
-
- %1 GB
+ %1 GB
-
-
- ?
+ ?
-
-
參考自 https://terms.naer.edu.tw
- 忙線指示器
+ 忙線指示器
-
- 當模型請求正在進行時顯示
+ 當模型請求正在進行時顯示
-
- 模型檔案
+ 模型檔案
-
- 即將下載的模型檔案
+ 即將下載的模型檔案
-
- 描述
+ 描述
-
- 檔案描述
+ 檔案描述
-
- 取消
+ 取消
-
- 恢復
+ 恢復
-
- 下載
+ 下載
-
- 停止/重啟/開始下載
+ 停止/重啟/開始下載
-
- 移除
+ 移除
-
- 從檔案系統移除模型
+ 從檔案系統移除模型
-
-
- 安裝
+ 安裝
-
- 安裝線上模型
+ 安裝線上模型
-
- 解釋下載時發生的錯誤
+ 解釋下載時發生的錯誤
-
- 錯誤,不相容的硬體
+ 錯誤,不相容的硬體
-
- 下載進度條
+ 下載進度條
-
- 顯示下載進度
+ 顯示下載進度
-
- 下載速度
+ 下載速度
-
- 下載速度每秒 bytes/kilobytes/megabytes
+ 下載速度每秒 bytes/kilobytes/megabytes
-
- 計算中......
+ 計算中......
-
-
-
-
- 是否正在計算檔案雜湊
+ 是否正在計算檔案雜湊
-
- 計算檔案雜湊值時顯示
+ 計算檔案雜湊值時顯示
-
- 錯誤:$API_KEY 未填寫。
+ 錯誤:$API_KEY 未填寫。
-
- 請輸入 $API_KEY
+ 請輸入 $API_KEY
-
- 錯誤:$BASE_URL 未填寫。
+ 錯誤:$BASE_URL 未填寫。
-
- 請輸入 $BASE_URL
+ 請輸入 $BASE_URL
-
- 錯誤:$MODEL_NAME 未填寫。
+ 錯誤:$MODEL_NAME 未填寫。
-
- 請輸入 $MODEL_NAME
+ 請輸入 $MODEL_NAME
-
- 檔案大小
+ 檔案大小
-
- 所需的記憶體
+ 所需的記憶體
-
- 參數
+ 參數
-
- 量化
+ 量化
-
- 類型
+ 類型
@@ -1686,78 +2097,78 @@ model to get started
ModelList
-
-
+
+
無法開啟“%1”:%2
-
+
無法建立“%1”:%2
-
+
%1(%2)
-
+
<strong>OpenAI API 相容模型</strong><br><ul><li>API 金鑰:%1</li><li>基底 URL:%2</li><li>模型名稱:%3</li></ul>
-
+
<ul><li>需要個人的 OpenAI API 金鑰。</li><li>警告:這將會傳送您的交談紀錄到 OpenAI</li><li>您的 API 金鑰將被儲存在硬碟上</li><li>它只被用於與 OpenAI 進行通訊</li><li>您可以在<a href="https://platform.openai.com/account/api-keys">此處</a>申請一個 API 金鑰。</li>
-
+
<strong>OpenAI 的 ChatGPT 模型 GPT-3.5 Turbo</strong><br> %1
-
+
<br><br><i>* 即使您已向 OpenAI 付費購買了 ChatGPT 的 GPT-4 模型使用權,但這也不能保證您能擁有 API 金鑰的使用權限。請聯繫 OpenAI 以查閱更多資訊。
-
+
<strong>OpenAI 的 ChatGPT 模型 GPT-4</strong><br> %1 %2
-
+
<ul><li>需要個人的 Mistral API 金鑰。</li><li>警告:這將會傳送您的交談紀錄到 Mistral!</li><li>您的 API 金鑰將被儲存在硬碟上</li><li>它只被用於與 Mistral 進行通訊</li><li>您可以在<a href="https://console.mistral.ai/user/api-keys">此處</a>申請一個 API 金鑰。</li>
-
+
<strong>Mistral 迷你模型</strong><br> %1
-
+
<strong>Mistral 小型模型</strong><br> %1
-
+
<strong>Mistral 中型模型</strong><br> %1
-
+
<ul><li>需要個人的 API 金鑰和 API 的基底 URL(Base URL)。</li><li>警告:這將會傳送您的交談紀錄到您所指定的 OpenAI API 相容伺服器</li><li>您的 API 金鑰將被儲存在硬碟上</li><li>它只被用於與其 OpenAI API 相容伺服器進行通訊</li>
-
+
<strong>連線到 OpenAI API 相容伺服器</strong><br> %1
-
+
<strong>模型作者:%1</strong><br><ul><li>發佈日期:%2<li>累積讚數:%3 個讚<li>下載次數:%4 次<li>更多資訊請查閱<a href="https://huggingface.co/%5">此處</a>。</ul>
@@ -2812,12 +3223,12 @@ Nomic AI 將保留附加在您的資料上的所有署名訊息,並且您將
伺服器模式已啟用
-
+
已安裝的模型
-
+
已安裝的模型視圖