Интеграция OpenAI в PHP-фреймворк как DataSource: подход Temma

#php#openai#mvc#temma#datasource

TL;DR: Фреймворк Temma позволяет работать с OpenAI как с обычным DataSource - объявляем подключение в конфиге и используем в контроллерах без boilerplate-кода. Полноценная интеграция за 5 минут вместо написания сервисных классов.

Введение: проблема интеграции AI в PHP

Когда мы добавляем AI-функциональность в PHP-приложение, типичный сценарий выглядит так:

  1. Устанавливаем SDK OpenAI
  2. Пишем сервисный класс-обёртку
  3. Настраиваем DI-контейнер
  4. Инжектим сервис в контроллеры

Это работает, но создаёт избыточную сложность для простых кейсов. Temma предлагает альтернативу - рассматривать OpenAI как ещё один источник данных (DataSource), наравне с БД или кешем.

DataSource в Temma: единый интерфейс для всего

Temma - это MVC-фреймворк “золотой середины” между микрофреймворками и монстрами вроде Symfony. Его ключевая фича - унифицированный доступ к внешним сервисам через концепцию DataSource.

До версии 2.16.0 поддерживались:

Теперь к ним добавился 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}

Где:

Использование в контроллерах

Доступ к 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;
    }
}

Что здесь важно:

  1. Нет ручного инжекта сервиса OpenAI
  2. Нет boilerplate-кода для инициализации
  3. Интерфейс идентичен работе с БД

Под капотом: как это работает

Temma использует паттерн Data Mapper для абстракции над источниками данных. Для OpenAI реализован специальный адаптер, который:

  1. Парсит DSN-строку
  2. Инициализирует HTTP-клиент с правильными заголовками
  3. Преобразует вызовы read() в OpenAI API-запросы
  4. Обрабатывает ошибки и ретраи

Все тяжелые операции спрятаны внутри фреймворка.

Когда это удобно

Такой подход идеален для:

Для сложных сценариев (fine-tuning, workflow с несколькими моделями) лучше использовать прямой SDK.

Заключение

Temma демонстрирует элегантный способ интеграции AI в PHP-приложения:

Этот подход особенно полезен для legacy-проектов, где важна минимальная инвазивность изменений. Вместо рефакторинга под AI-ready архитектуру можно просто добавить строку в конфиг и начать делать запросы.

Фреймворк доступен под MIT-лицензией, а OpenAI-DataSource появился в версии 2.16.0. Документация и примеры: temma.net.


Источник: https://dev.to/amaury_bouchard/calling-openai-from-a-php-framework-the-same-way-you-query-a-database-4n8b