mcpField
J
Jev-Style

Jev-Style

本地服务
jevstyle.comAI 与智能体22今天更新

关于 Jev-Style

Jev-Style 提供可在本机运行的小型决策模型及配套 Agent 工具,适合需要本地分类、选择或评分的开发者。模型可返回校准概率;2B v4 还支持图像输入。

主要功能

  1. 01是非、选项与等级评分
  2. 02为各选项返回校准概率
  3. 03支持长文本输入
  4. 042B v4 支持图像
  5. 05本地 API、技能与评估工具

适用场景

  1. 01对客服文本分类并路由
  2. 02按置信度将决策交由人工复核
  3. 03在工具执行前检查 Agent 操作

MCP 相关

包含 MCP 服务,向 Claude Code、Cursor、Codex 等客户端提供 `decide`、`noul`、`choice` 和 `score` 工具。

配置

本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。

mcp.json · 通用配置
{
"mcpServers": {
"lawrence3699-jev-style": {
"command": "uvx",
"args": [
"jev-style"
],
"env": {
"JEV_STYLE_URL": "<JEV_STYLE_URL>"
}
}
}
}
启动命令uvx jev-style
需要配置的环境变量
JEV_STYLE_URLURL of a running `jev-style serve` (start it with `pip install "jev-style[torch]"` or `[mlx]` on Apple silicon, then `jev-style serve`).

本地服务需要在你的电脑上安装运行环境(如 Node.js 18+)。各客户端的配置文件位置不同,请参考客户端文档。

安装包
pypijev-style0.6.2

工具

5

收录的工具列表 · 更新于 今天

参数类型必填说明
stateany是
questionsobject是

详细介绍

Jev-Style

可在本机运行的小型校准决策模型,以及让 AI Agent 使用这些模型的工具。

PyPI CI 权重:0.8B · 2B · torch · MLX · GGUF Hugging Face Spaces 上的 2B v4 演示 Agent 技能:6 许可证:Apache-2.0

Jev-Style-2B-Decision-v4:在 Decision Index 0.3 公共指数上得分 44.37(一次完整的自行运行,高于榜单上 2B v3 的 34.05),在公共 Vision 指数上得分 57.55;每次调用最多 32,768 个 token,包含图像 token。

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 密钥或训练。

Playground 回答支持工单请求,随后 Agent 审批演示允许、询问并拒绝工具调用

亮点

  • 一次请求支持三种问题类型。 是/否(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-v368.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 v42B v30.8B使用方式
safetensors:2B v4、2B v3、0.8B4.43 GB3.76 GB1.50 GB--backend torch(CUDA、Apple MPS、CPU);2B v4 可在此读取图像
MLX bf16 / 8-bit:2B v4、2B v3、0.8B3.76 / 2.00 GB3.76 / 2.00 GB1.50 / 0.80 GB--backend mlx(Apple 芯片;此时 auto 会选择它)
GGUF F16 / Q8_0 / Q4_K_M:2B v4、2B v3、0.8B3.78 / 2.01 / 1.27 GB3.78 / 2.01 / 1.27 GB1.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):

typecriteriaAnswer
noul可选的 {"true": "...", "false": "..."}noul = P(true)
choice{option: description or null},1 到 255 个选项choice、probabilities、confidence
score2 到 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 模型与一个第三方模型组成的级联:

  1. Jev-Style-2B-Decision-v3 在进程内运行(PyTorch、float32,并使用 CUDA graphs),回答每个问题;
  2. 置信度低于阈值 τ 的问题会交由 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 siliconjev-style serve(MLX bf16;添加 --precision 8bit 可将大小降至 0.8 GB,添加 --release 2b --precision 8bit 可将 2B 模型大小降至 2.0 GB)
NVIDIA GPUjev-style serve --backend torch(使用 CUDA 图)
仅 CPUjev-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 v386.2 → 13.9 ms00.0024
0.8B41.6 → 11.3 ms00.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 作者均无关联。

评论

支持 Markdown

第一次接触 MCP?

从协议是什么,到在客户端里装上第一个服务,这几条回答覆盖了大多数入门问题。

一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。