Jev 互換 API で判定する(decide / lait decide)
TypeSafe Jev 互換の判定 API に yes/no・選択・スコアの質問を送り、確率つきの答えをワークフローの分岐などに使う方法。
Jev は TypeSafe AI の
「System One」モデルです。文章を生成する代わりに、1つの状態(state)について、あらかじめ
型を決めた質問に確率つきで答えます。lait はこの判定 API(POST /v1/systemone)と、それと
互換のサーバー(オープンモデルによる再実装やモックサーバーなど)に対応しています。
- ワークフローの
decide:ステップ — 流れてきた値をstateとして送り、答えをステップの値にします。switchと組み合わせたルーティングや 分類に使えます。 lait decide— 同じ質問定義をコマンドラインから1回だけ投げて、結果を JSON で表示します。質問を試しながら作るのに使えます。
接続先の設定(jev:)
lait.config.yml のトップレベルに jev: を書きます。チャット用のトップレベル
base_url/api_key とは独立しています(OpenAI 互換のチャット API は /systemone を
提供しないため、フォールバックもしません)。
# lait.config.yml
jev:
base_url: https://api.typesafe.ai/v1 # 省略時の既定値
api_key: "${TYPESAFE_API_KEY}"
model: jev-latest # 省略時の既定値
| フィールド | 既定値 | 内容 |
|---|---|---|
base_url |
https://api.typesafe.ai/v1 |
API のベース URL。リクエストは {base_url}/systemone に送られます。他の base_url と同じく、末尾はバージョン(/v1)までです。 |
api_key |
なし | Authorization: Bearer <key> として送る API キー。未設定ならヘッダーを送りません(認証なしのローカルサーバー向け)。 |
api_key_cmd |
なし | API キーを外部コマンドから取得します(設定ファイルと同じ形式)。api_key と同時には指定できません。 |
model |
jev-latest |
リクエストの model。ステップの model: や --model で上書きできます。 |
base_url/api_key には ${VAR_NAME} による環境変数参照が使えます。グローバル設定と
プロジェクト設定の両方に jev: がある場合はフィールドごとにプロジェクト側が優先され、
api_key/api_key_cmd はトップレベルと同じく組として扱われます。
質問の書き方
質問は「質問 id → 定義」のマッピングです。decide: ステップと lait decide -q の
ファイルで同じ形を使います。
urgent:
type: noul
instructions: 今日中に対応が必要か
criteria:
true: 今日中に対応が必要
false: 後回しでよい
team:
type: choice
instructions: どのチームの担当か
criteria:
billing: 支払い・請求書
sales: null # 名前だけで十分なら null
anger:
type: score
criteria: [落ち着いている, 不満がある, 非常に怒っている]
type |
答え | criteria |
|---|---|---|
noul |
はい/いいえの確率(noul: 0〜1) |
省略可。true/false の説明(片方だけでも可) |
choice |
選ばれた選択肢(choice)と各選択肢の確率(probabilities)、confidence |
必須。選択肢名 → 説明のマッピング(2〜255個、説明は null 可) |
score |
期待値(score = Σ i·pᵢ)、各レベルの確率(probabilities、キーは "0"〜)、legend、confidence |
必須。低い順に並べたレベルの説明のリスト(2〜10個) |
instructionsとそれぞれの説明には、文字列だけでなくマッピングやリストも書けます。- 未知のフィールド、選択肢やレベルの数の超過、
scoreのcriteriaをマッピングで書く、 といった誤りは、リクエストを送る前(ワークフローの読み込み時・lait lint時)にエラーに なります。 - YAML で
true:/false:と書いたキーは真偽値として読まれますが、lait が文字列の"true"/"false"に変換して送ります。
ワークフローの decide: ステップ
# triage.yml
inputs:
ticket: { type: object }
steps:
- id: triage
input: $inputs.ticket # これが state として送られる
decide:
urgent:
type: noul
instructions: 今日中に対応が必要か
team:
type: choice
criteria:
billing: 支払い・請求書
sales: null
- switch:
- when: .urgent.noul > 0.8 and .team.confidence > 0.5
steps:
- prompt: "{{ steps.triage.team.choice }} チーム向けにエスカレーション文を書いてください: {{ inputs.ticket }}"
else:
- jq: '"queue"'
| フィールド | 内容 |
|---|---|
decide |
質問の定義(前節の形式)。必須です。 |
model |
このステップだけで使う Jev のモデル名。jev.model より優先されます。models: の alias や default.model(チャットモデル用)とは無関係です。 |
- ステップへの入力(
input:で計算した値、省略時は流れてきた値)がstateになります。 文字列・オブジェクト・配列はそのまま送り、数値や真偽値はテキスト形式にして、nullは 空文字列にして送ります。 - ステップの値は応答の
answersオブジェクトで、キーの順序は質問の宣言順です。$steps.triage.team.choiceや.urgent.noulのように参照できます。 - 共通フィールド(
id/when/input/output/retry/timeout/on_error)が使えます。decideはモデル呼び出しなので、default.retry/default.timeoutも適用されます。 lait run --dry-runでは質問 id と型、lait graphでは質問 id がノードに表示されます。
lait decide
lait decide -q questions.yml "請求が二重に発生しています"
echo '{"subject": "返金", "body": "二重請求"}' | lait decide -q questions.yml --json
| オプション | 内容 |
|---|---|
-q, --questions <FILE> |
質問定義の YAML/JSON ファイル(必須)。 |
STATE |
判定対象。省略するか - を渡すと標準入力から読みます(引数と標準入力の両方があれば連結されます)。 |
--json |
STATE を JSON としてパースして送ります(既定は文字列のまま)。 |
--model <MODEL> |
Jev のモデル名(既定は jev.model、未設定なら jev-latest)。 |
--full |
answers だけでなく、サーバーの応答全体(model/answers/usage)を表示します。 |
--base-url <URL> / --api-key <KEY> |
jev: の設定を上書きします(${VAR_NAME} は展開されません)。 |
出力は整形済みの JSON です(既定では質問の宣言順に並べた answers)。
エラーと応答の検査
- HTTP ステータスが 2xx 以外のときは、応答の
detail.message(認証エラーなど)やdetail[].msg(422 の検証エラー)をエラーメッセージに含めて失敗します。 - 応答に
answersがない、質問に対応しない答えがある・足りない、答えのtypeが質問と 違う、型ごとの値(noul/choice/score)が欠けている場合もエラーになります。 - それ以外のフィールド(
probabilities、confidence、x_で始まる拡張フィールドなど)は 検証も再計算もせず、そのまま渡します。confidenceの計算式はサーバー実装によって異なる ことが知られているので、しきい値はサーバーごとに調整してください。 - タイムアウトは他の LLM リクエストと同じ 1 回 300 秒です。HTTP レベルの自動再試行は
しないため、再試行が必要ならステップの
retry:を使ってください。
制約(v1)
--show-usage・lait history・--trace-fileには記録されません。応答のusageはlait decide --fullで確認できます。- レスポンスのディスクキャッシュ(
--cache)の対象外です。 --record/--replay・lait testのカセットには記録されません。--replay中にdecide:ステップを実行するとネットワークに出ずにエラーになります。lait testで ワークフローを検証したい場合は、decideステップにwhen:を付けて入力で切り替えるなど してください。lait doctorはjev.base_url/jev.api_keyの環境変数参照だけを検査し、Jev サーバーへの 接続確認はしません。