TypeSafe 相容性
TypeSafe 閉源的 Jev 模型開創了「System One」這一決策模型類別。Ollaya 的 /v1/* API 與 TypeSafe 的線上格式完全一致 —— 以 typesafe-sdk 0.7.1 的線上 schema 和錯誤處理為準 —— 所以為 TypeSafe 寫的程式碼能跑在你本機上的開放模型上。
把 SDK 指向 Ollaya
官方的 TypeSafe Python SDK 0.7.1 無需改動即可使用。設定這些環境變數:
export TYPESAFE_BASE_URL=http://localhost:11435
export TYPESAFE_API_KEY=local # the SDK needs a non-empty key; any value works
export TYPESAFE_DEFAULT_MODEL=winnow:e4b # otherwise the SDK sends its default, "jev-latest"
export NO_PROXY=localhost,127.0.0.1 # keep local requests off any system proxy
- 預設模型。
winnow:e4b最接近 Jev(型別化決策上 0.722,Jev 是 0.738),在 RTX 4090 上約 90 ms 作答。沒有 NVIDIA GPU 就用laya,它在 CPU 上零點幾秒就能回答。 - API key。 Ollaya 接受任何 key,除非伺服器設定了
OLLAYA_API_KEY;那之後 SDK 的 key 必須與它一致。 - 請求 ID。 每個響應都帶
x-typesafe-request-id,所以response.request_id可用。 - 重試。 SDK 在 10 秒後超時並重試。對某個模型的第一次請求會等它載入,而比請求活得更久的載入會繼續,所以重試時模型已經是熱的。
- 系統代理。 在帶系統 HTTP 代理的 Mac 上,TypeSafe SDK(和
httpx一樣)會把發往localhost的請求也走代理,無視系統的例外列表。於是你的狀態會穿過代理,而 Ollaya 關著時,SDK 報的是502 status code (no body),而不是連線被拒。把NO_PROXY=localhost,127.0.0.1寫在TYPESAFE_BASE_URL旁邊。 - 預熱與耗時。 想在第一次請求前載入模型,就向
/api/decide傳送{"model": "winnow:e4b", "keep_alive": -1}(不帶state)。/v1/*的響應不帶耗時,和 TypeSafe 的一樣;/api/decide會報告total_duration、load_duration和eval_duration。
端點
| 端點 | 說明 |
|---|---|
POST /v1/systemone |
做決策。請求:model、state(必填)和 questions。響應:恰好是 model、answers 和 usage。 |
POST /v1/decisions |
/v1/systemone 的別名 |
GET /v1/models |
本機上的模型:name、description、release_date |
請求與響應
curl http://localhost:11435/v1/systemone \
-H "Authorization: Bearer local" \
-d '{
"model": "laya",
"state": "Can I get an invoice for last month?",
"questions": {
"intent": {
"type": "choice",
"instructions": "What does the customer want?",
"criteria": {
"invoice": "Needs an invoice or receipt",
"refund": "Wants money back",
"other": "Anything else"
}
}
}
}'
{
"model": "laya:en",
"answers": {
"intent": {
"type": "choice",
"choice": "invoice",
"confidence": 0.9547,
"probabilities": {"invoice": 0.9698, "refund": 0.0172, "other": 0.013}
}
},
"usage": {"input_tokens": 43, "output_tokens": 0}
}
響應裡的 model 是實際作答的 checkpoint:laya 是一個 router,這個英語請求發去了 laya:en。TypeSafe 的 schema 允許這樣(“may differ from the alias supplied in the request”)。數值保留 4 位小數,probabilities 與 criteria 的順序一致。
curl http://localhost:11435/v1/models -H "Authorization: Bearer local"
{
"models": [
{
"name": "laya:en",
"description": "English decision model (ModernBERT-large): guardrails, email and ticket triage.",
"release_date": "2026-09-23"
},
{
"name": "laya:latest",
"description": "Routes each request to laya:en or laya:multilingual by the text's script and language.",
"release_date": "2026-09-23"
},
{
"name": "laya:multilingual",
"description": "Decision model for 100+ languages (mmBERT-base).",
"release_date": "2026-09-23"
}
]
}
/v1/models 列出拉到本機上的模型,包括 router;不列出 registry。
錯誤
錯誤帶 TypeSafe 的狀態碼,以及一個 SDK 能正確讀取的響應體:一個字串 error(SDK 會顯示它)、一個機器可讀的 code,以及在 422 上 TypeSafe 的 detail 校驗問題列表。每個程式碼見錯誤。
{"error": "model \"jev-latest:latest\" not found, try pulling it first", "code": "MODEL_NOT_FOUND"}
哪裡不一樣
相容覆蓋的是 API,不是模型:
- 模型名是 Ollaya 的(
laya、laya:en),所以要設定TYPESAFE_DEFAULT_MODEL或傳入model。 - 缺
instructions。 一個問題沒有它時,模型會讀取問題 id 來頂替,所以給問題起描述性的名字(is_urgent、tone)。 - 限制。 每個請求最多 256 個問題,2–255 個選項,2–10 個 score 檔位。每個模型還有選項預算:
laya:en約 125 個選項,laya:multilingual是 250 個。 - 長狀態。 TypeSafe 最多讀 65,536 個 token;開放模型的上下文更短(
laya:en是 512 個 token,laya:multilingual是 1,024 個,含問題在內)。狀態放不下時,/v1/*返回422 STATE_TRUNCATED,而不是拿它的一部分來作答。換一個上下文更長的模型、縮短狀態,或呼叫/api/decide,它會截斷並報告state_truncated。 /v1/*保持純淨。keep_alive、extras這類原生欄位在那裡會被忽略;路由、耗時和截斷都在/api/decide上報告。- 質量來自開放模型,所以按任務不同而與 Jev 有差別:
laya:typed-decisions在型別化決策上得 0.766,Jev 1.13 公佈的是 0.727。- 基礎的 Laya checkpoint 在型別化決策上零樣本接近隨機(0.362)。
- 選項很多的 choice 問題(超過約 20 個)更弱:Banking77 上 0.425,Jev 是 0.870。
切換生產流量之前,先在你自己的資料上量一量。Laya 頁面有細節。
沒有關聯
Ollaya 是一個獨立的開源專案。它與 TypeSafe 沒有關聯,也未獲 TypeSafe 認可。