diff --git a/QodeAssistClient.cpp b/QodeAssistClient.cpp index 34cea5e..d8593ec 100644 --- a/QodeAssistClient.cpp +++ b/QodeAssistClient.cpp @@ -43,6 +43,7 @@ namespace QodeAssist { QodeAssistClient::QodeAssistClient() : LanguageClient::Client(new LLMClientInterface()) + , m_recentCharCount(0) { setName("Qode Assist"); LanguageClient::LanguageFilter filter; @@ -51,6 +52,8 @@ QodeAssistClient::QodeAssistClient() start(); setupConnections(); + + m_typingTimer.start(); } QodeAssistClient::~QodeAssistClient() @@ -86,7 +89,18 @@ void QodeAssistClient::openDocument(TextEditor::TextDocument *document) const int cursorPosition = widget->textCursor().position(); if (cursorPosition < position || cursorPosition > position + charsAdded) return; - scheduleRequest(widget); + + m_recentCharCount += charsAdded; + + if (m_typingTimer.elapsed() + > Settings::generalSettings().autoCompletionTypingInterval()) { + m_recentCharCount = charsAdded; + m_typingTimer.restart(); + } + + if (m_recentCharCount > Settings::generalSettings().autoCompletionCharThreshold()) { + scheduleRequest(widget); + } }); } @@ -130,7 +144,8 @@ void QodeAssistClient::scheduleRequest(TextEditor::TextEditorWidget *editor) connect(timer, &QTimer::timeout, this, [this, editor]() { if (editor && editor->textCursor().position() - == m_scheduledRequests[editor]->property("cursorPosition").toInt()) + == m_scheduledRequests[editor]->property("cursorPosition").toInt() + && m_recentCharCount > Settings::generalSettings().autoCompletionCharThreshold()) requestCompletions(editor); }); connect(editor, &TextEditorWidget::destroyed, this, [this, editor]() { @@ -146,7 +161,6 @@ void QodeAssistClient::scheduleRequest(TextEditor::TextEditorWidget *editor) it.value()->setProperty("cursorPosition", editor->textCursor().position()); it.value()->start(Settings::generalSettings().startSuggestionTimer()); } - void QodeAssistClient::handleCompletions(const GetCompletionRequest::Response &response, TextEditor::TextEditorWidget *editor) { diff --git a/QodeAssistClient.hpp b/QodeAssistClient.hpp index 0271839..2605b26 100644 --- a/QodeAssistClient.hpp +++ b/QodeAssistClient.hpp @@ -55,6 +55,9 @@ class QodeAssistClient : public LanguageClient::Client QHash m_scheduledRequests; QMetaObject::Connection m_documentOpenedConnection; QMetaObject::Connection m_documentClosedConnection; + + QElapsedTimer m_typingTimer; + int m_recentCharCount; }; } // namespace QodeAssist diff --git a/QodeAssistConstants.hpp b/QodeAssistConstants.hpp index 65a4029..774bdca 100644 --- a/QodeAssistConstants.hpp +++ b/QodeAssistConstants.hpp @@ -49,6 +49,8 @@ const char USE_FREQUENCY_PENALTY[] = "QodeAssist.useFrequencyPenalty"; const char FREQUENCY_PENALTY[] = "QodeAssist.frequencyPenalty"; const char PROVIDER_PATHS[] = "QodeAssist.providerPaths"; const char START_SUGGESTION_TIMER[] = "QodeAssist.startSuggestionTimer"; +const char AUTO_COMPLETION_CHAR_THRESHOLD[] = "QodeAssist.autoCompletionCharThreshold"; +const char AUTO_COMPLETION_TYPING_INTERVAL[] = "QodeAssist.autoCompletionTypingInterval"; const char MAX_FILE_THRESHOLD[] = "QodeAssist.maxFileThreshold"; const char OLLAMA_LIVETIME[] = "QodeAssist.ollamaLivetime"; const char SPECIFIC_INSTRUCTIONS[] = "QodeAssist.specificInstractions"; diff --git a/settings/GeneralSettings.cpp b/settings/GeneralSettings.cpp index 8b4eff0..0edb0b0 100644 --- a/settings/GeneralSettings.cpp +++ b/settings/GeneralSettings.cpp @@ -66,6 +66,24 @@ GeneralSettings::GeneralSettings() startSuggestionTimer.setRange(10, 10000); startSuggestionTimer.setDefaultValue(500); + autoCompletionCharThreshold.setSettingsKey(Constants::AUTO_COMPLETION_CHAR_THRESHOLD); + autoCompletionCharThreshold.setLabelText( + Tr::tr("Character threshold for AI suggestion start:")); + autoCompletionCharThreshold.setToolTip( + Tr::tr("The number of characters that need to be typed within the typing interval " + "before an AI suggestion request is sent.")); + autoCompletionCharThreshold.setRange(1, 10); + autoCompletionCharThreshold.setDefaultValue(2); + + autoCompletionTypingInterval.setSettingsKey(Constants::AUTO_COMPLETION_TYPING_INTERVAL); + autoCompletionTypingInterval.setLabelText( + Tr::tr("Typing interval for AI suggestion start(ms):")); + autoCompletionTypingInterval.setToolTip( + Tr::tr("The time window (in milliseconds) during which the character threshold " + "must be met to trigger an AI suggestion request.")); + autoCompletionTypingInterval.setRange(500, 5000); + autoCompletionTypingInterval.setDefaultValue(2000); + llmProviders.setSettingsKey(Constants::LLM_PROVIDERS); llmProviders.setDisplayName(Tr::tr("FIM Provider:")); llmProviders.setDisplayStyle(Utils::SelectionAspect::DisplayStyle::ComboBox); @@ -121,6 +139,8 @@ GeneralSettings::GeneralSettings() auto rootLayout = Column{Row{enableQodeAssist, Stretch{1}, resetToDefaults}, enableAutoComplete, startSuggestionTimer, + autoCompletionCharThreshold, + autoCompletionTypingInterval, multiLineCompletion, Space{8}, enableLogging, @@ -208,6 +228,8 @@ void GeneralSettings::resetPageToDefaults() resetAspect(fimPrompts); resetAspect(enableLogging); resetAspect(startSuggestionTimer); + resetAspect(autoCompletionTypingInterval); + resetAspect(autoCompletionCharThreshold); } fimPrompts.setStringValue("StarCoder2"); diff --git a/settings/GeneralSettings.hpp b/settings/GeneralSettings.hpp index 4014a74..d82da9c 100644 --- a/settings/GeneralSettings.hpp +++ b/settings/GeneralSettings.hpp @@ -35,6 +35,8 @@ class GeneralSettings : public Utils::AspectContainer Utils::BoolAspect multiLineCompletion{this}; Utils::BoolAspect enableLogging{this}; Utils::IntegerAspect startSuggestionTimer{this}; + Utils::IntegerAspect autoCompletionCharThreshold{this}; + Utils::IntegerAspect autoCompletionTypingInterval{this}; Utils::SelectionAspect llmProviders{this}; Utils::StringAspect url{this};