关于 Jev-Style
Jev-Style 提供可在本机运行的小型决策模型及配套 Agent 工具,适合需要本地分类、选择或评分的开发者。模型可返回校准概率;2B v4 还支持图像输入。
主要功能
- 01是非、选项与等级评分
- 02为各选项返回校准概率
- 03支持长文本输入
- 042B v4 支持图像
- 05本地 API、技能与评估工具
适用场景
- 01对客服文本分类并路由
- 02按置信度将决策交由人工复核
- 03在工具执行前检查 Agent 操作
MCP 相关
包含 MCP 服务,向 Claude Code、Cursor、Codex 等客户端提供 `decide`、`noul`、`choice` 和 `score` 工具。
配置
本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。
工具
5收录的工具列表 · 更新于 今天
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| state | any | 是 | |
| questions | object | 是 |
详细介绍
Jev-Style
可在本机运行的小型校准决策模型,以及让 AI Agent 使用这些模型的工具。
0.6.0 新增:Jev-Style-2B-Decision-v4,首个能够读取图像的 Jev-Style 模型。 在 Decision Index 0.3 公共套件上得分为 44.37,高于榜单上 2B v3 的 34.05;在公共 Vision 套件(12,210 条)上得分为 57.55;在 231 个公开 JevBench v1.4.1 项目上得分为 74.9 %(v3:73.6 %)。这三项成绩均来自使用官方工具自行运行一次,并非官方榜单成绩。每次调用可处理 32,768 个 token(v3:25,600),并能读取作为 assets 发送的照片、屏幕截图、收据和图表,方式与 TypeSafe 的 API 接收这些内容的方式相同。现在 --release 2b 会加载该模型(--release 2b-v3 仍会加载 v3)。训练时部分使用了通过 TypeSafe Jev 1.14 公共 API 蒸馏的软标签。在浏览器中试用。
**0.4.0 新增:**为 NVIDIA GPU 上的 PyTorch 后端提供 CUDA 图:在 RTX 5090 上,2B v3 的中位延迟从 86.2 ms 降至 13.9 ms,0.8B 的中位延迟从 41.6 ms 降至 11.3 ms;在 4,992 道校准问题上,top-1 答案均未改变。此外还新增了级联:只有当小模型对问题不确定时,才将问题交给更大的模型处理;其中包括名为 cascade-9b 的级联方案,即先使用我们的 2B,再使用第三方模型 JevK5-9B。
Jev-Style 是一系列基于 Qwen3.5 构建的小型决策模型。目前的版本包括 Jev-Style-2B-Decision-v4(可读取图像;4-bit 版本为 1.27 GB,仅支持文本)、Jev-Style-2B-Decision-v3(4-bit 版本为 1.27 GB)和 Jev-Style-0.8B-Decision-v3(4-bit 版本为 0.53 GB,默认版本)。每个构建版本和演示都收录在 v4 集合和 v3 集合中。向模型提供文本或 JSON(使用 2B v4 时还可提供图像)以及一些带类型的问题,它就会在一次前向传递中为每个选项返回校准后的概率。服务的 API 遵循公开的 systemone 请求格式,因此,为兼容 Jev 的服务编写的客户端可以调用你笔记本电脑上的模型。
本仓库提供了让模型在日常使用中发挥作用的部分:
jev-style serve:提供带有 Playground 和演示的本地 API。在 Apple 芯片上使用 MLX,在 CUDA 或 CPU 上使用 PyTorch;llama.cpp 为可选项。- 六项 Agent 技能:使用一条
npx skills add命令即可安装。它们可以运行模型、调用模型、使用你自己的标签评估模型、替换仅返回标签的大模型调用、为 Claude Code 添加防护机制,以及添加 MCP 工具。 - Claude Code 防护机制:一个
PreToolUse钩子,由本地模型在每次工具调用运行前进行检查,并作出允许、询问或拒绝的决定。 - MCP 服务:为 Claude Code、Cursor、Codex 以及其他任何 MCP 客户端提供
decide、noul、choice和score工具。 jev-style eval:使用你自己的带标签数据衡量准确率和校准情况,并报告在错误预算为 1%、5% 或 10% 时可以自动化处理的决策数量。
无需 GPU、API 密钥或训练。

