> ## Documentation Index
> Fetch the complete documentation index at: https://docs.apiyi.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Что такое механизм предварительного списания для API-вызовов?

> Как работает предварительное списание (предварительно потреблённая квота) в APIYI: перед запросом оно оценивает удержание на основе цены модели и входных данных, а затем производит окончательный расчёт по фактическому использованию — а также как читать ошибку insufficient_user_quota.

## Краткий ответ

Перед тем как запрос **фактически выполняется**, APIYI рассчитывает **предварительное удержание** («цена модели × предполагаемые token» — максимальная возможная стоимость) и временно блокирует эту сумму на вашем балансе. Когда запрос завершается, система **производит окончательный расчет по фактически использованным tokens и возвращает разницу** — предварительное удержание это только оценка, а не итоговый счет.

<Info>
  **Две ключевые строки**

  * **Предварительное удержание**: предварительная оценка перед запросом, которая используется, чтобы понять, «можете ли вы оплатить этот вызов».
  * **Фактическая тарификация**: окончательный расчет по реальным token после завершения запроса — именно это и списывается по-настоящему.
</Info>

Если **оценка предварительного удержания > ваш текущий баланс**, запрос отклоняется еще до запуска, и возвращается `insufficient_user_quota`. Это и есть основная причина ситуации «баланс у меня явно есть, но запрос все равно не проходит».

## Как работает предварительное списание

<Steps>
  <Step title="Перед запросом: оценка и удержание">
    Система читает ваш **input** (prompt, изображения, историю переписки и т. д.) и, используя текущую цену модели и **оценочную длину output**, вычисляет **максимально возможную стоимость** и временно удерживает ее из вашего баланса.

    Оценка примерно такая:

    `pre-deduction ≈ model price × (input tokens + estimated output tokens)`
  </Step>

  <Step title="Проверка перед отправкой: достаточно ли баланса">
    Она сравнивает **предварительное списание** с вашим **текущим балансом**:

    * balance ≥ pre-deduction → разрешено, запрос отправляется
    * balance \< pre-deduction → отклонено с `insufficient_user_quota`, и **вызов фактически не выполняется**
  </Step>

  <Step title="После запроса: расчет по факту, возврат разницы">
    После завершения система берет фактическое использование token для input/output и пересчитывает списание по факту:

    * фактическая стоимость **обычно меньше**, чем pre-deduction → излишне удержанная квота **возвращается** на ваш баланс
    * неудачные/прерванные запросы → как правило, не тарифицируются, а удержанная квота освобождается
  </Step>
</Steps>

<Tip>
  **Большое предварительное списание не означает, что вы действительно потратили столько же** — это оценка в формате «резерв на худший случай». Фактически списываются actual token после завершения запроса.
</Tip>

## Чтение ошибки insufficient\_user\_quota

Когда предварительное списание превышает ваш баланс, вы увидите примерно такое:

```json theme={null}
{
  "error": {
    "message": "user [25359] quota [50264897] preConsumedQuota [154753475] is not enough",
    "localized_message": "Insufficient user quota",
    "type": "shell_api_error",
    "param": "",
    "code": "insufficient_user_quota"
  }
}
```

По полям:

| Поле                            | Значение                                                                           |
| ------------------------------- | ---------------------------------------------------------------------------------- |
| `quota [50264897]`              | Ваш **текущий доступный баланс** (внутренняя единица квоты)                        |
| `preConsumedQuota [154753475]`  | **Квота, которую этот запрос хочет предварительно списать**                        |
| `is not enough`                 | предварительное списание > баланс, недостаточно для удержания, **запрос отклонен** |
| `code: insufficient_user_quota` | Код ошибки: недостаточная квота пользователя                                       |

Важно именно **соотношение** между двумя числами: здесь предварительное списание `154753475` примерно в **3×** больше баланса `50264897`, поэтому оно блокируется.

<Note>
  Эти числа — это **внутренние единицы квоты** APIYI, и их можно напрямую сравнивать. В долларовом выражении: баланс ≈ \$100, оценка предварительного списания для этого запроса ≈ \$310 (внутри системы \~500,000 единиц ≈ \$1). Иными словами, этот единственный запрос попытался удержать более \$300, хотя на счете было только \$100 — поэтому он не смог выполниться.
</Note>

## Почему «у меня есть баланс, но это не запускается»

В подавляющем большинстве случаев **проблема в слишком большом input**, а не в самом балансе.

