Вызов модели с неизвестным исходом
PHPКак SDK сообщает, что провайдер был вызван, а его ответ потерян, что Slen делает с деньгами и как повторить запуск, не заплатив дважды.
3 мин чтения
Иногда провайдер вызван, а его ответ так и не возвращается: провайдер не ответил вовремя или взял вызов на выполнение в фоне, и спросить о нём больше нельзя. Никто не знает, был ли вызов сделан, поэтому за него могли заплатить. SDK сообщает об этом своим типом, а выполнение — статусом uncertain. Эта страница говорит, где встречается такой исход и что с ним делать.
Где он встречается
Запуск.
operations.execute()выбрасываетOperationUncertainErrorв Node.js иOperationUncertainExceptionв PHP, с кодомoperation_uncertain. Выполнение закрывается со статусомuncertainи тем же кодом.Чтение позже. Выполнение, прочитанное через
executions.wait(), чтением статуса или повтором запуска под его ключом, возвращается ответом со статусомuncertain, а не ошибкой. Так же заканчивается запуск, отправленный в асинхронном режиме, если провайдер выполнял вызов модели в фоне и спросить о нём больше нельзя.
ProviderError и ProviderException с кодом, который говорит, что вызов не удался целиком, — provider_error, provider_unavailable, provider_rate_limit, provider_timeout, provider_not_configured, pool_exhausted — вернули деньги вызова. Тот же тип с любым другим кодом или без кода не говорит, как далеко зашёл вызов: считайте это тоже неизвестным исходом — Обработка ошибок.
Что делает Slen
Slen не делает вызов ещё раз, а SDK сам не отправляет запуск ещё раз:
504он не повторяет никогда.Деньги, зарезервированные под вызов, не возвращаются сразу, потому что провайдеру могли заплатить. Они остаются в резерве, пока холд не истечёт, — когда, говорит статья Как работает резервирование бюджета, — и до тех пор учитываются в бюджетах.
Slen ничего не списывает за вызов: он не узнал, что вызов израсходовал.
cost.actualвыполнения этот вызов не учитывает.Вебхук-событие
operation.uncertainсообщает о вызове — Вебхуки.
Повторить запуск под его ключом
Сохраните ключ идемпотентности запуска, исход которого неизвестен. Под новым ключом тот же запуск становится новым, и за вызов модели могут заплатить второй раз.
use Slen\Sdk\Exceptions\OperationUncertainException;
use Slen\Sdk\Modules\Operations\Options\ExecuteOptions;
$input = ['messages' => [['role' => 'user', 'content' => 'Write a short follow-up email.']]];
$key = 'order-42:email';
try {
$execution = $slen->operations()->execute('generate_email', $input, new ExecuteOptions(idempotencyKey: $key));
echo $execution->status->value, PHP_EOL;
} catch (OperationUncertainException $error) {
// A provider was called and its answer was lost: the call may have been paid for.
// Keep the key. Under a new one the same request may pay for the call a second time.
echo 'outcome unknown: ', $error->errorCode, PHP_EOL;
}Запуск, отправленный ещё раз под тем же ключом, ничего не выполняет: ответом на него будет выполнение, которое открыл первый запрос, в его нынешнем состоянии.
use Slen\Sdk\Modules\Operations\Enums\ExecutionStatus;
// The same request under the same key runs nothing: it reads the execution the first one opened.
$again = $slen->operations()->execute('generate_email', $input, new ExecuteOptions(idempotencyKey: $key));
if ($again->status === ExecutionStatus::Uncertain) {
echo $again->status->value, ': ', $again->errorCode, PHP_EOL;
}Выполнять ли работу снова под новым ключом — решать вам: тогда за нужный вам ответ, возможно, заплатят дважды.
Узнать, что произошло
В трассировке выполнения есть событие
uncertainна узле AI-модель, который сделал вызов: его читаетexecutions.trace().Вызовы моделей проекта хранят свои попытки у провайдеров: какое подключение, какая модель, сколько ждали. Выведите операции проекта со статусом
uncertain, чтобы найти каждый такой вызов, — Операции.Собственный кабинет провайдера говорит, выставил ли он счёт за вызов.
Что читать дальше
Обработка ошибок — какие ошибки говорят, что запуск мог стоить денег.
Ключи идемпотентности — чем отвечают на повтор под ключом.
Асинхронные запуски и ожидание — статусы выполнения, которое не закончилось.
Коды ошибок —
operation_uncertainи что с ним делать.