Skip to content

Commit 6c32364

Browse files
authoredMar 8, 2025
refactor: Inject settings into LLMClientInterface (#114)
This reduces reliance on global state and makes it more possible to test the code.
1 parent 3a494d5 commit 6c32364

5 files changed

+40
-31
lines changed
 

‎LLMClientInterface.cpp

+29-27
Original file line numberDiff line numberDiff line change
@@ -45,8 +45,12 @@ QString extractFilePathFromRequest(const QJsonObject &request)
4545
return QUrl(uri).toLocalFile();
4646
}
4747

48-
LLMClientInterface::LLMClientInterface()
48+
LLMClientInterface::LLMClientInterface(
49+
const Settings::GeneralSettings &generalSettings,
50+
const Settings::CodeCompletionSettings &completeSettings)
4951
: m_requestHandler(this)
52+
, m_generalSettings(generalSettings)
53+
, m_completeSettings(completeSettings)
5054
{
5155
connect(
5256
&m_requestHandler,
@@ -158,16 +162,15 @@ void LLMClientInterface::handleExit(const QJsonObject &request)
158162
void LLMClientInterface::handleCompletion(const QJsonObject &request)
159163
{
160164
auto updatedContext = prepareContext(request);
161-
auto &completeSettings = Settings::codeCompletionSettings();
162-
auto &generalSettings = Settings::generalSettings();
163165

164-
bool isPreset1Active = Context::ContextManager::isSpecifyCompletion(request, generalSettings);
166+
bool isPreset1Active = Context::ContextManager::isSpecifyCompletion(request, m_generalSettings);
165167

166-
const auto providerName = !isPreset1Active ? generalSettings.ccProvider()
167-
: generalSettings.ccPreset1Provider();
168-
const auto modelName = !isPreset1Active ? generalSettings.ccModel()
169-
: generalSettings.ccPreset1Model();
170-
const auto url = !isPreset1Active ? generalSettings.ccUrl() : generalSettings.ccPreset1Url();
168+
const auto providerName = !isPreset1Active ? m_generalSettings.ccProvider()
169+
: m_generalSettings.ccPreset1Provider();
170+
const auto modelName = !isPreset1Active ? m_generalSettings.ccModel()
171+
: m_generalSettings.ccPreset1Model();
172+
const auto url = !isPreset1Active ? m_generalSettings.ccUrl()
173+
: m_generalSettings.ccPreset1Url();
171174

172175
const auto provider = LLMCore::ProvidersManager::instance().getProviderByName(providerName);
173176

@@ -176,8 +179,8 @@ void LLMClientInterface::handleCompletion(const QJsonObject &request)
176179
return;
177180
}
178181

179-
auto templateName = !isPreset1Active ? generalSettings.ccTemplate()
180-
: generalSettings.ccPreset1Template();
182+
auto templateName = !isPreset1Active ? m_generalSettings.ccTemplate()
183+
: m_generalSettings.ccPreset1Template();
181184

182185
auto promptTemplate = LLMCore::PromptTemplateManager::instance().getFimTemplateByName(
183186
templateName);
@@ -194,39 +197,39 @@ void LLMClientInterface::handleCompletion(const QJsonObject &request)
194197
config.promptTemplate = promptTemplate;
195198
// TODO refactor networking
196199
if (provider->providerID() == LLMCore::ProviderID::GoogleAI) {
197-
QString stream = completeSettings.stream() ? QString{"streamGenerateContent?alt=sse"}
198-
: QString{"generateContent?"};
200+
QString stream = m_completeSettings.stream() ? QString{"streamGenerateContent?alt=sse"}
201+
: QString{"generateContent?"};
199202
config.url = QUrl(QString("%1/models/%2:%3").arg(url, modelName, stream));
200203
} else {
201204
config.url = QUrl(QString("%1%2").arg(
202205
url,
203206
promptTemplate->type() == LLMCore::TemplateType::FIM ? provider->completionEndpoint()
204207
: provider->chatEndpoint()));
205-
config.providerRequest = {{"model", modelName}, {"stream", completeSettings.stream()}};
208+
config.providerRequest = {{"model", modelName}, {"stream", m_completeSettings.stream()}};
206209
}
207210
config.apiKey = provider->apiKey();
208-
config.multiLineCompletion = completeSettings.multiLineCompletion();
211+
config.multiLineCompletion = m_completeSettings.multiLineCompletion();
209212

210213
const auto stopWords = QJsonArray::fromStringList(config.promptTemplate->stopWords());
211214
if (!stopWords.isEmpty())
212215
config.providerRequest["stop"] = stopWords;
213216

214217
QString systemPrompt;
215-
if (completeSettings.useSystemPrompt())
218+
if (m_completeSettings.useSystemPrompt())
216219
systemPrompt.append(
217-
completeSettings.useUserMessageTemplateForCC()
220+
m_completeSettings.useUserMessageTemplateForCC()
218221
&& promptTemplate->type() == LLMCore::TemplateType::Chat
219-
? completeSettings.systemPromptForNonFimModels()
220-
: completeSettings.systemPrompt());
222+
? m_completeSettings.systemPromptForNonFimModels()
223+
: m_completeSettings.systemPrompt());
221224
if (updatedContext.fileContext.has_value())
222225
systemPrompt.append(updatedContext.fileContext.value());
223226

224227
updatedContext.systemPrompt = systemPrompt;
225228

226229
if (promptTemplate->type() == LLMCore::TemplateType::Chat) {
227230
QString userMessage;
228-
if (completeSettings.useUserMessageTemplateForCC()) {
229-
userMessage = completeSettings.processMessageToFIM(
231+
if (m_completeSettings.useUserMessageTemplateForCC()) {
232+
userMessage = m_completeSettings.processMessageToFIM(
230233
updatedContext.prefix.value_or(""), updatedContext.suffix.value_or(""));
231234
} else {
232235
userMessage = updatedContext.prefix.value_or("") + updatedContext.suffix.value_or("");
@@ -274,17 +277,16 @@ LLMCore::ContextData LLMClientInterface::prepareContext(
274277

275278
Context::DocumentContextReader reader(
276279
textDocument->document(), textDocument->mimeType(), textDocument->filePath().toString());
277-
return reader.prepareContext(lineNumber, cursorPosition, Settings::codeCompletionSettings());
280+
return reader.prepareContext(lineNumber, cursorPosition, m_completeSettings);
278281
}
279282

280283
void LLMClientInterface::sendCompletionToClient(
281284
const QString &completion, const QJsonObject &request, bool isComplete)
282285
{
283-
auto &generalSettings = Settings::generalSettings();
284-
bool isPreset1Active = Context::ContextManager::isSpecifyCompletion(request, generalSettings);
286+
bool isPreset1Active = Context::ContextManager::isSpecifyCompletion(request, m_generalSettings);
285287

286-
auto templateName = !isPreset1Active ? generalSettings.ccTemplate()
287-
: generalSettings.ccPreset1Template();
288+
auto templateName = !isPreset1Active ? m_generalSettings.ccTemplate()
289+
: m_generalSettings.ccPreset1Template();
288290

289291
auto promptTemplate = LLMCore::PromptTemplateManager::instance().getFimTemplateByName(
290292
templateName);
@@ -303,7 +305,7 @@ void LLMClientInterface::sendCompletionToClient(
303305

304306
QString processedCompletion
305307
= promptTemplate->type() == LLMCore::TemplateType::Chat
306-
&& Settings::codeCompletionSettings().smartProcessInstuctText()
308+
&& m_completeSettings.smartProcessInstuctText()
307309
? CodeHandler::processText(completion, extractFilePathFromRequest(request))
308310
: completion;
309311

‎LLMClientInterface.hpp

+7-1
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,8 @@
2525
#include <context/ProgrammingLanguage.hpp>
2626
#include <llmcore/ContextData.hpp>
2727
#include <llmcore/RequestHandler.hpp>
28+
#include <settings/CodeCompletionSettings.hpp>
29+
#include <settings/GeneralSettings.hpp>
2830

2931
class QNetworkReply;
3032
class QNetworkAccessManager;
@@ -36,7 +38,9 @@ class LLMClientInterface : public LanguageClient::BaseClientInterface
3638
Q_OBJECT
3739

3840
public:
39-
LLMClientInterface();
41+
LLMClientInterface(
42+
const Settings::GeneralSettings &generalSettings,
43+
const Settings::CodeCompletionSettings &completeSettings);
4044

4145
Utils::FilePath serverDeviceTemplate() const override;
4246

@@ -61,6 +65,8 @@ class LLMClientInterface : public LanguageClient::BaseClientInterface
6165
LLMCore::ContextData prepareContext(
6266
const QJsonObject &request, const QStringView &accumulatedCompletion = QString{});
6367

68+
const Settings::CodeCompletionSettings &m_completeSettings;
69+
const Settings::GeneralSettings &m_generalSettings;
6470
LLMCore::RequestHandler m_requestHandler;
6571
QElapsedTimer m_completionTimer;
6672
QMap<QString, qint64> m_requestStartTimes;

‎QodeAssistClient.cpp

+2-1
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,8 @@ using namespace Core;
4545
namespace QodeAssist {
4646

4747
QodeAssistClient::QodeAssistClient()
48-
: LanguageClient::Client(new LLMClientInterface())
48+
: LanguageClient::Client(
49+
new LLMClientInterface(Settings::generalSettings(), Settings::codeCompletionSettings()))
4950
, m_recentCharCount(0)
5051
{
5152
setName("Qode Assist");

‎settings/CodeCompletionSettings.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -358,7 +358,7 @@ void CodeCompletionSettings::resetSettingsToDefaults()
358358
}
359359
}
360360

361-
QString CodeCompletionSettings::processMessageToFIM(const QString &prefix, const QString &suffix)
361+
QString CodeCompletionSettings::processMessageToFIM(const QString &prefix, const QString &suffix) const
362362
{
363363
QString result = userMessageTemplateForCC();
364364
result.replace("${prefix}", prefix);

‎settings/CodeCompletionSettings.hpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ class CodeCompletionSettings : public Utils::AspectContainer
7979
// API Configuration Settings
8080
Utils::StringAspect apiKey{this};
8181

82-
QString processMessageToFIM(const QString &prefix, const QString &suffix);
82+
QString processMessageToFIM(const QString &prefix, const QString &suffix) const;
8383

8484
private:
8585
void setupConnections();

0 commit comments

Comments
 (0)