Disclosure: this post contains affiliate links; I may earn a commission at no cost to you.
TL;DR: Prices moved a lot this week (Nov 2-6, 2026). Instead of hard-coding one model, put a tiny OpenAI-compatible router in front of your app, send easy requests to a cheap model and hard ones to a frontier model, and change the mapping in one file when prices move again.
What moved this week
| Model | Provider/route | Price per 1M tokens (in / out) | Source |
|---|---|---|---|
| gpt-oss-120b | OpenRouter | $0.023 / $0.083 (was $0.15 / $0.60) | overfeed.news OpenRouter snapshot, Nov 5 |
| Llama 3.3 70B Instruct | OpenRouter | $0.10 / $0.32 | same |
| GLM 5.3 | OpenRouter | $0.0699 / $1.40 | same |
| Kimi K3.1 Pro | Together AI | $2.00 / $10.00 | Together changelog, Nov 5 |
| Claude Sonnet 5.5 | Anthropic | $2 / $10 | promptunit.ai pricing table |
Prices are list prices quoted by those trackers; check the provider page before you commit. They change daily.
The router (copy-paste)
# router.py -- pip install fastapi uvicorn httpx
import os, httpx
from fastapi import FastAPI, Request
app = FastAPI()
ROUTES = {
"cheap": {"url": "https://openrouter.ai/api/v1/chat/completions",
"model": "openai/gpt-oss-120b", "key": "OPENROUTER_KEY"},
"smart": {"url": "https://api.together.xyz/v1/chat/completions",
"model": "moonshotai/Kimi-K3.1-Pro", "key": "TOGETHER_KEY"},
}
def pick(body):
text = " ".join(m.get("content", "") for m in body["messages"] if isinstance(m.get("content"), str))
hard = len(text) > 6000 or any(w in text.lower() for w in ("prove", "refactor", "debug", "plan"))
return ROUTES["smart" if hard else "cheap"]
@app.post("/v1/chat/completions")
async def chat(req: Request):
body = await req.json()
r = pick(body)
body["model"] = r["model"]
async with httpx.AsyncClient(timeout=120) as c:
resp = await c.post(r["url"], json=body,
headers={"Authorization": f"Bearer {os.environ[r['key']]}"})
return resp.json()
Run it: uvicorn router:app --host 0.0.0.0 --port 8000, then point your app's OpenAI base URL at http://your-host:8000/v1. Streaming is not handled here; add it if you need it.
Worked cost example (assumptions stated)
100,000 requests a month, 1,500 input and 400 output tokens each = 150M input, 40M output tokens.
- All on Kimi K3.1 Pro: 150 x $2 + 40 x $10 = $700
- 80% cheap (gpt-oss-120b) / 20% smart: cheap = 120 x $0.023 + 32 x $0.083 = $5.42; smart = 30 x $2 + 8 x $10 = $140; total about $145
Quality depends on how well your "hard" rule matches reality; log both routes for a week and compare.
Where to host it
The router is a tiny always-on process, so a small VPS is enough. I'd use Hostinger VPS for this: put it behind Caddy for HTTPS, keep keys in environment variables, and restrict access with a shared token.
Decision table
| Situation | Do this |
|---|---|
| Prices change weekly | Router with a ROUTES dict |
| Need data to stay in one region | Check provider residency terms first |
| Sensitive prompts | Self-host open weights instead |
Sources
- overfeed.news OpenRouter pricing snapshot (2026-11-05)
- thismonthinai.com November 2026 (Together AI Kimi K3.1 Pro pricing)
- promptunit.ai AI API pricing (Nov 2026)
Full disclosure: TokenLean uses affiliate links, including the Hostinger link above. If you buy through them I may earn a commission at no extra cost to you. I only recommend tools I'd consider for the job described. Prices are third-party reported and may be out of date.
Top comments (0)