GPT-5.6 Luna: when a low-cost model is enough for bulk tasks
For bulk classification and extraction, cost per request matters. We calculate what Luna costs at real volumes and show how to test it on your own data.
5 min · · models · экономия
GPT-5.6 Luna costs $0.10 per 1M input and $0.10 per 1M output tokens on Zukko, one of the lowest prices in the catalog. It is worth considering for bulk tasks: classifying thousands of texts, extracting fields, normalizing data. Below: what GPT-5.6 Luna costs at real volumes and a method that shows whether it is good enough on your data.
GPT-5.6 Luna pricing and its catalog neighbors
| Model | Input, $ per 1M | Output, $ per 1M | Context |
|---|---|---|---|
GPT-5.6 Luna (gpt-5.6-luna) | 0.10 | 0.10 | 1M |
GLM 5.3 (glm-5.3) | 0.10 | 0.10 | 128K |
GLM 5.3 Flash (glm-5.3-flash) | 0.04 | 0.04 | 128K |
GPT-5.6 Sol (gpt-5.6-sol) | 0.30 | 0.30 | 1M |
Claude Sonnet 5 (claude-sonnet-5) | 0.30 | 0.30 | 1M |
From the table alone: Luna costs the same as GLM 5.3 but has a 1M-token window versus 128K. If your input texts are long, that may settle the question before any quality check. The model set changes: the current list is at GET https://api.zukko.pro/v1/models or on the "Models" page in the dashboard.
Cost at real volumes
Scenario 1: classifying 100,000 texts, 500 input and 50 output tokens each.
Input: 100,000 × 500 = 50M tokens
Output: 100,000 × 50 = 5M tokens
Cost = 50 × input_price + 5 × output_price (prices per 1M)
| Model | Input | Output | Total |
|---|---|---|---|
| GPT-5.6 Luna | 50 × $0.10 = $5.00 | 5 × $0.10 = $0.50 | $5.50 |
| GLM 5.3 | $5.00 | $0.50 | $5.50 |
| GLM 5.3 Flash | 50 × $0.04 = $2.00 | 5 × $0.04 = $0.20 | $2.20 |
| GPT-5.6 Sol / Claude Sonnet 5 | 50 × $0.30 = $15.00 | 5 × $0.30 = $1.50 | $16.50 |
Difference at this volume: Sol vs Luna is $16.50 − $5.50 = $11.00; Luna vs Flash is $5.50 − $2.20 = $3.30.
Scenario 2: 1,000,000 such requests (500M input, 50M output tokens).
| Model | Input | Output | Total |
|---|---|---|---|
| GPT-5.6 Luna | $50.00 | $5.00 | $55.00 |
| GLM 5.3 Flash | $20.00 | $2.00 | $22.00 |
| GPT-5.6 Sol / Claude Sonnet 5 | $150.00 | $15.00 | $165.00 |
Here the difference is noticeable: $165 − $55 = $110 between Sol and Luna, $55 − $22 = $33 between Luna and Flash. At these volumes it pays to spend an hour testing a cheaper model.
How to check whether Luna is enough
We do not publish our own accuracy measurements. Only a test on your data answers the question "is Luna enough".
- Labeled sample. Take 200–300 real texts and label the correct answer by hand. Include edge cases and texts in the languages your system actually handles.
- Quality bar. Decide in advance what share of correct answers is acceptable and which errors are not.
- Run. Run the sample on
glm-5.3-flash,gpt-5.6-lunaandgpt-5.6-solwith the same prompt. - Compare. Compute the share of correct answers and look at which texts each model gets wrong.
- Choose. Pick the cheapest model that meets your bar.
The cost of such a pilot on 300 texts at 500 + 50 tokens for three models: 300 × 550 = 165,000 tokens per model; 0.165 × ($0.04 + $0.10 + $0.30) = $0.0726, under ten cents.
How to call GPT-5.6 Luna
Model ID: gpt-5.6-luna. A classification example with the OpenAI SDK:
from openai import OpenAI
client = OpenAI(
base_url="https://api.zukko.pro/v1",
api_key="fetch_your_key",
)
SYSTEM = "Classify the sentiment of the review. Answer with one word: positive, neutral or negative."
reviews = [
"Great product, fast delivery",
"Disappointed with the quality, would not recommend",
"Arrived on time, nothing special",
]The shorter the answer, the fewer output tokens: ask for one word or compact JSON, not explanations.
Streaming
stream = client.chat.completions.create(
model="gpt-5.6-luna",
messages=[{"role": "user", "content": "List three ways to normalize a postal address"}],
stream=True,
)
for chunk in stream:
if chunk.choices and chunk.choices[0].delta.content:
print(chunk.choices[0].delta.content, end="", flush=True)The if chunk.choices check is needed: the last chunk may carry token usage data with an empty choices list.
Error handling
import openai
try:
response = client.chat.completions.create(
model="gpt-5.6-luna",
messages=[{"role": "user", "content": "..."}],
)
except openai.APIStatusError as e:
if e.status_code == 402:
print("Insufficient balance")
elif e.status_code == 429:
print("Too many requests: retry with a pause")
else:
print(f"Error {e.status_code}: {e.message}")Cascade: cheap model first, pricier one for hard cases
If Luna meets your bar on some text types but not all, you do not have to move everything to Sol. Send each request to Luna first, and to Sol only when the answer fails an automatic check (wrong label, invalid JSON, empty field).
VALID = {"positive", "neutral", "negative"}
def classify(text: str) -> str:
for model in ["gpt-5.6-luna", "gpt-5.6-sol"]:
r = client.chat.completions.create(
model=model,
max_tokens=10,
messages=[{"role": "system", "content": SYSTEM},
{"role": "user", "content": text}],
)
label = (r.choices[0].message.content or "").strip().lower()
if label in VALID:
return label
return "needs_review"Cascade cost: all requests are billed at Luna's price, plus a share p of retries at Sol's price. For scenario 1 with p = 5% (measure your own share):
$5.50 + 0.05 × $16.50 = $5.50 + $0.825 = $6.325
Keep in mind: a cascade only catches errors visible to an automatic check. If Luna confidently returns a wrong but valid label, the cascade will not notice, so the labeled pilot is still necessary.
More on request parameters in the Chat Completions reference. If you do not have a key yet, create one under API keys.
FAQ
Is Luna faster or slower than Sol?
We do not publish speed measurements. Measure on your own requests: send 20 identical requests to each model and compare the median response time. For batch processing, throughput under parallel requests usually matters more, so test that at your volume too.
Do I need manual review if I classify a million texts?
Yes, on a sample. After launch, regularly check a random sample of a few hundred results and compare the error rate with what you saw in the pilot. If it grows, your data has changed and the model choice should be revisited.
How do I fix Luna's errors cheaply?
Rerun only the disputed records on a pricier model, via the cascade or based on sample review. The cost follows the formula above: Luna's price for the full volume plus Sol's price for the share of retries.
How does Luna handle Russian?
Test it on your sample: include texts in every language present in your data and compute accuracy separately for each language. We have no general estimates.
zukko
Pay 25×
less
for Claude Code & ChatGPT
One fetch_* key and base URL api.zukko.pro — for Cursor, Claude Code, Codex, and any SDK.
Related articles
- Grok API price: cost of Grok 4.7, 4.6 and 4.5 with examplesWe price requests to Grok 4.7, 4.6 and 4.5 in Zukko on three scenarios and compare with official xAI prices. Formulas are shown and the arithmetic can be checked.
- DeepSeek API for free: is there a free tier and what is the minimum costWe do not promise free access, but the minimum is very low. A formula-based count of how many requests fit into one dollar.
- DeepSeek API price: cost of V4 Pro and V4.1 Flash worked throughWhat requests to three DeepSeek models cost: the formula, three typical scenarios at 10,000 requests, the role of the cache and a usage-based cost script.
- opencode agents: setting up roles, models and toolsA custom agent in opencode is a role, a model and a set of permissions. A working config where a cheap model handles routine work and a stronger one edits code.