fix: Cleanup accumulated text in one request

This commit is contained in:
Petr Mironychev
2025-10-10 16:45:23 +02:00
parent 84770abb20
commit ebd71daf3d
9 changed files with 41 additions and 4 deletions

View File

@ -151,6 +151,12 @@ void ClientInterface::sendMessage(
m_chatModel, m_chatModel,
&ChatModel::updateToolResult, &ChatModel::updateToolResult,
Qt::UniqueConnection); Qt::UniqueConnection);
connect(
provider,
&LLMCore::Provider::continuationStarted,
this,
&ClientInterface::handleCleanAccumulatedData,
Qt::UniqueConnection);
provider->sendRequest(requestId, config.url, config.providerRequest); provider->sendRequest(requestId, config.url, config.providerRequest);
} }
@ -279,4 +285,10 @@ void ClientInterface::handleRequestFailed(const QString &requestId, const QStrin
m_accumulatedResponses.remove(requestId); m_accumulatedResponses.remove(requestId);
} }
void ClientInterface::handleCleanAccumulatedData(const QString &requestId)
{
m_accumulatedResponses[requestId].clear();
LOG_MESSAGE(QString("Cleared accumulated responses for continuation request %1").arg(requestId));
}
} // namespace QodeAssist::Chat } // namespace QodeAssist::Chat

View File

@ -56,6 +56,7 @@ private slots:
void handlePartialResponse(const QString &requestId, const QString &partialText); void handlePartialResponse(const QString &requestId, const QString &partialText);
void handleFullResponse(const QString &requestId, const QString &fullText); void handleFullResponse(const QString &requestId, const QString &fullText);
void handleRequestFailed(const QString &requestId, const QString &error); void handleRequestFailed(const QString &requestId, const QString &error);
void handleCleanAccumulatedData(const QString &requestId);
private: private:
void handleLLMResponse(const QString &response, const QJsonObject &request, bool isComplete); void handleLLMResponse(const QString &response, const QJsonObject &request, bool isComplete);

View File

@ -83,7 +83,6 @@ signals:
void fullResponseReceived( void fullResponseReceived(
const QodeAssist::LLMCore::RequestID &requestId, const QString &fullText); const QodeAssist::LLMCore::RequestID &requestId, const QString &fullText);
void requestFailed(const QodeAssist::LLMCore::RequestID &requestId, const QString &error); void requestFailed(const QodeAssist::LLMCore::RequestID &requestId, const QString &error);
signals:
void toolExecutionStarted( void toolExecutionStarted(
const QString &requestId, const QString &toolId, const QString &toolName); const QString &requestId, const QString &toolId, const QString &toolName);
void toolExecutionCompleted( void toolExecutionCompleted(
@ -91,6 +90,7 @@ signals:
const QString &toolId, const QString &toolId,
const QString &toolName, const QString &toolName,
const QString &result); const QString &result);
void continuationStarted(const QodeAssist::LLMCore::RequestID &requestId);
protected: protected:
QJsonObject parseEventLine(const QString &line); QJsonObject parseEventLine(const QString &line);

View File

