# TypeSafe Jevとは：LLMとの使い分けとAPIの使い方

> Jevは文章を書かず、決めた選択肢と確率だけを返す判断モデルです。振り分けや採点のLLM呼び出しは置き換えられますが、計算・日付・文章生成には使えません。

- URL: https://blog.laozhang.ai/ja/posts/jev-ai-model-guide
- Published: 2026-09-24
- Updated: 2026-09-24
- Author: LaoZhang AI Team (https://blog.laozhang.ai/ja/about)
- Category: APIガイド
- Tags: Jev, TypeSafe, 判断モデル, LLM, 分類API

---
Jevは、TypeSafe AIが2026年9月15日に公開した「判断モデル」です。文章を生成せず、こちらが先に決めた選択肢・段階・真偽の問いに対して、答えと確率だけを返します。問い合わせの振り分け、エージェントが次に呼ぶツールの選択、リスクの採点のように「答えの候補が決まっている判断」なら、LLMにJSONを返させていた呼び出しを置き換えられます。返信文の作成、金額の計算、日付の比較は任せられません。

2026年9月24日時点では、公式コンソールに登録すればそのまま使えます（ウェイトリストは9月20日に撤廃）。料金は入力100万トークンあたり$0.042で、出力は無料です。日本語も読めますが、公式には英語ほどの精度は出ないとされているので、自分のデータで一度測ってから本番に入れるのが前提になります。

## Jevが返すもの：文章ではなく型付きの答えと確率

Jevへのリクエストは、判断の材料になる`state`と、名前を付けた問いの集合`questions`でできています。`state`は文字列でも、JSONオブジェクトや配列でも構いません。Jevは同じ`state`に対してすべての問いを1回のリクエスト内で並列に、互いに独立して評価し、問いごとに型の決まった答えを返します。生成した文章をパースする工程がそもそもありません。

問いの型は3つです。

| 型 | 聞けること | 返ってくる値 | 使いどころの例 |
| --- | --- | --- | --- |
| Choice | 候補から1つ選ぶ（1問あたり最大255択） | `choice`、候補ごとの`probabilities`、`confidence` | 担当チームへの振り分け、次に呼ぶツール |
| Score | 順序のある段階で採点（2〜10段階） | `score`（段階の間の小数もあり）、`legend`、`probabilities`、`confidence` | 緊急度、不満の強さ、リスクの高さ |
| Noul | ある文が成り立つか | `noul`（0〜1の「はい」の確率。confidenceはなし） | 返金を求めているか、個人情報を含むか |

NoulはBernoulli（ベルヌーイ）の略だと、TypeSafeのCEOがHacker Newsで説明しています（Simon Willisonのブログより）。Vercel AI SDKでは同じ型が`boolean`と呼ばれます。

公式ドキュメントが繰り返し勧めているのは、1つの問いには「人が数秒で直感的に判断できること」を1つだけ聞き、複雑な判断は小さな問いに分けて結果をコードで組み合わせる、という使い方です。Jevは推論の過程を書き出さないので、多段の推論を1問に詰め込むほど精度が落ちます。

### 速さと安さの根拠

トークンを1つずつ生成しないことが、速さとコストの差の出どころです。TypeSafeのローンチ記事は、エンドツーエンドの応答時間を70〜500ms、最先端のLLMでは3〜329秒としています。ただしこの計測は米国西海岸のノートPCからで、サービス自体も現在は米国西海岸にあります。日本から呼ぶ場合はそのぶんの往復時間が乗るはずなので、自分の環境で測った値で設計してください。

公式サイトの「193.6倍速く、444.6倍安い」は、TypeSafeが自社で作ったワークフロー評価の数字です。参照解答はGPT-6 AstraとFable 5.1の平均で、ワークフローも自社のチームが書いたもの。TypeSafe自身が「実際の効果としては上限寄り」と書いているので、比較の目安にとどめるのが妥当です。

### 「ハルシネーションしない」が保証する範囲

JevはLLMのように存在しない選択肢や壊れたJSONを返しません。答えは定義した候補の中にしか入らず、スキーマとの一致は構造上保証されます。TypeSafeが示す「型エラー0%」も、測定値ではなく仕組みから言える数字だと本人たちが書いています。

保証されるのは形式であって、判断の正しさではありません。Jevが間違えるときは、もっともらしい正規のラベルを返します。だからこそ、次に説明する`confidence`で「このまま自動で進めてよいか」を分ける設計が要になります。

### Jevでできないこと

- 文章を書くこと。返信文、要約、コード生成はLLMの仕事です。
- 判断の理由を説明すること。返ってくるのは確率だけです。
- Claude Code、Cursor、Copilotなどの裏側のモデルとして差し替えること。公式ドキュメントが明確に否定しています。
- 自社データでのファインチューニングやLoRA。全アカウントが同じ重みを使い、ドメインへの合わせ込みは`state`、`instructions`、`criteria`、問いの分け方で行います。
- 画像・音声・動画の入力。受け付けるのはテキスト（文字列、JSON、テキストの配列）だけです。

リクエストの内容はモデルの学習に使われず、エンタープライズ契約ではデータを保持しない設定（ZDR）も相談できます。

開発したTypeSafe AIの創業者Diogo Almeidaは、OpenAIでChatGPTの土台になった指示追従の研究に関わった人物です。TypeSafeは新しいアーキテクチャ、並列サンプラー、RLCD（Reinforcement Learning for Calibrated Decisions）と呼ぶ学習手法の組み合わせだとしています。Jevの重みは公開されておらず、使えるのはAPIとオープンソースのSDKです。

## LLM・普通のコード・Jevをどう使い分けるか

Jevの比較相手は「LLM全般」ではなく、アプリの中にある個々の判断ポイントです。同じ判断を、ルールや正規表現で書くか、Jevに聞くか、LLMにJSONで答えさせるかを比べると次のようになります。

| 観点 | 普通のコード（ルール・正規表現） | Jev | LLM（JSONで回答させる） |
| --- | --- | --- | --- |
| 向いている判断 | 正確に計算・照合できること | 候補が決まっている意味の判断 | 候補を列挙できない判断、文章生成、多段の推論 |
| 出力 | 決まった値 | 候補1つと確率、confidence | テキスト（パースと検証が必要） |
| 形式の崩れ | 起きない | 構造上起きない | 起こりうる |
| 理由の説明 | コードそのものが理由 | 返らない | 書かせられるが、実際の判断根拠とは限らない |
| 課金 | ほぼゼロ | 入力トークンのみ（100万あたり$0.042） | 入力と出力の両方 |
| 応答時間 | 即時 | 公称70〜500ms | 公称で数秒〜数分 |
| 日本語 | 関係なし | 読めるが英語より精度が下がると公式が明記 | モデルによる |
| 迷ったとき | 迷わない（ルールが外れるだけ） | `confidence`が下がる | 自己申告の確信度は較正されていない |

料金と応答時間はTypeSafeの公表値（2026年9月24日時点）で、LLM側はローンチ記事が示した範囲です。

### 判断ポイントごとの振り分けルール

手元の判断ポイントを1つずつ、次の順に当てはめると置き場所が決まります。

1. **コードで正確に出せるか。** 合計金額、件数、日付の前後、正規表現で拾える値はコードに置きます。公式の既知の弱点一覧でも、数値・カウント・日付比較はJevが苦手なものとして挙がっています。
2. **出力が文章か、候補を列挙できない値か。** そうならLLMです。抽出の場合は、LLMや正規表現で候補を出してJevに正しいものを選ばせる分担を公式が勧めています。
3. **候補・段階・真偽で表せて、1つの問いに収まるか。** 収まるならJevの出番です。複合的な判断なら、原子的な問いに分けてから結果をコードで組み合わせます。
4. **間違えたときの損害はどれくらいか。** 取り消せる操作ならconfidenceの閾値だけで自動化し、取り消せない操作はJevの判定に加えて確定的なチェックと人の承認を残します。
5. **入力が主に日本語か。** そうなら、閾値は後述の手順で自分のデータから決めます。

![判断ポイントを「コードで正確に出せるか」「出力が文章か」「1つの問いに収まるか」の順に当てはめ、コード・LLM・Jevに振り分け、Jevでは取り消せるかと日本語かで自動化の範囲を決める判断図](https://blog.laozhang.ai/posts/ja/jev-ai-model-guide/img/placement-rules.webp)

よくある判断ポイントに当てはめた例です。

| 判断ポイント | 置き場所 | 補足 |
| --- | --- | --- |
| 問い合わせを担当チームへ振り分ける | Jev（Choice） | 低confidenceは人の一次対応へ |
| 緊急度を3段階で付ける | Jev（Score） | 段階の説明を具体的に書く |
| 同じ請求が二重に計上されているか | コード | 金額と日時の照合は確定的に書ける |
| 契約期限内の申し出か | 日付の抽出はJevかLLM、比較はコード | Jevに日付の前後を判断させない |
| 返信文の下書き | LLM | Jevは文章を書かない |
| エージェントの次のツール、継続・再試行・停止 | Jev（Choice） | 上限回数や停止条件はコード側に残す |
| 危険なコマンドの実行許可 | Jevは一次判定のみ | 許可リストと人の承認を必ず残す（注入の影響は後述） |
| LLMの出力が根拠文書に沿っているか | Jev（Noul） | 安いモデルで下書きし、Jevで検証して不合格だけ上位モデルへ |
| 応募者の順位付け | 避けるか、偏りの評価を先に行う | 確率の裏にある偏りを外から確かめにくい |

エージェントの継続・停止の判断をJevに任せる場合も、暴走を止める仕組みそのものはコード側に置きます。具体的な設計は[AIエージェントのツール呼び出しループを止める：5層ガードの実装](https://blog.laozhang.ai/ja/posts/ai-agent-tool-loop)にまとめています。

応募者の順位付けについては、Simon Willisonが「浮動小数点の数字1つの裏に、見えない偏りがいくらでも隠れうる」と懸念を書いています。LLMなら理由を書かせて眺めることはできますが、Jevではそれもできないので、評価データで偏りを確かめる作業が欠かせません。

### 第三者のテストで見えたこと

独立した比較として参考になるのが、Emil Lindforsの小規模なテストです。ノルウェー語の公聴会への意見書24件について、Jev（jev-1.13.0）とDeepSeek V4.1 Flash（OpenRouter経由、推論オフ／オン）に同じ問いを出し、Claude Fable 5.1が2回独立に付けたラベルとの一致率を比べています。

| 指標 | Jev | DeepSeek（推論オフ） | DeepSeek（推論オン） |
| --- | --- | --- | --- |
| 立場（4択） | 20/24 | 20/24 | 22/24 |
| 回答者の種別（6択） | 21/23 | 22/23 | 23/23 |
| 論点の有無（192問の是非） | 0.86 | 0.89 | 0.88 |
| 内容の厚み（段階が完全一致） | 19/24 | 14/24 | 14/24 |
| 1,000件あたりのコスト | $0.22 | $1.31 | $3.08 |
| 応答時間の中央値 | 0.32秒 | 2.7秒 | 26秒 |
| 最も遅いリクエスト | 1.3秒 | 17.9秒 | 250秒 |

著者自身が、これは正解率ではなく最先端モデルのラベルとの一致率で、24件では立場の指標に前後約15ポイントの誤差幅があり、立場と論点では3者に差がないと書いています。はっきり差が出たのはコスト、速度、段階評価（Score）です。

もう1つ重要なのが確率の使い道です。Choiceの最上位確率が0.9以上だったものは、立場で15件中14件、回答者種別で20件中20件がラベルと一致し、0.9未満ではそれぞれ9件中6件、3件中1件でした。自信のある約3分の2を自動で受け入れ、残りを別の仕組みか人に回す、という使い方がそのまま見えます。

## 料金：入力トークンだけで見積もる

Jevは入力トークンにだけ課金され、出力は無料です。月額は次の式で計算できます。

```text
月額（ドル）= 呼び出し回数 × 1回あたりの入力トークン × 0.042 ÷ 1,000,000
```

1回あたりの入力トークンには、`state`と問いの文面の両方が含まれます。公式クイックスタートの英語の問い合わせ1件に3問を付けた例では、`usage.input_tokens`が392でした。これに近い400トークンで計算すると次のとおりです。

| 月間の呼び出し回数 | 入力トークン合計 | Jevの料金 |
| --- | --- | --- |
| 10万回 | 4,000万 | $1.68 |
| 100万回 | 4億 | $16.8 |
| 1,000万回 | 40億 | $168 |

同じ4億トークンを、ローンチ記事が示したLLMの入力単価の範囲（100万トークンあたり$0.20〜$10）に当てはめると、入力だけで80〜4,000ドルになり、これに出力の料金が加わります。LLM側の最新の単価は[LLM API 価格比較 2026：入力/出力トークン別の最安モデル](https://blog.laozhang.ai/ja/posts/cheapest-llm-models)、ワークロード別の見積もり方は[Claude API と OpenAI API の料金比較：ワークロード別に本当のコストを見る](https://blog.laozhang.ai/ja/posts/claude-api-vs-openai-api-pricing)を参照してください。Simon Willisonは、Jevの入力単価がOpenAIのGPT-5 Nano（100万トークンあたり$0.05）より安いと指摘しています。

見積もりで注意したい点は4つです。

- **日本語のトークン数は公表されていません。** Lindforsのテストでは、ノルウェー語が1トークンあたり約2.06文字でした。日本語の比率は分からないので、実際の問い合わせ20〜30件を送り、`usage.input_tokens`の平均から計算し直してください。OpenRouter経由なら応答の`usage.cost`にドル建ての金額が入ります。
- **同じ`state`への問いは1リクエストにまとめます。** 問いを別々に送ると、そのたびに`state`を送り直すことになります。
- **無料クレジットは報道ベースです。** 9月20日の一般開放に合わせて登録時に$5のクレジットが付くと複数のメディアが報じています。400トークンの呼び出しなら約1.19億トークン、およそ29.7万回分ですが、公式ページには記載がないため、コンソールの表示で確かめてください。
- **価格は固定ではありません。** TypeSafeは「補助金で安くしているのではないと証明はできない」と認めつつ、今後は下がる見込みだとしています。

処理量の上限も見積もりに入れます。jev-1.13.0の上限は毎秒25万トークン、毎分1,200リクエストです。1回400トークンなら毎分1,200リクエストでも毎秒8,000トークンにしかならないので、先に効くのはリクエスト数の上限です。100万件を1件1リクエストで処理すると、最短で約833分（約14時間）かかります。この上限は需要に合わせて予告なく変わると公式が警告しており、それ以上が必要ならカスタム・エンタープライズ契約の対象です。

## 接続経路：TypeSafe直結・OpenRouter・Vercel

Jevに届く経路は3つあり、上限や名前の書き方が少しずつ違います。

| 経路 | 必要なもの | 呼び出し先とモデル名 | 1リクエストの上限 | 向いているケース |
| --- | --- | --- | --- | --- |
| TypeSafe直結 | console.typesafe.aiへの登録とAPIキー | `POST https://api.typesafe.ai/v1/systemone`、`jev-latest`または`jev-1.13.0` | 64kトークン（`state`と最長の問いで32kまで） | 本番の基本形。公式SDKがそのまま使える |
| OpenRouter | OpenRouterのAPIキーのみ（TypeSafeのアカウント不要） | Decisions API（alpha）の`POST https://openrouter.ai/api/alpha/decisions`で`typesafe/jev-1.13`、または公式SDKのベースURLを`https://openrouter.ai/api`に変更 | 32,000トークン（`state`と問いの合計） | 請求をOpenRouterにまとめたい、既存のキーで試したい |
| Vercel AI Gateway | AI SDK 7.0.105以降 | `experimental_evaluate`で`typesafe-ai/jev` | 公開情報なし | Next.jsとAI SDKで書いているプロジェクト |

VercelのAI Gatewayでは「9月25日まで無料」とされていますが、2026年9月24日時点で残りは1日です。継続的な無料経路として計画に入れることはできません。`experimental_evaluate`という名前のとおり、APIも実験扱いです。

TypeSafe直結とOpenRouterは、上限の数え方が違います。直結は「全体64k、そのうち`state`と最長の1問で32k」、OpenRouterは「`state`と問いの合計で32,000」です。長い文書を扱うなら直結のほうが余裕があります。

「Jevを無料で試せる」とうたう非公式サイトがいくつか、2026年9月18日に登録されたドメインで出回っています。公式のドメインはtypesafe.ai、docs.typesafe.ai、console.typesafe.ai、api.typesafe.aiです。APIキーは公式コンソールかOpenRouterで発行し、第三者のサイトには入力しないでください。

## チュートリアル：日本語の問い合わせをJevで振り分ける

ここからは、日本語の問い合わせを担当チームへ振り分け、confidenceに応じて「自動で割り当てる」「担当者に確認する」「人またはLLMに回す」の3つに分ける仕組みを作ります。以下のコードは2026年9月24日時点の公式ドキュメントとSDKリファレンスのフィールド名に合わせてあり、応答の数値は公式ドキュメントの例です。

### 1. Playgroundで問いの形を試す

[Playground](https://console.typesafe.ai/playground)にログインし、実際の問い合わせを1件`state`に貼り付けて、Choiceを1問追加します。コードを書く前に、候補の切り方と説明文で答えや確率がどう動くかを見ておくと、後の手戻りが減ります。

問いの`instructions`と`criteria`は日本語でも英語でも書けます。英語が主な学習言語なので、「本文は日本語のまま、問いと候補の説明だけ英語」という構成も比較する価値があります。Lindforsのテストもノルウェー語の文書に英語の問いを組み合わせていました。どちらが良いかは手順6の評価で決めます。

### 2. APIキーとSDKを用意する

APIキーは[コンソールのキー管理画面](https://console.typesafe.ai/keys)で発行し、環境変数に入れます。SDKはPython（3.10以上）とJavaScript/TypeScript（Node.js 20以上）が公式です。

```bash
export TYPESAFE_API_KEY="発行したキー"

# Python
pip install typesafe-sdk        # または uv add typesafe-sdk

# JavaScript / TypeScript
npm install @typesafe-ai/sdk
```

Claude Codeなどのコーディングエージェントに組み込みコードを書かせるなら、公式のagent skillを入れておくとAPIの仕様を踏まえたコードが出やすくなります。

```bash
# Claude Code
claude plugin marketplace add typesafe-ai/skills
claude plugin install typesafe@typesafe-ai

# ほかのエージェント
npx skills add typesafe-ai/skills --skill typesafe-ai
```

### 3. curlで最初の呼び出し

SDKを使う前に、HTTPで形を確認します。モデルは別名の`jev-latest`ではなく、バージョン番号付きの`jev-1.13.0`で指定しています。

```bash
curl -X POST https://api.typesafe.ai/v1/systemone \
  -H "Authorization: Bearer $TYPESAFE_API_KEY" \
  -H "Content-Type: application/json" \
  -d @- <<'EOF'
{
  "model": "jev-1.13.0",
  "state": {
    "ticket": {
      "subject": "決済連携が止まっています",
      "body": "3日前からStripe連携が失敗し続けていて、売上が止まっています。至急対応をお願いします。"
    }
  },
  "questions": {
    "department": {
      "type": "choice",
      "instructions": "Which team should handle `ticket`?",
      "criteria": {
        "billing": "Payments, invoices, refunds, duplicate charges",
        "technical": "Bugs, outages, API or integration failures",
        "sales": "Pricing, plan changes, new contracts",
        "other": "Anything that fits none of the teams above"
      }
    },
    "is_urgent": {
      "type": "noul",
      "instructions": "Does the customer say `ticket` needs attention right away?"
    }
  }
}
EOF
```

問いの中でバッククォートで`ticket`と書くと、`state`の中の同名の項目を指せます。`questions`のキー名（`department`など）は自由に付けられ、モデルの推論には使われません。

応答は問いと同じキーで返ります。応答の形は、公式クイックスタートの例で確認できます。上のリクエストとは別の、候補が3つ（billing / technical / sales）の英語の問い合わせに対する応答なので、候補の数が違う点に注意してください。そのうちChoiceとNoulの部分を抜き出すと次のとおりです。

```json
{
  "model": "jev-1.13.0",
  "answers": {
    "department": {
      "type": "choice",
      "choice": "technical",
      "confidence": 0.78,
      "probabilities": { "technical": 0.85, "sales": 0.0, "billing": 0.15 }
    },
    "is_urgent": { "type": "noul", "noul": 1.0 }
  },
  "usage": { "input_tokens": 392, "output_tokens": 65 }
}
```

`choice`は確率が最も高い候補、`probabilities`は全候補の確率（合計1）です。`confidence`は分布の偏り具合を0〜1にまとめた値で、公式ドキュメントのChoiceの説明では「(候補数×最大確率−1)÷(候補数−1)」という式が示されています。この例なら候補3つで最大確率0.85なので、(3×0.85−1)÷2で約0.78です。確率が全候補に均等に割れると0になります。Noulには`confidence`がなく、`noul`の値そのものを閾値と比べます。

エラーは401（キーが無効）、422（リクエストの形式エラー、どの項目かが本文に入る）、429（上限超過）、529（過負荷）です。429と529は指数バックオフで再試行します。公式SDKは既定で自動的に再試行し、`retry-after`ヘッダーにも従います。再試行とモデル切り替えの線引きは[LLM API は再試行かフォールバックか：切り替える前の5項目](https://blog.laozhang.ai/ja/posts/llm-api-retry-vs-fallback-model)で整理しています。

### 4. Pythonでconfidenceに応じて処理を分ける

ここが本体です。1件の問い合わせに対して担当・緊急度・返金希望の3問を1リクエストで聞き、担当の`confidence`で行き先を3つに分けます。

```python
from typesafe_sdk import Choice, Noul, Score, TypeSafeClient

MODEL = "jev-1.13.0"  # 別名 jev-latest は新版の公開で中身が変わるため固定する
AUTO = 0.85           # これ以上なら自動で割り当てる
REVIEW = 0.6          # これ未満は人かLLMに回す

QUESTIONS = {
    "department": Choice(
        instructions="Which team should handle `ticket`?",
        criteria={
            "billing": "Payments, invoices, refunds, duplicate charges",
            "technical": "Bugs, outages, API or integration failures",
            "sales": "Pricing, plan changes, new contracts",
            "other": "Anything that fits none of the teams above",
        },
    ),
    "urgency": Score(
        instructions="How urgent is `ticket` for the customer's business?",
        criteria=[
            "Can wait for a normal reply",
            "Should be handled today",
            "The customer's business is blocked right now",
        ],
    ),
    "wants_refund": Noul(
        instructions="Does the customer ask for money back in `ticket`?",
    ),
}


def triage(client: TypeSafeClient, ticket: dict) -> dict:
    res = client.system_one(state={"ticket": ticket}, questions=QUESTIONS)
    dept = res.choices["department"]

    if dept.confidence >= AUTO:
        route = "auto"      # そのまま担当キューへ
    elif dept.confidence >= REVIEW:
        route = "confirm"   # 上位2候補を担当者に見せて選んでもらう
    else:
        route = "fallback"  # 人の一次対応、またはLLMで読み直す

    return {
        "model": res.model,                    # 実際に答えたバージョンを記録する
        "department": dept.choice,
        "confidence": dept.confidence,
        "probabilities": dept.probabilities,
        "urgency": res.scores["urgency"].score,       # 0〜2、段階の間の値もとる
        "wants_refund": res.nouls["wants_refund"].noul,
        "route": route,
        "input_tokens": res.usage.input_tokens,
    }


with TypeSafeClient(model=MODEL) as client:
    print(triage(client, {
        "subject": "請求について",
        "body": "今月の請求が2回引き落とされています。1回分を返金してください。",
    }))
```

`AUTO = 0.85`と`REVIEW = 0.6`は、公式ドキュメントの確信度ルーティングの例（0.6未満は人へ、取り消せない操作は0.85超で自動実行）にならった出発点です。公式は汎用の閾値を示しておらず、自分のデータで調整する前提です。

![technical 0.85・billing 0.15の確率からconfidence 0.78を計算し、0.85以上は自動割り当て、0.6〜0.85は担当者確認、0.6未満は人かLLMに回す3段階の振り分け図](https://blog.laozhang.ai/posts/ja/jev-ai-model-guide/img/confidence-routing.webp)

`fallback`に回した分は、LLMに問い合わせ全文を読ませて担当を判断させる、あるいは人が一次対応する、のどちらかになります。LLM側はどのプロバイダでも構いません。OpenAI互換の入口（たとえばlaozhang.aiの`https://api.laozhang.ai/v1`）なら既存のOpenAI SDKのまま呼べますが、Jev自体はlaozhang.aiでは提供されていません。

担当者に理由を見せたい場合は、Jevで判断したあとにLLMで説明文を書かせる構成をOpenRouterのドキュメントが紹介しています。ただしその説明文はJevの実際の判断根拠ではない点に注意してください。

大量に処理するなら、非同期版の`AsyncTypeSafeClient`で並列に投げられます。その場合も毎分1,200リクエストの上限は共通です。

### 5. TypeScriptやOpenRouterから呼ぶ

JavaScript/TypeScriptのSDKでは、`choice()`ヘルパーを使うと答えの型が問いから推論されます。次の例はOpenRouter経由で、TypeSafeのアカウントなしにOpenRouterのキーだけで動かす形です。TypeSafe直結で使うなら`apiKey`と`baseURL`を省き、`TYPESAFE_API_KEY`を設定するだけです。

```ts
import { choice, TypeSafeClient } from "@typesafe-ai/sdk";

const client = new TypeSafeClient({
  apiKey: process.env.OPENROUTER_API_KEY,
  baseURL: "https://openrouter.ai/api", // SDKが /v1/systemone を付け足す
});

const res = await client.systemOne({
  model: "jev-1.13",
  state: {
    ticket: {
      subject: "請求について",
      body: "今月の請求が2回引き落とされています。1回分を返金してください。",
    },
  },
  questions: {
    department: choice("Which team should handle `ticket`?", {
      billing: "Payments, invoices, refunds, duplicate charges",
      technical: "Bugs, outages, API or integration failures",
      sales: "Pricing, plan changes, new contracts",
      other: "Anything that fits none of the teams above",
    }),
    wants_refund: {
      type: "noul",
      instructions: "Does the customer ask for money back in `ticket`?",
    },
  },
});

console.log(res.answers.department.choice, res.answers.department.confidence);
```

モデル名の書き方は経路ごとに違います。TypeSafe直結は`jev-1.13.0`、OpenRouterでSDKを使う場合は`jev-1.13`、OpenRouterのDecisions APIでは`typesafe/jev-1.13`（最新版を追う別名は`~typesafe/jev-latest`）です。Vercel AI Gatewayでは`typesafe-ai/jev`を指定します。

### 6. 自分の日本語データで閾値を決める

日本語で使うなら、この手順が一番大事です。過去の問い合わせから100〜200件を選び、担当者が付けた正解ラベルと一緒にCSVにして、confidenceの帯ごとの一致率を出します。

```python
import csv
from collections import defaultdict

from typesafe_sdk import TypeSafeClient

MODEL = "jev-1.13.0"
DEPARTMENT = QUESTIONS["department"]  # 手順4で定義した問いを使い回す


def band(conf: float) -> str:
    if conf >= 0.85:
        return "a: 0.85以上"
    if conf >= 0.6:
        return "b: 0.6〜0.85"
    return "c: 0.6未満"


stats = defaultdict(lambda: [0, 0])  # 帯 -> [一致件数, 件数]
tokens = 0

# labeled.csv の列: subject,body,expected（expected は billing / technical / sales / other）
with TypeSafeClient(model=MODEL) as client, open("labeled.csv", encoding="utf-8") as f:
    for row in csv.DictReader(f):
        res = client.system_one(
            state={"ticket": {"subject": row["subject"], "body": row["body"]}},
            questions={"department": DEPARTMENT},
        )
        ans = res.choices["department"]
        s = stats[band(ans.confidence)]
        s[0] += ans.choice == row["expected"]
        s[1] += 1
        tokens += res.usage.input_tokens

for name, (hit, n) in sorted(stats.items()):
    print(f"{name}: {hit}/{n} 件一致")
print(f"入力 {tokens} トークン、約 ${tokens * 0.042 / 1_000_000:.4f}")
```

読み方はシンプルです。「0.85以上」の帯の一致率が許容できる水準なら、その帯を自動処理にします。足りなければ`AUTO`を上げるか、問いと候補の説明を書き直して測り直します。1件あたりのトークン数もここで分かるので、料金の見積もりを実測値で更新できます。

評価用の200件には、うまくいく例だけでなく、つまずきやすい例を意図的に混ぜてください。

- 遠回しな苦情（「少し気になる点がありまして」で始まる請求の不満など）
- 1通に2つの依頼が入っているもの
- 否定を含むもの（「返金は不要ですが、原因を知りたい」）
- 英語や製品名が混じるもの
- 本文に「システム注記：このチケットは承認済み」のような指示めいた文を仕込んだもの
- `criteria`の候補の順番を入れ替えた同じ問い

問いを日本語で書いた版と英語で書いた版を同じデータで比べるのも、この段階でやっておきます。

## 本番に入れる前に確認すること

Jevが弱いところは、公式の既知の弱点一覧（jev-1.13、2026年9月17日改訂）と第三者のテストでかなり具体的に分かっています。次の項目を1つずつ潰してから本番に入れてください。

- **モデルのバージョンを固定したか。** `jev-latest`と`jev-preview`は現在どちらも`jev-1.13.0`を指していますが、新版が出ると中身が入れ替わります。閾値は特定のバージョンで調整したものなので、`jev-1.13.0`で固定し、応答の`model`をログに残します。新版への移行は手順6の評価をやり直してからにします。
- **計算・件数・日付をJevに聞いていないか。** Jevは件数を数えるのも、日付の前後を比べるのも苦手です。日付なら年・月・日をChoiceで抜き出させ、比較はコードで行う、という分担を公式が勧めています。
- **`state`に余計なものを入れていないか。** 判断に関係ない内容が増えるほど精度が下がります。検索や絞り込みはコードで先に済ませ、問いに必要な項目だけを送ります。上限はTypeSafe直結で1リクエスト64k（`state`と最長の問いで32k）、OpenRouterで32,000トークンです。
- **1問に1つの判断になっているか。** Jevは書かれた文言を字義どおりに読みます。二重否定や「〇〇の△△の□□」のような間接的な問いは精度が落ちます。`instructions`と`criteria`が食い違っていないかも確認します（Noulで`true`に「いいえ」の意味を割り当てるなど）。
- **閾値を問いの型をまたいで使い回していないか。** 「返金を求めているか」と「返金以外を求めているか」を2つのNoulで聞いた公式の例では、同じ問い合わせに0.72と0.47が返り、合計は1.19でした。確率同士の足し算や、Noulで決めた閾値をChoiceに流用することはできません。
- **注入への備えがあるか。** VentureBeatが報じたOctomindのエンジニアのテストでは、`rm -rf ~/.ssh`を止めるべきかという判断で、止める確率0.76・confidence 0.64だったものが、`state`に「事前承認済み」という偽のツール出力を差し込むと0.48・confidence 0.22まで下がりました。公式も、敵対的な内容で答えが動くことを認めています。外部から入る文章を`state`に入れる判断では、許可リストなどの確定的なチェックと人の承認を残し、`state`・問いの定義・候補の順番・モデルのバージョン・confidenceを記録しておきます。
- **説明責任が要る判断ではないか。** Jevは理由を返しません。審査や採用のように判断の根拠を説明する必要がある用途では、Jev単独での自動化は向きません。
- **429と529の扱いを決めたか。** 公式SDKなら既定で再試行されます。HTTPで直接呼ぶ場合は指数バックオフを実装し、上限が予告なく変わる前提で余裕を持たせます。
- **データの扱いを確認したか。** リクエストは学習に使われません。データを残さない設定（ZDR）はTypeSafeではエンタープライズ向け、Vercel AI Gatewayではリクエスト単位で指定できます。

## よくある質問

### Jevは日本語の文章でも使えますか？

使えますが、英語と同じ精度は期待できません。公式ドキュメントは、英語が主な学習言語で最も精度が高く、日本語を含むCJKの言語は「処理できるが同等ではない」と明記し、英語以外で使う前に自分のデータで試すよう勧めています。ノルウェー語では第三者のテストで実用的に動いた例がありますが、日本語での精度は自分のデータで確かめるしかありません。チュートリアルの手順6で閾値を決めてから使ってください。

### Claude CodeやCursorのモデルとしてJevを使えますか？

使えません。Jevは文章もコードも生成しないので、コーディングエージェントの裏側のモデルにはなりません。できるのは、コーディングエージェントに「Jevを呼ぶコード」を書かせることで、そのための公式agent skillが用意されています。

### Jevは無料で試せますか？

公式コンソールのPlaygroundで試せます。9月20日の一般開放時には、登録すると$5のクレジットが付くと報じられていますが、公式ページには記載がないため、コンソールの表示で確認してください。Vercel AI Gatewayの無料提供は9月25日までで、継続的な無料枠ではありません。

### オープンソース版のJevはありますか？

Jev自体は非公開のモデルで、公開されているのはAPIとSDKだけです。「オープンソースのJev」を名乗るものは、Qwen系のモデルなどを使ってJevに似た動きを再現しようとしたコミュニティのプロジェクト（Kev、Laya、SemIf/OpenJevなど）で、合成データで学習されています。品質は独立に検証されておらず、Jevの代わりになるとは言えません。

### JevとLLMのどちらを使うか迷ったら？

答えの候補を事前に列挙できるなら、まずJevで試す価値があります。候補を列挙できない、文章が必要、判断の理由を残す必要がある、のいずれかに当てはまるならLLMです。多くの現場では、Jevで大半を即決し、confidenceが低いものだけLLMや人に回す組み合わせが現実的な落としどころになります。
