mirror of
https://github.com/Palm1r/QodeAssist.git
synced 2025-05-28 03:10:28 -04:00
Upgrade to version 0.4.4
* feat: Add attachments for message * feat: Support QtC color palette for chat view * feat: Improve code completion from non-FIM models * refactor: Removed trimming messages * chore: Bump version to 0.4.4
This commit is contained in:
parent
35012865c7
commit
511f5b36eb
@ -1,8 +1,8 @@
|
|||||||
qt_add_library(QodeAssistChatView STATIC)
|
qt_add_library(QodeAssistChatView STATIC)
|
||||||
|
|
||||||
qt_policy(SET QTP0001 NEW)
|
qt_policy(SET QTP0001 NEW)
|
||||||
|
qt_policy(SET QTP0004 NEW)
|
||||||
|
|
||||||
# URI name should match the subdirectory name to suppress the warning
|
|
||||||
qt_add_qml_module(QodeAssistChatView
|
qt_add_qml_module(QodeAssistChatView
|
||||||
URI ChatView
|
URI ChatView
|
||||||
VERSION 1.0
|
VERSION 1.0
|
||||||
@ -13,6 +13,14 @@ qt_add_qml_module(QodeAssistChatView
|
|||||||
qml/Badge.qml
|
qml/Badge.qml
|
||||||
qml/dialog/CodeBlock.qml
|
qml/dialog/CodeBlock.qml
|
||||||
qml/dialog/TextBlock.qml
|
qml/dialog/TextBlock.qml
|
||||||
|
qml/controls/QoAButton.qml
|
||||||
|
qml/parts/TopBar.qml
|
||||||
|
qml/parts/BottomBar.qml
|
||||||
|
qml/parts/AttachedFilesPlace.qml
|
||||||
|
RESOURCES
|
||||||
|
icons/attach-file.svg
|
||||||
|
icons/close-dark.svg
|
||||||
|
icons/close-light.svg
|
||||||
SOURCES
|
SOURCES
|
||||||
ChatWidget.hpp ChatWidget.cpp
|
ChatWidget.hpp ChatWidget.cpp
|
||||||
ChatModel.hpp ChatModel.cpp
|
ChatModel.hpp ChatModel.cpp
|
||||||
|
@ -55,6 +55,13 @@ QVariant ChatModel::data(const QModelIndex &index, int role) const
|
|||||||
case Roles::Content: {
|
case Roles::Content: {
|
||||||
return message.content;
|
return message.content;
|
||||||
}
|
}
|
||||||
|
case Roles::Attachments: {
|
||||||
|
QStringList filenames;
|
||||||
|
for (const auto &attachment : message.attachments) {
|
||||||
|
filenames << attachment.filename;
|
||||||
|
}
|
||||||
|
return filenames;
|
||||||
|
}
|
||||||
default:
|
default:
|
||||||
return QVariant();
|
return QVariant();
|
||||||
}
|
}
|
||||||
@ -65,28 +72,43 @@ QHash<int, QByteArray> ChatModel::roleNames() const
|
|||||||
QHash<int, QByteArray> roles;
|
QHash<int, QByteArray> roles;
|
||||||
roles[Roles::RoleType] = "roleType";
|
roles[Roles::RoleType] = "roleType";
|
||||||
roles[Roles::Content] = "content";
|
roles[Roles::Content] = "content";
|
||||||
|
roles[Roles::Attachments] = "attachments";
|
||||||
return roles;
|
return roles;
|
||||||
}
|
}
|
||||||
|
|
||||||
void ChatModel::addMessage(const QString &content, ChatRole role, const QString &id)
|
void ChatModel::addMessage(
|
||||||
|
const QString &content,
|
||||||
|
ChatRole role,
|
||||||
|
const QString &id,
|
||||||
|
const QList<Context::ContentFile> &attachments)
|
||||||
{
|
{
|
||||||
int tokenCount = estimateTokenCount(content);
|
QString fullContent = content;
|
||||||
|
if (!attachments.isEmpty()) {
|
||||||
|
fullContent += "\n\nAttached files list:";
|
||||||
|
for (const auto &attachment : attachments) {
|
||||||
|
fullContent += QString("\nname: %1\nfile content:\n%2")
|
||||||
|
.arg(attachment.filename, attachment.content);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
int tokenCount = estimateTokenCount(fullContent);
|
||||||
|
|
||||||
if (!m_messages.isEmpty() && !id.isEmpty() && m_messages.last().id == id) {
|
if (!m_messages.isEmpty() && !id.isEmpty() && m_messages.last().id == id) {
|
||||||
Message &lastMessage = m_messages.last();
|
Message &lastMessage = m_messages.last();
|
||||||
int oldTokenCount = lastMessage.tokenCount;
|
int oldTokenCount = lastMessage.tokenCount;
|
||||||
lastMessage.content = content;
|
lastMessage.content = content;
|
||||||
|
lastMessage.attachments = attachments;
|
||||||
lastMessage.tokenCount = tokenCount;
|
lastMessage.tokenCount = tokenCount;
|
||||||
m_totalTokens += (tokenCount - oldTokenCount);
|
m_totalTokens += (tokenCount - oldTokenCount);
|
||||||
emit dataChanged(index(m_messages.size() - 1), index(m_messages.size() - 1));
|
emit dataChanged(index(m_messages.size() - 1), index(m_messages.size() - 1));
|
||||||
} else {
|
} else {
|
||||||
beginInsertRows(QModelIndex(), m_messages.size(), m_messages.size());
|
beginInsertRows(QModelIndex(), m_messages.size(), m_messages.size());
|
||||||
m_messages.append({role, content, tokenCount, id});
|
Message newMessage{role, content, tokenCount, id};
|
||||||
|
newMessage.attachments = attachments;
|
||||||
|
m_messages.append(newMessage);
|
||||||
m_totalTokens += tokenCount;
|
m_totalTokens += tokenCount;
|
||||||
endInsertRows();
|
endInsertRows();
|
||||||
}
|
}
|
||||||
|
|
||||||
trim();
|
|
||||||
emit totalTokensChanged();
|
emit totalTokensChanged();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -95,20 +117,6 @@ QVector<ChatModel::Message> ChatModel::getChatHistory() const
|
|||||||
return m_messages;
|
return m_messages;
|
||||||
}
|
}
|
||||||
|
|
||||||
void ChatModel::trim()
|
|
||||||
{
|
|
||||||
while (m_totalTokens > tokensThreshold()) {
|
|
||||||
if (!m_messages.isEmpty()) {
|
|
||||||
m_totalTokens -= m_messages.first().tokenCount;
|
|
||||||
beginRemoveRows(QModelIndex(), 0, 0);
|
|
||||||
m_messages.removeFirst();
|
|
||||||
endRemoveRows();
|
|
||||||
} else {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
int ChatModel::estimateTokenCount(const QString &text) const
|
int ChatModel::estimateTokenCount(const QString &text) const
|
||||||
{
|
{
|
||||||
return text.length() / 4;
|
return text.length() / 4;
|
||||||
@ -156,7 +164,6 @@ QList<MessagePart> ChatModel::processMessageContent(const QString &content) cons
|
|||||||
QJsonArray ChatModel::prepareMessagesForRequest(const QString &systemPrompt) const
|
QJsonArray ChatModel::prepareMessagesForRequest(const QString &systemPrompt) const
|
||||||
{
|
{
|
||||||
QJsonArray messages;
|
QJsonArray messages;
|
||||||
|
|
||||||
messages.append(QJsonObject{{"role", "system"}, {"content", systemPrompt}});
|
messages.append(QJsonObject{{"role", "system"}, {"content", systemPrompt}});
|
||||||
|
|
||||||
for (const auto &message : m_messages) {
|
for (const auto &message : m_messages) {
|
||||||
@ -171,7 +178,22 @@ QJsonArray ChatModel::prepareMessagesForRequest(const QString &systemPrompt) con
|
|||||||
default:
|
default:
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
messages.append(QJsonObject{{"role", role}, {"content", message.content}});
|
|
||||||
|
QString content
|
||||||
|
= message.attachments.isEmpty()
|
||||||
|
? message.content
|
||||||
|
: message.content + "\n\nAttached files list:"
|
||||||
|
+ std::accumulate(
|
||||||
|
message.attachments.begin(),
|
||||||
|
message.attachments.end(),
|
||||||
|
QString(),
|
||||||
|
[](QString acc, const Context::ContentFile &attachment) {
|
||||||
|
return acc
|
||||||
|
+ QString("\nname: %1\nfile content:\n%2")
|
||||||
|
.arg(attachment.filename, attachment.content);
|
||||||
|
});
|
||||||
|
|
||||||
|
messages.append(QJsonObject{{"role", role}, {"content", content}});
|
||||||
}
|
}
|
||||||
|
|
||||||
return messages;
|
return messages;
|
||||||
|
@ -26,6 +26,8 @@
|
|||||||
#include <QJsonArray>
|
#include <QJsonArray>
|
||||||
#include <QtQmlIntegration>
|
#include <QtQmlIntegration>
|
||||||
|
|
||||||
|
#include "context/ContentFile.hpp"
|
||||||
|
|
||||||
namespace QodeAssist::Chat {
|
namespace QodeAssist::Chat {
|
||||||
|
|
||||||
class ChatModel : public QAbstractListModel
|
class ChatModel : public QAbstractListModel
|
||||||
@ -36,17 +38,19 @@ class ChatModel : public QAbstractListModel
|
|||||||
QML_ELEMENT
|
QML_ELEMENT
|
||||||
|
|
||||||
public:
|
public:
|
||||||
enum Roles { RoleType = Qt::UserRole, Content };
|
|
||||||
|
|
||||||
enum ChatRole { System, User, Assistant };
|
enum ChatRole { System, User, Assistant };
|
||||||
Q_ENUM(ChatRole)
|
Q_ENUM(ChatRole)
|
||||||
|
|
||||||
|
enum Roles { RoleType = Qt::UserRole, Content, Attachments };
|
||||||
|
|
||||||
struct Message
|
struct Message
|
||||||
{
|
{
|
||||||
ChatRole role;
|
ChatRole role;
|
||||||
QString content;
|
QString content;
|
||||||
int tokenCount;
|
int tokenCount;
|
||||||
QString id;
|
QString id;
|
||||||
|
|
||||||
|
QList<Context::ContentFile> attachments;
|
||||||
};
|
};
|
||||||
|
|
||||||
explicit ChatModel(QObject *parent = nullptr);
|
explicit ChatModel(QObject *parent = nullptr);
|
||||||
@ -55,7 +59,11 @@ public:
|
|||||||
QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override;
|
QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override;
|
||||||
QHash<int, QByteArray> roleNames() const override;
|
QHash<int, QByteArray> roleNames() const override;
|
||||||
|
|
||||||
Q_INVOKABLE void addMessage(const QString &content, ChatRole role, const QString &id);
|
Q_INVOKABLE void addMessage(
|
||||||
|
const QString &content,
|
||||||
|
ChatRole role,
|
||||||
|
const QString &id,
|
||||||
|
const QList<Context::ContentFile> &attachments = {});
|
||||||
Q_INVOKABLE void clear();
|
Q_INVOKABLE void clear();
|
||||||
Q_INVOKABLE QList<MessagePart> processMessageContent(const QString &content) const;
|
Q_INVOKABLE QList<MessagePart> processMessageContent(const QString &content) const;
|
||||||
|
|
||||||
@ -74,7 +82,6 @@ signals:
|
|||||||
void modelReseted();
|
void modelReseted();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void trim();
|
|
||||||
int estimateTokenCount(const QString &text) const;
|
int estimateTokenCount(const QString &text) const;
|
||||||
|
|
||||||
QVector<Message> m_messages;
|
QVector<Message> m_messages;
|
||||||
|
@ -21,6 +21,7 @@
|
|||||||
|
|
||||||
#include <QClipboard>
|
#include <QClipboard>
|
||||||
#include <QFileDialog>
|
#include <QFileDialog>
|
||||||
|
#include <QMessageBox>
|
||||||
|
|
||||||
#include <coreplugin/icore.h>
|
#include <coreplugin/icore.h>
|
||||||
#include <projectexplorer/project.h>
|
#include <projectexplorer/project.h>
|
||||||
@ -75,9 +76,26 @@ QColor ChatRootView::backgroundColor() const
|
|||||||
return Utils::creatorColor(Utils::Theme::BackgroundColorNormal);
|
return Utils::creatorColor(Utils::Theme::BackgroundColorNormal);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ChatRootView::sendMessage(const QString &message, bool sharingCurrentFile) const
|
void ChatRootView::sendMessage(const QString &message, bool sharingCurrentFile)
|
||||||
{
|
{
|
||||||
m_clientInterface->sendMessage(message, sharingCurrentFile);
|
if (m_chatModel->totalTokens() > m_chatModel->tokensThreshold()) {
|
||||||
|
QMessageBox::StandardButton reply = QMessageBox::question(
|
||||||
|
Core::ICore::dialogParent(),
|
||||||
|
tr("Token Limit Exceeded"),
|
||||||
|
tr("The chat history has exceeded the token limit.\n"
|
||||||
|
"Would you like to create new chat?"),
|
||||||
|
QMessageBox::Yes | QMessageBox::No);
|
||||||
|
|
||||||
|
if (reply == QMessageBox::Yes) {
|
||||||
|
autosave();
|
||||||
|
m_chatModel->clear();
|
||||||
|
m_recentFilePath = QString{};
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
m_clientInterface->sendMessage(message, m_attachmentFiles, sharingCurrentFile);
|
||||||
|
clearAttachmentFiles();
|
||||||
}
|
}
|
||||||
|
|
||||||
void ChatRootView::copyToClipboard(const QString &text)
|
void ChatRootView::copyToClipboard(const QString &text)
|
||||||
@ -90,6 +108,14 @@ void ChatRootView::cancelRequest()
|
|||||||
m_clientInterface->cancelRequest();
|
m_clientInterface->cancelRequest();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ChatRootView::clearAttachmentFiles()
|
||||||
|
{
|
||||||
|
if (!m_attachmentFiles.isEmpty()) {
|
||||||
|
m_attachmentFiles.clear();
|
||||||
|
emit attachmentFilesChanged();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void ChatRootView::generateColors()
|
void ChatRootView::generateColors()
|
||||||
{
|
{
|
||||||
QColor baseColor = backgroundColor();
|
QColor baseColor = backgroundColor();
|
||||||
@ -293,4 +319,22 @@ QString ChatRootView::getAutosaveFilePath() const
|
|||||||
return QDir(dir).filePath(getSuggestedFileName() + ".json");
|
return QDir(dir).filePath(getSuggestedFileName() + ".json");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ChatRootView::showAttachFilesDialog()
|
||||||
|
{
|
||||||
|
QFileDialog dialog(nullptr, tr("Select Files to Attach"));
|
||||||
|
dialog.setFileMode(QFileDialog::ExistingFiles);
|
||||||
|
|
||||||
|
if (auto project = ProjectExplorer::ProjectManager::startupProject()) {
|
||||||
|
dialog.setDirectory(project->projectDirectory().toString());
|
||||||
|
}
|
||||||
|
|
||||||
|
if (dialog.exec() == QDialog::Accepted) {
|
||||||
|
QStringList filePaths = dialog.selectedFiles();
|
||||||
|
if (!filePaths.isEmpty()) {
|
||||||
|
m_attachmentFiles = filePaths;
|
||||||
|
emit attachmentFilesChanged();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace QodeAssist::Chat
|
} // namespace QodeAssist::Chat
|
||||||
|
@ -37,6 +37,8 @@ class ChatRootView : public QQuickItem
|
|||||||
Q_PROPERTY(QColor codeColor READ codeColor CONSTANT FINAL)
|
Q_PROPERTY(QColor codeColor READ codeColor CONSTANT FINAL)
|
||||||
Q_PROPERTY(bool isSharingCurrentFile READ isSharingCurrentFile NOTIFY
|
Q_PROPERTY(bool isSharingCurrentFile READ isSharingCurrentFile NOTIFY
|
||||||
isSharingCurrentFileChanged FINAL)
|
isSharingCurrentFileChanged FINAL)
|
||||||
|
Q_PROPERTY(QStringList attachmentFiles MEMBER m_attachmentFiles NOTIFY attachmentFilesChanged)
|
||||||
|
|
||||||
QML_ELEMENT
|
QML_ELEMENT
|
||||||
|
|
||||||
public:
|
public:
|
||||||
@ -62,16 +64,19 @@ public:
|
|||||||
void autosave();
|
void autosave();
|
||||||
QString getAutosaveFilePath() const;
|
QString getAutosaveFilePath() const;
|
||||||
|
|
||||||
|
Q_INVOKABLE void showAttachFilesDialog();
|
||||||
|
|
||||||
public slots:
|
public slots:
|
||||||
void sendMessage(const QString &message, bool sharingCurrentFile = false) const;
|
void sendMessage(const QString &message, bool sharingCurrentFile = false);
|
||||||
void copyToClipboard(const QString &text);
|
void copyToClipboard(const QString &text);
|
||||||
void cancelRequest();
|
void cancelRequest();
|
||||||
|
void clearAttachmentFiles();
|
||||||
|
|
||||||
signals:
|
signals:
|
||||||
void chatModelChanged();
|
void chatModelChanged();
|
||||||
void currentTemplateChanged();
|
void currentTemplateChanged();
|
||||||
|
|
||||||
void isSharingCurrentFileChanged();
|
void isSharingCurrentFileChanged();
|
||||||
|
void attachmentFilesChanged();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void generateColors();
|
void generateColors();
|
||||||
@ -90,6 +95,7 @@ private:
|
|||||||
QColor m_secondaryColor;
|
QColor m_secondaryColor;
|
||||||
QColor m_codeColor;
|
QColor m_codeColor;
|
||||||
QString m_recentFilePath;
|
QString m_recentFilePath;
|
||||||
|
QStringList m_attachmentFiles;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace QodeAssist::Chat
|
} // namespace QodeAssist::Chat
|
||||||
|
@ -33,6 +33,7 @@
|
|||||||
#include <texteditor/texteditor.h>
|
#include <texteditor/texteditor.h>
|
||||||
|
|
||||||
#include "ChatAssistantSettings.hpp"
|
#include "ChatAssistantSettings.hpp"
|
||||||
|
#include "ContextManager.hpp"
|
||||||
#include "GeneralSettings.hpp"
|
#include "GeneralSettings.hpp"
|
||||||
#include "Logger.hpp"
|
#include "Logger.hpp"
|
||||||
#include "PromptTemplateManager.hpp"
|
#include "PromptTemplateManager.hpp"
|
||||||
@ -64,11 +65,13 @@ ClientInterface::ClientInterface(ChatModel *chatModel, QObject *parent)
|
|||||||
|
|
||||||
ClientInterface::~ClientInterface() = default;
|
ClientInterface::~ClientInterface() = default;
|
||||||
|
|
||||||
void ClientInterface::sendMessage(const QString &message, bool includeCurrentFile)
|
void ClientInterface::sendMessage(
|
||||||
|
const QString &message, const QList<QString> &attachments, bool includeCurrentFile)
|
||||||
{
|
{
|
||||||
cancelRequest();
|
cancelRequest();
|
||||||
|
|
||||||
m_chatModel->addMessage(message, ChatModel::ChatRole::User, "");
|
auto attachFiles = Context::ContextManager::instance().getContentFiles(attachments);
|
||||||
|
m_chatModel->addMessage(message, ChatModel::ChatRole::User, "", attachFiles);
|
||||||
|
|
||||||
auto &chatAssistantSettings = Settings::chatAssistantSettings();
|
auto &chatAssistantSettings = Settings::chatAssistantSettings();
|
||||||
|
|
||||||
|
@ -36,7 +36,10 @@ public:
|
|||||||
explicit ClientInterface(ChatModel *chatModel, QObject *parent = nullptr);
|
explicit ClientInterface(ChatModel *chatModel, QObject *parent = nullptr);
|
||||||
~ClientInterface();
|
~ClientInterface();
|
||||||
|
|
||||||
void sendMessage(const QString &message, bool includeCurrentFile = false);
|
void sendMessage(
|
||||||
|
const QString &message,
|
||||||
|
const QList<QString> &attachments = {},
|
||||||
|
bool includeCurrentFile = false);
|
||||||
void clearMessages();
|
void clearMessages();
|
||||||
void cancelRequest();
|
void cancelRequest();
|
||||||
|
|
||||||
|
10
ChatView/icons/attach-file.svg
Normal file
10
ChatView/icons/attach-file.svg
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
<svg width="24" height="48" viewBox="0 0 24 48" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<g clip-path="url(#clip0_37_14)">
|
||||||
|
<path d="M22 10.1053V36.7368C22 41.8547 17.525 46 12 46C6.475 46 2 41.8547 2 36.7368V7.78947C2 4.59368 4.8 2 8.25 2C11.7 2 15.75 4.59368 15.75 7.78947V35.5789C15.75 36.8526 13.375 39.0526 12 39.0526C10.625 39.0526 8.25 36.8526 8.25 35.5789V21.6842V8.94737" stroke="black" stroke-width="3" stroke-linecap="round"/>
|
||||||
|
</g>
|
||||||
|
<defs>
|
||||||
|
<clipPath id="clip0_37_14">
|
||||||
|
<rect width="24" height="48" fill="white"/>
|
||||||
|
</clipPath>
|
||||||
|
</defs>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 555 B |
10
ChatView/icons/close-dark.svg
Normal file
10
ChatView/icons/close-dark.svg
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<g clip-path="url(#clip0_41_14)">
|
||||||
|
<path d="M0 0L24 24M0 24L24 0" stroke="black" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
|
||||||
|
</g>
|
||||||
|
<defs>
|
||||||
|
<clipPath id="clip0_41_14">
|
||||||
|
<rect width="24" height="24" fill="white"/>
|
||||||
|
</clipPath>
|
||||||
|
</defs>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 353 B |
10
ChatView/icons/close-light.svg
Normal file
10
ChatView/icons/close-light.svg
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<g clip-path="url(#clip0_41_14)">
|
||||||
|
<path d="M0 0L24 24M0 24L24 0" stroke="white" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
|
||||||
|
</g>
|
||||||
|
<defs>
|
||||||
|
<clipPath id="clip0_41_14">
|
||||||
|
<rect width="24" height="24" fill="white"/>
|
||||||
|
</clipPath>
|
||||||
|
</defs>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 353 B |
@ -23,18 +23,18 @@ Rectangle {
|
|||||||
id: root
|
id: root
|
||||||
|
|
||||||
property alias text: badgeText.text
|
property alias text: badgeText.text
|
||||||
property alias fontColor: badgeText.color
|
|
||||||
|
|
||||||
implicitWidth: badgeText.implicitWidth + root.radius
|
implicitWidth: badgeText.implicitWidth + root.radius
|
||||||
implicitHeight: badgeText.implicitHeight + 6
|
implicitHeight: badgeText.implicitHeight + 6
|
||||||
color: "lightgreen"
|
color: palette.button
|
||||||
radius: root.height / 2
|
radius: root.height / 2
|
||||||
|
border.color: palette.mid
|
||||||
border.width: 1
|
border.width: 1
|
||||||
border.color: "gray"
|
|
||||||
|
|
||||||
Text {
|
Text {
|
||||||
id: badgeText
|
id: badgeText
|
||||||
|
|
||||||
anchors.centerIn: parent
|
anchors.centerIn: parent
|
||||||
|
color: palette.buttonText
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -17,28 +17,28 @@
|
|||||||
* along with QodeAssist. If not, see <https://www.gnu.org/licenses/>.
|
* along with QodeAssist. If not, see <https://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
pragma ComponentBehavior: Bound
|
|
||||||
|
|
||||||
import QtQuick
|
import QtQuick
|
||||||
import ChatView
|
import ChatView
|
||||||
|
import QtQuick.Layouts
|
||||||
import "./dialog"
|
import "./dialog"
|
||||||
|
|
||||||
Rectangle {
|
Rectangle {
|
||||||
id: root
|
id: root
|
||||||
|
|
||||||
property alias msgModel: msgCreator.model
|
property alias msgModel: msgCreator.model
|
||||||
|
property alias messageAttachments: attachmentsModel.model
|
||||||
property color fontColor
|
property color fontColor
|
||||||
property color codeBgColor
|
property color codeBgColor
|
||||||
property color selectionColor
|
property color selectionColor
|
||||||
|
|
||||||
height: msgColumn.height
|
height: msgColumn.implicitHeight + 10
|
||||||
radius: 8
|
radius: 8
|
||||||
|
|
||||||
Column {
|
ColumnLayout {
|
||||||
id: msgColumn
|
id: msgColumn
|
||||||
|
|
||||||
anchors.verticalCenter: parent.verticalCenter
|
|
||||||
width: parent.width
|
width: parent.width
|
||||||
|
anchors.verticalCenter: parent.verticalCenter
|
||||||
spacing: 5
|
spacing: 5
|
||||||
|
|
||||||
Repeater {
|
Repeater {
|
||||||
@ -80,6 +80,38 @@ Rectangle {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Flow {
|
||||||
|
id: attachmentsFlow
|
||||||
|
|
||||||
|
Layout.fillWidth: true
|
||||||
|
visible: attachmentsModel.model && attachmentsModel.model.length > 0
|
||||||
|
leftPadding: 10
|
||||||
|
rightPadding: 10
|
||||||
|
spacing: 5
|
||||||
|
|
||||||
|
Repeater {
|
||||||
|
id: attachmentsModel
|
||||||
|
|
||||||
|
delegate: Rectangle {
|
||||||
|
required property int index
|
||||||
|
required property var modelData
|
||||||
|
|
||||||
|
height: attachText.implicitHeight + 8
|
||||||
|
width: attachText.implicitWidth + 16
|
||||||
|
radius: 4
|
||||||
|
color: root.codeBgColor
|
||||||
|
|
||||||
|
Text {
|
||||||
|
id: attachText
|
||||||
|
|
||||||
|
anchors.centerIn: parent
|
||||||
|
text: modelData
|
||||||
|
color: root.fontColor
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
component TextComponent : TextBlock {
|
component TextComponent : TextBlock {
|
||||||
|
@ -17,56 +17,59 @@
|
|||||||
* along with QodeAssist. If not, see <https://www.gnu.org/licenses/>.
|
* along with QodeAssist. If not, see <https://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
pragma ComponentBehavior: Bound
|
|
||||||
|
|
||||||
import QtQuick
|
import QtQuick
|
||||||
import QtQuick.Controls
|
import QtQuick.Controls
|
||||||
import QtQuick.Controls.Basic as QQC
|
import QtQuick.Controls.Basic as QQC
|
||||||
import QtQuick.Layouts
|
import QtQuick.Layouts
|
||||||
import ChatView
|
import ChatView
|
||||||
|
import "./controls"
|
||||||
|
import "./parts"
|
||||||
|
|
||||||
ChatRootView {
|
ChatRootView {
|
||||||
id: root
|
id: root
|
||||||
|
|
||||||
|
property SystemPalette sysPalette: SystemPalette {
|
||||||
|
colorGroup: SystemPalette.Active
|
||||||
|
}
|
||||||
|
|
||||||
|
palette {
|
||||||
|
window: sysPalette.window
|
||||||
|
windowText: sysPalette.windowText
|
||||||
|
base: sysPalette.base
|
||||||
|
alternateBase: sysPalette.alternateBase
|
||||||
|
text: sysPalette.text
|
||||||
|
button: sysPalette.button
|
||||||
|
buttonText: sysPalette.buttonText
|
||||||
|
highlight: sysPalette.highlight
|
||||||
|
highlightedText: sysPalette.highlightedText
|
||||||
|
light: sysPalette.light
|
||||||
|
mid: sysPalette.mid
|
||||||
|
dark: sysPalette.dark
|
||||||
|
shadow: sysPalette.shadow
|
||||||
|
brightText: sysPalette.brightText
|
||||||
|
}
|
||||||
|
|
||||||
Rectangle {
|
Rectangle {
|
||||||
id: bg
|
id: bg
|
||||||
|
|
||||||
anchors.fill: parent
|
anchors.fill: parent
|
||||||
color: root.backgroundColor
|
color: palette.window
|
||||||
}
|
}
|
||||||
|
|
||||||
ColumnLayout {
|
ColumnLayout {
|
||||||
anchors.fill: parent
|
anchors.fill: parent
|
||||||
|
|
||||||
RowLayout {
|
TopBar {
|
||||||
id: topBar
|
id: topBar
|
||||||
|
|
||||||
Layout.leftMargin: 5
|
Layout.preferredWidth: parent.width
|
||||||
Layout.rightMargin: 5
|
Layout.preferredHeight: 40
|
||||||
spacing: 10
|
|
||||||
|
|
||||||
Button {
|
saveButton.onClicked: root.showSaveDialog()
|
||||||
text: qsTr("Save")
|
loadButton.onClicked: root.showLoadDialog()
|
||||||
onClicked: root.showSaveDialog()
|
clearButton.onClicked: root.clearChat()
|
||||||
}
|
tokensBadge {
|
||||||
|
|
||||||
Button {
|
|
||||||
text: qsTr("Load")
|
|
||||||
onClicked: root.showLoadDialog()
|
|
||||||
}
|
|
||||||
|
|
||||||
Button {
|
|
||||||
text: qsTr("Clear")
|
|
||||||
onClicked: root.clearChat()
|
|
||||||
}
|
|
||||||
|
|
||||||
Item {
|
|
||||||
Layout.fillWidth: true
|
|
||||||
}
|
|
||||||
|
|
||||||
Badge {
|
|
||||||
text: qsTr("tokens:%1/%2").arg(root.chatModel.totalTokens).arg(root.chatModel.tokensThreshold)
|
text: qsTr("tokens:%1/%2").arg(root.chatModel.totalTokens).arg(root.chatModel.tokensThreshold)
|
||||||
color: root.codeColor
|
|
||||||
fontColor: root.primaryColor.hslLightness > 0.5 ? "black" : "white"
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -84,8 +87,10 @@ ChatRootView {
|
|||||||
|
|
||||||
delegate: ChatItem {
|
delegate: ChatItem {
|
||||||
required property var model
|
required property var model
|
||||||
|
|
||||||
width: ListView.view.width - scroll.width
|
width: ListView.view.width - scroll.width
|
||||||
msgModel: root.chatModel.processMessageContent(model.content)
|
msgModel: root.chatModel.processMessageContent(model.content)
|
||||||
|
messageAttachments: model.attachments
|
||||||
color: model.roleType === ChatModel.User ? root.primaryColor : root.secondaryColor
|
color: model.roleType === ChatModel.User ? root.primaryColor : root.secondaryColor
|
||||||
fontColor: root.primaryColor.hslLightness > 0.5 ? "black" : "white"
|
fontColor: root.primaryColor.hslLightness > 0.5 ? "black" : "white"
|
||||||
codeBgColor: root.codeColor
|
codeBgColor: root.codeColor
|
||||||
@ -143,32 +148,23 @@ ChatRootView {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
RowLayout {
|
AttachedFilesPlace {
|
||||||
|
id: attachedFilesPlace
|
||||||
|
|
||||||
Layout.fillWidth: true
|
Layout.fillWidth: true
|
||||||
spacing: 5
|
attachedFilesModel: root.attachmentFiles
|
||||||
|
}
|
||||||
|
|
||||||
Button {
|
BottomBar {
|
||||||
id: sendButton
|
id: bottomBar
|
||||||
|
|
||||||
Layout.alignment: Qt.AlignBottom
|
Layout.preferredWidth: parent.width
|
||||||
text: qsTr("Send")
|
Layout.preferredHeight: 40
|
||||||
onClicked: root.sendChatMessage()
|
|
||||||
}
|
|
||||||
|
|
||||||
Button {
|
sendButton.onClicked: root.sendChatMessage()
|
||||||
id: stopButton
|
stopButton.onClicked: root.cancelRequest()
|
||||||
|
sharingCurrentFile.checked: root.isSharingCurrentFile
|
||||||
Layout.alignment: Qt.AlignBottom
|
attachFiles.onClicked: root.showAttachFilesDialog()
|
||||||
text: qsTr("Stop")
|
|
||||||
onClicked: root.cancelRequest()
|
|
||||||
}
|
|
||||||
|
|
||||||
CheckBox {
|
|
||||||
id: sharingCurrentFile
|
|
||||||
|
|
||||||
text: "Share current file with models"
|
|
||||||
checked: root.isSharingCurrentFile
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -181,7 +177,7 @@ ChatRootView {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function sendChatMessage() {
|
function sendChatMessage() {
|
||||||
root.sendMessage(messageInput.text, sharingCurrentFile.checked)
|
root.sendMessage(messageInput.text, bottomBar.sharingCurrentFile.checked)
|
||||||
messageInput.text = ""
|
messageInput.text = ""
|
||||||
scrollToBottom()
|
scrollToBottom()
|
||||||
}
|
}
|
||||||
|
54
ChatView/qml/controls/QoAButton.qml
Normal file
54
ChatView/qml/controls/QoAButton.qml
Normal file
@ -0,0 +1,54 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2024 Petr Mironychev
|
||||||
|
*
|
||||||
|
* This file is part of QodeAssist.
|
||||||
|
*
|
||||||
|
* QodeAssist is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* QodeAssist is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with QodeAssist. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
import QtQuick
|
||||||
|
import QtQuick.Controls.Basic
|
||||||
|
|
||||||
|
Button {
|
||||||
|
id: control
|
||||||
|
|
||||||
|
padding: 4
|
||||||
|
|
||||||
|
icon.width: 16
|
||||||
|
icon.height: 16
|
||||||
|
|
||||||
|
contentItem.height: 20
|
||||||
|
|
||||||
|
background: Rectangle {
|
||||||
|
id: bg
|
||||||
|
|
||||||
|
implicitHeight: 20
|
||||||
|
|
||||||
|
color: !control.enabled || !control.down ? control.palette.button : control.palette.dark
|
||||||
|
border.color: !control.enabled || (!control.hovered && !control.visualFocus) ? control.palette.mid : control.palette.highlight
|
||||||
|
border.width: 1
|
||||||
|
radius: 4
|
||||||
|
|
||||||
|
Rectangle {
|
||||||
|
anchors.fill: bg
|
||||||
|
radius: bg.radius
|
||||||
|
gradient: Gradient {
|
||||||
|
GradientStop { position: 0.0; color: Qt.alpha(control.palette.highlight, 0.4) }
|
||||||
|
GradientStop { position: 1.0; color: Qt.alpha(control.palette.highlight, 0.2) }
|
||||||
|
}
|
||||||
|
opacity: control.hovered ? 0.3 : 0.01
|
||||||
|
Behavior on opacity {NumberAnimation{duration: 250}}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
90
ChatView/qml/parts/AttachedFilesPlace.qml
Normal file
90
ChatView/qml/parts/AttachedFilesPlace.qml
Normal file
@ -0,0 +1,90 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2024 Petr Mironychev
|
||||||
|
*
|
||||||
|
* This file is part of QodeAssist.
|
||||||
|
*
|
||||||
|
* QodeAssist is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* QodeAssist is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with QodeAssist. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
import QtQuick
|
||||||
|
import QtQuick.Controls
|
||||||
|
import QtQuick.Layouts
|
||||||
|
import ChatView
|
||||||
|
|
||||||
|
Flow {
|
||||||
|
id: attachFilesPlace
|
||||||
|
|
||||||
|
property alias attachedFilesModel: attachRepeater.model
|
||||||
|
|
||||||
|
spacing: 5
|
||||||
|
leftPadding: 5
|
||||||
|
rightPadding: 5
|
||||||
|
|
||||||
|
Repeater {
|
||||||
|
id: attachRepeater
|
||||||
|
|
||||||
|
delegate: Rectangle {
|
||||||
|
required property int index
|
||||||
|
required property string modelData
|
||||||
|
|
||||||
|
height: 30
|
||||||
|
width: fileNameText.width + closeButton.width + 20
|
||||||
|
radius: 4
|
||||||
|
color: palette.button
|
||||||
|
|
||||||
|
Row {
|
||||||
|
spacing: 5
|
||||||
|
anchors.verticalCenter: parent.verticalCenter
|
||||||
|
anchors.left: parent.left
|
||||||
|
anchors.leftMargin: 5
|
||||||
|
|
||||||
|
Text {
|
||||||
|
id: fileNameText
|
||||||
|
|
||||||
|
anchors.verticalCenter: parent.verticalCenter
|
||||||
|
color: palette.buttonText
|
||||||
|
|
||||||
|
text: {
|
||||||
|
const parts = modelData.split('/');
|
||||||
|
return parts[parts.length - 1];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
MouseArea {
|
||||||
|
id: closeButton
|
||||||
|
|
||||||
|
anchors.verticalCenter: parent.verticalCenter
|
||||||
|
width: closeIcon.width
|
||||||
|
height: closeButton.width
|
||||||
|
|
||||||
|
onClicked: {
|
||||||
|
const newList = [...root.attachmentFiles];
|
||||||
|
newList.splice(index, 1);
|
||||||
|
root.attachmentFiles = newList;
|
||||||
|
}
|
||||||
|
|
||||||
|
Image {
|
||||||
|
id: closeIcon
|
||||||
|
|
||||||
|
anchors.centerIn: parent
|
||||||
|
source: palette.window.hslLightness > 0.5 ? "qrc:/qt/qml/ChatView/icons/close-dark.svg"
|
||||||
|
: "qrc:/qt/qml/ChatView/icons/close-light.svg"
|
||||||
|
width: 6
|
||||||
|
height: 6
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
83
ChatView/qml/parts/BottomBar.qml
Normal file
83
ChatView/qml/parts/BottomBar.qml
Normal file
@ -0,0 +1,83 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2024 Petr Mironychev
|
||||||
|
*
|
||||||
|
* This file is part of QodeAssist.
|
||||||
|
*
|
||||||
|
* QodeAssist is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* QodeAssist is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with QodeAssist. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
import QtQuick
|
||||||
|
import QtQuick.Controls
|
||||||
|
import QtQuick.Layouts
|
||||||
|
import ChatView
|
||||||
|
|
||||||
|
Rectangle {
|
||||||
|
id: root
|
||||||
|
|
||||||
|
property alias sendButton: sendButtonId
|
||||||
|
property alias stopButton: stopButtonId
|
||||||
|
property alias sharingCurrentFile: sharingCurrentFileId
|
||||||
|
property alias attachFiles: attachFilesId
|
||||||
|
|
||||||
|
color: palette.window.hslLightness > 0.5 ?
|
||||||
|
Qt.darker(palette.window, 1.1) :
|
||||||
|
Qt.lighter(palette.window, 1.1)
|
||||||
|
|
||||||
|
RowLayout {
|
||||||
|
id: bottomBar
|
||||||
|
|
||||||
|
anchors {
|
||||||
|
left: parent.left
|
||||||
|
leftMargin: 5
|
||||||
|
right: parent.right
|
||||||
|
rightMargin: 5
|
||||||
|
verticalCenter: parent.verticalCenter
|
||||||
|
}
|
||||||
|
|
||||||
|
spacing: 10
|
||||||
|
|
||||||
|
QoAButton {
|
||||||
|
id: sendButtonId
|
||||||
|
|
||||||
|
text: qsTr("Send")
|
||||||
|
}
|
||||||
|
|
||||||
|
QoAButton {
|
||||||
|
id: stopButtonId
|
||||||
|
|
||||||
|
text: qsTr("Stop")
|
||||||
|
}
|
||||||
|
|
||||||
|
CheckBox {
|
||||||
|
id: sharingCurrentFileId
|
||||||
|
|
||||||
|
text: qsTr("Share current file with models")
|
||||||
|
}
|
||||||
|
|
||||||
|
QoAButton {
|
||||||
|
id: attachFilesId
|
||||||
|
|
||||||
|
icon {
|
||||||
|
source: "qrc:/qt/qml/ChatView/icons/attach-file.svg"
|
||||||
|
height: 15
|
||||||
|
width: 8
|
||||||
|
}
|
||||||
|
text: qsTr("Attach files")
|
||||||
|
}
|
||||||
|
|
||||||
|
Item {
|
||||||
|
Layout.fillWidth: true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
73
ChatView/qml/parts/TopBar.qml
Normal file
73
ChatView/qml/parts/TopBar.qml
Normal file
@ -0,0 +1,73 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2024 Petr Mironychev
|
||||||
|
*
|
||||||
|
* This file is part of QodeAssist.
|
||||||
|
*
|
||||||
|
* QodeAssist is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* QodeAssist is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with QodeAssist. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
import QtQuick
|
||||||
|
import QtQuick.Layouts
|
||||||
|
import ChatView
|
||||||
|
|
||||||
|
Rectangle {
|
||||||
|
id: root
|
||||||
|
|
||||||
|
property alias saveButton: saveButtonId
|
||||||
|
property alias loadButton: loadButtonId
|
||||||
|
property alias clearButton: clearButtonId
|
||||||
|
property alias tokensBadge: tokensBadgeId
|
||||||
|
|
||||||
|
color: palette.window.hslLightness > 0.5 ?
|
||||||
|
Qt.darker(palette.window, 1.1) :
|
||||||
|
Qt.lighter(palette.window, 1.1)
|
||||||
|
|
||||||
|
RowLayout {
|
||||||
|
anchors {
|
||||||
|
left: parent.left
|
||||||
|
leftMargin: 5
|
||||||
|
right: parent.right
|
||||||
|
rightMargin: 5
|
||||||
|
verticalCenter: parent.verticalCenter
|
||||||
|
}
|
||||||
|
|
||||||
|
spacing: 10
|
||||||
|
|
||||||
|
QoAButton {
|
||||||
|
id: saveButtonId
|
||||||
|
|
||||||
|
text: qsTr("Save")
|
||||||
|
}
|
||||||
|
|
||||||
|
QoAButton {
|
||||||
|
id: loadButtonId
|
||||||
|
|
||||||
|
text: qsTr("Load")
|
||||||
|
}
|
||||||
|
|
||||||
|
QoAButton {
|
||||||
|
id: clearButtonId
|
||||||
|
|
||||||
|
text: qsTr("Clear")
|
||||||
|
}
|
||||||
|
|
||||||
|
Item {
|
||||||
|
Layout.fillWidth: true
|
||||||
|
}
|
||||||
|
|
||||||
|
Badge {
|
||||||
|
id: tokensBadgeId
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -194,11 +194,18 @@ void LLMClientInterface::handleCompletion(const QJsonObject &request)
|
|||||||
if (!updatedContext.fileContext.isEmpty())
|
if (!updatedContext.fileContext.isEmpty())
|
||||||
systemPrompt.append(updatedContext.fileContext);
|
systemPrompt.append(updatedContext.fileContext);
|
||||||
|
|
||||||
|
QString userMessage;
|
||||||
|
if (completeSettings.useUserMessageTemplateForCC() && promptTemplate->type() == LLMCore::TemplateType::Chat) {
|
||||||
|
userMessage = completeSettings.userMessageTemplateForCC().arg(updatedContext.prefix, updatedContext.suffix);
|
||||||
|
} else {
|
||||||
|
userMessage = updatedContext.prefix;
|
||||||
|
}
|
||||||
|
|
||||||
auto message = LLMCore::MessageBuilder()
|
auto message = LLMCore::MessageBuilder()
|
||||||
.addSystemMessage(systemPrompt)
|
.addSystemMessage(systemPrompt)
|
||||||
.addUserMessage(updatedContext.prefix)
|
.addUserMessage(userMessage)
|
||||||
.addSuffix(updatedContext.suffix)
|
.addSuffix(updatedContext.suffix)
|
||||||
.addtTokenizer(promptTemplate);
|
.addTokenizer(promptTemplate);
|
||||||
|
|
||||||
message.saveTo(
|
message.saveTo(
|
||||||
config.providerRequest,
|
config.providerRequest,
|
||||||
@ -235,7 +242,7 @@ LLMCore::ContextData LLMClientInterface::prepareContext(const QJsonObject &reque
|
|||||||
int cursorPosition = position["character"].toInt();
|
int cursorPosition = position["character"].toInt();
|
||||||
int lineNumber = position["line"].toInt();
|
int lineNumber = position["line"].toInt();
|
||||||
|
|
||||||
DocumentContextReader reader(textDocument);
|
Context::DocumentContextReader reader(textDocument);
|
||||||
return reader.prepareContext(lineNumber, cursorPosition);
|
return reader.prepareContext(lineNumber, cursorPosition);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"Id" : "qodeassist",
|
"Id" : "qodeassist",
|
||||||
"Name" : "QodeAssist",
|
"Name" : "QodeAssist",
|
||||||
"Version" : "0.4.3",
|
"Version" : "0.4.4",
|
||||||
"Vendor" : "Petr Mironychev",
|
"Vendor" : "Petr Mironychev",
|
||||||
"VendorId" : "petrmironychev",
|
"VendorId" : "petrmironychev",
|
||||||
"Copyright" : "(C) ${IDE_COPYRIGHT_YEAR} Petr Mironychev, (C) ${IDE_COPYRIGHT_YEAR} The Qt Company Ltd",
|
"Copyright" : "(C) ${IDE_COPYRIGHT_YEAR} Petr Mironychev, (C) ${IDE_COPYRIGHT_YEAR} The Qt Company Ltd",
|
||||||
|
@ -88,7 +88,8 @@ void QodeAssistClient::openDocument(TextEditor::TextDocument *document)
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
if (Settings::codeCompletionSettings().useProjectChangesCache())
|
if (Settings::codeCompletionSettings().useProjectChangesCache())
|
||||||
ChangesManager::instance().addChange(document, position, charsRemoved, charsAdded);
|
Context::ChangesManager::instance()
|
||||||
|
.addChange(document, position, charsRemoved, charsAdded);
|
||||||
|
|
||||||
TextEditorWidget *widget = textEditor->editorWidget();
|
TextEditorWidget *widget = textEditor->editorWidget();
|
||||||
if (widget->isReadOnly() || widget->multiTextCursor().hasMultipleCursors())
|
if (widget->isReadOnly() || widget->multiTextCursor().hasMultipleCursors())
|
||||||
|
@ -1,6 +1,8 @@
|
|||||||
add_library(Context STATIC
|
add_library(Context STATIC
|
||||||
DocumentContextReader.hpp DocumentContextReader.cpp
|
DocumentContextReader.hpp DocumentContextReader.cpp
|
||||||
ChangesManager.h ChangesManager.cpp
|
ChangesManager.h ChangesManager.cpp
|
||||||
|
ContextManager.hpp ContextManager.cpp
|
||||||
|
ContentFile.hpp
|
||||||
)
|
)
|
||||||
|
|
||||||
target_link_libraries(Context
|
target_link_libraries(Context
|
||||||
|
@ -20,7 +20,7 @@
|
|||||||
#include "ChangesManager.h"
|
#include "ChangesManager.h"
|
||||||
#include "CodeCompletionSettings.hpp"
|
#include "CodeCompletionSettings.hpp"
|
||||||
|
|
||||||
namespace QodeAssist {
|
namespace QodeAssist::Context {
|
||||||
|
|
||||||
ChangesManager &ChangesManager::instance()
|
ChangesManager &ChangesManager::instance()
|
||||||
{
|
{
|
||||||
@ -79,4 +79,4 @@ QString ChangesManager::getRecentChangesContext(const TextEditor::TextDocument *
|
|||||||
return context;
|
return context;
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace QodeAssist
|
} // namespace QodeAssist::Context
|
||||||
|
@ -25,7 +25,7 @@
|
|||||||
#include <QTimer>
|
#include <QTimer>
|
||||||
#include <texteditor/textdocument.h>
|
#include <texteditor/textdocument.h>
|
||||||
|
|
||||||
namespace QodeAssist {
|
namespace QodeAssist::Context {
|
||||||
|
|
||||||
class ChangesManager : public QObject
|
class ChangesManager : public QObject
|
||||||
{
|
{
|
||||||
@ -58,4 +58,4 @@ private:
|
|||||||
QHash<TextEditor::TextDocument *, QQueue<ChangeInfo>> m_documentChanges;
|
QHash<TextEditor::TextDocument *, QQueue<ChangeInfo>> m_documentChanges;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace QodeAssist
|
} // namespace QodeAssist::Context
|
||||||
|
32
context/ContentFile.hpp
Normal file
32
context/ContentFile.hpp
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2024 Petr Mironychev
|
||||||
|
*
|
||||||
|
* This file is part of QodeAssist.
|
||||||
|
*
|
||||||
|
* QodeAssist is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* QodeAssist is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with QodeAssist. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <QString>
|
||||||
|
|
||||||
|
namespace QodeAssist::Context {
|
||||||
|
|
||||||
|
struct ContentFile
|
||||||
|
{
|
||||||
|
QString filename;
|
||||||
|
QString content;
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace QodeAssist::Context
|
67
context/ContextManager.cpp
Normal file
67
context/ContextManager.cpp
Normal file
@ -0,0 +1,67 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2024 Petr Mironychev
|
||||||
|
*
|
||||||
|
* This file is part of QodeAssist.
|
||||||
|
*
|
||||||
|
* QodeAssist is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* QodeAssist is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with QodeAssist. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "ContextManager.hpp"
|
||||||
|
|
||||||
|
#include <QFile>
|
||||||
|
#include <QFileInfo>
|
||||||
|
#include <QTextStream>
|
||||||
|
|
||||||
|
namespace QodeAssist::Context {
|
||||||
|
|
||||||
|
ContextManager &ContextManager::instance()
|
||||||
|
{
|
||||||
|
static ContextManager manager;
|
||||||
|
return manager;
|
||||||
|
}
|
||||||
|
|
||||||
|
ContextManager::ContextManager(QObject *parent)
|
||||||
|
: QObject(parent)
|
||||||
|
{}
|
||||||
|
|
||||||
|
QString ContextManager::readFile(const QString &filePath) const
|
||||||
|
{
|
||||||
|
QFile file(filePath);
|
||||||
|
if (!file.open(QIODevice::ReadOnly | QIODevice::Text))
|
||||||
|
return QString();
|
||||||
|
|
||||||
|
QTextStream in(&file);
|
||||||
|
return in.readAll();
|
||||||
|
}
|
||||||
|
|
||||||
|
QList<ContentFile> ContextManager::getContentFiles(const QStringList &filePaths) const
|
||||||
|
{
|
||||||
|
QList<ContentFile> files;
|
||||||
|
for (const QString &path : filePaths) {
|
||||||
|
ContentFile contentFile = createContentFile(path);
|
||||||
|
files.append(contentFile);
|
||||||
|
}
|
||||||
|
return files;
|
||||||
|
}
|
||||||
|
|
||||||
|
ContentFile ContextManager::createContentFile(const QString &filePath) const
|
||||||
|
{
|
||||||
|
ContentFile contentFile;
|
||||||
|
QFileInfo fileInfo(filePath);
|
||||||
|
contentFile.filename = fileInfo.fileName();
|
||||||
|
contentFile.content = readFile(filePath);
|
||||||
|
return contentFile;
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace QodeAssist::Context
|
46
context/ContextManager.hpp
Normal file
46
context/ContextManager.hpp
Normal file
@ -0,0 +1,46 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2024 Petr Mironychev
|
||||||
|
*
|
||||||
|
* This file is part of QodeAssist.
|
||||||
|
*
|
||||||
|
* QodeAssist is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* QodeAssist is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with QodeAssist. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <QObject>
|
||||||
|
#include <QString>
|
||||||
|
|
||||||
|
#include "ContentFile.hpp"
|
||||||
|
|
||||||
|
namespace QodeAssist::Context {
|
||||||
|
|
||||||
|
class ContextManager : public QObject
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
|
||||||
|
public:
|
||||||
|
static ContextManager &instance();
|
||||||
|
QString readFile(const QString &filePath) const;
|
||||||
|
QList<ContentFile> getContentFiles(const QStringList &filePaths) const;
|
||||||
|
|
||||||
|
private:
|
||||||
|
explicit ContextManager(QObject *parent = nullptr);
|
||||||
|
~ContextManager() = default;
|
||||||
|
ContextManager(const ContextManager &) = delete;
|
||||||
|
ContextManager &operator=(const ContextManager &) = delete;
|
||||||
|
ContentFile createContentFile(const QString &filePath) const;
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace QodeAssist::Context
|
@ -47,7 +47,7 @@ const QRegularExpression &getCommentRegex()
|
|||||||
return commentRegex;
|
return commentRegex;
|
||||||
}
|
}
|
||||||
|
|
||||||
namespace QodeAssist {
|
namespace QodeAssist::Context {
|
||||||
|
|
||||||
DocumentContextReader::DocumentContextReader(TextEditor::TextDocument *textDocument)
|
DocumentContextReader::DocumentContextReader(TextEditor::TextDocument *textDocument)
|
||||||
: m_textDocument(textDocument)
|
: m_textDocument(textDocument)
|
||||||
@ -247,4 +247,4 @@ QString DocumentContextReader::getContextAfter(int lineNumber, int cursorPositio
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace QodeAssist
|
} // namespace QodeAssist::Context
|
||||||
|
@ -24,7 +24,7 @@
|
|||||||
|
|
||||||
#include <llmcore/ContextData.hpp>
|
#include <llmcore/ContextData.hpp>
|
||||||
|
|
||||||
namespace QodeAssist {
|
namespace QodeAssist::Context {
|
||||||
|
|
||||||
struct CopyrightInfo
|
struct CopyrightInfo
|
||||||
{
|
{
|
||||||
@ -61,4 +61,4 @@ private:
|
|||||||
CopyrightInfo m_copyrightInfo;
|
CopyrightInfo m_copyrightInfo;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace QodeAssist
|
} // namespace QodeAssist::Context
|
||||||
|
@ -40,7 +40,7 @@ QodeAssist::LLMCore::MessageBuilder &QodeAssist::LLMCore::MessageBuilder::addSuf
|
|||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
QodeAssist::LLMCore::MessageBuilder &QodeAssist::LLMCore::MessageBuilder::addtTokenizer(
|
QodeAssist::LLMCore::MessageBuilder &QodeAssist::LLMCore::MessageBuilder::addTokenizer(
|
||||||
PromptTemplate *promptTemplate)
|
PromptTemplate *promptTemplate)
|
||||||
{
|
{
|
||||||
m_promptTemplate = promptTemplate;
|
m_promptTemplate = promptTemplate;
|
||||||
|
@ -53,7 +53,7 @@ public:
|
|||||||
|
|
||||||
MessageBuilder &addSuffix(const QString &content);
|
MessageBuilder &addSuffix(const QString &content);
|
||||||
|
|
||||||
MessageBuilder &addtTokenizer(PromptTemplate *promptTemplate);
|
MessageBuilder &addTokenizer(PromptTemplate *promptTemplate);
|
||||||
|
|
||||||
QString roleToString(MessageRole role) const;
|
QString roleToString(MessageRole role) const;
|
||||||
|
|
||||||
|
@ -47,7 +47,7 @@ ChatAssistantSettings::ChatAssistantSettings()
|
|||||||
chatTokensThreshold.setLabelText(Tr::tr("Chat History Token Limit:"));
|
chatTokensThreshold.setLabelText(Tr::tr("Chat History Token Limit:"));
|
||||||
chatTokensThreshold.setToolTip(Tr::tr("Maximum number of tokens in chat history. When "
|
chatTokensThreshold.setToolTip(Tr::tr("Maximum number of tokens in chat history. When "
|
||||||
"exceeded, oldest messages will be removed."));
|
"exceeded, oldest messages will be removed."));
|
||||||
chatTokensThreshold.setRange(1000, 16000);
|
chatTokensThreshold.setRange(1, 900000);
|
||||||
chatTokensThreshold.setDefaultValue(8000);
|
chatTokensThreshold.setDefaultValue(8000);
|
||||||
|
|
||||||
sharingCurrentFile.setSettingsKey(Constants::CA_SHARING_CURRENT_FILE);
|
sharingCurrentFile.setSettingsKey(Constants::CA_SHARING_CURRENT_FILE);
|
||||||
|
@ -89,7 +89,7 @@ CodeCompletionSettings::CodeCompletionSettings()
|
|||||||
|
|
||||||
maxTokens.setSettingsKey(Constants::CC_MAX_TOKENS);
|
maxTokens.setSettingsKey(Constants::CC_MAX_TOKENS);
|
||||||
maxTokens.setLabelText(Tr::tr("Max Tokens:"));
|
maxTokens.setLabelText(Tr::tr("Max Tokens:"));
|
||||||
maxTokens.setRange(-1, 10000);
|
maxTokens.setRange(-1, 900000);
|
||||||
maxTokens.setDefaultValue(50);
|
maxTokens.setDefaultValue(50);
|
||||||
|
|
||||||
// Advanced Parameters
|
// Advanced Parameters
|
||||||
@ -164,6 +164,15 @@ CodeCompletionSettings::CodeCompletionSettings()
|
|||||||
"a code block using triple backticks. 6. Do not include any comments or descriptions with "
|
"a code block using triple backticks. 6. Do not include any comments or descriptions with "
|
||||||
"your code suggestion. Remember to include only the new code to be inserted.");
|
"your code suggestion. Remember to include only the new code to be inserted.");
|
||||||
|
|
||||||
|
useUserMessageTemplateForCC.setSettingsKey(Constants::CC_USE_USER_TEMPLATE);
|
||||||
|
useUserMessageTemplateForCC.setDefaultValue(true);
|
||||||
|
useUserMessageTemplateForCC.setLabelText(Tr::tr("Use User Template for code completion message for non-FIM models"));
|
||||||
|
|
||||||
|
userMessageTemplateForCC.setSettingsKey(Constants::CC_USER_TEMPLATE);
|
||||||
|
userMessageTemplateForCC.setDisplayStyle(Utils::StringAspect::TextEditDisplay);
|
||||||
|
userMessageTemplateForCC.setDefaultValue("Here is the code context with insertion points: <code_context>"
|
||||||
|
"\nBefore: %1After: %2\n </code_context>");
|
||||||
|
|
||||||
useFilePathInContext.setSettingsKey(Constants::CC_USE_FILE_PATH_IN_CONTEXT);
|
useFilePathInContext.setSettingsKey(Constants::CC_USE_FILE_PATH_IN_CONTEXT);
|
||||||
useFilePathInContext.setDefaultValue(true);
|
useFilePathInContext.setDefaultValue(true);
|
||||||
useFilePathInContext.setLabelText(Tr::tr("Use File Path in Context"));
|
useFilePathInContext.setLabelText(Tr::tr("Use File Path in Context"));
|
||||||
@ -228,6 +237,8 @@ CodeCompletionSettings::CodeCompletionSettings()
|
|||||||
auto contextItem = Column{Row{contextGrid, Stretch{1}},
|
auto contextItem = Column{Row{contextGrid, Stretch{1}},
|
||||||
Row{useSystemPrompt, Stretch{1}},
|
Row{useSystemPrompt, Stretch{1}},
|
||||||
systemPrompt,
|
systemPrompt,
|
||||||
|
Row{useUserMessageTemplateForCC, Stretch{1}},
|
||||||
|
userMessageTemplateForCC,
|
||||||
Row{useFilePathInContext, Stretch{1}},
|
Row{useFilePathInContext, Stretch{1}},
|
||||||
Row{useProjectChangesCache, maxChangesCacheSize, Stretch{1}}};
|
Row{useProjectChangesCache, maxChangesCacheSize, Stretch{1}}};
|
||||||
|
|
||||||
|
@ -66,6 +66,8 @@ public:
|
|||||||
Utils::IntegerAspect readStringsAfterCursor{this};
|
Utils::IntegerAspect readStringsAfterCursor{this};
|
||||||
Utils::BoolAspect useSystemPrompt{this};
|
Utils::BoolAspect useSystemPrompt{this};
|
||||||
Utils::StringAspect systemPrompt{this};
|
Utils::StringAspect systemPrompt{this};
|
||||||
|
Utils::BoolAspect useUserMessageTemplateForCC{this};
|
||||||
|
Utils::StringAspect userMessageTemplateForCC{this};
|
||||||
Utils::BoolAspect useFilePathInContext{this};
|
Utils::BoolAspect useFilePathInContext{this};
|
||||||
Utils::BoolAspect useProjectChangesCache{this};
|
Utils::BoolAspect useProjectChangesCache{this};
|
||||||
Utils::IntegerAspect maxChangesCacheSize{this};
|
Utils::IntegerAspect maxChangesCacheSize{this};
|
||||||
|
@ -95,6 +95,8 @@ const char CC_READ_STRINGS_AFTER_CURSOR[] = "QodeAssist.ccReadStringsAfterCursor
|
|||||||
const char CC_USE_SYSTEM_PROMPT[] = "QodeAssist.ccUseSystemPrompt";
|
const char CC_USE_SYSTEM_PROMPT[] = "QodeAssist.ccUseSystemPrompt";
|
||||||
const char CC_USE_FILE_PATH_IN_CONTEXT[] = "QodeAssist.ccUseFilePathInContext";
|
const char CC_USE_FILE_PATH_IN_CONTEXT[] = "QodeAssist.ccUseFilePathInContext";
|
||||||
const char CC_SYSTEM_PROMPT[] = "QodeAssist.ccSystemPrompt";
|
const char CC_SYSTEM_PROMPT[] = "QodeAssist.ccSystemPrompt";
|
||||||
|
const char CC_USE_USER_TEMPLATE[] = "QodeAssist.ccUseUserTemplate";
|
||||||
|
const char CC_USER_TEMPLATE[] = "QodeAssist.ccUserTemplate";
|
||||||
const char CC_USE_PROJECT_CHANGES_CACHE[] = "QodeAssist.ccUseProjectChangesCache";
|
const char CC_USE_PROJECT_CHANGES_CACHE[] = "QodeAssist.ccUseProjectChangesCache";
|
||||||
const char CC_MAX_CHANGES_CACHE_SIZE[] = "QodeAssist.ccMaxChangesCacheSize";
|
const char CC_MAX_CHANGES_CACHE_SIZE[] = "QodeAssist.ccMaxChangesCacheSize";
|
||||||
const char CA_USE_SYSTEM_PROMPT[] = "QodeAssist.useChatSystemPrompt";
|
const char CA_USE_SYSTEM_PROMPT[] = "QodeAssist.useChatSystemPrompt";
|
||||||
|
@ -25,48 +25,15 @@
|
|||||||
|
|
||||||
namespace QodeAssist::Templates {
|
namespace QodeAssist::Templates {
|
||||||
|
|
||||||
class ClaudeCodeCompletion : public LLMCore::PromptTemplate
|
class Claude : public LLMCore::PromptTemplate
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
LLMCore::TemplateType type() const override { return LLMCore::TemplateType::Chat; }
|
LLMCore::TemplateType type() const override { return LLMCore::TemplateType::Chat; }
|
||||||
QString name() const override { return "Claude Code Completion"; }
|
QString name() const override { return "Claude"; }
|
||||||
QString promptTemplate() const override { return {}; }
|
|
||||||
QStringList stopWords() const override { return QStringList(); }
|
|
||||||
void prepareRequest(QJsonObject &request, const LLMCore::ContextData &context) const override
|
|
||||||
{
|
|
||||||
QJsonArray messages = request["messages"].toArray();
|
|
||||||
|
|
||||||
for (int i = 0; i < messages.size(); ++i) {
|
|
||||||
QJsonObject message = messages[i].toObject();
|
|
||||||
QString role = message["role"].toString();
|
|
||||||
QString content = message["content"].toString();
|
|
||||||
|
|
||||||
if (message["role"] == "user") {
|
|
||||||
message["content"]
|
|
||||||
= QString("Here is the code context with insertion points: <code_context>"
|
|
||||||
"\nBefore: %1\nAfter: %2\n </code_context>")
|
|
||||||
.arg(context.prefix, context.suffix);
|
|
||||||
} else {
|
|
||||||
message["content"] = QString("%1").arg(content);
|
|
||||||
}
|
|
||||||
|
|
||||||
messages[i] = message;
|
|
||||||
}
|
|
||||||
|
|
||||||
request["messages"] = messages;
|
|
||||||
}
|
|
||||||
QString description() const override { return "Claude Chat for code completion"; }
|
|
||||||
};
|
|
||||||
|
|
||||||
class ClaudeChat : public LLMCore::PromptTemplate
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
LLMCore::TemplateType type() const override { return LLMCore::TemplateType::Chat; }
|
|
||||||
QString name() const override { return "Claude Chat"; }
|
|
||||||
QString promptTemplate() const override { return {}; }
|
QString promptTemplate() const override { return {}; }
|
||||||
QStringList stopWords() const override { return QStringList(); }
|
QStringList stopWords() const override { return QStringList(); }
|
||||||
void prepareRequest(QJsonObject &request, const LLMCore::ContextData &context) const override {}
|
void prepareRequest(QJsonObject &request, const LLMCore::ContextData &context) const override {}
|
||||||
QString description() const override { return "Claude Chat"; }
|
QString description() const override { return "Claude"; }
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace QodeAssist::Templates
|
} // namespace QodeAssist::Templates
|
||||||
|
@ -50,8 +50,7 @@ inline void registerTemplates()
|
|||||||
templateManager.registerTemplate<ChatML>();
|
templateManager.registerTemplate<ChatML>();
|
||||||
templateManager.registerTemplate<Alpaca>();
|
templateManager.registerTemplate<Alpaca>();
|
||||||
templateManager.registerTemplate<Llama2>();
|
templateManager.registerTemplate<Llama2>();
|
||||||
templateManager.registerTemplate<ClaudeCodeCompletion>();
|
templateManager.registerTemplate<Claude>();
|
||||||
templateManager.registerTemplate<ClaudeChat>();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace QodeAssist::Templates
|
} // namespace QodeAssist::Templates
|
||||||
|
Loading…
Reference in New Issue
Block a user