Published
Spring publishes a Java client that asks Jev before the chat model runs
Christian Tzolov wrote up spring-ai-community/spring-ai-typesafe, an Apache 2.0 Java SDK and a set of Spring AI advisors. On his laptop a three-question ticket call took 310 ms. The blog says 0.1.0 is on Maven Central. The README quick start still shows 0.1.0-SNAPSHOT, and a search of search.maven.org returned no documents for those artifact ids.
Christian Tzolov published a Spring blog on September 21 about a community Java client for Jev. The repository is spring-ai-community/spring-ai-typesafe, Apache 2.0. It is a client of TypeSafe’s hosted API, plus Spring AI advisors that implement interfaces Spring already has: a judge, a guardrail, a document filter, a tool index, and an evaluator. The model is not wired up as a chat model. A call takes a state and a map of Noul, Choice, and Score questions.
The blog’s getting-started block depends on spring-ai-starter-typesafe and typesafe-spring-ai at version 0.1.0, and it says that version is on Maven Central. The README quick start on the commit we read still shows 0.1.0-SNAPSHOT, and its docs link points at latest-snapshot. Java 17 or later. The Spring AI module wants Spring AI 2.0.1 or later. A query to search.maven.org on September 22, for artifact spring-ai-starter-typesafe and for typesafe-java-sdk, returned no documents. The README badge points at central.sonatype.com for the SDK. We did not download a jar. Default tests talk to MockRestServiceServer. Live tests need a Maven profile and TYPESAFE_API_KEY, so an exported key does not turn an ordinary build into a billed one.
The blog says every number it quotes is from a live run. One support ticket, three questions, comes back as urgent 0.95, department billing at confidence 0.82, and a frustration Score of 1.1 on a rubric of Calm, Frustrated, Very angry. The distribution behind billing is 0.87 / 0.13 / 0.0, so the confidence is not the top probability. The same ticket text in the README is commented with different values: urgency 0.92, department technical, frustration 1.6, confidence still 0.82. Bare labels, with no description of what billing or technical means, drop that confidence to 0.60 in the blog. From Tzolov’s laptop, the one-question call had a median of 275 ms and the three-question call 310 ms, with 73 output tokens.
He also cites TypeSafe’s self-consistency cookbook: a 14-question call at $0.000043 and 111 ms, against $0.0018 and 1.8 seconds for claude-haiku-4-5 and about $0.033 and 11 to 14 seconds for the reasoning models in that note. The blog summarizes that comparison as 10 to 125 times faster and 22 to 805 times cheaper, and says it is TypeSafe’s benchmark and still needs checking. We did not rerun it. TypeSafe’s Master Customer Agreement section 2.3(f) forbids customers from publishing benchmarks of the Services.
JevJudge turns each criterion into a pass, a fail, or inconclusive. On a scripted answer that Paris is -455 degrees Celsius, helpfulness came back INCONCLUSIVE at 0.83 with confidence 0.44, plausibility FAILED at 0.02, and groundedness PASSED at 0.89. The default floor is 0.5, so an uncertain rubric does not fail the verdict by itself. JevSelfRefineAdvisor appends the failing criterion’s text and asks the chat model again, up to three times, rebuilding the prompt from the original each time. The log in the blog uses a scripted chat model that answers -125 C and then 15 C, because that demo also needs an Anthropic key. The blog says the Jev side of the log is a real call.
JevGuardrailAdvisor does not retry. Defaults treat jailbreak, physical harm, and illegal requests as BLOCK, and self-harm as SUPPORT, which refuses and points at help. A hazard probability above 0.70 applies that action. Between 0.35 and 0.70 the request is logged for review and still passes. Below 0.35 it passes. A severity above 2.0 turns a review into a block. The input check can return before the chat model is called. The output check is what catches an answer that crossed a line after an ordinary request. A Choice always names a winner, so the tool index asks a separate Noul for whether any tool applies at all.
Jev does not stream, so the advisors buffer. State has to be a string, an object, an array, or null. A bare number or boolean gets a 422. Reranking twenty documents is twenty calls, which is why the filter is meant to run first. We did not compile the examples.
This site's reading
Editorial notes evaluating claims against primary sources, contextualizing findings alongside related implementations, and defining technical terms.
Verify
Blog by Christian Tzolov, Engineering, September 21, 2026, on spring.io. Repo spring-ai-community/spring-ai-typesafe, Apache 2.0, Java 17 or later. typesafe-spring-ai wants Spring AI 2.0.1 or later. Modules: typesafe-java-sdk (no Spring AI dependency), typesafe-spring-ai, spring-ai-starter-typesafe, typesafe-bom, examples. The blog's dependency block pins 0.1.0 and says that version is on Maven Central. The README quick start on the commit we read pins 0.1.0-SNAPSHOT and links the docs at latest-snapshot. A query to search.maven.org on September 22 for artifact spring-ai-starter-typesafe, and another for typesafe-java-sdk, returned no documents. The README badge points at central.sonatype.com for typesafe-java-sdk. We did not resolve that page to a file. Default tests use MockRestServiceServer and do not call the API. Live tests need the integration-tests profile and TYPESAFE_API_KEY. The blog says every output it quotes is from a live run. The support ticket in the blog returns is_urgent 0.95, department billing at confidence 0.82, distribution billing 0.87 / technical 0.13 / sales 0.0, frustration Score 1.1 on Calm / Frustrated / Very angry. The same ticket text in the README is commented as urgency 0.92, department technical, confidence 0.82, frustration 1.6. Bare labels on that ticket drop confidence to 0.60 in the blog. Laptop timing, one-question median 275 ms, three-question median 310 ms, 73 output tokens. The blog cites TypeSafe's self-consistency cookbook for a 14-question call at $0.000043 and 111 ms, against $0.0018 and 1.8 s for claude-haiku-4-5 and about $0.033 and 11 to 14 s for the reasoning models, summarized there as 10x to 125x faster and 22x to 805x cheaper. Tzolov writes that this is TypeSafe's benchmark and still needs validation. Judge example, scripted answer "It is currently -455 degrees Celsius in Paris": helpfulness INCONCLUSIVE 0.83 at confidence 0.44, is_plausible FAILED 0.02, is_grounded PASSED 0.89. Default confidence floor 0.5. Self-refine log uses a scripted chat model (-125 C, then 15 C) because that demo also needs an Anthropic key. The blog says the judge and Jev in that log are real. Guardrail defaults: jailbreak, physical_harm, and illegal BLOCK; self_harm SUPPORT. Hazard above 0.70 applies the action, 0.35 to 0.70 is REVIEW, below 0.35 passes. Severity above 2.0 promotes a review to a block. Jev does not stream. A bare number or boolean state gets a 422. Reranking a top-20 list is twenty calls. Choice always returns a winner, so JevToolIndex asks a separate Noul for whether any tool applies. We did not build the project or call the API. TypeSafe's Master Customer Agreement section 2.3(f) forbids publishing benchmarks of the Services. The figures are reported as published.
Compare
LangChain's judge eval is 500 of 500 does_pass labels on five frozen traces. Tzolov's judge log is one weather answer, with the chat model scripted and Jev live. DocJev classifies and splits page text. jev-gateway picks a tool on the agent's port. This client can refuse a request before the chat model is called, and it can send a failed criterion back for another try. The 275 ms and 310 ms figures are one laptop. The 111 ms cookbook row is TypeSafe's.
Terms
- JevJudge
- A Spring AI TypeSafe builder. Each criterion is a Noul or a Score plus the threshold it must clear. Confidence under the default floor of 0.5 is reported as INCONCLUSIVE rather than FAILED.
- input battery
- The JevGuardrailAdvisor check on the user's request. A block returns before the chat model is called. The output battery checks the model's answer and does not retry.