OpenCode 自接 API 中轉教學:設定 Limit 與 Reasoning 解決上下文壓縮錯誤

  • 22
  • 0

最近在 OpenCode IDE 上面接第三方中轉商的 API 中轉。

基本上只要對方有做 OpenAI Compatible API,要接進 OpenCode 都不難
Provider、baseURL、Model 設好,API Key 補上,大部分就可以直接跑

但我後來發現,自接模型雖然可以正常用,OpenCode 不一定知道這顆模型真正的規格

像是 Context 到底有多大、單次 Output 可以多少,還有它支援哪些 Reasoning Level,這些有時候都要自己補
除非是有跟 OpenCode 提報的那些廠商跟參數預設都會自己出現,因為這關係到自動上下文壓縮的問題
 

我這邊是 Windows,用的是 jsonc,設定檔放在:

%USERPROFILE%\.config\opencode\opencode.jsonc

ex.

C:\Users\你的帳號\.config\opencode\opencode.jsonc

我這邊用假的 fookey 當中轉範例,模型用 kimi-k3

原本大概長這樣:

"fookey": {
  "name": "fookey",
  "npm": "@ai-sdk/openai-compatible",
  "options": {
    "baseURL": "https://api.fookey.com/v1"
  },
  "models": {
    "kimi-k3": {
      "name": "kimi-k3"
    }
  }
}

這樣其實就已經可以正常使用了。

只是如果中轉本身有提供比較大的 Context,或是模型有支援不同推理程度,就可以再自己補上..

1. 調整 Context

先找到:

"models": {
  "kimi-k3": {
    "name": "kimi-k3"
  }
}

加入 limit

"models": {
  "kimi-k3": {
    "name": "kimi-k3",
    "limit": {
      "context": 900000,
      "output": 32768
    }
  }
}

這邊:

context = 900000

就是告訴 OpenCode,這顆模型的 Context Window 按照 900K 來算

另外

output = 32768

就是單次最大 output token,如果不知道模型參數又不想問中轉商,可以問問 AI 試試看,有時候中轉商也不知道參數多少 :o
 

OpenCode 跑 Agent 久了之後,前面讀過的 Code、Tool Call、聊天內容、修改紀錄都會一直累積進 Context
快滿的時候就會開始做 Compaction

如果中轉實際可以吃比較大的 Context,但是 OpenCode 不知道,就可能提早開始壓縮,或是不壓縮直接讓中轉商跳出錯誤,所以自接模型的話,我現在會把真正的 Context 補上

不過這邊有一個要注意

你寫 "context": 900000

不是把原本只有 128K 的模型硬改成 900K,即使是 1M ,這邊限制大概留個八九成是最好的

這個只是告訴 OpenCode,這顆模型可以吃到 900000,你按照這個數字管理 Context,真正能吃多少,還是看你的中轉跟上游...

如果中轉實際只支援 256K,你這邊填 900K,超過一樣會錯,所以這個數字還是照中轉真正支援的規格去填

2. 調整推理程度

另外一個就是 OpenCode 有些模型旁邊會看到

none
low
medium
high
xhigh

我一開始看到還以為是速度,後來才發現這個其實是推理程度。

如果你的中轉有支援這幾個 Reasoning Level,就可以直接在 Model 裡面加入 variants

"variants": {
  "none": {
    "reasoningEffort": "none"
  },
  "low": {
    "reasoningEffort": "low"
  },
  "medium": {
    "reasoningEffort": "medium"
  },
  "high": {
    "reasoningEffort": "high"
  },
  "xhigh": {
    "reasoningEffort": "xhigh"
  }
}

加入之後,OpenCode 裡面就可以直接切這顆模型不同的推理程度
從  none 不推理,跟 xhigh 最高推理,當然這名詞有的不一樣的,有的會用 max 等等,這要看中轉商的規格書


3. 最後完整設定

最後我的設定就是:

"fookey": {
  "name": "fookey",
  "npm": "@ai-sdk/openai-compatible",
  "options": {
    "baseURL": "https://api.fookey.com/v1"
  },
  "models": {
    "kimi-k3": {
      "name": "kimi-k3",
      "limit": {
        "context": 900000,
        "output": 32768
      },
      "variants": {
        "none": {
          "reasoningEffort": "none"
        },
        "low": {
          "reasoningEffort": "low"
        },
        "medium": {
          "reasoningEffort": "medium"
        },
        "high": {
          "reasoningEffort": "high"
        },
        "xhigh": {
          "reasoningEffort": "xhigh"
        }
      }
    }
  }
}

這次其實就是改

%USERPROFILE%\.config\opencode\opencode.jsonc

然後在自己的 Model 裡面補兩個東西

limit
variants

limit 是讓 OpenCode 知道這顆模型的 Context 跟 Output,variants 則是把中轉有支援的推理程度加進去

自接中轉原本只要 API 能通其實就可以用了,不過如果中轉本身有給比較大的 Context,或是有支援不同 Reasoning Level,我覺得這兩個設定還是可以順手補一下..

---

The bug existed in all possible states.
Until I ran the code.