AI dla początkującychPrzewodnik
Dlaczego długi czat AI kosztuje więcej: API ponownie wysyła historię
Każda nowa wiadomość w czacie AI wysyła ponownie całą historię, więc wejście rośnie z każdą turą. Zobacz arytmetykę i 3 sposoby na obniżenie kosztów.

Na tej stronie
Pierwsze wiadomości czatu są tanie. Wiadomość pięćdziesiąta kosztuje zauważalnie więcej niż dziesiąta, mimo że wpisałeś tyle samo tekstu. Nic nie jest zepsute: tak działają API czatowe.
Krótka odpowiedź#
Model nie pamięta Twoich poprzednich żądań. Dokumentacja OpenAI mówi wprost: „każde żądanie generowania tekstu jest niezależne i bezstanowe”, a w przypadku rozmowy wieloturowej dołączasz wcześniejsze wiadomości i poprzednią odpowiedź modelu do następnego żądania. Messages API Anthropic opisuje ten sam wzorzec: bezstanowe rozmowy wieloturowe, w których wcześniejsze tury są przekazywane w parametrze messages.
Zatem okno czatu, które widzisz w aplikacji, to iluzja zbudowana przez aplikację. Za nim każda nowa wiadomość to świeże żądanie, które niesie całą dotychczasową rozmowę. Płacisz za tokeny wejściowe przy każdym żądaniu, a historia jest częścią tego wejścia. Jeśli dopiero poznajesz te pojęcia, przeczytaj najpierw Czym jest token i Tokeny wejściowe a wyjściowe.
OpenAI wyraźnie określa stronę rozliczeniową dla swoich łańcuchów odpowiedzi: wszystkie poprzednie tokeny wejściowe w łańcuchu są rozliczane jako tokeny wejściowe. Ta sama zasada dotyczy każdego API, w którym sam wysyłasz historię: liczy się to, co wysyłasz.
Przykład z wymyślonymi liczbami#
Poniższe liczby to przykład dydaktyczny, a nie pomiar. Załóż, że każda Twoja wiadomość ma około 200 tokenów, a każda odpowiedź około 300 tokenów. Jedna zakończona wymiana dodaje 500 tokenów do historii.
Przewiń tabelę w prawo →
| Tura | Wcześniejsza historia wysłana ponownie | Nowa wiadomość | Wejście tego żądania | Wyjście |
|---|---|---|---|---|
| 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 |
Odpowiedź pozostaje tej samej długości, ale wejście tury 20 jest prawie pięćdziesiąt razy większe niż wejście tury 1. Wyjście nie rośnie; rośnie wejście.
Teraz suma dla 20-turowego czatu. Historia jest wysyłana ponownie 0, 1, 2 ... 19 razy w miarę przybywania wymian, co daje prostą sumę:
- Stare wymiany wysłane ponownie: 500 × 190 = 95 000 tokenów (190 to 0 + 1 + 2 + ... + 19).
- Nowe wiadomości: 200 × 20 = 4 000 tokenów.
- Łączne wejście czatu: 95 000 + 4 000 = 99 000 tokenów.
- Łączne wyjście: 300 × 20 = 6 000 tokenów.
Gdyby model pamiętał wszystko za darmo, wejście wynosiłoby tylko 200 × 20 = 4 000 tokenów. Reszta to historia wysyłana ponownie. Podwojenie liczby tur nie podwaja kosztu historii, lecz mniej więcej go czterokrotnia, ponieważ suma rośnie z kwadratem liczby tur.
Ile to kosztuje przy aktualnych cenach#
Oto ten sam 20-turowy czat (99 000 wejścia, 6 000 wyjścia) przy aktualnych cenach. Tabela jest aktualna i zmienia się wraz ze zmianą taryf; ostatnia kolumna to cena referencyjna OpenRouter dla porównania.
| Model | Wejście $/1M | Wyjście $/1M | Koszt | OpenRouter |
|---|---|---|---|---|
| GLM-5.3-Flash | $0.02 | $0.04 | $0.0022 | $0.0045 |
| DeepSeek-V4-Flash | $0.015 | $0.10 | $0.0021 | $0.0056 |
| MiniMax-M2.7 | $0.05 | $0.15 | $0.0059 | $0.0369 |
99 000 tokenów wejściowych i 6000 tokenów wyjściowych łącznie. Ceny za 1 mln tokenów są aktualne i zmieniają się wraz z naszymi taryfami; kolumna OpenRouter pokazuje ceny referencyjne dla tego samego obciążenia.
Dla szybkiego sprawdzenia w tekście: na MiniMax-M2.7 cała ta rozmowa kosztuje $0.0059. W czacie takim jak ten, gdzie dominuje wejście, najważniejsza jest cena wejścia: na MiniMax-M2.7 jest ona niższa niż cena referencyjna OpenRouter. Za 1M tokenów MiniMax-M2.7 to $0.05 za wejście i $0.15 za wyjście.
Trzy sposoby, by utrzymać koszty nisko#
1. Rozpocznij nowy czat, gdy zmienia się temat#
Najtańsza historia to historia pusta. Jeśli skończyłeś debugować funkcję i chcesz teraz przepis, nowy czat wysyła 200 tokenów zamiast 9 700. W aplikacji to jeden przycisk; w kodzie to history = []. Rób tak za każdym razem, gdy wcześniejszy kontekst przestaje pomagać w kolejnym pytaniu.
2. Przytnij historię#
Zachowaj tylko kilka ostatnich wiadomości, a resztę odrzuć. Załóżmy, że zachowujesz ostatnie trzy wymiany, więc historia nigdy nie przekracza 500 × 3 = 1 500 tokenów:
- Tury 1-3 rosną normalnie: 0 + 500 + 1 000 = 1 500 tokenów historii.
- Tury 4-20 niosą za każdym razem ograniczone 1 500: 1 500 × 17 = 25 500 tokenów.
- Łączna historia: 1 500 + 25 500 = 27 000 tokenów, plus 4 000 nowych wiadomości = 31 000 tokenów wejścia.
To 31 000 zamiast 99 000 dla tych samych 20 tur, a na MiniMax-M2.7 daje to $0.0025. Ceną przycinania jest to, że model zapomina wczesną część czatu, więc zachowaj prompt systemowy i wszelkie fakty, których nie może utracić, poza przyciętą częścią.
3. Zastąp stare tury podsumowaniem#
Gdy historia staje się długa, poproś model raz o jej podsumowanie, a następnie kontynuuj z podsumowaniem zamiast pełnego tekstu. W powyższym przykładzie dziewięć wymian to 4 500 tokenów; podsumowanie o długości około 300 tokenów przenosi główne punkty dalej. Płacisz za jedno dodatkowe żądanie na napisanie podsumowania, a każde późniejsze żądanie jest lżejsze. Zachowuje to więcej znaczenia niż zwykłe przycinanie, kosztem odrobiny szczegółów.
Okno kontekstu to osobny limit: ogranicza, ile tokenów może pomieścić jedno żądanie, łącznie z odpowiedzią. Historia w końcu uderzy w ten sufit; wyjaśnia to Dlaczego odpowiedź AI urywa się w połowie zdania?.
Zobacz to we własnym kodzie#
Odpowiedź zawiera obiekt usage, więc możesz sam obserwować wzrost. To przykład: zastąp klucz i weź identyfikator modelu z dokumentacji CheapTokens, ponieważ identyfikatory różnią się między dostawcami.
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 answerWywołaj ask() kilka razy z rzędu i wypisz prompt_tokens: z KEEP = None rośnie on z każdą turą, z KEEP = 7 stabilizuje się. W przypadku agentów przechodzących przez wiele kroków ten sam efekt dotyczy każdego kroku; Jak oszacować koszt agenta AI pokazuje, jak zaplanować na to budżet.
Gdzie prowadzić długie czaty#
Długie dialogi i pętle agentów to dokładnie te obciążenia, w których dominuje objętość wejścia, więc duże okno kontekstu i miejsce na długie odpowiedzi mają oba znaczenie:
- MiniMax-M2.7: kontekst 180K, do 8 192 tokenów na odpowiedź, wejście i wyjście tańsze niż cena referencyjna OpenRouter.
- DeepSeek-V4-Flash: kontekst 380K, do 32 768 tokenów na odpowiedź, wyjście tańsze niż cena referencyjna OpenRouter.
CheapTokens ma jedno saldo dla wszystkich modeli, stałą cenę za model bez godzin szczytu oraz API zgodne z OpenAI Chat Completions i Anthropic Messages, więc powyższy kod działa po zmianie bazowego URL. Doładuj saldo i wyślij pierwsze żądanie, postępując zgodnie z Twoje pierwsze żądanie API z CheapTokens.



