跳到正文
openrouter blog·· 11 天前精選AI 評分64

OpenRouter 整合 TypeSafe 決策模型 Jev 1.13

What Is Jev? TypeSafe's Decision Model Explained for Developers

AI 導讀

OpenRouter 宣佈上線由 TypeSafe 開發的決策模型 Jev 1.13,這是一款不生成文本、專門回傳型別化決策與校準機率的 System One 模型。

推薦理由

原文詳細介紹 TypeSafe 決策模型的 API 規格與呼叫方式,讀者可據此評估如何將其整合至現有的分類與路由工作流程中。

正文 · AI 翻譯

什麼是 Jev?它應該用於什麼?它是 TypeSafe 的決策模型,接受一段文字加上一個已型別化的問題,並回傳一個型別化的答案,該答案是你預先定義的答案集合中的一個選項。因此,如果我有一個關於票務路由的問題,例如這張票應該送到帳單、技術還是帳戶,Jev 會檢視票的文字並以預先定義的選項之一回覆,billing。更酷的是,它還會提供答案選項的校準機率,以及其他各選項的機率。哦,還有一個整體信心分數(稍後再說)。TypeSafe 將這些稱為 System One 模型,Jev 是其中第一個。

但 Jev 真實回傳的是什麼?讓我們找出來!它回傳三個原始資料,下面列出每個的實際 API 回應。以下是如何正確閱讀機率,而不被誤導。以及如何使用 OpenRouter API 金鑰呼叫 Jev。

什麼是決策模型(System One 模型)?

Jev 是一個決策模型。System One 模型是指接收一段狀態,並根據該狀態回傳決策的模型。在此情況下,Jev 的決策永遠是你事先定義的型別化值,外加一個從零到一的實際機率數值。此名稱源自 Daniel Kahneman 在《思考,快與慢》(Thinking, Fast and Slow)中所稱的 System One:快速、模式匹配的思考,而 System Two 則是慢速且深思熟慮的。

那麼什麼使它成為決策模型而非某種預言機?決策模型必須從你事先決定的一小組值中回傳。沒有自由文本,因而不需要你解析或擔心幻覺。

現在,TypeSafe 已校準 Jev,讓它說 0.8(80% 的機率)時,意即像 80% 的降雨機率,Jev 在此類答案上大約正確 80% 的時間(System One 概念)。

這只有在多個答案平均後才成立。任何單一答案仍可能錯誤。這在實務上會產生差異;我們稍後會再次討論此點。

Jev 與 LLM:各自回傳內容

一旦瞭解兩者的功能,Jev 與 LLM 的差異便會明顯。兩者皆能閱讀自然語言,但區別完全在輸出端。

以下是兩者的對照表:

生成式 LLMJev
輸出Tokens:散文、程式碼、你所要求的 JSON一個型別化答案加上機率分佈
形狀保證?僅在結構化輸出時才保證,內容仍可能錯誤始終為你預先設定的選項、等級或是是/否機率
不確定性隱藏於散文中以數值回傳,便於設定閾值
輸入文字,且常包含影像、音訊或影片僅文字(字串、JSON 物件、文字陣列)
OpenRouter 價格依模型、輸入與輸出計費而異$0.042 每百萬輸入 token,輸出免費

每當你需要文字作為主要輸出,例如回覆、摘要或程式碼修補,請使用 LLM。當你需要做出可執行程式碼的決策時,請使用 Jev。在幾乎所有實際案例中,兩個系統都會協同工作:Jev 進行路由與驗證,LLM 提供語言。這正是配套文章 Jev vs LLM: when to use?  所闡述的內容。它在 140 個支援案例上對此分工進行基準測試…

Jev 的三個原始資料:Choice、Score 與 Noul

你問 Jev 的每個問題都屬於三種型別之一。請求包含兩個部分:state,即要評估的文字,以及一個包含一個或多個已型別化問題的 questions 物件。Jev 會一次性回答所有問題,每個答案都以你提供的鍵返回。

以下範例是我於 2026 年 9 月 21 日發出的真實呼叫。它們透過 OpenRouter 的 Decisions API 對 typesafe/jev-1.13 執行,若你設定 OPENROUTER_API_KEY,即可按原樣執行這些範例。

