32 QHash<QString, QList<
const TranslatorMessage *>> nonPluralGroups;
33 QHash<QString, QList<
const TranslatorMessage *>> pluralGroups;
35 for (
const auto &item : messages.items) {
36 const QString key = item->context() + item->label();
38 pluralGroups[key].append(item);
40 nonPluralGroups[key].append(item);
45 out.reserve(nonPluralGroups.size() + pluralGroups.size());
47 auto createBatches = [&](
const QHash<QString, QList<
const TranslatorMessage *>> &groups,
48 int pluralFormsCount) {
49 for (
auto it = groups.cbegin(); it != groups.cend(); ++it) {
50 auto msgIt = it.value().cbegin();
51 while (msgIt != it.value().cend()) {
53 b.srcLang = messages.srcLang;
54 b.tgtLang = messages.tgtLang;
56 b.userContext = userContext;
57 b.pluralFormsCount = pluralFormsCount;
58 b.items.reserve(it.value().size());
59 while (msgIt != it.value().cend() && b.items.size() < maxBatchSize) {
62 item.translation = item
.msg->translation();
63 b.items.append(std::move(item));
66 out.append(std::move(b));
71 createBatches(nonPluralGroups, 1);
80 QJsonDocument doc = QJsonDocument::fromJson(response, &err);
81 if (err.error != QJsonParseError::NoError) {
86 QHash<QString, QStringList> translations;
88 translations = extractPluralTranslations(doc.object(),
"Plurals"_L1);
90 auto singleTranslations = extractKeyValuePairs(doc.object(),
"Translations"_L1);
91 for (
auto it = singleTranslations.cbegin(); it != singleTranslations.cend(); ++it)
92 translations[it.key()] << it.value();
95 if (translations.isEmpty()) {
104 if (m_useJsonFormat > 0)
105 m_useJsonFormat = std::numeric_limits<
int>::max();
113 QJsonDocument doc = QJsonDocument::fromJson(response, &err);
114 if (err.error != QJsonParseError::NoError)
116 const QJsonObject obj = doc.object();
117 const QJsonArray arr = obj.value(
"models"_L1).toArray();
119 for (
const QJsonValue &v : arr)
120 models.append(v.toObject().value(
"name"_L1).toString());
126 QJsonObject systemMessage;
127 systemMessage.insert(
"role"_L1,
"system"_L1);
129 systemMessage.insert(
"content"_L1,
130 plural ? pluralTranslationSystemPrompt() : translationSystemPrompt());
132 QJsonObject userMessage;
133 userMessage.insert(
"role"_L1,
"user"_L1);
134 userMessage.insert(
"content"_L1, makePrompt(b));
137 messages.append(systemMessage);
138 messages.append(userMessage);
140 QJsonObject req = *m_payloadBase;
141 req.insert(
"messages"_L1, messages);
143 if (m_useJsonFormat > 0)
144 req.insert(
"format"_L1,
"json"_L1);
146 return QJsonDocument(req).toJson();
151 if (
auto m = m_payloadBase->constFind(
"model"_L1);
152 m == m_payloadBase->constEnd() || *m != modelName) {
153 m_useJsonFormat = TranslationSettings::maxJsonFormatTries();
154 m_payloadBase->insert(
"model"_L1, modelName);
157 std::optional<QByteArray> res;
158 if (!m_lastWakeupTimer.isValid()
159 || m_lastWakeupTimer.hasExpired(TranslationSettings::ollamaWakeUpTimeoutMs())) {
160 m_lastWakeupTimer.start();
162 wakeup.insert(
"model"_L1, modelName);
163 res.emplace(QJsonDocument(wakeup).toJson());