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);
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.setLabelText(Tr::tr("Start Suggestion Timer:"));
startSuggestionTimer.setRange(10, 10000);
@ -102,11 +52,6 @@ QodeAssistSettings::QodeAssistSettings()
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.setLabelText("Custom JSON Template:");
customJsonTemplate.setDisplayStyle(Utils::StringAspect::TextEditDisplay);
@ -135,11 +80,6 @@ QodeAssistSettings::QodeAssistSettings()
readSettings();
topK.setEnabled(useTopK());
topP.setEnabled(useTopP());
presencePenalty.setEnabled(usePresencePenalty());
frequencyPenalty.setEnabled(useFrequencyPenalty());
customJsonTemplate.setVisible(PromptTemplateManager::instance().getCurrentTemplate()->name()
== "Custom Template");
@ -155,18 +95,18 @@ QodeAssistSettings::QodeAssistSettings()
// maxFileThreshold,
// readStringsBeforeCursor,
// readStringsAfterCursor,
ollamaLivetime,
apiKey,
// ollamaLivetime,
// apiKey,
// useFilePathInContext,
// useSpecificInstructions,
// specificInstractions,
temperature,
maxTokens,
startSuggestionTimer,
Row{useTopP, topP, Stretch{1}},
Row{useTopK, topK, Stretch{1}},
Row{usePresencePenalty, presencePenalty, Stretch{1}},
Row{useFrequencyPenalty, frequencyPenalty, Stretch{1}}}}},
// temperature,
// maxTokens,
// startSuggestionTimer,
// Row{useTopP, topP, Stretch{1}},
// Row{useTopK, topK, Stretch{1}},
/* Row{usePresencePenalty, presencePenalty, Stretch{1}},
Row{useFrequencyPenalty, frequencyPenalty, Stretch{1}}*/}}},
st};
});
@ -175,19 +115,6 @@ QodeAssistSettings::QodeAssistSettings()
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,
&ButtonAspect::clicked,
this,
@ -230,23 +157,23 @@ void QodeAssistSettings::resetSettingsToDefaults()
// resetAspect(endPoint);
// resetAspect(modelName);
// resetAspect(fimPrompts);
resetAspect(temperature);
resetAspect(maxTokens);
// resetAspect(temperature);
// resetAspect(maxTokens);
// resetAspect(readFullFile);
// resetAspect(maxFileThreshold);
// resetAspect(readStringsBeforeCursor);
// resetAspect(readStringsAfterCursor);
resetAspect(useTopP);
resetAspect(topP);
resetAspect(useTopK);
resetAspect(topK);
resetAspect(usePresencePenalty);
resetAspect(presencePenalty);
resetAspect(useFrequencyPenalty);
resetAspect(frequencyPenalty);
// resetAspect(useTopP);
// resetAspect(topP);
// resetAspect(useTopK);
// resetAspect(topK);
// resetAspect(usePresencePenalty);
// resetAspect(presencePenalty);
// resetAspect(useFrequencyPenalty);
// resetAspect(frequencyPenalty);
resetAspect(startSuggestionTimer);
// resetAspect(enableLogging);
resetAspect(ollamaLivetime);
// resetAspect(ollamaLivetime);
// resetAspect(specificInstractions);
// resetAspect(multiLineCompletion);
// resetAspect(useFilePathInContext);

View File

@ -57,29 +57,11 @@ class QodeAssistSettings : public Utils::AspectContainer
public:
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::StringAspect ollamaLivetime{this};
Utils::StringAspect customJsonTemplate{this};
ButtonAspect saveCustomTemplateButton{this};
ButtonAspect loadCustomTemplateButton{this};
Utils::StringAspect apiKey{this};
ButtonAspect resetToDefaults{this};

View File

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

View File

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

View File

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

View File

@ -19,7 +19,9 @@
#include "PresetPromptsSettings.hpp"
#include <QMessageBox>
#include <coreplugin/dialogs/ioptionspage.h>
#include <coreplugin/icore.h>
#include <utils/layoutbuilder.h>
#include "QodeAssistConstants.hpp"
@ -39,12 +41,133 @@ PresetPromptsSettings::PresetPromptsSettings()
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]() {
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
{
public:

View File

@ -19,6 +19,7 @@
#pragma once
#include "settings/SettingsUtils.hpp"
#include <utils/aspects.h>
namespace QodeAssist::Settings {
@ -27,6 +28,30 @@ class PresetPromptsSettings : public Utils::AspectContainer
{
public:
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();