Community程式設計與開發github.com

use-jev-cli

用 jev-cli 向 TypeSafe Jev 提類型化問題:狀態進、JSON Choice/Score/Boolean 出——分類、路由、量表與驗證,零散文 token。

use-jev-cli 是什麼?

use-jev-cli 教 Agent 對共享 state 跑 jev-cli eval。Jev 回傳可分支的機器可讀結論:類別、真假機率、量表分——按輸入計費、無輸出文字。一次檢查 diff/日誌/工單的十個屬性,比整輪 LLM 便宜得多。

相容平台~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/jtsang4/jev-cli/tree/main/skills/use-jev-cli

Installed? Explore more 程式設計與開發 skills: steipete/bluebubbles, steipete/eightctl, steipete/blucli · View all 6 →

在你喜歡的 AI 中提問

開啟一個已預先載入此 Agent Skill 的新對話。

說明文件

使用 jev-cli

jev-cli 要求Jev,一個「System One」評估模型,根據一組帶有型別的問題來評判一個共享的狀態。它會回傳結構化的 JSON — 一個選擇、一個分數或一個機率 — 絕不產生散文。

當你需要一個你的程式碼可以根據其進行分支的決策時,就使用它。它比完整的 LLM 呼叫要快得多且便宜得多(按輸入 token 計費,輸出 token 為零),因此檢查一個 diff、一個日誌或一個支援對話記錄的十個屬性是很便宜的。

不要用它來撰寫、摘要、翻譯或改寫任何東西。它無法產生文字。

只需執行評估。無需事先進行設定檢查 — 當出現問題時,eval 會快速失敗並附上可操作的訊息和不同的 exit code,而 jev-cli doctor 是你在那時才需要使用的診斷工具,而不是在每次呼叫之前。

執行評估

jev-cli eval --state <text> --questions <json>
jev-cli eval -s "The support agent issued a full refund of \$40 and apologized." -q '{
  "refunded": {"type": "boolean", "instructions": "Was a refund issued?"},
  "tone":     {"type": "choice",  "instructions": "What tone did the agent use?",
               "criteria": {"warm": "friendly and personal", "curt": "terse or dismissive"}},
  "quality":  {"type": "score",   "instructions": "Rate how well this was handled.",
               "criteria": ["poor", "acceptable", "excellent"]}
}'
{
  "refunded": { "type": "boolean", "probability": 0.99 },
  "tone": { "type": "choice", "choice": "warm", "probabilities": { "curt": 0.02, "warm": 0.98 } },
  "quality": { "type": "score", "score": 1.78, "probabilities": { "0": 0, "1": 0.22, "2": 0.78 } }
}

這種內聯形式適合你自己撰寫的句子。對於已經存在於檔案或命令輸出中的任何內容,請接著閱讀傳遞輸入 — 這是大多數呼叫者會出錯的地方。

傳遞輸入:將內容保留在命令列之外

預設使用 --state-file / --questions-file,或透過管道傳入 -。 內聯的 -s / -q 適用於你真正在撰寫的短文,而不是已經存在的內容。

當呼叫者是 agent 時,這比看起來更重要:

  1. 內聯內容必須逐 token 產生。 將一個 50 KB 的 diff 貼入 -s 意味著發射約 15k 個輸出 token — 按輸出費率計費,由於產生是序列化的而速度慢,並且是對你已有內容的重新轉錄,這會引發靜默截斷和漂移。一個路徑花費約 10 個 token,而管道則完全將內容保留在你的上下文窗口之外。
  2. Shell 會重新改寫內聯內容,有時是透過執行它。 在雙引號中,`cmd` 是命令替換,${VAR} 會擴展。傳遞 -s "const m = `echo hi`; const p = ${HOME}" 會向模型發送 const m = hi; const p = /Users/you — 反引號執行了。對於不受信任的輸入(一個 PR diff、一個用戶日誌),這是一個命令執行攻擊面,而不僅僅是資料損壞。在單引號中,內容中的一個撇號會直接破壞命令。

大小不是決定因素:約 150 KB 可以順利通過 shell,而 Jev 自己的預算會先被綁住。內容安全性和 token 成本才是原因。

# 最佳 — 內容從未進入模型上下文
git diff | jev-cli eval --state-file - --questions-file ./checks.json

# 良好 — 用命令準備,傳遞路徑
git log -20 --oneline > /tmp/state.txt
jev-cli eval --state-file /tmp/state.txt --questions-file ./checks.json

# 尚可 — 你實際正在撰寫的短文
jev-cli eval -s "The agent issued a full refund." -q '{"r":{"type":"boolean","instructions":"Refunded?"}}'

# 錯誤 — 重新轉錄你已有的檔案,透過 shell
jev-cli eval -s "$(cat huge-diff.txt)" -q ...

只有一個輸入可以讀取 stdin。當兩者都很大時,將其中一個透過管道傳遞,另一個作為路徑傳遞。跨呼叫重複使用 questions 檔案,而不是重新發出它。

當狀態是 JSON 而非純文字時,加上 --state-json。

三種問題型別

每個問題都需要 instructions。instructions 和每個 criteria 描述可以是字串、JSON 物件或 JSON 陣列 — 但絕不能是純粹的數字或布林值。

