Резолвінг усієї задачі
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 — це провайдер, якого хтось перевірив для цієї мови.