実践ガイド

Jev AI は、どの作業に効くのか

文章を書かないAI「Jev」を、自分の回線で Claude Opus 5 / GPT-6 Astra / Gemini 3.8 Flash と測り比べました。この資料は、その実測値と、今日から動かすためのコードをまとめたものです。

CONTENTS

この資料の中身

01 — 結論

文章を書かない。返すのは判定と確信度だけ

Jev は TypeSafe AI が 2026年9月15日に公開したモデルです。作ったのは Diogo Almeida(InstructGPT・RLHF の共同発明者)。「なぜ超人的なチャットモデルが AGI につながらないのか」を問い続けた結果、2年のステルス開発で RLCD(Reinforcement Learning from Calibrated Decisions)という学習手法を作り、そこから生まれたのがこのモデルです。

公式は System One モデルと呼んでいます。人間の思考でいう「直感」の側だけを担当し、文章生成の口をそもそも持っていません。入力は「判定したい文章(state)+型のついた質問」、出力は「判定+較正済みの確率」だけです。

いちばん的確な言い換えは、公開直後に開発者コミュニティで広まったこの一文です。
「gpt や claude を置き換えるものじゃない。ただの"本当に"賢い switch 文だ」
— Nathan Flurry(2026-09-16・約66万表示)。2016年の分類器が2026年の賢さを手に入れた、という比喩も添えられています。

つまり立ち位置は「LLMの代わり」ではなく、LLMの前に置くもの。この資料の8章で、それを実測で確かめます。

02 — 仕様

質問の型は3つだけ

呼び出す側が先に選択肢を定義します。だから定義にない答えは返ってきません。これが「ハルシネーションしない」と言われる仕組みの正体です(=出力形式の話であって、判断の中身が正しい保証ではありません。11章参照)。

Noul
はい/いいえを 0〜1の確率で返す
この問い合わせは緊急か → 0.92
Choice
決めた選択肢から1つ+各選択肢の確率と確信度
カテゴリ → 不具合・障害/確信度 0.97
Score
段階評価。整数ではなく小数で返る
不満度 0〜4 → 3.07
項目値
料金(入力)$0.042 / 100万トークン(約6円)
料金(出力)$0(無料)
コンテキスト長32,000トークン
公称レイテンシ70〜500ms(LLM比 40〜200倍速と主張)
エンドポイントPOST /api/alpha/decisions(チャットAPIとは別)
03 — 準備

今日から始める手順

公開直後は待機リスト制で、申し込みが殺到して API が一時停止するほどでしたが、2026年9月21日に待機リストが撤廃されました。今は登録するだけで使えます。

  1. 公式コンソールで登録する(console.typesafe.ai)。登録すると $5 のクレジットが付きます。$0.042 / 100万トークンで割ると約1.2億トークン相当で、個人の検証ではまず使い切れません。
  2. または、既存の OpenRouter キーで叩く。モデルIDは typesafe/jev-1.13。この資料のコードはこちらの経路です(LLM側と同じ入口から叩かないと、速度の比較が公平にならないため)。
  3. 他の経路として Cloudflare Workers AI・Vercel AI Gateway もあります(未検証)。
普通のAPIと叩き方が違います
chat/completions に投げると 400 で弾かれます。専用の /api/alpha/decisions を使ってください。また Jev は OpenRouter のモデル一覧(446件)に出てきません(alpha エンドポイント専用のため)。一覧にないから使えない、ではありません。
04 — コード

コピペで動く最小コード

キーを1本入れれば、そのまま動きます。

まず1回叩いてみる(curl)

curl -s -X POST "https://openrouter.ai/api/alpha/decisions" \
  -H "Authorization: Bearer $OPENROUTER_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "typesafe/jev-1.13",
    "state": "払い出しが3日間ずっと失敗しています。至急なんとかしてください。",
    "questions": {
      "is_urgent": {
        "type": "noul",
        "instructions": "この問い合わせは緊急対応が必要ですか?",
        "criteria": {
          "true":  "業務が止まっている・金銭的被害・期限が迫っている",
          "false": "すぐ対応しなくても実害が出ない"
        }
      }
    }
  }'

