Coming soon: OpenAI Decisions API

Explore the comparison

CLOUDFLARE / OPENROUTER

Clef

Cloudflare’s 27B decision model through OpenRouter. Classify short text or JSON state, choose a route, score ordered criteria or estimate a yes/no probability using the same API contract as Jev.

cloudflare/clef

New accounts get 100 credits. The playground and API share one balance.

Effective text-state limit

~2,000

first text-state tokens read upstream · platform cap: 2,000 UTF-8 bytes

OpenRouter input price

$0.24 / 1M

per million input tokens

OpenRouter output price

$0 / 1M

output tokens are free upstream

This site's input rate

3500

credits per million input tokens · minimum 1 per successful request

JEV / SYSTEM ONE

Uses the Jev decision playground

Uses the same OpenRouter decisions endpoint and model, state, questions fields as Jev. Live requests with text, JSON objects and arrays returned Choice, Score and Noul answers that pass the shared validators. No response conversion is needed.

SPAN / NOUL

How it differs from Span

Span accepts only Noul behavior questions and requires text or a specific input/output conversation object. This model also accepts Choice and Score questions, with text, generic JSON objects, or arrays as state. Use the Jev playground for this broader decision contract.

Three structured answer types

Choice returns a named option and its probability distribution. Score returns a value on an ordered scale with probabilities. Noul returns the probability of a yes/no condition. Multiple questions share the same state.

choicescorenoul

This service accepts text or JSON state, up to 8 questions and 32 KiB per complete request. Choice supports 2–255 named options; Score supports 2–10 ordered levels. Clef models currently read only about the first 2K text-state tokens on Workers AI, despite the 65,536-token listing. To reduce silent truncation, this service caps JSON-serialized state at 2,000 UTF-8 bytes, including JSON punctuation and escaping. This is a conservative platform byte limit, distinct from the provider’s token limit. Shorten the state before submitting.

Long-state probes found that a marker at the end of the state was treated like an absent marker, consistent with the provider’s truncation warning. This integration currently supports text and JSON decisions; image inputs are not enabled.

Input and output credits

OpenRouter charges $0.24 per million input tokens and $0 for output. This service charges 3500 credits per million input tokens on web, API and evaluation, rounded up per successful request with a minimum of 1 credit. Billing uses the provider’s total input usage, including questions. Output tokens add no charge; failed calls release the reservation.

max(1, ceil(input_tokens × 3500 / 1,000,000))

A successful request with 1,000 input tokens costs 4 credit; 5,000 input tokens cost 18 credits. Output tokens add no charge. Failed calls release the credit reservation.

Verified October 4, 2026 against official OpenRouter prices and live requests: text, object and array state; 8 questions; 255 Choice options; 10 Score levels; Noul without criteria; and long-state marker probes. These checks verify the API contract and input limits, not model accuracy.

Try Clef with short state

The Jev workbench below starts with this model selected. Try a recipe, edit the state and questions, or export API code. This page stores its browser draft separately from other model pages and the main playground.

What do you want to decide?

Choose a task to load its input and rules. Loading examples uses no credits.

Clef ↗Span · behavior evaluation ↗

Clef models currently read only about the first 2K text-state tokens upstream. Keep JSON-serialized state within 2,000 UTF-8 bytes, including JSON punctuation and escaping; this conservative platform limit is measured in bytes, not tokens. Text and JSON only. Clef Flash: 1,300 credits / 1M input tokens; Clef: 3,500. Minimum 1 per successful request; output adds no charge.

Text or JSON evaluated independently by every question.

Advanced question settings

Questions 1/8

Which team should handle this ticket? Use other when no option fits.Choice

Options

Maximum credit budget: 3 credits

We reserve this budget before the model runs, then charge actual usage and return the difference. Failed calls are refunded.

New account? Receive 100 credits once. Short requests typically use 1 credit; longer inputs can use more.

100 welcome credits · one balance for web & API

Draft saved in this browser · Your draft will be restored after sign-in.

Your current configuration stays in this browser tab for the setup flow.

ILLUSTRATIVE EXAMPLE · NO CREDITS USED

“I was charged twice this morning. Please refund the duplicate payment today.”

One input → structured decisions

Choice

Billing

Route to the billing queue

Yes / no

96%

Probability of an urgent request

Score

2.8 / 3

Urgency on a 0–3 scale

Static illustration of the output format. Values are not a live model response or a measure of accuracy.

Web runs and saved configurations are private to your account. API history stores usage only.Usage ↗

Your draft will be restored after sign-in.

Use the same decision API

Send model, state, and questions to Decisions API's /v1/systemone endpoint with an API key created here. Set model to cloudflare/clef; answers are in data.result.answers and token usage is in data.result.usage.

// Server-side JavaScript (Node 20+ or Bun). Set DECISIONS_API_KEY.
const response = await fetch("https://decisions-api.dev/v1/systemone", {
  method: "POST",
  headers: {
    "Authorization": `Bearer ${process.env.DECISIONS_API_KEY}`,
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
  "model": "cloudflare/clef",
  "state": "I was charged twice for order A-4471. Please refund the duplicate payment.",
  "questions": {
    "route": {
      "type": "choice",
      "instructions": "Which team should handle this ticket? Use other when no option fits.",
      "criteria": {
        "billing": "Payments, charges and refunds",
        "technical": "Bugs and product errors",
        "account": "Login and account access",
        "other": "None of these teams"
      }
    }
  }
}),
});
const body = await response.json();
if (!response.ok || body.code !== 0) throw new Error(body.message);
console.log(body.data.result.answers);
console.log(body.data.creditsUsed);