從 Jev 遷移 · API 遷移檢查清單
從 Jev 切換的實用檢查清單
將既有的 TypeSafe Jev 整合遷移到 Decision Models 的 Jev 相容 API:檢查設定、測試請求,並審慎地切換流量。
Jev 是 TypeSafe AI 的產品;Decision Models 與 TypeSafe AI 並無關聯。
切換流量之前
盤點現有的整合
保存目前的設定與具代表性的測試案例。檢查問題類型、選項、圖片、回答的解析方式與重試機制。請保留先前服務供應商的設定,以便在需要時刻意回復。
設定 base URL 與路徑
以 https://api.decisionmodels.io 作為 base URL,文字請求使用 POST /v1/systemone。如果您的用戶端會自行附加路徑,請移除既有的 /v1 後綴,並確認實際送出的路徑。
建立獨立的 API 金鑰
請在儀表板建立 Decision Models 金鑰,並以 Authorization: Bearer 傳送。TypeSafe 的金鑰、餘額與帳號都無法轉移。請將金鑰存放在環境變數中。
替換模型 ID
將 TypeSafe 的模型 ID 替換為 Decision Models 現有的 ID,例如 s1-fast。請查詢 GET /v1/models,不要沿用 TypeSafe 的別名。
明確指定處理區域
例如設定 S1-Region: eu。可用值為 eu 或 global,並受金鑰權限限制;未帶標頭時,會套用金鑰的預設值。歐盟請求一律留在歐盟境內。在歐盟以外進行 Peer-to-Peer 處理,須在金鑰上取得全球處理同意。請參閱處理方式與合約條款。
依模型限制拆分問題
s1-pro 每次請求最多接受 3 個文字問題;s1-fast 接受 1 個,s1-vision 接受 1 個。多出的問題請自行拆分。服務不會在背後自動拆分或捨棄問題;超出的問題會回傳 400 request_limit_exceeded。另請查看下方的 token 與選項限制。
檢查問題類型與圖片
保留 state,以及以問題名稱為鍵的 questions 物件。請使用下方的 criteria 格式。處理圖片時,請透過 POST /v1/multimodal 使用 s1-vision,並在 images 陣列中放入恰好一張圖片。支援 PNG、JPEG 與 WebP 的 data URL 或公開的 HTTPS URL,解碼後上限為 4 MiB 與 2,000,000 像素。下方的文字範例並未測試圖片請求。
讀取回答與用量計算
請依問題名稱,從 answers 底下讀取結果。記錄 usage.input_tokens、usage.output_tokens、usage.decisions 以及回報的 model_version。token 數由模型計算,圖片請求也包含圖片位置。金額請以儀表板上的用量收據為準;請勿自行將字元數換算成計費 token。
測試錯誤、重試與回復
請測試無效的金鑰、餘額不足、模型限制、速率限制與逾時。請使用下方列出的錯誤碼。請以您自己的案例評估結果,通過驗收檢查後再切換流量。本機的API 規格測試並不能證明模型品質或正式環境的可用性。
問題類型與目前的輸入限制
noul:是非題;回答中的 noul 為結果為真的機率。choice:criteria 是物件,至少包含兩個穩定的選項 ID。請讀取 choice、confidence 與 probabilities。score:criteria 是有順序的陣列,至少包含兩個等級。score 是以機率加權的、從 0 起算的等級索引平均值,可以是小數。
| 模型 | 每個問題的輸入 token 數 | 問題數 | 選項數 |
|---|
s1-fast | 8,000 | 1 | 16 |
|---|
s1-pro | 8,192 | 3 | 64 |
|---|
s1-vision | 8,000 | 1 | 26 |
|---|
每個問題都包含其 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。測試涵蓋所列的版本與所示的文字範例。
切換之前先處理錯誤
請明確處理這些錯誤碼;完整規則請見錯誤與重試。
400 invalid_request、request_limit_exceeded:請修正結構描述或模型限制;不要原封不動地重試。401 invalid_api_key、402 insufficient_credit、403 tier_not_allowed、404 unknown_model:請修正金鑰、餘額、層級權限或模型選擇。413 payload_too_large、422 unsupported_modality:請縮小輸入大小,或選擇支援的模態。429 rate_limit_exceeded:必須遵守 Retry-After。503 model_unavailable、capacity_limit、504 inference_timeout:重試前,請先確認文件所載的等待時間與結算狀態。歐盟請求絕不會容錯移轉到歐盟以外。