mcpField
J
Jev-Style

Jev-Style

ローカル
jevstyle.comAI・エージェント22今日更新

Jev-Style について

Jev-Style は、ローカルで動作する小型の判断モデルと、エージェント向けの活用ツールを提供します。分類、選択、評価を確率付きで扱え、2B v4 は画像入力にも対応します。

主な機能

  1. 01はい・いいえ、選択、段階評価
  2. 02選択肢ごとの校正済み確率
  3. 03長い入力への対応
  4. 042B v4 の画像入力
  5. 05ローカル API、スキル、評価ツール

活用シーン

  1. 01問い合わせ文の分類と振り分け
  2. 02不確かな判断を人の確認に回す
  3. 03ツール実行前にエージェントの操作を確認

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 エージェントで活用するためのツール群です。

PyPI CI 重み:0.8B · 2B · torch · MLX · GGUF Hugging Face Spaces の 2B v4 デモ エージェントスキル:6 ライセンス:Apache-2.0

Jev-Style-2B-Decision-v4:Decision Index 0.3 の公開インデックスで 44.37(ボード上の 2B v3 の 34.05 から上昇。完全な自己実行を 1 回実施)、公開 Vision インデックスで 57.55。1 回の呼び出しにつき 32,768 トークン(画像トークンを含む)。

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 を記録し、公開 JevBench v1.4.1 の 231 項目では 74.9 %(v3:73.6 %)を記録しました。いずれも公式ツールを使った単独の自己実行であり、公式ボードへの登録結果ではありません。1 回の呼び出しにつき 32,768 トークン(v3:25,600)を処理でき、TypeSafe の API と同じ方法で assets として送信された写真、スクリーンショット、レシート、グラフを読み取ります。--release 2b でこのモデルが読み込まれるようになりました(v3 は --release 2b-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 では画像も)と、型付きの質問を渡すと、1 回の順方向パスで各選択肢の較正済み確率を返します。サーバーの API は公開されている systemone のリクエスト形式に準拠しているため、Jev 互換サーバー向けに作成したクライアントから、代わりにお使いのノート PC を呼び出せます。

このリポジトリは、モデルを日々の作業で役立てるためのものです。

  • jev-style serve:Playground とデモを備えたローカル API です。Apple シリコンでは MLX、CUDA または CPU では PyTorch を使用します。llama.cpp は任意です。
  • 6 つのエージェントスキル:npx skills add でインストールできます。モデルの提供、モデルの呼び出し、独自のラベルでの評価、ラベルだけを返す LLM 呼び出しの置き換え、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 と、ツール呼び出しを許可、確認、拒否するエージェント承認デモ

主な特徴

  • 1 つのリクエストで 3 種類の質問に対応します。 はい/いいえ(noul)、複数選択(choice、最大 255 個の選択肢)、順序付き評価(score、2~10 段階)です。モデルはテキストを 1 回読み取り、それについてのすべての質問に回答します。
  • ラベルだけでなく確率も返します。 各リリースには、ホールドアウトデータで調整した温度が付属しています。そのため、確信度の高い回答にはコードで対応し、それ以外は人または LLM に送ることができます。
  • 長い入力に対応します。 2B v4 では呼び出しあたり最大 32,768 トークン、v3 では 25,600 トークンです。切り詰めは行いません。長すぎる入力は、その旨を示すエラーとともに拒否されます。
  • 画像に対応します(2B v4)。 写真、スクリーンショット、レシート、グラフ、スキャンしたフォームを、TypeSafe の API と同じ形式で assets として状態に渡します。PyTorch ビルドは画像を読み取りますが、MLX および GGUF ビルドはテキストのみを読み取ります。
  • ローカルで実行できます。 M1 Max で MLX を使用した場合、初回の呼び出し後は 0.8B への短いリクエストが約 0.15~0.2 秒で処理されます。データがマシンの外に出ることはありません。
  • 51 言語で評価済みです。 トレーニングは 19 言語に対応しています。MASSIVE のインテント分類では、評価した 51 言語すべてで 0.8B が Laya の多言語チェックポイントを上回ります。
  • エージェント向けに構築されています。 スキル、MCP ツール、ガードはすべて、Claude Code、Codex、Cursor、その他のエージェントで動作します。

モデル

