// Copyright (C) 2024-2026 Petr Mironychev // SPDX-License-Identifier: GPL-3.0-or-later // Additional attribution terms under GPLv3 §7(b) apply — see LICENSE #pragma once #include #include #include #include #include #include "ChatModel.hpp" #include "ChatSerializer.hpp" #include #include #include #include namespace QodeAssist { class SessionManager; class Session; class ConversationHistory; } namespace QodeAssist::Skills { class SkillsManager; } namespace QodeAssist::Chat { class ClientInterface : public QObject { Q_OBJECT public: explicit ClientInterface(ChatModel *chatModel, QObject *parent = nullptr); ~ClientInterface(); void setSkillsManager(Skills::SkillsManager *skillsManager); void setSessionManager(SessionManager *sessionManager); void setHistory(ConversationHistory *history); void setActiveAgent(const QString &agentName); void sendMessage( const QString &message, const QList &attachments = {}, const QList &linkedFiles = {}); void clearMessages(); void cancelRequest(); Context::ContextManager *contextManager() const; void setChatFilePath(const QString &filePath); QString chatFilePath() const; signals: void errorOccurred(const QString &error); void messageReceivedCompletely(); void requestStarted(const QString &requestId); void messageUsageReceived( int promptTokens, int completionTokens, int cachedPromptTokens, int reasoningTokens); private: void onSessionEvent(Session *session, const QodeAssist::ResponseEvent &ev); void onSessionFinished(const QString &requestId); void onSessionFailed(const QString &requestId, const QodeAssist::ErrorInfo &error); QStringList invokedSkillNames(const QString &message) const; QString buildChatContextLayer() const; QString requestIdForSession(Session *session) const; bool isImageFile(const QString &filePath) const; QString getMediaTypeForImage(const QString &filePath) const; QString encodeImageToBase64(const QString &filePath) const; struct RequestContext { QJsonObject originalRequest; QPointer session; }; ChatModel *m_chatModel; Context::ContextManager *m_contextManager; QPointer m_history; Skills::SkillsManager *m_skillsManager = nullptr; QPointer m_sessionManager; QString m_activeAgent; QString m_chatFilePath; std::shared_ptr m_contentCache; QHash m_activeRequests; }; } // namespace QodeAssist::Chat