DEV Community

Jordan Huang
Jordan Huang

Posted on

Myth FAQ: Five Things a Free Token Grant Does Not Prove

Myth FAQ: Five Things a Free Token Grant Does Not Prove

My feed is full of model benchmarks right now. It is also full of people tired of them.

So I stopped arguing about leaderboards. I started keeping a ledger instead.

Free model access is the loudest claim in that space. MonkeyCode is an open-source project that offers free model access and a free server option. The operator states a free allowance of 10M tokens.

Disclosure: This article was prepared as part of MonkeyCode's product outreach.

I will not invent model names, hardware specs, or throughput numbers. I do not have them.

What I can give you is a harness and five myths it can kill.

Why a ledger beats a dashboard

A dashboard shows a number. A number is not evidence.

You need the raw request and response pairs behind it. Status codes, token counts, retry counts, and hashes.

That is the whole artifact. Here it is.

The probe: one file, three prompts

# ledger_probe.py — illustrative harness. No results are reported in this post.
import json, os, time, uuid, hashlib
from pathlib import Path
import httpx

BASE  = os.environ["LLM_BASE_URL"]   # any OpenAI-compatible endpoint
KEY   = os.environ["LLM_API_KEY"]
MODEL = os.environ["MODEL_ID"]       # take this from the project's own list

LEDGER = Path("ledger.jsonl")

PROMPTS = [
    "Reply with the single word: ok",
    "Count the letters in 'strawberry'. Show only the number.",
    "Return strict JSON: {\"n\": 1, \"unit\": \"token\"}",
]

def call(prompt, attempt):
    body = {"model": MODEL, "temperature": 0,
            "messages": [{"role": "user", "content": prompt}]}
    started = time.perf_counter()
    r = httpx.post(f"{BASE}/chat/completions", json=body, timeout=60,
                   headers={"Authorization": f"Bearer {KEY}"})
    elapsed = (time.perf_counter() - started) * 1000

    rec = {
        "probe_id": str(uuid.uuid4()),
        "attempt": attempt,
        "status": r.status_code,
        "latency_ms": round(elapsed, 1),
        "prompt_sha256": hashlib.sha256(prompt.encode()).hexdigest()[:12],
    }

    if r.status_code == 200:
        data = r.json()
        usage = data.get("usage") or {}
        rec["prompt_tokens"] = usage.get("prompt_tokens")
        rec["completion_tokens"] = usage.get("completion_tokens")
        text = data["choices"][0]["message"]["content"]
        rec["completion_sha256"] = hashlib.sha256(text.encode()).hexdigest()[:12]

    with LEDGER.open("a") as fh:
        fh.write(json.dumps(rec) + "\n")
    return rec

for prompt in PROMPTS:
    for attempt in range(1, 4):
        rec = call(prompt, attempt)
        if rec["status"] == 200:
            break
        time.sleep(2 ** attempt)   # free tiers do rate limit. plan for it.
Enter fullscreen mode Exit fullscreen mode

Three prompts, three attempts each. Exponential backoff on failure. Temperature pinned to zero.

Why hashes? Because "it worked" is not a measurement. A hash either repeats or it does not.

The reconcile step

# reconcile.py — reads the ledger you own, not the dashboard you rent.
import json, collections

rows = [json.loads(line) for line in open("ledger.jsonl")]
ok   = [r for r in rows if r["status"] == 200]

print("requests:", len(rows), "ok:", len(ok), "retries:", len(rows) - len(ok))
print("prompt_tokens:    ", sum(r.get("prompt_tokens", 0) for r in ok))
print("completion_tokens:", sum(r.get("completion_tokens", 0) for r in ok))

hashes = collections.Counter(r["completion_sha256"] for r in ok)
print("distinct completions:", len(hashes))
print("most common:", hashes.most_common(3))
Enter fullscreen mode Exit fullscreen mode

Run it. Now you own a receipt.

Myth 1: "10M free tokens means 10M useful tokens"

No. Your prompt overhead eats the grant first.

Every retry re-sends the input. System prompts, tool schemas, and retrieved context all bill on input.

A three-attempt retry on a fat prompt can triple your input spend. On a fixed allowance, retries are not free.

Correct model: useful output is a fraction of the grant. Measure your retry rate before you plan capacity.

Myth 2: "If it answered once, it is deterministic"

One sample tells you almost nothing about variance.

Ask the same question five times. Hash every completion. Count the distinct hashes.

Even at temperature zero, you can see drift across deploys, quantized builds, or routing changes.

Correct model: pin a model version, record the hash, and re-run the probe after every provider change.

Myth 3: "Free means unlimited concurrency"

Free tiers rate limit. That is normal and it is fine.

The dangerous failure mode is silent. A 429 gets logged as "error", then retried forever in a loop.

Log the status code. Stop when you hit a limit. Do not hammer the door you just closed.

  • 200: record tokens and hash
  • 429: record, back off, cap attempts
  • 5xx: record, back off, cap attempts
  • other 4xx: fail loudly, do not retry

Correct model: free access is a budget with a governor, not an infinite pipe.

Myth 4: "The free server run is the same as my run"

It is a different machine, a different clock, and possibly a different image.

Environment drift is the quiet bug. Your laptop is on Python 3.12. The box may not be.

So pin what you can control. Lockfiles, container digests, and a dumped environment block.

Write that block into the same ledger, right next to the tokens.

Correct model: the free server is a place to reproduce a result, not a place to assume one.

Myth 5: "The vendor counter is the receipt"

Vendors count what their gateway sees. You count what your client actually sent.

Those two numbers diverge when a proxy retries, when a stream drops, or when a request never lands.

Reconcile both sides. If the gap is more than a few percent, go find out why.

Correct model: two independent counters, one deliberately boring script, and a written note about the gap.

A decision table

Question Free tier is enough Move it off
Prototype, low volume Yes —
Nightly CI over a fixed prompt set Yes, with capped attempts If retries exceed your cap
Customer-facing latency promise No Yes
Data residency requirements No Yes
Long-context batch jobs Test it, then measure If input cost dominates
Anything you cannot re-run No Yes

Who should not use this approach

Be honest with yourself before you start.

  • Anyone who needs a latency SLA today. Free tiers are not an SLA.
  • Teams with data-residency or retention rules. Read those first.
  • People who will not read the provider's limit page. You will guess wrong.
  • Anyone treating a free grant as permanent capacity. It is a starting point.

A free allowance is a place to learn the cost shape. It is not a capacity plan.

Limitations I will not paper over

I did not verify the current allowance, the model list, or the server specs here. Check the project's own documentation for today's numbers.

Quotas change. A ledger written last month does not know today's limit.

The harness above is illustrative. I am not reporting benchmark results in this post, because I have not run a published one.

Test it before you trust it

Write the ledger first. Argue about models second.

If you want a sandbox to try the harness without wiring up a card, the free model access and the free server option are the relevant parts there. Read the project's own page for current limits before you plan anything.

Then run three prompts. Count the hashes. Reconcile the tokens.

Which myth died first for you?

Top comments (0)