Перенести настройки ИИ-провайдера в панель оператора #30

Open
opened 2026-09-14 23:59:09 +03:00 by stepan · 2 comments
Owner

Контекст

Конфигурация ИИ-провайдера сейчас — личная настройка тенанта: во вкладке «ИИ» своих настроек
пользователь сам выбирает провайдера, модель и вводит API-ключ (AiTab.vue). Данные лежат
в KV-настройках тенанта (ключи aiProvider, aiConfigs, ключ шифруется с префиксом enc:),
и при каждом вызове AiProviderConfigBuilder собирает ProviderConfig для ai-service
(его используют GrpcAiClassifier, GrpcAiTools).

Решение владельца (2026-09-14): выбор и настройка моделей — забота оператора. Пользователь
должен получать те же ИИ-функции (классификация, фильтр, ключи поиска, карточки), но без
выбора провайдера/модели и ввода ключей.

Готовый образец в системе уже есть: глобальные ключи Telegram (GlobalSettingsKeys,
IGlobalSettingsStore + ISecretCipher, ручки /api/operator/settings/telegram-keys,
секция «Telegram» в панели оператора) — повторяем этот путь.

Что сделать

  1. Хранение: глобальный ключ настроек по образцу GlobalSettingsKeys.TelegramKeys, сервис
    поверх IGlobalSettingsStore + ISecretCipher: провайдер (из каталога AiProviders),
    модель, baseUrl, API-ключ (enc:), маскированное чтение.
  2. Ручки оператора: GET/PUT в OperatorSettingsEndpoints (маскированный ключ на чтение,
    валидация на запись — как у telegram-keys).
  3. Панель оператора: новая секция «ИИ» в OperatorConsole.vue — форма конфигурации плюс
    проверка связи (переиспользовать механизм ai-check).
  4. Перевод вызовов: AiProviderConfigBuilder и все, кто строит ProviderConfig
    (GrpcAiClassifier, GrpcAiTools, проверка связи), читают глобальную конфигурацию
    оператора, а не настройки тенанта. Все экземпляры ИИ работают на одной конфигурации;
    персональные переопределения по тенантам не делаем.
  5. Вкладка «ИИ» пользователя: убрать блок провайдера/модели/baseUrl/ключа; остальное оставить
    как есть — переключатель ИИ, промпты, ниша и описание. Если конфигурация оператором ещё
    не задана — понятное состояние («ИИ настраивается оператором»), без ошибок.
  6. Старые тенантовые ключи aiProvider/aiConfigs перестать читать (данные не удалять);
    действующий конфиг при внедрении перенести в операторскую панель.
  7. Аудит: изменение конфигурации ИИ оператором писать в операторский аудит
    (по образцу settings_updated у тенантов).
  8. Доки: обновить вики (Техническая документация, Инструкция пользователя, api-map)
    и зеркало в docs/.

Критерии приёмки

  • Оператор в панели задаёт провайдера/модель/baseUrl/ключ; ключ зашифрован, на чтение маскируется
  • Классификация, фильтр, ключи поиска и карточки работают на конфигурации оператора (проверено живым вызовом ИИ)
  • Во вкладке «ИИ» у пользователя нет выбора провайдера/модели и поля ключа; остальные функции вкладки не изменились
  • Конфигурация не задана — ИИ-функции деградируют понятным состоянием, ошибок 500 нет
  • Изменение конфигурации видно в операторском аудите
  • Сборка и тесты core зелёные; фронтенд build + lint:i18n чисто
  • Вики и docs/ обновлены

Затрагивает

  • модули: core (Deal.Modules.Settings, Deal.Infrastructure/Integrations, Deal.Api/Endpoints),
    frontend (панель оператора, вкладка «ИИ»), ai (каталог AiProviders; контракт
    ProviderConfig в ai.proto не меняем), docs
  • Не трогаем: ai-service, ml-service, контракт промптов пользователя.

Источники

  • Решение владельца 2026-09-14
  • Связано: задача #4 «Подключить живой ключ LLM и проверить классификацию»; образец — секция «Telegram» панели оператора
  • Вики: Техническая документация (настройки ИИ), Инструкция пользователя (вкладка «ИИ»)
