jev-playground

September 17, 2026 · View on GitHub

TypeSafe AI の System One モデル Jev を MoonBit から触るためのプレイグラウンド。 Jev は「文字列ではなく型付きの確率判断を返す」意思決定専用モデルです(unstructured state in, typed probabilistic decisions out)。

このリポジトリには次の 4 つの部品が入っています。

パッケージ内容
lib/Jev API クライアント(GET /v1/modelsPOST /v1/systemone、noul/choice/score 3 種の質問と型付き応答の JSON 変換)
cmd/jev単発質問 CLI(モデル一覧・state に対する型付き質問)
cmd/gomoku五目並べで Jev 同士を対戦させる CLI(毎手、盤面+着手候補を Jev に判断させる)
cmd/gomoku_gif対局ログ(各手の実測ミリ秒付き)を実時間再生の GIF に変換するツール

必要なもの

  • MoonBit ツールチェーン(moon 0.1.20260915 以降)
  • TypeSafe AI の API キー(早期アクセス)

セットアップ

export TYPESAFEAI_API_KEY=your_key_here
moon update   # 依存(tapi: moonbitlang/async, moonbitlang/x, mizchi/image, WGYo90/moonbit-gif)を取得

API キーはソースコードに書かず、環境変数 TYPESAFEAI_API_KEY か各 CLI の --api-key で渡します。

1. モデル一覧を確認

moon run --target native cmd/jev -- --models
# [{"name":"jev-latest",...},{"name":"jev-preview",...}]

2. 単発質問(コマンド/コマンドライン)

デモ(3 種の質問 — score / choice / noul — を 1 リクエストで並列評価):

moon run --target native cmd/jev -- --pretty

state を直接指定(テキスト or JSON 文字列):

moon run --target native cmd/jev -- --state "This email is a phishing attempt" --pretty
moon run --target native cmd/jev -- --state '{"amount": 299, "currency": "USD"}' --pretty

state と質問をファイルから:

moon run --target native cmd/jev -- --state-file state.json --questions-file questions.json

questions.json の形式(noul / choice / score を混在可能):

{
  "is_spam": {
    "type": "noul",
    "instructions": "This message is spam."
  },
  "tone": {
    "type": "choice",
    "instructions": "What is the tone of this message?",
    "criteria": {
      "polite": "Friendly and courteous",
      "neutral": "Calm and factual",
      "frustrated": "Angry or upset"
    }
  },
  "urgency": {
    "type": "score",
    "instructions": "How urgent is this request?",
    "criteria": ["Can wait", "Needs attention this week", "Needs attention today"]
  }
}

オプション: --model(既定 jev-latest)、--base-url--pretty--api-key

3. Jev vs Jev 五目並べ

moon run --target native cmd/gomoku --                     # 15x15 で 1 局
moon run --target native cmd/gomoku -- --board 9 --games 2 --verbose
moon run --target native cmd/gomoku -- \
  --player1 jev-latest --player2 jev-preview --board 15    # モデルを分けて対戦

毎手、盤面を state に、着手候補(石の近傍セル)を choice 質問の criteria として Jev に問い、 WINS / BLOCK / ライン長(3o = 3 連・片端オープン)のヒント付きで最良手を選ばせます。 API 失敗・不正手のときだけ組み込みフォールバック(勝ち手 > ブロック > 中央)を使います(統計に fallback moves と表示)。

主要オプション: --board N(1..15 推奨)、--games N--player1/--player2 <model>--verbose(毎手の盤面表示)、--log-path <file>(対局ログの JSONL を出力)

4. 対局を実時間 GIF 化

# 1. 対局をログ付きで実行(各手の実測ミリ秒を記録)
moon run --target native cmd/gomoku -- --board 15 --log-path game15.jsonl

# 2. ログから GIF を生成(フレーム遅延 = その手の実測時間 → 実時間再生)
moon run --target native cmd/gomoku_gif -- --log game15.jsonl --out gomoku.gif

生成例: gomoku.gif(362x362 / 26 フレーム / 約 47KB、再生総時間 ≈ 対局の実測時間)。

gomoku_gif のオプション: --scale(セル辺長 px)、--padding--hold-cs(最終フレーム表示、1/100 秒)、 --max-cs(フレーム遅延の上限)、--loop は未対応(GIF は常にループ再生)。

補足

  • 料金(2026-09 時点): 入力トークン $0.042 / MTok、出力トークン無料。15×15 の五目並べ 1 局で入力約 5.8 万トークン(≈ $0.0024)程度。
  • Jev の応答は毎回 1 回の POST /v1/systemone(約 0.5 秒/手)。
  • GIF エンジン(WGYo90/moonbit-gif)はバリデータ上は有効な GIF を出力しますが、同エンジンのデコーダーは自分の出力を再デコードできません(標準のブラウザ/ビューアでは再生可能)。
  • 参考: Jev に関する解説は Introducing System One Models & Jev(TypeSafe AI ブログ)、API 仕様は docs.typesafe.aihttps://api.typesafe.ai/openapi.json