laya-php
★ 110marcreichel/laya-php
Laravel-ready PHP client for Laya, the open System One model, so a typed decision is a PHP enum rather than a parsed sentence. Self-hosted, no Jev key.
.NET SDK.
View on GitHub →Hands-on review
A community .NET client for Jev with real depth: typed answers, mapped errors, retries and forward compatibility. Everything we threw at it behaved.
Good for
Watch out for
Tested Sep 20, 2026 at 6be669e0d0b1 · .NET 10 in Docker, against the live Jev API with a real key; 16 checks written against the SDK's own API
How we reviewed this: we built the repository at commit 6be669e in Docker on .NET 10, ran its test suite, and then wrote 16 of our own checks against the live Jev API with a real key, covering every question type, state shape, error mapping, and the SDK’s option limits. We also installed the published NuGet package into a clean project the way the README says.
This is a community .NET client for TypeSafe’s System One API, by Majdi Saibi. It is not TypeSafe’s own SDK, and the README says so twice, in bold, with a pointer to TypeSafe for anything about accounts, billing or the service itself. We like that this is the first thing you read.
The shape is what a .NET developer would expect:
var client = new TypeSafeClient(); // reads TYPESAFE_API_KEY
var result = await client.SystemOneAsync(
"My card was charged twice, please fix this ASAP.",
[
new NoulQuestion("is_urgent", "Does this convey urgency?"),
new ChoiceQuestion("department", "Which team should handle this?", ["billing", "technical", "sales"]),
new ScoreQuestion("frustration", "How frustrated is the customer?", ["Calm", "Frustrated", "Very angry"]),
]);
Underneath there’s more than a wrapper: mapped exception types for every documented status, a retry policy with backoff, jitter, Retry-After handling and a total budget, an IHttpClientFactory-based DI package, a trimming- and AOT-safe overload that takes a JsonTypeInfo<TState>, and a forward-compatibility story — unknown answer kinds become UnknownAnswer instead of failing the whole response, and unmodelled fields survive in RawJson and AdditionalProperties.
The repository’s own suite ran first: 147 tests passed on .NET 10, with 5 integration tests skipped because they need a key. (The net8.0 half of the run failed to start in our container, which only has the .NET 10 runtime — that’s our environment, not the SDK.)
Then our own checks, through the real API:
JsonNode, and an arbitrary C# object through the reflection overload.Legend, LegendTextAtLevel, Variance and NormalizedEntropy() all returned sensible values, and the README is explicit that these are the SDK’s own arithmetic over the distribution, not the API’s confidence.models.list returned the models our key can see.TypeSafeAuthenticationException with status 401. An unknown model name raised TypeSafeBadRequestException — the API answers that with a 400, and the SDK maps it faithfully rather than guessing at 404.Two of our checks came back “failed” and were, on inspection, the SDK being right. A ScoreQuestion with one level threw an ArgumentException client-side, before any request — the API never saw it, and the message tells you to use a Noul instead. And a RawQuestion with an invented question type was rejected by the API with a 400, which is the API’s answer, not the SDK’s fault; the escape hatch works, there is simply nothing on the other side to accept a made-up kind yet.
So: everything we could exercise behaved, and the client-side validation saved two pointless round trips.
$ dotnet add package TypeSafeAI.Sdk
error: There are no stable versions available, 0.1.0-alpha.2 is the best available.
Consider adding the --prerelease option
That’s the README’s own quickstart, run in a clean project. dotnet add package TypeSafeAI.Sdk --prerelease installs 0.1.0-alpha.2 and our test program compiled against it fine. A one-word docs fix, but it’s the first command a new user runs.
Related: the packages were renamed from TypeSafe.Sdk to TypeSafeAI.Sdk a day into the project’s life, and the old name still sits on NuGet at 0.1.0-alpha.1. There’s a migration document for it. Fine for an alpha; worth knowing before you pin anything.
TYPESAFE_API_KEY or from options you pass, and the transport only attaches it as a bearer header.Created on September 16 and pushed hard: 42 commits, a CI workflow, CodeQL, dependency review, an OpenSSF scorecard workflow, a docs site, locked package files, and checked-in public API surface files that fail the build when the API changes. Much of the recent history is release-pipeline plumbing, which tracks with an author trying to get a first package out properly. MIT licensed, no open issues at the time of writing.
The documentation deserves a mention: a docs folder covering quickstart, questions, answers and confidence, retries and errors, forward compatibility and patterns, plus XML docs on every public member. That’s unusual care for a five-star repository.
If you’re on .NET and want Jev, this is a real option rather than a stopgap: it behaved correctly on every check we ran against the live API, it validates what it can before spending a call, and it’s built to survive the API growing new fields. The README explains the confidence question — what the API reported, versus what the SDK computes — better than most first-party documentation we read.
Set your expectations to alpha: one rename already, a version number below 1.0, a single maintainer, and a community project with no support commitment. For anything production-shaped, pin the version, and remember that --prerelease until a stable release appears.
For clients in other languages, see the Community SDKs in our projects list.
See how it compares with other tools in Best Jev tools, tested hands-on.
Review updated Sep 20, 2026. Numbers quoted from the project are its author's own; we don't publish our own measurements of Jev.
marcreichel/laya-php
Laravel-ready PHP client for Laya, the open System One model, so a typed decision is a PHP enum rather than a parsed sentence. Self-hosted, no Jev key.
spring-ai-community/spring-ai-typesafe
Java client for the System One API on Spring RestClient, plus Spring AI integrations that use it as a judge, a guardrail, a RAG post-processor and a tool index.
obie/ruby_decision_model
Ruby gem with one client for decision models behind several providers: TypeSafe's Jev, OpenRouter (the default), OpenAI, Cloudflare Clef, Perplexity and any /v1/systemone server.
New Jev releases, pricing changes, and the best new projects, once a week. No spam; unsubscribe anytime.
Powered by Buttondown. See our privacy policy.