Jevからの乗り換え · API移行チェックリスト

Jevから乗り換えるための実践チェックリスト

TypeSafe Jevの既存の連携を、Decision ModelsのJev互換APIへ移行します。設定の確認、リクエストのテスト、トラフィックの慎重な切り替えを行いましょう。

JevはTypeSafe AIの製品です。Decision ModelsはTypeSafe AIとは提携していません。

APIキーを取得EUティアを見る

トラフィックを切り替える前に

  1. 既存の連携を洗い出す

    現在の設定と、代表的なテストケースを保存します。質問タイプ、選択肢、画像、回答の解析、再試行を確認してください。意図的にロールバックできるよう、以前のプロバイダーの設定も残しておきます。

  2. ベースURLとパスを設定する

    ベースURLには https://api.decisionmodels.io を、テキストには POST /v1/systemone を使います。クライアントがパスを自動で補う場合は、既存の /v1 のサフィックスを削除してください。実際に送信されるパスを確認します。

  3. 別のAPIキーを作成する

    ダッシュボードでDecision Modelsのキーを作成し、Authorization: Bearer として送ります。TypeSafeのキー、残高、アカウントは引き継がれません。キーは環境変数に保管してください。

  4. モデルIDを置き換える

    TypeSafeのモデルIDを、利用可能なDecision ModelsのID(たとえば s1-fast)に置き換えます。TypeSafeのエイリアスをそのまま使わず、GET /v1/models で確認してください。

  5. 処理リージョンを明示的に選ぶ

    たとえば S1-Region: eu を設定します。値は eu または global で、キーの権限に従います。ヘッダーがない場合は、キーの初期設定が適用されます。EUのリクエストはEU内にとどまります。EU域外でのPeer-to-Peer処理には、キーでの全世界処理への同意が必要です。処理内容と契約条件をご確認ください。

  6. モデルの上限に合わせて質問を分割する

    s1-pro は1リクエストあたりテキストの質問を最大3件、s1-fast は1件、s1-vision は1件まで受け付けます。超過分の質問は、ご自身で分割してください。サービスが黙って分割したり破棄したりすることはなく、超過した質問には 400 request_limit_exceeded が返ります。以下のトークン数と選択肢数の上限もあわせて確認してください。

  7. 質問タイプと画像を確認する

    state と、質問名をキーにした questions オブジェクトはそのまま維持します。以下の criteria の形式を使ってください。画像には、POST /v1/multimodal 経由で s1-vision を使い、images 配列にちょうど1枚の画像を入れます。PNG、JPEG、WebPのデータURLまたは公開HTTPS URLに対応しており、デコード後で4 MiB、2,000,000ピクセルまでです。以下のテキストの例では、画像リクエストはテストしていません。

  8. 回答と利用量の集計を読み取る

    結果は、質問名ごとに answers の下から読み取ります。usage.input_tokens、usage.output_tokens、usage.decisions、報告された model_version を記録してください。トークン数はモデルが数えた値で、画像リクエストでは画像位置も含まれます。金額にはダッシュボードの利用レシートを使い、文字数を課金対象のトークンに換算しないでください。

  9. エラー、再試行、ロールバックをテストする

    無効なキー、クレジット不足、モデルの上限、レート制限、タイムアウトをテストします。以下のエラーコードを使ってください。ご自身のケースで結果を評価し、受け入れテストの後にトラフィックを切り替えます。ローカルでのAPI仕様のテストは、モデルの品質や本番環境での可用性を保証するものではありません。

質問タイプと現在の入力上限

モデル質問あたりの入力トークン数質問数選択肢数
s1-fast8,000116
s1-pro8,192364
s1-vision8,000126

各質問には、state、criteria、プロンプトテンプレートが含まれます。s1-visionでは、画像位置も数えます。入力上限の全体をご確認ください。

移行で変わること

2026年10月27日に確認しました。日付付きのJev代替の比較と移行に関する注意が、互換性の境界を定めています。キー、モデルID、処理ティア、課金、上限、メタデータ、エラーはそれぞれ別です。モデルを切り替える場合は、ご自身で出力を評価する必要があります。バイト単位での互換性は主張していません。

当社のスコアルーブリックは2段階以上が必須ですが、TypeSafeが公開しているスキーマは1段階も受け付けます。超過した質問は、再試行できないエラーになります。

Idempotency-Key を指定すると、処理中のリクエストには 202 in_progress が返ります。精算後、または精算結果が不確定な間は、409 idempotency_replay_unavailable がレシート付きで返り、二重課金は発生しませんが、保存された回答はありません。回答も課金もない失敗が確認された場合は、同じキーと本文で再試行できます。同じキーで本文が異なる場合は 409 idempotency_conflict が返ります。新しいキーは、意図的に新しい推論を行う場合にのみ使ってください。

テスト済みのテキストの例

以下の各ファイルは、当社が公開しているAPI仕様を再現した、隔離されたローカルHTTPモックに対して、変更なしで実行しました。メソッド、パス、Bearer認証、S1-Region、JSON本文、そして利用量とmodel_version付きの模擬回答の読み取りを確認しています。本番環境への推論リクエストは行っていません。

