From 5e813ba4023c8428b182d9eed0cc139b08c775a3 Mon Sep 17 00:00:00 2001 From: Petr Mironychev <9195189+Palm1r@users.noreply.github.com> Date: Sat, 16 Nov 2024 10:20:57 +0100 Subject: [PATCH] Fix systemPrompt and context working --- ChatView/ChatModel.cpp | 4 ++-- ChatView/ChatModel.hpp | 2 +- ChatView/ClientInterface.cpp | 15 ++++++--------- DocumentContextReader.cpp | 23 ++++++++--------------- DocumentContextReader.hpp | 1 - LLMClientInterface.cpp | 7 ++++++- llmcore/ContextData.hpp | 2 +- settings/CodeCompletionSettings.cpp | 2 +- templates/CodeLlamaFim.hpp | 6 ++---- templates/CustomFimTemplate.hpp | 1 - templates/DeepSeekCoderFim.hpp | 6 ++---- templates/StarCoder2Fim.hpp | 6 ++---- 12 files changed, 31 insertions(+), 44 deletions(-) diff --git a/ChatView/ChatModel.cpp b/ChatView/ChatModel.cpp index d39c994..4740aa6 100644 --- a/ChatView/ChatModel.cpp +++ b/ChatView/ChatModel.cpp @@ -152,11 +152,11 @@ QList ChatModel::processMessageContent(const QString &content) cons return parts; } -QJsonArray ChatModel::prepareMessagesForRequest(LLMCore::ContextData context) const +QJsonArray ChatModel::prepareMessagesForRequest(const QString &systemPrompt) const { QJsonArray messages; - messages.append(QJsonObject{{"role", "system"}, {"content", context.systemPrompt}}); + messages.append(QJsonObject{{"role", "system"}, {"content", systemPrompt}}); for (const auto &message : m_messages) { QString role; diff --git a/ChatView/ChatModel.hpp b/ChatView/ChatModel.hpp index af0c312..2be2563 100644 --- a/ChatView/ChatModel.hpp +++ b/ChatView/ChatModel.hpp @@ -60,7 +60,7 @@ public: Q_INVOKABLE QList processMessageContent(const QString &content) const; QVector getChatHistory() const; - QJsonArray prepareMessagesForRequest(LLMCore::ContextData context) const; + QJsonArray prepareMessagesForRequest(const QString &systemPrompt) const; int totalTokens() const; int tokensThreshold() const; diff --git a/ChatView/ClientInterface.cpp b/ChatView/ClientInterface.cpp index 483d193..6235b3b 100644 --- a/ChatView/ClientInterface.cpp +++ b/ChatView/ClientInterface.cpp @@ -81,24 +81,21 @@ void ClientInterface::sendMessage(const QString &message, bool includeCurrentFil context.prefix = message; context.suffix = ""; - QString systemPrompt = chatAssistantSettings.systemPrompt(); + QString systemPrompt; + if (chatAssistantSettings.useSystemPrompt()) + systemPrompt = chatAssistantSettings.systemPrompt(); + if (includeCurrentFile) { QString fileContext = getCurrentFileContext(); if (!fileContext.isEmpty()) { - context.systemPrompt = QString("%1\n\n%2").arg(systemPrompt, fileContext); - LOG_MESSAGE("Using system prompt with file context"); - } else { - context.systemPrompt = systemPrompt; - LOG_MESSAGE("Failed to get file context, using default system prompt"); + systemPrompt = systemPrompt.append(fileContext); } - } else { - context.systemPrompt = systemPrompt; } QJsonObject providerRequest; providerRequest["model"] = Settings::generalSettings().caModel(); providerRequest["stream"] = true; - providerRequest["messages"] = m_chatModel->prepareMessagesForRequest(context); + providerRequest["messages"] = m_chatModel->prepareMessagesForRequest(systemPrompt); if (promptTemplate) promptTemplate->prepareRequest(providerRequest, context); diff --git a/DocumentContextReader.cpp b/DocumentContextReader.cpp index 2a2a864..09c09e0 100644 --- a/DocumentContextReader.cpp +++ b/DocumentContextReader.cpp @@ -207,9 +207,15 @@ LLMCore::ContextData DocumentContextReader::prepareContext(int lineNumber, int c { QString contextBefore = getContextBefore(lineNumber, cursorPosition); QString contextAfter = getContextAfter(lineNumber, cursorPosition); - QString instructions = getInstructions(); - return {contextBefore, contextAfter, instructions}; + QString fileContext; + if (Settings::codeCompletionSettings().useFilePathInContext()) + fileContext += getLanguageAndFileInfo(); + + if (Settings::codeCompletionSettings().useProjectChangesCache()) + fileContext += ChangesManager::instance().getRecentChangesContext(m_textDocument); + + return {contextBefore, contextAfter, fileContext}; } QString DocumentContextReader::getContextBefore(int lineNumber, int cursorPosition) const @@ -239,17 +245,4 @@ QString DocumentContextReader::getContextAfter(int lineNumber, int cursorPositio } } -QString DocumentContextReader::getInstructions() const -{ - QString instructions; - - if (Settings::codeCompletionSettings().useFilePathInContext()) - instructions += getLanguageAndFileInfo(); - - if (Settings::codeCompletionSettings().useProjectChangesCache()) - instructions += ChangesManager::instance().getRecentChangesContext(m_textDocument); - - return instructions; -} - } // namespace QodeAssist diff --git a/DocumentContextReader.hpp b/DocumentContextReader.hpp index c9a5867..3172336 100644 --- a/DocumentContextReader.hpp +++ b/DocumentContextReader.hpp @@ -54,7 +54,6 @@ public: private: QString getContextBefore(int lineNumber, int cursorPosition) const; QString getContextAfter(int lineNumber, int cursorPosition) const; - QString getInstructions() const; private: TextEditor::TextDocument *m_textDocument; diff --git a/LLMClientInterface.cpp b/LLMClientInterface.cpp index 5a27114..335d1ea 100644 --- a/LLMClientInterface.cpp +++ b/LLMClientInterface.cpp @@ -169,8 +169,13 @@ void LLMClientInterface::handleCompletion(const QJsonObject &request) QJsonArray::fromStringList(config.promptTemplate->stopWords())}}; config.multiLineCompletion = completeSettings.multiLineCompletion(); + QString systemPrompt; if (completeSettings.useSystemPrompt()) - config.providerRequest["system"] = completeSettings.systemPrompt(); + systemPrompt.append(completeSettings.systemPrompt()); + if (!updatedContext.fileContext.isEmpty()) + systemPrompt.append(updatedContext.fileContext); + + config.providerRequest["system"] = systemPrompt; config.promptTemplate->prepareRequest(config.providerRequest, updatedContext); config.provider->prepareRequest(config.providerRequest, LLMCore::RequestType::Fim); diff --git a/llmcore/ContextData.hpp b/llmcore/ContextData.hpp index 6df13d3..4d0ea92 100644 --- a/llmcore/ContextData.hpp +++ b/llmcore/ContextData.hpp @@ -27,7 +27,7 @@ struct ContextData { QString prefix; QString suffix; - QString systemPrompt; + QString fileContext; }; } // namespace QodeAssist::LLMCore diff --git a/settings/CodeCompletionSettings.cpp b/settings/CodeCompletionSettings.cpp index ebcb46e..dbc73d7 100644 --- a/settings/CodeCompletionSettings.cpp +++ b/settings/CodeCompletionSettings.cpp @@ -148,7 +148,7 @@ CodeCompletionSettings::CodeCompletionSettings() "and contextually appropriate code suggestions."); useFilePathInContext.setSettingsKey(Constants::CC_USE_FILE_PATH_IN_CONTEXT); - useFilePathInContext.setDefaultValue(false); + useFilePathInContext.setDefaultValue(true); useFilePathInContext.setLabelText(Tr::tr("Use File Path in Context")); useProjectChangesCache.setSettingsKey(Constants::CC_USE_PROJECT_CHANGES_CACHE); diff --git a/templates/CodeLlamaFim.hpp b/templates/CodeLlamaFim.hpp index 58ed26d..7f6945f 100644 --- a/templates/CodeLlamaFim.hpp +++ b/templates/CodeLlamaFim.hpp @@ -28,7 +28,7 @@ class CodeLlamaFim : public LLMCore::PromptTemplate public: LLMCore::TemplateType type() const override { return LLMCore::TemplateType::Fim; } QString name() const override { return "CodeLlama FIM"; } - QString promptTemplate() const override { return "%1
 %2 %3 "; }
+    QString promptTemplate() const override { return "
 %1 %2 "; }
     QStringList stopWords() const override
     {
         return QStringList() << "" << "
" << "";
@@ -36,9 +36,7 @@ public:
 
     void prepareRequest(QJsonObject &request, const LLMCore::ContextData &context) const override
     {
-        QString formattedPrompt = promptTemplate().arg(context.systemPrompt,
-                                                       context.prefix,
-                                                       context.suffix);
+        QString formattedPrompt = promptTemplate().arg(context.prefix, context.suffix);
         request["prompt"] = formattedPrompt;
     }
 };
diff --git a/templates/CustomFimTemplate.hpp b/templates/CustomFimTemplate.hpp
index 9fe64da..9180c32 100644
--- a/templates/CustomFimTemplate.hpp
+++ b/templates/CustomFimTemplate.hpp
@@ -62,7 +62,6 @@ private:
     {
         if (value.isString()) {
             QString str = value.toString();
-            str.replace("{{QODE_INSTRUCTIONS}}", context.systemPrompt);
             str.replace("{{QODE_PREFIX}}", context.prefix);
             str.replace("{{QODE_SUFFIX}}", context.suffix);
             return str;
diff --git a/templates/DeepSeekCoderFim.hpp b/templates/DeepSeekCoderFim.hpp
index 10f269d..d7aa98f 100644
--- a/templates/DeepSeekCoderFim.hpp
+++ b/templates/DeepSeekCoderFim.hpp
@@ -30,14 +30,12 @@ public:
     QString name() const override { return "DeepSeekCoder FIM"; }
     QString promptTemplate() const override
     {
-        return "%1<|fim▁begin|>%2<|fim▁hole|>%3<|fim▁end|>";
+        return "<|fim▁begin|>%1<|fim▁hole|>%2<|fim▁end|>";
     }
     QStringList stopWords() const override { return QStringList(); }
     void prepareRequest(QJsonObject &request, const LLMCore::ContextData &context) const override
     {
-        QString formattedPrompt = promptTemplate().arg(context.systemPrompt,
-                                                       context.prefix,
-                                                       context.suffix);
+        QString formattedPrompt = promptTemplate().arg(context.prefix, context.suffix);
         request["prompt"] = formattedPrompt;
     }
 };
diff --git a/templates/StarCoder2Fim.hpp b/templates/StarCoder2Fim.hpp
index cd18a6b..e0d3ca2 100644
--- a/templates/StarCoder2Fim.hpp
+++ b/templates/StarCoder2Fim.hpp
@@ -28,7 +28,7 @@ class StarCoder2Fim : public LLMCore::PromptTemplate
 public:
     LLMCore::TemplateType type() const override { return LLMCore::TemplateType::Fim; }
     QString name() const override { return "StarCoder2 FIM"; }
-    QString promptTemplate() const override { return "%1%2%3"; }
+    QString promptTemplate() const override { return "%1%2"; }
     QStringList stopWords() const override
     {
         return QStringList() << "<|endoftext|>" << "" << "" << ""
@@ -36,9 +36,7 @@ public:
     }
     void prepareRequest(QJsonObject &request, const LLMCore::ContextData &context) const override
     {
-        QString formattedPrompt = promptTemplate().arg(context.systemPrompt,
-                                                       context.prefix,
-                                                       context.suffix);
+        QString formattedPrompt = promptTemplate().arg(context.prefix, context.suffix);
         request["prompt"] = formattedPrompt;
     }
 };