Providers and Vendors
The 26 providers, why the console's 106 rows collapsed into them, and how outbound codes were chosen.
curl "https://languages.service.custom.mt/v1/providers"
curl "https://languages.service.custom.mt/v1/providers/deepl_api"
curl "https://languages.service.custom.mt/v1/providers/deepl_api/languages?effective=true"
The catalog
Provider codes are the same ones provider_credentials uses. One identifier resolves a credential there and a language code here; a caller never has to translate between two naming schemes.
| Vendor | Providers |
|---|---|
| OpenAI | openai_api |
| Anthropic | anthropic_api |
| Google Cloud | google_translate, gemini_api |
| Microsoft Azure | microsoft_translator |
| Amazon Web Services | amazon_translate |
| DeepL | deepl_api |
| Translated | modernmt_api, lara_api |
| LanguageWire | languagewire_api |
| SYSTRAN | systran_translate |
| Tencent | tencent_transmart |
| Alibaba Cloud | alibaba_translate |
| Baidu | baidu_translate |
| Naver | papago_translate |
| Supertext | supertext_translate |
| XL8 | xl8_translate |
| Tarjama | tarjama_mt |
| Tahrirchi | tilmoch_api, sayqalchi_api |
| Widn.AI | widn_tower_anthill, widn_tower_sugarloaf, widn_tower_vesuvius |
| Internal | custom_finetuned_mt |
| Yandex Cloud | yandex_translate ⚠ |
| Pangeanic | pangea_mt ⚠ |
Warning
in_credentials_catalog: false
yandex_translate and pangea_mt carry console mappings — Yandex alone has 102 — but have no entry in provider_credentials yet. They are kept here so existing traffic keeps resolving, and flagged in the API so a caller can see the mapping exists without a credential contract behind it.
Why 106 console rows became 26
The console's translation_provider table has one row per model: OpenAI GPT 4o-2024-11-20, OpenAI GPT 5-mini-2025-08-07, Gemini 2.5 Pro, and so on — plus *_in_sys / *_out_sys rows that are billing meters, not engines.
Model rows collapse into their vendor's API provider because language support is a property of the vendor endpoint, not of the checkpoint behind it. provider_credentials already treats the model as a model_id configuration field under one credential, and duplicating a 130-row language table per model would mean 17 tables to keep in step for OpenAI alone.
The billing meters are dropped: they carry region-code links copied from their parent model, and importing them would double-count every mapping.
Nothing breaks for callers — every collapsed service_name survives as a provider alias:
curl ".../v1/resolve?provider=OpenAiGPT4o_2024_11_20_Provider&language=zh-CN"
# → { "provider": "openai_api", "code": "zh-CN", … }
The console's AutoML providers fold in the same way: GoogleAutoMLProvider addresses google_translate, LaraAutoMLProvider addresses lara_api. Their codes go to the same vendor APIs.
How the outbound code was chosen
For 97 (provider, language) pairs the console offered several codes. The winner is picked by:
- the console's
is_defaultflag on the region code, - equals the language's own canonical code — when several spellings compete and one is what we already call the language, sending anything else is gratuitous divergence,
- BCP-47 canonicality (
es-419overES-LA), - the newest legacy provider that chose it — later model rows were curated more recently than the 2023-era ones,
- the lowest region-code id, matching the console's
.first()for ties.
Unlike the language's canonical code, this never prefers a shorter tag on its own. If DeepL's API wants zh-Hans and only zh-Hans, the console row saying so is the fact — rule 2 only fires when several spellings genuinely compete.
Every runner-up becomes an inbound alias, so no spelling that resolves today stops resolving. All 97 decisions are listed in data/seed/REPORT.md.
Explicit versus effective
# only pairs someone configured
curl ".../v1/providers/deepl_api/languages"
# every language, fallbacks included — what the provider would actually receive
curl ".../v1/providers/deepl_api/languages?effective=true"
DeepL has 3 explicit rows and 348 effective ones. That is not a gap: base languages need no row, and regional ones fall back per Fallback Policies. The admin panel's coverage bars show the split per provider.
Next
- Fallback Policies — what happens when nothing is configured
- Onboard a provider