2023-04-23 06:58:07 -04:00
import QtCore
import QtQuick
import QtQuick . Controls
2023-04-23 23:56:33 -04:00
import QtQuick . Controls . Basic
2023-04-25 10:57:40 -04:00
import QtQuick . Dialogs
2023-04-23 06:58:07 -04:00
import QtQuick . Layouts
import download
import network
import llm
Dialog {
id: settingsDialog
modal: true
opacity: 0.9
2023-05-22 22:13:42 -04:00
padding: 20
bottomPadding: 30
2023-04-23 06:58:07 -04:00
background: Rectangle {
anchors.fill: parent
2023-04-23 09:42:35 -04:00
color: theme . backgroundDarkest
2023-04-23 06:58:07 -04:00
border.width: 1
2023-04-23 09:42:35 -04:00
border.color: theme . dialogBorder
2023-04-23 06:58:07 -04:00
radius: 10
}
2023-05-02 20:31:17 -04:00
onOpened: {
Network . sendSettingsDialog ( ) ;
}
2023-05-09 17:10:47 -04:00
property var currentChat: LLM . chatListModel . currentChat
2023-04-23 09:42:35 -04:00
Theme {
id: theme
}
2023-04-23 06:58:07 -04:00
property real defaultTemperature: 0.28
property real defaultTopP: 0.95
property int defaultTopK: 40
property int defaultMaxLength: 4096
property int defaultPromptBatchSize: 9
2023-04-25 10:57:40 -04:00
property real defaultRepeatPenalty: 1.10
property int defaultRepeatPenaltyTokens: 64
2023-04-24 15:24:55 -04:00
property int defaultThreadCount: 0
2023-05-05 12:30:11 -04:00
property bool defaultSaveChats: false
2023-05-15 18:36:41 -04:00
property bool defaultSaveChatGPTChats: true
2023-05-11 16:46:25 -04:00
property bool defaultServerChat: false
2023-05-03 12:19:14 -04:00
property string defaultPromptTemplate: " # # # Human:
2023-04-23 06:58:07 -04:00
% 1
2023-05-03 12:19:14 -04:00
# # # Assistant: \ n "
2023-04-25 10:57:40 -04:00
property string defaultModelPath: Download . defaultLocalModelsPath ( )
2023-05-09 17:10:47 -04:00
property string defaultUserDefaultModel: "Application default"
2023-04-23 06:58:07 -04:00
property alias temperature: settings . temperature
property alias topP: settings . topP
property alias topK: settings . topK
property alias maxLength: settings . maxLength
property alias promptBatchSize: settings . promptBatchSize
property alias promptTemplate: settings . promptTemplate
2023-04-25 10:57:40 -04:00
property alias repeatPenalty: settings . repeatPenalty
property alias repeatPenaltyTokens: settings . repeatPenaltyTokens
2023-04-24 15:24:55 -04:00
property alias threadCount: settings . threadCount
2023-05-05 12:30:11 -04:00
property alias saveChats: settings . saveChats
2023-05-15 18:36:41 -04:00
property alias saveChatGPTChats: settings . saveChatGPTChats
2023-05-11 16:46:25 -04:00
property alias serverChat: settings . serverChat
2023-04-25 10:57:40 -04:00
property alias modelPath: settings . modelPath
2023-05-09 17:10:47 -04:00
property alias userDefaultModel: settings . userDefaultModel
2023-04-23 06:58:07 -04:00
Settings {
id: settings
property real temperature: settingsDialog . defaultTemperature
property real topP: settingsDialog . defaultTopP
property int topK: settingsDialog . defaultTopK
property int maxLength: settingsDialog . defaultMaxLength
property int promptBatchSize: settingsDialog . defaultPromptBatchSize
2023-04-24 15:24:55 -04:00
property int threadCount: settingsDialog . defaultThreadCount
2023-05-05 12:30:11 -04:00
property bool saveChats: settingsDialog . defaultSaveChats
2023-05-15 18:36:41 -04:00
property bool saveChatGPTChats: settingsDialog . defaultSaveChatGPTChats
2023-05-11 16:46:25 -04:00
property bool serverChat: settingsDialog . defaultServerChat
2023-04-25 10:57:40 -04:00
property real repeatPenalty: settingsDialog . defaultRepeatPenalty
property int repeatPenaltyTokens: settingsDialog . defaultRepeatPenaltyTokens
2023-04-23 06:58:07 -04:00
property string promptTemplate: settingsDialog . defaultPromptTemplate
2023-04-25 10:57:40 -04:00
property string modelPath: settingsDialog . defaultModelPath
2023-05-09 17:10:47 -04:00
property string userDefaultModel: settingsDialog . defaultUserDefaultModel
2023-04-23 06:58:07 -04:00
}
2023-04-25 10:57:40 -04:00
function restoreGenerationDefaults ( ) {
2023-04-25 13:00:28 -04:00
settings . temperature = defaultTemperature
settings . topP = defaultTopP
settings . topK = defaultTopK
settings . maxLength = defaultMaxLength
settings . promptBatchSize = defaultPromptBatchSize
settings . promptTemplate = defaultPromptTemplate
2023-05-08 12:20:02 -04:00
settings . repeatPenalty = defaultRepeatPenalty
settings . repeatPenaltyTokens = defaultRepeatPenaltyTokens
2023-04-23 06:58:07 -04:00
settings . sync ( )
2023-04-25 10:57:40 -04:00
}
function restoreApplicationDefaults ( ) {
2023-04-25 13:00:28 -04:00
settings . modelPath = settingsDialog . defaultModelPath
2023-04-25 10:57:40 -04:00
settings . threadCount = defaultThreadCount
2023-05-05 12:30:11 -04:00
settings . saveChats = defaultSaveChats
2023-05-15 18:36:41 -04:00
settings . saveChatGPTChats = defaultSaveChatGPTChats
2023-05-11 16:46:25 -04:00
settings . serverChat = defaultServerChat
2023-05-09 17:10:47 -04:00
settings . userDefaultModel = defaultUserDefaultModel
2023-04-25 13:00:28 -04:00
Download . downloadLocalModelsPath = settings . modelPath
LLM . threadCount = settings . threadCount
2023-05-11 16:46:25 -04:00
LLM . serverEnabled = settings . serverChat
2023-05-05 12:30:11 -04:00
LLM . chatListModel . shouldSaveChats = settings . saveChats
2023-05-15 18:36:41 -04:00
LLM . chatListModel . shouldSaveChatGPTChats = settings . saveChatGPTChats
2023-04-25 10:57:40 -04:00
settings . sync ( )
2023-04-24 15:24:55 -04:00
}
Component.onCompleted: {
2023-04-25 13:00:28 -04:00
LLM . threadCount = settings . threadCount
2023-05-11 16:46:25 -04:00
LLM . serverEnabled = settings . serverChat
2023-05-05 12:30:11 -04:00
LLM . chatListModel . shouldSaveChats = settings . saveChats
2023-05-15 18:36:41 -04:00
LLM . chatListModel . shouldSaveChatGPTChats = settings . saveChatGPTChats
2023-04-25 13:00:28 -04:00
Download . downloadLocalModelsPath = settings . modelPath
2023-04-23 06:58:07 -04:00
}
2023-04-28 10:48:48 -04:00
Connections {
target: settingsDialog
function onClosed ( ) {
settings . sync ( )
}
2023-04-23 06:58:07 -04:00
}
Item {
Accessible.role: Accessible . Dialog
Accessible.name: qsTr ( "Settings dialog" )
2023-04-25 10:57:40 -04:00
Accessible.description: qsTr ( "Dialog containing various application settings" )
2023-04-23 06:58:07 -04:00
}
2023-04-25 10:57:40 -04:00
TabBar {
id: settingsTabBar
2023-05-23 14:50:10 -04:00
width: parent . width / 1.25
2023-05-22 22:13:42 -04:00
z: 200
2023-04-25 13:00:28 -04:00
2023-04-25 10:57:40 -04:00
TabButton {
2023-04-25 13:00:28 -04:00
id: genSettingsButton
contentItem: IconLabel {
color: theme . textColor
font.bold: genSettingsButton . checked
text: qsTr ( "Generation" )
}
background: Rectangle {
color: genSettingsButton . checked ? theme.backgroundDarkest : theme . backgroundLight
2023-05-21 15:28:23 -04:00
Rectangle {
anchors.top: parent . top
anchors.left: parent . left
anchors.right: parent . right
2023-05-22 22:13:42 -04:00
height: genSettingsButton . checked
color: theme . tabBorder
}
Rectangle {
anchors.bottom: parent . bottom
anchors.left: parent . left
anchors.right: parent . right
height: ! genSettingsButton . checked
2023-05-21 15:28:23 -04:00
color: theme . tabBorder
}
Rectangle {
anchors.top: parent . top
anchors.bottom: parent . bottom
anchors.left: parent . left
2023-05-22 22:13:42 -04:00
width: genSettingsButton . checked
2023-05-21 15:28:23 -04:00
color: theme . tabBorder
}
Rectangle {
anchors.top: parent . top
anchors.bottom: parent . bottom
anchors.right: parent . right
2023-05-22 22:13:42 -04:00
width: genSettingsButton . checked
2023-05-21 15:28:23 -04:00
color: theme . tabBorder
}
2023-04-25 13:00:28 -04:00
}
2023-04-25 10:57:40 -04:00
Accessible.role: Accessible . Button
Accessible.name: qsTr ( "Generation settings" )
Accessible.description: qsTr ( "Settings related to how the model generates text" )
}
2023-04-23 06:58:07 -04:00
2023-04-25 10:57:40 -04:00
TabButton {
2023-04-25 13:00:28 -04:00
id: appSettingsButton
contentItem: IconLabel {
color: theme . textColor
font.bold: appSettingsButton . checked
text: qsTr ( "Application" )
}
background: Rectangle {
color: appSettingsButton . checked ? theme.backgroundDarkest : theme . backgroundLight
2023-05-21 15:28:23 -04:00
Rectangle {
anchors.top: parent . top
anchors.left: parent . left
anchors.right: parent . right
2023-05-22 22:13:42 -04:00
height: appSettingsButton . checked
color: theme . tabBorder
}
Rectangle {
anchors.bottom: parent . bottom
anchors.left: parent . left
anchors.right: parent . right
height: ! appSettingsButton . checked
2023-05-21 15:28:23 -04:00
color: theme . tabBorder
}
Rectangle {
anchors.top: parent . top
anchors.bottom: parent . bottom
anchors.left: parent . left
2023-05-22 22:13:42 -04:00
width: appSettingsButton . checked
2023-05-21 15:28:23 -04:00
color: theme . tabBorder
}
Rectangle {
anchors.top: parent . top
anchors.bottom: parent . bottom
anchors.right: parent . right
2023-05-22 22:13:42 -04:00
width: appSettingsButton . checked
2023-05-21 15:28:23 -04:00
color: theme . tabBorder
}
2023-04-25 13:00:28 -04:00
}
2023-04-25 10:57:40 -04:00
Accessible.role: Accessible . Button
Accessible.name: qsTr ( "Application settings" )
Accessible.description: qsTr ( "Settings related to general behavior of the application" )
2023-04-23 06:58:07 -04:00
}
2023-05-21 15:28:41 -04:00
TabButton {
id: localDocsButton
contentItem: IconLabel {
color: theme . textColor
font.bold: localDocsButton . checked
font.pixelSize: localDocsButton . checked ? theme.fontSizeLarger : theme . fontSizeLarge
text: qsTr ( "LocalDocs" )
}
background: Rectangle {
color: localDocsButton . checked ? theme.backgroundDarkest : theme . backgroundLight
Rectangle {
anchors.top: parent . top
anchors.left: parent . left
anchors.right: parent . right
height: 1 ? localDocsButton.checked : 0
color: theme . tabBorder
}
Rectangle {
anchors.top: parent . top
anchors.bottom: parent . bottom
anchors.left: parent . left
width: 1 ? localDocsButton.checked : 0
color: theme . tabBorder
}
Rectangle {
anchors.top: parent . top
anchors.bottom: parent . bottom
anchors.right: parent . right
width: 1 ? localDocsButton.checked : 0
color: theme . tabBorder
}
}
Accessible.role: Accessible . Button
Accessible.name: qsTr ( "LocalDocs settings" )
Accessible.description: qsTr ( "Settings related to localdocs plugin" )
}
2023-04-25 10:57:40 -04:00
}
StackLayout {
anchors.top: settingsTabBar . bottom
2023-05-22 22:13:42 -04:00
anchors.topMargin: - 1
2023-04-25 10:57:40 -04:00
width: parent . width
2023-04-25 13:00:28 -04:00
height: availableHeight
2023-04-25 10:57:40 -04:00
currentIndex: settingsTabBar . currentIndex
2023-04-25 13:00:28 -04:00
2023-04-25 10:57:40 -04:00
Item {
id: generationSettingsTab
2023-04-25 13:00:28 -04:00
ScrollView {
background: Rectangle {
color: 'transparent'
border.color: theme . tabBorder
border.width: 1
radius: 2
2023-04-23 06:58:07 -04:00
}
2023-04-25 16:20:19 -04:00
padding: 10
2023-04-25 13:00:28 -04:00
width: parent . width
height: parent . height - 30
contentWidth: availableWidth - 20
contentHeight: generationSettingsTabInner . implicitHeight + 40
ScrollBar.vertical.policy: ScrollBar . AlwaysOn
GridLayout {
id: generationSettingsTabInner
anchors.margins: 10
columns: 2
rowSpacing: 10
columnSpacing: 10
anchors.fill: parent
Label {
id: tempLabel
text: qsTr ( "Temperature:" )
color: theme . textColor
Layout.row: 0
Layout.column: 0
2023-04-25 10:57:40 -04:00
}
2023-05-22 17:58:37 -04:00
MyTextField {
2023-04-25 13:00:28 -04:00
text: settings . temperature . toString ( )
color: theme . textColor
2023-05-23 14:50:10 -04:00
ToolTip.text: qsTr ( "Temperature increases the chances of choosing less likely tokens.\nNOTE: Higher temperature gives more creative but less predictable outputs." )
2023-04-25 13:00:28 -04:00
ToolTip.visible: hovered
Layout.row: 0
Layout.column: 1
2023-04-28 11:36:24 -04:00
validator: DoubleValidator {
locale: "C"
}
2023-04-25 13:00:28 -04:00
onEditingFinished: {
var val = parseFloat ( text )
if ( ! isNaN ( val ) ) {
settings . temperature = val
settings . sync ( )
focus = false
} else {
text = settings . temperature . toString ( )
}
2023-04-25 10:57:40 -04:00
}
2023-04-25 13:00:28 -04:00
Accessible.role: Accessible . EditableText
Accessible.name: tempLabel . text
Accessible.description: ToolTip . text
2023-04-25 10:57:40 -04:00
}
2023-04-25 13:00:28 -04:00
Label {
id: topPLabel
text: qsTr ( "Top P:" )
color: theme . textColor
Layout.row: 1
Layout.column: 0
2023-04-25 10:57:40 -04:00
}
2023-05-22 17:58:37 -04:00
MyTextField {
2023-04-25 13:00:28 -04:00
text: settings . topP . toString ( )
color: theme . textColor
2023-05-23 14:50:10 -04:00
ToolTip.text: qsTr ( "Only the most likely tokens up to a total probability of top_p can be chosen.\nNOTE: Prevents choosing highly unlikely tokens, aka Nucleus Sampling" )
2023-04-25 13:00:28 -04:00
ToolTip.visible: hovered
Layout.row: 1
Layout.column: 1
2023-04-28 11:36:24 -04:00
validator: DoubleValidator {
locale: "C"
}
2023-04-25 13:00:28 -04:00
onEditingFinished: {
var val = parseFloat ( text )
if ( ! isNaN ( val ) ) {
settings . topP = val
settings . sync ( )
focus = false
} else {
text = settings . topP . toString ( )
}
2023-04-25 10:57:40 -04:00
}
2023-04-25 13:00:28 -04:00
Accessible.role: Accessible . EditableText
Accessible.name: topPLabel . text
Accessible.description: ToolTip . text
}
Label {
id: topKLabel
text: qsTr ( "Top K:" )
color: theme . textColor
Layout.row: 2
Layout.column: 0
}
2023-05-22 17:58:37 -04:00
MyTextField {
2023-04-25 13:00:28 -04:00
text: settings . topK . toString ( )
color: theme . textColor
ToolTip.text: qsTr ( "Only the top K most likely tokens will be chosen from" )
ToolTip.visible: hovered
Layout.row: 2
Layout.column: 1
validator: IntValidator {
bottom: 1
}
onEditingFinished: {
var val = parseInt ( text )
if ( ! isNaN ( val ) ) {
settings . topK = val
settings . sync ( )
focus = false
} else {
text = settings . topK . toString ( )
}
}
Accessible.role: Accessible . EditableText
Accessible.name: topKLabel . text
Accessible.description: ToolTip . text
}
Label {
id: maxLengthLabel
text: qsTr ( "Max Length:" )
color: theme . textColor
Layout.row: 3
Layout.column: 0
}
2023-05-22 17:58:37 -04:00
MyTextField {
2023-04-25 13:00:28 -04:00
text: settings . maxLength . toString ( )
color: theme . textColor
ToolTip.text: qsTr ( "Maximum length of response in tokens" )
ToolTip.visible: hovered
Layout.row: 3
Layout.column: 1
validator: IntValidator {
bottom: 1
}
onEditingFinished: {
var val = parseInt ( text )
if ( ! isNaN ( val ) ) {
settings . maxLength = val
settings . sync ( )
focus = false
} else {
text = settings . maxLength . toString ( )
}
}
Accessible.role: Accessible . EditableText
Accessible.name: maxLengthLabel . text
Accessible.description: ToolTip . text
2023-04-25 10:57:40 -04:00
}
2023-04-23 06:58:07 -04:00
2023-04-25 13:00:28 -04:00
Label {
id: batchSizeLabel
text: qsTr ( "Prompt Batch Size:" )
color: theme . textColor
Layout.row: 4
Layout.column: 0
}
2023-05-22 17:58:37 -04:00
MyTextField {
2023-04-25 13:00:28 -04:00
text: settings . promptBatchSize . toString ( )
color: theme . textColor
2023-05-23 14:50:10 -04:00
ToolTip.text: qsTr ( "Amount of prompt tokens to process at once.\nNOTE: Higher values can speed up reading prompts but will use more RAM" )
2023-04-25 13:00:28 -04:00
ToolTip.visible: hovered
Layout.row: 4
Layout.column: 1
validator: IntValidator {
bottom: 1
}
onEditingFinished: {
var val = parseInt ( text )
if ( ! isNaN ( val ) ) {
settings . promptBatchSize = val
settings . sync ( )
focus = false
} else {
text = settings . promptBatchSize . toString ( )
}
}
Accessible.role: Accessible . EditableText
Accessible.name: batchSizeLabel . text
Accessible.description: ToolTip . text
}
Label {
id: repeatPenaltyLabel
text: qsTr ( "Repeat Penalty:" )
color: theme . textColor
Layout.row: 5
Layout.column: 0
}
2023-05-22 17:58:37 -04:00
MyTextField {
2023-04-25 13:00:28 -04:00
text: settings . repeatPenalty . toString ( )
color: theme . textColor
2023-04-25 16:33:01 -04:00
ToolTip.text: qsTr ( "Amount to penalize repetitiveness of the output" )
2023-04-25 13:00:28 -04:00
ToolTip.visible: hovered
Layout.row: 5
Layout.column: 1
2023-04-28 11:36:24 -04:00
validator: DoubleValidator {
locale: "C"
}
2023-04-25 13:00:28 -04:00
onEditingFinished: {
var val = parseFloat ( text )
if ( ! isNaN ( val ) ) {
settings . repeatPenalty = val
settings . sync ( )
focus = false
} else {
text = settings . repeatPenalty . toString ( )
}
}
2023-04-25 10:57:40 -04:00
Accessible.role: Accessible . EditableText
2023-04-25 13:00:28 -04:00
Accessible.name: repeatPenaltyLabel . text
Accessible.description: ToolTip . text
}
Label {
id: repeatPenaltyTokensLabel
text: qsTr ( "Repeat Penalty Tokens:" )
color: theme . textColor
Layout.row: 6
Layout.column: 0
}
2023-05-22 17:58:37 -04:00
MyTextField {
2023-04-25 13:00:28 -04:00
text: settings . repeatPenaltyTokens . toString ( )
color: theme . textColor
ToolTip.text: qsTr ( "How far back in output to apply repeat penalty" )
ToolTip.visible: hovered
Layout.row: 6
Layout.column: 1
validator: IntValidator {
bottom: 1
}
onEditingFinished: {
var val = parseInt ( text )
if ( ! isNaN ( val ) ) {
settings . repeatPenaltyTokens = val
settings . sync ( )
focus = false
} else {
text = settings . repeatPenaltyTokens . toString ( )
}
}
Accessible.role: Accessible . EditableText
Accessible.name: repeatPenaltyTokensLabel . text
Accessible.description: ToolTip . text
}
2023-04-25 10:57:40 -04:00
2023-04-25 13:00:28 -04:00
Label {
id: promptTemplateLabel
text: qsTr ( "Prompt Template:" )
color: theme . textColor
Layout.row: 7
Layout.column: 0
}
Rectangle {
Layout.row: 7
Layout.column: 1
Layout.fillWidth: true
height: 200
color: "transparent"
clip: true
Label {
id: promptTemplateLabelHelp
visible: settings . promptTemplate . indexOf (
"%1" ) === - 1
font.bold: true
color: theme . textErrorColor
text: qsTr ( "Prompt template must contain %1 to be replaced with the user's input." )
anchors.fill: templateScrollView
z: 200
padding: 10
wrapMode: TextArea . Wrap
Accessible.role: Accessible . EditableText
Accessible.name: text
}
ScrollView {
id: templateScrollView
anchors.fill: parent
TextArea {
text: settings . promptTemplate
color: theme . textColor
background: Rectangle {
implicitWidth: 150
color: theme . backgroundLighter
radius: 10
}
padding: 10
wrapMode: TextArea . Wrap
onTextChanged: {
settings . promptTemplate = text
settings . sync ( )
}
bottomPadding: 10
Accessible.role: Accessible . EditableText
Accessible.name: promptTemplateLabel . text
Accessible.description: promptTemplateLabelHelp . text
2023-05-23 14:50:10 -04:00
ToolTip.text: qsTr ( "The prompt template partially determines how models will respond to prompts.\nNOTE: A longer, detailed template can lead to higher quality answers, but can also slow down generation." )
ToolTip.visible: hovered
2023-04-25 13:00:28 -04:00
}
}
}
2023-05-22 09:01:46 -04:00
MyButton {
2023-04-25 13:00:28 -04:00
Layout.row: 8
Layout.column: 1
Layout.fillWidth: true
2023-05-22 09:01:46 -04:00
text: qsTr ( "Restore Defaults" )
Accessible.description: qsTr ( "Restores the settings dialog to a default state" )
2023-04-25 13:00:28 -04:00
onClicked: {
settingsDialog . restoreGenerationDefaults ( )
}
}
}
2023-04-25 10:57:40 -04:00
}
}
Item {
2023-04-25 13:00:28 -04:00
id: applicationSettingsTab
ScrollView {
background: Rectangle {
color: 'transparent'
border.color: theme . tabBorder
border.width: 1
radius: 2
}
2023-04-25 16:20:19 -04:00
padding: 10
2023-04-25 10:57:40 -04:00
width: parent . width
2023-04-25 13:00:28 -04:00
height: parent . height - 30
contentWidth: availableWidth - 20
ScrollBar.vertical.policy: ScrollBar . AlwaysOn
GridLayout {
anchors.margins: 10
columns: 3
rowSpacing: 10
columnSpacing: 10
anchors.fill: parent
2023-05-09 17:10:47 -04:00
Label {
id: defaultModelLabel
text: qsTr ( "Default model:" )
color: theme . textColor
Layout.row: 1
Layout.column: 0
}
2023-05-22 09:01:46 -04:00
MyComboBox {
2023-05-09 17:10:47 -04:00
id: comboBox
Layout.row: 1
Layout.column: 1
Layout.minimumWidth: 350
model: modelList
Accessible.role: Accessible . ComboBox
Accessible.name: qsTr ( "ComboBox for displaying/picking the default model" )
Accessible.description: qsTr ( "Use this for picking the default model to use; the first item is the current default model" )
function updateModel ( newModelList ) {
var newArray = Array . from ( newModelList ) ;
newArray . unshift ( 'Application default' ) ;
comboBox . model = newArray ;
settings . sync ( ) ;
comboBox . currentIndex = comboBox . indexOfValue ( settingsDialog . userDefaultModel ) ;
}
Component.onCompleted: {
comboBox . updateModel ( currentChat . modelList )
}
Connections {
target: settings
function onUserDefaultModelChanged ( ) {
comboBox . updateModel ( currentChat . modelList )
}
}
Connections {
target: currentChat
function onModelListChanged ( ) {
comboBox . updateModel ( currentChat . modelList )
}
}
onActivated: {
settingsDialog . userDefaultModel = comboBox . currentText
settings . sync ( )
}
}
2023-04-25 13:00:28 -04:00
FolderDialog {
id: modelPathDialog
title: "Please choose a directory"
2023-05-21 16:24:37 -04:00
currentFolder: "file://" + Download . downloadLocalModelsPath
2023-04-25 13:00:28 -04:00
onAccepted: {
Download . downloadLocalModelsPath = selectedFolder
settings . modelPath = Download . downloadLocalModelsPath
settings . sync ( )
}
2023-04-25 10:57:40 -04:00
}
2023-04-25 13:00:28 -04:00
Label {
id: modelPathLabel
2023-04-27 16:27:53 -04:00
text: qsTr ( "Download path:" )
2023-04-25 13:00:28 -04:00
color: theme . textColor
2023-05-09 17:10:47 -04:00
Layout.row: 2
2023-04-25 13:00:28 -04:00
Layout.column: 0
2023-04-25 10:57:40 -04:00
}
2023-04-25 13:00:28 -04:00
TextField {
id: modelPathDisplayLabel
2023-04-27 17:15:46 -04:00
text: Download . downloadLocalModelsPath
2023-04-25 13:00:28 -04:00
readOnly: true
color: theme . textColor
implicitWidth: 300
2023-05-09 17:10:47 -04:00
padding: 10
Layout.row: 2
2023-04-25 13:00:28 -04:00
Layout.column: 1
2023-04-27 16:27:53 -04:00
Layout.fillWidth: true
2023-04-25 13:00:28 -04:00
ToolTip.text: qsTr ( "Path where model files will be downloaded to" )
ToolTip.visible: hovered
Accessible.role: Accessible . ToolTip
2023-04-27 16:27:53 -04:00
Accessible.name: modelPathDisplayLabel . text
2023-04-25 13:00:28 -04:00
Accessible.description: ToolTip . text
2023-04-28 22:07:37 -04:00
background: Rectangle {
color: theme . backgroundLighter
radius: 10
}
2023-04-25 13:00:28 -04:00
}
2023-05-22 09:01:46 -04:00
MyButton {
2023-05-09 17:10:47 -04:00
Layout.row: 2
2023-04-25 13:00:28 -04:00
Layout.column: 2
text: qsTr ( "Browse" )
2023-05-22 09:01:46 -04:00
Accessible.description: qsTr ( "Opens a folder picker dialog to choose where to save model files" )
2023-04-25 13:00:28 -04:00
onClicked: modelPathDialog . open ( )
2023-04-25 10:57:40 -04:00
}
2023-04-25 13:00:28 -04:00
Label {
id: nThreadsLabel
text: qsTr ( "CPU Threads:" )
2023-04-25 10:57:40 -04:00
color: theme . textColor
2023-05-09 17:10:47 -04:00
Layout.row: 3
2023-04-25 13:00:28 -04:00
Layout.column: 0
2023-04-25 10:57:40 -04:00
}
2023-05-22 17:58:37 -04:00
MyTextField {
2023-04-25 13:00:28 -04:00
text: settingsDialog . threadCount . toString ( )
color: theme . textColor
ToolTip.text: qsTr ( "Amount of processing threads to use, a setting of 0 will use the lesser of 4 or your number of CPU threads" )
ToolTip.visible: hovered
2023-05-09 17:10:47 -04:00
Layout.row: 3
2023-04-25 13:00:28 -04:00
Layout.column: 1
validator: IntValidator {
bottom: 1
}
onEditingFinished: {
var val = parseInt ( text )
if ( ! isNaN ( val ) ) {
settingsDialog . threadCount = val
LLM . threadCount = val
settings . sync ( )
focus = false
} else {
text = settingsDialog . threadCount . toString ( )
}
}
Accessible.role: Accessible . EditableText
Accessible.name: nThreadsLabel . text
Accessible.description: ToolTip . text
2023-04-25 10:57:40 -04:00
}
2023-05-05 12:30:11 -04:00
Label {
id: saveChatsLabel
text: qsTr ( "Save chats to disk:" )
color: theme . textColor
2023-05-09 17:10:47 -04:00
Layout.row: 4
2023-05-05 12:30:11 -04:00
Layout.column: 0
}
2023-05-22 17:58:37 -04:00
MyCheckBox {
2023-05-05 12:30:11 -04:00
id: saveChatsBox
2023-05-09 17:10:47 -04:00
Layout.row: 4
2023-05-05 12:30:11 -04:00
Layout.column: 1
checked: settingsDialog . saveChats
onClicked: {
Network . sendSaveChatsToggled ( saveChatsBox . checked ) ;
settingsDialog . saveChats = saveChatsBox . checked
LLM . chatListModel . shouldSaveChats = saveChatsBox . checked
settings . sync ( )
}
ToolTip.text: qsTr ( "WARNING: Saving chats to disk can be ~2GB per chat" )
ToolTip.visible: hovered
}
2023-05-15 18:36:41 -04:00
Label {
id: saveChatGPTChatsLabel
text: qsTr ( "Save ChatGPT chats to disk:" )
color: theme . textColor
Layout.row: 5
Layout.column: 0
}
2023-05-22 17:58:37 -04:00
MyCheckBox {
2023-05-15 18:36:41 -04:00
id: saveChatGPTChatsBox
Layout.row: 5
Layout.column: 1
checked: settingsDialog . saveChatGPTChats
onClicked: {
settingsDialog . saveChatGPTChats = saveChatGPTChatsBox . checked
LLM . chatListModel . shouldSaveChatGPTChats = saveChatGPTChatsBox . checked
settings . sync ( )
}
}
2023-05-11 16:46:25 -04:00
Label {
id: serverChatLabel
text: qsTr ( "Enable web server:" )
color: theme . textColor
2023-05-15 18:36:41 -04:00
Layout.row: 6
2023-05-11 16:46:25 -04:00
Layout.column: 0
}
2023-05-22 17:58:37 -04:00
MyCheckBox {
2023-05-11 16:46:25 -04:00
id: serverChatBox
2023-05-15 18:36:41 -04:00
Layout.row: 6
2023-05-11 16:46:25 -04:00
Layout.column: 1
checked: settings . serverChat
onClicked: {
settingsDialog . serverChat = serverChatBox . checked
LLM . serverEnabled = serverChatBox . checked
settings . sync ( )
}
2023-05-13 19:33:19 -04:00
ToolTip.text: qsTr ( "WARNING: This enables the gui to act as a local web server for AI API requests and will increase your RAM usage as well" )
2023-05-11 16:46:25 -04:00
ToolTip.visible: hovered
}
2023-05-22 09:01:46 -04:00
MyButton {
2023-05-15 18:36:41 -04:00
Layout.row: 7
2023-04-25 13:00:28 -04:00
Layout.column: 1
Layout.fillWidth: true
2023-05-22 09:01:46 -04:00
text: qsTr ( "Restore Defaults" )
Accessible.description: qsTr ( "Restores the settings dialog to a default state" )
2023-04-25 13:00:28 -04:00
onClicked: {
settingsDialog . restoreApplicationDefaults ( )
}
2023-04-25 10:57:40 -04:00
}
}
}
}
2023-05-21 15:28:41 -04:00
Item {
id: localDocsTab
ScrollView {
background: Rectangle {
color: 'transparent'
border.color: theme . tabBorder
border.width: 1
radius: 2
}
padding: 10
width: parent . width
height: parent . height - 30
contentWidth: availableWidth - 20
ScrollBar.vertical.policy: ScrollBar . AlwaysOn
2023-05-22 09:03:06 -04:00
LocalDocs {
2023-05-21 15:28:41 -04:00
anchors.margins: 10
anchors.fill: parent
}
}
}
2023-04-23 06:58:07 -04:00
}
}