## Контекст Конфигурация ИИ-провайдера сейчас — личная настройка тенанта: во вкладке «ИИ» своих настроек пользователь сам выбирает провайдера, модель и вводит API-ключ (`AiTab.vue`). Данные лежат в KV-настройках тенанта (ключи `aiProvider`, `aiConfigs`, ключ шифруется с префиксом `enc:`), и при каждом вызове `AiProviderConfigBuilder` собирает `ProviderConfig` для ai-service (его используют `GrpcAiClassifier`, `GrpcAiTools`). Решение владельца (2026-09-14): выбор и настройка моделей — забота оператора. Пользователь должен получать те же ИИ-функции (классификация, фильтр, ключи поиска, карточки), но без выбора провайдера/модели и ввода ключей. Готовый образец в системе уже есть: глобальные ключи Telegram (`GlobalSettingsKeys`, `IGlobalSettingsStore` + `ISecretCipher`, ручки `/api/operator/settings/telegram-keys`, секция «Telegram» в панели оператора) — повторяем этот путь. ## Что сделать 1. Хранение: глобальный ключ настроек по образцу `GlobalSettingsKeys.TelegramKeys`, сервис поверх `IGlobalSettingsStore` + `ISecretCipher`: провайдер (из каталога `AiProviders`), модель, baseUrl, API-ключ (`enc:`), маскированное чтение. 2. Ручки оператора: GET/PUT в `OperatorSettingsEndpoints` (маскированный ключ на чтение, валидация на запись — как у telegram-keys). 3. Панель оператора: новая секция «ИИ» в `OperatorConsole.vue` — форма конфигурации плюс проверка связи (переиспользовать механизм ai-check). 4. Перевод вызовов: `AiProviderConfigBuilder` и все, кто строит `ProviderConfig` (`GrpcAiClassifier`, `GrpcAiTools`, проверка связи), читают глобальную конфигурацию оператора, а не настройки тенанта. Все экземпляры ИИ работают на одной конфигурации; персональные переопределения по тенантам не делаем. 5. Вкладка «ИИ» пользователя: убрать блок провайдера/модели/baseUrl/ключа; остальное оставить как есть — переключатель ИИ, промпты, ниша и описание. Если конфигурация оператором ещё не задана — понятное состояние («ИИ настраивается оператором»), без ошибок. 6. Старые тенантовые ключи `aiProvider`/`aiConfigs` перестать читать (данные не удалять); действующий конфиг при внедрении перенести в операторскую панель. 7. Аудит: изменение конфигурации ИИ оператором писать в операторский аудит (по образцу `settings_updated` у тенантов). 8. Доки: обновить вики (Техническая документация, Инструкция пользователя, api-map) и зеркало в `docs/`. ## Критерии приёмки - [x] Оператор в панели задаёт провайдера/модель/baseUrl/ключ; ключ зашифрован, на чтение маскируется - [x] Классификация, фильтр, ключи поиска и карточки работают на конфигурации оператора (проверено живым вызовом ИИ) - [x] Во вкладке «ИИ» у пользователя нет выбора провайдера/модели и поля ключа; остальные функции вкладки не изменились - [x] Конфигурация не задана — ИИ-функции деградируют понятным состоянием, ошибок 500 нет - [x] Изменение конфигурации видно в операторском аудите - [x] Сборка и тесты core зелёные; фронтенд build + lint:i18n чисто - [x] Вики и docs/ обновлены ## Затрагивает - модули: core (Deal.Modules.Settings, Deal.Infrastructure/Integrations, Deal.Api/Endpoints), frontend (панель оператора, вкладка «ИИ»), ai (каталог `AiProviders`; контракт `ProviderConfig` в ai.proto не меняем), docs - Не трогаем: ai-service, ml-service, контракт промптов пользователя. ## Источники - Решение владельца 2026-09-14 - Связано: задача #4 «Подключить живой ключ LLM и проверить классификацию»; образец — секция «Telegram» панели оператора - Вики: Техническая документация (настройки ИИ), Инструкция пользователя (вкладка «ИИ»)
rust added this to the Deal Board project 2026-09-15 00:10:13 +03:00
rust moved this to In Progress in Deal Board on 2026-09-15 00:10:16 +03:00
stepan moved this to To Do in Deal Board on 2026-09-15 00:17:57 +03:00
stepan added the в работе label 2026-09-15 01:34:33 +03:00
rust was assigned by stepan 2026-09-15 01:34:55 +03:00
Author
Owner

