Move custom promt to settings page

This commit is contained in:
Petr Mironychev
2024-09-08 00:59:44 +02:00
parent 384e07ba62
commit 314ba06db1
5 changed files with 199 additions and 103 deletions

View File

@ -45,47 +45,14 @@ QodeAssistSettings::QodeAssistSettings()
{ {
setAutoApply(false); setAutoApply(false);
resetToDefaults.m_buttonText = Tr::tr("Reset to Defaults");
customJsonTemplate.setSettingsKey(Constants::CUSTOM_JSON_TEMPLATE);
customJsonTemplate.setLabelText("Custom JSON Template:");
customJsonTemplate.setDisplayStyle(Utils::StringAspect::TextEditDisplay);
customJsonTemplate.setDefaultValue(R"({
"prompt": "{{QODE_INSTRUCTIONS}}<fim_prefix>{{QODE_PREFIX}}<fim_suffix>{{QODE_SUFFIX}}<fim_middle>",
"options": {
"temperature": 0.7,
"top_p": 0.95,
"top_k": 40,
"num_predict": 100,
"stop": [
"<|endoftext|>",
"<file_sep>",
"<fim_prefix>",
"<fim_suffix>",
"<fim_middle>"
],
"frequency_penalty": 0,
"presence_penalty": 0
},
"stream": true
})");
saveCustomTemplateButton.m_buttonText = (Tr::tr("Save Custom Template to JSON"));
loadCustomTemplateButton.m_buttonText = (Tr::tr("Load Custom Template from JSON"));
readSettings(); readSettings();
customJsonTemplate.setVisible(PromptTemplateManager::instance().getCurrentTemplate()->name()
== "Custom Template");
setLayouter([this]() { setLayouter([this]() {
using namespace Layouting; using namespace Layouting;
return Column{Group{title(Tr::tr("FIM Prompt Settings")), return Column{Group{title(Tr::tr("FIM Prompt Settings")),
Form{Column{Column{customJsonTemplate, Form{Column{Column{
Row{saveCustomTemplateButton, },
loadCustomTemplateButton,
Stretch{1}}},
// readFullFile, // readFullFile,
// maxFileThreshold, // maxFileThreshold,
// readStringsBeforeCursor, // readStringsBeforeCursor,
@ -110,19 +77,7 @@ QodeAssistSettings::QodeAssistSettings()
void QodeAssistSettings::setupConnections() void QodeAssistSettings::setupConnections()
{ {
connect(&resetToDefaults,
&ButtonAspect::clicked,
this,
&QodeAssistSettings::resetSettingsToDefaults);
connect(&saveCustomTemplateButton,
&ButtonAspect::clicked,
this,
&QodeAssistSettings::saveCustomTemplate);
connect(&loadCustomTemplateButton,
&ButtonAspect::clicked,
this,
&QodeAssistSettings::loadCustomTemplate);
} }
QStringList QodeAssistSettings::getInstalledModels() QStringList QodeAssistSettings::getInstalledModels()
@ -173,7 +128,7 @@ void QodeAssistSettings::resetSettingsToDefaults()
// resetAspect(multiLineCompletion); // resetAspect(multiLineCompletion);
// resetAspect(useFilePathInContext); // resetAspect(useFilePathInContext);
// resetAspect(useSpecificInstructions); // resetAspect(useSpecificInstructions);
resetAspect(customJsonTemplate); // resetAspect(customJsonTemplate);
// fimPrompts.setStringValue("StarCoder2"); // fimPrompts.setStringValue("StarCoder2");
// llmProviders.setStringValue("Ollama"); // llmProviders.setStringValue("Ollama");
@ -188,60 +143,60 @@ void QodeAssistSettings::resetSettingsToDefaults()
void QodeAssistSettings::saveCustomTemplate() void QodeAssistSettings::saveCustomTemplate()
{ {
QString fileName = QFileDialog::getSaveFileName(nullptr, // QString fileName = QFileDialog::getSaveFileName(nullptr,
Tr::tr("Save JSON Template"), // Tr::tr("Save JSON Template"),
QString(), // QString(),
Tr::tr("JSON Files (*.json)")); // Tr::tr("JSON Files (*.json)"));
if (fileName.isEmpty()) // if (fileName.isEmpty())
return; // return;
QFile file(fileName); // QFile file(fileName);
if (file.open(QIODevice::WriteOnly | QIODevice::Text)) { // if (file.open(QIODevice::WriteOnly | QIODevice::Text)) {
QTextStream out(&file); // QTextStream out(&file);
out << customJsonTemplate.value(); // out << customJsonTemplate.value();
file.close(); // file.close();
QMessageBox::information(nullptr, // QMessageBox::information(nullptr,
Tr::tr("Save Successful"), // Tr::tr("Save Successful"),
Tr::tr("JSON template has been saved successfully.")); // Tr::tr("JSON template has been saved successfully."));
} else { // } else {
QMessageBox::critical(nullptr, // QMessageBox::critical(nullptr,
Tr::tr("Save Failed"), // Tr::tr("Save Failed"),
Tr::tr("Failed to save JSON template.")); // Tr::tr("Failed to save JSON template."));
} // }
} }
void QodeAssistSettings::loadCustomTemplate() void QodeAssistSettings::loadCustomTemplate()
{ {
QString fileName = QFileDialog::getOpenFileName(nullptr, // QString fileName = QFileDialog::getOpenFileName(nullptr,
Tr::tr("Load JSON Template"), // Tr::tr("Load JSON Template"),
QString(), // QString(),
Tr::tr("JSON Files (*.json)")); // Tr::tr("JSON Files (*.json)"));
if (fileName.isEmpty()) // if (fileName.isEmpty())
return; // return;
QFile file(fileName); // QFile file(fileName);
if (file.open(QIODevice::ReadOnly | QIODevice::Text)) { // if (file.open(QIODevice::ReadOnly | QIODevice::Text)) {
QTextStream in(&file); // QTextStream in(&file);
QString jsonContent = in.readAll(); // QString jsonContent = in.readAll();
file.close(); // file.close();
QJsonParseError parseError; // QJsonParseError parseError;
QJsonDocument jsonDoc = QJsonDocument::fromJson(jsonContent.toUtf8(), &parseError); // QJsonDocument jsonDoc = QJsonDocument::fromJson(jsonContent.toUtf8(), &parseError);
if (parseError.error == QJsonParseError::NoError) { // if (parseError.error == QJsonParseError::NoError) {
customJsonTemplate.setValue(jsonContent); // customJsonTemplate.setValue(jsonContent);
QMessageBox::information(nullptr, // QMessageBox::information(nullptr,
Tr::tr("Load Successful"), // Tr::tr("Load Successful"),
Tr::tr("JSON template has been loaded successfully.")); // Tr::tr("JSON template has been loaded successfully."));
} else { // } else {
QMessageBox::critical(nullptr, // QMessageBox::critical(nullptr,
Tr::tr("Invalid JSON"), // Tr::tr("Invalid JSON"),
Tr::tr("The selected file contains invalid JSON.")); // Tr::tr("The selected file contains invalid JSON."));
} // }
} else { // } else {
QMessageBox::critical(nullptr, // QMessageBox::critical(nullptr,
Tr::tr("Load Failed"), // Tr::tr("Load Failed"),
Tr::tr("Failed to load JSON template.")); // Tr::tr("Failed to load JSON template."));
} // }
} }
class QodeAssistSettingsPage : public Core::IOptionsPage class QodeAssistSettingsPage : public Core::IOptionsPage

View File

@ -57,12 +57,6 @@ class QodeAssistSettings : public Utils::AspectContainer
public: public:
QodeAssistSettings(); QodeAssistSettings();
Utils::StringAspect customJsonTemplate{this};
ButtonAspect saveCustomTemplateButton{this};
ButtonAspect loadCustomTemplateButton{this};
ButtonAspect resetToDefaults{this};
private: private:
void setupConnections(); void setupConnections();
QStringList getInstalledModels(); QStringList getInstalledModels();

View File

@ -19,7 +19,11 @@
#include "CustomPromptSettings.hpp" #include "CustomPromptSettings.hpp"
#include <QFileDialog>
#include <QJsonParseError>
#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 +43,138 @@ CustomPromptSettings::CustomPromptSettings()
setDisplayName(Tr::tr("Custom Prompt")); setDisplayName(Tr::tr("Custom Prompt"));
customJsonLabel.setLabelText("Custom JSON Template:");
customJsonLabel.setDisplayStyle(Utils::StringAspect::LabelDisplay);
customJsonTemplate.setSettingsKey(Constants::CUSTOM_JSON_TEMPLATE);
customJsonTemplate.setDisplayStyle(Utils::StringAspect::TextEditDisplay);
customJsonTemplate.setDefaultValue(R"({
"prompt": "{{QODE_INSTRUCTIONS}}<fim_prefix>{{QODE_PREFIX}}<fim_suffix>{{QODE_SUFFIX}}<fim_middle>",
"options": {
"temperature": 0.7,
"top_p": 0.95,
"top_k": 40,
"num_predict": 100,
"stop": [
"<|endoftext|>",
"<file_sep>",
"<fim_prefix>",
"<fim_suffix>",
"<fim_middle>"
],
"frequency_penalty": 0,
"presence_penalty": 0
},
"stream": true
})");
saveCustomTemplateButton.m_buttonText = (Tr::tr("Save Custom Template to JSON"));
loadCustomTemplateButton.m_buttonText = (Tr::tr("Load Custom Template from JSON"));
resetToDefaults.m_buttonText = Tr::tr("Reset Page to Defaults");
readSettings();
setupConnection();
setLayouter([this]() { setLayouter([this]() {
using namespace Layouting; using namespace Layouting;
return Column{Stretch{1}}; return Column{Row{customJsonLabel, Stretch{1}, resetToDefaults},
Row{customJsonTemplate,
Column{saveCustomTemplateButton, loadCustomTemplateButton, Stretch{1}}}};
}); });
} }
void CustomPromptSettings::setupConnection()
{
connect(&resetToDefaults,
&ButtonAspect::clicked,
this,
&CustomPromptSettings::resetSettingsToDefaults);
connect(&saveCustomTemplateButton,
&ButtonAspect::clicked,
this,
&CustomPromptSettings::saveCustomTemplate);
connect(&loadCustomTemplateButton,
&ButtonAspect::clicked,
this,
&CustomPromptSettings::loadCustomTemplate);
}
void CustomPromptSettings::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(customJsonTemplate);
}
QMessageBox::information(Core::ICore::dialogParent(),
Tr::tr("Settings Reset"),
Tr::tr("All settings have been reset to their default values."));
}
void CustomPromptSettings::saveCustomTemplate()
{
QString fileName = QFileDialog::getSaveFileName(nullptr,
Tr::tr("Save JSON Template"),
QString(),
Tr::tr("JSON Files (*.json)"));
if (fileName.isEmpty())
return;
QFile file(fileName);
if (file.open(QIODevice::WriteOnly | QIODevice::Text)) {
QTextStream out(&file);
out << customJsonTemplate.value();
file.close();
QMessageBox::information(nullptr,
Tr::tr("Save Successful"),
Tr::tr("JSON template has been saved successfully."));
} else {
QMessageBox::critical(nullptr,
Tr::tr("Save Failed"),
Tr::tr("Failed to save JSON template."));
}
}
void CustomPromptSettings::loadCustomTemplate()
{
QString fileName = QFileDialog::getOpenFileName(nullptr,
Tr::tr("Load JSON Template"),
QString(),
Tr::tr("JSON Files (*.json)"));
if (fileName.isEmpty())
return;
QFile file(fileName);
if (file.open(QIODevice::ReadOnly | QIODevice::Text)) {
QTextStream in(&file);
QString jsonContent = in.readAll();
file.close();
QJsonParseError parseError;
QJsonDocument jsonDoc = QJsonDocument::fromJson(jsonContent.toUtf8(), &parseError);
if (parseError.error == QJsonParseError::NoError) {
customJsonTemplate.setValue(jsonContent);
QMessageBox::information(nullptr,
Tr::tr("Load Successful"),
Tr::tr("JSON template has been loaded successfully."));
} else {
QMessageBox::critical(nullptr,
Tr::tr("Invalid JSON"),
Tr::tr("The selected file contains invalid JSON."));
}
} else {
QMessageBox::critical(nullptr,
Tr::tr("Load Failed"),
Tr::tr("Failed to load JSON template."));
}
}
class CustomPromptSettingsPage : public Core::IOptionsPage class CustomPromptSettingsPage : 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,18 @@ class CustomPromptSettings : public Utils::AspectContainer
{ {
public: public:
CustomPromptSettings(); CustomPromptSettings();
Utils::StringAspect customJsonLabel{this};
Utils::StringAspect customJsonTemplate{this};
ButtonAspect saveCustomTemplateButton{this};
ButtonAspect loadCustomTemplateButton{this};
ButtonAspect resetToDefaults{this};
private:
void setupConnection();
void resetSettingsToDefaults();
void saveCustomTemplate();
void loadCustomTemplate();
}; };
CustomPromptSettings &customPromptSettings(); CustomPromptSettings &customPromptSettings();

View File

@ -26,6 +26,7 @@
#include "QodeAssistSettings.hpp" #include "QodeAssistSettings.hpp"
#include "QodeAssistUtils.hpp" #include "QodeAssistUtils.hpp"
#include "settings/CustomPromptSettings.hpp"
namespace QodeAssist::Templates { namespace QodeAssist::Templates {
@ -33,7 +34,10 @@ class CustomTemplate : public PromptTemplate
{ {
public: public:
QString name() const override { return "Custom Template"; } QString name() const override { return "Custom Template"; }
QString promptTemplate() const override { return settings().customJsonTemplate(); } QString promptTemplate() const override
{
return Settings::customPromptSettings().customJsonTemplate();
}
QStringList stopWords() const override { return QStringList(); } QStringList stopWords() const override { return QStringList(); }
void prepareRequest(QJsonObject &request, const ContextData &context) const override void prepareRequest(QJsonObject &request, const ContextData &context) const override