feat: Add removing codeblock wrappers from code completion

This commit is contained in:
Petr Mironychev
2024-11-26 11:26:50 +01:00
parent bfdbc755e3
commit 31f4516e7b
2 changed files with 46 additions and 10 deletions

View File

@ -85,6 +85,8 @@ void RequestHandler::handleLLMResponse(QNetworkReply *reply,
if (isComplete) { if (isComplete) {
auto cleanedCompletion = removeStopWords(accumulatedResponse, auto cleanedCompletion = removeStopWords(accumulatedResponse,
config.promptTemplate->stopWords()); config.promptTemplate->stopWords());
removeCodeBlockWrappers(cleanedCompletion);
emit completionReceived(cleanedCompletion, request, true); emit completionReceived(cleanedCompletion, request, true);
} }
} else if (config.requestType == RequestType::Chat) { } else if (config.requestType == RequestType::Chat) {
@ -115,22 +117,23 @@ void RequestHandler::prepareNetworkRequest(
networkRequest.setRawHeader("Authorization", QString("Bearer %1").arg(apiKey).toUtf8()); networkRequest.setRawHeader("Authorization", QString("Bearer %1").arg(apiKey).toUtf8());
} }
bool RequestHandler::processSingleLineCompletion(QNetworkReply *reply, bool RequestHandler::processSingleLineCompletion(
const QJsonObject &request, QNetworkReply *reply,
const QString &accumulatedResponse, const QJsonObject &request,
const LLMConfig &config) const QString &accumulatedResponse,
const LLMConfig &config)
{ {
int newlinePos = accumulatedResponse.indexOf('\n'); QString cleanedResponse = accumulatedResponse;
removeCodeBlockWrappers(cleanedResponse);
int newlinePos = cleanedResponse.indexOf('\n');
if (newlinePos != -1) { if (newlinePos != -1) {
QString singleLineCompletion = accumulatedResponse.left(newlinePos).trimmed(); QString singleLineCompletion = cleanedResponse.left(newlinePos).trimmed();
singleLineCompletion = removeStopWords(singleLineCompletion, singleLineCompletion
config.promptTemplate->stopWords()); = removeStopWords(singleLineCompletion, config.promptTemplate->stopWords());
emit completionReceived(singleLineCompletion, request, true); emit completionReceived(singleLineCompletion, request, true);
m_accumulatedResponses.remove(reply); m_accumulatedResponses.remove(reply);
reply->abort(); reply->abort();
return true; return true;
} }
return false; return false;
@ -147,4 +150,36 @@ QString RequestHandler::removeStopWords(const QStringView &completion, const QSt
return filteredCompletion; return filteredCompletion;
} }
void RequestHandler::removeCodeBlockWrappers(QString &response)
{
static const QRegularExpression
fullCodeBlockRegex(R"(```[\w\s]*\n([\s\S]*?)```)", QRegularExpression::MultilineOption);
static const QRegularExpression
partialStartBlockRegex(R"(```[\w\s]*\n([\s\S]*?)$)", QRegularExpression::MultilineOption);
static const QRegularExpression
partialEndBlockRegex(R"(^([\s\S]*?)```)", QRegularExpression::MultilineOption);
QRegularExpressionMatchIterator matchIterator = fullCodeBlockRegex.globalMatch(response);
while (matchIterator.hasNext()) {
QRegularExpressionMatch match = matchIterator.next();
QString codeBlock = match.captured(0);
QString codeContent = match.captured(1).trimmed();
response.replace(codeBlock, codeContent);
}
QRegularExpressionMatch startMatch = partialStartBlockRegex.match(response);
if (startMatch.hasMatch()) {
QString partialBlock = startMatch.captured(0);
QString codeContent = startMatch.captured(1).trimmed();
response.replace(partialBlock, codeContent);
}
QRegularExpressionMatch endMatch = partialEndBlockRegex.match(response);
if (endMatch.hasMatch()) {
QString partialBlock = endMatch.captured(0);
QString codeContent = endMatch.captured(1).trimmed();
response.replace(partialBlock, codeContent);
}
}
} // namespace QodeAssist::LLMCore } // namespace QodeAssist::LLMCore

View File

@ -58,6 +58,7 @@ private:
const QString &accumulatedResponse, const QString &accumulatedResponse,
const LLMConfig &config); const LLMConfig &config);
QString removeStopWords(const QStringView &completion, const QStringList &stopWords); QString removeStopWords(const QStringView &completion, const QStringList &stopWords);
void removeCodeBlockWrappers(QString &response);
}; };
} // namespace QodeAssist::LLMCore } // namespace QodeAssist::LLMCore