Blog · 2026-09-12 · Providers

Cloudflare Workers AI lists 31 text models. We could call 28.

We added Cloudflare Workers AI to our routing chain. Before trusting any of it we called every text model the account advertises, because a model list is a claim and a response is evidence.

Of 31 models returned by the catalogue endpoint, three answered 403 not available on this account, one answered 410 deprecated, and two returned a well formed 200 carrying nothing.

Everything below was measured on 2026-09-08 from a Frankfurt server against a normal paid Cloudflare account, not a press account.

The catalogue is a menu, not an entitlement

Workers AI has a model search endpoint that returns everything the platform serves:

GET https://api.cloudflare.com/client/v4/accounts/{account_id}/ai/models/search?task=Text%20Generation

It is the only way to enumerate, because the OpenAI-compatible path answers 405 on /v1/models. And what it returns is the platform's catalogue rather than your account's entitlement. These three are listed, and are not callable:

Model Listed Called
@cf/zai-org/glm-5.3yes403 not available on this account
@cf/zai-org/glm-5.3-flashyes403 not available on this account
@cf/deepseek-ai/deepseek-v4-flash-0731yes403 not available on this account
@cf/meta/llama-3.1-8b-instructyes410 model has been deprecated

The 410 is the one that costs you money and latency rather than just disappointment. A deprecated model does not stop being advertised, so if you copied the list into a config six months ago it is still there, still being tried, still failing. We were doing exactly that: our own provider entry had llama-3.1-8b-instruct in it and every request bought that 410 before failing over.

There is also a licence gate. @cf/meta/llama-3.2-11b-vision-instruct answers 403 Model Agreement: prior to using this model, you must submit the prompt 'agree'. Nothing in the catalogue response tells you that in advance, so a model you are entitled to can still fail on first call until somebody accepts terms.

What actually answers, and how fast

Same prompt to each, same server, same minute. Latency is end to end for a short completion, which is what a router cares about when it is deciding where to send the next request.

Model Latency Context $/M in $/M out
@cf/meta/llama-3.3-70b-instruct-fp8-fast0.38s24k0.2932.253
@cf/ibm-granite/granite-4.0-h-micro0.40s131k0.0170.112
@cf/meta/llama-4-scout-17b-16e-instruct0.41s131k0.270.85
@cf/nvidia/nemotron-3-120b-a12b0.52s256k0.51.5
@cf/openai/gpt-oss-20b0.66s128k——
@cf/mistralai/mistral-small-3.1-24b-instruct0.66s128k——
@cf/google/gemma-4-26b-a4b-it1.01s256k——
@cf/openai/gpt-oss-120b1.64s128k0.350.75

The cheap one is worth a second look. granite-4.0-h-micro is 17x cheaper on input than the Llama 70B above it, answers 20ms slower, and carries five times the context. If you are picking one model here on price and are not doing anything that needs a large model, that is the row.

Two models return a 200 with nothing in it

At a 64 token budget, gpt-oss-120b and qwen3-30b-a3b-fp8 both returned a well formed success carrying an empty string, with finish_reason: length. They are reasoning models and they spent the entire budget thinking.

Raise the budget to 512 and both answer normally, in 41 and 84 completion tokens respectively. So this is not a broken model, it is a class of model that needs headroom, and it will look like a broken model to any client that checks the status code instead of the body. We count an empty 200 as a failure for exactly this reason, and it is worth doing in your own code: a 200 is not an answer.

Scout sees, and it is quick about it

The catalogue marks @cf/meta/llama-4-scout-17b-16e-instruct as vision capable. We checked with two solid colour images, red and green, so a model guessing has to be right twice. It named both, in 0.67s and 0.27s.

That makes it the fastest sighted model we route to anywhere, which was the genuine surprise of the exercise. The vision model Cloudflare actually labels as a vision model, llama-3.2-11b-vision, is the one behind the licence gate, so the general purpose model is both easier to reach and faster.

Is it free?

Partly, and the honest answer matters if you are planning around it. Workers AI includes a daily allocation of Neurons, Cloudflare's compute unit, and bills per token beyond it. So it is a free tier on a paid product rather than a free product.

For a side project that is usually plenty. For anything with sustained traffic it is not, and the per token prices in the table above are what you will actually pay. Check the current allocation in your own dashboard before you size anything on it, because that number moves and a blog post is a bad place to learn it from.

If you just want the models without an account

Our gateway routes across Cloudflare Workers AI and around two dozen other providers behind one OpenAI-compatible endpoint. Free, no card, and if one provider is busy the request moves to the next one instead of failing.

curl https://dreamprompting.com/api/v1/chat/completions \
  -H "Authorization: Bearer $DP_KEY" \
  -H "Content-Type: application/json" \
  -d '{"model":"auto","messages":[{"role":"user","content":"hello"}]}'
Get a free key

The general lesson

Every provider we have onboarded has had some version of this gap between what the model list says and what the account can do. Listing endpoints describe a catalogue. Entitlement, deprecation and licence gates are invisible until you call.

So the rule we now follow before a provider joins the routing chain is boring and has never once been wasted: call every model, treat an empty 200 as a failure rather than a fast success, and order the list by the latency that call measured rather than by the order the vendor printed them in. Related reading: rate limits are measured in tokens, not requests, and the seven things "OpenAI-compatible" turns out to mean.