Try it
Copy the code ↓- Data source
- Decision schema
- Model inference
- Structured result
2 Decision schema 4 typed questions
steerchoicestraightleftrightclimbdescendholdgate_visiblenoulprobability 0–1gate_left_of_centernoulprobability 0–1gate_above_centernoulprobability 0–1
3 Model inference typesafe/jev-1.13
Waiting for a run.
4 Structured result
Raw JSON
Run the demo to see the JSON answers, the highlighted pick and the final action.
FLATKEY_API_KEY and run.curl -sS https://router.flatkey.ai/api/alpha/decisions \
-H "Authorization: Bearer $FLATKEY_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "typesafe/jev-1.13",
"state": "Course: indoor gate race, gate 4 of 8.\nFrame: square gate ahead, its opening sits clearly left of center and slightly below the horizon line. Floor and a wall visible, no other gate in view.\nState: forward speed moderate, altitude steady.\n\nTask: steer, gate_visible, gate_left_of_center, gate_above_center.",
"questions": {
"steer": {
"type": "choice",
"instructions": "A racing drone is flying a gate course. Looking at this camera frame, which single correction best lines the drone up to fly through the next gate?",
"criteria": {
"straight": "The next gate is roughly centered ahead; keep the current heading",
"left": "The next gate is clearly left of center; yaw or roll left",
"right": "The next gate is clearly right of center; yaw or roll right",
"climb": "The next gate opening is above the drone'\''s line of flight; gain altitude",
"descend": "The next gate opening is below the drone'\''s line of flight; lose altitude",
"hold": "No gate is visible or the frame is unreadable; slow down and search instead of turning"
}
},
"gate_visible": {
"type": "noul",
"instructions": "The next racing gate is visible in this frame."
},
"gate_left_of_center": {
"type": "noul",
"instructions": "The next racing gate is to the left of the center of this frame."
},
"gate_above_center": {
"type": "noul",
"instructions": "The opening of the next racing gate is above the center of this frame."
}
}
}'// Node.js 18+ (built-in fetch). Run: FLATKEY_API_KEY=... node jev.mjs
const body = {
"model": "typesafe/jev-1.13",
"state": "Course: indoor gate race, gate 4 of 8.\nFrame: square gate ahead, its opening sits clearly left of center and slightly below the horizon line. Floor and a wall visible, no other gate in view.\nState: forward speed moderate, altitude steady.\n\nTask: steer, gate_visible, gate_left_of_center, gate_above_center.",
"questions": {
"steer": {
"type": "choice",
"instructions": "A racing drone is flying a gate course. Looking at this camera frame, which single correction best lines the drone up to fly through the next gate?",
"criteria": {
"straight": "The next gate is roughly centered ahead; keep the current heading",
"left": "The next gate is clearly left of center; yaw or roll left",
"right": "The next gate is clearly right of center; yaw or roll right",
"climb": "The next gate opening is above the drone's line of flight; gain altitude",
"descend": "The next gate opening is below the drone's line of flight; lose altitude",
"hold": "No gate is visible or the frame is unreadable; slow down and search instead of turning"
}
},
"gate_visible": {
"type": "noul",
"instructions": "The next racing gate is visible in this frame."
},
"gate_left_of_center": {
"type": "noul",
"instructions": "The next racing gate is to the left of the center of this frame."
},
"gate_above_center": {
"type": "noul",
"instructions": "The opening of the next racing gate is above the center of this frame."
}
}
};
const res = await fetch("https://router.flatkey.ai/api/alpha/decisions", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.FLATKEY_API_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify(body),
});
if (!res.ok) throw new Error(`Jev request failed: ${res.status} ${await res.text()}`);
const { answers, usage } = await res.json();
console.log(JSON.stringify(answers, null, 2), usage);# Python 3.8+ (pip install requests). Run: FLATKEY_API_KEY=... python jev.py
import json, os, requests
body = json.loads(r"""{
"model": "typesafe/jev-1.13",
"state": "Course: indoor gate race, gate 4 of 8.\nFrame: square gate ahead, its opening sits clearly left of center and slightly below the horizon line. Floor and a wall visible, no other gate in view.\nState: forward speed moderate, altitude steady.\n\nTask: steer, gate_visible, gate_left_of_center, gate_above_center.",
"questions": {
"steer": {
"type": "choice",
"instructions": "A racing drone is flying a gate course. Looking at this camera frame, which single correction best lines the drone up to fly through the next gate?",
"criteria": {
"straight": "The next gate is roughly centered ahead; keep the current heading",
"left": "The next gate is clearly left of center; yaw or roll left",
"right": "The next gate is clearly right of center; yaw or roll right",
"climb": "The next gate opening is above the drone's line of flight; gain altitude",
"descend": "The next gate opening is below the drone's line of flight; lose altitude",
"hold": "No gate is visible or the frame is unreadable; slow down and search instead of turning"
}
},
"gate_visible": {
"type": "noul",
"instructions": "The next racing gate is visible in this frame."
},
"gate_left_of_center": {
"type": "noul",
"instructions": "The next racing gate is to the left of the center of this frame."
},
"gate_above_center": {
"type": "noul",
"instructions": "The opening of the next racing gate is above the center of this frame."
}
}
}""")
res = requests.post(
"https://router.flatkey.ai/api/alpha/decisions",
headers={"Authorization": f"Bearer {os.environ['FLATKEY_API_KEY']}"},
json=body,
timeout=60,
)
res.raise_for_status()
data = res.json()
print(json.dumps(data["answers"], indent=2), data.get("usage"))
No Flatkey key yet? Get one for Jev 1.13 →
About this use case

