Міграція з консолі
Заміна get_lang_code_by_provider_and_language і get_language_by_code на HTTP-виклик.
Консоль (animated-spoon) резолвить коди мов у cabinet/helpers.py. Цей сервіс замінює ті хелпери. Поведінка сумісна за побудовою — міграція механічна.
Відповідність
| Хелпер консолі | Цей сервіс |
|---|---|
get_lang_code_by_provider_and_language(service_name, language) |
GET /v1/resolve?provider=…&language=… → code |
get_language_by_code(code) |
GET /v1/normalize?language=… → language |
get_exact_language(code) |
GET /v1/languages/{code} (404 якщо невідомо; без фолбеку на базову) |
get_lang_code(language) |
GET /v1/languages/{code} → code |
Language.full_abbreviation() |
GET /v1/languages/{code} → code |
Аргументи міняти не треба
provider приймає service_name консолі дослівно. Кожен зі 106 рядків translation_provider і всі 14 рядків translation_automlprovider зареєстровані як аліаси провайдерів:
# було
code = get_lang_code_by_provider_and_language("OpenAiGPT4o_2024_11_20_Provider", language)
# стало — той самий рядок, та сама відповідь
code = client.get(
"/v1/resolve",
params={
"provider": "OpenAiGPT4o_2024_11_20_Provider",
"language": language.full_abbreviation(),
},
).json()["code"]
language приймає все, що прийняла б консоль: дволітерну абревіатуру, будь-який регіональний код, будь-який регістр.
Що змінилось свідомо
Неоднозначні пари тепер мають одну відповідь. 330 пар (провайдер, мова) мали кілька кодів, і .first() у Django брав той рядок, який віддав Postgres. Який код використовувала ваша задача — на практиці було довільно. Тепер це зафіксовано й задокументовано, і кожне написання-програвший лишається вхідним аліасом, тож ніщо, що резолвилось раніше, не перестає. Повний перелік рішень — у data/seed/REPORT.md.
Зламані коди виправлені. Код себуанської в консолі починається з кириличної с, тож get_language_by_code("ceb") ніколи в нього не влучав. Тут — влучає.
Зрізання code[:2] стало справжнім пошуком. Консоль закінчується на lang_region_list.code[:2] — перші два символи довільного регіонального коду. Для ceb-latn-ph це дає ce, тобто чеченську. Цей сервіс натомість іде до справжнього рядка базової мови, тож ceb лишається ceb.
Провайдери рівня моделі згорнулись. OpenAI GPT 4o-2024-11-20 і OpenAI GPT 5-mini — це обидва openai_api. Їхні таблиці мов у консолі були майже ідентичні; де вони різнились, перемагав вибір новішої моделі. Див. Providers and Vendors.
Що не змінилось
Усе інше. Кожна базова мова досі резолвиться у власний код без мапінгу, і кожна регіональна без мапінгу досі фолбечиться в базову — ті самі два правила, що й у консолі, у тому самому порядку. Див. Resolution Ladder.
Резолвіть обидві мови одним викликом
Задачі потрібні source і target. Не робіть два запити:
pairs = [
{"provider": provider, "language": source_code},
{"provider": provider, "language": target_code},
]
items = client.post("/v1/resolve/batch", json={"pairs": pairs}).json()["items"]
source_lang, target_lang = (item["result"]["code"] for item in items)
Див. Резолвінг усієї задачі.
Рекомендований розкат
- Тінь. Викликайте цей сервіс паралельно з наявним хелпером і логуйте розбіжності. Очікувані — лише на 330 неоднозначних парах і на себуанській.
- Перемкніть читання. Замініть хелпер. Лишіть
service_nameяк аргумент провайдера — більше нічого міняти не треба. - Перейдіть на канонічні коди. Зберігайте
languageіз відповіді замість сирого вхідного написання. Саме цей крок робить записи порівнюваними; робіть його коли зручно, а не як передумову. - Виведіть таблиці консолі з експлуатації, коли з них ніхто не читає.
Обробка збоїв
Сервіс — залежність на шляху перекладу. Дві речі роблять це безпечним:
- Кеш. Каталог змінюється кілька разів на місяць. Кешувати
(provider, language) → codeна хвилини безпечно, і це прибирає сервіс із вашого гарячого шляху взагалі. - Фолбек на вхідне значення. Якщо виклик впав і кешованої відповіді немає, надіслати канонічний код, який у вас уже є, — це те саме, що дала б політика
passthrough. Залогуйте це; не валіть задачу.
Далі
- Resolution Ladder — що означають відповіді
- Endpoints Index — усе доступне