Choice(選擇):從固定集合中選擇一個選項

當你從 API 接收到 Choice 時,它總是包含三項資訊:所選選項、每個選項的機率,以及信心值。

此指令傳送請求:

curl https://openrouter.ai/api/alpha/decisions \
  -H "Authorization: Bearer $OPENROUTER_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "typesafe/jev-1.13",
    "state": "My invoice for September shows two charges for the Pro plan. I only have one workspace.",
    "questions": {
      "team": {
        "type": "choice",
        "instructions": "Which team should handle this ticket?",
        "criteria": {
          "billing": "Charges, invoices, and refunds",
          "technical": "Bugs, outages, and broken features",
          "account": "Login, password, and profile changes"
        }
      }
    }
  }'

此回應顯示 API 所回傳的內容:

{
  "model": "typesafe/jev-1.13-20260917",
  "answers": {
    "team": {
      "type": "choice",
      "choice": "billing",
      "probabilities": { "technical": 0, "account": 0, "billing": 1 },
      "confidence": 1
    }
  },
  "usage": { "input_tokens": 357, "output_tokens": 38, "cost": 0.000014994 },
  "id": "gen-dec-1790013975-0Cpw7ykY8YRfP85l4eqS",
  "provider": "TypeSafe"
}

Jev 在做出選擇前會閱讀 criteria 描述,因此請像說明新進員工一樣撰寫。TypeSafe 的 API 參考 說題目 ID(team 在此)從未被送往模型。所有意義必須包含在描述中。其次,model 欄位命名了 OpenRouter 所提供的精確快照。

Score(分數):按你描述的有序等級進行評分

Score 接收一個有序的等級描述陣列。它回傳一個數字,代表文字的分數,以及一個 legend,將陣列中的每個索引對映到其描述,外加 Jev 對每個等級的機率與信心值。

curl https://openrouter.ai/api/alpha/decisions \
  -H "Authorization: Bearer $OPENROUTER_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "typesafe/jev-1.13",
    "state": "Export to CSV fails with a 500 error for every workspace in our org since this morning. We can still download JSON exports, but our finance team can only import CSV.",
    "questions": {
      "severity": {
        "type": "score",
        "instructions": "How severe is this bug report?",
        "criteria": [
          "Cosmetic; no impact to functionality",
          "Broken or degraded feature, but a workaround exists",
          "Blocking issue; no workaround exists"
        ]
      }
    }
  }'
{
  "model": "typesafe/jev-1.13-20260917",
  "answers": {
    "severity": {
      "type": "score",
      "score": 1.15,
      "legend": {
        "0": "Cosmetic; no impact to functionality",
        "1": "Broken or degraded feature, but a workaround exists",
        "2": "Blocking issue; no workaround exists"
      },
      "probabilities": { "0": 0, "1": 0.85, "2": 0.15 },
      "confidence": 0.77
    }
  },
  "usage": { "input_tokens": 354, "output_tokens": 17, "cost": 0.000014868 },
  "id": "gen-dec-1790013976-PwmCQLkieCXkoK3qb8Ja",
  "provider": "TypeSafe"
}

分數 1.15 為等級的機率加權平均值,即 0.85 × 1 + 0.15 × 2,正如上述回應所示。你自己的執行可能會略微偏離幾個百分位,因為 Jev 的機率在不同呼叫間會略有變化。將「我們仍可下載 JSON 匯出」視為解法時,Jev 主要落在等級 1。它也給「阻塞」一些權重,因為財務部門無法使用此解法。

因為分數採用序數尺度,必須將等級按從最少到最多的真實順序排列,並以文字描述每個等級。TypeSafe 檔案列出了 Score 原始型別 的細節,包括最多 10 個等級的上限。

Noul:是/否命題為真的機率

Noul 是三者中最簡單的原始型態。它以命題為輸入,並回傳答案為「是」的機率。

以下指令傳送請求:

curl https://openrouter.ai/api/alpha/decisions \
  -H "Authorization: Bearer $OPENROUTER_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "typesafe/jev-1.13",
    "state": "I was charged twice for September. Please refund the duplicate charge.",
    "questions": {
      "refund": {
        "type": "noul",
        "instructions": "Is the customer asking for money back?"
      }
    }
  }'