返ってくる JSON はこれだけです。パースも整形も要りません。

{
  "model": "typesafe/jev-1.13-20260917",
  "answers": { "is_urgent": { "type": "noul", "noul": 0.92 } },
  "usage": { "input_tokens": 365, "output_tokens": 23, "cost": 0.00001533 },
  "provider": "TypeSafe"
}
指定は typesafe/jev-1.13 ですが、返ってくる実体は 1.13-20260917(9月17日版)です。モデルの世代を記録に残すときは、リクエストではなくレスポンスの model を見てください。

3つの型を一度に投げる(Python・標準ライブラリだけ)

import json, os, time, urllib.request

KEY = os.environ["OPENROUTER_API_KEY"]
CATS = ["請求・支払い", "不具合・障害", "使い方の質問", "解約・契約変更", "その他"]

QUESTIONS = {
    # Noul: criteria は true / false のキーを持つ辞書
    "is_urgent": {
        "type": "noul",
        "instructions": "この問い合わせは緊急対応が必要ですか?",
        "criteria": {"true": "業務が止まっている・金銭的被害・期限が迫っている",
                     "false": "すぐ対応しなくても実害が出ない"},
    },
    # Choice: criteria は「選択肢 → その条件」の辞書
    "category": {
        "type": "choice",
        "instructions": "一次カテゴリを選んでください。",
        "criteria": {c: c for c in CATS},
    },
    # Score: criteria は低→高の順に並べた配列(★ここだけ配列)
    "frustration": {
        "type": "score",
        "instructions": "書き手の不満度",
        "criteria": ["満足・好意的", "中立", "やや不満", "強い不満", "激怒・解約寸前"],
    },
}

def jev(state, questions):
    req = urllib.request.Request(
        "https://openrouter.ai/api/alpha/decisions",
        data=json.dumps({"model": "typesafe/jev-1.13",
                         "state": state, "questions": questions}).encode(),
        headers={"Authorization": f"Bearer {KEY}",
                 "Content-Type": "application/json"})
    t0 = time.perf_counter()
    with urllib.request.urlopen(req, timeout=60) as r:
        body = json.loads(r.read())
    return body, (time.perf_counter() - t0) * 1000

body, ms = jev("解約したいのに導線が見つかりません。もう3回問い合わせています。", QUESTIONS)
a = body["answers"]
print(f"緊急度   {a['is_urgent']['noul']:.2f}")
print(f"カテゴリ {a['category']['choice']}(確信度 {a['category'].get('confidence')})")
print(f"不満度   {a['frustration']['score']:.2f}")
print(f"{ms:.0f}ms / ${body['usage']['cost']:.8f}")

1つの文書を、たくさんの観点でまとめて判定する

これが Jev のいちばんおいしい使い方です。質問を何個束ねても1リクエストで返ります。

CHECKS = [
    "第三者提供について記載があるか", "削除請求の手段が記載されているか",
    "削除対応の期限が明記されているか", "データの保管国が明記されているか",
    "未成年の扱いが記載されているか", "Cookieのオプトアウトが可能か",
    # …24個でも48個でも、まとめて1回で投げる
]

questions = {
    f"q{i}": {"type": "noul", "instructions": c,
              "criteria": {"true": "文書中に明記がある", "false": "明記がない"}}
    for i, c in enumerate(CHECKS)
}
body, ms = jev(規約の本文, questions)
for i, c in enumerate(CHECKS):
    print(f"{body['answers'][f'q{i}']['noul']:.2f}  {c}")
05 — 実測

自分の回線で測った数字

公称は「40〜200倍速い」。本当かどうか、いつも新モデルを検証しているツールに速度モードを足して、同じ課題・同じ入口(OpenRouter)・全レーン同時スタートで測りました。

規約を24項目でチェック(1リクエストにまとめて判定)

モデル所要時間費用Jev比(時間)Jev比(費用)
Jev332ms$0.000070——
GPT-6 Astra6,378ms$0.02061019.2倍294倍
Gemini 3.8 Flash7,427ms$0.00433022.4倍62倍
Claude Opus 518,966ms$0.02880057.1倍411倍

