Резолвинг всей задачи
Source и target — или один source на много targets — одним запросом.
Цель: задаче перевода нужны коды source и target. Проект разворачивает один source на все targets. Сделайте это за один раунд-трип.
curl -X POST https://languages.service.custom.mt/v1/resolve/batch \
-H 'Content-Type: application/json' \
-d '{"pairs":[
{"provider":"deepl_api","language":"en"},
{"provider":"deepl_api","language":"pt_BR"},
{"provider":"deepl_api","language":"de-CH"}
]}'
{ "items": [
{ "provider": "deepl_api", "language": "en",
"result": { "code": "en", "match": "canonical", … }, "error": null },
{ "provider": "deepl_api", "language": "pt_BR",
"result": { "code": "PT-BR", "match": "exact", … }, "error": null },
{ "provider": "deepl_api", "language": "de-CH",
"result": { "code": "de", "match": "base_language", … }, "error": null }
] }
Порядок сохранён. Элемент n отвечает паре n.
Сбои изолированы. Каждый элемент несёт либо result, либо error, никогда оба, и ответ всегда 200. Один неизвестный язык из пятидесяти не должен стоить вам остальных сорока девяти.
До 500 пар на запрос.
Python
def resolve_job(provider: str, source: str, targets: list[str]) -> tuple[str, dict[str, str]]:
pairs = [{"provider": provider, "language": code} for code in [source, *targets]]
items = (
httpx.post(f"{BASE}/v1/resolve/batch", json={"pairs": pairs}, timeout=10.0)
.raise_for_status()
.json()["items"]
)
head, *rest = items
if head["result"] is None:
raise ValueError(f"язык source {source!r}: {head['error']['message']}")
resolved = {}
for target, item in zip(targets, rest, strict=True):
if item["result"] and item["result"]["supported"]:
resolved[target] = item["result"]["code"]
else:
log.warning("target dropped", extra={"language": target, "provider": provider})
return head["result"]["code"], resolved
Обратите внимание на strict=True в zip: порядок — это гарантия, и её проверка превращает нарушение контракта в исключение вместо тихо смещённого результата.
Сравнение провайдеров для одной языковой пары
Тот же эндпоинт, несколько провайдеров — полезно при выборе движка:
{"pairs": [
{"provider": "deepl_api", "language": "zh-TW"},
{"provider": "google_translate", "language": "zh-TW"},
{"provider": "openai_api", "language": "zh-TW"}
]}
Каждый result.match со значением exact — это провайдер, которого кто-то проверил для этого языка.