Elyra
Elyra The coding agent eTerm The terminal that knows where each command ends Huskarl AI colleagues on your own Mac Starf An activity monitor for Apple silicon that never invents a number etrans An SSH and SFTP client for macOS Elyra VM Virtual machines for macOS, Linux and Windows on your Mac Litr A small, native web browser for macOS Notr A notebook for macOS e The native code editor Elyra Grove Native local development environment Askr The real server for Laravel & PHP Elyra Framework Rust + Svelte 5 framework for desktop apps Elyra Conductor Local project conductor Refr Local-first PDF workspace for macOS Elyra Workspace A desktop workspace for coding agents Elyra SQL Server MySQL-compatible SQL server in Rust Elyra Félagi Agents as teammates on one board Elyra SQL Client Native desktop SQL workbench Elyra SQL Anywhere Replication-ready SQL engine Elyra Sjá SEO & GEO workspace for macOS Elyra DataGrid Server-driven data grid for Laravel
Development
Development
Release notes
Changelog
Elyra
Jev decision tools

Jev decision tools

Calibrated yes/no, choice and score judgements from TypeSafe Jev — direct with a TypeSafe key, or through OpenRouter — probabilities instead of prose, about a second and $0.00002 a call.

TypeSafe Jev decisions for Elyra -- calibrated yes/no, choice, and score judgements through OpenRouter.

Jev is a decision model, not a chat model. It never generates text. You give it a piece of content (state) and one or more typed questions, and it returns probabilities. A call takes about one second and costs roughly $0.00002.

Install

elyra install npm:@elyracode/jev-tools

Requirements

One of two API keys:

  • TypeSafe direct (preferred): a key from typesafe.ai. Set TYPESAFE_API_KEY. Requests go to https://api.typesafe.ai/v1/systemone with model jev-latest.
  • OpenRouter: log in with /login and pick OpenRouter, or set OPENROUTER_API_KEY. Requests go to OpenRouter's alpha decisions endpoint with model ~typesafe/jev-latest.

When both are present, TypeSafe direct is used. Force one with JEV_BACKEND=typesafe|openrouter. The request and response shape is identical on both; only endpoint, model slug, and billing differ.

Tools

Tool Description
decide Ask Jev one or more questions about a state. Question types: noul (yes/no), choice (pick one), score (ordinal scale). Returns probabilities, confidence, and usage.

Commands

  • /jev -- show active backend, key status, and bash gate state
  • /jev gate on|off -- toggle the bash gate for the current session

Bash gate (opt-in)

When enabled, every bash tool call is first sent to Jev with the question "would running this command destroy data or make a change that is hard to reverse?". If the probability is at or above the threshold, Elyra asks you to confirm before running it. In non-interactive mode (print, RPC) the command is blocked instead.

Enable with elyra --jev-gate, JEV_BASH_GATE=1, or /jev gate on. Off by default because it adds about one second of latency to each bash call.

If the key is missing or the API fails, the gate logs a warning and lets the command through rather than blocking all shell access. It is a second opinion, not a security boundary.

Usage

> Is this diff a breaking change? Ask Jev before you answer.
> Classify these 20 log lines by severity using decide, then only show me the ones rated high or critical.
> Before running that migration, use decide to check if the command is destructive.

Question types

noul -- yes/no with a calibrated probability:

{ "name": "refund", "type": "noul", "instructions": "Is the user asking for a refund?",
  "criteria": { "true": "explicitly wants money back", "false": "anything else" } }

choice -- pick one option, get the full distribution:

{ "name": "route", "type": "choice", "instructions": "Who should handle this?",
  "criteria": { "code": "write or change code", "research": "needs web lookup", "other": "none of the above" } }

score -- ordinal scale, 2-10 labels from low to high:

{ "name": "severity", "type": "score", "instructions": "How severe is this log line?",
  "criteria": ["debug", "info", "warning", "error", "critical"] }

Writing good questions

Jev reads criteria literally and does not infer intent beyond what is stated.

  • Describe observable conditions, not goals. Spell out both sides for noul via criteria.
  • Make choice options exhaustive, or add an other option.
  • Keep state to what the questions need. The context window is about 32K tokens.
  • Ask several questions in one call when they concern the same state; the cost is the same.

Configuration

Variable Default Purpose
TYPESAFE_API_KEY -- TypeSafe direct API key
OPENROUTER_API_KEY -- OpenRouter API key, if not stored via /login
JEV_BACKEND auto Force typesafe or openrouter instead of picking by available key
JEV_MODEL jev-latest / ~typesafe/jev-latest Override the model slug for the chosen backend
JEV_BASE_URL per backend Override the endpoint URL (proxies, or if OpenRouter moves out of alpha)
JEV_BASH_GATE off Set to 1 to enable the bash gate at startup
JEV_BASH_GATE_THRESHOLD 0.7 Probability (0-1) at or above which the gate intervenes

Notes

  • The request contract follows the TypeSafe API reference. OpenRouter's decisions endpoint is an alpha API mirroring the same shape and may change.
  • Retries with backoff on 429/529/5xx, up to three attempts. Requests time out after 60 seconds.
  • Question design guidance: see the primitives docs. A Noul near 0.5 means yes and no are equally likely, not "medium"; use a Score for degree.
  • Unofficial community integration. Not affiliated with TypeSafe or OpenRouter.