AI Decision System
Replayable, offline-verifiable records for AI-assisted go/no-go decisions: experiment promotions, typed model answers and human-approved actions.
翻译准备中
个人 GitHub 账号下公开仓库的所有者可以登录并验证所有权,自行管理介绍,无需管理员批准。
登录并生成验证文件,在 30 分钟内将其提交到此仓库的默认分支。其他分支或分叉仓库中的文件无效。然后在下方检查文件,即可无需管理员批准直接管理项目。请保留文件以维持管理权限。
如需登录,将前往登录页面。登录后请回到此处,再次点击所选的验证按钮。
在项目文件夹中运行 /nomorevibe verify,即可验证所有权并自行管理介绍。
一分钟完成验证Frontier prices only for frontier work: each task goes to the cheapest model that does it well, a request is split only when that pays, and every result is checked. Decisions by Jev.
翻译准备中
取自仓库 README
正在加载完整 README。 以下为已保存的摘录。
Frontier prices only for frontier work.
Taskpenny splits a request only when it expects splitting to pay, gives each task to the cheapest model that does
it well, checks every result, and shows you the receipt. Open source, Python, one command to try.
A real run replayed at 4x. Watch it in your browser: live demo
(no key, no cost). The saving on the page is the receipt's estimate against Claude Opus 5.5; the benchmark below
runs the models it compares with for real.查看完整 README ↗Frontier prices only for frontier work.
Taskpenny splits a request only when it expects splitting to pay, gives each task to the cheapest model that does it well, checks every result, and shows you the receipt. Open source, Python, one command to try.
A real run replayed at 4x. Watch it in your browser: live demo (no key, no cost). The saving on the page is the receipt's estimate against Claude Opus 5.5; the benchmark below runs the models it compares with for real.
On 50 English tasks Taskpenny had never seen (40 Arena-Hard prompts and 10 requests with four asks each), judged pair by pair by Gemini 3.1 Pro (full report):
| Against | Taskpenny's setup | Taskpenny cost | As good or better |
|---|---|---|---|
| Claude Sonnet 5 alone | Sonnet 5 as its strongest model, on equal footing (same worker instruction and reasoning cap) | 38% less (19 to 56) | 74% (62 to 86): 11 wins, 26 ties, 13 losses |
| Claude Opus 5.5 alone | the default | 78% less (66 to 86) | 50% (35 to 65): 1 win, 23 ties, 24 losses |
The ranges are 95% intervals: fifty tasks give a direction, not a precise figure. What they say:
Costs are the ones the gateway reported for each call, with Jev at its list price (it was billed in the Opus run and free before; the report has both). Each pair was judged twice with the order swapped, and a tie includes the pairs where the two orders disagreed. The judge prefers longer answers, and Taskpenny's workers are told to show the key steps while the baselines get no instruction; Taskpenny also caps hidden reasoning (off on tiers 1 and 2, low on tiers 3 and 4) while the baselines use each model's default, so part of the saving comes from that setting and not from routing. The control that gives the baseline both the same worker instruction and the same reasoning cap was run on 1 October 2026: on equal footing the saving is 38% (not 52.5%) and Taskpenny is as good or better in 74% (not 82%), which is the headline above. See the full report. The author also voted blind on 20 pairs (as good or better in 18, where the judge said 14), with limits the report spells out.
We publish where Taskpenny loses too: against Opus, in the first full run (only 13% cheaper than Sonnet 5), and in Catalan, our weakest set. It is all in the report.
pip install taskpenny
taskpenny demo # replays a real run in the terminal: no key, no cost
Then give it a key:
export AI_GATEWAY_API_KEY=... # one Vercel AI Gateway key: Jev decides, and it reaches Claude, GPT and Gemini
taskpenny run "Write a short email to move tomorrow's meeting to Thursday"
taskpenny ui # the live task tree in your browser
The Vercel key is required: every decision is Jev's, and Jev is reached through Vercel AI Gateway. Your own OpenAI, Anthropic or Gemini keys can be added next to it; see "Keys" below.
Every run is saved in runs/ as JSON. taskpenny export runs/<id>.json turns one into a Markdown report.
Who it is not for (yet): if every answer must match Claude Opus on hard prompts (see above), or if your calls are one short classification each, where a per-request router is enough. Tool calling, images and JSON mode are not supported yet; Taskpenny returns a clear error.
| Project | What it routes | What Taskpenny adds |
|---|---|---|
| RouteLLM, OpenRouter Auto, Not Diamond, LiteLLM's auto router | A whole request, to one model | It can split a request when the parts go to cheaper models, and Jev checks every result before the answer goes out |
| ROMA | Subtasks, recursively, with a model set for each module | Jev picks the tier of every subtask and the cheapest model of that tier does it; a plan is dropped when splitting would not pay |
| JevRouter | The steps of a plan, with Jev deciding | Taskpenny also does the work, checks it and gives you the cost receipt |
From each project's own README and docs, September 2026. All of them are good at what they do, several report what each request cost, and several can sit next to Taskpenny: it speaks the OpenAI API.
request
|
v
[gate] Jev: split it? which tier (1-4)? what kind of work? what form of answer?
| |
| clearly worth splitting | one task
v v
[planner] subtasks with prompt, [router] closed question -> Jev answers it
success criteria and anything else -> cheapest model of the tier
dependencies; each one goes |
back to the gate v
| [worker] result + notes for the tasks that depend on it
| |
| v
| [check] Jev: does it meet the criteria?
| no -> repair, then one tier up (at most 2)
v
[assembly] an outline from a cheap model; the parts are stitched in, not rewritten
|
v
[final check] Jev against the request; only what is missing gets written
|
v
answer + cost receipt + full task tree
Every decision is a closed question (split or not, which tier, is this good enough), and closed questions are what Jev, TypeSafe AI's decision model, answers well and cheaply. When a request, or a part of a plan, is itself a closed question about texts it gives (label these messages, yes or no for each email, rate each ticket), Jev answers it item by item; the cheapest model only writes the question, and answers the items Jev is unsure about. Jev does not solve problems: maths, code and quiz questions always go to a language model.
Splitting uses more tokens in total. The saving is in money: most tokens go to models that cost a fraction of a frontier model, and Taskpenny drops a plan when the parts would not go to clearly cheaper models (5 of 11 plans in the Sonnet-ceiling run on the 50 new tasks). Details, thresholds and fallbacks: docs/how-it-works.md. Every option and variable: docs/configuration.md.
taskpenny serve starts an OpenAI-compatible endpoint on http://127.0.0.1:8765/v1, with the live page on the
same address. Change only the base URL:
from openai import OpenAI
client = OpenAI(base_url="http://127.0.0.1:8765/v1", api_key="unused", max_retries=0) # each call is a paid run
reply = client.chat.completions.create(
model="taskpenny", # or "taskpenny/anthropic" to use only Claude models
messages=[{"role": "user", "content": "Draft a polite reminder for an unpaid invoice."}],
)
print(reply.choices[0].message.content)
print(reply.model_extra["taskpenny"]) # run id, status, warnings, cost in USD, baseline estimate, saving
runs/ and visible live on the page while it works.stream: true works, but the answer arrives in one piece at the end: Taskpenny checks the work before answering.
The headers and a keep-alive line go out at once.taskpenny.status says done, unverified (complete, but a check did not pass or
could not run) or partial (stopped early, finish_reason: "length"), with the reasons in taskpenny.warnings;
a run with no answer is an HTTP 502 error.max_retries=0 in your client, or send an Idempotency-Key header so a retry
gets the first run's answer. A client that disconnects without that header cancels its run.TASKPENNY_CEILING=anthropic/claude-sonnet-5 makes the model you use today the strongest one Taskpenny may use."taskpenny": {"max_cost": 0.2, "no_split": true} in the body, or the header X-Taskpenny-Max-Cost.TASKPENNY_API_KEY
(openssl rand -hex 24) and put an https proxy in front: then the API and the page need the key (the page asks
for it once). A request's budget is a ceiling, and it can ask for at most TASKPENNY_MAX_COST (2 USD by default).docker compose up # page and API on http://127.0.0.1:8765
# or: docker build -t taskpenny . && docker run -p 127.0.0.1:8765:8765 -e AI_GATEWAY_API_KEY taskpenny
Keys come from your environment and are never written into the image. Runs are kept in the taskpenny-runs
volume.
| You set | What Taskpenny does |
|---|---|
AI_GATEWAY_API_KEY (required) | Jev decides every step and every model is reached through Vercel AI Gateway, with the real cost of every call. |
That, plus TASKPENNY_DIRECT=anthropic,openai and those providers' keys | Those providers' models go straight to their own API; everything else, Jev included, through Vercel. |
That, plus TASKPENNY_LOCAL | Basic tasks go first to a free local model (below). |
Without the Vercel key there is no real run: Taskpenny tells you so, and taskpenny demo and --dry-run still
work. taskpenny doctor shows what your keys reach and whether each model name exists on its provider's API,
without spending tokens.
With Ollama running, basic tasks can run on your machine at no cost:
ollama pull qwen3:4b
export TASKPENNY_LOCAL=qwen3:4b # tier 1 goes local; "qwen3:8b@2" also covers tier 2; "auto" = all installed
Jev still checks every result. A weak answer is first repaired by the same local model, then moves one tier up, where a cloud model does it unless a local model covers that tier too. Use a model of at least 3 to 4 billion parameters: tiny ones answer fast but badly.
Your prompt goes to Jev and the models through Vercel AI Gateway, and to any provider you call directly. Keys are
read from environment variables only and are never written to disk, run files or logs; set the server's own key
with TASKPENNY_API_KEY too, since a key on the command line shows in the process list. Saved runs contain your
requests and answers. The page loads nothing from other sites (its fonts come with it). See
SECURITY.md.
With Jev at its list price. The report also has the figures with Jev free, as it was during the run.
| What Taskpenny did | Tasks | Taskpenny cost | As good or better |
|---|---|---|---|
| Basic and standard tasks, one cheap model | 103 | 92% less | 76% |
| Of those, labelling customer messages (true labels) | 10 | 95% less | same accuracy, 96 of 100 |
| Advanced tasks, one model | 16 | 11% less | 69% |
| Critical tasks, sent to Claude Opus | 8 | 2.0x as much | 100% |
| Requests split into parts | 15 | 2.2x as much | 73% |
| All | 142 | 13% less | 76% |
That run is why the ceiling and the "split only when it pays" rule exist. The 50 new tasks above were run after both changes. Method, raw data and how to rerun it: bench/public.
Can you trust an LLM judge? It is from a third provider, compares each pair twice in both orders, and counts
a tie when the two orders disagree. It does like longer answers: many of Taskpenny's losses on basic tasks were
short, correct answers against longer ones. You can rerun the benchmark with your own judge, or give the baseline
Taskpenny's own worker instruction (--baseline-system worker) to see how much that matters.
Do I need Vercel? Yes. Every decision in Taskpenny is Jev's, and Jev is only reached through Vercel AI Gateway. Earlier versions let a small language model stand in for Jev; it made decisions that cost more and were never measured for accuracy, so it is gone. Your own provider keys still work next to the Vercel key.
Why Jev? Every decision Taskpenny makes is a closed question. Jev answers those with a probability and a confidence, costs about 4 cents per thousand decisions at list price (about 1,000 tokens each in our benchmark), and never writes text.
What if Jev changes? The development cases (bench/run_dev.py) show quickly whether its decisions moved, and
the thresholds that use them are in one place (Settings in decider.py).
Adding a model is a few lines in models.yaml.
Translations of the page and good first issues: CONTRIBUTING.md
and docs/good-first-issues.md.
If Taskpenny saves you money, a star helps other people find it.
The code is MIT. The benchmark's task texts keep their own licences (Apache 2.0, CC BY-SA 3.0, CC BY 4.0): see bench/public/LICENSES.md. Made by Cinto Casals · SerIA Nativa.