リリース(--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 トークン、画像
Jev-Style-2B-Decision-v3 (2b-v3)1.9B · 1.27 GB(Q4_K_M)73.6 %82.2 %25,600 トークン
Jev-Style-0.8B-Decision-v3 (0.8b、デフォルト)0.8B · 0.53 GB(Q4_K_M)64.1 %75.5 %25,600 トークン
ホスト型 Jev 1.13(参考)–86.6 %79.3 %–

2B v4 の JevBench スコアは、このパッケージのサーバーを通じて公式ハーネスを使って実行した1回の自己測定値です(float32、Apple MPS、95 % 信頼区間 68.9~80.0 %)。公式ボードへの登録値ではありません。Decision Index 0.3 公開スイートでは、2B v4 は44.37を記録しています(キット独自のランナーとスコアラーによる完全な自己測定1回、140,178リクエスト。ボード上の v3 は34.05)。また、公開 Vision スイートでは57.55を記録しています(12,210行)。ボードの総合スコアはメンテナーによる非公開テストに基づくため、これらはボード上の順位ではありません。複数のベンチマークの公式トレーニング用データ分割が学習データに含まれているため、これらの結果はゼロショットではありません。モデルカードに各プロトコルが記載されており、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 の公表値を上回りますが、マクロ F1 は下回ります(0.678 対 0.694)。2B は縮小されたデータプール(60M トークン)で学習されており、質問と選択肢に別個の上限はありません。すべて合わせて25,600トークンに数えられます。

Laya と、どちらも学習に使用していないデータセットで比較した0.8B:

モデル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トークン)49.2 %36.1 %63.2 %58.4 %

これらの数値は0.8B モデルカードに掲載されており、完全なプロトコルと信頼区間も記載されています。Laya の数値は、tweet_topic と JevBench を除き、同じ行で公式チェックポイントを再実行した結果です。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 で長いドキュメントを扱う場合は、Q4_K_M ではなく Q8_0(デフォルト)または F16 を使用してください。このサーバーを使わずに LM Studio または Ollama で使用する、以前の2B世代: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 を実行すると、CUDA グラフを使って Decision Index で測定したときと同じ方法で 2B v4 を実行できます。

--release は decide、download、mcp --model でも同様に使えます。JEV_STYLE_RELEASE=2b を設定すると、すべてのコマンドと Python クライアントで適用されます。

コマンドラインツール単体をインストールするには、uv を使います。Apple シリコンでは uv tool install "jev-style[all]"、それ以外では uv tool install "jev-style[torch]" を実行してください。MCP サーバーは 0.3.0 以降、すべてのインストールに含まれています(jev-style[mcp] も引き続き使用できます)。

http://127.0.0.1:8765 を開くと、プレイグラウンドとデモ(エージェントのアクション承認、スネーク、中国語と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 から使う

スクリプトなら、1 行で十分です。最初の呼び出しではモデル(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': ...}}

1 つのテキストについて複数の質問をする場合や、エンジンを自分で選ぶ場合は、次のようにします。

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)

エージェントスキル

スキルは skills/ にあります。それぞれのスキルは、コーディングエージェントが 1 つの作業を最初から最後まで行う方法を説明し、作業が成功したことを確認する手順で締めくくられます。

npx skills add lawrence3699/jev-style                    # pick skills interactively
npx skills add lawrence3699/jev-style --skill '*' -y     # all six
スキルエージェントがこのスキルを使って行うこと
jev-style-serveCLI をインストールし、マシンに適したバックエンドを選び、サーバーを起動し、実際のリクエストで動作を確認します。また、オプションでログイン時に起動するよう設定できます。
jev-styleモデルを呼び出すコードを作成します。リクエスト形式、確率の読み取り方、しきい値や制限を使って確率をアクションに変換する方法を扱います。
jev-style-evalデータからラベル付き JSONL を作成し、jev-style eval を実行します。精度、Brier、ECE、誤り率の上限を 1、5、10 % とした場合に自動化できる範囲、および再適合した温度を報告します。
jev-style-adoptラベル、はい/いいえ、評価だけを返す LLM 呼び出しをコードから検出し、型付きの質問に書き換えます。LLM は信頼度のしきい値を下回った場合のフォールバックとして残ります。シャドーモードで実行して一致度を測定した後、切り替えます。
jev-style-guardClaude Code のガードフックをインストールします。まずドライランを行うことを推奨し、その後、しきい値の調整方法とラベル付き呼び出しでの測定方法を説明します。
jev-style-mcpMCP ツールを 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 までのリスクスコアを付けます。回答は allow / ask / deny に変換されます。コード内の正規表現によるハードルールで判定をより厳しくすることはできます。サーバーが停止している、タイムアウトする、またはリクエストを拒否した場合、判定は ask になり、黙って許可されることはありません。

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 % の割合で一致します。deny とラベル付けされた呼び出しが許可されることはありませんでした。 ask とラベル付けされた 16 件のうち、2 件は許可されました。ハードルールなしでモデルだけを使った場合、一致率は 61.2 % です。これは第二の防御線として使い、サンドボックスとしては使わないでください。スキルでは、インストール、ドライラン、調整について説明しています。

