feat: AI model selector + i18n nav labels (RU/EN) on new modules

AI model selector:
- AiAssistantService::MODEL_DEFAULTS and MODEL_OPTIONS const tables (3 picks per
  provider: Claude Opus 4.7 / Sonnet 4.6 / Haiku 4.5, OpenAI 4o / 4o-mini,
  Gemini 1.5 Pro / Flash). Default upgraded from Sonnet 4.5 → Sonnet 4.6.
- modelFor(provider, company?) resolves tenant override > global default.
- All 8 hardcoded model strings replaced with modelFor() across callClaude
  (chat with tool-use), callOpenAI, callGemini (chat), postClaude/postOpenAI/
  postGemini (single-shot), and OcrInvoiceService.
- Settings page adds 3 model selectors per provider with persistence at
  settings.ai.models.{claude,gpt,gemini}.

i18n nav labels:
- TireSet / Bodyshop / Subcontractor / SubcontractJob / PricingCoefficient /
  ShopCustomer resources: getNavigationLabel / getNavigationGroup /
  getModelLabel / getPluralModelLabel return __()-wrapped strings.
- 20 keys added to lang/ru.json and lang/en.json.

Tests (4 new): default model, tenant override wins, unknown provider falls
back to claude default, options dictionary contains each default key.

Full suite: 134 passed.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-06-03 06:23:21 +00:00
parent 3da1f5412a
commit 0e3f9e8bca
12 changed files with 301 additions and 13 deletions
+21 -2
View File
@@ -21,7 +21,6 @@
"Status": "Статус",
"Actions": "Действия",
"Notifications": "Уведомления",
"Clienți": "Клиенты",
"Mașini": "Машины",
"Cereri": "Заявки",
@@ -53,5 +52,25 @@
"Jurnal": "Журнал",
"Telefonie": "Телефония",
"Finanțe": "Финансы",
"Site PSauto": "Сайт"
"Site PSauto": "Сайт",
"Seturi anvelope": "Шины (комплекты)",
"Anvelope": "Шины",
"set anvelope": "комплект шин",
"seturi anvelope": "комплекты шин",
"Tinichigerie / Detailing": "Кузов / Детейлинг",
"Tinichigerie": "Кузовной цех",
"lucrare caroserie": "кузовная работа",
"lucrări caroserie": "кузовные работы",
"Subcontractori": "Субподрядчики",
"Subcontractare": "Субподряд",
"subcontractor": "субподрядчик",
"Lucrări terți": "Работы у третьих лиц",
"lucrare terți": "работа у третьих лиц",
"lucrări terți": "работы у третьих лиц",
"Coeficienți preț": "Ценовые коэффициенты",
"coeficient": "коэффициент",
"Magazin": "Магазин",
"Clienți magazin": "Клиенты магазина",
"client magazin": "клиент магазина",
"clienți magazin": "клиенты магазина"
}