DECISIONMODELS_API_KEY にご自身のキーを設定してください。任意の DECISIONMODELS_BASE_URL でローカルのモックを指定できます。指定しない場合は、公開APIのベースURLが使われます。Pythonの例には、Python 3.10 と、記載したバージョンのパッケージが必要です。fetchの例はJavaScript互換のTypeScriptで、Node.js 20.19.4 で実行しました。

LiteLLMは typesafe/ のプロバイダープレフィックスを取り除き、モックには s1-fast が届きました。テストしたのはOllamaのPythonクライアントのみで、CLIはテストしていません。型付きSDKは model_version などの追加メタデータを破棄する場合があります。HTTPを直接呼ぶ例では、保持されます。

curl 7.81.0

2026年10月27日、当社が公開しているAPI仕様に対して curl 7.81.0 でテスト済み

curl.sh
curl --fail-with-body --silent --show-error --max-time 15 \
  "${DECISIONMODELS_BASE_URL:-https://api.decisionmodels.io}/v1/systemone" \
  -H "Authorization: Bearer $DECISIONMODELS_API_KEY" \
  -H 'Content-Type: application/json' \
  -H 'S1-Region: eu' \
  --data '{"model":"s1-fast","state":"Mia owns a red bicycle.","questions":{"color":{"type":"choice","instructions":"Which color is the bicycle?","criteria":{"red":null,"blue":null}}}}'

Python requests 2.32.5

2026年10月27日、当社が公開しているAPI仕様に対して Python requests 2.32.5 でテスト済み

requests.py
import os
import requests

base = os.environ.get("DECISIONMODELS_BASE_URL", "https://api.decisionmodels.io")
response = requests.post(
    base + "/v1/systemone",
    headers={
        "Authorization": "Bearer " + os.environ["DECISIONMODELS_API_KEY"],
        "S1-Region": "eu",
    },
    json={
        "model": "s1-fast",
        "state": "Mia owns a red bicycle.",
        "questions": {"color": {
            "type": "choice",
            "instructions": "Which color is the bicycle?",
            "criteria": {"red": None, "blue": None},
        }},
    },
    timeout=15,
)
response.raise_for_status()
print(response.json())

Node.js fetch 20.19.4

2026年10月27日、当社が公開しているAPI仕様に対して Node.js fetch 20.19.4 でテスト済み

fetch.ts
// JavaScript-compatible TypeScript; native fetch in Node.js.
const base = process.env.DECISIONMODELS_BASE_URL ?? "https://api.decisionmodels.io";
const response = await fetch(`${base}/v1/systemone`, {
  method: "POST",
  headers: {
    "Authorization": `Bearer ${process.env.DECISIONMODELS_API_KEY}`,
    "Content-Type": "application/json",
    "S1-Region": "eu",
  },
  body: JSON.stringify({
    model: "s1-fast",
    state: "Mia owns a red bicycle.",
    questions: { color: {
      type: "choice",
      instructions: "Which color is the bicycle?",
      criteria: { red: null, blue: null },
    } },
  }),
  signal: AbortSignal.timeout(15000),
});
if (!response.ok) throw new Error(`HTTP ${response.status}: ${await response.text()}`);
console.log(await response.json());

LiteLLM 1.106.4

2026年10月27日、当社が公開しているAPI仕様に対して LiteLLM 1.106.4 でテスト済み

litellm.py
import os
import litellm

response = litellm.systemone(
    model="typesafe/s1-fast",
    api_base=os.environ.get("DECISIONMODELS_BASE_URL", "https://api.decisionmodels.io"),
    api_key=os.environ["DECISIONMODELS_API_KEY"],
    extra_headers={"S1-Region": "eu"},
    state="Mia owns a red bicycle.",
    questions={"color": {
        "type": "choice",
        "instructions": "Which color is the bicycle?",
        "criteria": {"red": None, "blue": None},
    }},
    timeout=15,
)
print(response.model_dump())

Ollama Python 0.6.3

2026年10月27日、当社が公開しているAPI仕様に対して Ollama Python 0.6.3 でテスト済み

ollama.py
import os
from ollama import Client

client = Client(
    host=os.environ.get("DECISIONMODELS_BASE_URL", "https://api.decisionmodels.io"),
    headers={
        "Authorization": "Bearer " + os.environ["DECISIONMODELS_API_KEY"],
        "S1-Region": "eu",
    },
    timeout=15,
)
response = client.systemone(
    model="s1-fast",
    state="Mia owns a red bicycle.",
    questions={"color": {
        "type": "choice",
        "instructions": "Which color is the bicycle?",
        "criteria": {"red": None, "blue": None},
    }},
)
print(response.model_dump())

クライアントのドキュメント: LiteLLM System One · Ollama Python 0.6.3。テストの対象は、記載したバージョンと、示したテキストの例です。

切り替える前にエラーを処理する

次のコードは明示的に処理してください。詳しい規則はエラーと再試行にあります。

次のステップ

本番環境のリクエストを移す前に、移行に関する全文の注意事項とご自身のテストケースを確認してください。