MCP サーバー

claude mcp add jev-style --scope user -- jev-style mcp       # Claude Code

jev-style mcp は、実行中の jev-style serve にリクエストを転送する薄い stdio サーバーです。そのため、モデルのコピー 1 つですべてのクライアントに対応できます。また、公式 MCP Registry に io.github.lawrence3699/jev-style として登録されています(uvx jev-style mcp で実行できます。サーバーが http://127.0.0.1:8765 で稼働していない場合は、JEV_STYLE_URL を設定してください)。decide(1 つの入力について複数の質問に回答)、noul、choice、score、model_info を提供します。Codex、Cursor、Claude Desktop のセットアップ手順はスキルにあります。

独自のデータで評価する

最も確かな根拠は、ご自身でラベル付けした例です。jev-style eval は、各質問に label を含む、リクエスト形式の JSONL を受け取ります。

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 % です。それ以外は担当者または LLM に回されます。また、レポートではデータの半分を使って温度を再適合し、残り半分への影響を示します。適切な評価セットの作成方法については、スキルをご覧ください。

エンジンを比較する

--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]

この実行では、Apple M1 Max 上で、プロセス内の MLX bf16 重みと 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 は、環境変数からベアラートークンを送信し、--model NAME=MODEL はリクエストの model フィールドを設定します。すべてのエンジンは同じ質問で評価されます。あるエンジンが行を拒否した場合(長すぎる、選択肢が多すぎるなど)、その行はすべてのエンジンから除外され、failed rows に計上されます。--json PATH はすべての回答を書き出します。

API

POST /v1/systemone に {"state": text | object | array, "questions": {id: question}} を送信します。画像の場合は "assets" も指定します(2B v4)。

typecriteria回答
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 個の場合、choice の confidence は (k · p_max − 1) / (k − 1) です。確率が均等な場合は0、1つの選択肢がすべての確率を占める場合は1になります。score の confidence には TypeSafe の順序尺度用の計算式が使われます。この計算式では、確率が最も可能性の高い段階 m からどれだけ離れているかも考慮します:max(0, 1 − Σ pᵢ·|i − m| / MAD_unif)。MAD_unif は、確率が均等に分布した場合の平均距離です。noul の回答には confidence は含まれません。画像は TypeSafe の API に従います。state 内の文字列値は assets のエントリー({"type": "image", "format": "png" | "jpg", "data_base64": ...}、または multipart ファイルパート)を指定し、リクエストには TypeSafe-Danger-Zone-Images: true を含めます。各画像は、1辺が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を使用します。Authorization: Bearer <key> を必須にするには、--api-key-env NAME を指定してサーバーを起動します。詳細なリファレンスは skills/jev-style/reference.md を参照してください。

カスケード

カスケードは、各質問に対して、十分な確信が得られる最小のモデルで回答し、残りの質問だけをより大きなモデルに送ります。Tier 1 はすべての質問に1回の呼び出しで回答します。confidence (k · p_max − 1) / (k − 1)(noul の場合は |2 · P(true) − 1|)がその tier のしきい値を下回る質問、またはその tier で失敗した質問は、同じ state とともに次の tier に1回の呼び出しで送られます。最上位 tier の回答が最終回答です。最上位 tier が失敗した場合は、直前に成功した回答を使用します。すべての tier で失敗した場合に限り、エラーを返します。回答は通常のスキーマを維持し、tier と tier_model を追加します。timing.tiers には各 tier の呼び出しが記録され、GET /v1/models はカスケードの id、各 tier、および各 tier のしきい値を返します。

--cascade(serve、decide、download 用)、JevStyle(cascade=...)、および eval エンジンの NAME=cascade:... には、パッケージに同梱されているカスケード名か、カスケードファイルを指定します。

cascade-9b

cascade-9b(モデル ID jev-style-cascade-9b)は、当社の 2B モデルとサードパーティ製モデルを組み合わせたカスケードです。

  1. Jev-Style-2B-Decision-v3 はプロセス内で実行され(PyTorch、float32、CUDA graphs を使用)、すべての質問に回答します。
  2. 信頼度がしきい値 τ を下回る質問は、alibiserikbay による v0.3.3 の JevK5-9B に送られます(Apache-2.0)。これは固定されたリビジョンの独自ランタイム allebee/jevk5 を通じて、同じプロセス内で実行されます。jevk5-serve と同じコードを実行するため、jevk5-serve の背後で動作する JevK5-9B と同じ回答を返します。

