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-23 06:58:07 -04:00
import QtQuick . Layouts
import download
import network
import llm
Dialog {
id: settingsDialog
modal: true
height: 600
width: 600
opacity: 0.9
background: Rectangle {
anchors.fill: parent
anchors.margins: - 20
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-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-24 15:24:55 -04:00
property int defaultThreadCount: 0
2023-04-23 06:58:07 -04:00
property string defaultPromptTemplate: " The prompt below is a question to answer , a task to complete , or a conversation to respond to ; decide which and write an appropriate response .
# # # Prompt:
% 1
# # # Response: \ n "
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-24 15:24:55 -04:00
property alias threadCount: settings . threadCount
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-04-23 06:58:07 -04:00
property string promptTemplate: settingsDialog . defaultPromptTemplate
}
function restoreDefaults ( ) {
settings . temperature = defaultTemperature ;
settings . topP = defaultTopP ;
settings . topK = defaultTopK ;
settings . maxLength = defaultMaxLength ;
settings . promptBatchSize = defaultPromptBatchSize ;
settings . promptTemplate = defaultPromptTemplate ;
2023-04-24 15:24:55 -04:00
settings . threadCount = defaultThreadCount
2023-04-23 06:58:07 -04:00
settings . sync ( )
2023-04-24 15:24:55 -04:00
LLM . threadCount = settings . threadCount ;
}
Component.onCompleted: {
LLM . threadCount = settings . threadCount ;
2023-04-23 06:58:07 -04:00
}
Component.onDestruction: {
settings . sync ( )
}
Item {
Accessible.role: Accessible . Dialog
Accessible.name: qsTr ( "Settings dialog" )
Accessible.description: qsTr ( "Dialog containing various settings for model text generation" )
}
GridLayout {
columns: 2
rowSpacing: 2
columnSpacing: 10
anchors.fill: parent
Label {
id: tempLabel
text: qsTr ( "Temperature:" )
2023-04-23 09:42:35 -04:00
color: theme . textColor
2023-04-23 06:58:07 -04:00
Layout.row: 0
Layout.column: 0
}
TextField {
text: settings . temperature . toString ( )
2023-04-23 09:42:35 -04:00
color: theme . textColor
2023-04-23 07:48:06 -04:00
background: Rectangle {
implicitWidth: 150
2023-04-23 09:42:35 -04:00
color: theme . backgroundLighter
2023-04-23 07:48:06 -04:00
radius: 10
}
2023-04-23 09:42:35 -04:00
padding: 10
2023-04-23 06:58:07 -04:00
ToolTip.text: qsTr ( "Temperature increases the chances of choosing less likely tokens - higher temperature gives more creative but less predictable outputs" )
ToolTip.visible: hovered
Layout.row: 0
Layout.column: 1
validator: DoubleValidator { }
onAccepted: {
var val = parseFloat ( text )
if ( ! isNaN ( val ) ) {
settings . temperature = val
settings . sync ( )
focus = false
} else {
text = settings . temperature . toString ( )
}
}
Accessible.role: Accessible . EditableText
Accessible.name: tempLabel . text
Accessible.description: ToolTip . text
}
Label {
id: topPLabel
text: qsTr ( "Top P:" )
2023-04-23 09:42:35 -04:00
color: theme . textColor
2023-04-23 06:58:07 -04:00
Layout.row: 1
Layout.column: 0
}
TextField {
text: settings . topP . toString ( )
2023-04-23 09:42:35 -04:00
color: theme . textColor
2023-04-23 07:48:06 -04:00
background: Rectangle {
implicitWidth: 150
2023-04-23 09:42:35 -04:00
color: theme . backgroundLighter
2023-04-23 07:48:06 -04:00
radius: 10
}
2023-04-23 09:42:35 -04:00
padding: 10
2023-04-23 06:58:07 -04:00
ToolTip.text: qsTr ( "Only the most likely tokens up to a total probability of top_p can be chosen, prevents choosing highly unlikely tokens, aka Nucleus Sampling" )
ToolTip.visible: hovered
Layout.row: 1
Layout.column: 1
validator: DoubleValidator { }
onAccepted: {
var val = parseFloat ( text )
if ( ! isNaN ( val ) ) {
settings . topP = val
settings . sync ( )
focus = false
} else {
text = settings . topP . toString ( )
}
}
Accessible.role: Accessible . EditableText
Accessible.name: topPLabel . text
Accessible.description: ToolTip . text
}
Label {
id: topKLabel
text: qsTr ( "Top K:" )
2023-04-23 09:42:35 -04:00
color: theme . textColor
2023-04-23 06:58:07 -04:00
Layout.row: 2
Layout.column: 0
}
TextField {
text: settings . topK . toString ( )
2023-04-23 09:42:35 -04:00
color: theme . textColor
2023-04-23 07:48:06 -04:00
background: Rectangle {
implicitWidth: 150
2023-04-23 09:42:35 -04:00
color: theme . backgroundLighter
2023-04-23 07:48:06 -04:00
radius: 10
}
2023-04-23 09:42:35 -04:00
padding: 10
2023-04-23 06:58:07 -04:00
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 }
onAccepted: {
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:" )
2023-04-23 09:42:35 -04:00
color: theme . textColor
2023-04-23 06:58:07 -04:00
Layout.row: 3
Layout.column: 0
}
TextField {
text: settings . maxLength . toString ( )
2023-04-23 09:42:35 -04:00
color: theme . textColor
2023-04-23 07:48:06 -04:00
background: Rectangle {
implicitWidth: 150
2023-04-23 09:42:35 -04:00
color: theme . backgroundLighter
2023-04-23 07:48:06 -04:00
radius: 10
}
2023-04-23 09:42:35 -04:00
padding: 10
2023-04-23 06:58:07 -04:00
ToolTip.text: qsTr ( "Maximum length of response in tokens" )
ToolTip.visible: hovered
Layout.row: 3
Layout.column: 1
validator: IntValidator { bottom: 1 }
onAccepted: {
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
}
Label {
id: batchSizeLabel
text: qsTr ( "Prompt Batch Size:" )
2023-04-23 09:42:35 -04:00
color: theme . textColor
2023-04-23 06:58:07 -04:00
Layout.row: 4
Layout.column: 0
}
TextField {
text: settings . promptBatchSize . toString ( )
2023-04-23 09:42:35 -04:00
color: theme . textColor
2023-04-23 07:48:06 -04:00
background: Rectangle {
implicitWidth: 150
2023-04-23 09:42:35 -04:00
color: theme . backgroundLighter
2023-04-23 07:48:06 -04:00
radius: 10
}
2023-04-23 09:42:35 -04:00
padding: 10
2023-04-23 06:58:07 -04:00
ToolTip.text: qsTr ( "Amount of prompt tokens to process at once, higher values can speed up reading prompts but will use more RAM" )
ToolTip.visible: hovered
Layout.row: 4
Layout.column: 1
validator: IntValidator { bottom: 1 }
onAccepted: {
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: nThreadsLabel
text: qsTr ( "CPU Threads" )
2023-04-23 09:42:35 -04:00
color: theme . textColor
2023-04-23 06:58:07 -04:00
Layout.row: 5
Layout.column: 0
}
TextField {
2023-04-24 15:24:55 -04:00
text: settingsDialog . threadCount . toString ( )
2023-04-23 09:42:35 -04:00
color: theme . textColor
2023-04-23 07:48:06 -04:00
background: Rectangle {
implicitWidth: 150
2023-04-23 09:42:35 -04:00
color: theme . backgroundLighter
2023-04-23 07:48:06 -04:00
radius: 10
}
2023-04-23 09:42:35 -04:00
padding: 10
2023-04-24 15:24:55 -04:00
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" )
2023-04-23 06:58:07 -04:00
ToolTip.visible: hovered
Layout.row: 5
Layout.column: 1
validator: IntValidator { bottom: 1 }
onAccepted: {
var val = parseInt ( text )
if ( ! isNaN ( val ) ) {
2023-04-24 15:24:55 -04:00
settingsDialog . threadCount = val
2023-04-23 06:58:07 -04:00
LLM . threadCount = val
focus = false
} else {
2023-04-24 15:24:55 -04:00
text = settingsDialog . threadCount . toString ( )
2023-04-23 06:58:07 -04:00
}
}
Accessible.role: Accessible . EditableText
Accessible.name: nThreadsLabel . text
Accessible.description: ToolTip . text
}
Label {
id: promptTemplateLabel
text: qsTr ( "Prompt Template:" )
2023-04-23 09:42:35 -04:00
color: theme . textColor
2023-04-23 06:58:07 -04:00
Layout.row: 6
Layout.column: 0
}
Rectangle {
Layout.row: 6
Layout.column: 1
Layout.fillWidth: true
height: 200
color: "transparent"
2023-04-23 09:42:35 -04:00
clip: true
2023-04-23 06:58:07 -04:00
Label {
id: promptTemplateLabelHelp
visible: settings . promptTemplate . indexOf ( "%1" ) === - 1
font.bold: true
2023-04-23 09:42:35 -04:00
color: theme . textErrorColor
2023-04-23 06:58:07 -04:00
text: qsTr ( "Prompt template must contain %1 to be replaced with the user's input." )
2023-04-23 09:42:35 -04:00
anchors.fill: templateScrollView
z: 200
padding: 10
wrapMode: TextArea . Wrap
2023-04-23 06:58:07 -04:00
Accessible.role: Accessible . EditableText
Accessible.name: text
}
ScrollView {
id: templateScrollView
anchors.fill: parent
TextArea {
text: settings . promptTemplate
2023-04-23 09:42:35 -04:00
color: theme . textColor
2023-04-23 07:48:06 -04:00
background: Rectangle {
implicitWidth: 150
2023-04-23 09:42:35 -04:00
color: theme . backgroundLighter
2023-04-23 07:48:06 -04:00
radius: 10
}
2023-04-23 09:42:35 -04:00
padding: 10
2023-04-23 06:58:07 -04:00
wrapMode: TextArea . Wrap
onTextChanged: {
settings . promptTemplate = text
settings . sync ( )
}
bottomPadding: 10
Accessible.role: Accessible . EditableText
Accessible.name: promptTemplateLabel . text
Accessible.description: promptTemplateLabelHelp . text
}
}
}
Button {
Layout.row: 7
Layout.column: 1
Layout.fillWidth: true
padding: 15
contentItem: Text {
text: qsTr ( "Restore Defaults" )
horizontalAlignment: Text . AlignHCenter
2023-04-23 09:42:35 -04:00
color: theme . textColor
2023-04-23 06:58:07 -04:00
Accessible.role: Accessible . Button
Accessible.name: text
Accessible.description: qsTr ( "Restores the settings dialog to a default state" )
}
background: Rectangle {
opacity: . 5
2023-04-23 09:42:35 -04:00
border.color: theme . backgroundLightest
2023-04-23 06:58:07 -04:00
border.width: 1
radius: 10
2023-04-23 09:42:35 -04:00
color: theme . backgroundLight
2023-04-23 06:58:07 -04:00
}
2023-04-23 07:48:06 -04:00
onClicked: {
settingsDialog . restoreDefaults ( )
}
2023-04-23 06:58:07 -04:00
}
}
}