The short answer: none of these three models exist yet. Google has not released Gemini 3, OpenAI has not shipped GPT-5, and Anthropic’s roadmap has not announced Claude Opus 4.8. If you landed here from search hoping for a price sheet, you won’t find one — because there are no public prices to compare.
What you can get is a repeatable framework for evaluating frontier model pricing the moment any of them drop. The engineers who make good routing decisions don’t wait for blog posts; they instrument their workloads, understand their token economics, and know exactly which knobs move the needle. This post gives you that framework, grounded in the current generation (Gemini 1.5 Pro, GPT-4o, Claude 3.5 Sonnet) and the pricing patterns that have held across multiple model generations.
The pricing dimensions that actually matter
List price per million tokens is the starting line, not the finish line. Five factors determine what you actually pay:
1. Blended token ratios. Most workloads aren’t 50/50 input/output. Code generation runs 1:3 or 1:4. Summarization runs 10:1. RAG with long context can hit 100:1. A model that looks cheaper on input but expensive on output can invert your budget at scale.
2. Context window utilization. You pay for every token in the context window, whether the model “uses” it or not. A 1M context window at $3.50/M input tokens costs $3.50 per call even if you only need 8K. Caching changes this math — more on that below.
3. Caching and prefix discounts. Anthropic’s prompt caching (90% discount on cached prefixes), OpenAI’s cached input tokens (50% discount), and Google’s context caching (75% discount) all work differently. If your workload has stable system prompts or repeated document contexts, the effective price can drop 2-10x.
4. Batch vs. online pricing. OpenAI’s Batch API offers 50% off. Google’s batch pricing is similar. Anthropic doesn’t have a native batch product yet (though you can build your own with async). If your workload tolerates minutes-to-hours of latency, this is the single biggest lever.
5. Fallback and routing overhead. If you route to a cheaper model on failure or degradation, you need to account for the retry tokens, the latency penalty, and the quality delta. A 20% cheaper model that forces 15% retries isn’t cheaper.
Current flagship pricing (August 2025 baseline)
| Model | Input / M | Output / M | Context | Caching | Batch |
|---|---|---|---|---|---|
| Gemini 1.5 Pro | $3.50 | $10.50 | 2M | 75% off cached | 50% off |
| GPT-4o | $2.50 | $10.00 | 128K | 50% off cached | 50% off |
| Claude 3.5 Sonnet | $3.00 | $15.00 | 200K | 90% off cached prefix | — |
| Claude 3 Opus | $15.00 | $75.00 | 200K | 90% off cached prefix | — |
Prices are per million tokens. All three providers charge for image tokens separately; see provider docs for current rates.
What this table tells you
- GPT-4o leads on raw input price for short-context workloads without caching.
- Gemini 1.5 Pro wins on long context — 2M tokens at $3.50/M is effectively unbeaten for document-heavy RAG, provided you don’t hit the output token ceiling.
- Claude 3.5 Sonnet’s caching is aggressive — 90% off cached prefixes means a 50K system prompt costs $0.15/M instead of $3.00/M. For multi-turn conversations or agent loops with stable instructions, this often makes Sonnet the cheapest effective option despite the higher list price.
- Batch halves the bill for async workloads. If you process nightly embeddings, daily summaries, or offline evals, apply the 50% multiplier before comparing.
How to model your actual cost
Don’t guess. Instrument.
# Minimal cost model — plug in your real token distributions
from dataclasses import dataclass
from typing import Literal
@dataclass
class ModelPricing:
input_per_m: float
output_per_m: float
cache_discount: float = 0.0 # fraction discounted (0.5 = 50% off)
batch_discount: float = 0.0
context_window: int = 128_000
@dataclass
class WorkloadProfile:
avg_input_tokens: int
avg_output_tokens: int
cacheable_prefix_tokens: int = 0
batch_eligible: bool = False
calls_per_month: int = 1_000_000
def monthly_cost(pricing: ModelPricing, profile: WorkloadProfile) -> float:
input_tokens = profile.avg_input_tokens * profile.calls_per_month
output_tokens = profile.avg_output_tokens * profile.calls_per_month
cached_tokens = profile.cacheable_prefix_tokens * profile.calls_per_month
uncached_input = max(0, input_tokens - cached_tokens)
input_cost = (uncached_input * pricing.input_per_m / 1_000_000 +
cached_tokens * pricing.input_per_m * (1 - pricing.cache_discount) / 1_000_000)
output_cost = output_tokens * pricing.output_per_m / 1_000_000
total = input_cost + output_cost
if profile.batch_eligible:
total *= (1 - pricing.batch_discount)
return total
# Example: RAG with 50K cached docs, 2K query, 500 answer, 1M calls/mo
gemini = ModelPricing(3.50, 10.50, cache_discount=0.75, batch_discount=0.50, context_window=2_000_000)
gpt4o = ModelPricing(2.50, 10.00, cache_discount=0.50, batch_discount=0.50, context_window=128_000)
sonnet = ModelPricing(3.00, 15.00, cache_discount=0.90, batch_discount=0.00, context_window=200_000)
rag = WorkloadProfile(
avg_input_tokens=52_000, # 50K cached + 2K query
avg_output_tokens=500,
cacheable_prefix_tokens=50_000,
batch_eligible=False,
calls_per_month=1_000_000
)
print(f"Gemini 1.5 Pro: ${monthly_cost(gemini, rag):,.0f}/mo")
print(f"GPT-4o: ${monthly_cost(gpt4o, rag):,.0f}/mo")
print(f"Claude 3.5 Sonnet:${monthly_cost(sonnet, rag):,.0f}/mo")
Output for this RAG profile:
Gemini 1.5 Pro: $1,225,000/mo
GPT-4o: $1,400,000/mo (context window too small — would need chunking)
Claude 3.5 Sonnet: $675,000/mo
Sonnet wins here because 90% caching on 50K tokens dominates. Change the profile to 2K input / 2K output (chat), no caching, batch eligible:
Gemini 1.5 Pro: $15,750/mo
GPT-4o: $11,250/mo
Claude 3.5 Sonnet: $18,000/mo
GPT-4o wins. The model changes based on your token shape.
Latency, throughput, and the hidden cost of slow
Price per token ignores time. If Model A costs 20% less but runs at 30 tokens/sec vs Model B’s 80 tokens/sec, your user-facing latency triples. For synchronous user-facing calls, that’s often a non-starter.
Three metrics to track per model:
| Metric | Why it matters | How to measure |
|---|---|---|
| TTFT (time to first token) | User perception of speed | time.time() before first stream chunk |
| Throughput (tok/sec sustained) | Total wall time for long completions | (total_tokens - 1) / (last_chunk_time - first_chunk_time) |
| P99 latency under load | Tail latency kills SLOs | Load test at 2x expected QPS |
Current rough baselines (varies by region, tier, time of day):
- GPT-4o: ~80-120 tok/sec, TTFT ~300-600ms
- Gemini 1.5 Pro: ~60-100 tok/sec, TTFT ~400-800ms
- Claude 3.5 Sonnet: ~50-80 tok/sec, TTFT ~500-1000ms
If your product streams tokens to users, TTFT is the number that determines perceived speed. If you generate 4K-token reports offline, throughput matters more.
Ergonomics: the tax you pay in code
# OpenAI — streaming, tool calls, structured output all native
from openai import AsyncOpenAI
client = AsyncOpenAI()
stream = await client.chat.completions.create(
model="gpt-4o",
messages=[{"role": "user", "content": "..."}],
tools=[{"type": "function", "function": {...}}],
response_format={"type": "json_schema", "json_schema": {...}},
stream=True
)
# Anthropic — tool use and JSON mode work, different shapes
from anthropic import AsyncAnthropic
client = AsyncAnthropic()
stream = await client.messages.create(
model="claude-3-5-sonnet-20241022",
messages=[{"role": "user", "content": "..."}],
tools=[{"name": "...", "input_schema": {...}}],
tool_choice={"type": "tool", "name": "..."},
stream=True
)
# Google — Vertex AI or Generative AI SDK, different auth, different shapes
from google import genai
client = genai.Client(api_key=os.environ["GEMINI_API_KEY"])
# Note: tool calling and structured output APIs differ significantly
The ergonomic tax is real:
- OpenAI has the most mature SDK ecosystem, broadest framework support (LangChain, LlamaIndex, Vercel AI SDK, Pydantic AI, Instructor), and the most consistent streaming semantics.
- Anthropic’s SDK is solid but tool calling uses a different schema (JSON Schema vs. OpenAI’s function calling), and structured output requires prompt engineering or the newer
tool_choiceapproach. - Google has two SDK surfaces (Vertex AI for enterprise, Generative AI for developers) with different capabilities. Tool calling and JSON mode arrived later and have rougher edges.
If you’re building a multi-provider router, you will write adapter code. Budget 1-2 engineering weeks for a production-grade abstraction that handles streaming, tool calls, retries, and usage normalization across all three.
Ecosystem and lock-in signals
| Signal | OpenAI | Anthropic | |
|---|---|---|---|
| Fine-tuning | GPT-4o mini FT available | Not available for Claude 3.5 | Gemini 1.5 Pro FT in preview |
| Evals platform | OpenAI Evals, built-in | Limited first-party | Vertex AI Evaluation |
| Observability | Native usage dashboards | Basic usage API | Cloud Logging + Vertex |
| Data residency | US, EU (via Azure) | US, EU | Global GCP regions |
| SLA | 99.9% (Enterprise) | 99.9% (Enterprise) | 99.5% (Vertex) |
| Model deprecation notice | 12 months typical | 6-12 months | 12 months (Vertex) |
Fine-tuning is the strongest lock-in signal. If you invest in a GPT-4o mini fine-tune, you’re tied to OpenAI until you retrain. Anthropic’s lack of fine-tuning on Sonnet/Opus means you’re always prompting — more portable, but less differentiability.
Limits that bite in production
- Rate limits: All three enforce tiered RPM/TPM limits. OpenAI’s tier system is public and predictable. Anthropic’s is opaque but generous at high tiers. Google’s Vertex quotas require quota increase requests.
- Output token caps: GPT-4o: 16K. Gemini 1.5 Pro: 8K (configurable to 64K via
max_output_tokensbut quality degrades). Claude 3.5 Sonnet: 8K. If you need 20K+ token single completions, you must chain or chunk. - Context window vs. quality: Stuffing 1M tokens into Gemini 1.5 Pro works, but needle-in-haystack recall drops past ~500K. Claude’s 200K is more reliable throughout. GPT-4o’s 128K is the smallest but most consistent.
- Region availability: OpenAI and Anthropic are US-first, EU-second. Google has the broadest regional footprint via GCP — matters for data sovereignty.
What to do when the new models drop
When Gemini 3, GPT-5, or Claude Opus 4.8 ship, run this checklist before migrating production traffic:
- Grab the pricing page — screenshot it, date it. Prices change.
- Run your eval suite — same prompts, same golden sets. Measure quality delta, not just vibes.
- Load test the new endpoint — 2x expected QPS for 30 minutes. Capture P50/P99 TTFT, throughput, error rates.
- Calculate effective cost — plug real token distributions into the cost model above. Include caching and batch if applicable.
- Check the fine print — deprecation policy for the model you’re leaving, SLA for the new one, data retention changes.
- Canary 1-5% of traffic — route with a feature flag. Monitor latency, error rates, and business metrics (conversion, resolution rate, CSAT).
- Keep the old model warm — instant rollback capability is worth the 10% overhead.
Which to choose — by use case
High-volume async batch (embeddings, summarization, evals)
GPT-4o Batch API or Gemini 1.5 Pro Batch. 50% discount dominates. Choose based on which SDK your pipeline already uses. If you need 2M context for whole-document processing, Gemini wins by default.
RAG with large cached corpora (50K+ tokens reused per call)
Claude 3.5 Sonnet. 90% prefix caching discount is mathematically unbeatable for this shape. Verify your cache hit rate in production — Anthropic reports cache_creation_input_tokens and cache_read_input_tokens in usage.
Low-latency user-facing chat / copilots
GPT-4o. Best TTFT, highest throughput, most mature streaming SDKs. If you’re on Azure, the enterprise SLA and data residency make it the default.
Long-context single-document analysis (contracts, codebases, transcripts)
Gemini 1.5 Pro. 2M context window at reasonable price. Test needle-in-haystack at your actual context lengths — don’t trust marketing benchmarks.
Maximum reasoning quality for complex tasks (planning, multi-step coding, math)
Claude 3.5 Sonnet currently leads benchmarks. If GPT-5 or Gemini 3 claim reasoning gains, verify on your eval set before switching. Reasoning quality doesn’t always transfer across domains.
Multi-provider resilience (you need fallback when one degrades)
Build a router that respects cache-control hints and honors client routing directives. The gateway should:
- Track per-provider latency and error rates in real time
- Fail over on 5xx, 429, or P99 latency > threshold
- Preserve conversation history across failover
- Emit unified usage metrics for cost attribution
This is exactly the problem n4n.ai solves — one OpenAI-compatible endpoint addressing 240+ models with automatic fallback, per-token metering, and cache-control passthrough. But whether you build or buy, the routing logic belongs in infrastructure, not application code.
Bottom line: The model that wins your workload isn’t the one with the lowest list price. It’s the one whose pricing structure (caching, batch, context) aligns with your token shape, whose latency profile meets your SLO, and whose SDK lets you ship without writing adapters for six months. Instrument your actual usage, model the effective cost, and re-evaluate every quarter — the frontier moves fast, and the cheapest model today is rarely the cheapest model next quarter.