以下為 API 所回傳的回應:

{
  "model": "typesafe/jev-1.13-20260917",
  "answers": {
    "refund": { "type": "noul", "noul": 0.99 }
  },
  "usage": { "input_tokens": 287, "output_tokens": 20, "cost": 0.000012054 },
  "id": "gen-dec-1790013977-LxrJdV3aOEliWmRmdmh9",
  "provider": "TypeSafe"
}

請注意,Noul 答案沒有獨立的 confidence 欄位;機率即為整個答案。下一節說明如何解讀。

一次呼叫中詢問全部三個

你甚至可能在想,嘿,questions 物件能容納多少個問題?隨你多。state 不必是純文字:它可以是帶有全部彈性之 JSON 物件。此時,你的指示可在反引號中以名稱參照其欄位。

假設你想在同一次往返中,從同一票證域一次性詢問 Choice、Score 與 Noul。

以下顯示傳送此請求的指令。

curl https://openrouter.ai/api/alpha/decisions \
  -H "Authorization: Bearer $OPENROUTER_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "typesafe/jev-1.13",
    "state": {
      "ticket": "Hi, I was charged twice for my Pro subscription this month. Please fix this before my next payroll run on Friday."
    },
    "questions": {
      "team": {
        "type": "choice",
        "instructions": "Which team should handle `ticket`?",
        "criteria": {
          "billing": "Charges, invoices, and refunds",
          "technical": "Bugs, outages, and broken features",
          "account": "Login, password, and profile changes"
        }
      },
      "urgency": {
        "type": "score",
        "instructions": "How urgent is `ticket`?",
        "criteria": [
          "No deadline; routine question",
          "Customer wants a fix soon but nothing is blocked",
          "Customer names a deadline or something is blocked now"
        ]
      },
      "refund": {
        "type": "noul",
        "instructions": "Is the customer in `ticket` asking for money back?"
      }
    }
  }'

以下顯示的回應即為 API 所回傳的內容。

{
  "model": "typesafe/jev-1.13-20260917",
  "answers": {
    "team": {
      "type": "choice",
      "choice": "billing",
      "probabilities": { "technical": 0, "billing": 1, "account": 0 },
      "confidence": 1
    },
    "urgency": {
      "type": "score",
      "score": 2,
      "legend": {
        "0": "No deadline; routine question",
        "1": "Customer wants a fix soon but nothing is blocked",
        "2": "Customer names a deadline or something is blocked now"
      },
      "probabilities": { "0": 0, "1": 0, "2": 1 },
      "confidence": 1
    },
    "refund": { "type": "noul", "noul": 0.82 }
  },
  "usage": { "input_tokens": 447, "output_tokens": 69, "cost": 0.000018774 },
  "id": "gen-dec-1790013867-chEjwDPvoiiffM3J3eDF",
  "provider": "TypeSafe"
}

若一切順利,每個答案都會落在你指定的鍵下。在程式碼中,你就能直接去 answers.team.choice 和 answers.refund.noul。

如何閱讀 Jev 的機率與信心值

閱讀 Jev 的機率與信心值時,請記住三項指引。

當 Noul 接近 0.5 時,表示 Jev 不知道該怎麼想。將其視為不確定狀態。我們來做個快速實驗,示範這個情況。我在兩次獨立呼叫中,針對狀態「本月我的卡上有兩筆扣款。若其中一筆是錯誤,我有哪些選擇?」提出相同的退款問題「客戶是否在要求退款?」。其中一次返回 Noul 為 0.52,而在完全相同的訊息(是的,逐字)下,Jev 返回 Noul 為 0.49。如果你想說「哇,客戶只是想要退款」,請注意訊息中並未提及退款。他們只是提及此事,但 Jev 在兩個方向上都有牽引,我們也不會確定。同時,早先 Noul 呼叫中的明確退款請求為 0.99。看到了模式嗎?當結果位於中間時,視為第三種結果,您可以採取行動。詢問後續問題,或將工單交給人工處理。

