Files
z-bar-qt/Plugins/ZShell/Llm/message.cpp
T

91 lines
2.3 KiB
C++

#include "message.hpp"
#include "messagemodel.hpp"
#include "session.hpp"
namespace ZShell::llm {
namespace {
ChatSession* sessionOf(const ChatMessage* message) {
if (auto* model = qobject_cast<ChatMessageModel*>(message->parent()))
return model->session();
return nullptr;
}
} // namespace
ChatMessage::ChatMessage(Role role, qint64 timestamp, QObject* parent)
: QObject(parent), m_role(role), m_timestamp(timestamp) {}
ChatGeneration* ChatMessage::addGeneration(
qint64 timestamp,
const QString& content,
const QString& reasoning,
qint64 reasoningElapsedMs,
qint64 contentElapsedMs) {
auto* generation = new ChatGeneration(timestamp, this);
generation->setContent(content);
generation->setReasoning(reasoning);
generation->setElapsedMs(reasoningElapsedMs, contentElapsedMs);
m_generations.append(generation);
if (m_active < 0)
m_active = static_cast<int>(m_generations.size() - 1);
Q_EMIT generationsChanged();
return generation;
}
ChatGeneration* ChatMessage::appendGeneration(qint64 timestamp) {
auto* generation =
addGeneration(timestamp, QString(), QString(), 0, 0);
setActiveInternal(static_cast<int>(m_generations.size() - 1));
return generation;
}
void ChatMessage::removeGeneration(ChatGeneration* generation) {
const int index = static_cast<int>(m_generations.indexOf(generation));
if (index < 0)
return;
const bool wasActive = index == m_active;
m_generations.removeAt(index);
delete generation;
if (m_generations.isEmpty()) {
m_active = -1;
} else if (m_active >= m_generations.size()) {
m_active = static_cast<int>(m_generations.size() - 1);
}
Q_EMIT generationsChanged();
if (wasActive)
Q_EMIT activeGenerationChanged();
}
void ChatMessage::setActiveInternal(int index) {
if (index < 0 || index >= m_generations.size() || index == m_active)
return;
m_active = index;
Q_EMIT activeGenerationChanged();
}
void ChatMessage::setActiveGeneration(int index) {
setActiveInternal(index);
}
void ChatMessage::edit(const QString& newContent) {
if (auto* generation = activeGeneration())
generation->setContent(newContent);
if (auto* session = sessionOf(this))
session->persist();
}
void ChatMessage::retry() {
if (auto* session = sessionOf(this))
session->retry(this);
}
void ChatMessage::generate() {
if (auto* session = sessionOf(this))
session->continueFrom(this);
}
} // namespace ZShell::llm