Назад до блогу

AI для початківцівПосібник

Чому довгий чат з AI коштує більше: API повторно надсилає історію

Кожне нове повідомлення в чаті з AI знову надсилає всю історію, тож вхід зростає з кожним ходом. Подивіться на арифметику та 3 способи стримати витрати.

Автор: CheapTokens TeamОпубліковано Оновлено 5 хв читання

Обкладинка: «Чому довгий чат коштує більше з кожним повідомленням» — API повторно надсилає всю історію щоразу
На цій сторінці
  1. Коротка відповідь
  2. Розібраний приклад із вигаданими числами
  3. Скільки це коштує за поточними цінами
  4. Три способи стримати витрати
  5. 1. Починайте новий чат, коли змінюється тема
  6. 2. Обрізайте історію
  7. 3. Замінюйте старі ходи підсумком
  8. Побачте це у власному коді
  9. Де запускати довгі чати

Перші повідомлення чату дешеві. П'ятдесяте повідомлення коштує помітно більше, ніж десяте, хоча ви набрали той самий обсяг. Нічого не зламано: так працюють чат-API.

Коротка відповідь#

Модель не пам'ятає ваших попередніх запитів. Документація OpenAI каже це прямо: "кожен запит на генерацію тексту є незалежним і не зберігає стану", а для багатоходової розмови ви включаєте попередні повідомлення та попередню відповідь моделі в наступний запит. Messages API від Anthropic описує той самий підхід: багатоходові розмови без збереження стану, де попередні ходи передаються в параметрі messages.

Отже, вікно чату, яке ви бачите в застосунку, — це ілюзія, створена застосунком. За ним кожне нове повідомлення — це свіжий запит, що несе всю розмову до цього моменту. Ви платите за вхідні токени в кожному запиті, і історія є частиною цього входу. Якщо ви новачок у термінах, спершу прочитайте Що таке токен та Вхідні та вихідні токени.

OpenAI прямо зазначає білінгову сторону для своїх ланцюжків відповідей: усі попередні вхідні токени в ланцюжку тарифікуються як вхідні токени. Той самий принцип діє для будь-якого API, де ви надсилаєте історію самостійно: що ви надсилаєте, те й рахується.

Розібраний приклад із вигаданими числами#

Числа нижче — навчальний приклад, а не вимірювання. Припустімо, кожне ваше повідомлення — близько 200 токенів, а кожна відповідь — близько 300 токенів. Один завершений обмін додає 500 токенів до історії.

Хід Попередня історія, надіслана знову Нове повідомлення Вхід цього запиту Вихід
1 0 200 200 300
5 500 × 4 = 2,000 200 2,200 300
10 500 × 9 = 4,500 200 4,700 300
20 500 × 19 = 9,500 200 9,700 300

Відповідь залишається тієї самої довжини, але вхід 20-го ходу майже в п'ятдесят разів більший за вхід 1-го ходу. Вихід не зростає; зростає вхід.

Тепер підсумок для чату на 20 ходів. Історія надсилається знову 0, 1, 2 ... 19 разів залежно від кількості обмінів, що є простою сумою:

  • Старі обміни, надіслані знову: 500 × 190 = 95,000 токенів (190 — це 0 + 1 + 2 + ... + 19).
  • Нові повідомлення: 200 × 20 = 4,000 токенів.
  • Загальний вхід для чату: 95,000 + 4,000 = 99,000 токенів.
  • Загальний вихід: 300 × 20 = 6,000 токенів.

Якби модель пам'ятала все безкоштовно, вхід становив би лише 200 × 20 = 4,000 токенів. Решта — це історія, надіслана знову. Подвоєння кількості ходів не подвоює вартість історії, воно приблизно її учетверяє, бо сума зростає як квадрат кількості ходів.

Скільки це коштує за поточними цінами#

Ось той самий чат на 20 ходів (99,000 входу, 6,000 виходу) за поточними цінами. Таблиця жива й оновлюється, коли змінюються тарифи; останній стовпець — довідкова ціна OpenRouter для порівняння.

Модель Вартість OpenRouter
GLM-5.3-Flash $0.0022 $0.0045
DeepSeek-V4-Flash $0.0021 $0.0056
MiniMax-M2.7 $0.0059 $0.0369

99 000 вхідних і 6 000 вихідних токенів загалом. Ціни за 1 млн токенів актуальні та змінюються разом із нашими тарифами; стовпець OpenRouter показує довідкові ціни для того самого навантаження.

