Калькулятор стоимости API: токены, кэш и число запросов

Калькулятор стоимости API умножает каждую usage-категорию на её актуальную цену и число вызовов. Input, output, cache write и cache read считаются отдельно, все ставки приводятся к одной валюте за 1 000 000 tokens. Неизвестное значение нельзя молча заменять нулём. Сначала заполните базовый запрос, затем задайте число вызовов и долю cache hit.

Какие данные нужны калькулятору

Для текстового API подготовьте семь входов:

input_tokens_per_call
output_tokens_per_call
cache_write_tokens_per_miss
cache_read_tokens_per_hit
calls
cache_hit_rate
prices_per_1m_tokens

Хотите проверить прогноз калькулятора на реальном вызове? Можно создать аккаунт BetterToken и API Key, взять текущие ставки со страницы цен и выполнить один контролируемый запрос. Затем сопоставьте модель, status, input, output, применимые cache Token и расход в Dashboard — так сразу видно, какие исходные допущения нужно исправить.

Кэширование зависит от модели и протокола. Перед заполнением полей сверяйте API reference BetterToken, OpenAI Prompt Caching или Anthropic Prompt Caching.

Универсальная формула

Обозначения:

I  — обычные input tokens
O  — output tokens
W  — cache write / creation tokens
R  — cache read / cached tokens
Pi — цена input за 1 000 000 tokens
Po — цена output за 1 000 000 tokens
Pw — цена cache write за 1 000 000 tokens
Pr — цена cache read за 1 000 000 tokens

Стоимость одного вызова:

C = I / 1_000_000 × Pi
  + O / 1_000_000 × Po
  + W / 1_000_000 × Pw
  + R / 1_000_000 × Pr
  + Cextra

Cextra включает отдельно тарифицируемые единицы: web search, изображения, аудио, storage, tools или другие операции. Если их нет, значение равно нулю. Если вы не знаете, есть ли дополнительная тарификация, оставьте поле неизвестным и проверьте документацию; ноль в таком случае создаст ложную точность.

Главная ошибка в ручных расчётах — забыть деление на миллион. Если цена указана за 1 000 000 tokens, сначала делите Token на 1_000_000, затем умножайте на ставку.

Копируемый Python-калькулятор

Скрипт не содержит цен и API Key. Он спрашивает значения у пользователя и считает один сценарий. Денежная единица результата совпадает с единицей введённых ставок.

from decimal import Decimal, InvalidOperation

MILLION = Decimal("1000000")

def read_decimal(label: str, *, allow_empty: bool = False) -> Decimal:
    raw = input(label).strip().replace(",", ".")
    if allow_empty and raw == "":
        return Decimal("0")
    try:
        value = Decimal(raw)
    except InvalidOperation as exc:
        raise SystemExit(f"Invalid number for {label!r}") from exc
    if value < 0:
        raise SystemExit(f"Negative value is not allowed for {label!r}")
    return value

input_tokens = read_decimal("Input tokens per call: ")
output_tokens = read_decimal("Output tokens per call: ")
cache_write_tokens = read_decimal("Cache write tokens per call: ")
cache_read_tokens = read_decimal("Cache read tokens per call: ")
calls = read_decimal("Number of calls: ")

price_input = read_decimal("Input price per 1M tokens: ")
price_output = read_decimal("Output price per 1M tokens: ")
price_cache_write = read_decimal("Cache write price per 1M tokens: ")
price_cache_read = read_decimal("Cache read price per 1M tokens: ")
extra_per_call = read_decimal("Extra cost per call (empty = 0): ", allow_empty=True)

per_call = (
    input_tokens / MILLION * price_input
    + output_tokens / MILLION * price_output
    + cache_write_tokens / MILLION * price_cache_write
    + cache_read_tokens / MILLION * price_cache_read
    + extra_per_call
)
total = per_call * calls

print(f"Cost per call: {per_call:.8f}")
print(f"Total cost:    {total:.8f}")

Сохраните код как api_cost_calculator.py и запустите:

python3 api_cost_calculator.py