@ -196,9 +196,7 @@ LLMCore::ProviderID ClaudeProvider::providerID() const
void ClaudeProvider::sendRequest( void ClaudeProvider::sendRequest(
const LLMCore::RequestID &requestId, const QUrl &url, const QJsonObject &payload) const LLMCore::RequestID &requestId, const QUrl &url, const QJsonObject &payload)
{ {
if (m_dataBuffers.contains(requestId)) { if (!m_messages.contains(requestId)) {
m_dataBuffers[requestId].responseContent.clear();
} else {
m_dataBuffers[requestId].clear(); m_dataBuffers[requestId].clear();
} }
@ -340,6 +338,7 @@ void ClaudeProvider::processStreamEvent(const QString &requestId, const QJsonObj
if (eventType == "message_start") { if (eventType == "message_start") {
message->startNewContinuation(); message->startNewContinuation();
emit continuationStarted(requestId);
LOG_MESSAGE(QString("Starting NEW continuation for request %1").arg(requestId)); LOG_MESSAGE(QString("Starting NEW continuation for request %1").arg(requestId));
} else if (eventType == "content_block_start") { } else if (eventType == "content_block_start") {

View File

@ -320,6 +320,11 @@ void LMStudioProvider::processStreamChunk(const QString &requestId, const QJsonO
message = new OpenAIMessage(this); message = new OpenAIMessage(this);
m_messages[requestId] = message; m_messages[requestId] = message;
LOG_MESSAGE(QString("Created NEW OpenAIMessage for request %1").arg(requestId)); LOG_MESSAGE(QString("Created NEW OpenAIMessage for request %1").arg(requestId));
if (m_dataBuffers.contains(requestId)) {
emit continuationStarted(requestId);
LOG_MESSAGE(QString("Starting continuation for request %1").arg(requestId));
}
} }
if (delta.contains("content") && !delta["content"].isNull()) { if (delta.contains("content") && !delta["content"].isNull()) {

View File

@ -324,6 +324,11 @@ void LlamaCppProvider::processStreamChunk(const QString &requestId, const QJsonO
message = new OpenAIMessage(this); message = new OpenAIMessage(this);
m_messages[requestId] = message; m_messages[requestId] = message;
LOG_MESSAGE(QString("Created NEW OpenAIMessage for llama.cpp request %1").arg(requestId)); LOG_MESSAGE(QString("Created NEW OpenAIMessage for llama.cpp request %1").arg(requestId));
if (m_dataBuffers.contains(requestId)) {
emit continuationStarted(requestId);
LOG_MESSAGE(QString("Starting continuation for request %1").arg(requestId));
}
} }
if (delta.contains("content") && !delta["content"].isNull()) { if (delta.contains("content") && !delta["content"].isNull()) {

View File

@ -341,6 +341,11 @@ void MistralAIProvider::processStreamChunk(const QString &requestId, const QJson
message = new OpenAIMessage(this); message = new OpenAIMessage(this);
m_messages[requestId] = message; m_messages[requestId] = message;
LOG_MESSAGE(QString("Created NEW OpenAIMessage for Mistral request %1").arg(requestId)); LOG_MESSAGE(QString("Created NEW OpenAIMessage for Mistral request %1").arg(requestId));
if (m_dataBuffers.contains(requestId)) {
emit continuationStarted(requestId);
LOG_MESSAGE(QString("Starting continuation for request %1").arg(requestId));
}
} }
if (delta.contains("content") && !delta["content"].isNull()) { if (delta.contains("content") && !delta["content"].isNull()) {

View File

@ -298,6 +298,11 @@ void OpenAICompatProvider::processStreamChunk(const QString &requestId, const QJ
message = new OpenAIMessage(this); message = new OpenAIMessage(this);
m_messages[requestId] = message; m_messages[requestId] = message;
LOG_MESSAGE(QString("Created NEW OpenAIMessage for request %1").arg(requestId)); LOG_MESSAGE(QString("Created NEW OpenAIMessage for request %1").arg(requestId));
if (m_dataBuffers.contains(requestId)) {
emit continuationStarted(requestId);
LOG_MESSAGE(QString("Starting continuation for request %1").arg(requestId));
}
} }
if (delta.contains("content") && !delta["content"].isNull()) { if (delta.contains("content") && !delta["content"].isNull()) {

View File

@ -334,6 +334,11 @@ void OpenAIProvider::processStreamChunk(const QString &requestId, const QJsonObj
message = new OpenAIMessage(this); message = new OpenAIMessage(this);
m_messages[requestId] = message; m_messages[requestId] = message;
LOG_MESSAGE(QString("Created NEW OpenAIAPIMessage for request %1").arg(requestId)); LOG_MESSAGE(QString("Created NEW OpenAIAPIMessage for request %1").arg(requestId));
if (m_dataBuffers.contains(requestId)) {
emit continuationStarted(requestId);
LOG_MESSAGE(QString("Starting continuation for request %1").arg(requestId));
}
} }
if (delta.contains("content") && !delta["content"].isNull()) { if (delta.contains("content") && !delta["content"].isNull()) {