AI-ассистент дашбордов
Третий способ собрать запрос для виджета — описать нужное словами. POST /api/dashboards/ai/suggest принимает {db, prompt}, передаёт LLM описание схемы (только имена таблиц/колонок, типы, PK/NOT NULL и подсказанные связи — ни одной строки реальных данных), получает один SELECT с объяснением, затем прогоняет его через EXPLAIN и превью — так же, как это уже устроено у умного экспорта.
curl -X POST $URL/api/dashboards/ai/suggest -H "X-Token: $TOK" -d '{
"db": "shop",
"prompt": "Выручка по месяцам за последний год"
}'
{
"sql": "SELECT strftime('%Y-%m', created_at) AS month, SUM(amount) AS revenue FROM orders WHERE created_at >= ... GROUP BY month",
"explain": "Суммирует amount по месяцам за последние 12 месяцев",
"plan": "...",
"preview": [ ... ]
}
Используется тот же провайдер, что настроен для AI-чата и умного экспорта (глобальный пресет, см. страницу «Настройка AI: провайдеры и пресеты») — отдельного ключа для дашбордов заводить не нужно.
Модель предлагает, а не решает
Промпт просит модель вернуть только SELECT, но промпт — не защита, а лишь подсказка. Настоящая граница — тот же parser-level read-only guard, что и у остальных трёх источников запроса: что бы модель ни вернула, в том числе в результате prompt injection или галлюцинации, запрос проверяется и выполняется только через ExecReadOnlySQL. Если LLM «придумает» DELETE вместо SELECT, запрос будет отклонён этим guard'ом до какого-либо выполнения, а не молчаливо провалится где-то глубже.
POST /api/dashboards/ai/validate даёт прогнать через ту же цепочку (валидация → EXPLAIN → превью) уже готовый SQL — свой или отредактированный ответ модели — без нового обращения к LLM.