Who / when
Audience
- hobbyists and researchers building AI pilots for drone racing simulators
- robotics teams that want a fast perception-to-decision step inside a control loop
- builders comparing decision models (yes/no vs multiple choice) on the same task
- game and sim developers who need an agent to act on every frame without a chat round trip
Triggers
- the pilot loop needs a decision on every frame and a chat model is too slow to keep up
- a single multiple-choice "which way?" question keeps mixing up left vs right on off-center gates
- the drone needs to know there is no gate in view and hold or search instead of guessing a turn
- you want to compare models on the same course, drone and snapshot and pick the best answer format
The workflow
- 01Camera frameThe current snapshot (or a short vision summary) plus speed and altitudeInput
- 02Yes/no checksGate visible? Left of center? Above center? Close enough to commit?Jev
- 03Steer pickstraight / left / right / climb / descend / hold, as a cross-checkJev
- 04Flight codeMap confident answers to stick inputs; hold and search when unsureYour code
Question shape
{
"steer": {
"type": "choice",
"instructions": "A racing drone is flying a gate course. Looking at this camera frame, which single correction best lines the drone up to fly through the next gate?",
"criteria": {
"straight": "The next gate is roughly centered ahead; keep the current heading",
"left": "The next gate is clearly left of center; yaw or roll left",
"right": "The next gate is clearly right of center; yaw or roll right",
"climb": "The next gate opening is above the drone's line of flight; gain altitude",
"descend": "The next gate opening is below the drone's line of flight; lose altitude",
"hold": "No gate is visible or the frame is unreadable; slow down and search instead of turning"
}
},
"gate_visible": {
"type": "noul",
"instructions": "The next racing gate is visible in this frame."
},
"gate_left_of_center": {
"type": "noul",
"instructions": "The next racing gate is to the left of the center of this frame."
},
"gate_above_center": {
"type": "noul",
"instructions": "The opening of the next racing gate is above the center of this frame."
}
}Gate policy
≥ 0.85
Act this frame: if gate_visible, apply a left or right correction from gate_left_of_center and a climb or descend correction from gate_above_center, scaled by your own controller gains.
0.60–0.85
Apply a small, damped correction only, keep throttle steady, and ask again on the next frame before committing to a bigger turn.
< 0.60
Hold: ease off throttle and keep the last safe heading (or run a search pattern) until a frame comes back with a confident answer.
Failure modes
Pre-launch checks before you trust auto-routing:
- Asking one broad "which way should I fly?" question when several narrow yes/no checks are easier to answer and easier to combine in code;
- Forcing a turn on every frame with no hold option, so a frame with no gate in view still yanks the drone left or right;
- Letting the model output stick values directly; Jev should answer what it sees, while gains, rates and limits stay in your controller;
- Acting on a single low-confidence frame instead of damping the correction and asking again on the next one;
- Comparing models on different courses, drones or frames; the useful comparison sends the same snapshot to every model;
FAQ
Why yes/no questions instead of one multiple-choice question?
In @Vybhav's drone race, Jev with yes/no responses finished first and Jev with multiple-choice responses second, ahead of CLM-8B. Narrow yes/no checks (is the gate left of center? above center?) are each simple to answer, and code can combine them into a turn and a climb at once.
Why keep the steer choice at all?
It is a cheap cross-check. If the yes/no answers say left but the steer pick says right, log the frame and hold instead of turning. You can drop it once your logs show the yes/no checks are enough.
Does Jev fly the drone?
No. Jev answers questions about the current frame with probabilities. Your flight code maps those answers to stick inputs, applies gains and limits, and keeps the failsafes.
What was compared in the original test?
Jev with yes/no responses, Jev with multiple-choice responses, CLM-8B with yes/no and CLM-8B with multiple choice, all on the same course with the same drone and the same snapshot sent to every model. Details are in the source thread linked below.
What should happen when no gate is in view?
Hold. Give Jev an explicit hold option and a gate_visible check, and have code ease off throttle and search until a frame comes back with a confident answer, instead of guessing a direction.
What does the Flatkey call look like?
POST https://router.flatkey.ai/api/alpha/decisions with Authorization: Bearer …, Content-Type: application/json, and a body of state, model (typesafe/jev-1.13), and questions (choice / score / noul). This is not an OpenAI-compatible /v1 chat endpoint.
Can I bring my own API key?
Yes. Try the free demo above without signing in. To run it live on your own text, sign in with Google and connect a Flatkey or OpenRouter key (a quick test call runs when you save it). Manage or delete it anytime under Dashboard → BYOK. Keys are stored encrypted on the server, used only for runs you trigger, and never sent back to the browser. Need a Flatkey key? Get one for Jev 1.13 on Flatkey.
Is this the official TypeSafe Jev product page?
No. jev-llm.com is an independent research and practice site. Verify pricing, models and terms at the original TypeSafe sources.
Sources
I raced AI models as drone pilots to test @typesafeai Jev vs CLM-8B and various output options. Same course, same drone, same snapshot sent to every model. Models tested: 1: Jev (@typesafeai) - Yes/No response 2: Jev - Multiple Choice response 3. CLM-8B - Yes/No Response 4. CLM-8B - Multiple Choice response Results: 🥇 Jev with yes/no responses. 🥈Jev with multiple choice responses 🥉 CLM-8B - Yes/No Response (details in the thread)
— @Vybhav View the post on X →
Wire this gate with your own key
Bring your own key through Flatkey / OpenRouter. Keep exact checks in code.