refactor: Optimize SystemPrompt for code completion

This commit is contained in:
Petr Mironychev 2025-02-16 16:53:03 +01:00
parent 60936f6d84
commit bd25736a55
4 changed files with 32 additions and 34 deletions

View File

@ -217,10 +217,8 @@ void LLMClientInterface::handleCompletion(const QJsonObject &request)
QString userMessage; QString userMessage;
if (completeSettings.useUserMessageTemplateForCC() if (completeSettings.useUserMessageTemplateForCC()
&& promptTemplate->type() == LLMCore::TemplateType::Chat) { && promptTemplate->type() == LLMCore::TemplateType::Chat) {
userMessage = processMessageToFIM( userMessage
completeSettings.userMessageTemplateForCC(), = completeSettings.processMessageToFIM(updatedContext.prefix, updatedContext.suffix);
updatedContext.prefix,
updatedContext.suffix);
} else { } else {
userMessage = updatedContext.prefix; userMessage = updatedContext.prefix;
} }
@ -246,15 +244,6 @@ void LLMClientInterface::handleCompletion(const QJsonObject &request)
m_requestHandler.sendLLMRequest(config, request); m_requestHandler.sendLLMRequest(config, request);
} }
QString LLMClientInterface::processMessageToFIM(
const QString &templateText, const QString &prefix, const QString &suffix)
{
QString result = templateText;
result.replace("${prefix}", prefix);
result.replace("${suffix}", suffix);
return result;
}
LLMCore::ContextData LLMClientInterface::prepareContext(const QJsonObject &request, LLMCore::ContextData LLMClientInterface::prepareContext(const QJsonObject &request,
const QStringView &accumulatedCompletion) const QStringView &accumulatedCompletion)
{ {

View File

@ -71,8 +71,6 @@ private:
void startTimeMeasurement(const QString &requestId); void startTimeMeasurement(const QString &requestId);
void endTimeMeasurement(const QString &requestId); void endTimeMeasurement(const QString &requestId);
void logPerformance(const QString &requestId, const QString &operation, qint64 elapsedMs); void logPerformance(const QString &requestId, const QString &operation, qint64 elapsedMs);
QString processMessageToFIM(
const QString &templateText, const QString &prefix, const QString &suffix);
}; };
} // namespace QodeAssist } // namespace QodeAssist

View File

@ -152,25 +152,26 @@ CodeCompletionSettings::CodeCompletionSettings()
systemPrompt.setSettingsKey(Constants::CC_SYSTEM_PROMPT); systemPrompt.setSettingsKey(Constants::CC_SYSTEM_PROMPT);
systemPrompt.setDisplayStyle(Utils::StringAspect::TextEditDisplay); systemPrompt.setDisplayStyle(Utils::StringAspect::TextEditDisplay);
systemPrompt.setDefaultValue( systemPrompt.setDefaultValue(
"You are an expert in C++, Qt, and QML programming. Your task is to provide code " "You are an expert C++, Qt, and QML code completion assistant. Your task is to provide "
"completion by continuing exactly from the cursor position, without repeating any " "precise and contextually appropriate code completions.\n\n"
"characters that are already typed before the cursor. For example, if \"fo\" is typed and " "Core Requirements:\n"
"cursor is after \"fo\", suggest only \"r\" to complete \"for\", not the full word.\n\n" "1. Continue code exactly from the cursor position, ensuring it properly connects with any "
"Rules:\n" "existing code after the cursor\n"
"1. Continue the code exactly from the cursor position\n" "2. Never repeat existing code before or after the cursor\n"
"2. Never repeat characters that appear before the cursor\n" "Specific Guidelines:\n"
"3. Complete up to the first unmatched closing parenthesis or semicolon\n" "- For function calls: Complete parameters with appropriate types and names\n"
"4. Provide only the new characters needed to complete the code\n" "- For class members: Respect access modifiers and class conventions\n"
"5. Format your suggestion as a code block\n\n" "- Respect existing indentation and formatting\n"
"Context format:\n" "- Consider scope and visibility of referenced symbols\n"
"- Ensure seamless integration with code both before and after the cursor\n\n"
"Context Format:\n"
"<code_context>\n" "<code_context>\n"
"Before:{{code before cursor}}\n" "{{code before cursor}}<cursor>{{code after cursor}}\n"
"<cursor>\n"
"After:{{code after cursor}}\n"
"</code_context>\n\n" "</code_context>\n\n"
"Output format: Format your suggestion as a code block with language. Do not include any " "Response Format:\n"
"comments or " "- No explanations or comments\n"
"descriptions with your code suggestion."); "- Only include new characters needed to create valid code\n"
"- Should be codeblock with language\n");
useUserMessageTemplateForCC.setSettingsKey(Constants::CC_USE_USER_TEMPLATE); useUserMessageTemplateForCC.setSettingsKey(Constants::CC_USE_USER_TEMPLATE);
useUserMessageTemplateForCC.setDefaultValue(true); useUserMessageTemplateForCC.setDefaultValue(true);
@ -179,8 +180,8 @@ CodeCompletionSettings::CodeCompletionSettings()
userMessageTemplateForCC.setSettingsKey(Constants::CC_USER_TEMPLATE); userMessageTemplateForCC.setSettingsKey(Constants::CC_USER_TEMPLATE);
userMessageTemplateForCC.setDisplayStyle(Utils::StringAspect::TextEditDisplay); userMessageTemplateForCC.setDisplayStyle(Utils::StringAspect::TextEditDisplay);
userMessageTemplateForCC.setDefaultValue( userMessageTemplateForCC.setDefaultValue(
"Here is the code context with insertion points: " "Here is the code context with insertion points:\n"
"<code_context>\nBefore:${prefix}\n<cursor>\nAfter:${suffix}\n</code_context>\n\n"); "<code_context>\n${prefix}<cursor>${suffix}\n</code_context>\n");
useProjectChangesCache.setSettingsKey(Constants::CC_USE_PROJECT_CHANGES_CACHE); useProjectChangesCache.setSettingsKey(Constants::CC_USE_PROJECT_CHANGES_CACHE);
useProjectChangesCache.setDefaultValue(true); useProjectChangesCache.setDefaultValue(true);
@ -340,6 +341,14 @@ void CodeCompletionSettings::resetSettingsToDefaults()
} }
} }
QString CodeCompletionSettings::processMessageToFIM(const QString &prefix, const QString &suffix)
{
QString result = userMessageTemplateForCC();
result.replace("${prefix}", prefix);
result.replace("${suffix}", suffix);
return result;
}
class CodeCompletionSettingsPage : public Core::IOptionsPage class CodeCompletionSettingsPage : public Core::IOptionsPage
{ {
public: public:

View File

@ -78,6 +78,8 @@ public:
// API Configuration Settings // API Configuration Settings
Utils::StringAspect apiKey{this}; Utils::StringAspect apiKey{this};
QString processMessageToFIM(const QString &prefix, const QString &suffix);
private: private:
void setupConnections(); void setupConnections();
void resetSettingsToDefaults(); void resetSettingsToDefaults();