選擇與分數信心是衡量分佈集中度的指標。當整個分佈的權重集中於一個結果時,信心越高。集中於單一選項的選擇會產生高信心數值,範圍為 0 到 1。信心數值越高,選項之間的猶豫就越少。但 Jev 將注意力集中於某個選項並不代表答案正確。TypeSafe 以其 probabilities 的形狀計算信心數值,而非實際正確性(confidence docs)。極端情況下,將全部權重分配給單一結果的模型,其信心為 1.0;若集中度較低,信心數值會降低。

您可以用帳單範例來驗證。這個 state 更模糊:『我昨天升級到 Pro,但儀錶板仍顯示 Free,我已被扣款。是哪一個?』以下回應顯示 API 真實回傳的內容:

{
  "type": "choice",
  "choice": "billing",
  "probabilities": { "account": 0.02, "technical": 0.19, "billing": 0.79 },
  "confidence": 0.69
}

Jev 仍選擇 billing,雖然有五分之一的權重落在 technical 上,信心降至 0.69。信心衡量 Jev 在選項之間的撕扯程度,但這些選項是否適當,取決於您。

從您自己的標註資料中自行設定閾值。操作建議很簡單。校準在總體上有效,這表示適當的切點取決於您的錯誤成本。TypeSafe 的 confidence guide 建議三個區間:若信心超過某一閾值,即自動執行。在中間區間謹慎處理,標示為需額外使用者確認或僅標示待審核。若信心低於另一個閾值,則轉交人工或其他系統。

如何設定這些區間?標註數百個範例。對每個範例,檢查 Jev 的機率分佈。接著挑選區間,使自動執行區間內的錯誤率符合您的容忍度。

Jev 留給您的程式碼的部分

Jev 有些功能您可能期望模型能完成,但實際上並未執行。這些功能仍需在您的程式碼或 LLM 中實作:

  • 文字產生。每個 Jev 回應皆為前述三種型別之一,絕不會是補完、JSON 主體或解釋。當流程需要句子時,LLM 產生內容,Jev 進行驗證。這份 verified cascade cookbook 展示此模式。

  • 可見推理。 Jev 只回傳你選項的分佈,沒有其他。沒有推論、沒有思考過程。將分佈作為記錄與閾值判斷的訊號。為了稽核,請記錄請求 ID、問題名稱、機率以及程式套用的閾值。不要將 state 本身記錄在日誌中,因為工單與檔案包含客戶資料。

  • 工具呼叫、對話或多步驟規劃。 Jev 以一次往返回答你所傳送的狀態相關問題。它不會呼叫工具,也不會持續對話,也不會執行多步。它在代理內部作為決策部分運作,例如 控制工具呼叫。

這已經三個了!再提供兩個限制條件供你參考:

  • Jev 只接受文字、字串、JSON 物件或文字陣列。不接受影像、音訊或影片。

  • 精確算術、日期運算與閾值比較不是 Jev 的工作。先自行計算,將語意部分交給 Jev。

何時使用 Jev 模型

既然你已瞭解 Jev 的功能,接下來討論何時適合使用:當 LLM 預期提供的答案屬於列舉、布林值或數值時。

何時使用 Jev

  • 路由與分診:你決定佇列、負責人、優先順序。每張工單提供一個選項與一個分數。
  • 大規模分類與標記:成本足夠低(見下方定價)可在每一列執行;輸出已是標籤。
  • 控制代理行為:在執行破壞性工具前,詢問 Noul 使用者是否授權刪除這些檔案;若低於閾值則阻擋。
  • 驗證 LLM 輸出:先由 LLM 草擬,再詢問 Jev 該草稿是否符合你提供的政策文字。
  • 排名與篩選:將候選者按描述層級打分,然後排序。

何時跳過 Jev

當答案需為散文、輸入為影像,或邏輯為確定式時。若需要精確規則?正規表示式或資料庫查詢勝過任何模型。若想在編碼前先試試,Jev Lab 在瀏覽器上對實際呼叫執行多個此類模式。

如何在 OpenRouter 上存取 Jev

你需要一個 OpenRouter API 金鑰 以及模型 ID:typesafe/jev-1.13(固定)或 ~typesafe/jev-latest(別名追蹤最新版本)。相同的呼叫可透過三種方式完成:使用 OpenRouter SDK、TypeSafe SDK 或原始 HTTP。

