Яким типом помилки стає кожен код

PHP

Тип помилки, який кожен SDK кидає для коду помилки API, як типи пов’язані між собою і які помилки SDK кидають самі.

Кожен SDK кидає для кожного коду помилки API свій тип, і обидва SDK у цьому збігаються: код відповідає тому самому типу в PHP і в Node.js. Ця сторінка називає тип кожного коду й помилки, які SDK кидають без відповіді API.

Як пов’язані типи

  • Усі помилки SDK мають один кореневий тип: SlenException у PHP, у просторі імен Slen\Sdk\Exceptions, і SlenError у Node.js. catch кореневого типу перехоплює будь-яку помилку, яку кидає SDK.

  • Тип називається однаково в обох мовах: BudgetExceededException у PHP — це BudgetExceededError у Node.js.

  • Відмови у витраті мають свого батька: SpendRefusedException у PHP і SpendRefusedError у Node.js. Кожна відповідь зі статусом 402 кидається як цей тип або як тип, який його розширює.

  • Заблокований клієнт, CustomerBlockedException або CustomerBlockedError, розширює тип відмови політики, PolicyDeniedException або PolicyDeniedError.

  • Кожен інший тип розширює кореневий напряму.

  • Код, для якого SDK не має типу, кидається за своїм статусом: як помилка ключа для 401 або 403, як відмова у витраті для 402, як ліміт запитів для 429, як помилка провайдера для 5xx і як відхилений запит для будь-якого іншого статусу.

Тип кожного коду

Таблиця не містить кодів консолі й налаштувань: жоден виклик SDK не робить запитів, на які відповідають цими кодами.

