fix(ai): Cerebras is not a free vendor, and its pinned model does not exist - #1022
Merged
Conversation
… exist
It was listed in free-vendors.ts on the strength of an unkeyed 403 and a note
claiming "free tier with per-minute budgets larger than Groq". Both were wrong.
A real key settled it on 2026-09-14:
cerebras.ai/pricing, Developer tier:
"Self-serve pay-as-you-go with free $5 credit to start"
gpt-oss-120b $0.35/M in, $0.75/M out
qwen-3.8-27b $0.99/M in, $1.49/M out
GET /v1/models -> 200, lists gemma-4-31b, gpt-oss-120b, qwen-3.8-27b
POST /v1/chat/completions -> 402 {"code":"payment_required",
"message":"Payment required to access this
resource. Visit your billing tab."}
The catalogue answers while every completion is refused. That is exactly the
shape that makes an unkeyed probe look like a pass: 403-without-a-key proved the
host existed, and never proved anyone could be served. The bar this file sets —
"probed unkeyed, answers 401/403" — is necessary and was never sufficient.
The pinned id was wrong too. `llama-3.3-70b` is not in the live catalogue above,
so even a funded account would have 404'd on the first call.
Configured, it would have added a link that refuses every request: pure latency
in front of a chain that exists for users with no key and no credits. That is
the failure #1000 fixed for Groq, arriving from a different direction.
FREE_VENDORS is now EMPTY, which is the honest state rather than a gap. Nothing
has cleared the bar. An empty list costs nothing — every consumer already skips
a vendor with no key — and costs far less than an entry that turns each fallback
into a guaranteed refusal.
The tests are rewritten to stay meaningful while the list is empty. The contract
rules (env override read at CALL time, whitespace treated as absent) are
properties of the code rather than of any listed vendor, so they now run against
a fixture instead of being deleted along with the entry. What is pinned against
the real list is the part that must not drift: FREE_VENDORS is empty, Cerebras
is in REJECTED_VENDORS, and buildPlatformProviders adds no cerebras link even
with CEREBRAS_API_KEY set.
Google stays "unverified, not rejected" as before — its OpenAI-compat
/v1beta/openai/models still answers 404 unkeyed, which cannot distinguish
"absent" from "hidden behind auth". Its free tier is real per ai.google.dev
pricing ("free input and output tokens", qualification "active project or free
trial", no billing account) and worth wiring once someone with a key confirms
the chat path — but not on a guess, which is the whole lesson here.
2995 unit tests pass, type-check, lint and file sizes clean.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01HJRuvHJEBd8t7iRA9Sb1iw
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Cerebras was listed in
free-vendors.tson the strength of an unkeyed 403 and a note claiming "free tier with per-minute budgets larger than Groq". Both were wrong. A real key settled it:cerebras.ai/pricing — Developer tier:
With a real key:
The catalogue answers while every completion is refused. That's exactly the shape that makes an unkeyed probe look like a pass: 403-without-a-key proved the host existed, and never proved anyone could be served. The bar this file sets — "probed unkeyed, answers 401/403" — is necessary and was never sufficient.
The pinned id was wrong too.
llama-3.3-70bisn't in the live catalogue above, so even a funded account would have 404'd on the first call.Configured, it would have added a link that refuses every request: pure latency in front of a chain that exists for users with no key and no credits. That's the failure #1000 fixed for Groq, arriving from a different direction.
FREE_VENDORS is now empty — the honest state, not a gap
Nothing has cleared the bar. An empty list costs nothing (every consumer already skips a vendor with no key) and costs far less than an entry that turns each fallback into a guaranteed refusal.
Tests rewritten to stay meaningful while empty
The contract rules — env override read at call time, whitespace treated as absent — are properties of the code, not of any listed vendor. They now run against a fixture instead of being deleted along with the entry.
Pinned against the real list is what must not drift:
FREE_VENDORSis emptyREJECTED_VENDORSbuildPlatformProvidersadds no cerebras link even withCEREBRAS_API_KEYsetGoogle stays "unverified, not rejected"
Its OpenAI-compat
/v1beta/openai/modelsstill answers 404 unkeyed, which cannot distinguish "absent" from "hidden behind auth". Its free tier is real perai.google.devpricing — "free input and output tokens", qualification "active project or free trial", no billing account — and worth wiring once someone with a key confirms the chat path. But not on a guess, which is the whole lesson here.2995 unit tests pass, type-check, lint and file-size checks clean.
🤖 Generated with Claude Code
https://claude.ai/code/session_01HJRuvHJEBd8t7iRA9Sb1iw