agentrun
★ 423▲ 13Parcha-ai/agentrun
A workflow DSL for agents with a Jev package for the steps that are decisions rather than generation.
BAML language support for an AI if-statement: .feels() as a real, typed method backed by a decision model.
Hands-on review
BAML's `.feels()` on any value: Jev answers the judgment, an LLM writes the prose, and the return type is the schema it must fill.
Good for
Watch out for
Tested Sep 21, 2026 at e0f07b4ad1e0 · The BAML language toolchain 0.20.1 in Docker; its offline tests, and its demo program against the real API
How we reviewed this: we fetched the BAML language toolchain 0.20.1 into Docker, ran the repository’s offline tests, and ran its demo program against the real API. The .ask() path needs a generative provider we did not configure, so that half is read rather than run.
feelings is a small BAML repository from BoundaryML that adds judgment methods to every type in the language:
if (email.feels("urgent")) {
baml.io.println(email.ask("Draft a reply"));
}
feels is a Noul thresholded at 0.5; how gives you the raw probability; matches<T> picks a member of an enum or literal union; judge<T> is the same with an explicit question; fill<T> fills every field of a class in one request, with each field’s description as its question; ask goes to a generative model, because that is the part a decision model will not do.
The trick that makes it interesting is the last line of each signature: the return type is the schema. matches<Team>() asks Jev to pick a Team because Team is what the call site wants back, and a class is rejected before any HTTP with a message pointing you at fill<T>. Types as questions is a better fit for this model than any fluent API we have seen.
It runs on any value, too. From the demo, live:
🔥 Acme Corp (enterprise) → Technical, mood=angry, churn=0.55
Jo (free) → Billing, mood=calm, churn=0.18
urgency of 'lunch?': 0.16 urgency of 'SERVER ON FIRE': 0.96
1000000 scary? true 1337 scary? false
The last line is .feels("scary") on integers. Strings pass through as the state; everything else is serialized to JSON first.
baml test is offline by design, and it is the sort of test suite we would like to see more of — it asserts on the requests rather than the answers:
PASS root::feels asks one Noul question with the quality in the instructions
PASS root::state_of passes strings through and serializes everything else
PASS root::the blanket impl is available on every type
PASS root::matches<T> rejects a class before any request; fill<T> is for that
Four tests, no key, no network, each one pinning a property that a refactor could quietly break — including the rejection that saves you a wasted request.
Two providers. The Jev client is declared in vibes.baml and reads TYPESAFE_API_KEY; .ask() needs a generative provider — the example environment file lists Anthropic. Run urgent, which ends in an .ask(), without that second key and it fails there, which is the correct behaviour and worth knowing before you copy the quick start.
The state is the receiver. Whatever value you call the method on is what leaves your machine, serialized. order.feels("fraudulent") sends the order. That is obvious once stated and easy to forget when the call is one word long inside an if.
Toolchain. The repository asks for a nightly toolchain, and the npm @boundaryml/baml package is a different, older CLI that does not understand baml toolchain. We ran it with the language release binary, which works; if you try this, use the toolchain the README names rather than the npm package.
No licence. Seven commits, no LICENSE, from a company whose own product is open source. It is a demonstration repository, but the absence still means nobody may reuse the one file that matters — vibes.baml, which is the whole idea. We’ve asked for one.
The most elegant expression of “typed decisions” we have reviewed: no SDK, no schema plumbing, just a method on a value whose return type is the question. As a way to understand what this class of model is for, it is fifteen minutes well spent.
Treat it as a demonstration, because that is what it is — and if BoundaryML wants people to lift vibes.baml into their own projects, a licence file would help.
For the same split in ordinary code see Advocaat in TypeScript, Hunch in Ruby, and jev-gateway for a proxy that does it without touching your code at all.
See how it compares with other tools in Best Jev tools, tested hands-on.
Review updated Sep 21, 2026. Numbers quoted from the project are its author's own; we don't publish our own measurements of Jev.
Parcha-ai/agentrun
A workflow DSL for agents with a Jev package for the steps that are decisions rather than generation.
osolmaz/switch
TypeScript framework for decision-model harnesses: your program offers a short list of next steps and the model picks one at a time until it can answer, with chess, wikirace and rubric-judge examples run on Jev.
disler/ten-levels-of-jev
Thirty worked uses arranged in ten levels, from one if statement to an agent that reaches for Jev itself, with a video walkthrough.
New Jev releases, pricing changes, and the best new projects, once a week. No spam; unsubscribe anytime.
Powered by Buttondown. See our privacy policy.