Move preset params to separate settings page

This commit is contained in:
Petr Mironychev
2024-09-08 00:13:48 +02:00
parent 356f28a97b
commit 4d06541a36
7 changed files with 207 additions and 144 deletions

View File

@ -45,56 +45,6 @@ QodeAssistSettings::QodeAssistSettings()
{ {
setAutoApply(false); setAutoApply(false);
temperature.setSettingsKey(Constants::TEMPERATURE);
temperature.setLabelText(Tr::tr("Temperature:"));
temperature.setDefaultValue(0.2);
temperature.setRange(0.0, 10.0);
ollamaLivetime.setSettingsKey(Constants::OLLAMA_LIVETIME);
ollamaLivetime.setLabelText(
Tr::tr("Time to suspend Ollama after completion request (in minutes), "
"Only Ollama, -1 to disable"));
ollamaLivetime.setDefaultValue("5m");
ollamaLivetime.setDisplayStyle(Utils::StringAspect::LineEditDisplay);
maxTokens.setSettingsKey(Constants::MAX_TOKENS);
maxTokens.setLabelText(Tr::tr("Max Tokens"));
maxTokens.setRange(-1, 10000);
maxTokens.setDefaultValue(150);
useTopP.setSettingsKey(Constants::USE_TOP_P);
useTopP.setDefaultValue(false);
topP.setSettingsKey(Constants::TOP_P);
topP.setLabelText(Tr::tr("top_p"));
topP.setDefaultValue(0.9);
topP.setRange(0.0, 1.0);
useTopK.setSettingsKey(Constants::USE_TOP_K);
useTopK.setDefaultValue(false);
topK.setSettingsKey(Constants::TOP_K);
topK.setLabelText(Tr::tr("top_k"));
topK.setDefaultValue(50);
topK.setRange(1, 1000);
usePresencePenalty.setSettingsKey(Constants::USE_PRESENCE_PENALTY);
usePresencePenalty.setDefaultValue(false);
presencePenalty.setSettingsKey(Constants::PRESENCE_PENALTY);
presencePenalty.setLabelText(Tr::tr("presence_penalty"));
presencePenalty.setDefaultValue(0.0);
presencePenalty.setRange(-2.0, 2.0);
useFrequencyPenalty.setSettingsKey(Constants::USE_FREQUENCY_PENALTY);
useFrequencyPenalty.setDefaultValue(false);
frequencyPenalty.setSettingsKey(Constants::FREQUENCY_PENALTY);
frequencyPenalty.setLabelText(Tr::tr("frequency_penalty"));
frequencyPenalty.setDefaultValue(0.0);
frequencyPenalty.setRange(-2.0, 2.0);
startSuggestionTimer.setSettingsKey(Constants::START_SUGGESTION_TIMER); startSuggestionTimer.setSettingsKey(Constants::START_SUGGESTION_TIMER);
startSuggestionTimer.setLabelText(Tr::tr("Start Suggestion Timer:")); startSuggestionTimer.setLabelText(Tr::tr("Start Suggestion Timer:"));
startSuggestionTimer.setRange(10, 10000); startSuggestionTimer.setRange(10, 10000);
@ -102,11 +52,6 @@ QodeAssistSettings::QodeAssistSettings()
resetToDefaults.m_buttonText = Tr::tr("Reset to Defaults"); resetToDefaults.m_buttonText = Tr::tr("Reset to Defaults");
apiKey.setSettingsKey(Constants::API_KEY);
apiKey.setLabelText(Tr::tr("API Key:"));
apiKey.setDisplayStyle(Utils::StringAspect::LineEditDisplay);
apiKey.setPlaceHolderText(Tr::tr("Enter your API key here"));
customJsonTemplate.setSettingsKey(Constants::CUSTOM_JSON_TEMPLATE); customJsonTemplate.setSettingsKey(Constants::CUSTOM_JSON_TEMPLATE);
customJsonTemplate.setLabelText("Custom JSON Template:"); customJsonTemplate.setLabelText("Custom JSON Template:");
customJsonTemplate.setDisplayStyle(Utils::StringAspect::TextEditDisplay); customJsonTemplate.setDisplayStyle(Utils::StringAspect::TextEditDisplay);
@ -135,11 +80,6 @@ QodeAssistSettings::QodeAssistSettings()
readSettings(); readSettings();
topK.setEnabled(useTopK());
topP.setEnabled(useTopP());
presencePenalty.setEnabled(usePresencePenalty());
frequencyPenalty.setEnabled(useFrequencyPenalty());
customJsonTemplate.setVisible(PromptTemplateManager::instance().getCurrentTemplate()->name() customJsonTemplate.setVisible(PromptTemplateManager::instance().getCurrentTemplate()->name()
== "Custom Template"); == "Custom Template");
@ -155,18 +95,18 @@ QodeAssistSettings::QodeAssistSettings()
// maxFileThreshold, // maxFileThreshold,
// readStringsBeforeCursor, // readStringsBeforeCursor,
// readStringsAfterCursor, // readStringsAfterCursor,
ollamaLivetime, // ollamaLivetime,
apiKey, // apiKey,
// useFilePathInContext, // useFilePathInContext,
// useSpecificInstructions, // useSpecificInstructions,
// specificInstractions, // specificInstractions,
temperature, // temperature,
maxTokens, // maxTokens,
startSuggestionTimer, // startSuggestionTimer,
Row{useTopP, topP, Stretch{1}}, // Row{useTopP, topP, Stretch{1}},
Row{useTopK, topK, Stretch{1}}, // Row{useTopK, topK, Stretch{1}},
Row{usePresencePenalty, presencePenalty, Stretch{1}}, /* Row{usePresencePenalty, presencePenalty, Stretch{1}},
Row{useFrequencyPenalty, frequencyPenalty, Stretch{1}}}}}, Row{useFrequencyPenalty, frequencyPenalty, Stretch{1}}*/}}},
st}; st};
}); });
@ -175,19 +115,6 @@ QodeAssistSettings::QodeAssistSettings()
void QodeAssistSettings::setupConnections() void QodeAssistSettings::setupConnections()
{ {
connect(&useTopP, &Utils::BoolAspect::volatileValueChanged, this, [this]() {
topP.setEnabled(useTopP.volatileValue());
});
connect(&useTopK, &Utils::BoolAspect::volatileValueChanged, this, [this]() {
topK.setEnabled(useTopK.volatileValue());
});
connect(&usePresencePenalty, &Utils::BoolAspect::volatileValueChanged, this, [this]() {
presencePenalty.setEnabled(usePresencePenalty.volatileValue());
});
connect(&useFrequencyPenalty, &Utils::BoolAspect::volatileValueChanged, this, [this]() {
frequencyPenalty.setEnabled(useFrequencyPenalty.volatileValue());
});
connect(&resetToDefaults, connect(&resetToDefaults,
&ButtonAspect::clicked, &ButtonAspect::clicked,
this, this,
@ -230,23 +157,23 @@ void QodeAssistSettings::resetSettingsToDefaults()
// resetAspect(endPoint); // resetAspect(endPoint);
// resetAspect(modelName); // resetAspect(modelName);
// resetAspect(fimPrompts); // resetAspect(fimPrompts);
resetAspect(temperature); // resetAspect(temperature);
resetAspect(maxTokens); // resetAspect(maxTokens);
// resetAspect(readFullFile); // resetAspect(readFullFile);
// resetAspect(maxFileThreshold); // resetAspect(maxFileThreshold);
// resetAspect(readStringsBeforeCursor); // resetAspect(readStringsBeforeCursor);
// resetAspect(readStringsAfterCursor); // resetAspect(readStringsAfterCursor);
resetAspect(useTopP); // resetAspect(useTopP);
resetAspect(topP); // resetAspect(topP);
resetAspect(useTopK); // resetAspect(useTopK);
resetAspect(topK); // resetAspect(topK);
resetAspect(usePresencePenalty); // resetAspect(usePresencePenalty);
resetAspect(presencePenalty); // resetAspect(presencePenalty);
resetAspect(useFrequencyPenalty); // resetAspect(useFrequencyPenalty);
resetAspect(frequencyPenalty); // resetAspect(frequencyPenalty);
resetAspect(startSuggestionTimer); resetAspect(startSuggestionTimer);
// resetAspect(enableLogging); // resetAspect(enableLogging);
resetAspect(ollamaLivetime); // resetAspect(ollamaLivetime);
// resetAspect(specificInstractions); // resetAspect(specificInstractions);
// resetAspect(multiLineCompletion); // resetAspect(multiLineCompletion);
// resetAspect(useFilePathInContext); // resetAspect(useFilePathInContext);

View File

@ -57,29 +57,11 @@ class QodeAssistSettings : public Utils::AspectContainer
public: public:
QodeAssistSettings(); QodeAssistSettings();
Utils::DoubleAspect temperature{this};
Utils::IntegerAspect maxTokens{this};
Utils::BoolAspect useTopP{this};
Utils::DoubleAspect topP{this};
Utils::BoolAspect useTopK{this};
Utils::IntegerAspect topK{this};
Utils::BoolAspect usePresencePenalty{this};
Utils::DoubleAspect presencePenalty{this};
Utils::BoolAspect useFrequencyPenalty{this};
Utils::DoubleAspect frequencyPenalty{this};
Utils::IntegerAspect startSuggestionTimer{this}; Utils::IntegerAspect startSuggestionTimer{this};
Utils::StringAspect ollamaLivetime{this};
Utils::StringAspect customJsonTemplate{this}; Utils::StringAspect customJsonTemplate{this};
ButtonAspect saveCustomTemplateButton{this}; ButtonAspect saveCustomTemplateButton{this};
ButtonAspect loadCustomTemplateButton{this}; ButtonAspect loadCustomTemplateButton{this};
Utils::StringAspect apiKey{this};
ButtonAspect resetToDefaults{this}; ButtonAspect resetToDefaults{this};

View File

@ -28,6 +28,7 @@
#include "PromptTemplateManager.hpp" #include "PromptTemplateManager.hpp"
#include "QodeAssistSettings.hpp" #include "QodeAssistSettings.hpp"
#include "QodeAssistUtils.hpp" #include "QodeAssistUtils.hpp"
#include "settings/PresetPromptsSettings.hpp"
namespace QodeAssist::Providers { namespace QodeAssist::Providers {
@ -50,6 +51,7 @@ QString LMStudioProvider::completionEndpoint() const
void LMStudioProvider::prepareRequest(QJsonObject &request) void LMStudioProvider::prepareRequest(QJsonObject &request)
{ {
auto &settings = Settings::presetPromptsSettings();
const auto &currentTemplate = PromptTemplateManager::instance().getCurrentTemplate(); const auto &currentTemplate = PromptTemplateManager::instance().getCurrentTemplate();
if (currentTemplate->name() == "Custom Template") if (currentTemplate->name() == "Custom Template")
return; return;
@ -59,17 +61,17 @@ void LMStudioProvider::prepareRequest(QJsonObject &request)
request["messages"] = std::move(messages); request["messages"] = std::move(messages);
} }
request["max_tokens"] = settings().maxTokens(); request["max_tokens"] = settings.maxTokens();
request["temperature"] = settings().temperature(); request["temperature"] = settings.temperature();
request["stop"] = QJsonArray::fromStringList(currentTemplate->stopWords()); request["stop"] = QJsonArray::fromStringList(currentTemplate->stopWords());
if (settings().useTopP()) if (settings.useTopP())
request["top_p"] = settings().topP(); request["top_p"] = settings.topP();
if (settings().useTopK()) if (settings.useTopK())
request["top_k"] = settings().topK(); request["top_k"] = settings.topK();
if (settings().useFrequencyPenalty()) if (settings.useFrequencyPenalty())
request["frequency_penalty"] = settings().frequencyPenalty(); request["frequency_penalty"] = settings.frequencyPenalty();
if (settings().usePresencePenalty()) if (settings.usePresencePenalty())
request["presence_penalty"] = settings().presencePenalty(); request["presence_penalty"] = settings.presencePenalty();
} }
bool LMStudioProvider::handleResponse(QNetworkReply *reply, QString &accumulatedResponse) bool LMStudioProvider::handleResponse(QNetworkReply *reply, QString &accumulatedResponse)

View File

@ -28,6 +28,7 @@
#include "PromptTemplateManager.hpp" #include "PromptTemplateManager.hpp"
#include "QodeAssistSettings.hpp" #include "QodeAssistSettings.hpp"
#include "QodeAssistUtils.hpp" #include "QodeAssistUtils.hpp"
#include "settings/PresetPromptsSettings.hpp"
namespace QodeAssist::Providers { namespace QodeAssist::Providers {
@ -50,23 +51,24 @@ QString OllamaProvider::completionEndpoint() const
void OllamaProvider::prepareRequest(QJsonObject &request) void OllamaProvider::prepareRequest(QJsonObject &request)
{ {
auto &settings = Settings::presetPromptsSettings();
auto currentTemplate = PromptTemplateManager::instance().getCurrentTemplate(); auto currentTemplate = PromptTemplateManager::instance().getCurrentTemplate();
if (currentTemplate->name() == "Custom Template") if (currentTemplate->name() == "Custom Template")
return; return;
QJsonObject options; QJsonObject options;
options["num_predict"] = settings().maxTokens(); options["num_predict"] = settings.maxTokens();
options["keep_alive"] = settings().ollamaLivetime(); options["keep_alive"] = settings.ollamaLivetime();
options["temperature"] = settings().temperature(); options["temperature"] = settings.temperature();
options["stop"] = QJsonArray::fromStringList(currentTemplate->stopWords()); options["stop"] = QJsonArray::fromStringList(currentTemplate->stopWords());
if (settings().useTopP()) if (settings.useTopP())
options["top_p"] = settings().topP(); options["top_p"] = settings.topP();
if (settings().useTopK()) if (settings.useTopK())
options["top_k"] = settings().topK(); options["top_k"] = settings.topK();
if (settings().useFrequencyPenalty()) if (settings.useFrequencyPenalty())
options["frequency_penalty"] = settings().frequencyPenalty(); options["frequency_penalty"] = settings.frequencyPenalty();
if (settings().usePresencePenalty()) if (settings.usePresencePenalty())
options["presence_penalty"] = settings().presencePenalty(); options["presence_penalty"] = settings.presencePenalty();
request["options"] = options; request["options"] = options;
} }

View File

@ -26,6 +26,7 @@
#include "PromptTemplateManager.hpp" #include "PromptTemplateManager.hpp"
#include "QodeAssistSettings.hpp" #include "QodeAssistSettings.hpp"
#include "settings/PresetPromptsSettings.hpp"
namespace QodeAssist::Providers { namespace QodeAssist::Providers {
@ -48,6 +49,7 @@ QString OpenAICompatProvider::completionEndpoint() const
void OpenAICompatProvider::prepareRequest(QJsonObject &request) void OpenAICompatProvider::prepareRequest(QJsonObject &request)
{ {
auto &settings = Settings::presetPromptsSettings();
const auto &currentTemplate = PromptTemplateManager::instance().getCurrentTemplate(); const auto &currentTemplate = PromptTemplateManager::instance().getCurrentTemplate();
if (currentTemplate->name() == "Custom Template") if (currentTemplate->name() == "Custom Template")
return; return;
@ -58,19 +60,19 @@ void OpenAICompatProvider::prepareRequest(QJsonObject &request)
request["messages"] = std::move(messages); request["messages"] = std::move(messages);
} }
request["max_tokens"] = settings().maxTokens(); request["max_tokens"] = settings.maxTokens();
request["temperature"] = settings().temperature(); request["temperature"] = settings.temperature();
request["stop"] = QJsonArray::fromStringList(currentTemplate->stopWords()); request["stop"] = QJsonArray::fromStringList(currentTemplate->stopWords());
if (settings().useTopP()) if (settings.useTopP())
request["top_p"] = settings().topP(); request["top_p"] = settings.topP();
if (settings().useTopK()) if (settings.useTopK())
request["top_k"] = settings().topK(); request["top_k"] = settings.topK();
if (settings().useFrequencyPenalty()) if (settings.useFrequencyPenalty())
request["frequency_penalty"] = settings().frequencyPenalty(); request["frequency_penalty"] = settings.frequencyPenalty();
if (settings().usePresencePenalty()) if (settings.usePresencePenalty())
request["presence_penalty"] = settings().presencePenalty(); request["presence_penalty"] = settings.presencePenalty();
const QString &apiKey = settings().apiKey.value(); const QString &apiKey = settings.apiKey.value();
if (!apiKey.isEmpty()) { if (!apiKey.isEmpty()) {
request["api_key"] = apiKey; request["api_key"] = apiKey;
} }

View File

@ -19,7 +19,9 @@
#include "PresetPromptsSettings.hpp" #include "PresetPromptsSettings.hpp"
#include <QMessageBox>
#include <coreplugin/dialogs/ioptionspage.h> #include <coreplugin/dialogs/ioptionspage.h>
#include <coreplugin/icore.h>
#include <utils/layoutbuilder.h> #include <utils/layoutbuilder.h>
#include "QodeAssistConstants.hpp" #include "QodeAssistConstants.hpp"
@ -39,12 +41,133 @@ PresetPromptsSettings::PresetPromptsSettings()
setDisplayName(Tr::tr("Preset Prompts Params")); setDisplayName(Tr::tr("Preset Prompts Params"));
temperature.setSettingsKey(Constants::TEMPERATURE);
temperature.setLabelText(Tr::tr("Temperature:"));
temperature.setDefaultValue(0.2);
temperature.setRange(0.0, 10.0);
ollamaLivetime.setSettingsKey(Constants::OLLAMA_LIVETIME);
ollamaLivetime.setLabelText(
Tr::tr("Time to suspend Ollama after completion request (in minutes), "
"Only Ollama, -1 to disable"));
ollamaLivetime.setDefaultValue("5m");
ollamaLivetime.setDisplayStyle(Utils::StringAspect::LineEditDisplay);
maxTokens.setSettingsKey(Constants::MAX_TOKENS);
maxTokens.setLabelText(Tr::tr("Max Tokens"));
maxTokens.setRange(-1, 10000);
maxTokens.setDefaultValue(150);
useTopP.setSettingsKey(Constants::USE_TOP_P);
useTopP.setDefaultValue(false);
topP.setSettingsKey(Constants::TOP_P);
topP.setLabelText(Tr::tr("top_p"));
topP.setDefaultValue(0.9);
topP.setRange(0.0, 1.0);
useTopK.setSettingsKey(Constants::USE_TOP_K);
useTopK.setDefaultValue(false);
topK.setSettingsKey(Constants::TOP_K);
topK.setLabelText(Tr::tr("top_k"));
topK.setDefaultValue(50);
topK.setRange(1, 1000);
usePresencePenalty.setSettingsKey(Constants::USE_PRESENCE_PENALTY);
usePresencePenalty.setDefaultValue(false);
presencePenalty.setSettingsKey(Constants::PRESENCE_PENALTY);
presencePenalty.setLabelText(Tr::tr("presence_penalty"));
presencePenalty.setDefaultValue(0.0);
presencePenalty.setRange(-2.0, 2.0);
useFrequencyPenalty.setSettingsKey(Constants::USE_FREQUENCY_PENALTY);
useFrequencyPenalty.setDefaultValue(false);
frequencyPenalty.setSettingsKey(Constants::FREQUENCY_PENALTY);
frequencyPenalty.setLabelText(Tr::tr("frequency_penalty"));
frequencyPenalty.setDefaultValue(0.0);
frequencyPenalty.setRange(-2.0, 2.0);
apiKey.setSettingsKey(Constants::API_KEY);
apiKey.setLabelText(Tr::tr("API Key:"));
apiKey.setDisplayStyle(Utils::StringAspect::LineEditDisplay);
apiKey.setPlaceHolderText(Tr::tr("Enter your API key here"));
resetToDefaults.m_buttonText = Tr::tr("Reset Page to Defaults");
readSettings();
topK.setEnabled(useTopK());
topP.setEnabled(useTopP());
presencePenalty.setEnabled(usePresencePenalty());
frequencyPenalty.setEnabled(useFrequencyPenalty());
setupConnections();
setLayouter([this]() { setLayouter([this]() {
using namespace Layouting; using namespace Layouting;
return Column{Stretch{1}}; return Column{Row{temperature, Stretch{1}, resetToDefaults},
maxTokens,
Row{useTopP, topP, Stretch{1}},
Row{useTopK, topK, Stretch{1}},
Row{usePresencePenalty, presencePenalty, Stretch{1}},
Row{useFrequencyPenalty, frequencyPenalty, Stretch{1}},
apiKey,
Stretch{1}};
}); });
} }
void PresetPromptsSettings::setupConnections()
{
connect(&useTopP, &Utils::BoolAspect::volatileValueChanged, this, [this]() {
topP.setEnabled(useTopP.volatileValue());
});
connect(&useTopK, &Utils::BoolAspect::volatileValueChanged, this, [this]() {
topK.setEnabled(useTopK.volatileValue());
});
connect(&usePresencePenalty, &Utils::BoolAspect::volatileValueChanged, this, [this]() {
presencePenalty.setEnabled(usePresencePenalty.volatileValue());
});
connect(&useFrequencyPenalty, &Utils::BoolAspect::volatileValueChanged, this, [this]() {
frequencyPenalty.setEnabled(useFrequencyPenalty.volatileValue());
});
connect(&resetToDefaults,
&ButtonAspect::clicked,
this,
&PresetPromptsSettings::resetSettingsToDefaults);
}
void PresetPromptsSettings::resetSettingsToDefaults()
{
QMessageBox::StandardButton reply;
reply = QMessageBox::question(
Core::ICore::dialogParent(),
Tr::tr("Reset Settings"),
Tr::tr("Are you sure you want to reset all settings to default values?"),
QMessageBox::Yes | QMessageBox::No);
if (reply == QMessageBox::Yes) {
resetAspect(temperature);
resetAspect(maxTokens);
resetAspect(ollamaLivetime);
resetAspect(useTopP);
resetAspect(topP);
resetAspect(useTopK);
resetAspect(topK);
resetAspect(usePresencePenalty);
resetAspect(presencePenalty);
resetAspect(useFrequencyPenalty);
resetAspect(frequencyPenalty);
}
QMessageBox::information(Core::ICore::dialogParent(),
Tr::tr("Settings Reset"),
Tr::tr("All settings have been reset to their default values."));
}
class PresetPromptsSettingsPage : public Core::IOptionsPage class PresetPromptsSettingsPage : public Core::IOptionsPage
{ {
public: public:

View File

@ -19,6 +19,7 @@
#pragma once #pragma once
#include "settings/SettingsUtils.hpp"
#include <utils/aspects.h> #include <utils/aspects.h>
namespace QodeAssist::Settings { namespace QodeAssist::Settings {
@ -27,6 +28,30 @@ class PresetPromptsSettings : public Utils::AspectContainer
{ {
public: public:
PresetPromptsSettings(); PresetPromptsSettings();
Utils::DoubleAspect temperature{this};
Utils::IntegerAspect maxTokens{this};
Utils::BoolAspect useTopP{this};
Utils::DoubleAspect topP{this};
Utils::BoolAspect useTopK{this};
Utils::IntegerAspect topK{this};
Utils::BoolAspect usePresencePenalty{this};
Utils::DoubleAspect presencePenalty{this};
Utils::BoolAspect useFrequencyPenalty{this};
Utils::DoubleAspect frequencyPenalty{this};
Utils::StringAspect ollamaLivetime{this};
Utils::StringAspect apiKey{this};
ButtonAspect resetToDefaults{this};
private:
void setupConnections();
void resetSettingsToDefaults();
}; };
PresetPromptsSettings &presetPromptsSettings(); PresetPromptsSettings &presetPromptsSettings();