使用 OpenRouter SDK 的 Decisions API

以下程式碼示範與 confidence 區塊中較混亂的工單相同的呼叫:透過 OpenRouter TypeScript SDK 的 alpha.decisions 進行 POST https://openrouter.ai/api/alpha/decisions 呼叫。程式碼已於 SDK 1.3.11(透過 npm install @openrouter/sdk 安裝)測試。由於頂層 await,請以 bun run 或 ES 模組方式執行。開始:

import { OpenRouter } from '@openrouter/sdk';

const openrouter = new OpenRouter({ apiKey: process.env.OPENROUTER_API_KEY });

const decision = await openrouter.alpha.decisions.create({
  decisionsRequest: {
    model: 'typesafe/jev-1.13',
    state: 'I upgraded to Pro yesterday but the dashboard still says Free and I got charged. Which one is it?',
    questions: {
      team: {
        type: 'choice',
        instructions: 'Which team should handle this ticket?',
        criteria: {
          billing: 'Charges, invoices, and refunds',
          technical: 'Bugs, outages, and broken features',
          account: 'Login, password, and profile changes',
        },
      },
    },
  },
});

const team = decision.answers.team;
if (team.type === 'choice') {
  console.log(team.choice, team.probabilities, team.confidence);
}
billing { account: 0.01, technical: 0.15, billing: 0.84 } 0.77

請注意,這裡的數值與同一工單先前執行的結果(0.79 與 0.69)不同。Jev 的機率會因呼叫而略有波動,建議以區間設定閾值,而非精確值。最後,OpenRouter SDK 以 camelCase 回傳 decision.usage.inputTokens 與 decision.usage.outputTokens,而非原始 API 的 input_tokens 與 output_tokens。

TypeSafe JavaScript SDK 指向 OpenRouter

第二種呼叫方式為 TypeSafe SDK:將 SDK 的基底 URL 指向 OpenRouter,並以 OpenRouter API 金鑰作為 API 金鑰。SDK 會在基底 URL 末尾加上 /v1/systemone。純模型名稱如 jev-1.13 對應 typesafe/jev-1.13。以下程式碼為同一呼叫至 Jev,使用 @typesafe-ai/sdk;程式碼已於 SDK 0.6.0 測試:

import { TypeSafeClient } from '@typesafe-ai/sdk';

const client = new TypeSafeClient({
  apiKey: process.env.OPENROUTER_API_KEY,
  baseURL: 'https://openrouter.ai/api',
});

const result = await client.systemOne({
  model: 'jev-1.13',
  state: 'Export to CSV fails with a 500 error for every workspace in our org since this morning. We can still download JSON exports, but our finance team can only import CSV.',
  questions: {
    severity: {
      type: 'score',
      instructions: 'How severe is this bug report?',
      criteria: [
        'Cosmetic; no impact to functionality',
        'Broken or degraded feature, but a workaround exists',
        'Blocking issue; no workaround exists',
      ],
    },
  },
});

console.log(result.answers.severity);
{
  type: "score",
  score: 1.19,
  legend: {
    "0": "Cosmetic; no impact to functionality",
    "1": "Broken or degraded feature, but a workaround exists",
    "2": "Blocking issue; no workaround exists",
  },
  probabilities: {
    "0": 0,
    "1": 0.81,
    "2": 0.19,
  },
  confidence: 0.72,
}

TypeSafe Python SDK 指向 OpenRouter

同樣的概念在 Python 中,使用 typesafe-sdk 0.7.1 (pip install typesafe-sdk):

import os

from typesafe_sdk import TypeSafeClient

client = TypeSafeClient(
    api_key=os.environ["OPENROUTER_API_KEY"],
    base_url="https://openrouter.ai/api",
)

result = client.system_one(
    model="jev-1.13",
    state="There are two charges on my card this month. If one of them is a mistake, what are my options?",
    questions={
        "refund": {"type": "noul", "instructions": "Is the customer asking for money back?"}
    },
)

print(result.answers["refund"])
type='noul' noul=0.49

請將您的 OpenRouter 金鑰安全地儲存在伺服器端。TypeSafe SDK guide 中有關別名對映、回應封包以及錯誤處理的詳細資訊。