亮点
- 一次请求支持三种问题类型。 是/否(
noul)、多项选择(choice,最多 255 个选项)和有序评分(score,2 至 10 个等级)。模型只需读取一次文本,就能回答关于它的所有问题。 - 返回概率,而不只是标签。 每个版本都附带基于留出数据拟合的温度值,因此你的代码可以直接处理置信度高的答案,并将其余答案交给人工或大模型处理。
- 支持长输入。 使用 2B v4 时,每次调用最多支持 32,768 个 token(v3 为 25,600 个)。不会截断内容:如果输入过长,系统会拒绝处理并返回相应错误。
- 支持图像(2B v4)。 支持照片、屏幕截图、收据、图表和扫描表单中的状态信息,并按照 TypeSafe API 接收数据的方式将其作为
assets发送。PyTorch 构建版本可读取图像;MLX 和 GGUF 构建版本仅支持文本。 - 本地运行。 在 M1 Max 上使用 MLX 调用 0.8B 处理简短请求,首次调用后耗时约为 0.15 至 0.2 秒。数据不会离开你的设备。
- 已评估 51 种语言。 训练覆盖 19 种语言。在 MASSIVE 意图数据集上,0.8B 在全部 51 种受评估语言中的表现都优于 Laya 的多语言检查点。
- 专为 Agent 打造。 技能、MCP 工具和防护机制均可与 Claude Code、Codex、Cursor 及其他 Agent 配合使用。
模型
发布版本(--release) | 参数量 · 最小构建 | JevBench v1.4.1 公开集(231) | tweet_topic,零样本(1,693) | 上下文 |
|---|---|---|---|---|
Jev-Style-2B-Decision-v4(2b) | 2.2B · 1.27 GB(Q4_K_M,文本) | 74.9 % | 未运行 | 32,768 tokens,图像 |
Jev-Style-2B-Decision-v3(2b-v3) | 1.9B · 1.27 GB(Q4_K_M) | 73.6 % | 82.2 % | 25,600 tokens |
Jev-Style-0.8B-Decision-v3(0.8b,默认) | 0.8B · 0.53 GB(Q4_K_M) | 64.1 % | 75.5 % | 25,600 tokens |
| 托管版 Jev 1.13,供参考 | – | 86.6 % | 79.3 % | – |
2B v4 的 JevBench 分数来自一次自行运行:通过此软件包的服务使用官方测试框架(float32,Apple MPS;95 % CI 为 68.9 至 80.0 %),并非官方排行榜成绩。在 Decision Index 0.3 公开套件中,2B v4 得分为 44.37(使用工具包自带的运行器和评分器完整自行运行一次,共 140,178 个请求;排行榜上的 v3:34.05);在公开 Vision 套件(12,210 行)中得分为 57.55。排行榜的 Full 总分来自维护者的私有测试,因此这些分数不代表排行榜名次。多个基准测试的官方训练集包含在其训练数据中,因此这些结果并非零样本;其模型卡列出了所有测试协议,2B Space可在浏览器中运行该模型。
2B v3 的分数来自使用其 GGUF F16 构建版本预先声明的单次运行;其模型卡列出了测试协议和置信区间。在 JevBench 上,2B v3 在 v1.4.1 排行榜的 Qwen3.5-2B 系列系统中得分最高(decider-2b 为 71.0 %,open-jev-zefan-2b 为 64.5 %),但其领先 decider-2b 的幅度在 95 % 置信区间内;82 个上榜系统中有 42 个得分更高,而且托管版 Jev 领先很多。在 tweet_topic 上,2B 的准确率高于 Jev 已公布的分数,但其 macro-F1 较低(0.678 对 0.694)。2B 使用缩减后的数据池(60M tokens)进行训练,且问题与选项没有单独的长度限制;所有内容均计入 25,600 tokens。
0.8B 与 Laya 在双方均未训练过的数据集上的对比:
| 模型 | Banking77(77 个意图,从未训练过) | MASSIVE 意图,37 种留出语言 | tweet_topic,零样本 | JevBench v1.4.1 公开集(231) |
|---|---|---|---|---|
| Jev-Style-0.8B-Decision-v3 | 68.2 % | 65.5 % | 75.5 % | 64.1 % |
| 最佳官方 Laya 检查点(0.8B,默认 1,024 tokens) | 49.2 % | 36.1 % | 63.2 % | 58.4 % |
这些分数来自 0.8B 模型卡,其中列出了完整测试协议和置信区间。Laya 的数据是其官方检查点在相同行集上的重新运行结果,但 tweet_topic 和 JevBench 除外,这两项采用已公布的分数。在所有已公布准确率的数据集中,托管版 Jev API 的准确率均高于 0.8B。请将这两个版本视为小型本地选项,而非托管模型的替代品。
| 构建 | 2B v4 | 2B v3 | 0.8B | 使用方式 |
|---|---|---|---|---|
| safetensors:2B v4、2B v3、0.8B | 4.43 GB | 3.76 GB | 1.50 GB | --backend torch(CUDA、Apple MPS、CPU);2B v4 可在此读取图像 |
| MLX bf16 / 8-bit:2B v4、2B v3、0.8B | 3.76 / 2.00 GB | 3.76 / 2.00 GB | 1.50 / 0.80 GB | --backend mlx(Apple 芯片;此时 auto 会选择它) |
| GGUF F16 / Q8_0 / Q4_K_M:2B v4、2B v3、0.8B | 3.78 / 2.01 / 1.27 GB | 3.78 / 2.01 / 1.27 GB | 1.52 / 0.81 / 0.53 GB | --backend gguf(通过发行版的评分器使用 llama.cpp:两个 2B 使用 jev-score-v2,0.8B 使用 jev-score) |
每个构建都会在权重旁附带自己的运行时文件。服务会下载固定版本并使用该文件,因此这里的答案与模型卡中的说明一致。原版 llama.cpp、Ollama、LM Studio 或 mlx_lm.generate 可以加载权重,但无法生成决策分数。2B MLX 运行时需要准确使用 mlx-lm 0.31.3,jev-style[mlx] 会安装该版本。处理图像需要使用 2B v4 PyTorch 构建:其 MLX 和 GGUF 文件仅包含语言模型。对于 2B 长文档,请使用 Q8_0(默认值)或 F16,而不要使用 Q4_K_M。早期的 2B 版本可在不使用此服务的情况下用于 LM Studio 或 Ollama:v1 GGUF(LM Studio、llama.cpp)和 v2 GGUF(Ollama)。
快速开始
在浏览器中试用
2B Space 运行 Jev-Style-2B-Decision-v4(文本和图像),0.8B Space 运行 0.8B。无需安装任何内容。
在本地运行
你需要 Python 3.10 或更高版本。
pip install "jev-style[mlx]" # Apple silicon (MLX)
pip install "jev-style[torch]" # Linux, Windows or an Intel Mac (PyTorch on CUDA or CPU)
jev-style serve --release 2b # the 2B v4: downloads it once (2 to 4.4 GB, depending on the build), then serves http://127.0.0.1:8765
jev-style serve # the default release, the 0.8B (~1.5 GB)
在 NVIDIA GPU 上,jev-style serve --release 2b --backend torch --dtype bfloat16 会以其在 Decision Index 上测评时的方式运行 2B v4,并使用 CUDA 图。
--release 同样适用于 decide、download 和 mcp --model;JEV_STYLE_RELEASE=2b 可为所有命令和 Python 客户端设置该值。
若要单独安装命令行工具,请使用 uv:在 Apple 芯片上运行 uv tool install "jev-style[all]",在其他平台上运行 uv tool install "jev-style[torch]"。从 0.3.0 起,每种安装都包含 MCP 服务(jev-style[mcp] 仍然可用)。
打开 http://127.0.0.1:8765 使用 Playground 和演示:Agent 操作审批、Snake,以及中文和 51 种语言。在另一个终端中发送一张工单:
curl -s localhost:8765/v1/systemone -H 'content-type: application/json' -d '{
"state": "Shoes arrived two weeks late and in the wrong size. Also I see two charges on my card.",
"questions": {
"department": {"type": "choice", "instructions": "Which team should handle this?",
"criteria": {"returns": "Exchanges, refunds, wrong or damaged items",
"shipping": "Delivery status, delays, lost packages",
"billing": "Charges, invoices, payment problems"}},
"escalate": {"type": "noul", "instructions": "Does this need urgent human attention?"},
"frustration": {"type": "score", "instructions": "How frustrated is the customer?",
"criteria": ["Calm", "Frustrated", "Very angry"]}
}}'
这是在 Apple M1 Max 上使用 MLX 运行 0.8B(默认发行版)时的实际响应,概率已四舍五入:
{
"model": "jev-style-0.8b-decision-v3",
"answers": {
"department": { "type": "choice", "choice": "billing", "confidence": 0.46,
"probabilities": { "returns": 0.07, "shipping": 0.29, "billing": 0.64 } },
"escalate": { "type": "noul", "noul": 0.45 },
"frustration": { "type": "score", "score": 1.28, "confidence": 0.36,
"legend": { "0": "Calm", "1": "Frustrated", "2": "Very angry" },
"probabilities": { "0": 0.07, "1": 0.57, "2": 0.35 } }
},
"usage": { "input_tokens": 250, "state_tokens": 25, "output_tokens": 0 },
"latency_ms": 194.0,
"backend": "mlx"
}
这张工单既提出了账单问题,也反映了配送延迟,概率清楚地显示了这一点:账单 0.64,配送 0.29。这就是模型返回概率而非单个标签的原因。你的代码可以处理置信度高的答案,并将其余情况交给人工处理。
在 Python 中使用
对于脚本,只需一行。首次调用会在进程内加载模型(0.8B,或 JEV_STYLE_RELEASE 中指定的版本);如果设置了 JEV_STYLE_URL,则会使用该服务:
import jev_style
jev_style.classify("Where is my parcel? It was due Monday.", ["billing", "shipping", "tech"])
# {'label': 'shipping', 'confidence': ..., 'probabilities': {'billing': ..., 'shipping': ..., 'tech': ...}}
如果要针对同一段文本提出多个问题,并自行选择引擎:
from jev_style import JevStyle, choice, noul, score
js = JevStyle.from_pretrained("chaoliangUNSW/Jev-Style-2B-Decision-v4-MLX") # the 2B v4 in-process; the repo picks the backend
# js = JevStyle.from_pretrained("chaoliangUNSW/Jev-Style-0.8B-Decision-v3-MLX") # the 0.8B
# js = JevStyle(release="2b") # the 2B v4, backend chosen for this machine
# js = JevStyle() # the default release (0.8B)
# js = JevStyle(base_url="http://127.0.0.1:8765") # or a running server
out = js.decide("I was charged twice. Please fix this ASAP.", {
"billing": noul("This ticket is about billing."),
"tone": choice("What is the customer's tone?", ["calm", "frustrated", "angry"]),
"urgency": score("How urgent is this ticket?", ["can wait", "this week", "today"]),
})
print(out["answers"]["billing"]["noul"], out["answers"]["tone"]["choice"])
from_pretrained 接受主仓库(PyTorch)、-MLX(对于 2.00 GB 的 2B 或 0.80 GB 的 0.8B 权重,使用 precision="8bit")或 -GGUF(使用 quant="Q4_K_M",需要对应版本的评分器:2B 使用 jev-score-v2,0.8B 使用 jev-score;参见后端)。
图像通过引用放入状态中,图像文件本身则放在 assets 下(2B v4,PyTorch 构建):
from jev_style import JevStyle, image, noul
js = JevStyle.from_pretrained("chaoliangUNSW/Jev-Style-2B-Decision-v4") # PyTorch: text and images
out = js.decide({"receipt": "r1", "policy": "Meals over 50 EUR need a manager approval."},
{"approval": noul("Does this receipt need a manager approval?")},
assets={"r1": image("receipt.png")}) # PNG or JPEG, 280 to 1,568 px per side
print(out["answers"]["approval"]["noul"])
``` The client is not tied to this model: `JevStyle(base_url=...)` works with any server that implements `POST /v1/systemone`, and a client written for another systemone-compatible server can call `http://127.0.0.1:8765` with any API key string.
### From the shell
```bash
jev-style decide "Refund still missing after 3 weeks" --url http://127.0.0.1:8765 \
--choice "Which team?::billing,shipping,returns" --noul "The customer is angry"
# without --url (or JEV_STYLE_URL) it loads its own copy of the model (add --release 2b for the 2B v4)
Agent 技能
这些技能位于 skills/。每项技能都会指导编码 Agent 从头到尾完成一项工作,并在结尾检查工作是否成功。
npx skills add lawrence3699/jev-style # pick skills interactively
npx skills add lawrence3699/jev-style --skill '*' -y # all six
| 技能 | Agent 可以用它做什么 |
|---|---|
jev-style-serve | 安装 CLI,为你的机器选择后端,启动服务,通过实际请求进行检查,还可以选择在登录时启动。 |
jev-style | 编写调用模型的代码:请求格式、读取概率、使用阈值和限制将概率转化为操作。 |
jev-style-eval | 根据你的数据生成带标签的 JSONL,并运行 jev-style eval。它会报告准确率、Brier 分数、ECE、在 1、5 或 10 % 的错误预算下可自动化的比例,以及重新拟合后的温度。 |
jev-style-adopt | 扫描代码中只返回标签、是/否或评分的大模型调用,并将其改写为类型化问题。低于置信度阈值时,大模型仍会作为后备方案。它会先以影子模式运行并测量一致率,然后再切换。 |
jev-style-guard | 安装 Claude Code 防护钩子。它建议先进行试运行,然后展示如何调整阈值并在带标签的调用上测量效果。 |
jev-style-mcp | 将 MCP 工具注册到 Claude Code、Codex、Cursor、Claude Desktop 或 Windsurf,并检查工具调用是否有效。 |
在 Claude Code 中,你还可以将所有内容作为插件安装:
/plugin marketplace add lawrence3699/jev-style
/plugin install jev-style@jev-style # the six skills + MCP tools
/plugin install jev-style-guard@jev-style # the PreToolUse guard
Claude Code 防护
Claude Code 运行 Bash、Write、Edit、Read、WebFetch 或 MCP 调用前,jev-style guard 会将该调用发送给本地模型。模型会判断调用是否具有破坏性、会外传数据、会触及机密或会越出项目范围,并给出 0 到 4 的风险评分。它会将答案转化为允许/询问/拒绝。代码中的正则硬规则只能让判定更加严格。如果服务未运行、超时或拒绝请求,判定结果就是询问,绝不会悄无声息地允许调用。
jev-style guard --check "git push --force origin main"
# decision: DENY (source: rule, 443 ms) destructive 0.79 ...
jev-style guard-replay --url http://127.0.0.1:8765 # the 49 bundled labelled tool calls
在 49 个附带的工具调用上(这些调用由人工编写并标注),默认配置与标签的一致率为 77.6 %。没有任何标注为拒绝的调用被允许。 标注为询问的 16 个调用中,有 2 个被允许。模型单独运行、不使用硬规则时,一致率为 61.2 %。请将它用作第二道防线,而不是沙箱。技能介绍了安装、试运行和调整方法。
MCP 服务
claude mcp add jev-style --scope user -- jev-style mcp # Claude Code
jev-style mcp 是一个精简的 stdio 服务,会转发请求到正在运行的 jev-style serve,因此所有客户端共用同一份模型。它也已列入官方 MCP Registry,名称为 io.github.lawrence3699/jev-style(通过 uvx jev-style mcp 运行;如果你的服务不在 http://127.0.0.1:8765,请设置 JEV_STYLE_URL)。它提供 decide(针对一个输入提出多个问题)、noul、choice、score 和 model_info。Codex、Cursor 和 Claude Desktop 的配置方法见技能。
使用自己的数据进行评估
最有力的证据来自你自己标注的示例。jev-style eval 接受采用请求格式的 JSONL 文件,每个问题都带有一个 label:
jev-style eval examples/support_tickets.jsonl --url http://127.0.0.1:8765
question n acc brier ece automate @1% / 5% / 10% error
team 30 93.3% 0.077 0.123 90.0% (p>=0.65) / 93.3% (p>=0.57) / 100.0% (p>=0.44)
escalate 30 96.7% 0.107 0.125 80.0% (p>=0.71) / 100.0% (p>=0.54) / 100.0% (p>=0.54)
mood 30 73.3% 0.433 0.174 40.0% (p>=0.56) / 40.0% (p>=0.56) / 46.7% (p>=0.54)
这 30 个示例工单是为本仓库手动编写的。它们用于展示格式,并非基准测试。可以这样理解 automate @5%: 93.3% (p>=0.57):只有当最高概率至少为 0.57 时才采取行动,那么模型可处理 93.3% 的工单,其中错误率不超过 5%,其余工单则交由人工或大模型处理。报告还会用一半数据重新拟合温度,并展示其对另一半数据的影响。有关如何构建合适的评估集,请参阅技能。
比较引擎
重复指定 --server,即可使用同一文件测试多个引擎:此软件包的本地模型、其他构建或量化版本,或任何实现了 POST /v1/systemone 的其他服务。第一个引擎作为参考。
jev-style eval examples/support_tickets.jsonl --server bf16=local:mlx --server q8=http://127.0.0.1:8799
90 questions answered by every engine; the table and the differences use only those.
engine answered failed rows acc brier log loss ece automate @5% error
bf16 90 0 87.8% 0.206 0.369 0.125 80.0% (p>=0.54)
q8 90 0 87.8% 0.206 0.370 0.117 78.9% (p>=0.54)
difference to bf16 (95 % paired bootstrap over rows; brier: lower is better):
q8 accuracy +0.0 pts [+0.0, +0.0] brier +0.001 [-0.001, +0.002]
该运行会比较进程内运行的 MLX bf16 权重与 Apple M1 Max 上通过 jev-style serve --precision 8bit 运行的模型。引擎规格可以是 NAME=URL、NAME=local[:backend]、NAME=hf:<repo id>、NAME=jevk5:<repo id or folder>、NAME=cascade:<name or file> 或 NAME=fake;--key NAME=ENV_VAR 会从环境变量发送 bearer token,--model NAME=MODEL 会设置请求的 model 字段。所有引擎都使用相同的问题进行评分:如果某个引擎拒绝一行数据(过长、选项过多),则所有引擎都会舍弃该行,并将其计入 failed rows。--json PATH 会写入每个答案。
API
POST /v1/systemone,请求体为 {"state": text | object | array, "questions": {id: question}},图片还需提供 "assets"(2B v4):
type | criteria | Answer |
|---|---|---|
noul | 可选的 {"true": "...", "false": "..."} | noul = P(true) |
choice | {option: description or null},1 到 255 个选项 | choice、probabilities、confidence |
score | 2 到 10 个等级,按从低到高排列:"label" 或 {"label", "description"} | score = 期望等级索引、legend、probabilities、confidence |
对于 k 个选项,选择题的 confidence = (k · p_max − 1) / (k − 1):概率均匀分布时为 0,某个选项占据全部概率时为 1。评分题的 confidence 使用 TypeSafe 的序数公式,该公式还会计算概率与最可能等级 m 相距多远:max(0, 1 − Σ pᵢ·|i − m| / MAD_unif),其中 MAD_unif 是概率均匀分布时的相同平均距离。Noul 答案不带置信度。图片遵循 TypeSafe 的 API:state 中的字符串值指向 assets 中的一项({"type": "image", "format": "png" | "jpg", "data_base64": ...},或 multipart 文件部分),请求需携带 TypeSafe-Danger-Zone-Images: true,且每张图片都必须是每边为 280 到 1,568 px 的静态 PNG 或 JPEG;仅能读取文本的模型会返回 400 images_not_supported。请求体可使用 Content-Encoding: gzip、x-gzip 或 zstd 压缩(官方 SDK 默认启用压缩),请求规则与 TypeSafe 的 API 相同。其他路由包括 GET /v1/models、GET /healthz,以及位于 / 的 Playground。错误格式为 {"error": {"code", "message", "question"?}},并使用 HTTP 400(max_tokens_exceeded、请求规则)、413、415、422(invalid_json、invalid_request、invalid_question)、401(unauthorized)、404 或 500。使用 --api-key-env NAME 启动服务,以要求提供 Authorization: Bearer <key>。完整参考文档见 skills/jev-style/reference.md。
级联
级联会使用置信度足够高的最小模型回答每个问题,只将其余问题交给更大的模型。第 1 层通过一次调用回答所有问题;对于置信度 (k · p_max − 1) / (k − 1)(noul 为 |2 · P(true) − 1|)低于该层阈值的问题,以及该层未能回答的问题,会在一次调用中连同相同的 state 一起发送给下一层。最顶层的答案为最终答案;若其失败,则使用最后一个成功的答案;只有所有层都失败时才会返回错误。答案保留常规架构,并新增 tier 和 tier_model;timing.tiers 会报告每层的调用情况,GET /v1/models 会报告级联的 id、各层及其阈值。
--cascade(用于 serve、decide 和 download)、JevStyle(cascade=...) 以及 eval 引擎 NAME=cascade:... 可接受随包提供的级联名称或级联文件。jev-style releases 会列出具名级联及其阈值、各层和固定版本。
cascade-9b
cascade-9b(模型 ID 为 jev-style-cascade-9b)是由我们的 2B 模型与一个第三方模型组成的级联:
- Jev-Style-2B-Decision-v3 在进程内运行(PyTorch、float32,并使用 CUDA graphs),回答每个问题;
- 置信度低于阈值 τ 的问题会交由 JevK5-9B v0.3.3 处理。该模型由 alibiserikbay 发布,采用 Apache-2.0 许可证,通过其专用运行时 allebee/jevk5 在同一进程中运行,并固定在特定修订版本。它运行的代码与
jevk5-serve相同,因此给出的答案也与jevk5-serve后面的 JevK5-9B 相同。
τ = 0.75,所有问题类型均使用此值。该值基于一个包含 4,992 个问题的校准集(sha256 580962e4b2bc86b32b42731eda42536f57321c7d1ca9ac1e3b970bf7dbd7e2d2)确定,并在获得任何结果之前写下规则:选择预期延迟最低、且校准准确率与单独使用 JevK5-9B 相差不超过 1.0 个百分点的阈值。详情、校准来源及全部数据见:chaoliangUNSW/Jev-Style-Cascade-9B。
| cascade-9b | |
|---|---|
| JevBench 公开题目(我们的运行结果,共 231 题) | 87.9 %(203 / 231;单独使用 JevK5-9B 为 203 题,单独使用 2B 为 170 题) |
| 由 2B 回答的问题 | 占 JevBench 题目的 53 %,占校准集的 43 % |
| 校准集准确率 | 73.1 %(单独使用 JevK5-9B 为 74.1 %,单独使用 2B 为 66.2 %) |
| 每个请求的中位延迟(RTX 5090) | JevBench 题目为 29 ms,校准集为 38 ms |
我们不声称 cascade-9b 比单独使用 JevK5-9B 更准确;级联改变的是实际交由 9B 处理的问题数量。JevK5-9B 的模型卡说明,其训练标签有一部分来自 OpenAI 的 GPT-6 Luna,且这些标签是在 OpenAI 的条款下生成的;请确认这些条款适合你的用途。
它需要一块有足够显存同时容纳两个模型的 NVIDIA GPU:在 RTX 5090(32 GB)上,启动后占用 29.7 GB,服务期间最高占用 31.8 GB,并设置了 PYTORCH_CUDA_ALLOC_CONF=expandable_segments:True。它还需要 PyTorch 和 jevk5 包,该包未发布到 PyPI:
pip install "jev-style[torch]" "jevk5[fast] @ git+https://github.com/allebee/[email protected]"
jev-style download --cascade cascade-9b # both tiers; the JevK5-9B snapshot is checked against its SHA256SUMS
jev-style serve --cascade cascade-9b --backend torch --device cuda
若没有模型的 jevk5_config.json(其中包含校准温度),JevK5 层会拒绝加载,因为否则 JevK5 将在未经校准的情况下运行。在 Python 中,同一级联可通过 JevStyle(cascade="cascade-9b") 使用。
创建自己的级联
级联文件会按顺序列出各层(从最小的开始),并为除顶层外的每一层指定一个阈值。例如,2B 在进程内运行,而 JevK5-9B 由专用的 jevk5-serve 提供服务:
jevk5-serve --model alibiserikbay/JevK5-9B --port 8090 # on the GPU box (see allebee/jevk5)
jev-style serve --cascade examples/cascade/glue-2.json --backend torch --device cuda
层的目标可以是 local[:release][:backend]、hf:<repo id>、jevk5:<repo id or folder>(JevK5 在进程内运行,如 cascade-9b;需要 jevk5 包)、http(s)://...(用于 jevk5-serve 时设置 "protocol": "jevk5"),或 fake;"max_options" 可避免将选项过多的问题交给某一层处理;"verify" 用于检查某一层的文件(JevK5 层的 SHA256SUMS 默认会检查,固定版本的 JevK5-9B 也如此)。同一个文件可用于 JevStyle(cascade="glue-2.json")、jev-style decide --cascade 和 jev-style eval --server glue=cascade:glue-2.json。examples/cascade/ 中的阈值只是占位值,并非经校准的数值。jev_style.cascade.select() 可使用相同规则,离线回放按层记录的答案。
后端
| 设备 | 命令 |
|---|---|
| Apple silicon | jev-style serve(MLX bf16;添加 --precision 8bit 可将大小降至 0.8 GB,添加 --release 2b --precision 8bit 可将 2B 模型大小降至 2.0 GB) |
| NVIDIA GPU | jev-style serve --backend torch(使用 CUDA 图) |
| 仅 CPU | jev-style serve --backend torch --device cpu |
| llama.cpp | 在其 GGUF 仓库中运行 sh build_jev_score.sh /path/to/llama.cpp,为该版本构建一次 scorer(0.8B 使用 jev-score,2B 使用 jev-score-v2),然后运行 jev-style serve --backend gguf --scorer /absolute/path/printed/by/the/script --quant Q4_K_M(2B 需添加 --release 2b) |
| 离线 | jev-style serve --model-dir /path/to/a/downloaded/model/repo |
| 无模型(用于 UI 或管道工作) | jev-style serve --fake(答案固定但无意义) |
CUDA 图
在 NVIDIA GPU 上,PyTorch 后端启动时会记录 CUDA 图并在之后重放,而不是逐个启动一次调用中的每个内核。使用 --cuda-graphs auto 时,v3 版本只要在 CUDA 上运行就会使用 CUDA 图;2B v4 运行时则会自行决定:使用 --dtype bfloat16 时开启,使用 float32 时关闭,因为此时前向计算受计算能力限制,CUDA 图收益不大。--cuda-graphs on|off、JEV_STYLE_CUDA_GRAPHS=1|0 或 JevStyle(..., cuda_graphs=True|False) 可以覆盖该设置。它仅适用于在 CUDA 上运行的 PyTorch 后端。
2B v4 在 A100 80GB 上以 bfloat16 运行,针对 750 个 Decision Index 0.3 公开请求逐个处理:使用 CUDA 图时中位数为 16.4 ms,不使用时为 71.5 ms(其模型卡介绍了测试协议和一致性检查)。首次记录约需一分钟。
v3 版本在 RTX 5090 上以 float32 运行,使用 4,992 个校准问题进行测量,并与同一运行时在不使用 CUDA 图时进行对比:
| 版本 | 中位延迟 | Top-1 答案变化数量 | 最大概率差异 |
|---|---|---|---|
| 2B v3 | 86.2 → 13.9 ms | 0 | 0.0024 |
| 0.8B | 41.6 → 11.3 ms | 0 | 0.00086 |
对于 v3 版本,记录 CUDA 图会使启动时间增加约 7 到 11 s。长度超过 4,096 个 token 的输入,以及共享状态较长时的多个问题,会使用常规路径。CUDA 图位于 PyTorch 构建版本的运行时文件中,使用的是此版本固定的修订版本;对于较旧的运行时,auto 会像之前一样加载该文件,而 --cuda-graphs on 会被拒绝。
仓库结构
jev_style/ server, client, CLI, guard, MCP server, eval; web/ = Playground + demos
skills/ six agent skills (npx skills add lawrence3699/jev-style)
plugins/ Claude Code guard plugin (the root .claude-plugin/ is the marketplace)
examples/ labelled example data for jev-style eval; cascade/ = example cascade files
scripts/ cascade_smoke.py: a two-tier cascade on fake engines, prints one routed response
space/ source of the Hugging Face Space
tests/ pytest suite, runs on the fake engine (no model download)
开发
git clone https://github.com/lawrence3699/jev-style && cd jev-style
uv venv && uv pip install -e ".[dev]"
uv run pytest -q # fake engine: no weights, no GPU
uv run jev-style serve --fake # UI work without the model
致谢与许可证
代码:Apache-2.0(LICENSE)。模型权重是基于 Qwen3.5-2B 和 Qwen3.5-0.8B 微调而成,许可证均为 Apache-2.0;每个模型仓库中的 NOTICE 文件列出了所做的更改。类型化问题约定遵循 Laya。
cascade-9b 和 jevk5: 层级使用 alibiserikbay 提供的 JevK5-9B 及其运行时 allebee/jevk5,二者均采用 Apache-2.0 许可证。它们均未包含在此软件包中:运行时需单独安装,模型权重则从其各自的仓库下载。根据其模型卡,JevK5-9B 的部分训练标签来自 OpenAI 的 GPT-6 Luna,并受 OpenAI 条款约束。
与 TypeSafe 或 Jev 无隶属、背书或关联关系。“Jev-Style”描述的是模型类型:一种风格类似的小型类型化决策模型。此软件包不包含任何 Jev 模型权重、代码或输出。Jev-Style-2B-Decision-v4 的部分训练使用了通过 TypeSafe Jev 1.14 公开 API 蒸馏得到的软标签(详见其模型卡)。与 Alibaba Cloud 或 Qwen 团队、Laya 作者或 JevK5 作者均无关联。
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。
