8#include <QNetworkRequest>
9#include <QNetworkReply>
10#include <QNetworkAccessManager>
12using namespace Qt::Literals::StringLiterals;
16MachineTranslator::MachineTranslator()
17 : m_request(std::make_unique<QNetworkRequest>()),
18 m_manager(std::make_unique<QNetworkAccessManager>()),
19 m_translator(std::make_unique<Ollama>())
21 m_request->setHeader(QNetworkRequest::ContentTypeHeader,
"application/json"_L1);
22 m_request->setTransferTimeout(5 * 60 * 1000);
29 auto batches = m_translator->makeBatches(messages, userContext);
30 for (
auto &b : std::as_const(batches))
36 m_translator->setUrl(url);
37 m_request->setUrl(m_translator->translationEndpoint());
42 if (
auto wakeupPayload = m_translator->stageModel(modelName)) {
55 auto *tempManager =
new QNetworkAccessManager(
this);
57 QNetworkRequest wakeupRequest(m_translator->translationEndpoint());
58 wakeupRequest.setHeader(QNetworkRequest::ContentTypeHeader,
"application/json"_L1);
59 wakeupRequest.setTransferTimeout(30000);
61 QNetworkReply *reply = tempManager->post(wakeupRequest, *wakeupPayload);
63 connect(reply, &QNetworkReply::finished,
this, [tempManager, reply]() {
65 tempManager->deleteLater();
72 QNetworkRequest req(m_translator->discoveryEndpoint());
73 QNetworkReply *reply = m_manager->get(req);
74 connect(reply, &QNetworkReply::finished,
this, [
this, reply]() {
77 if (reply->error() == QNetworkReply::NoError) {
78 const QByteArray response = reply->readAll();
79 models = m_translator->extractModels(response);
81 emit modelsReceived(std::move(models));
89 const QByteArray body = m_translator->payload(b);
90 QNetworkReply *reply = m_manager->post(*m_request, body);
91 connect(reply, &QNetworkReply::finished,
this,
92 [
this, reply, batch = std::move(b), session = m_session.load(), tries] {
93 translationReceived(reply, std::move(batch), tries, session);
100 if (m_stopped || session != m_session.load())
103 if (reply->error() != QNetworkReply::NoError) {
104 if (tries < s_maxTries
105 && (reply->error() == QNetworkReply::OperationCanceledError
106 || reply->error() == QNetworkReply::TimeoutError
107 || reply->error() == QNetworkReply::UnknownNetworkError)) {
108 translateBatch(std::move(b), tries + 1);
112 QList<
const TranslatorMessage *> failed;
113 for (
const auto &i : std::as_const(b.items))
114 failed.append(i.msg);
115 emit translationFailed(std::move(failed));
119 const QByteArray response = reply->readAll();
120 QList<Item> items = std::move(b.items);
121 QHash<
const TranslatorMessage *, QString> out;
122 const QHash<QString, QString> translations = m_translator->extractTranslations(response);
123 for (Item &i : items) {
124 if (i.msg->translation().isEmpty()) {
125 if (QString translation = translations[i.msg->sourceText()]; !translation.isEmpty())
126 out[i.msg] = std::move(translation);
128 b.items.append(std::move(i));
132 if (out.empty() && tries == s_maxTries) {
133 QList<
const TranslatorMessage *> failed;
134 for (
const auto &i : std::as_const(b.items))
135 failed.append(i.msg);
136 emit translationFailed(std::move(failed));
137 }
else if (out.empty() && tries < s_maxTries) {
138 translateBatch(std::move(b), tries + 1);
140 emit batchTranslated(std::move(out));
141 if (!b.items.empty())
142 translateBatch(std::move(b), tries);
void setUrl(const QString &url)
void translate(const Messages &messages, const QString &userContext=QString())
void activateTranslationModel(const QString &modelName)