問い合わせ10件を1件ずつ仕分け(件数ぶん往復が発生する形)

モデル所要時間費用Jev比(時間)Jev比(費用)
Jev3,047ms$0.000243——
GPT-6 Astra27.7s$0.0328409.1倍135倍
Claude Opus 537.8s$0.02713012.4倍112倍
Gemini 3.8 Flash48.8s$0.01562716.0倍64倍

この課題では、Jev 側だけカテゴリに確信度が付きます。「自信の低い件だけ人間に回す」運用ができるのは、この確信度があるからです。

測定条件=2026年9月21日・日本の自宅回線・OpenRouter 経由・温度0固定・全レーン同時発走。各1回の測定であって中央値ではありません。回線や混雑で変動します。
Gemini 3.8 Flash が Opus 5 より遅い結果になっていますが、速度の優劣として一般化はできません(この課題・この回線での1回の結果です)。
06 — 核心

速さの正体は「増えないこと」

同じ課題を1項目だけにして測り直すと、差はぐっと縮みます。ここがいちばん大事なところです。

20,000 15,000 10,000 5,000 0 ms 1問 24問 ← 質問の数 → Claude Opus 5 18,966ms(4.88倍) Gemini 3.8 Flash 7,427ms(2.90倍) GPT-6 Astra 6,378ms(4.27倍) Jev 332ms(1.18倍)
質問を24倍に増やしても、Jev の応答時間は 282ms → 332ms(1.18倍)でほぼ変わらない。
Jev の伸び(1問→24問)1.18倍
Claude Opus 54.88倍
GPT-6 Astra4.27倍
Gemini 3.8 Flash2.90倍

なぜこうなるのか。LLM は答えを「文字として書く」ので、項目が増えるほど書く量が増え、時間が伸びます。Jev は文字を書かず全部を同時に返すので伸びません。

だから、Opus 5 との差は 1項目なら13.8倍、24項目で57.1倍まで開きます。差が開くのは「Jev が速くなる」からではなく、向こうが遅くなるからです。
公称の「40〜200倍」は条件つきで本当でした。到達するのは質問をたくさん束ねたときで、1問だけなら十数倍です。
07 — 使いどころ

効く仕事と、3層の考え方

効くのは答えが「言葉」ではなく「どれか」や「何点」で済む仕事だけです。具体的には3つの型に分かれます。

型具体例
大量の文章を仕分ける問い合わせ・レビュー・メール・応募書類
1つの対象を多くの観点で採点する規約・契約書・コードレビュー・チェックリスト
LLMに渡す前の門番難易度判定・安全確認・振り分け

3層に分けて考える

開発者コミュニティで広まっている整理がこれです。今までは内側か外側しかなく、その真ん中が空いていたという見方です。

内側 コード 正規表現・条件分岐 最速・ほぼ無料 意味は理解できない 中間 — ここが空いていた Jev 確率つきの判定 速い・1件0.01円以下 意味は分かる/書けない 外側 LLM 文章生成・理由の説明 低速・高額 書ける 左ほど速く安い。右ほど賢く高い。まず左で済ませ、必要なぶんだけ右へ渡す。

「検査を足せるようになった」のが本質

既存の判定を置き換えるより、これまで高すぎて検査を置けなかった場所に、検査を足せるようになったことが大きい、という見方です。具体的な設置場所として挙がっているのがこの5つです。

08 — 実測

置き換えずに「前に足す」と、総額が下がる

問い合わせ12件を、(A) 全部 Claude Opus 5 で回答する場合と、(B) Jev に難易度を判定させて振り分ける場合で比べました。

問い合わせ 12件 受信 Jev 門番 難問か?を 0〜1 で判定 0.03〜0.21 0.69〜0.82 定型 8件 → 安いモデル Gemini 3.8 Flash 専門 4件 → 高性能モデル Claude Opus 5 門番あり $0.149 約23円 / 門番のコストは全体の 0.13% 門番なし 全件 Opus 5 $0.232 約36円 AIを1段「足した」のに、総額は 1.6倍安くなる。
この比較は日をまたいで2回測り、どちらも同じ結論になりました。
1回目 — 門番あり $0.149 / 全件 $0.232(1.6倍安) 2回目 — 門番あり $0.141 / 全件 $0.241(1.7倍安)
門番自身が占める割合は、2回とも 0.13% で一致しました。
ここで見るのは時間ではなく総額です
所要時間は 164.8s 対 179.6s でほとんど変わりません(回答を書くのは結局 LLM だからです)。門番が効くのはお金と、難しい問いにだけ高いモデルを使えることです。
09 — 注意