Для швидкої перевірки текстом: на MiniMax-M2.7 ця вся розмова коштує $0.0059. Для такого чату, де домінує вхід, найважливіша ціна входу: на MiniMax-M2.7 вона дешевша за довідкову ціну OpenRouter. За 1M токенів MiniMax-M2.7 становить $0.05 за вхід і $0.15 за вихід.

Три способи стримати витрати#

1. Починайте новий чат, коли змінюється тема#

Найдешевша історія — порожня. Якщо ви завершили налагодження функції й тепер хочете рецепт, новий чат надсилає 200 токенів замість 9,700. У застосунку це одна кнопка; у коді це history = []. Робіть це щоразу, коли попередній контекст більше не допомагає наступному питанню.

2. Обрізайте історію#

Залишайте лише останні кілька повідомлень і відкидайте решту. Припустімо, ви залишаєте останні три обміни, тож історія ніколи не перевищує 500 × 3 = 1,500 токенів:

  • Ходи 1-3 зростають нормально: 0 + 500 + 1,000 = 1,500 токенів історії.
  • Ходи 4-20 кожен несе обмежені 1,500: 1,500 × 17 = 25,500 токенів.
  • Загальна історія: 1,500 + 25,500 = 27,000 токенів, плюс 4,000 нових повідомлень = 31,000 токенів входу.

Це 31,000 замість 99,000 для тих самих 20 ходів, і на MiniMax-M2.7 це становить $0.0025. Ціна обрізання — модель забуває ранню частину чату, тож тримайте системний промпт і будь-які факти, які вона не повинна втратити, поза обрізаною частиною.

3. Замінюйте старі ходи підсумком#

Коли історія стає довгою, попросіть модель один раз її підсумувати, а потім продовжуйте з підсумком замість повного тексту. У наведеному вище прикладі дев'ять обмінів — це 4,500 токенів; підсумок приблизно на 300 токенів переносить далі основні моменти. Ви платите за один додатковий запит, щоб написати підсумок, і кожен наступний запит стає легшим. Це зберігає більше сенсу, ніж просте обрізання, ціною трохи деталей.

Контекстне вікно — це окрема межа: воно обмежує, скільки токенів може вмістити один запит, включно з відповіддю. Історія зрештою досягне цієї стелі; Чому відповідь AI обривається на півслові? пояснює це.

Побачте це у власному коді#

Відповідь містить об'єкт usage, тож ви можете спостерігати зростання самостійно. Це приклад: замініть ключ і візьміть id моделі з документації CheapTokens, бо id різняться між провайдерами.

python
from openai import OpenAI

client = OpenAI(base_url='https://api.cheaptokens.dev/v1', api_key='YOUR_KEY')

system = {'role': 'system', 'content': 'You are a helpful assistant.'}
history = []
KEEP = 7  # new message + last 3 exchanges (6 messages); None keeps everything

def ask(text):
    history.append({'role': 'user', 'content': text})
    r = client.chat.completions.create(
        model='MODEL_ID_FROM_DOCS',
        messages=[system] + (history[-KEEP:] if KEEP else history),
    )
    answer = r.choices[0].message.content
    history.append({'role': 'assistant', 'content': answer})
    print(r.usage.prompt_tokens, r.usage.completion_tokens)
    return answer

Викличте ask() кілька разів підряд і надрукуйте prompt_tokens: з KEEP = None він зростає з кожним ходом, з KEEP = 7 він виходить на плато. Для агентів, що проходять багато кроків, той самий ефект стосується кожного кроку; Як оцінити вартість AI-агента показує, як це закласти в бюджет.

Де запускати довгі чати#

Довгі діалоги та цикли агентів — це саме ті навантаження, де домінує обсяг входу, тож і велике контекстне вікно, і місце для довгих відповідей обидва важливі:

  • MiniMax-M2.7: контекст 180K, до 8,192 токенів на відповідь, вхід і вихід обидва дешевші за довідкову ціну OpenRouter.
  • DeepSeek-V4-Flash: контекст 380K, до 32,768 токенів на відповідь, вихід дешевший за довідкову ціну OpenRouter.

CheapTokens має один баланс для всіх моделей, фіксовану ціну за модель без пікових годин і API, сумісний з OpenAI Chat Completions та Anthropic Messages, тож наведений вище код працює після зміни базової URL-адреси. Поповніть баланс і надішліть свій перший запит, дотримуючись Вашого першого API-запиту з CheapTokens.