Вызов модели с неизвестным исходом

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 сообщает о вызове — Вебхуки.

Повторить запуск под его ключом

Сохраните ключ идемпотентности запуска, исход которого неизвестен. Под новым ключом тот же запуск становится новым, и за вызов модели могут заплатить второй раз.

PHP
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;
}

Запуск, отправленный ещё раз под тем же ключом, ничего не выполняет: ответом на него будет выполнение, которое открыл первый запрос, в его нынешнем состоянии.

PHP
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, чтобы найти каждый такой вызов, — Операции.

  • Собственный кабинет провайдера говорит, выставил ли он счёт за вызов.

Что читать дальше