從 Jev 遷移 · API 遷移檢查清單

從 Jev 切換的實用檢查清單

將既有的 TypeSafe Jev 整合遷移到 Decision Models 的 Jev 相容 API:檢查設定、測試請求,並審慎地切換流量。

Jev 是 TypeSafe AI 的產品;Decision Models 與 TypeSafe AI 並無關聯。

取得 API 金鑰查看歐盟層級

切換流量之前

  1. 盤點現有的整合

    保存目前的設定與具代表性的測試案例。檢查問題類型、選項、圖片、回答的解析方式與重試機制。請保留先前服務供應商的設定,以便在需要時刻意回復。

  2. 設定 base URL 與路徑

    以 https://api.decisionmodels.io 作為 base URL,文字請求使用 POST /v1/systemone。如果您的用戶端會自行附加路徑,請移除既有的 /v1 後綴,並確認實際送出的路徑。

  3. 建立獨立的 API 金鑰

    請在儀表板建立 Decision Models 金鑰,並以 Authorization: Bearer 傳送。TypeSafe 的金鑰、餘額與帳號都無法轉移。請將金鑰存放在環境變數中。

  4. 替換模型 ID

    將 TypeSafe 的模型 ID 替換為 Decision Models 現有的 ID,例如 s1-fast。請查詢 GET /v1/models,不要沿用 TypeSafe 的別名。

  5. 明確指定處理區域

    例如設定 S1-Region: eu。可用值為 eu 或 global,並受金鑰權限限制;未帶標頭時,會套用金鑰的預設值。歐盟請求一律留在歐盟境內。在歐盟以外進行 Peer-to-Peer 處理,須在金鑰上取得全球處理同意。請參閱處理方式與合約條款。

  6. 依模型限制拆分問題

    s1-pro 每次請求最多接受 3 個文字問題;s1-fast 接受 1 個,s1-vision 接受 1 個。多出的問題請自行拆分。服務不會在背後自動拆分或捨棄問題;超出的問題會回傳 400 request_limit_exceeded。另請查看下方的 token 與選項限制。

  7. 檢查問題類型與圖片

    保留 state,以及以問題名稱為鍵的 questions 物件。請使用下方的 criteria 格式。處理圖片時,請透過 POST /v1/multimodal 使用 s1-vision,並在 images 陣列中放入恰好一張圖片。支援 PNG、JPEG 與 WebP 的 data URL 或公開的 HTTPS URL,解碼後上限為 4 MiB 與 2,000,000 像素。下方的文字範例並未測試圖片請求。

  8. 讀取回答與用量計算

    請依問題名稱,從 answers 底下讀取結果。記錄 usage.input_tokens、usage.output_tokens、usage.decisions 以及回報的 model_version。token 數由模型計算,圖片請求也包含圖片位置。金額請以儀表板上的用量收據為準;請勿自行將字元數換算成計費 token。

  9. 測試錯誤、重試與回復

    請測試無效的金鑰、餘額不足、模型限制、速率限制與逾時。請使用下方列出的錯誤碼。請以您自己的案例評估結果,通過驗收檢查後再切換流量。本機的API 規格測試並不能證明模型品質或正式環境的可用性。

問題類型與目前的輸入限制

模型每個問題的輸入 token 數問題數選項數
s1-fast8,000116
s1-pro8,192364
s1-vision8,000126

每個問題都包含其 state、criteria 與提示詞範本;s1-vision 另外計入圖片位置。請查看完整的輸入限制。

遷移時有哪些變動

2026年10月27日確認。附日期的 Jev 替代方案比較與遷移說明界定了相容性的範圍:獨立的金鑰、模型 ID、處理層級、計費、限制、中繼資料與錯誤。更換模型後,您必須自行評估輸出結果。我們並未宣稱逐位元組完全相容。

我們的 score 評分標準至少需要兩個等級;TypeSafe 公布的結構描述則也接受單一等級。超出的問題屬於不可重試的錯誤。

使用 Idempotency-Key 時,仍在處理中的請求會回傳 202 in_progress。結算完成後,或結算狀態不確定時,會回傳 409 idempotency_replay_unavailable,內含收據且不會重複扣款,但不會保存回答。若確認失敗、沒有回答且未扣款,則可使用相同的金鑰與請求本文重試。同一金鑰搭配不同的請求本文,會回傳 409 idempotency_conflict。只有在刻意發起新的推論時,才使用新的金鑰。

已測試的文字範例

下列每個檔案都未經修改,針對我們所公開 API 規格的隔離式本機 HTTP 模擬服務執行過。檢查項目包括方法、路徑、Bearer 驗證、S1-Region、JSON 請求本文,以及讀取附有 usage 與 model_version 的模擬回答。我們並未發出任何正式環境的推論請求。

請將 DECISIONMODELS_API_KEY 設為您的金鑰。選用的 DECISIONMODELS_BASE_URL 可指向您的本機模擬服務;未設定時則使用公開的 API base。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日,使用 curl 7.81.0 依據我們所公開的API 規格測試

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日,使用 Python requests 2.32.5 依據我們所公開的API 規格測試

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日,使用 Node.js fetch 20.19.4 依據我們所公開的API 規格測試

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日,使用 LiteLLM 1.106.4 依據我們所公開的API 規格測試

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日,使用 Ollama Python 0.6.3 依據我們所公開的API 規格測試

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。測試涵蓋所列的版本與所示的文字範例。

切換之前先處理錯誤

請明確處理這些錯誤碼;完整規則請見錯誤與重試。

下一步

在將正式環境的請求移過去之前,請先審閱完整的遷移說明與您自己的測試案例。