Виклик моделі з невідомим результатом

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, щоб знайти кожен такий виклик, — Операції.

  • Власний кабінет провайдера каже, чи виставив він рахунок за виклик.

Що читати далі