jev-align and effect-agent: Typed Effects Meet Typed Decisions
jev-align tunes AI function definitions with Jev and human feedback via GEPA. effect-agent wires Jev into TypeScript's Effect framework. Two takes on 'typed.'
Both projects here use the word "typed," but they're solving different problems. jev-align is about improving the definition Jev is asked to evaluate against — a human-in-the-loop loop that uses Jev's own uncertainty to decide what needs labeling next. effect-agent is about plumbing — taking Jev's typed answers and making them a first-class citizen inside Effect, the TypeScript library built around typed errors and composable, testable async workflows. Read together, they cover two ends of the same problem: getting a good question in, and getting a typed answer out cleanly.
Key Takeaways
- jev-align tunes AI function definitions, not model weights. It runs rounds of evaluate → select ambiguous rows → label → optimize with GEPA → review the diff — a workflow, not a single API call.
- jev-align picks what to label using Jev's own uncertainty. It evaluates the dataset, measures uncertainty, then samples ambiguous rows plus a random audit sample — a form of active learning built on top of Jev, not around it.
- jev-align supports three Jev providers. TypeSafe AI directly, Vercel AI Gateway, and Cloudflare Workers AI, with a separate model configurable for GEPA's own reflection step.
- effect-agent is in public beta. Its own README says APIs and stored data may change before 1.0 — treat it as early, not stable.
- effect-agent is model-agnostic by design. It demonstrates OpenAI as a provider but is built around Effect's pluggable language-model abstraction, so a Jev-backed provider is one implementation choice among several.
jev-align: human feedback plus Jev uncertainty, run through GEPA
jev-align (Apache-2.0, 281 stars as of September 2026) is a CLI for building what its README calls "AI Functions" through iterative human feedback. The workflow runs in rounds: evaluate the configured dataset and measure uncertainty in Jev's predictions, select the most ambiguous rows plus a random audit sample for a human to label, feed the accumulated labels and optional rationales into GEPA — an optimization framework — with a configurable metric-call budget (300 by default), then show the resulting score change, certainty change, and a diff of the proposed definition update. At each round you can accept, reject, rewind, or save and resume later.
The core idea is a form of active learning: instead of labeling data at random, you label where Jev is least certain, which should be where the current function definition is weakest. GEPA then uses those labels — and any rationale you attach to them — to propose a better definition, not better model weights. jev-align supports three Jev providers (TypeSafe AI directly, Vercel AI Gateway, and Cloudflare Workers AI) and lets you configure a separate reflection model for GEPA's optimization step, distinct from the model doing the evaluation.
Install with uv tool install jev-align or pip install jev-align (Python 3.11+), set TYPESAFE_API_KEY plus your chosen LLM provider key, and run jeva or jev-align to start the guided setup. The README is candid about the human-in-the-loop guarantee and its limits: every label requires review before acceptance, sensitive information can't be published to any shared registry, and — importantly — "the registry does not claim or verify that every published annotation was created or reviewed by a person." If you're pulling in someone else's published function definitions rather than building your own, that line is worth re-reading before you trust the label provenance. Unpublishing a function also doesn't revoke copies already downloaded by others. On aiskill.market: /skills/jev-align-sutro-sh.
This pairs naturally with the calibration work in calibrating Jev thresholds — jev-align is essentially automating the "where should I look next" step of an ongoing calibration process, using Jev's own confidence as the search signal.
effect-agent: Jev as a first-class citizen inside Effect
effect-agent (MIT, 121 stars) takes a different angle entirely. It's built on Effect, the TypeScript library for typed errors, dependency injection and composable async workflows, and its pitch is that a Jev-style typed decision provider should feel native inside that ecosystem rather than bolted onto it as a fetch call wrapped in a try/catch.
Concretely, it uses Effect's Schema system to define typed inputs, outputs and tool parameters for agents, supports multiple model providers through a pluggable interface (the README demonstrates OpenAI, but the framework is explicitly model-agnostic), integrates with Effect AI's Toolkit for typed, effectful tool operations, exposes streaming and lifecycle events for observing an agent mid-execution, and lets you set execution policies — max turns, max tool calls, max duration — as first-class configuration rather than manual loop-breaking logic. In practice, a Jev decision provider slots into effect-agent the same way any other typed decision source would: as a service dependency Effect's runtime resolves and its error channel can surface failures from cleanly, instead of an untyped promise you have to guard defensively.
The dependency is effect-agent@beta via bun add, and it needs an Effect AI provider configured separately — there's no built-in default model, and setup requires wiring up BunRuntime, provider layers and HTTP clients yourself. The README states plainly that APIs and stored data may change before 1.0, though persistent adapters are designed to support storage-format upgrades across beta versions, which suggests the maintainers are at least planning for that migration path rather than treating beta as a free pass to break things silently. On aiskill.market: /skills/effect-agent-danieljvdm.
Worth knowing before you reach for effect-agent: the Effect monorepo itself publishes an @effect/ai-typesafe package alongside its OpenAI, Anthropic and OpenRouter provider packages — a TypeSafe decision provider maintained as part of Effect's own AI module family, separate from danieljvdm's third-party effect-agent project. If your goal is simply "call Jev from inside Effect," check whether that first-party provider covers your use case before adding effect-agent's additional agent-orchestration layer (execution policies, lifecycle events, persistent adapters) on top. effect-agent wraps the decision-provider interface, not TypeSafe's own SDK covered in TypeSafe's official JS and Python SDKs, so check which one you actually want before assuming interchangeability.
What to do next
- Use jev-align if your problem is "the function definition is vague," not "the model is wrong." It's built for improving how a decision is specified, using human review to keep quality high.
- Budget for GEPA's metric-call cost. The default 300-call budget per round is real spend against your configured Jev provider — factor that into any estimate before running a round at scale.
- Check the human-review provenance claim before trusting a shared function definition — jev-align's own README says the registry doesn't verify that every published annotation was reviewed.
- Treat effect-agent as beta software. Pin the exact version you install and re-read the changelog before upgrading; the README says breaking changes are still expected before 1.0.
- If you're not already in the Effect ecosystem, don't adopt it just for Jev access. The official SDKs in TypeSafe's official JS and Python SDKs are the lower-friction path unless you have another reason to want Effect's typed-error model. See the full landscape at the Awesome Jev projects radar.