Головна/Інтеграція/Міграція з консолі ENУКРРУС API-довідник (ReDoc) ↗

Міграція з консолі

Заміна 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)

Див. Резолвінг усієї задачі.

Рекомендований розкат

  1. Тінь. Викликайте цей сервіс паралельно з наявним хелпером і логуйте розбіжності. Очікувані — лише на 330 неоднозначних парах і на себуанській.
  2. Перемкніть читання. Замініть хелпер. Лишіть service_name як аргумент провайдера — більше нічого міняти не треба.
  3. Перейдіть на канонічні коди. Зберігайте language із відповіді замість сирого вхідного написання. Саме цей крок робить записи порівнюваними; робіть його коли зручно, а не як передумову.
  4. Виведіть таблиці консолі з експлуатації, коли з них ніхто не читає.

Обробка збоїв

Сервіс — залежність на шляху перекладу. Дві речі роблять це безпечним:

  • Кеш. Каталог змінюється кілька разів на місяць. Кешувати (provider, language) → code на хвилини безпечно, і це прибирає сервіс із вашого гарячого шляху взагалі.
  • Фолбек на вхідне значення. Якщо виклик впав і кешованої відповіді немає, надіслати канонічний код, який у вас уже є, — це те саме, що дала б політика passthrough. Залогуйте це; не валіть задачу.

Далі