TL;DR: Фреймворк Temma позволяет работать с OpenAI как с обычным DataSource - объявляем подключение в конфиге и используем в контроллерах без boilerplate-кода. Полноценная интеграция за 5 минут вместо написания сервисных классов.
Введение: проблема интеграции AI в PHP
Когда мы добавляем AI-функциональность в PHP-приложение, типичный сценарий выглядит так:
- Устанавливаем SDK OpenAI
- Пишем сервисный класс-обёртку
- Настраиваем DI-контейнер
- Инжектим сервис в контроллеры
Это работает, но создаёт избыточную сложность для простых кейсов. Temma предлагает альтернативу - рассматривать OpenAI как ещё один источник данных (DataSource), наравне с БД или кешем.
DataSource в Temma: единый интерфейс для всего
Temma - это MVC-фреймворк “золотой середины” между микрофреймворками и монстрами вроде Symfony. Его ключевая фича - унифицированный доступ к внешним сервисам через концепцию DataSource.
До версии 2.16.0 поддерживались:
- Реляционные БД (MySQL, PostgreSQL)
- NoSQL (Redis, MongoDB)
- Файловые хранилища (S3, локальные)
- Очереди (RabbitMQ, Kafka)
Теперь к ним добавился OpenAI. Вот как это работает:
Конфигурация за 30 секунд
// etc/temma.php
return [
'application' => [
'dataSources' => [
'db' => 'mysql://user:passwd@localhost/mybase',
'openai' => 'openai://chat/gpt-4o/sk-proj-xxxxxxxxxxxxx',
],
],
];
Формат DSN (Data Source Name) для OpenAI:
openai://{mode}/{model}/{api-key}
Где:
mode- тип взаимодействия (chat,completion,embedding)model- идентификатор модели (gpt-4o,gpt-3.5-turboи т.д.)api-key- ваш ключ OpenAI
Использование в контроллерах
Доступ к OpenAI получаем так же, как к БД:
$openai = $this->openai; // Автоматическое подключение
// Простейший запрос
$capital = $openai['What is the capital of France?'];
// Альтернативный синтаксис
$translation = $openai->read('Translate to French: Hello world');
// С fallback-значением
$response = $openai->read(
'Translate to French: Hello world',
'Bonjour le monde' // Вернётся при ошибке API
);
Продвинутые параметры
Можно передавать system prompt и температуру прямо в вызове:
$summary = $openai->read(
'Summarize this article: ' . $text,
null,
[
'system' => 'You are a concise technical writer.',
'temperature' => 0.3,
]
);
Поддержка истории сообщений
Temma автоматически управляет контекстом диалога:
$response = $openai->read('And the capital of Italy?', null, [
'system' => 'You are a geography assistant.',
'messages' => [
['role' => 'user', 'content' => 'What is the capital of France?'],
['role' => 'assistant', 'content' => 'The capital of France is Paris.'],
],
]);
// Вернёт "The capital of Italy is Rome."
Реальный кейс: автоматическая генерация тегов
Рассмотрим практический пример - генерацию тегов для статьи:
#[TμView('~Json')]
class Article extends \Temma\Web\Controller {
protected $_temmaAutoDao = true; // Автогенерация DAO
#[TμMethod('POST')]
public function tag(int $id) {
$article = $this->_dao->get($id);
if (!$article) return $this->_httpError(404);
$tags = $this->openai->read(
'Generate tags for: ' . $article['body'],
null,
[
'system' => 'Reply with exactly 3 tags, comma-separated, lowercase',
'temperature' => 0.2,
]
);
$this->_dao->update($id, ['tags' => $tags]);
$this['tags'] = $tags;
}
}
Что здесь важно:
- Нет ручного инжекта сервиса OpenAI
- Нет boilerplate-кода для инициализации
- Интерфейс идентичен работе с БД
Под капотом: как это работает
Temma использует паттерн Data Mapper для абстракции над источниками данных. Для OpenAI реализован специальный адаптер, который:
- Парсит DSN-строку
- Инициализирует HTTP-клиент с правильными заголовками
- Преобразует вызовы
read()в OpenAI API-запросы - Обрабатывает ошибки и ретраи
Все тяжелые операции спрятаны внутри фреймворка.
Когда это удобно
Такой подход идеален для:
- Быстрого прототипирования AI-фич
- Добавления “умных” подсказок в формах
- Генерации контента (теги, аннотации)
- Чат-интерфейсов с историей сообщений
Для сложных сценариев (fine-tuning, workflow с несколькими моделями) лучше использовать прямой SDK.
Заключение
Temma демонстрирует элегантный способ интеграции AI в PHP-приложения:
- Минимальная конфигурация
- Единый интерфейс для всех внешних сервисов
- Нулевой boilerplate в бизнес-логике
Этот подход особенно полезен для legacy-проектов, где важна минимальная инвазивность изменений. Вместо рефакторинга под AI-ready архитектуру можно просто добавить строку в конфиг и начать делать запросы.
Фреймворк доступен под MIT-лицензией, а OpenAI-DataSource появился в версии 2.16.0. Документация и примеры: temma.net.