Jev
Jev は、TypeSafe AI の判断のためのモデルです。文章は書かず、渡されたものについての型の付いた質問に、どれだけ確かかを添えて答えます。jev のタスクは、タスクの結果の型が求める質問を一回のリクエストで Jev に尋ね、その型の値を受け取ります。この結果は、ほかのタスクの結果と同じく match で分岐に使うことも、規則に渡すこともできます。確信度が足りない答えは、タスクが名前を付けたエラーで呼び出しを失敗させるので、フローはそのエラーを呼び出したところで処理します。
問い合わせの例は、問い合わせの種類を Jev に選ばせ、Jev が確信を持てないときは、エージェントがほかのことと一緒に読んだ種類を使います (examples/inquiry)。
task 種類を選ぶ(本文: string) -> 振り分け.種類
jev "この問い合わせの種類はどれか"
返品 "商品を返したい、交換したい"
配送 "荷物が遅れている、届かない、壊れていた、どこにあるか知りたい"
請求 "請求、支払い、返金のこと"
その他 "上のどれでもない"
model "jev-1.13.0"
confidence 0.8 else 迷い
timeout 10 seconds
retry 2 times every 1 second
flow
…
let 種類 = 種類を選ぶ(本文: 問い合わせ.本文)
on 迷い, failure => let 種類 = 読み.種類
let 判定 = 振り分け(種類: 種類, 会員: 問い合わせ.会員)
結果の型が質問になる
| タスクの結果 | Jev に尋ねること | 結果になる値 |
|---|---|---|
列挙で、jev "<質問>" |
列挙の値からの選択(choice)。下に、値ごとの意味を書く。書かなかった値は意味なしで送る | Jev が選んだ値 |
列挙で、jev score "<質問>" |
段階(score)。列挙の値を低い段階から順に並べ、すべてに意味を書く(2 から 10 段階) | Jev の答えにいちばん近い段階。ちょうど真ん中なら上の段階 |
bool で、jev "<質問>" |
はいかいいえ(noul)。下に true と false の意味を、両方書くか、どちらも書かない |
はいの確率が半分を超えれば true |
レコードで、jev だけ |
フィールドごとに上のどれかを尋ねる。すべて一回のリクエストで尋ねる | 答えを並べたレコード |
引数は、引数ごとに一つのフィールドにして、Jev への入力(state)として渡します。Jev は、選択の値を名前と意味で見分け、score の段階を書いた意味だけで見分けます。意味は「どれくらい」ではなく、Jev が当てはめられる具体的な場面として書きます。
レコードのフィールドには、ほかのフィールドの答えの確信度を率で受け取らせることもできます。審査の例は、申込がどの段階に当たるかを Jev に答えさせ、その確信度を規則に渡します (examples/review)。
record 採点
判断 : 方針.判断
確信度 : rate[step 1%] range >=0 <=100
task 採点する(用途: string) -> 採点
jev
判断 score "資金は、どれだけはっきり事業に使われるか"
却下 "私用や投機、法に反することに使う"
保留 "事業に使うが、何に払うのかがはっきりしない"
承認 "仕入れ、設備、人件費、店舗など、事業のはっきりした費目に使う"
確信度 confidence of 判断
model "jev-1.13.0"
rate[step 1%] は 1% 刻みの個数で、端数は切り捨てます。確信度 0.87 なら 87 です。rulec の率も同じ形でやりとりするので、この値はそのまま規則に渡せます。
Jev は文章を書かないので、それ以外の型の結果はエラーにします (tests/fixtures/jev.flow)。
どれだけ確かなら使うか
選択と段階の答えには、Jev がどれだけ確かかを表す確信度(confidence、0 から 1)が付きます。TypeSafe が確率の散らばり方から計算した値です。はいかいいえの答えにはこの数が無いので、dandori は、選んだ答えの確率をそのまま確信度とみなします。はいの確率が 0.9 なら「はい」で確信度 0.9、0.3 なら「いいえ」で確信度 0.7 です。
confidence 0.8 else 迷い と書くと、確信度が 0.8 に届かない答えが一つでもある呼び出しは、エラー 迷い で失敗します。このエラーはこの行で宣言したことになります。フローは、ほかの宣言したエラーと同じく、呼び出したところで処理し、検査もそれを確かめます。尋ね直しても Jev はほぼ同じように答えるので、retry の対象にはなりません。
答えを使ってよい確信度が、その答えで何をするかによって違うときは、確信度を規則に渡し、規則の表で決めます。審査の例の規則は、90% 以上ならそのまま承認し、80% 以上ならそのまま却下し、それ以外は人に回します。表に抜けがないことは、rulec が確かめます。
let 結果 = 採点する(用途: 申込.用途)
on failure => fail 採点不能 "申込 {申込.id} を採点できませんでした"
let 判定 = 方針(判断: 結果.判断, 確信度: 結果.確信度)
match 判定.決定
承認, 却下 => pass
人に回す =>
table 決め方(act)
policy unique
| 判断 | 確信度 | -> 決定 |
| 承認 | >=90% | 承認 |
| 承認 | <90% | 人に回す |
| 却下 | >=80% | 却下 |
| 却下 | <80% | 人に回す |
| 保留 | - | 人に回す |
確信度の意味は Jev のバージョンごとに違うので、確信度の下限を書くタスクや確信度を受け取るタスクには、合わせたバージョンを書きます。jev-latest と jev-preview はエイリアスで、何もしなくても新しいバージョンに移るので、検査が警告します。
どこへ送るか
どのプラットフォームも、同じリクエストを送ります。入力(state)、モデル、質問を、https://api.typesafe.ai/v1/systemone に POST します。答えの読み方も、どのプラットフォームでも同じです。
- Step Functions では、HTTP Task から送ります。TypeSafe の API キーは、タスクの
connectionに書いた EventBridge の接続に、ヘッダAuthorization: Bearer <キー>として置きます。HTTP Task が一回のリクエストを待てるのは 60 秒までなので、それを超えるtimeoutはビルドできません(E050)。 - ほかのプラットフォーム向けに生成したコードは、
Transportを通して送ります。キーはTYPESAFE_API_KEYから読むか、Transportのtypesafeオプションで渡します。
TypeSafe の API は、エラーを HTTP ステータスで伝えます。レート制限に達すると 429、混み合っていると 529 です。名前で処理したりリトライしたりしたいものは、errors 混雑 = 429, 過負荷 = 529 のように宣言します。宣言していないステータスは failure になります。答えが無いときや、答えが質問に合わないとき(列挙に無い値や、確信度の無い選択)は、結果が型に合わないので、ほかのタスクの型に合わない結果と同じく実行を終えます。
使う前に
- Jev は 2026 年 9 月の時点で早期アクセスで、API はまだ変わるかもしれません。
- TypeSafe によれば、Jev がいちばん正確なのは英語です。日本語などほかの言語も扱えますが、精度は落ちます。自分の文章で試してください。2026 年 9 月 29 日に jev-1.13.0 で試したときは、種類のはっきりした問い合わせは、英語でも日本語でも確信度 0.99 以上で正しい種類になりました。一方、「靴のサイズが合わないので、代金を返してほしいです」は
請求で確信度 0.36(返品が 0.48)でした。同じ内容の英語はreturnsで 0.96 です。confidence 0.8なら、この問い合わせはエージェントが読んだ種類に回ります。 - Jev は計算、数を数えること、日付の比較が苦手です。それはコードや規則に任せ、Jev には判断だけを尋ねます。
- テストでは、Jev の呼び出しにテスト用の
Transportが TypeSafe の API リファレンスにある形の答えを返し、既定のTransportが送るリクエストはこのマシンの中で確かめます。TYPESAFE_API_KEYがあれば、Jev のタスクを一つずつ本物の TypeSafe にも送ります(どうやって確かめているか)。