API предложений для движка
Обратная связь по переводам редко приходит через клик в дашборде. Чаще это строка в инструменте поддержки, заметка от рецензента или задача в QA-очереди: «не переводите название продукта», «используйте формальный регистр в немецком». API Engine Suggestions превращает этот свободный текст в изменения движка прямо из кода: отправьте отзыв текстом, платформа его обработает и вернёт конкретные структурированные правки глоссария, правил или тональности бренда — останется только применить.
Это аналог функции панели управления для работы из кода. В панели предложения создаются автоматически, когда один из ответов пользовательских измерений указывает на низкое качество перевода. Здесь вы передаёте сигнал текстом. Результат в обоих случаях одинаковый — предложения, которые ждут вашей проверки и применения.
Процесс состоит из двух этапов. Генерация проходит асинхронно: вы передаёте обратную связь, платформа анализирует её в фоне и добавляет в движок предложения, ожидающие проверки. Проверка проходит синхронно: вы получаете список предложений, изучаете каждое и применяете или отклоняете его. На этой странице описаны оба этапа. О работе в панели управления — автоматической генерации на основе низких оценок в ответах пользовательских измерений, переключателе Предлагать улучшения на вкладке Оценщики движка и Очереди, где предложения ждут решения, — читайте в разделе Предложения движка.
Это endpoint конфигурации, а не перевода
Эти эндпоинты читают и изменяют конфигурацию движка: глоссарий, правила и тональность бренда. Они привязаны к конкретному движку по его :id и используют тот же X-API-Key с областью видимости организации, что и остальной API. Контент они не переводят и прошлые переводы не меняют — применённое предложение вступает в силу при следующем переводе.
Аутентификация
Передавайте API-ключ в заголовке X-API-Key. Ключи действуют на уровне организации и дают доступ ко всем движкам в её пределах. Подробности см. в разделе Authentication, а общую модель ошибок для всех endpoints на этой странице — в разделе Errors and status codes.
Генерация из обратной связи#
POST /engines/:id/suggestions/from-textОтправьте текстовое описание того, в чём движок ошибается. Платформа анализирует этот текст вместе с текущей конфигурацией движка и предлагает атомарные правки — она не будет повторно предлагать то, что в движке уже есть. Генерация выполняется асинхронно, поэтому вызов возвращается сразу после принятия задачи в работу, а не после того, как предложения будут готовы.
| Параметр | Тип | Описание |
|---|---|---|
id (path) | string | Движок, для которого нужно сгенерировать предложения. |
text | string | Текстовая обратная связь о результатах работы движка. От 1 до 10 000 символов; должна содержать хотя бы один непробельный символ. |
const response = await fetch(
`https://api.lingo.dev/engines/${engineId}/suggestions/from-text`,
{
method: "POST",
headers: {
"X-API-Key": process.env.LINGO_API_KEY,
"Content-Type": "application/json",
},
body: JSON.stringify({
text: "Our German (de-DE) translations keep using the informal 'du'. For our B2B audience they must always use the formal 'Sie'.",
}),
},
);
const { enqueued } = await response.json();
console.log(enqueued); // true – generation accepted, running in the background{ "enqueued": true }enqueued: true означает, что платформа приняла задачу в работу, а не что предложения уже готовы. Генерация — это один фоновый этап: платформа читает ваш текст, анализирует конфигурацию, убирает дубликаты относительно того, что уже есть, и сохраняет всё, что предлагает. Вполне нормально, если по итогам запуска не будет предложено ничего вовсе (например, если обратная связь была слишком расплывчатой или движок уже это учитывает). Чтобы увидеть результат, через несколько секунд получите список предложений движка.
Пустая обратная связь отклоняется
text должен содержать реальное сообщение. Пустая строка или строка только из пробелов отклоняется с ошибкой 400 — она не преобразуется молча в другой тип запроса. Отправляйте то, что модель действительно может проанализировать.
Генерация на основе ответов измерений вместо текста
Генерацию по низким оценкам, как в панели управления, можно запустить и из кода: POST /engines/:id/suggestions/generate (с пустым телом) запрашивает у платформы правки на основе недавних ручных исправлений и низких оценок в ответах пользовательских измерений движка, а не текста. Ответ тот же — { "enqueued": true }, результат — те же предложения, ожидающие проверки. Используйте from-text, если у вас есть конкретная письменная обратная связь, а generate — чтобы получить предложения на основе того, что уже отметили проверяющие и измерения.
Список ожидающих предложений#
GET /engines/:id/suggestionsВозвращает предложения движка, полученные при любом запуске генерации: на основе текста, через …/suggestions/generate или автоматически по низким оценкам в ответах пользовательских измерений. Каждая запись — предлагаемая правка с обоснованием.
[
{
"id": "egs_A1b2C3d4E5f6G7h8",
"ownerOrganizationId": "org_X1y2Z3a4B5c6D7e8",
"ownerEngineId": "eng_X1y2Z3a4B5c6D7e8",
"actionType": "add_instruction",
"targetKind": "instruction",
"targetId": null,
"targetLocale": "de-DE",
"payload": { "instruction": "Use the formal 'Sie' form in all German translations; never use the informal 'du'." },
"reasoning": "Feedback states the B2B audience requires formal address, but the engine has no rule enforcing it.",
"sourceReviewLogIds": [],
"status": "pending",
"appliedTargetId": null,
"createdAt": "2026-06-18T10:30:00.000Z"
}
]| Поле | Описание |
|---|---|
id | Идентификатор предложения с префиксом egs_. Передайте его в apply или dismiss. |
actionType | Одно из значений: add_glossary_item, update_glossary_item, add_instruction, update_instruction, add_brand_voice, update_brand_voice. |
targetKind | Часть движка, которую затрагивает правка: glossary_item, instruction или brand_voice. |
targetId | Для действия update_* — id записи, которую нужно изменить (gli_ / ins_ / bvc_). null для действия add_*. |
targetLocale | Локаль, к которой относится предложение. |
payload | Готовая к применению правка. Её поля зависят от targetKind — это в точности то, что требуется для операции create/update, поэтому для применения от вас не нужен никакой дополнительный ввод. |
reasoning | Краткое объяснение, почему предлагается эта правка. |
sourceReviewLogIds | Логи проверки, ошибки в которых стали основанием для предложения (id esrl_); пусто, если предложение было создано из текста обратной связи. |
status | pending, applied или dismissed. |
appliedTargetId | Запись, созданная или обновлённая после применения предложения; null, пока предложение ожидает обработки. |
Именно payload делает применение простым: предлагаемое изменение полностью структурируется ещё на этапе генерации, поэтому применение — это обычная запись, а не ещё один раунд работы AI. Решение принимаете вы; платформа ничего не переанализирует.
Применение предложения#
POST /engine-suggestions/:id/applyЗаписывает предложенное изменение в движок и помечает предложение как applied. Это детерминированная запись payload, которую вы уже видели в списке, — повторного вызова AI нет, так что в движок попадает именно то, что вы проверили. Предложение add_* создаёт новый элемент глоссария, правило или тональность бренда; предложение update_* изменяет существующую запись с именем targetId.
const response = await fetch(
`https://api.lingo.dev/engine-suggestions/${suggestionId}/apply`,
{
method: "POST",
headers: { "X-API-Key": process.env.LINGO_API_KEY },
},
);
const applied = await response.json();
console.log(applied.status); // "applied"
console.log(applied.appliedTargetId); // "ins_…" – the rule it just createdВ ответе возвращается предложение в статусе applied, где appliedTargetId теперь указывает на реальную запись движка, которую оно создало или обновило. С этого момента запись — обычный элемент глоссария, правило или тональность бренда: открывайте, редактируйте или удаляйте её как любую другую.
Применение меняет конфигурацию, а не прошлые переводы
При применении меняется конфигурация движка. Уже переведённый контент сохраняет текущий результат; изменение проявится при следующем переводе движка. Само по себе применение ничего не локализует заново.
Отклонение предложения#
POST /engine-suggestions/:id/dismissУдаляет ненужное предложение, помечая его как dismissed и не меняя движок. Используйте это, если предложение не подходит вашему продукту: движок останется без изменений, а предложение перестанет отображаться как ожидающее.
await fetch(
`https://api.lingo.dev/engine-suggestions/${suggestionId}/dismiss`,
{
method: "POST",
headers: { "X-API-Key": process.env.LINGO_API_KEY },
},
);
// The suggestion is now "dismissed"; nothing was written to the engine.Полный цикл#
Эти четыре endpoints образуют единый цикл, которым можно полностью управлять из кода: передать обратную связь, посмотреть, что было предложено, и применить те правки, с которыми вы согласны.
Сгенерировать
POST …/suggestions/from-text с вашей письменной обратной связью (или …/suggestions/generate, чтобы вместо текста использовать недавние исправления и низкие оценки в ответах измерений). Вы сразу получаете { "enqueued": true }.
Получить список
Через некоторое время выполните GET /engines/:id/suggestions, чтобы увидеть ожидающие предложения, каждое со своим payload и reasoning.
Применить или отклонить
POST /engine-suggestions/:id/apply, чтобы зафиксировать правку, или …/dismiss, чтобы отказаться от неё. Применение вступит в силу при следующем переводе движка.