Легковесный абстрактный слой для работы с AI-задачами и их обработкой. Пакет предоставляет базовые контракты и примитивы для управления состоянием, поверх которых может строится логика обработки в приложениях.
- Определять состояние жизненного цикла для задачи и результата (
pending,queued,running,completed,failed,cancelled) - Сохранять абстракцию провайдера через
AiClientInterface - Представлять AI-запросы и ответы в виде DTO
- Позволять прикладному коду решать, как преобразовать вывод провайдера в доменные результаты
- Поддерживать повторные попытки и порядок очереди через реализации репозиториев
Задача проходит через следующий путь:
- создаётся в состоянии
PENDING - помещается в очередь в состоянии
QUEUED(если требуется отправка в очередь) - выбирается для обработки и переводится в состояние
RUNNING - при успешном выполнении провайдера становится
COMPLETED - при ошибке провайдера становится
FAILED - повторные попытки обрабатываются логикой репозитория/воркера с указанием времени следующей попытки
- результат может быть обработан сразу или помещен в репозиторий для последующей обработки
Отправка запросов
$workflow = new JobWorkflow($repository, $clientFactory);
$job = $workflow->createJob(
uuid: 'job-123',
provider: 'custom-provider',
model: 'gpt-4o-mini',
messages: [[
'role' => 'user',
'content' => 'Summarize this text',
]],
context: ['user_id' => 42, 'action' => 'text_analysis'],
);
$workflow->processNext();Проверка результата
$workflow = new JobWorkflow($repository, $client);
$jobs = $repository->findByStatus(JobStatus::RUNNING, 100);
foreach ($jobs as $job) {
$workflow->checkResult($job, function (Job $job, AiResponse $respose) {
// Для обработки запроса можно оприратся на параметры из $job->context
});
}Конкретные реализации отвечают за построение запросов провайдера, ограничения скорости, таймауты, политику повторных попыток и преобразование результата.