型別criteria答案
boolean可選 {"true": ..., "false": ...},任一邊可省略{"type":"boolean","probability":0.98}
choice必要。 選項名稱 → 描述的物件(null 表示無){"type":"choice","choice":"warm","probabilities":{...}}
score必要。 至少兩個層級的陣列,最低的在前{"type":"score","score":1.83,"probabilities":{...}}

三件常讓人困惑的事:

  • boolean 給出 P(true),而非布林值。 0.98 表示模型有 98% 的機率認為是 true。這不是信心水準,也未經校正 — 請自行選擇閾值。0.5 表示「真或假的可能性相同」,不是「中等」。
  • score 是一個分數位置,範圍從 0 到 criteria.length - 1 — 這是機率加權平均值,不是索引。對於漸進等級,請使用它,而不是 boolean。
  • choice 會原樣回傳選項名稱,因此請將選項命名為你的程式碼將要切換的值。其機率總和為 1,因此它會精確選出一個勝者 — 對於「這些中哪些適用,可能有多個」,請改用每個候選者一個 boolean。

硬性限制

  • 狀態和問題共享約 32,000 個 token 的預算(約 150,000 個英文字元)。超出會失敗,並回傳 {"error_type":"max_tokens_exceeded"} 和 HTTP 400。
  • 僅限文字。 狀態必須是字串、JSON 物件或文字陣列。不接受圖片、音訊或影片。

因此,你無法將整個程式碼庫、完整的日誌存檔或大型語料庫交給 Jev。請預先建立一個緊湊的索引或摘錄,然後對其進行評估。請參閱 references/patterns.md 了解如何組織。

在一次呼叫中詢問所有內容

問題是並行且隔離地評估 — 它們彼此看不到。批次處理幾乎是免費的:TypeSafe 測量一次請求中的 13 個問題,比 13 個單獨請求便宜 11.5 倍且快 9.6 倍,且答案相同。他們的文件指出,編碼 agent 比人類更容易陷入每次呼叫一個問題的習慣 — 不要這樣做。

在一次請求中詢問你可能需要的所有內容,並丟棄你不使用的部分。只有當你確實無法在沒有第一個答案的情況下建構第二個請求時,才鏈接第二個請求。

讀取結果

預設輸出是純粹的答案物件,以你的問題 ID 為鍵,因此可以直接透過管道傳入 jq:

jev-cli eval --state-file - -q "$CHECKS" | jq -e '.deploy_ok.probability > 0.9' >/dev/null && echo healthy

加上 --full 以取得使用情況、警告和 providerMetadata — TypeSafe 在其中報告 choice 和 score 答案的 confidence,這與機率是分開的。加上 --compact 以取得單行 JSON。

Exit code 與錯誤

eval 會將錯誤寫入 stderr 為 JSON({"error":{"code","message"}}),保持 stdout 乾淨。務必根據 exit code 進行分支:

代碼含義處理方式
0成功解析 stdout
1提供者或網路錯誤重試一次;若持續發生則回報
2錯誤的用法或無效的問題修正 JSON — 訊息會指出有問題的問題 ID 和欄位
3憑證遺失或遭拒絕將訊息轉達給使用者;不要重試。請參閱下方

一個代碼 2 的訊息,例如 questions.quality.criteria must list at least two ordered levels, but got 1,會指向需要修正的確切路徑。

診斷失敗

僅在呼叫實際失敗時,且僅針對代碼 1 和 3:

jev-cli doctor --offline   # 設定、提供者、模型、金鑰來源 — 無需網路呼叫
jev-cli doctor             # 上述所有內容,加上一次小型即時評估

代碼 3 會攜帶提供者自己的說法,它們區分了需要不同修復方式的情況 — 遺失的金鑰、被撤銷的金鑰、未設定帳單的帳戶,或方案無法觸及的模型,這些的讀取方式都不同。請轉達該訊息,而不是假設金鑰錯誤,並且絕不要自行發明金鑰。如果確實遺失一個,使用者會提供它:

jev-cli config set providers.vercel.apiKey <ai-gateway-key>

絕不要印出金鑰 — config list 會遮蔽它們,除非傳遞了 --show-secrets。

設定參考

設定檔位於 ~/.jev-cli/config.yaml(使用 JEV_CLI_HOME 覆蓋目錄),權限為 0600。

jev-cli config path                       # 檔案位置
jev-cli config list                       # 所有值,金鑰被遮蔽
jev-cli config get providers.vercel.model
jev-cli config set providers.vercel.model typesafe-ai/jev
jev-cli config unset providers.vercel.baseURL

優先順序為 CLI 標誌 > 環境變數(JEV_CLI_API_KEY,然後是 AI_GATEWAY_API_KEY)> 設定檔。在 CI 中,設定 JEV_CLI_API_KEY 並完全跳過設定檔。

provider 目前僅接受 vercel(Vercel AI Gateway)。值 jev 保留給 TypeSafe 的官方 API,在實作完成前會被拒絕。

進一步探索

  • references/question-design.md — 如何措辭問題和組織狀態,以使答案可用:原子問題、拆分複合判斷、單標籤與多標籤、在三種型別之間選擇。
  • references/patterns.md — 針對更大問題的架構:推測性扇出、兩階段篩選、基於分類法和程式碼庫的分層分類、信心門控路由。

官方文件索引(agent 可讀取):https://docs.typesafe.ai/llms.txt

相關技能