{
"$type": "site.standard.document",
"bskyPostRef": {
"cid": "bafyreidk5cnewhhygtngnmadsi3fp76wnbymjjoo3zn5wx2kdadm3nr4si",
"uri": "at://did:plc:25rdn5elo5izoxrmtis34zuk/app.bsky.feed.post/3mqfok4mmlrn2"
},
"coverImage": {
"$type": "blob",
"ref": {
"$link": "bafkreidvgrdxc7foc5gr7ns7nhumaizrbcdcx6a6baqsxhmbsswpqfh4wy"
},
"mimeType": "image/webp",
"size": 62122
},
"path": "/amdmsz/gpt-56-sol-vs-terra-vs-luna-which-tier-should-you-actually-use-2elm",
"publishedAt": "2026-07-11T22:01:53.000Z",
"site": "https://dev.to",
"tags": [
"openai",
"ai",
"gpt",
"tutorial"
],
"textContent": "When GPT-5.6 landed as _three_ models instead of one, my first reaction was mild annoyance. Sol, Terra, Luna — great names, zero help when I'm staring at a config file deciding which string to paste into `model`. So I did the boring thing: I wired all three into the same app, ran a week of real traffic through them, watched the token meter, and wrote down what I learned. This is that write-up — the decision tree I wish someone had handed me on day one.\n\n## The 30-second version\n\nThree tiers, same API shape, same features. The only thing that changes is depth vs. cost vs. latency. Official OpenAI list prices, per million tokens:\n\nTier | Model string | List price (in / out) | My one-liner\n---|---|---|---\nSol | `gpt-5.6-sol` | $5 / $30 | The flagship. Reach for it when a wrong answer is expensive.\nTerra | `gpt-5.6-terra` | $2.50 / $15 | The default that surprised me.\nLuna | `gpt-5.6-luna` | $1 / $6 | The volume workhorse.\n\nNote the shape of that output column: $30, $15, $6. Output tokens are where the money goes, and they scale 5:1 against input across all three. Keep that ratio in your head — it makes tier choice mostly a question of _how much the model talks_ , not how much you feed it.\n\n## Terra is the plot twist\n\nI expected to run Sol everywhere and grumble about the bill. Then I A/B'd Sol against Terra on my actual coding-assistant traffic — diffs, refactors, \"why is this test flaky\" spelunking. OpenAI's own line is that Terra hits about **97% of Sol's benchmark performance** , and honestly? On day-to-day dev work I couldn't feel the missing 3%. Same fixes, same explanations, half the list price.\n\nThat reframed the whole exercise for me. The question stopped being \"can I afford Sol?\" and became \"do I have a _specific_ reason to escalate off Terra?\" For most requests the answer is no. Terra became my baseline and Sol became the exception I reach for deliberately — not the reverse.\n\nWhere Sol still earns its keep for me: genuinely hard reasoning where the cost of being wrong dwarfs the token bill. Architecture reviews, gnarly migrations, research synthesis across a big pile of context. And **ultra mode** — the 5.6 family can orchestrate parallel sub-agents on complex tasks, and that coordination is exactly the kind of work where the deepest tier pays for itself.\n\n## Luna is not a downgrade, it's a different job\n\nLuna is the one people mis-read. It's not \"watered-down Sol,\" it's the tier you point at work where per-token cost dominates and the quality ceiling basically never binds: bulk classification, tagging, extraction, summarizing a firehose of records. When you're doing the same small operation ten thousand times, a dollar of input vs. five dollars of input is the entire P&L. Luna is also the fastest of the three, so it's my pick for anything latency-sensitive — autocomplete, a streaming chat UI — paired with `stream: true`.\n\n## The cache math nobody puts on the slide\n\nHere's the part that actually changed my routing, and it's the reason I'd tell you _not_ to just default to the smallest tier.\n\nGPT-5.6 ships with **predictable caching** : a prompt prefix is guaranteed to stay cached for at least 30 minutes, and you can drop your own cache breakpoints. Cache _reads_ bill at **10% of the input price**. That number quietly rewrites the arithmetic for any prefix-heavy workload.\n\nThink about a RAG setup where every request re-sends the same fat corpus prefix. Without caching you pay full input rate on that prefix every single call. Pin it behind a breakpoint and you pay full rate _once_ per 30-minute window, then 10% on every hit after. Run the numbers on a realistic prefix-to-suffix ratio and Terra-with-cache can land _below_ Luna-uncached on effective per-request cost — while giving you Terra-grade answers. I stopped reaching for the smallest tier reflexively and started modeling the prefix ratio first. Sometimes the \"more expensive\" tier is the lower-cost system.\n\n## My actual routing rules\n\nAfter all that, here's the decision tree I run in production:\n\n * **Deep reasoning / high-stakes** (architecture, tricky migrations, ultra-mode agent pipelines) → **Sol**. Output quality wins when a mistake is expensive.\n * **Everyday work** (coding assistant, general chat, most product features) → **Terra**. ~97% of Sol at half the list price; escalate specific request _types_ to Sol only when your evals show the gap is real.\n * **High-frequency / bulk** (classification, extraction, summarization, latency-critical UX) → **Luna** , with `stream` on where it helps.\n\n\n\nThe meta-rule: start on Terra, promote to Sol by request-type when evals justify it, route the bulk lane to Luna. Match the workload, not the badge.\n\n## Trying all three behind one key (no OpenAI account)\n\nThe nice part is that testing this costs almost nothing in effort. I ran all three tiers through **byesu** — an AI API gateway that speaks the OpenAI-compatible Chat Completions API (and an Anthropic-native `/v1/messages` endpoint from the same host, same token). One `sk-` key covers all three GPT-5.6 tiers, so comparing them is a one-string change in a loop, and billing is pay-as-you-go per token — no subscription, no separate OpenAI account to provision.\n\nIf you already have OpenAI SDK code, it's a `base_url` swap:\n\n\n\n from openai import OpenAI\n\n client = OpenAI(\n api_key=\"sk-YOUR_TOKEN\",\n base_url=\"https://byesu.com/v1\",\n )\n\n prompt = \"Refactor this function and explain the trade-offs.\"\n\n for tier in (\"gpt-5.6-sol\", \"gpt-5.6-terra\", \"gpt-5.6-luna\"):\n r = client.chat.completions.create(\n model=tier,\n messages=[{\"role\": \"user\", \"content\": prompt}],\n )\n u = r.usage\n print(f\"{tier:16} in={u.prompt_tokens:5} out={u.completion_tokens:5}\")\n print(r.choices[0].message.content[:200], \"\\n\")\n\n\nLog `usage` on every call — that `in`/`out` split is the whole game. Once you can see input vs. output tokens per tier on _your_ prompts, the pricing table above stops being abstract and the right tier basically picks itself.\n\nOne gotcha worth flagging: when you create the token, put it in the **OpenAI GPT group**. Wrong group is the usual cause of a \"no available channel\" error, and the model string has to be exactly `gpt-5.6-sol` / `-terra` / `-luna`.\n\n## Bottom line\n\nDefault to **Terra**. Escalate to **Sol** for the handful of requests where being right is worth $30-per-million output. Push bulk and latency-sensitive lanes to **Luna**. And before you assume the smallest tier is the lowest-cost one, do the cache math — predictable caching plus 10% reads can flip the ranking entirely. Wire all three behind one key, log your token usage, and let your own traffic settle the argument.",
"title": "GPT-5.6 Sol vs Terra vs Luna: which tier should you actually use?"
}