Costul unui apel prin API se calculează din tokenii de intrare și de ieșire, fiecare cu prețul lui per milion de tokeni. La modelele Claude actuale prețul de ieșire este de 5 ori cel de intrare (de exemplu Claude Sonnet 5.5: 2 $ intrare, 10 $ ieșire per milion de tokeni, conform paginii de modele Anthropic). Lungimea răspunsurilor contează deci la fel de mult ca lungimea promptului.
Latența percepută depinde mai ales de TTFT (time to first token), vizibil doar când răspunsul vine în stream. Convențiile OpenTelemetry GenAI au pentru el atributul gen_ai.response.time_to_first_chunk. Pragurile acceptabile depind de aplicație; urmărește distribuția (p50, p95), nu doar media.
Prompt caching ieftinește prefixele de prompt repetate. La Anthropic, scrierea în cache costă 1,25× prețul de intrare (TTL 5 minute) sau 2× (TTL 1 oră), iar citirea 0,1× (0,05× la Claude Opus 5.5 și Sonnet 5.5). La OpenAI, pentru GPT-5.6 și modelele următoare, prefixul trebuie să aibă cel puțin 1.024 de tokeni, scrierea costă 1,25× (durată implicită 30 de minute), iar citirea 0,1× sau 0,05× după model. Economia reală depinde de cât de des se repetă exact același prefix.
Concepte cheie și caracteristici
| Concept / Parametru | Descriere practică |
|---|---|
TTFT |
Timpul până la primul fragment al răspunsului. Depinde de lungimea promptului, de model și de încărcarea furnizorului. |
usage |
Câmpul din răspunsul API cu tokenii de intrare și de ieșire; este baza calculului de cost. |
Tokeni din cache |
Raportați separat: cache_read_input_tokens și cache_creation_input_tokens la Anthropic, cached_tokens la OpenAI. |
max_tokens |
Limita de tokeni generați; plafonează costul de ieșire al unui apel. |
Bugete și limite |
Plafoane pe cheie sau pe utilizator. OWASP LLM10:2025 (Unbounded Consumption) descrie atacurile de tip Denial of Wallet, care urmăresc tocmai epuizarea bugetului. |
Exemple practice și scenarii reale
Exemplul 1: Măsurarea TTFT cu streaming (SDK OpenAI)
import time
from openai import OpenAI
client = OpenAI()
t0 = time.perf_counter()
ttft = None
stream = client.chat.completions.create(
model="gpt-6-luna",
messages=[{"role": "user", "content": "Rezumă articolul..."}],
stream=True,
stream_options={"include_usage": True},
)
for chunk in stream:
if ttft is None and chunk.choices and chunk.choices[0].delta.content:
ttft = time.perf_counter() - t0
if chunk.usage:
print(chunk.usage)
print("TTFT:", ttft, "total:", time.perf_counter() - t0)
Exemplul 2: Prompt caching automat la Anthropic
Un singur câmp cache_control la nivelul cererii pune punctul de cache după ultimul bloc care se poate memora. Prefixul se formează în ordinea tools, system, messages.
import anthropic
client = anthropic.Anthropic()
response = client.messages.create(
model="claude-sonnet-5-5",
max_tokens=1024,
cache_control={"type": "ephemeral"},
system=DOCUMENTATIE_LUNGA,
messages=[{"role": "user", "content": "Cum resetez parola?"}],
)
print(response.usage)
Greșeli frecvente și capcane
- Pui conținut variabil (data, ID-ul cererii) la începutul promptului. Cache-ul se potrivește doar pe prefixe identice; partea care se schimbă trebuie să fie la final.
- Calculezi costul doar din tokenii de intrare. Tokenii de ieșire sunt mai scumpi și variază mult de la o cerere la alta.
- Urmărești doar media latenței. Câteva cereri foarte lente pot strica experiența fără să mute media; folosește percentile.