Practical local AI

Local AI routing tools: JevStyle, Semantic Router and classifier alternatives

Choose a local classifier, embedding router or decision model by the decision your application needs to make.

Source review: · Project documentation · Examples follow jev-style 0.6.2

Which local routing tool fits your workflow?

Evaluate JevStyle when a local Python workflow needs probabilities over described, predefined routes without training a new classifier just to run it. Start with its text-only 0.8B model on MLX for Apple silicon, or PyTorch on CPU/CUDA. Use Semantic Router when you want routing orchestration; its DecisionRouter can also use a local JevStyle server. Use scikit-learn or SetFit when you have labeled training examples. Use a generative runtime when you need a written answer as well as a route.

This is a comparison of interfaces and setup requirements, written by the JevStyle project. It is not an independent review or a head-to-head accuracy, latency or cost benchmark. No approach is the best choice for every workload.

JevStyle, Semantic Router, scikit-learn, SetFit and local LLMs

Choose the output and training workflow before the model size.
ToolWhat you configureWhat it returnsA useful fitBoundary to test
JevStyleInstructions and named choices; a local decision modelOption probabilities, yes/no probabilities or ordered ratingsInstruction-dependent classification, fixed-choice scoring and workflow routingOption wording, task accuracy, calibration and review coverage; requires its matching decision runtime
Semantic RouterRoutes and a routing method: for example a local encoder or DecisionRouterA proposed route and a method-specific scoreConnecting route definitions to an application; can compose with JevStyleA local encoder path and a decision-model path are different configurations; check every selected endpoint
scikit-learnLabeled texts, features such as TF–IDF and a fitted classifierA label; probabilities for estimators that expose themStable categories with representative labeled examples and a small CPU baselineTrain/test separation, rare labels, domain shift and probability calibration
SetFitA sentence-transformer model and labeled examples for fine-tuningText-classification predictionsTraining a classifier with a limited labeled datasetData representativeness and the chosen checkpoint; few-shot does not eliminate evaluation
MLX LM or llama.cpp with a compatible generative modelA prompt and, where supported, constrained outputGenerated text, possibly structured as a labelClassification together with extraction, explanation or a drafted responseOutput validation, semantic correctness and total latency; stock generation is not JevStyle option scoring

Primary references: Semantic Router, scikit-learn text features, SetFit, MLX LM, and llama.cpp. The JevStyle row follows its versioned project source.

Run a local decision before calling a larger model

These commands start a text-only server on your machine. Choose the installation for your hardware. The first start downloads weights; dependencies and models must already be available for offline use.

# Apple silicon
python -m pip install "jev-style[mlx]==0.6.2"
jev-style serve --release 0.8b --backend mlx

# CPU/CUDA alternative, in place of the commands above:
# python -m pip install "jev-style[torch]==0.6.2"
# jev-style serve --release 0.8b --backend torch

In a second terminal, request the route scores. This proposes a route; it does not execute the workflow.

jev-style decide "I was charged twice for one order"   --url http://127.0.0.1:8765   --choice "Which workflow?::billing,shipping,account,other"

For an application, validate the returned option set and numbers. Accept a route only under a rule evaluated on separate labeled data; send uncertain, out-of-scope and failed requests to review. If review calls a remote LLM, that fallback receives the data you send to it. The routing guide implements this boundary.

Use JevStyle inside Semantic Router

They are not necessarily competing choices: Semantic Router supplies the routing interface; JevStyle can supply the local decision scores. The repository includes a working integration for Semantic Router 1.1.1 with explicit routes and a review path. Use Python 3.10–3.13 for this pinned example.

git clone https://github.com/lawrence3699/jev-style.git
cd jev-style
git checkout fd88dfa
python -m pip install "semantic-router==1.1.1" "jev-style[mlx]==0.6.2"
# Keep a local jev-style server running in another terminal.
python examples/semantic_router_local.py "Where is my parcel?"

Use [torch] instead of [mlx] outside Apple silicon. Read the exact example: it queries the local server's model ID and supplies it to SystemOneDecisionModel and DecisionRouter. The default threshold is illustrative. It is not a validated 90% correctness guarantee.

What would justify selecting JevStyle?

Run each suitable method on the same held-out requests. Compare errors by route, the fraction accepted without fallback, observed error among accepted requests, and complete request latency. Record model revision, backend, precision and hardware. Include download/startup separately from warm inference, and include fallback time in the end-to-end measurement.

Published JevStyle evaluations give their own datasets and protocols; they do not demonstrate superiority over the tools in this table. Choose an acceptance threshold on your own data before dispatching actions.

Related: Python text classification · Replace label-only LLM calls · Backends and weight sizes.