Обзор
AI-ассистент для управления ресурсами Frame
Frame предоставляет инфраструктуру для интеграции AI в управление ресурсами. AI-функциональность реализована как отдельный модуль, который подключается без изменения ядра.
Подход
AI в Frame работает на уровне ресурсов — он знает структуру полей, типы данных, доступные операторы фильтрации, описания полей и связи между ресурсами. Это позволяет AI точно понимать контекст и генерировать корректные данные.
Ключевые принципы:
- Модульность — AI подключается как отдельный пакет, не является частью ядра
- Провайдер-агностик — работает с любым OpenAI-совместимым API через Laravel AI SDK
- Безопасность — чувствительные данные (пароли, токены, PII) автоматически исключаются из контекста AI
- Пользователь решает — AI заполняет формы и настраивает фильтры, но не сохраняет данные автоматически
Сценарии использования
| Контекст | Что делает AI |
|---|---|
| Каталог | Настраивает фильтры, сортировки и поиск по текстовому описанию |
| Создание записи | Заполняет поля формы, находит и подставляет связанные записи |
| Редактирование | Точечно изменяет конкретные поля по запросу |
Как это работает
- Пользователь нажимает кнопку AI на странице ресурса
- Вводит запрос на естественном языке в popover
- Backend формирует промпт на основе реальной структуры ресурса (поля, типы, операторы)
- LLM генерирует структурированный ответ (JSON с фильтрами или значениями полей)
- Frontend применяет результат к таблице или форме
Для relation полей AI использует tool calling — вызывает поиск по связанному ресурсу через SearchDriver, находит подходящую запись и подставляет её.
Настройка ресурса
Ресурсы могут предоставить AI дополнительный контекст через configureAi:
use Frame\Ai\Agents\ResourceAgent;
use Frame\Ai\Concerns\HasAiAgent;
class UserResource extends Resource
{
use HasAiAgent;
public static function configureAi(ResourceAgent $agent): void
{
$agent
->describe('name', 'Имя пользователя')
->describe('surname', 'Фамилия пользователя')
->describe('birthday', 'Дата рождения в формате YYYY-MM-DD')
->describe('audience', 'Тип аудитории: Junior или Adult');
}
}
Описания из configureAi попадают в промпт и помогают модели точнее интерпретировать поля.
HasAiAgent и configureAi — опциональны. AI работает с любым ресурсом, но с описаниями — точнее.