jevexpress
v0.1.1
Published
Express with no routes. TypeSafe Jev picks which handler runs.
Maintainers
Readme
jev-router
Express with no routes. Jev picks which handler runs.
There is no GET /users/:id. Clients hit the origin. Method, path, and body are evidence. You register English + a named function. Jev’s Choice key is function.name so the payload stays small.
import express from 'express'
import { JevRouter } from 'jevexpress'
const api = JevRouter()
function listUsers(_req, res) {
res.json({ users: [] })
}
function createUser(req, res) {
res.status(201).json({ user: req.body })
}
api.handle('List users. Collection read; no body required.', listUsers)
api.handle('Create a user from JSON with name and/or email.', createUser)
const app = express()
app.use(express.json())
app.get('/health', (_req, res) => res.json({ ok: true }))
app.use(api)What Jev sees:
{
"listUsers": "List users. Collection read; no body required.",
"createUser": "Create a user from JSON with name and/or email.",
"none_of_the_above": "The request does not match any registered handler."
}These can all run listUsers:
curl http://localhost:3000/users
curl http://localhost:3000/please-list-the-people
curl -X POST http://localhost:3000/ -H 'content-type: application/json' \
-d '{"please":"list people"}'handle takes two arguments only: the intent string, then the function. There is no id and no path. Inline arrows have no .name — use function listUsers(...).
Install
npm install jevexpress expressNode 20+. Jev is called through OpenRouter’s Decisions API, not chat completions:
export OPENROUTER_API_KEY=sk-or-...Default model is typesafe/jev-1.13. Pass model: '~typesafe/jev-latest' to track current Jev.
How it works
handle(intent, namedFn)— no route table.- Every request except
GET /healthbecomes{ method, path, query, contentType, body }. - One Choice over the function names +
none_of_the_above. The sentences are the criteria. confidence < 0.65ornone_of_the_above→ 404 with the probability dump.- Otherwise that function runs. Jev cannot invent a new handler.
Headers: X-Jev-Handler (the function name), X-Jev-Confidence, X-Jev-Model.
Put auth in front of app.use(api).
Options
JevRouter({
minConfidence: 0.65,
model: 'typesafe/jev-1.13',
apiKey: process.env.OPENROUTER_API_KEY,
skipPaths: ['/health'],
})Limits
- Choice is capped at 255 options (254 handlers +
none_of_the_above). - Typical Jev latency is ~70–500ms.
- URLs are not the interface.
- Body is truncated (~4k chars). Do not minify handler names away.
Demo
export OPENROUTER_API_KEY=sk-or-...
npx tsx examples/demo.ts