Реальный пример: `gpt-5.5` имеет контекстное окно до 1,050,000 tokens. Если загрузить туда **весь большой code repository**, количество input token становится огромным, и предварительное списание резко возрастает — даже при балансе в \$100 оценка в \$300 все равно будет отклонена еще до запуска запроса.

<Warning>
  **Чем больше input, тем выше предварительное списание**

  Слишком большой input не только увеличивает предварительное списание и легко вызывает `insufficient_user_quota`, но и:

  * даже если запрос пройдет, **фактическая стоимость будет высокой** (тарификация идет по реальным token);
  * если загрузить слишком много нерелевантного контента, модель может **вернуть посредственный результат** — деньги потрачены, а результат слабый.
</Warning>

## Как исправить и избежать этого

<CardGroup cols={2}>
  <Card title="Сократите входные данные" icon="scissors">
    Отправляйте только **релевантный** код/документацию — не загружайте весь репозиторий или длинный документ целиком. Это самый эффективный способ исправить проблему.
  </Card>

  <Card title="Установите max_tokens" icon="ruler">
    Явно ограничьте длину вывода, чтобы снизить «оценочное количество output tokens» и, соответственно, предварительное списание. См. [руководство по max\_tokens](/ru/faq/max-tokens).
  </Card>

  <Card title="Пополните баланс" icon="credit-card">
    Если вам действительно нужен большой входной объем, просто убедитесь, что баланс > предварительное списание. См. [способы оплаты](/ru/faq/payment-methods).
  </Card>

  <Card title="Сначала протестируйте на небольшой модели" icon="flask-conical">
    Проверьте, что ваш входной объем разумен для дешевой модели, а затем переключитесь на более дорогую — не допускайте «сжигания больше, чем вы можете себе позволить».
  </Card>
</CardGroup>

<Tip>
  **Будьте осторожны с большими входными данными**: модели с большим контекстным окном (например, у `gpt-5.5` 1.05M tokens) могут удерживать очень много, но «могут удерживать» не означает «должны удерживать». Запихивать в них весь репозиторий часто и дорого, и посредственно — сначала подумайте, какой контекст вам действительно нужен.
</Tip>

## Вопросы и ответы

<AccordionGroup>
  <Accordion title="Действительно ли предварительное списание спишет такую сумму?">
    Нет. Предварительное списание — это лишь **временное удержание перед запросом**; окончательное списание определяется **фактическим использованием token** после завершения запроса, а излишне удержанная часть возвращается. `preConsumedQuota`, который вы видите, — это оценка «резерв на худший случай», а не реальный счет.
  </Accordion>

  <Accordion title="Будет ли с меня списание, если запрос завершится ошибкой?">
    Обычно нет. Ошибка `insufficient_user_quota` блокируется **до выполнения**, поэтому модель фактически не вызывается, реальных затрат не возникает, а удержанная квота освобождается.
  </Accordion>

  <Accordion title="На балансе явно достаточно средств — почему возникает ошибка квоты?">
    В этой ошибке сравнивается **предварительное списание** с вашим балансом, а не «фактическая стоимость» с балансом. Слишком большой ввод делает оценку предварительного списания намного выше вашего баланса, поэтому запрос отклоняется. Сначала сократите ввод или задайте `max_tokens`, чтобы снизить оценку вывода, и пополните баланс, если этого все еще недостаточно.
  </Accordion>

  <Accordion title="Всегда ли модели с большим контекстным окном дороже?">
    Базовая цена модели задается самой моделью — **большее окно ≠ более высокая цена за единицу**. Но большее окно означает, что вы *можете* передать больше ввода, и когда вы действительно заполняете его, количество input tokens резко растет, и как предварительное списание, так и фактическая стоимость становятся высокими. Дорого стоит не само окно, а «сколько вы в него помещаете».
  </Accordion>
</AccordionGroup>

## Связанные документы

<CardGroup cols={2}>
  <Card title="Почему не запускается, хотя баланс есть?" icon="credit-card" href="/ru/faq/balance-insufficient">
    Полная диагностика и способы устранения проблемы с недостаточным балансом.
  </Card>

  <Card title="Как задать max_tokens?" icon="ruler" href="/ru/faq/max-tokens">
    Управляйте длиной вывода, это влияет на предварительную оценку списания.
  </Card>

  <Card title="Режимы тарификации по token" icon="coins" href="/ru/faq/token-billing-modes">
    Поймите, как работает тарификация по факту использования.
  </Card>

  <Card title="Способы пополнения" icon="credit-card" href="/ru/faq/payment-methods">
    Как быстро пополнить баланс, когда он низкий.
  </Card>
</CardGroup>
