113 lines
3.3 KiB
C++
113 lines
3.3 KiB
C++
// neuralnetworkmanager.h
|
||
#ifndef NEURALNETWORKMANAGER_H
|
||
#define NEURALNETWORKMANAGER_H
|
||
|
||
#include <QObject>
|
||
#include <QNetworkAccessManager>
|
||
#include <QNetworkReply>
|
||
#include <QJsonObject>
|
||
#include <QJsonArray>
|
||
#include <QMutex>
|
||
#include <QTimer>
|
||
#include <QSslConfiguration>
|
||
|
||
class NeuralNetworkManager : public QObject
|
||
{
|
||
Q_OBJECT
|
||
|
||
public:
|
||
enum NetworkType {
|
||
DeepSeek,
|
||
GigaChat,
|
||
ChatGPT,
|
||
Ollama
|
||
};
|
||
|
||
explicit NeuralNetworkManager(QObject *parent = nullptr);
|
||
~NeuralNetworkManager();
|
||
|
||
// Основные методы
|
||
void setCurrentNetworkType(NetworkType type);
|
||
void sendMessage(const QString &message);
|
||
void sendMessage(const QString &message, NetworkType networkType);
|
||
void setPrefix(const QString &prefix);
|
||
void setApiKey(NetworkType networkType, const QString &apiKey);
|
||
void setModel(NetworkType networkType, const QString &model);
|
||
void setBaseUrl(NetworkType networkType, const QString &url);
|
||
|
||
// Настройки Ollama
|
||
void setOllamaUrl(const QString &url);
|
||
|
||
// Настройки GigaChat OAuth
|
||
void setGigaChatCredentials(const QString &clientId,
|
||
const QString &authorizationCode);
|
||
void refreshGigaChatToken();
|
||
|
||
private slots:
|
||
void handleNetworkReply(QNetworkReply *reply);
|
||
void handleGigaChatTokenReply(QNetworkReply *reply);
|
||
|
||
private:
|
||
struct NetworkConfig {
|
||
QString apiKey;
|
||
QString model;
|
||
QString baseUrl;
|
||
QString endpoint;
|
||
};
|
||
|
||
struct GigaChatAuth {
|
||
QString clientId;
|
||
QString authorizationCode;
|
||
QString accessToken;
|
||
qint64 tokenExpiry = 0; // Unix timestamp
|
||
};
|
||
|
||
// SSL настройки
|
||
void setupSSL();
|
||
void setupSSLForGigaChat();
|
||
NetworkType m_currentNetworkType = DeepSeek;
|
||
// Основные переменные
|
||
QNetworkAccessManager *networkManager;
|
||
QMap<NetworkType, NetworkConfig> networkConfigs;
|
||
QString currentPrefix;
|
||
QMutex mutex;
|
||
GigaChatAuth gigaChatAuth;
|
||
QString gigaChatScope = "GIGACHAT_API_PERS";
|
||
bool isProcessingGigaChatToken = false;
|
||
|
||
// Методы для подготовки запросов
|
||
QNetworkRequest prepareRequest(NetworkType type);
|
||
QByteArray prepareRequestBody(NetworkType type, const QString &message);
|
||
|
||
// Методы для парсинга ответов
|
||
QString parseResponse(NetworkType type, const QByteArray &data);
|
||
QString truncateResponse(const QString &response);
|
||
|
||
// Методы для работы с GigaChat OAuth
|
||
void requestGigaChatToken();
|
||
bool isGigaChatTokenValid() const;
|
||
bool shouldRefreshGigaChatToken() const;
|
||
|
||
int m_tokenRetryCount = 0;
|
||
const int MAX_TOKEN_RETRIES = 3;
|
||
|
||
// Очередь сообщений для GigaChat
|
||
struct PendingMessage {
|
||
QString message;
|
||
NetworkType networkType;
|
||
};
|
||
QList<PendingMessage> pendingMessages;
|
||
void processPendingMessages();
|
||
void sendMessageInternal(const QString &message, NetworkType networkType);
|
||
|
||
// Конфигурация по умолчанию
|
||
void setupDefaultConfigs();
|
||
|
||
signals:
|
||
void responseReceived(const QString &response);
|
||
void errorOccurred(const QString &errorMessage);
|
||
void gigaChatTokenRefreshed();
|
||
};
|
||
|
||
#endif // NEURALNETWORKMANAGER_H
|