Jev 價格與上下文視窗

根據 2026 年 9 月 21 日的 OpenRouter model page:

Jev 1.13 在 OpenRouter 上
輸入價格$0.042 每百萬個 token
輸出價格$0
上下文視窗32,000 個 token
模態輸入文字,輸出決策
供應商TypeSafe

總結來說:上述三題票務呼叫使用了 447 個輸入 token,成本為 $0.000019(約兩千分之一美分)。同等規模的百萬張票成本約 $19。輸出是免費的,答案非常短(每次呼叫介於 17 到 69 個 token 之間)。由於 probabilities 中的鍵順序在不同呼叫間會變動,我建議以名稱而非位置來索引專案。

OpenRouter 列出了 32k 的上下文視窗。TypeSafe 的 model page 顯示每次請求總共 64k 個 token,其中 32k 為您的 state,另加上最長的問題。

Jev 是開源的嗎?

快速提問:Jev 是專有的嗎?答案顯而易見(是),但讓我解釋一下。TypeSafe 尚未發布 Jev 的權重或任何相關論文,且所有想使用 Jev 的人都呼叫同一個託管模型。

試試看

現在是時候用您自己的 OpenRouter API key 來體驗這一切了!取得金鑰,貼上上述的 curl 指令之一,並將 state 改為您系統的實際訊息。

常見問題

什麼是 Jev?

Jev 是由 TypeSafe 開發的決策模型。您與大多數模型的互動方式是傳送文字。與 Jev 的互動不僅如此;您會傳送文字加上一個或多個已型別化的問題,回傳的答案則是已型別化且帶有校準機率的答案。沒有文字生成。TypeSafe 將此類模型稱為 System One 模型。

誰製作 Jev?

Jev 是一個決策模型。它由 TypeSafe(由 Diogo Almeida、Erik Gafni 和 Sasha Sheng 創立的 AI 實驗室)打造。Jev 在 2026 年 9 月 15 日以早期存取方式發布。現在的版本是 Jev 1.13。您可以透過 TypeSafe 自身的 API 或 OpenRouter 取得。

Jev 是 LLM 嗎?

不是。Jev 是非生成式決策模型,而 LLM 是生成式模型:Jev 會像 LLM 一樣閱讀您的自然語言,但不會產生任何文字或 token。Jev 會根據您的問題回傳三種答案形式之一:在預先設定的選項中做選擇、在定義的等級集合上給分數,或是給出「是」與「否」的機率。由於沒有生成文字,無需解析,也不存在輸出幻覺的風險。

Jev 主要用途為何?

好的,你必須決定哪個支援工單應該被分派給哪個團隊。你必須將這篇部落格文章分類為內容型別。你想根據置信度閾值來限制 AI 代理的工具呼叫。你需要將一組候選人按順序排列。你還需要將草稿與政策進行核對。聽起來很熟悉吧?在這些情況下,你會先向 LLM 提問,然後使用正規表示式解析出布林值或列舉值。迎接 Jev,專為這類決策而設計的模型,取代了 LLM+正規表示式的工作流程。

我如何存取 Jev?

如果你想透過 OpenRouter 來存取 Jev?那麼你只需要一個 OpenRouter API 金鑰,並對以下網址傳送 POST 請求:https://openrouter.ai/api/alpha/decisions,使用模型 typesafe/jev-1.13。或者你也可以使用 OpenRouter SDK 中的 decisions 客戶端。你甚至可以使用 TypeSafe JavaScript 和 Python SDK。只需將基礎 URL 設定為 https://openrouter.ai/api 並傳遞你的 OpenRouter 金鑰。

Jev 的價格是多少?

目前(截至 2026 年 9 月 21 日),在 OpenRouter 上的 Jev 1.13 每百萬輸入 token 的費用為 $0.042(輸出完全免費)。這表示在一個簡短的支援票務中,典型的三題呼叫大約使用 450 個輸入 token,成本約為 0.002 美分。請務必檢視模型頁面以瞭解最新價格。

Jev 是開源的嗎?

不是。Jev 是專有模型,因而沒有公開權重或相關論文。然而,你可以透過 TypeSafe API 或 OpenRouter 來呼叫它。

來源:openrouter blog · openrouter.ai