~/.opencodereview/config.json,三種方式編輯:
ocr config provider / ocr config modelocr config set <key> <value>(適合 CI)| 名稱 | 協定 | Base URL | API key 環境變數 |
|---|---|---|---|
anthropic | anthropic | api.anthropic.com | ANTHROPIC_API_KEY |
openai | openai | api.openai.com/v1 | OPENAI_API_KEY |
dashscope | openai | dashscope.aliyuncs.com | DASHSCOPE_API_KEY |
volcengine | openai | ark.cn-beijing.volces.com | ARK_API_KEY |
deepseek | openai | api.deepseek.com | DEEPSEEK_API_KEY |
kimi | openai | api.moonshot.cn | MOONSHOT_API_KEY |
z-ai | openai | open.bigmodel.cn | Z_AI_API_KEY |
baidu-qianfan | openai | qianfan.baidubce.com | QIANFAN_API_KEY |
siliconflow | openai | api.siliconflow.com | SILICONFLOW_GLOBAL_API_KEY |
| 完整 18 家清單(含 minimax、iflytek、tencent、novita…)見上游 configuration.md——此處列代表。 | |||
任何不在表上的名稱都視為自訂,至少提供 url 與 protocol(anthropic / openai / openai-responses):
ocr config set provider my-gateway
ocr config set custom_providers.my-gateway.url https://gateway.internal.com/v1
ocr config set custom_providers.my-gateway.protocol openai
ocr config set custom_providers.my-gateway.model llama-3-70b
ocr config set custom_providers.my-gateway.api_key "$MY_API_KEY"
ocr config set provider ollama
ocr config set custom_providers.ollama.url http://127.0.0.1:11434/v1
ocr config set custom_providers.ollama.protocol openai
ocr config set custom_providers.ollama.model qwen3:32b
ocr config set custom_providers.ollama.api_key ollama
Ollama 忽略 API key,但自訂 provider 要求非空 api_key,設任意佔位即可。模型本身必須支援原生工具呼叫——選型前看 FAQ 的 "No tool calls parsed"。
| 鍵 | 作用域 | 預設 |
|---|---|---|
providers.<name>.timeout_sec | per-provider | — |
llm.timeout_sec | 舊版 llm 段 | — |
OCR_LLM_TIMEOUT 環境變數 | 覆蓋全部 | 300 秒 |
ocr config set max_tokens 200000
# 或單次覆蓋
ocr review --max-tokens 200000
預設 58,888 token。按檔案計算,與輸出上限、--max-tokens-budget 各自獨立。
| 鍵 | 用途 |
|---|---|
llm.retry_codes | 讓 OCR 對非標準 4xx 臨時錯誤使用重試(如 403,400) |
providers.<name>.extra_body | 發送廠商專屬欄位(如 Bedrock 風格 {"thinking":{"type":"disabled"}}) |
language | 評審評論的語言(中文 / English,預設英文) |
mcp_servers.<name> | MCP server 設定(見 MCP 頁) |
telemetry.* | OpenTelemetry 設定(見 遙測頁) |
已配好 Claude Code 的 ANTHROPIC_*,或 OCR 自己的 OCR_LLM_* 環境變數,OCR 自動識別,無需再寫 config。
OCR 用六步找到 LLM:① OCR_LLM_URL 環境變數 → ② config.json 的 llm.* → ③ config.json 的 providers.* → ④ ANTHROPIC_BASE_URL → ⑤ ANTHROPIC_* → ⑥ OCR_LLM_*。第一步找到完整的 (URL, token, model) 三元組就停。優先級:env > config。所以 CI 用 env、本地用 config 是最佳實踐。
protocol 決定 OCR 如何與你的 LLM 端點通訊:
openai——標準 OpenAI chat completions API(適用大多數相容端點)anthropic——Anthropic Messages API(用 x-api-key header)openai-responses——OpenAI Responses API(較新格式)不確定?用 openai——90% 的第三方端點都相容。
Ollama 端點雖然忽略 API key,但自訂 provider 要求 api_key 非空。設 ocr config set custom_providers.ollama.api_key ollama(任意佔位)。更關鍵的:模型必須支援原生 function calling。只在文字中「描述」工具呼叫的模型(如 deepseek-r1)永遠無法配合——選有 tools 標籤的模型。
Step 1 — 設定 provider
ocr config set provider my-gateway
Step 2 — 設定 URL
ocr config set custom_providers.my-gateway.url https://gateway.internal.com/v1
Step 3 — 設定 protocol
ocr config set custom_providers.my-gateway.protocol openai
Step 4 — 設定 model
ocr config set custom_providers.my-gateway.model llama-3-70b
Step 5 — 設定 API key
ocr config set custom_providers.my-gateway.api_key "$MY_API_KEY"
Step 6 — 測試連通性
ocr llm test
預期產出
✓ LLM endpoint reachable
✓ Model: llama-3-70b
✓ Auth: valid
Connection test passed.
| 錯誤訊息 | 診斷 | 修復 |
|---|---|---|
ocr llm test 回 401/403 | token 缺 scope、過期或廠商不匹配 | 確認 llm.use_anthropic 與 URL 匹配 |
No tool calls parsed | 模型不支援原生 function calling | 選有 tools 標籤的模型(qwen3/claude/gpt-4) |
custom_providers requires non-empty api_key | Ollama 忽略 key 但自訂 provider 要求非空 | 設任意佔位:ocr config set ...api_key ollama |
protocol 的三種取值、以及超時與 max_tokens 的優先級。你們團隊 5 個人各自在本機亂設 config.json,有人用 dashscope、有人用 siliconflow、模型也不一致,評審品質忽高忽低。你要建立一套版本化的團隊設定:每個人 clone 下來直接可用,CI 與本機行為一致。
# scripts/ocr-configure.sh —— 團隊唯一事實來源
ocr config set provider siliconflow
ocr config set model deepseek-v3
ocr config set language 中文
ocr config set max_tokens 120000
ocr config set llm.retry_codes "403,400"
ocr config set providers.siliconflow.timeout_sec 180
ocr config set providers.siliconflow.extra_body \
'{"thinking":{"type":"disabled"}}'
某些廠商回傳的 reasoning tokens 也會計費。用 extra_body 傳廠商專屬欄位——這是 ocr config set 能帶 JSON 值的實例。
ocr llm test
ocr config set 2>/dev/null || cat ~/.opencodereview/config.json | jq .
git add scripts/ocr-configure.sh && git commit -m "chore: team ocr config"
與其讓每個人手工按 TUI,不如把「決策點」鎖進腳本:誰是預設 provider、用哪個模型、多少 token、幾秒超時、retry 哪些碼——全部是可 review 的 diff。改設定 = 開 PR = 走 code review,這本身就是在 dogfood OCR 的工程紀律。CI 不跑這個腳本(它有自己的 OCR_LLM_* env),因為 env 優先級更高、且 CI 用 secret 更安全。
預期產出
✓ LLM endpoint reachable
✓ Model: deepseek-v3
✓ language=中文, max_tokens=120000
Config file at ~/.opencodereview/config.json (rewritten by next set)
六步可以重組成三組:(1) OCR_LLM_* 環境變數、(2) config.json 的 llm.* / providers.*、(3) ANTHROPIC_* 環境變數。第一步找到「完整 (URL, token, model) 三元組」就停。這表示:你以為 config.json 是唯一來源,但只要 shell 裡殘留一個 ANTHROPIC_BASE_URL,整個解析就會被它劫持。
# 你在 config.json 設了:model = claude-opus-4-6
# 但 ~/.zshrc 有:export ANTHROPIC_MODEL=claude-sonnet-4-5
# → 解析鏈第 5 步先命中 ANTHROPIC_MODEL,你的設定被跳過
ocr review --provider anthropic --model claude-opus-4-6 # 顯式覆蓋才有效
「我明明設了 model 為什麼跑出來是另一個?」——九成是殘留的 ANTHROPIC_* 或 OCR_LLM_* 環境變數優先於 config。診斷:env | rg 'ANTHROPIC|OCR_LLM'。顯式的 --provider/--model 命令列旗標優先級最高,是「我要確保這次用這個」的最終手段。
| 症狀 | 可能原因 | 解決方案 |
|---|---|---|
| 設了 model 但實際跑的是別的 | 殘留的 ANTHROPIC_* / OCR_LLM_* env 優先於 config | env | rg 'ANTHROPIC|OCR_LLM' 找殘留;用 --model 顯式覆蓋 |
| config set 後檔案被「重新格式化」 | 每次 set 會重寫整個 JSON,手動排版被覆蓋 | 把想保留的註解/格式寫進 set 腳本,別手改 JSON |
| extra_body 沒生效 | protocol 不支援該欄位,或 key 名不符廠商規格 | 對照廠商 API 文件確認欄位名與值格式 |
| timeout_sec 設了沒用 | per-provider timeout 被 OCR_LLM_TIMEOUT env 覆蓋 | unset OCR_LLM_TIMEOUT 或直接設 env 當統一值 |
| CI 行為與本機不同 | CI 用 env、本機用 config,兩者沒同步 | 把決策點寫進版本化腳本,CI 用 env 覆蓋「只有 CI 該有」的差異 |
ocr llm test 先測本地、失敗才提示改用雲端」。--provider/--model 命令列旗標仍然有效——它們在解析鏈的哪一層介入?retry_codes 把 403 加入重試清單的風險是什麼?在什麼情況下「重試 403」是安全的?你的 OCR 要跑在 開發者本機(dev)、CI(staging)、內部模型閘道(prod) 三個環境,但每個環境的 provider、模型、超時、retry 都不一樣。你要一套「設定即程式碼」的治理方案:環境分層、secret 不外洩、變更可 review。
# .env.example(提交進 repo,不含 secret)
# dev(本機): 開發者自己的 key
export OCR_LLM_URL="https://api.siliconflow.com/v1"
export OCR_LLM_MODEL="deepseek-v3"
# ci(GitHub Actions secret): 集中管理的 key
export OCR_LLM_URL="https://gateway.internal.com/v1"
export OCR_LLM_MODEL="claude-opus-4-6"
# prod(內部閘道): 內網模型,diff 不出網
export OCR_LLM_URL="http://vllm.internal:8000/v1"
export OCR_LLM_MODEL="qwen3-32b"
因為「env > config」,每個環境只需注入對應的 OCR_LLM_*,config.json 只放「三個環境共用的決策」。
# 共用決策(提交進 repo 給人 review)
ocr config set language 中文
ocr config set max_tokens 150000
ocr config set telemetry.enabled true
ocr config set telemetry.exporter otlp
# secret 一律走 env,永遠不寫進 config.json
# scripts/verify-env.sh <dev|ci|prod> —— 每次改設定後先驗證再上
source ".env.$1"
env | rg 'OCR_LLM|ANTHROPIC' | sed 's/=.*/=/' # 確認沒有殘留
ocr llm test # 確認三元組真的生效
# GitHub Actions: secrets 裡放 prod 的 OCR_LLM_*,跑評審前不用任何 ocr config set
# 本機 dev 的人用 .env.dev + 自己的 key —— 兩者互不污染
多環境設定的核心規則是「環境差異走 env、共用決策走 config、secret 只走 env」。因為解析鏈「env > config」,只要每環境注入 OCR_LLM_*,config 就退居「共用預設」——不用在 config 裡做條件分支。secret 永不進 config.json(它是純文字、易被 commit),一切可 review、可重放。
預期產出
dev: siliconflow / deepseek-v3 / 自己的 key
ci: gateway / claude-opus-4-6 / 集中 key(Actions secret)
prod: vllm / qwen3-32b / 內網、無 key
驗證: 三環境 ocr llm test 全過,git diff 只看到 .env.example 與共用 config
幾個設定的成本槓桿:max_tokens 越大,壓縮觸發越晚但每次 prompt 越大;retry_codes 把 403 加入重試可能放大成本(每次都重試到成功或超時);providers.<name>.extra_body 關掉 thinking 輸出可直接省下 reasoning token。成本敏感環境:用 extra_body 關 thinking + 調低 max_tokens。
「本機跟 CI 行為不一致」九成是設定漂移——本機殘留 ANTHROPIC_* env、或本機 config 比 CI 新。品質措施:① 把「共用決策」全部集中到一個版本化腳本;② CI 的 model 版本 pin 住(claude-opus-4-6@2026-08-01 風格);③ 每次評審的 JSON llm.provider/model 欄位就是「設定快照」——拿它跟團隊標準對照。
① api_key 寫進 config.json 就會被 ocr config set 重寫時保留在純文字檔——避免手改 config.json 放 key;② 殘留的 ANTHROPIC_AUTH_TOKEN 可能把流量導向非預期端點——定期 env | rg 'ANTHROPIC|OCR_LLM' 檢查;③ 自訂 provider 的 url 若被改寫,評審的 diff 會送到惡意端點——config.json 用 600 權限保護。
| 面向 | 本文(設定) | 相關文 | 差異說明 |
|---|---|---|---|
| provider | 18 內建 + 自訂 + protocol 三種取值 | mcp.html | 設定頁管「LLM 端點」;MCP 頁管「工具端點」——兩者都寫進 config.json 但屬不同命名空間 |
| 端點解析 | 六步解析鏈、env > config | faq.html(no valid endpoint) | FAQ 是「報錯時的診斷」;設定頁教「為何是這個優先級」——因果 vs 症狀 |
| telemetry 設定 | 只提 telemetry.* 鍵 | telemetry.html | 設定頁管「開關」,telemetry 頁管「怎麼用」(exporter/span/metric/儀表板) |
| OCI 環境 | env 注入 OCR_LLM_* | cicd.html | 設定頁說明「env 優先」;CI/CD 頁把這變成「secret 只在 CI 注入」的實務 |
OCR_LLM_* env 表達而非 config 分支env | rg 'ANTHROPIC|OCR_LLM' 找出殘留 env 並診斷「設了沒生效」extra_body 關掉 thinking 輸出省 tokenretry_codes 把 403 加入重試的風險與適用條件llm.provider/model 當設定快照做漂移檢查