τ = 0.75 はすべての質問タイプで共通です。結果を見る前に定めたルール、つまり「キャリブレーション精度を JevK5-9B 単体から 1.0 ポイント以内に保てる、期待レイテンシが最も低い値」に基づき、4,992 件の質問からなるキャリブレーションセット(sha256 580962e4b2bc86b32b42731eda42536f57321c7d1ca9ac1e3b970bf7dbd7e2d2)を使って固定しました。詳細、キャリブレーションのソース、すべての数値については、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 の利用規約に基づいて生成された OpenAI の GPT-6 Luna に由来します。その規約がご利用の目的に適していることをご確認ください。

両方のモデルを格納できる余裕のある NVIDIA GPU が必要です。RTX 5090(32 GB)では、起動後に 29.7 GB、サービング中の最大使用量は 31.8 GB で、PYTORCH_CUDA_ALLOC_CONF=expandable_segments:True を設定しました。また、PyTorch と、PyPI では公開されていない jevk5 パッケージも必要です。

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 ティアは、モデルの jevk5_config.json(キャリブレーション用温度)がないと読み込みを拒否します。これがないと JevK5 はキャリブレーションされない状態で実行されるためです。Python では、同じカスケードを JevStyle(cascade="cascade-9b") として利用できます。

独自のカスケード

カスケードファイルにはティア(最小のものから順)と、最上位より下の各ティアに 1 つずつしきい値を記述します。たとえば、プロセス内の 2B と、独自の jevk5-serve の背後で動く JevK5-9B は次のようになります。

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>(cascade-9b と同様の、プロセス内で動作する JevK5。jevk5 パッケージが必要)、http(s)://...(jevk5-serve の場合は "protocol": "jevk5")、または fake を指定できます。"max_options" は、選択肢の数が多い質問をそのティアに送らないようにします。"verify" はティアのファイルを検証します(デフォルトで有効になっている、固定済み JevK5-9B の JevK5 ティアの SHA256SUMS など)。同じファイルを 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;0.8 GB にするには --precision 8bit を追加し、2B を 2.0 GB で実行するには --release 2b --precision 8bit を追加します)
NVIDIA GPUjev-style serve --backend torch(CUDA グラフを使用)
CPU のみjev-style serve --backend torch --device cpu
llama.cppGGUF リポジトリから sh build_jev_score.sh /path/to/llama.cpp を実行して、リリースのスコアラーを一度ビルドします(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 上で動作するときに常にグラフを使用し、2B v4 ランタイムは自動的に使用するかどうかを判断します。--dtype bfloat16 ではオンになり、float32 ではオフになります。float32 ではフォワード処理が計算負荷の高い処理であり、グラフによる効果がほとんどないためです。--cuda-graphs on|off、JEV_STYLE_CUDA_GRAPHS=1|0、または JevStyle(..., cuda_graphs=True|False) でこの設定を上書きできます。これは CUDA 上の PyTorch バックエンドにのみ適用されます。

A100 80GB 上で bfloat16 を使用し、Decision Index 0.3 の公開リクエスト 750 件を一度に 1 件ずつ処理した場合、2B v4 の中央値は CUDA グラフ使用時が 16.4 ms、未使用時が 71.5 ms です(モデルカードにプロトコルと一致性チェックの詳細があります)。初回の記録には約 1 分かかります。

同じランタイムでグラフを使用しない場合と比較し、RTX 5090 上で float32 を使用して 4,992 件のキャリブレーション用質問を測定した v3 リリースの結果:

リリースレイテンシーの中央値Top-1 回答の変化数最大確率差
2B v386.2 → 13.9 ms00.0024
0.8B41.6 → 11.3 ms00.00086

v3 リリースでは、グラフの記録により起動時間が約 7〜11 秒長くなります。4,096 トークンを超える入力と、長い共有状態での複数の質問は通常の処理経路を使います。グラフは、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 の規約に基づく OpenAI の GPT-6 Luna から取得されています。

TypeSafe または Jev とは提携、推奨、関係のいずれもありません。「Jev-Style」はモデルの種類を表します。同様のスタイルの、小型の型付き意思決定モデルです。このパッケージには Jev の重み、コード、出力は含まれていません。Jev-Style-2B-Decision-v4 は、公開 API 経由で取得した TypeSafe Jev 1.14 のソフトラベルを一部使用して学習されています(詳細はモデルカードをご覧ください)。Alibaba Cloud、Qwen チーム、Laya の作者、JevK5 の作者とも提携していません。

コメント

MCP は初めてですか?

プロトコルの概要から最初のサーバーの導入まで、よくある疑問にまとめて答えます。

AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。