Jev と Cloudflare Clef は、どちらも「状態(state)と型つきの質問を渡すと、選択肢ごとの確率を返す」判定モデルです。API の形も互換で、同じ質問をそのまま両方に投げられます1 ,2 。違いは提供形態と得意分野にあり、入力単価の安さで選ぶなら Jev、画像・64K トークンの長い入力・重みの公開・ファインチューニングが要るなら Clef が向きます。この記事では、Jev(TypeSafe AI)と Clef の違いを提供形態・料金・速さ・データの扱いで比べ、Workers から同じ判定を両方で動かすコードと、どちらを選ぶかの判断基準をまとめます(内容は 2026 年 10 月時点)。
判定モデル(decision model)は、文章を生成せず、決められた選択肢の中から答えを確率つきで返すモデルです。TypeSafe はこの種類のモデルを「System One モデル」と呼び、Jev をその最初のモデルとして公開しました3 。Cloudflare の Clef も「Jev と同じ系統の判定モデル」と説明されています2 。
生成 LLM は文章を 1 トークンずつ生成してから JSON をパースするのに対し、判定モデルは全選択肢をまとめて採点し、確率と確信度を返す違い 図: 筆者作成(TypeSafe と Cloudflare の公式情報をもとに作図)
LLM に「この問い合わせは緊急か。JSON で答えて」と頼む方法と比べると、次の点が違います。
出力の形が必ずスキーマどおりになる : TypeSafe は、答えの形は事前に決めたとおりで、型の誤りが起きないと説明しています3
確率が必ず付く : choice と score の答えには、選択肢ごとの確率と、確率から求めた確信度(confidence、0〜1)が付きます4
全選択肢を 1 回で採点する : 1 トークンずつ順に生成せず、すべての出力を 1 回の問い合わせで並列に出します3
文章は返さない : 理由の説明や返信文の作成はできません。OpenRouter のガイドも「チャットモデルの代わりではない」と書いています5
質問の型は Jev も Clef も同じ 3 種類です4 ,6 。
質問の型 何を聞くか 返ってくる値 noulはい/いいえ はいである確率(0〜1) choice自分で決めた選択肢から 1 つ(最大 255 個) 一番確率の高い選択肢、選択肢ごとの確率、確信度 score低い順に並べた段階(2〜10 段階) 確率で重み付けした段階の値、段階ごとの確率、確信度
Clef の質問の書き方やしきい値の決め方は「Cloudflare Clef 入門:判定モデルを Workers AI で使う 」で、Jev の API キーの取得から最初の呼び出しまでは「Jev API 入門 」で詳しく扱っています。この記事では両者の比較と使い分けに絞ります。
判定モデルという枠ができたのは、2026 年 9 月のことです。
2026-09-15 : TypeSafe AI が Jev を早期アクセスで公開しました。創業者は OpenAI で ChatGPT の基になる研究に関わった Diogo Almeida 氏で、Jev を「最先端の知能を持った関数呼び出し」とたとえています3
2026-10-01 : Cloudflare が Clef と Clef-flash を Workers AI で公開しました。Workers AI チームが自分で学習した最初のモデルで、重みは Apache 2.0 で公開されています2
日本の検索にもこの動きがはっきり出ています。Google トレンド(日本・過去 90 日、2026-10-06 取得)で「Jev」は、9 月 8 日の週まで 0 だったのが、9 月 15 日の週に 36 まで上がりました7 。直近 4 週の平均は 19.5 で、同じ回に取った「GitHub Copilot」の 3.2 倍です7 。関連キーワードでは「jev ai」「jev model」「llm jev」「typesafe ai」が急上昇しています7 。
Jev・GitHub Copilot の検索関心度(日本・週ごと) データを表で見る Jev・GitHub Copilot の検索関心度(日本・週ごと) 週 Jev GitHub Copilot 07/07 0 15 07/14 0 10 07/21 0 9 07/28 0 9 08/04 0 8 08/11 0 5 08/18 0 8 08/25 0 8 09/01 0 9 09/08 0 8 09/15 36 5 09/22 29 5 09/29 13 7
出典: Google トレンド(日本、2026/07/07〜2026/09/29 の週、2026-10-06 取得。最大を 100 とした相対値)
Clef は Cloudflare の Birthday Week 2026 の発表の 1 つです。ほかの発表は「Cloudflare Birthday Week 2026 の発表まとめ 」にあります。
一番大きな違いは「誰がどこで動かすか」です。Jev は TypeSafe が API で提供するモデルで、Clef は Cloudflare が Workers AI で提供しつつ、重みも公開しています。
Jev は TypeSafe API・OpenRouter・Workers AI の 3 つから、Clef は Workers AI と Hugging Face の重みから使える構成 図: 筆者作成(各社の公式ドキュメント、2026-10-06 参照)
項目 Jev(TypeSafe) Clef / Clef-flash(Cloudflare) 公開日 2026-09-15(早期アクセス)3 2026-10-012 呼び出し先 TypeSafe API、OpenRouter、Workers AI(typesafe/ jev)4 ,5 ,8 Workers AI(@cf/ cloudflare/ clef、@cf/ cloudflare/ clef-flash)6 重み 公式ドキュメントの使い方は API 経由のみ。全アカウントで同じ重みを使う4 Apache 2.0 で Hugging Face に公開2 大きさ 公表なし Clef 27B、Clef-flash 9B2 入力 文章のみ(文字列・JSON・文字列の配列)4 文章・JSON に加え、画像を最大 4 枚2 ,6 コンテキスト長 TypeSafe API: 1 リクエスト 64K、うち state と一番長い質問で 32K4 。OpenRouter・Workers AI: 32,000 トークン5 ,8 65,536 トークン6 入力の単価(100 万トークンあたり) 0.042 ドル(TypeSafe・OpenRouter・Workers AI とも)4 ,5 ,8 Clef 0.24 ドル、Clef-flash 0.09 ドル6 出力の単価 無料4 単価は入力トークンにのみ設定6 応答時間の中央値(Cloudflare 計測) 524.1 ms2 Clef 209.3 ms、Clef-flash 38.8 ms2 ファインチューニング なし。顧客データで追加学習しない4 RL ファインチューニングをデザインパートナー向けに提供1 ,2 データの扱い 顧客のリクエストで学習しない。ZDR は企業向け4 。Workers AI 経由はゼロデータ保持8 リクエストと応答を読まない・保存しない・学習に使わない(ファインチューニングを使う場合を除く)1 言語 主な学習言語は英語。日本語を含むほかの言語は精度が下がると明記4 日本語の評価は公表なし
ZDR(Zero Data Retention)は、送ったデータを提供元が保存しない契約のことです。
単価だけを比べると、Jev が一番安く、Clef-flash がその約 2 倍、Clef が約 6 倍です。どれも出力トークンの単価は設定されていないので、費用はほぼ入力トークン数で決まります4 ,6 。
判定モデルの入力単価(100 万トークンあたり、ドル、2026 年 10 月時点) データを表で見る 判定モデルの入力単価(100 万トークンあたり、ドル、2026 年 10 月時点) モデル 入力の単価(ドル) Jev 0.042 Clef-flash 0.09 Clef 0.24
出典: TypeSafe Docs「Models」、Cloudflare Docs の Jev・Clef・Clef-flash のモデルページ(2026-10-06 参照)
たとえば 1 回の判定で 1,000 トークンを送ると、Jev は 0.000042 ドル、Clef-flash は 0.00009 ドル、Clef は 0.00024 ドルです(単価 × トークン数の計算)。
Cloudflare の公式ブログは、43 のベンチマークを流した応答時間として、中央値で Clef 209.3 ms、Clef-flash 38.8 ms、Jev 524.1 ms という結果を載せています2 。changelog では「Clef は Jev の 2.5 倍、Clef-flash は 13 倍速い」とまとめています2 。
ただしこれは Cloudflare が自社の環境で測った値です。TypeSafe 側は自社の応答時間を 70〜500 ms とし、その評価は米国西海岸のノート PC から実行したもので、サービスも西海岸に置いていると書いています3 。日本から呼ぶ場合の応答時間は、どちらも公式には出ていません。自分の環境から両方を呼んで測るのが確実です。
精度は、どちらかが一方的に上というわけではありません。Cloudflare のブログが載せた 10 のベンチマークのうち 7 つで Clef か Clef-flash が最高点でしたが、When2Call と BRIGHT では Jev が上でした2 。TypeSafe が公開している業務ワークフローの評価でも、4 種のうち 3 種で Clef が Jev を上回り、残りの 1 種は Jev が上でした2 。
TypeSafe の業務ワークフロー評価(Cloudflare による計測、スコア) データを表で見る TypeSafe の業務ワークフロー評価(Cloudflare による計測、スコア) ワークフロー Clef Clef-flash Jev 請求書処理 64.7 57.1 61.8 カスタマーサービス 76.3 77 76 セキュリティインシデント 62.9 61.7 61.7 エージェントの実行ログ監視 68.5 69.8 71.6
出典: Cloudflare 公式ブログ「Introducing Clef」(2026-10-01)の Workflow 評価の表。Cloudflare が TypeSafe の評価セットで計測
差は多くの項目で数ポイント以内です。ベンチマークの結果だけで決めず、自分の業務データで正解率を測ってから選んでください。
判断の基準は 5 つです。上から順に当てはまるものを選びます。
画像を判定したい → Clef 。Jev は 2026 年 10 月時点で文章のみで、画像・音声・動画は受け付けません4 。Clef は画像を最大 4 枚添えられます6
state が 32K トークンを超える → Clef 。Clef のコンテキスト長は 65,536 トークンです6 。Jev は state と一番長い質問の合計が 32K までです4
自社の環境で動かしたい・自社データで学習し直したい → Clef 。重みが Apache 2.0 で公開されており、RL ファインチューニングの申し込みもできます1 ,2 。Jev は顧客ごとの追加学習をしない方針です4
上のどれにも当てはまらず、費用を一番抑えたい → Jev 。入力単価は Clef-flash の半分以下です4 ,6
Cloudflare を使っていない → Jev を OpenRouter か TypeSafe API で 。OpenRouter なら TypeSafe のアカウントも順番待ちも要らず、OpenRouter の API キーだけで呼べます5
すでに Cloudflare Workers で動かしているなら、迷う必要はあまりありません。Jev も Clef も Workers AI の同じバインディング(env.AI)から呼べるので、両方を同じコードで試してから決められます8 ,6 。次の節がそのコードです。
自分で動かす選択肢は Clef 以外にもあります。GitHub で公開されている jaredpalmer/kev は、Qwen3.5・Qwen3.8 をもとにした「Jev 風の小さな判定モデル」で、0.8B〜27B の 4 サイズの重みが Apache 2.0 で公開されています9 。README によると API は System One と同じ形で、TypeSafe の Python SDK をそのまま Kev のサーバーに向けられます9 。NandhaKishorM/laya は 100 以上の言語に対応をうたう判定モデルで、pip install laya で入れられます9 。
Workers AI では、Jev は typesafe/ jev、Clef は @cf/ cloudflare/ clef と @cf/ cloudflare/ clef-flash というモデル ID で呼べます8 ,6 。質問の書き方は共通なので、モデルを引数で切り替える関数を 1 つ作れば足ります。
ここでは、問い合わせを読んで「オンコールを呼ぶ」「担当チームに振る」「人が見る」に分ける Worker を作ります。前提は Node.js 24、wrangler 4.147.0、TypeScript です。Workers AI のバインディングは wrangler.jsonc に "ai": { "binding": "AI" } と書きます。
2026-10-06 時点の @cloudflare/ workers-types(5.20261006.1)には、Jev と Clef の型がまだありません。TypeSafe の API リファレンスにある質問と回答の形をもとに、自分で型を定義します4 。
export type Question =
| { type : "noul" ; instructions : string ; criteria ?: { true ?: string ; false ?: string } }
| { type : "choice" ; instructions : string ; criteria : Record <string , string | null > }
| { type : "score" ; instructions : string ; criteria : string [] };
export type Answer =
| { type : "noul" ; noul : number }
| { type : "choice" ; choice : string ; probabilities : Record <string , number >; confidence : number }
| { type : "score" ; score : number ; legend : Record <string , string >; probabilities : Record <string , number >; confidence : number };
export type DecisionResponse = {
model : string ;
answers : Record <string , Answer >;
usage : { input_tokens : number ; output_tokens : number };
};
export type Provider = "jev" | "clef" | "clef-flash" ;
export async function decide (
ai : Ai ,
provider : Provider ,
state : unknown ,
questions : Record <string , Question >,
): Promise <DecisionResponse > {
const res =
provider === "jev"
? await ai.run ("typesafe/jev" , { state, questions })
:
await ai.run (`@cf/cloudflare/${provider} ` , { model : provider, state, questions });
return res as unknown as DecisionResponse ;
}
呼び出し方の違いは 1 点だけです。Workers AI の Jev のページの例では、本文は state と questions だけです8 。Clef は本文に model("clef" か "clef-flash")も必要です6 。
質問は Jev と Clef で共通です。公式ドキュメントの例をもとに、緊急度・担当チーム・影響度の 3 問にしました8 ,6 。
import type { Question } from "./systemone" ;
export const ticketQuestions = {
urgent : {
type : "noul" ,
instructions : "Does this support request need a response within one hour?" ,
criteria : { true : "Service is down or money is being lost now" , false : "Can wait for normal handling" },
},
team : {
type : "choice" ,
instructions : "Which team should handle this request?" ,
criteria : {
billing : "Payments, invoices, and refunds" ,
technical : "Outages, errors, and configuration" ,
sales : "Plans and upgrades" ,
},
},
severity : {
type : "score" ,
instructions : "How severe is the customer impact?" ,
criteria : ["No impact" , "Minor" , "Major" , "Critical" ],
},
} satisfies Record <string , Question >;
質問文を英語にしているのは、Jev の主な学習言語が英語だからです4 。state(問い合わせ本文)は日本語のままでも送れます。
分岐のしきい値(0.8 と 0.6)は例として筆者が決めた値です。
import { decide, type Answer , type Provider } from "./systemone" ;
import { ticketQuestions } from "./questions" ;
export type Route =
| { action : "page-oncall" ; team : string }
| { action : "assign" ; team : string }
| { action : "human-review" ; reason : string };
const URGENT = 0.8 ;
const MIN_CONFIDENCE = 0.6 ;
function pick<T extends Answer ["type" ]>(a : Answer | undefined , type : T): Extract <Answer , { type : T }> {
if (!a || a.type !== type ) throw new Error (`unexpected answer: ${JSON .stringify(a)} ` );
return a as Extract <Answer , { type : T }>;
}
export async function routeTicket (ai : Ai , provider : Provider , message : string ): Promise <Route > {
const { answers } = await decide (ai, provider, message, ticketQuestions);
const urgent = pick (answers.urgent , "noul" );
const team = pick (answers.team , "choice" );
const severity = pick (answers.severity , "score" );
if (team.confidence < MIN_CONFIDENCE ) {
return { action : "human-review" , reason : `team confidence ${team.confidence.toFixed(2 )} ` };
}
if (urgent.noul >= URGENT && severity.score >= 2 ) return { action : "page-oncall" , team : team.choice };
return { action : "assign" , team : team.choice };
}
Worker の入口では、クエリ文字列の ?model= でモデルを選べるようにしました。
import { routeTicket } from "./route" ;
import type { Provider } from "./systemone" ;
export interface Env {
AI : Ai ;
}
export default {
async fetch (request, env): Promise <Response > {
if (request.method !== "POST" ) return new Response ("POST only" , { status : 405 });
const url = new URL (request.url );
const p = url.searchParams .get ("model" ) ?? "clef-flash" ;
if (p !== "jev" && p !== "clef" && p !== "clef-flash" ) return new Response ("bad model" , { status : 400 });
const { message } = await request.json <{ message : string }>();
return Response .json (await routeTicket (env.AI , p as Provider , message));
},
} satisfies ExportedHandler <Env >;
env.AI.run に渡した引数を記録する偽物を使い、Jev と Clef で呼び方が正しく変わることを確かめます。Workers AI を呼ばないので課金もありません。
import { describe, expect, it } from "vitest" ;
import { routeTicket } from "./route" ;
function fakeAi (answers : Record <string , unknown > ) {
const calls : { model : string ; input : Record <string , unknown > }[] = [];
const ai = {
run : async (model : string , input : Record <string , unknown >) => {
calls.push ({ model, input });
return { model, answers, usage : { input_tokens : 300 , output_tokens : 40 } };
},
} as unknown as Ai ;
return { ai, calls };
}
const urgentOutage = {
urgent : { type : "noul" , noul : 0.96 },
team : { type : "choice" , choice : "technical" , probabilities : { billing : 0.03 , technical : 0.95 , sales : 0.02 }, confidence : 0.9 },
severity : { type : "score" , score : 2.7 , legend : {}, probabilities : { "0" : 0 , "1" : 0.05 , "2" : 0.2 , "3" : 0.75 }, confidence : 0.7 },
};
describe ("routeTicket" , () => {
it ("Jev には model を付けずに typesafe/jev を呼ぶ" , async () => {
const { ai, calls } = fakeAi (urgentOutage);
expect (await routeTicket (ai, "jev" , "Checkout is down for everyone." )).toEqual ({ action : "page-oncall" , team : "technical" });
expect (calls[0 ].model ).toBe ("typesafe/jev" );
expect (calls[0 ].input .model ).toBeUndefined ();
});
it ("Clef-flash には本文の model に clef-flash を入れる" , async () => {
const { ai, calls } = fakeAi (urgentOutage);
await routeTicket (ai, "clef-flash" , "Checkout is down for everyone." );
expect (calls[0 ].model ).toBe ("@cf/cloudflare/clef-flash" );
expect (calls[0 ].input .model ).toBe ("clef-flash" );
});
it ("担当チームの確信度が低ければ人に回す" , async () => {
const { ai } = fakeAi ({
...urgentOutage,
team : { type : "choice" , choice : "sales" , probabilities : { billing : 0.4 , technical : 0.15 , sales : 0.45 }, confidence : 0.35 },
});
expect ((await routeTicket (ai, "clef" , "プランを変えたら請求額が変わった?" )).action ).toBe ("human-review" );
});
});
型チェック、テスト、デプロイの事前確認(--dry-run)を通した様子です。--dry-run は実際にはデプロイせず、バンドルとバインディングを確かめるだけです。
tsc の型チェック、vitest の 3 件のテスト、wrangler deploy --dry-run が通り、env.AI のバインディングが表示される様子 筆者の環境(macOS、Node.js 24、wrangler 4.147.0、vitest 5.0.3)で実行した出力
npx tsc --noEmit
npx vitest run --reporter=verbose
npx wrangler deploy --dry-run --outdir dist
筆者は課金とアカウント作成を避けるため、実際のモデル呼び出しはしていません。本番で両方を比べるときは、同じ問い合わせを ?model=jev と ?model=clef-flash で送り、答えと応答時間をログに残します。
Cloudflare を使わないなら、TypeSafe API(POST https:/ / api.typesafe.ai/ v1/ systemone、本文の model に "jev-latest")か OpenRouter から呼びます4 ,5 。TypeSafe の SDK は、ベース URL を https:/ / openrouter.ai/ api に替えると OpenRouter 経由になります5 。SDK の入れ方や最初の呼び出しは「Jev API 入門 」を参照してください。
Clef の model を入れ忘れる : Clef はモデル ID とは別に、本文の model が必須です6 。TypeSafe API でも model は必須です4 。Workers AI の Jev の例には model がありません8 。経路ごとに本文が少しずつ違います
REST API の形が Jev と Clef で違う : Workers AI の REST API の例では、Jev は / ai/ run に {"model": "typesafe/ jev", "input": {...}} を送ります8 。Clef は / ai/ run/ @cf/ cloudflare/ clef に本文をそのまま送ります6 。バインディング(env.AI.run)を使えば、この違いを気にせずに済みます
しきい値をそのまま使い回す : 確率の出方はモデルごとに違います。Jev で決めたしきい値を Clef にそのまま使わず、モデルを替えたら測り直してください。TypeSafe も、しきい値を合わせた版があるなら jev-latest ではなく jev-1.13.0 のように版を固定するよう勧めています4
長い state が 32K に収まらない : Jev は、Workers AI と OpenRouter で 32,000 トークンまでです5 ,8 。必要な部分だけを先に抜き出すか、Clef(65,536 トークン)を使います6
数え上げや日付の比較を任せる : TypeSafe は、Jev 1.13 が数え上げ・計算・日付の前後の比較を苦手とすると公表しています10 。数値や日付はコードで処理し、モデルには意味の判定だけを任せます
日本語の精度を確かめずに本番に出す : TypeSafe は、英語以外の言語は精度が下がると明記しています4 。Clef の日本語の評価は公表されていません。実際の問い合わせ 100 件ほどで両方の正解率を測ってください
TypeSafe API の 429 を想定していない : TypeSafe API の上限は毎秒 10 万トークン・毎秒 80 リクエストで、需要に応じて予告なく変わることがあります4 。429 や 529 が返ったら、間を空けて再試行します4
Workers AI の利用料に上限をかけたい場合は「AI Gateway と Workers AI で LLM の費用を管理する方法 」の手順が使えます。
Jev と Clef は、どちらも noul・choice・score の質問に確率で答える判定モデルで、API に互換があります
入力単価は Jev が 100 万トークンあたり 0.042 ドルで一番安く、Clef-flash は 0.09 ドル、Clef は 0.24 ドルです(2026 年 10 月時点)
画像・32K を超える入力・自社環境での実行・ファインチューニングが要るなら Clef、それ以外で費用を抑えたいなら Jev を選びます
速さと精度の比較は主に Cloudflare の計測で、項目によって勝ち負けが入れ替わります。自分のデータで測ってから決めてください
次にやること: Workers AI で上のコードを動かし、同じ問い合わせを Jev と Clef-flash に送って、正解率・確信度・応答時間を比べましょう
Jev は、TypeSafe AI が 2026-09-15 に公開した判定モデルです3 。文章を生成せず、状態と型つきの質問を受け取って、選択肢ごとの確率と確信度を返します4 。TypeSafe はこの種類を「System One モデル」と呼んでいます3 。
OpenRouter の FAQ は「LLM ではない」と答えています5 。Jev は理由の説明や文章を返さず、決めた選択肢の確率だけを返します5 。文章が要る場合は、Jev で判定してからチャットモデルに渡します。
Jev を作った会社です。創業者の Diogo Almeida 氏は、OpenAI で ChatGPT の基になった研究に関わったと公式ブログで書いています3 。米国西海岸を拠点にサービスを運営しています3 。
ほぼ同じコードで使えます。Clef は System One API に互換で、Jev の連携はエンドポイントとモデル名を替えれば Clef に切り替えられると Cloudflare は説明しています2 。Workers AI では、Clef だけ本文の model が必要な点に注意してください6 。
入力単価は Jev のほうが安く、100 万トークンあたり 0.042 ドルです4 。Clef-flash は 0.09 ドル、Clef は 0.24 ドルです6 。どれも出力トークンの単価は設定されていません(2026 年 10 月時点)。
TypeSafe の公式ドキュメントに載っている使い方は、TypeSafe API・OpenRouter・Workers AI の API 経由だけです4 ,5 ,8 。自分の GPU で動かしたいなら、重みが Apache 2.0 で公開されている Clef や、Jev と同じ API の形を持つ Kev を使います2 ,9 。