Не вводите реальные Token в поля cache write/read, если текущий endpoint не разделяет эти категории. Сначала преобразуйте его usage в взаимно исключающие группы, чтобы не посчитать один и тот же Token дважды.

Как учесть cache hit rate

Для серии запросов удобнее разделить cache hits и misses.

N     — общее число вызовов
h     — доля cache hit от 0 до 1
Nhits — N × h
Nmiss — N - Nhits
Chit  — стоимость вызова с cache read
Cmiss — стоимость вызова без hit или с cache write

Итог:

Ctotal = Nhits × Chit + Nmiss × Cmiss + Cextra_total

Для планирования округляйте Nhits вниз, а Nmiss вверх. Это даёт чуть более осторожную оценку. В реальном журнале используйте фактическое число вызовов каждого типа.

Три сценария вместо одного числа

Базовый сценарий

Используйте медианные input и output по недавним задачам, ожидаемое число вызовов и наблюдаемую долю cache hit. Если истории ещё нет, назовите значения предположениями.

Благоприятный сценарий

Стабильный длинный prefix, высокая доля cache hit, ограниченный output и отсутствие повторных ошибок. Он показывает нижнюю границу, но не должен становиться бюджетным обещанием.

Неблагоприятный сценарий

Добавьте cache misses, длинный output, один ограниченный retry и отдельно тарифицируемые tools. Не увеличивайте все параметры произвольно: каждое допущение должно соответствовать реальному риску процесса.

Запишите результаты в простой лист:

scenario, calls, hit_rate, input, output, write, read, extra, total
base,     ...,   ...,      ...,   ...,    ...,   ...,  ...,   ...
low,      ...,   ...,      ...,   ...,    ...,   ...,  ...,   ...
high,     ...,   ...,      ...,   ...,    ...,   ...,  ...,   ...

Как оценить agent workflow

Один видимый запуск agent не всегда равен одному модельному вызову. Внутри могут быть planning, tool call, tool result, retry и финальный ответ. Поэтому:

  1. выполните одну безопасную тестовую задачу;
  2. посчитайте фактические API-вызовы;
  3. сгруппируйте их по модели и usage-категории;
  4. примените формулу к каждой группе;
  5. отдельно добавьте tool или search units;
  6. сравните сумму с Dashboard.

Не умножайте стоимость одного случайного вызова на число пользователей, если длина запросов сильно различается. Лучше считать несколько классов задач: короткий вопрос, review файла, agent-задача.

Как сверить прогноз с фактом

После тестового вызова сопоставьте:

  • время и request status;
  • Model ID;
  • input и output tokens;
  • cache category;
  • число retries;
  • фактический расход;
  • валюту и дату цены.

Разница между прогнозом и фактом обычно указывает на одно из четырёх мест: неверная ставка, двойной подсчёт cached tokens, скрытый retry или дополнительная тарифицируемая операция.

Для BetterToken используйте текущую страницу цен, а затем проверьте реальную запись в Dashboard. Не переносите цены из старого screenshot или статьи.

Ограничения калькулятора

Формула покрывает только известные категории. Она не предсказывает изменение курса, будущую цену, динамический routing и число agent steps. Image, audio, web search, storage и некоторые tools могут иметь собственные единицы.

Калькулятор также не оценивает качество ответа. Более дешёвый вызов, который приходится повторять вручную, может увеличить стоимость всей задачи. Это измеряется отдельным экспериментом, а не добавлением выдуманного коэффициента.

FAQ

Что вводить, если cache не используется?

Поставьте ноль для cache write и cache read только если endpoint действительно не применял cache. Неизвестное значение сначала проверьте по usage.

В какой валюте будет результат?

В той же валюте, в которой введены все ставки и extra_per_call. Не смешивайте доллары и рубли без явного курса и даты.

Cached tokens входят в input tokens?

Это зависит от формы usage конкретного API. Перед расчётом проверьте документацию и преобразуйте поля в взаимно исключающие категории, чтобы избежать двойного подсчёта.

Как посчитать стоимость месяца?

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

Почему фактическое списание выше прогноза?

Проверьте output, retries, agent steps, cache misses и дополнительные tools. Сопоставьте каждую строку usage с Dashboard, а не только общую сумму.