systemone shape

FreeRouter's Decisions contract — the same wire TypeSafe uses natively. A systemone-shaped FreeRouter key serves POST /v1/systemone across every Decisions host on its routing rule. This page is the shape reference; the other shapes are on the API Reference.

The contract

FreeRouter's Decisions contract — the same wire TypeSafe uses natively. Send model, state (string, object, or array), and typed questions (choice, score, noul). Receive answers with calibrated probabilities. Hosts are TypeSafe, OpenRouter, Requesty, Cloudflare, OpenAI, Vercel, Celeris, and Ramp Router (peers; see which host carries which model). An OpenRouter-only key reaches every decision model; TypeSafe is invite-only. Cloudflare serves Clef through Workers AI on your AI Gateway, and FreeRouter moves state images into Clef's native images field (data URLs, at most 4). OpenAI serves GPT-6 Luna through its Decisions API; FreeRouter translates both ways, so noul answers come back as noul even though OpenAI calls them predicates. OpenAI may answer a question with {"type": "refusal"} instead of a value — handle that type. Images for OpenAI must be data URLs. Requesty speaks Chat Completions with a questions response format; FreeRouter translates that internally so the customer wire stays TypeSafe native. Streaming is not supported. Companion Ads and MCP middleware do not apply. Model remaps do — for example jev-latest → perplexity/pplx-decider-v1.1-27b through an OpenRouter provider key. A TypeSafe provider key is Decisions-only and cannot be a chat routing target. Sample: samples/freerouter-decide.js.

Example

curl https://api.freerouter.com/v1/systemone \
  -H "Authorization: Bearer $FREEROUTER_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "jev-latest",
    "state": "Help! My payouts have been failing for 3 days.",
    "questions": {
      "is_urgent": { "type": "noul", "instructions": "Does this convey urgency?" }
    }
  }'

Decision models

Any decision model, never a silent swap. Jev is one System One model among many: OpenRouter also carries Perplexity Decider, GPT-6 Luna Decisions, Cloudflare Clef, Inception Mercury Decide and others on the same wire. Send whichever id you want and FreeRouter routes it only to the hosts on your key that carry that model — TypeSafe and Requesty serve Jev only, OpenRouter serves every decider. Jev aliases (jev-latest, ~typesafe/jev-latest, typesafe/jev-1.13) work on every Jev host. FreeRouter never substitutes a different decision model on failover; probabilities are not comparable across models. To change models deliberately, add a model remap. GET /v1/models on a systemone key lists every decision model your hosts carry, read from OpenRouter's decisions catalog. If none of your hosts carries the model, the request answers 404 with code: "model_not_available".

Images

Images go inside state, as parts in a state array: {"type": "image_url", "image_url": {"url": "data:image/png;base64,..."}}. A top-level images field answers 400 images_unsupported_field. Text-only models do not error on an image — they answer without seeing it — so FreeRouter refuses first: an image sent to Jev or another model whose catalog entry is text-only, or to a key whose only hosts are text-only, answers 400 images_unsupported. OpenRouter's provider, user, session_id and trace fields pass through to OpenRouter. Some OpenRouter endpoints ignore images (Clef on PrimeIntellect); pin one that reads them with "provider": {"order": ["cloudflare"], "allow_fallbacks": false}.

Routing chat with Jev instead

To have Jev pick a chat gateway for an ordinary completions key, do not put Jev on this shape — set a decisioner on an openai / openrouter / anthropic / google key. The client still receives a chat completion.

Next API Reference