はじめに
Qiitaの投稿キャンペーンあなたはもう試した?判断特化AI「Jev」で遊ぼう!で、Jevを知りました。
まずは触ってみよう、ということで、アカウント作成からPlayground、Pythonからの呼び出しまで試してみました。
この記事は2026年9月20日に試した記録です。
Jevの名前と読み方について
Jevは、公式ブログによると、経済学者ウィリアム・スタンレー・ジェヴォンズ(William Stanley Jevons)にちなんだ名前のようです。「Judgment Evaluation」のような略語ではなく、人名に由来するとのことです。理由までは、私が確認した範囲では書かれていませんでした。
読み方は、公式が発音を示している資料を見つけられませんでした。由来の人名が英語で「ジェヴォンズ」と読まれることから、Jevは「ジェヴ」に近いのではないかと思います。この記事では読みやすさを優先して、「ジェブ」と書くことにします。
なお、「System One」という呼び名は別の由来で、Kahnemanの「System 1(速い思考)」から来ているそうです。
参考:Introducing System One Models & Jev(TypeSafe AI Blog)
Jevとは? Smart if-statements?
アカウント登録の途中に表示された紹介文に、こんな言葉がありました。
Think: Smart if-statements.
賢いif文、ということでしょうか。うーん、わかるようなわからないような。
公式ドキュメントによると、JevはTypeSafe AIの判断に特化したモデルです。判断材料となる State と、判断してほしい Questions を渡すと、プログラムから扱える形式で結果が返ってきます。
質問には、次の3種類があります。
| 種類 | できること | 今回試す例 |
|---|---|---|
| Choice | 選択肢から選ぶ | 攻撃・回復・撤退のどれにするか |
| Score | 指定した基準で採点する | 現在の危険度 |
| Noul | ある事柄が真である確率を0〜1で返す | 今すぐ回復が必要か |
説明だけではまだピンと来ないので、とりあえずやってみます。
アカウントを作る
TypeSafe AIの右上にある Join Waitlist から登録しました。
私の場合は1日も待たずに、team@updates.typesafe.ai から 「TypeSafe AI: Your account is ready」 という件名のメールが届きました。
比較的早く届いたのは、アンケートに答えたからなのかもしれません。違うのかもしれません。関係があるかどうかはわかりません。
メール内の Create your account からアカウントを作りました。招待メールのリンクは個人用なので、この記事には掲載していません。通常のログイン先はTypeSafe AIのコンソールです。
公式Quick startを試す
公式Quick startに従って、Playground と Code it: the Python SDK をそのまま実行してみました。
問い合わせの文章を渡して、担当部署や不満の度合い、緊急性を判断させるサンプルです。説明どおりの判断結果が得られました。
Playgroundでは、質問を「このメッセージは緊急性を示していますか?」にしたまま、判断材料のStateを変えてみました。
| State(実際に入力した英文) | 日本語訳 | 緊急性がある確率 |
|---|---|---|
| Hi, I've been trying to connect my Stripe account for 3 days and the integration keeps failing. I'm losing sales. Please help ASAP. | 3日前からStripeのアカウントを接続しようとしていますが、連携が失敗し続けています。売上を逃しています。至急助けてください。 | 98% |
| Everything is working well. I'd like to know how to change the button color whenever you have time. There is no rush. | すべて順調に動いています。お時間のあるときに、ボタンの色を変える方法を教えてください。急ぎではありません。 | 3% |
ここでの98%は「緊急度が100点満点で98点」という採点ではなく、「この文章が緊急性を示している」という判断の確率です。
なるほど。質問を固定して、判断材料を変えると、結果が変わるのですね。Pythonからも呼び出せたので、次は自分で別の題材を試してみます。
ゲームの状況を判断させてみる
次は、問い合わせではなく、ゲームの状況を判断させてみます。
HPが20%の場合:battle_decision.py
判断材料は次の3つです。
- プレイヤーのHPは20%。
- 敵が近くに3体いる。
- 回復アイテムを1個持っている。
質問は「次に取る行動」「現在の危険度」「今すぐ回復する必要があるか」です。
battle_decision.pyとして、次のコードを実行しました。
from typesafe_sdk import Choice, Noul, Score, TypeSafeClient
# 1. 判断材料となる状態(State)を定義
state = (
"プレイヤーのHPは20%。敵が近くに3体いる。\n"
"回復アイテムを1個持っている。"
)
# 2. 判定させたい質問群(Questions)を定義
with TypeSafeClient(model="jev-latest") as client:
response = client.system_one(
state=state,
questions={
# Choice: 選択肢から1つ選ぶ
"next_action": Choice(
instructions="次に取る行動は?",
criteria={
"heal": "回復アイテムを使ってHPを回復する",
"retreat": "敵から距離を取って退避する",
"attack": "近くの敵を攻撃する",
},
),
# Score: 尺度(段階)でスコアリングする(0〜N-1)
"danger_level": Score(
instructions="現在の危険度は?",
criteria=[
"低:差し迫った脅威がなく、安全に行動できる",
"中:脅威があり、注意して行動する必要がある",
"高:倒される危険が高く、直ちに対処する必要がある",
],
),
# Noul: Yes / No の確率(0.0〜1.0)
"need_healing": Noul(
instructions="今すぐ回復する必要がある?",
criteria={
"true": "今すぐ回復する必要がある",
"false": "今すぐ回復する必要はない",
},
),
},
)
# 3. 結果の取得(プログラムでそのまま扱える型付きデータ)
print("次に取る行動:", response.choices["next_action"].choice)
print("選択の確信度:", response.choices["next_action"].confidence)
print("各選択肢の確率:", response.choices["next_action"].probabilities)
print("現在の危険度スコア:", response.scores["danger_level"].score)
print("今すぐ回復が必要な確率 (Yes):", response.nouls["need_healing"].noul)
uv run battle_decision.py
次に取る行動: heal
選択の確信度: 0.7
各選択肢の確率: {'retreat': 0.2, 'heal': 0.8, 'attack': 0.0}
現在の危険度スコア: 2.0
今すぐ回復が必要な確率 (Yes): 0.82
HPが20%で敵が3体。回復アイテムを持っているので、回復を選ぶのは納得です。
HPだけ95%に変える:battle_decision_high_hp.py
battle_decision.pyをコピーしてbattle_decision_high_hp.pyを作りました。変更したのはStateのHPだけです。質問や判断基準は同じです。
state = (
- "プレイヤーのHPは20%。敵が近くに3体いる。\n"
+ "プレイヤーのHPは95%。敵が近くに3体いる。\n"
"回復アイテムを1個持っている。"
)
uv run battle_decision_high_hp.py
次に取る行動: attack
選択の確信度: 0.3
各選択肢の確率: {'heal': 0.12, 'retreat': 0.35, 'attack': 0.53}
現在の危険度スコア: 1.02
今すぐ回復が必要な確率 (Yes): 0.18
結果を比較する
| 項目 | battle_decision.py:HP 20% | battle_decision_high_hp.py:HP 95% |
|---|---|---|
| 次に取る行動 | heal(回復) | attack(攻撃) |
| 選択の確信度(confidence) | 0.7 | 0.3 |
| 回復を選ぶ確率 | 80% | 12% |
| 撤退を選ぶ確率 | 20% | 35% |
| 攻撃を選ぶ確率 | 0% | 53% |
| 現在の危険度スコア | 2.0 | 1.02 |
| 今すぐ回復が必要な確率 | 82% | 18% |
HPを95%にすると、回復の必要性が下がり、選ぶ行動が回復から攻撃に変わりました。思ったとおりの結果が出ている気がします。
危険度の基準は、コードでは0:低、1:中、2:高の順に指定しています。今回の結果は2.0から1.02に下がりました。Scoreは、このように小数で返ることもあります。
一方、HPが95%でも攻撃の確率は53%で、撤退も35%あります。「HPが高いから絶対に攻撃」という結果にはなりませんでした。
また、confidenceと各選択肢の確率は別の値です。今回も「攻撃の確率は0.53、選択の確信度は0.3」と返っています。同じものとして読み替えないようにしたいです。
今回はそれぞれの実行結果を比較しただけで、繰り返し実行した評価ではありません。また、jev-latestを使っているため、今後も同じ数値になることを保証するものではありません。
ところで、料金は?
途中で「料金はかからないの?」と気になり、Billingを確認しました。
私のアカウントには、次のクレジットが付与されていました。
| 項目 | 画面の表示 |
|---|---|
| クレジット | Monthly credit |
| 付与額 | $5.00 |
| 付与日 | 2026年9月20日 |
| 有効期限 | 2026年10月20日(UTC) |
| 自動チャージ | Off |
| 購入履歴 | なし |
クレジットカードは登録していません。今回はこの付与クレジットで試せました。「Monthly credit」という表示でしたが、今後の付与条件までは確認していません。
試したあとにUsageを開くと、次の表示でした。
| 項目 | 表示値 |
|---|---|
| Spend | $0.0001 |
| Tokens | 1,771 |
| Requests | 4 |
画面には、入力100万トークンあたり$0.042で概算、出力は無料と表示されていました。
これは利用額の見積もりで、カードへの請求額ではありません。また、画面に「Stats may be delayed」とあるため、上記はスクリーンショットを撮った時点で反映されていた値です。この記事で試した全実行が集計済みとは限りません。
付与クレジットや料金は、利用時のコンソールで確認してください。
おわりに
最初は「Smart if-statements」と言われても、わかるようなわからないような感じでした。
実際に触ってみると、判断材料と質問を渡して、選択・スコア・確率を受け取る、という基本がわかりました。
今回なら、Jevが返したhealやattackを使って、プログラム側で処理を分岐できます。回復アイテムを使う処理や攻撃する処理そのものは、自分のコードで実装するわけです。
そこまでつなげると「Smart if-statements」のイメージが、少し湧いてきました。
まずは公式Quick startをそのまま動かして、Stateだけ変えてみる。初めての体験として、ここまで試してみました。