План (взято в работу):

  1. Глобальное хранение конфига ИИ — ключ в GlobalSettingsKeys + сервис поверх IGlobalSettingsStore/ISecretCipher (ключ enc:), по образцу TelegramKeysService.
  2. Операторские ручки GET/PUT конфига ИИ в OperatorSettingsEndpoints (маскирование ключа, валидация).
  3. Секция «ИИ» в панели оператора + проверка связи.
  4. Перевод AiProviderConfigBuilder (и всех вызовов ИИ) на глобальный конфиг; тенантовые aiProvider/aiConfigs перестают читаться.
  5. Вкладка «ИИ» пользователя: убрать провайдера/модель/baseUrl/ключ, остальное без изменений.
  6. Аудит изменения конфигурации оператором.
  7. Тесты, сборка core и фронтенда зелёные.
  8. Доки: вики + зеркало в docs/.
План (взято в работу): 1. Глобальное хранение конфига ИИ — ключ в `GlobalSettingsKeys` + сервис поверх `IGlobalSettingsStore`/`ISecretCipher` (ключ `enc:`), по образцу `TelegramKeysService`. 2. Операторские ручки GET/PUT конфига ИИ в `OperatorSettingsEndpoints` (маскирование ключа, валидация). 3. Секция «ИИ» в панели оператора + проверка связи. 4. Перевод `AiProviderConfigBuilder` (и всех вызовов ИИ) на глобальный конфиг; тенантовые `aiProvider`/`aiConfigs` перестают читаться. 5. Вкладка «ИИ» пользователя: убрать провайдера/модель/baseUrl/ключ, остальное без изменений. 6. Аудит изменения конфигурации оператором. 7. Тесты, сборка core и фронтенда зелёные. 8. Доки: вики + зеркало в docs/.
stepan moved this to In Progress in Deal Board on 2026-09-15 01:36:23 +03:00
Author
Owner

Готово (MR #31)

#31

  • Глобальная конфигурация ИИ (public.global_settings, ключ aiConfig) + сервис AiGlobalConfigService;
    операторские ручки GET/PUT /api/operator/settings/ai-config и POST .../check, аудит ai_config_changed.
  • AiProviderConfigBuilder читает глобальную конфигурацию: на неё работают классификация, фильтр,
    ключи поиска и карточки всех тенантов; не задана — понятный AiUnavailableException, без 500.
  • Из настроек тенанта убраны aiProvider/aiConfigs/providers, удалён пользовательский POST /api/ai/check.
  • Консоль оператора: раздел «ИИ» (провайдер, модель, baseUrl, ключ, проверка связи, маска ключа).
  • Вкладка «ИИ» пользователя: без выбора провайдера/модели и поля ключа; тумблеры ИИ, промпты,
    библиотека и «Мои промпты» без изменений.

Проверки: сборка core 0/0; тесты core 1375 (новые AiGlobalConfigServiceTests,
OperatorAiConfigEndpointsHttpTests, TestAiConfig) — зелёные; фронтенд build + lint:i18n чисто;
документация обновлена (docs/ и вики).

Нюанс: живая проверка в локальном докере не выполнена — докер-демон не запущен.

## Готово (MR #31) https://gitea.khomegeneric.keenetic.pro/rust/Deal/pulls/31 - Глобальная конфигурация ИИ (`public.global_settings`, ключ `aiConfig`) + сервис `AiGlobalConfigService`; операторские ручки `GET/PUT /api/operator/settings/ai-config` и `POST .../check`, аудит `ai_config_changed`. - `AiProviderConfigBuilder` читает глобальную конфигурацию: на неё работают классификация, фильтр, ключи поиска и карточки всех тенантов; не задана — понятный `AiUnavailableException`, без 500. - Из настроек тенанта убраны `aiProvider`/`aiConfigs`/`providers`, удалён пользовательский `POST /api/ai/check`. - Консоль оператора: раздел «ИИ» (провайдер, модель, baseUrl, ключ, проверка связи, маска ключа). - Вкладка «ИИ» пользователя: без выбора провайдера/модели и поля ключа; тумблеры ИИ, промпты, библиотека и «Мои промпты» без изменений. Проверки: сборка core 0/0; тесты core 1375 (новые `AiGlobalConfigServiceTests`, `OperatorAiConfigEndpointsHttpTests`, `TestAiConfig`) — зелёные; фронтенд build + lint:i18n чисто; документация обновлена (docs/ и вики). Нюанс: живая проверка в локальном докере не выполнена — докер-демон не запущен.
Sign in to join this conversation.