最初に必ず踏む5つ

  1. choice の criteria は「辞書」、score の criteria は「配列」。逆にすると 400 Bad Request が返り、エラー文は expected array, received object の形になります。ここでいちばん時間を溶かします。
  2. score は整数で返りません。加重平均の小数(例 3.07)です。段階に戻したいなら自分で丸めてください。
  3. コンテキストは 32,000トークンまで。長い文書は自分で分割します。
  4. chat/completions では通りません。/api/alpha/decisions を使います。
  5. OpenRouter のモデル一覧に出てきません。alpha エンドポイント専用のためで、一覧にないから使えないわけではありません。

1番は実際にエラーを出して確かめられます。

# ✗ わざと間違える(score の criteria を辞書にする)→ 400
curl -s -X POST "https://openrouter.ai/api/alpha/decisions" \
  -H "Authorization: Bearer $OPENROUTER_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"model":"typesafe/jev-1.13","state":"解約したいのに導線が見つかりません。",
       "questions":{"unhappy":{"type":"score","instructions":"不満度",
       "criteria":{"0":"満足","1":"中立","2":"不満"}}}}'

# ✓ 正しい形(低→高の順に並べた配列)
curl -s -X POST "https://openrouter.ai/api/alpha/decisions" \
  -H "Authorization: Bearer $OPENROUTER_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"model":"typesafe/jev-1.13","state":"解約したいのに導線が見つかりません。",
       "questions":{"unhappy":{"type":"score","instructions":"不満度",
       "criteria":["満足","中立","やや不満","強い不満"]}}}'
10 — 設計

閾値の決め方

Jev は「0.72」のような確率を返してきます。それをどう扱うかは、使う側が決めなければいけません。ここは自動では決まらない部分です。

「50%で返ってきたらコイン投げと同じ。無視する判断が要る」— 公開直後にコミュニティから出た指摘です。確率が出ること自体は、正しさの保証ではありません。

判定の精度は、モデルより聞き方で決まります。実装するときの4点セットがこれです。

  1. state を必要な情報だけに絞る — 関係ない文脈を混ぜると判定がぶれます。
  2. 型を選ぶ — 二択なら Noul、分類なら Choice、程度なら Score。迷ったら Noul を複数並べるほうが安定します。
  3. criteria に条件を書き切る — 選択肢の名前だけでなく、「どういうときにこれを選ぶか」を書きます。ここが精度に直結します。
  4. 閾値は自分の正解データで測る — 手元の30件ほどに正解を付けて、どこで切ると見逃しと空振りのバランスが良いかを実際に測ります。

運用としては、グレーゾーンを人間に回す設計が扱いやすいです。たとえば「0.8以上は自動処理・0.3以下は自動で除外・その間だけ人が見る」といった三分割にすると、確信度の低い判定で事故が起きにくくなります。

11 — 限界

向いていない仕事

ここは正直に書きます。万能の置き換えではありません。

12 — 料金

いくらかかるのか

入力 $0.042 / 100万トークン、出力 $0。実際に払った額で言うと、こうなります。

やったこと実費日本円
規約を24項目でチェック(1回)$0.000070約0.011円
問い合わせ10件を3観点で仕分け$0.000243約0.038円
問い合わせ12件の難易度判定(門番)$0.000188約0.029円

登録時の $5 クレジットは、この単価なら約1.2億トークンに相当します。上の24項目チェックなら、ざっと7万回ぶんです。個人の検証で使い切ることはまずありません。

比較として、Claude Opus 5 は入力 $5.00・出力 $25.00、GPT-6 Astra は入力 $10.00・出力 $50.00(いずれも100万トークンあたり)。Jev は出力が無料なので、判定だけを大量に回す用途では差がさらに開きます。