КодHTTP-статусТип помилки в SDKЩо це означаєЩо робити
invalid_api_key401AuthenticationException PHPAuthenticationError Node.jsУ запиті немає API-ключа або є ключ, якого Slen не знає, — скопійований з помилкою, відкликаний або замінений ротацією.Перевірте значення заголовка Authorization. Відкликаний ключ більше не працює — випустіть новий у консолі.
insufficient_scope403AuthenticationException PHPAuthenticationError Node.jsКлюч дійсний, але в нього немає дозволу, якого вимагає операція, — або його не містить роль людини, яка ввійшла в консоль. Повідомлення помилки називає цей дозвіл і в обох випадках каже про API-ключ.Використайте ключ із цим дозволом або випустіть такий ключ. Давайте ключу лише ті дозволи, які потрібні його сервісу. Людині, яка ввійшла в консоль, потрібна роль, що містить цей дозвіл; її дає власник або адміністратор організації.
not_authenticated401AuthenticationException PHPAuthenticationError Node.jsНіхто не ввійшов. У запиті немає ні API-ключа, ні сесії людини, яка ввійшла в консоль, або сесія закінчилася.Надішліть API-ключ у заголовку Authorization або знову ввійдіть у консоль.
not_a_member403AuthenticationException PHPAuthenticationError Node.jsЛюдина, яка ввійшла в консоль, не учасник організації, про яку запит, або ще не належить до жодної організації.Прийміть запрошення до організації або перемкніться на організацію, учасником якої ви є.
project_access_restricted403—Той, хто викликає, бачить лише частину проєктів організації і спробував змінити те, що належить усій організації, або прочитати журнал аудиту. API-ключу доступний лише проєкт, якому він належить.З API-ключем створюйте потрібне в проєкті ключа — підключення провайдера, у якого scope дорівнює project. Людина просить внести зміну учасника, якому доступні всі проєкти.
account_suspended403AuthenticationException PHPAuthenticationError Node.jsОбліковий запис людини, яка входить, призупинено, і вхід відхилено.Обліковий запис не може ввійти, доки його не відновлять. Напишіть у підтримку, щоб дізнатися причину.
policy_denied403PolicyDeniedException PHPPolicyDeniedError Node.jsПолітика відхилила запит до того, як було зарезервовано будь-які гроші. Повідомлення помилки називає політику.Прочитайте в повідомленні, яка політика відхилила запит. Змініть запит — модель, операцію, вартість — або змініть політику в консолі.
model_not_allowed403PolicyDeniedException PHPPolicyDeniedError Node.jsВузол моделі у флоу називає модель, якої немає в каталозі, або модель, яку вимкнено. Виконання закінчується як failed з цим кодом.Виберіть у вузлі моделі модель зі списку моделей — у ньому активні моделі, що мають чинну ціну, — і опублікуйте нову версію.
budget_exceeded402BudgetExceededException PHPBudgetExceededError Node.jsВиклик вивів би бюджет за його ліміт. Те, що бюджет уже тримає й витратив у поточному вікні, разом із холдом, який просить цей виклик, більше за ліміт.Дочекайтеся наступного вікна бюджету — його resets_at каже коли; бюджет типу total заново не починається. Або підніміть ліміт бюджету.
operation_limit_exceeded402OperationLimitExceededException PHPOperationLimitExceededError Node.jsБюджет на операцію обмежує, скільки може зарезервувати один виклик операції, а холд, який просить цей виклик, вищий за це обмеження.Просіть менше — менше вихідних токенів, дешевшу модель — або підніміть обмеження. Той самий запит буде відхилено знову, доки одне з них не зміниться.
concurrency_limit_exceeded402ConcurrencyLimitException PHPConcurrencyLimitError Node.jsБюджет типу concurrency — у консолі «Одночасні резерви» — дозволяє тримати відкритими задане число холдів одночасно, і всі вони зайняті викликами, які виконуються.Надішліть запит знову, коли закінчиться один із викликів, що виконуються, або підніміть ліміт бюджету. Запит до флоу надсилайте знову з новим ключем, бо його відхилене виконання зберігає ключ, який у нього був. Це не ліміт запитів ключа.
insufficient_credits402InsufficientCreditsException PHPInsufficientCreditsError Node.jsРахунок клієнта не може покрити ціну виклику в кредитах, або клієнт не має рахунку цього типу кредитів. Списання або коригування відхиляються так само, коли залишили б баланс нижчим за те, що тримає рахунок.Поповніть кредити клієнта. Рахунок, у налаштуваннях якого дозволено від’ємний баланс, не відхиляє.
customer_blocked403CustomerBlockedException PHPCustomerBlockedError Node.jsКлієнта, для якого зроблено запуск, заблоковано. Новий запуск цього клієнта відхиляється до того, як щось створено. Запуск, який уже триває, відхиляється на наступному холді кредитів, і виконання завершується з цим кодом.Розблокуйте клієнта, щоб його запуски знову проходили. Поки клієнта заблоковано, його кредити можна поповнювати, списувати й коригувати, а виписку — читати.
customer_has_history409—Клієнта не можна видалити, бо з ним уже щось відбувалося — на рахунку є кредити або резерв, або у виписці є запис. Журнал кредитів лише доповнюється, і його записи пояснюють баланс.Заблокуйте клієнта замість видалення.
customer_not_found404CustomerNotFoundException PHPCustomerNotFoundError Node.jsПроєкт не знає клієнта, якого називає запит, — клієнта не додавали, не поповнювали й не налаштовували, або його видалили. Так відхиляється виклик операції з ціною для такого клієнта, а також читання, блокування, списання й видалення. Коригування рахунку, якого немає, відхиляється так само.Спершу додайте клієнта або поповніть його — поповнення створює клієнта й рахунок.
overrun_stopped402OverrunStoppedException PHPOverrunStoppedError Node.jsОцінка виклику моделі у флоу, зроблена знову після того, як узято холд, і до виклику провайдера, перевищила холд більше, ніж дозволяє допуск перевищення вузла, а політика перевитрати вузла моделі — зупинити. Холд повернуто, провайдера не викликано. Той самий код завершує виконання, коли людина відхилила погодження, яке запросила перевитрата, або ніхто не відповів вчасно. У нового вузла моделі політики перевитрати немає, а політика, яка у вузла є, практично не спрацьовує, бо обидві оцінки рахуються за одним і тим самим запитом з різницею в мить.Надішліть запит знову з новим ключем — виклик буде оцінено заново, і він візьме власний холд. Щоб таких відмов не було, вимкніть політику перевитрати вузла моделі й опублікуйте нову версію.
overrun_approval_required402OverrunApprovalRequiredException PHPOverrunApprovalRequiredError Node.jsОцінка виклику моделі у флоу, зроблена знову після того, як узято холд, і до виклику провайдера, перевищила холд більше, ніж дозволяє допуск перевищення вузла, а політика перевитрати вузла моделі просить людину схвалити різницю. Виконання чекає на це рішення, тому на запит відповідає виконання, що чекає, а не цей код. У нового вузла моделі політики перевитрати немає, а політика, яка у вузла є, практично не спрацьовує, бо обидві оцінки рахуються за одним і тим самим запитом з різницею в мить.Ухваліть рішення щодо погодження в консолі. Погодження, яке відхилили або щодо якого ніхто не вирішив вчасно, завершує виконання з кодом overrun_stopped.
reservation_not_found404—Це не відповідь жодної операції API. Slen тримає цей код для холду, який не може знайти, поки закриває виклик моделі.Обробляти нічого. Якщо відповідь усе ж його принесе, напишіть у підтримку й наведіть id запиту.
reservation_expired409—Це не відповідь жодної операції API. Slen тримає цей код для продовження холду, що сплив; холд, що сплив, усе ще приймає списання свого виклику.Обробляти нічого. Якщо відповідь усе ж його принесе, напишіть у підтримку й наведіть id запиту.
invalid_request409, 422—Запит не можна виконати в такому вигляді, і повідомлення помилки каже чому — політика без параметра, потрібного її дії, або з умовою, якої її дія ніколи не зустрічає; вибрані проєкти для учасника, чия роль відкриває всі проєкти; заголовок Idempotency-Key довший за 190 символів. SDK самі викидають помилку з цим кодом для виклику, який відхиляють до надсилання.Прочитайте повідомлення й змініть запит.
idempotency_key_required400—Операція вимагає заголовок Idempotency-Key, а в запиті його немає або він порожній.Надішліть власний ключ, який називає одиницю роботи, і надсилайте той самий ключ, коли повторюєте цю роботу.
idempotency_conflict409IdempotencyConflictException PHPIdempotencyConflictError Node.jsКлюч Idempotency-Key уже використав інший запит — той самий ключ з іншим тілом або ключ іншого поповнення, списання чи коригування проєкту.Надішліть новий запит із новим ключем. На повтор першого запиту з його ключем відповідають як раніше.
idempotency_in_progress409IdempotencyConflictException PHPIdempotencyConflictError Node.jsВиклик моделі у флоу зустрів холд, який усе ще стоїть під його власним ключем, і його відхилено, щоб провайдера не було викликано двічі. Виконання закінчується як failed з цим кодом. Звичайний запуск із цим не стикається.Прочитайте виконання та його трасування. Надсилайте запит знову з новим ключем, лише якщо відповідь усе ще потрібна, — за перший виклик могли заплатити.
cost_calculation_failed422InvalidRequestException PHPInvalidRequestError Node.jsМодель активна, але в неї немає чинної ціни, тому Slen не може порахувати, скільки коштуватиме виклик, і виклик відхиляється.Назвіть модель зі списку моделей — у ньому активні моделі, що мають чинну ціну.
provider_not_configured422ProviderException PHPProviderError Node.jsЖодне підключення проєкту не може обслужити провайдера запитаної моделі, тому виклик нікуди надіслати. У флоу той самий код приходить, коли пул, через який вузол моделі спрямовує виклик, видалено або вимкнено.Додайте підключення до цього провайдера в консолі або увімкніть те, яке є. Увімкніть пул знову або виберіть у вузлі моделі інший пул і опублікуйте нову версію. Потім надішліть запит із новим ключем.
provider_rate_limit429ProviderException PHPProviderError Node.jsПровайдер відповів, що його ліміт запитів вичерпано. Пул, який перемикає підключення за ліміту запитів, спершу пробує інше; цей код приходить, коли нічого іншого не пробували.Надішліть виклик знову пізніше з новим ключем. Додайте підключення до пулу або дозвольте пулу перемикати підключення за ліміту запитів.
provider_error502ProviderException PHPProviderError Node.jsПровайдер відхилив виклик або відповів тим, чим Slen не може скористатися, і виклик не завершився.Перевірте, чого запит просить у моделі, — параметр, якого модель не приймає, провайдер відхиляє. Надішліть виклик знову з новим ключем, коли запит буде правильним.
provider_timeout504ProviderException PHPProviderError Node.jsДо провайдера не вдалося достукатися — ім’я не розв’язалося або з’єднання не встановилося, — тому виклик не пішов. Попри назву, це не означає, що модель відповідала повільно.Надішліть виклик знову пізніше з новим ключем. Провайдер, до якого достукалися і який не відповів вчасно, — це operation_uncertain, а не цей код.
provider_unavailable502ProviderException PHPProviderError Node.jsПровайдер відповів збоєм на своєму боці. Slen ставить це підключення на паузу, а пул, який перемикає підключення, пробує інше.Надішліть виклик знову пізніше з новим ключем. Пул із кількома підключеннями переживає збій одного з них.
pool_exhausted503ProviderException PHPProviderError Node.jsЖодне підключення пулу не змогло обслужити виклик за те число спроб, яке дозволяє пул. last_error_code у деталях помилки називає останній збій, а заголовок Retry-After каже, скільки чекати, коли це відомо.Зачекайте стільки, скільки каже Retry-After, і надішліть виклик знову з новим ключем. Якщо пул вичерпується часто, додайте до нього підключення.
operation_uncertain504OperationUncertainException PHPOperationUncertainError Node.jsПровайдера було викликано, а його відповідь не повернулася, тому невідомо, чи було виклик зроблено й оплачено. Так само закінчується виклик моделі у флоу, який ішов у фоні, якщо провайдер його прийняв, а запитати провайдера про нього більше не вдалося. Холд не повертається — він тримається, доки не спливе. Виконання, яке так закінчилося, отримує статус uncertain.Не надсилайте виклик знову з новим ключем — це може бути другий оплачений виклик. Прочитайте операцію або виконання, щоб дізнатися, що сталося. Подія вебхука operation.uncertain теж повідомляє про такий виклик.
ledger_unavailable503ServiceUnavailableException PHPServiceUnavailableError Node.jsРеєстр витрат був недоступний, коли виклик попросив свій холд. Виклик не авторизовано — для нього нічого не зарезервовано, і його провайдера не викликано.Надішліть запит знову пізніше — запит до флоу з новим ключем, бо його невдале виконання зберігає ключ, який у нього був. GET /v1/degraded-status каже, що API пропускає, поки реєстр недоступний.
flow_runtime_error—FlowRuntimeException PHPFlowRuntimeError Node.jsКод, який середовище виконання тримає для флоу, що зламався під час виконання з причини, для якої в нього немає вужчого коду. Зараз цим кодом не відповідає жоден запит і ним не закінчується жодне виконання — збій виконання має вужчий код або не має жодного.Зараз обробляти нічого. Якщо відповідь усе ж принесе цей код, прочитайте трасування виконання, щоб побачити, де воно зупинилося. Виклики моделей до цього місця оплачено, і повтор із новим ключем оплатить їх знову.
invalid_flow_input422—У вході немає того, що потрібно вузлу флоу, — флоу, який викликає модель, вимагає непорожній messages у вході. Виконання закривається як failed, і ключ залишається за ним.Виправте вхід і надішліть його з новим ключем. На повтор із тим самим ключем відповідає невдале виконання.
step_limit_exceeded500FlowRuntimeException PHPFlowRuntimeError Node.jsВиконання не дійшло до кінцевого вузла за те число кроків, яке дозволено одному виконанню. Флоу більший, ніж середовище виконання проходить за один запит.Скоротіть флоу або розділіть роботу між двома операціями. Потім надішліть запит із новим ключем — на повтор із тим самим ключем відповідає невдале виконання.
unrouted_port500FlowRuntimeException PHPFlowRuntimeError Node.jsВузол вийшов через порт, до якого нічого не підключено, і виконанню не було куди йти. Повідомлення помилки називає вузол і порт.Підключіть цей порт у конструкторі флоу й опублікуйте нову версію. Потім надішліть запит із новим ключем — на повтор із тим самим ключем відповідає невдале виконання.
execution_timeout504TimeoutException PHPTimeoutError Node.jsВиконання флоу вичерпало час, який йому відведено. Виклик моделі, який відповів до цього, оплачено.Прочитайте трасування виконання, щоб побачити, куди пішов час. Перш ніж повторювати запит, зважте, що повтор із новим ключем знову оплатить те, що вже оплачено.
execution_parked——Це не відповідь API. Усередині середовища виконання він позначає виконання, яке зупинилося, щоб чекати, а на запит відповідає саме виконання — те, що чекає, або в черзі.Обробляти як помилку нічого. Дочекайтеся виконання так само, як будь-якого іншого, що чекає.
http_request_failed502FlowRuntimeException PHPFlowRuntimeError Node.jsВиклик, який флоу робить до іншого HTTP API, не вдався або отримав у відповідь помилку, а до порту помилки вузла, який його зробив, нічого не підключено. Це не провайдер моделі. Цей вузол заморожено, якщо сервіс не налаштовано інакше, — уже опублікована з ним версія виконується, а нова версія не може його містити.Перевірте API, яке викликає флоу, потім надішліть запит із новим ключем — на повтор із тим самим ключем відповідає невдале виконання. Порт помилки замороженого вузла не можна підключити в новій версії — щоб змінити, що флоу робить у разі такої помилки, опублікуйте версію без цього вузла.
rate_limit_exceeded429RateLimitException PHPRateLimitError Node.jsAPI-ключ або людина, яка ввійшла в консоль, надіслали за хвилину більше запитів, ніж дозволяє ліміт. У кількох операцій свій, менший ліміт — наприклад, у перевірки підключення провайдера. Заголовок Retry-After відповіді каже, скільки секунд чекати. Читання статусу виконання теж рахується.Зачекайте стільки, скільки каже Retry-After, і надішліть запит знову. Для відхиленого запиту нічого не зарезервовано й не витрачено.
flow_not_found404—На код операції не відповідає жоден флоу — до нього не прив’язано флоу, у флоу немає опублікованої версії або флоу в архіві. Нічого не створюється, тому ключ ідемпотентності залишається вільним. Той самий код відповідає на id флоу, який недоступний тому, хто викликає.Прив’яжіть код операції до флоу й опублікуйте флоу. Повтор із тим самим ключем виконається, коли флоу зможе відповісти.
operation_not_found404—Жодна операція — запис одного виклику моделі з його спробами в провайдерів — не має такого id у проєкті ключа.Перевірте id. Операція іншого проєкту відповідає так само.
invalid_credentials401, 502—Два випадки. Вхід у консоль, за якого пошта й пароль не збігаються з жодним обліковим записом. Виклик моделі, за якого провайдер відхилив ключ підключення, що обслуговувало виклик, — тоді Slen позначає облікові дані цього підключення як недійсні.Увійдіть із правильним паролем. Для підключення вкажіть у ньому чинний ключ провайдера в консолі.
csrf_token_mismatch419—Запит сесії консолі прийшов без свого CSRF-токена або із застарілим. Запит з API-ключем цей код ніколи не отримує.Перезавантажте сторінку консолі й повторіть дію.
service_unavailable503ServiceUnavailableException PHPServiceUnavailableError Node.jsSlen не зміг достукатися до своєї бази даних і відповів, нічого не зробивши. Той самий код відповідає на зміну бюджету, яка надто довго чекала викликів, що виконуються на цьому бюджеті; нічого не змінено.Надішліть запит знову пізніше. Відхилена зміна бюджету каже в Retry-After, коли.
not_found404—Реєстрація та вхід у консоль відповіли так, ніби такої адреси немає. Вони відкриті лише для браузера, у якому відкрили видане посилання доступу.Відкрийте своє посилання доступу в цьому браузері, потім знову зареєструйтеся або ввійдіть.
background_hold_expired—TimeoutException PHPTimeoutError Node.jsЦе не відповідь API — ним закінчується виконання, запущене в асинхронному режимі. Виклик моделі у флоу виконувався в провайдера у фоні, і його холд було закрито іншим списанням, поки виклик чекав, тому виклик закінчився, не спитавши в провайдера відповідь. Нічого не повернуто, і провайдер усе ще може виставити рахунок за прийнятий виклик. Попри назву, холд, який просто сплив, так виклик не закінчує.Надсилайте запит знову з новим ключем, лише якщо відповідь усе ще потрібна. Провайдер може виставити рахунок і за перший виклик, тому за відповідь, можливо, доведеться заплатити двічі.
execution_conflict500FlowRuntimeException PHPFlowRuntimeError Node.jsВиконання не вдалося відкрити — його запис зіткнувся з іншим, і не за ключем ідемпотентності. Флоу не виконувався.Надішліть запит знову. Якщо це повториться, напишіть у підтримку й укажіть id запиту.
unknown_node500FlowRuntimeException PHPFlowRuntimeError Node.jsОпублікована версія флоу веде до вузла, якого середовище виконання не може знайти, тому виконання зупинилося.Опублікуйте флоу заново з конструктора флоу, потім надішліть запит із новим ключем — на повтор із тим самим ключем відповідає невдале виконання. Якщо з новим ключем помилка повториться, напишіть у підтримку й укажіть id запиту.
node_type_not_supported500FlowRuntimeException PHPFlowRuntimeError Node.jsВ опублікованій версії флоу є вузол типу, який середовище виконання не вміє виконувати.Замініть вузол у конструкторі флоу й опублікуйте нову версію. Потім надішліть запит із новим ключем — на повтор із тим самим ключем відповідає невдале виконання.
flow_execution_not_found404—Виконання з таким id немає в проєктах, доступних тому, хто викликає, — його не було взагалі, або воно належить іншому проєкту.Перевірте id. Це execution_id відповіді, яка розпочала виконання.

