feat: Add configuration manager (#270)

This commit is contained in:
Petr Mironychev
2025-11-20 17:31:13 +01:00
committed by GitHub
parent 6f7d8a0987
commit 1e3b1997cc
16 changed files with 880 additions and 9 deletions

View File

@ -35,6 +35,7 @@
#include "ChatAssistantSettings.hpp"
#include "ChatSerializer.hpp"
#include "ConfigurationManager.hpp"
#include "GeneralSettings.hpp"
#include "ToolsSettings.hpp"
#include "Logger.hpp"
@ -44,7 +45,6 @@
#include "context/TokenUtils.hpp"
#include "llmcore/RulesLoader.hpp"
#include "ProvidersManager.hpp"
#include "GeneralSettings.hpp"
namespace QodeAssist::Chat {
@ -66,6 +66,20 @@ ChatRootView::ChatRootView(QQuickItem *parent)
connect(
&settings.caModel, &Utils::BaseAspect::changed, this, &ChatRootView::currentTemplateChanged);
connect(&settings.caProvider, &Utils::BaseAspect::changed, this, [this]() {
auto &settings = Settings::generalSettings();
m_currentConfiguration = QString("%1 - %2").arg(settings.caProvider.value(),
settings.caModel.value());
emit currentConfigurationChanged();
});
connect(&settings.caModel, &Utils::BaseAspect::changed, this, [this]() {
auto &settings = Settings::generalSettings();
m_currentConfiguration = QString("%1 - %2").arg(settings.caProvider.value(),
settings.caModel.value());
emit currentConfigurationChanged();
});
connect(
m_clientInterface,
@ -190,6 +204,7 @@ ChatRootView::ChatRootView(QQuickItem *parent)
updateInputTokensCount();
refreshRules();
loadAvailableConfigurations();
connect(
ProjectExplorer::ProjectManager::instance(),
@ -1246,4 +1261,69 @@ bool ChatRootView::isImageFile(const QString &filePath) const
return imageExtensions.contains(fileInfo.suffix().toLower());
}
void ChatRootView::loadAvailableConfigurations()
{
auto &manager = Settings::ConfigurationManager::instance();
manager.loadConfigurations(Settings::ConfigurationType::Chat);
QVector<Settings::AIConfiguration> configs = manager.configurations(
Settings::ConfigurationType::Chat);
m_availableConfigurations.clear();
m_availableConfigurations.append(QObject::tr("Current Settings"));
for (const Settings::AIConfiguration &config : configs) {
m_availableConfigurations.append(config.name);
}
auto &settings = Settings::generalSettings();
QString currentProvider = settings.caProvider.value();
QString currentModel = settings.caModel.value();
m_currentConfiguration = QString("%1 - %2").arg(currentProvider, currentModel);
emit availableConfigurationsChanged();
emit currentConfigurationChanged();
}
void ChatRootView::applyConfiguration(const QString &configName)
{
if (configName == QObject::tr("Current Settings")) {
return;
}
auto &manager = Settings::ConfigurationManager::instance();
QVector<Settings::AIConfiguration> configs = manager.configurations(
Settings::ConfigurationType::Chat);
for (const Settings::AIConfiguration &config : configs) {
if (config.name == configName) {
auto &settings = Settings::generalSettings();
settings.caProvider.setValue(config.provider);
settings.caModel.setValue(config.model);
settings.caTemplate.setValue(config.templateName);
settings.caUrl.setValue(config.url);
settings.caEndpointMode.setValue(settings.caEndpointMode.indexForDisplay(config.endpointMode));
settings.caCustomEndpoint.setValue(config.customEndpoint);
settings.writeSettings();
m_currentConfiguration = QString("%1 - %2").arg(config.provider, config.model);
emit currentConfigurationChanged();
break;
}
}
}
QStringList ChatRootView::availableConfigurations() const
{
return m_availableConfigurations;
}
QString ChatRootView::currentConfiguration() const
{
return m_currentConfiguration;
}
} // namespace QodeAssist::Chat

View File

@ -58,6 +58,8 @@ class ChatRootView : public QQuickItem
Q_PROPERTY(int currentMessagePendingEdits READ currentMessagePendingEdits NOTIFY currentMessageEditsStatsChanged FINAL)
Q_PROPERTY(int currentMessageRejectedEdits READ currentMessageRejectedEdits NOTIFY currentMessageEditsStatsChanged FINAL)
Q_PROPERTY(bool isThinkingSupport READ isThinkingSupport NOTIFY isThinkingSupportChanged FINAL)
Q_PROPERTY(QStringList availableConfigurations READ availableConfigurations NOTIFY availableConfigurationsChanged FINAL)
Q_PROPERTY(QString currentConfiguration READ currentConfiguration NOTIFY currentConfigurationChanged FINAL)
QML_ELEMENT
@ -138,6 +140,11 @@ public:
Q_INVOKABLE void applyAllFileEditsForCurrentMessage();
Q_INVOKABLE void undoAllFileEditsForCurrentMessage();
Q_INVOKABLE void updateCurrentMessageEditsStats();
Q_INVOKABLE void loadAvailableConfigurations();
Q_INVOKABLE void applyConfiguration(const QString &configName);
QStringList availableConfigurations() const;
QString currentConfiguration() const;
int currentMessageTotalEdits() const;
int currentMessageAppliedEdits() const;
@ -182,6 +189,8 @@ signals:
void currentMessageEditsStatsChanged();
void isThinkingSupportChanged();
void availableConfigurationsChanged();
void currentConfigurationChanged();
private:
void updateFileEditStatus(const QString &editId, const QString &status);
@ -213,6 +222,9 @@ private:
int m_currentMessagePendingEdits{0};
int m_currentMessageRejectedEdits{0};
QString m_lastInfoMessage;
QStringList m_availableConfigurations;
QString m_currentConfiguration;
};
} // namespace QodeAssist::Chat

View File

@ -111,6 +111,19 @@ ChatRootView {
root.isThinkingMode = thinkingMode.checked
}
}
configSelector {
model: root.availableConfigurations
displayText: root.currentConfiguration
onActivated: function(index) {
if (index > 0) {
root.applyConfiguration(root.availableConfigurations[index])
}
}
popup.onAboutToShow: {
root.loadAvailableConfigurations()
}
}
}
ListView {

View File

@ -37,6 +37,7 @@ Rectangle {
property alias agentModeSwitch: agentModeSwitchId
property alias thinkingMode: thinkingModeId
property alias activeRulesCount: activeRulesCountId.text
property alias configSelector: configSelectorId
color: palette.window.hslLightness > 0.5 ?
Qt.darker(palette.window, 1.1) :
@ -238,6 +239,17 @@ Rectangle {
ToolTip.delay: 250
ToolTip.text: qsTr("Current amount tokens in chat and LLM limit threshold")
}
QoAComboBox {
id: configSelectorId
model: []
currentIndex: 0
ToolTip.visible: hovered
ToolTip.delay: 250
ToolTip.text: qsTr("Switch AI configuration")
}
}
}
}