Для коду без власного типу SDK обирає тип помилки за HTTP-статусом відповіді:

  • 401, 403 AuthenticationException PHP, AuthenticationErrorNode.js
  • 402 SpendRefusedException PHP, SpendRefusedErrorNode.js
  • 429 RateLimitException PHP, RateLimitErrorNode.js
  • 500 і вище ProviderException PHP, ProviderErrorNode.js
  • будь-який інший статус InvalidRequestException PHP, InvalidRequestErrorNode.js

Помилки, які SDK кидають самі

Деякі помилки приходять без відповіді API або до надсилання запиту.

ТипКоли
ConnectionException, ConnectionErrorДо Slen не вдалося достукатися, або з’єднання обірвалося, перш ніж відповідь прочитано
TimeoutException, TimeoutErrorВідповідь не прийшла за тайм-аут SDK — timeout і connectTimeout у SlenConfig, timeoutMs у Node.js — або за тайм-аут виклику
InvalidRequestException, InvalidRequestErrorSDK відхиляє виклик до надсилання: порожній ключ ідемпотентності, порожній зовнішній ідентифікатор, сума кредитів, яка не є десятковим рядком, контекст, який називає іншого клієнта, тайм-аут чи кількість повторів виклику поза допустимим. Код — invalid_request
InvalidResponseException, InvalidResponseErrorAPI відповів 2xx із тілом, яке не можна прочитати; помилка зберігає статус. Для доставки вебхука, підпис якої зійшовся, а тіло — не подія, кидається той самий тип
WebhookSignatureException, WebhookSignatureErrorПідпис доставки вебхука не сходиться — Вебхуки

Помилка з’єднання й тайм-аут не мають ні коду, ні статусу. Кожна інша помилка цієї таблиці має код: власний код SDK, яким API ніколи не відповідає, — крім invalid_request, яким користується й API.

Власні коди SDK і тип помилки, який для кожного кидає кожен SDK:

КодPHPNode.js
invalid_requestInvalidRequestExceptionInvalidRequestError
invalid_responseInvalidResponseExceptionInvalidResponseError
webhook_signature_invalidWebhookSignatureExceptionWebhookSignatureError
webhook_payload_invalidInvalidResponseExceptionInvalidResponseError

Після помилки з’єднання або тайм-ауту невідомо, чи зробив Slen роботу. Після нечитабельної відповіді теж невідомо: виклик міг пройти.

Налаштування, з яким SDK не можна зібрати, — порожній ключ, тайм-аут не більший за нуль — це InvalidArgumentException, кинутий там, де збирають SDK. Це помилка в коді, а не помилка SDK, і вона не розширює SlenException.

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

Зібрано з openapi b070e1f, sdk contract 6a2e0e0, php 4089db3, node 0fa87be