Tambah penyedia custom serasi OpenAI ke OpenCode.

Updated 2026-07-29

OpenCode membaca penyedia custom terus daripada opencode.json. Isytiharkan blok penyedia dengan pakej @ai-sdk/openai-compatible, arahkan options.baseURL ke https://api.apisrouter.com/v1, dan setiap model yang anda senaraikan menjadi boleh dipilih dalam pemilih /models di bawah satu kunci.

Jawapan pantas: satu blok penyedia dalam opencode.json.

OpenCode menyokong penyedia custom serasi OpenAI secara natif. Tambah entri penyedia ke opencode.json dengan npm ditetapkan kepada "@ai-sdk/openai-compatible", tetapkan options.baseURL kepada https://api.apisrouter.com/v1, baca kunci daripada pembolehubah persekitaran dengan templat {env:...}, dan senaraikan id model yang anda mahu di bawah models. Kemudian tetapkan medan model peringkat atas kepada "apisrouter/<model-id>" dan OpenCode menghalakan seluruh gelung ejen melalui gateway. Ini ialah laluan penyedia custom terdokumentasi dalam dokumen OpenCode, bukan pembungkus atau fork. Fail konfigurasi berada sama ada di punca projek anda (opencode.json) atau secara global di ~/.config/opencode/opencode.json, dan kedua-duanya digabungkan, jadi blok penyedia boleh diisytiharkan sekali dan digunakan semula merentas setiap repo.

{
  "$schema": "https://opencode.ai/config.json",
  "provider": {
    "apisrouter": {
      "npm": "@ai-sdk/openai-compatible",
      "name": "APIsRouter",
      "options": {
        "baseURL": "https://api.apisrouter.com/v1",
        "apiKey": "{env:APISROUTER_API_KEY}"
      },
      "models": {
        "claude-sonnet-4-6": { "name": "Claude Sonnet 4.6" }
      }
    }
  },
  "model": "apisrouter/claude-sonnet-4-6"
}

Bagaimana OpenCode menyelesaikan penyedia dan model.

OpenCode (anomalyco di GitHub, salah satu ejen pengekodan terminal paling berbintang pada lebih kurang 186K bintang) membina lapisan penyedianya di atas Vercel AI SDK. Medan npm dalam blok penyedia menamakan pakej SDK mana yang dimuatkan OpenCode untuk bertutur dengan penyedia itu: "@ai-sdk/openai-compatible" bertutur protokol /v1/chat/completions standard, manakala "@ai-sdk/openai" bertutur protokol /v1/responses OpenAI. Gateway berbilang vendor melayani chat completions, jadi openai-compatible ialah pakej yang betul; memilih "@ai-sdk/openai" terhadap endpoint chat-completions adalah cara paling biasa persediaan ini rosak. Model dialamatkan sebagai pasangan penyedia/model. Id penyedia ialah apa sahaja kunci yang anda pilih dalam blok penyedia ("apisrouter" di atas), dan id model ialah kunci di dalam peta models, jadi model lalai menjadi "apisrouter/claude-sonnet-4-6". Segala yang anda isytiharkan muncul dalam pemilih /models di dalam TUI, boleh ditukar semasa sesi. Satu tingkah laku berbaloi dihayati: bagi penyedia custom, peta models ialah senarai benar. Penyedia terbina membawa katalog yang diketahui, tetapi OpenCode tidak dapat menyenaraikan model endpoint custom sendiri, jadi hanya id yang anda isytiharkan secara eksplisit boleh dicapai. Apabila endpoint di sebalik baseURL melayani id Claude, GPT, DeepSeek, dan Kimi berdampingan, mengisytiharkan satu entri per model menjadikan pemilih itu papan suis merentas vendor di sebalik satu kunci.

Persediaan penuh: konfigurasi global, konfigurasi projek, had per-model.

Susun atur yang bersih ialah mengisytiharkan penyedia sekali dalam konfigurasi global di ~/.config/opencode/opencode.json dan hanya menyimpan pilihan per-repo (model mana, ejen mana) dalam opencode.json setiap projek. OpenCode menggabungkan fail konfigurasi dan bukan menggantikannya, jadi fail projek kekal kecil dan blok penyedia tidak pernah diduplikasi. Templat {env:APISROUTER_API_KEY} diselesaikan pada masa muat daripada persekitaran, yang mengekalkan kunci di luar mana-mana fail yang mungkin di-commit. Eksport ia daripada profil shell anda supaya setiap sesi terminal yang melancarkan OpenCode dapat melihatnya. Setiap entri model juga menerima objek had dengan siling token konteks dan output. Mengisytiharkannya penting lebih daripada kelihatannya: OpenCode menggunakan angka konteks untuk memutuskan bila sesi memerlukan ringkasan, jadi model konteks-panjang yang diisytiharkan tanpa had dilayan lebih berhati-hati daripada sepatutnya. Tetapkan limit.context kepada apa yang benar-benar disokong model dan sesi panjang dipadatkan kemudian dan bukan lebih awal.

{
  "$schema": "https://opencode.ai/config.json",
  "provider": {
    "apisrouter": {
      "npm": "@ai-sdk/openai-compatible",
      "name": "APIsRouter",
      "options": {
        "baseURL": "https://api.apisrouter.com/v1",
        "apiKey": "{env:APISROUTER_API_KEY}"
      },
      "models": {
        "claude-opus-4-7":   { "name": "Claude Opus 4.7",   "limit": { "context": 200000, "output": 32000 } },
        "claude-sonnet-4-6": { "name": "Claude Sonnet 4.6", "limit": { "context": 200000, "output": 64000 } },
        "gpt-5.5":           { "name": "GPT-5.5" },
        "gpt-5.6-sol": { "name": "GPT-5.6 Sol" },
        "kimi-k2.7-code":    { "name": "Kimi K2.7 Code" }
      }
    }
  },
  "model": "apisrouter/claude-sonnet-4-6",
  "small_model": "apisrouter/kimi-k2.7-code"
}

Memilih model dan small_model.

Aliran kerja praktikal ialah mengekalkan slot utama pada model yang anda percaya untuk edit dan menggilirkan calon melalui sesi sebenar dan bukan tanda aras: satu petang diff sebenar berbanding pangkalan kod anda sendiri memberitahu anda lebih daripada papan pendahulu. Menghalakan melalui satu endpoint menjadikan setiap calon perubahan satu baris, dan pandangan penggunaan per-kunci menunjukkan apa yang sebenarnya dikos setiap eksperimen.

  • model memandu gelung ejen utama: membaca fail, merancang edit, menulis diff, menjalankan alat. Slot ini melihat konteks paling panjang dan melakukan kejuruteraan sebenar, jadi model pengekodan frontier (claude-sonnet-4-6, claude-opus-4-7, gpt-5.5) tergolong di sini.
  • small_model mengendalikan tugas ringan seperti penjanaan tajuk sesi. Ia menembak kerap tetapi tidak pernah membawa kerja pengekodan, jadi id pantas dan murah adalah bentuk yang betul; tiada sebab membakar token frontier untuk tajuk.
  • Id dilaraskan pengekodan seperti gpt-5.6-sol dan kimi-k2.7-code berbaloi diisytiharkan walaupun ia bukan lalai anda: bertukar kepadanya untuk sesi penuh refactor adalah satu pemilihan /models, bukan suntingan konfigurasi.
  • Kerana kedua-dua slot mengambil rentetan penyedia/model terhadap blok penyedia yang sama, slot utama dan kecil boleh datang daripada vendor berbeza dalam sesi yang sama, sesuatu yang tidak dibenarkan mana-mana kunci vendor tunggal.

Bayar mengikut penggunaan · bawah harga rasmi

Selected models are priced below official list prices. Exact input, output, cache, and per-request prices are shown for each model.

ModelHarga RasmiHarga Kami
Claude Sonnet 4.6$3.00 / $15.00 per M$2.40 / $12.00 per M
Claude Opus 4.7$5.00 / $25.00 per M$4.00 / $20.00 per M
GPT-5.5$5.00 / $30.00 per M$4.00 / $24.00 per M
GPT-5.6 Sol$5.00 / $30.00 per M$4.00 / $24.00 per M
Kimi K2.7 Code$0.95 / $4.00 per M$1.00 / $4.00 per M

Mod kegagalan khusus penyedia custom OpenCode.

Pakej SDK yang salah. "@ai-sdk/openai" menghantar ke /v1/responses; gateway chat-completions menjawab laluan itu dengan ralat. Jika permintaan pertama anda gagal dengan ralat berbentuk protokol atau route dan bukan ralat pengesahan, semak medan npm menyatakan tepat "@ai-sdk/openai-compatible". Model tiada dalam pemilih. Model penyedia custom hanya wujud jika diisytiharkan; kesilapan taip dalam kunci models, atau id yang anda anggap tetapi tidak pernah ditambah, hanya tidak muncul dalam /models. Id ialah rentetan tepat termasuk akhiran versi, dan senarai /v1/models gateway adalah punca kebenaran untuk disalin. {env:...} yang tidak diselesaikan. Templat diselesaikan daripada persekitaran proses yang melancarkan OpenCode. Kunci yang dieksport dalam satu terminal tidak mencapai instans OpenCode yang dilancarkan daripada terminal lain atau daripada pelancar desktop yang tidak pernah menyumber profil anda. Letakkan eksport dalam profil shell, bukan sesi sekali sahaja. Kejutan penggabungan konfigurasi. Kerana konfigurasi global dan projek digabungkan, opencode.json projek yang menetapkan model kepada penyedia berbeza secara senyap mengatasi lalai global anda, dan blok penyedia terbiar dalam projek lama boleh membayangi jangkaan. Apabila penghalaan kelihatan salah, baca kedua-dua fail sebelum menganggap gateway berkelakuan buruk. baseURL tanpa /v1. SDK melampirkan laluan route seperti /chat/completions kepada apa sahaja asas yang anda berikan, jadi https://api.apisrouter.com/v1 adalah betul dan hos kosong bukan. Kegagalan berbentuk sambungan atau 404 pada konfigurasi yang sebaliknya betul hampir selalu ini.

Siapa yang menghalakan OpenCode melalui gateway.

  • Pembangun yang hidup dalam TUI sepanjang hari dan mahu Claude, GPT, dan Kimi dalam satu pemilih /models dan bukan menyelenggara kelayakan penyedia berasingan setiap vendor.
  • Jurutera yang membandingkan model pengekodan pada kerja sebenar. Setiap calon adalah satu entri yang diisytiharkan dan satu pemilihan pemilih; perbandingan sesi demi sesi tidak memerlukan akaun baharu.
  • Pasukan yang menstandardkan satu rahsia. Satu APISROUTER_API_KEY dalam dokumen orientasi menggantikan senarai semak kunci per-vendor, dan penggunaan per-kunci menunjukkan siapa membelanjakan apa.
  • Pengguna yang menggandingkan model utama frontier dengan small_model berharga rendah daripada vendor berbeza, sesuatu yang tidak dapat diungkapkan konfigurasi vendor tunggal.
  • Pembangun tanpa akses kepada pengebilan vendor tertentu. Akses berasaskan top-up tanpa keperluan kad menghapuskan kebergantungan pendaftaran setiap penyedia.

Sahkan endpoint dan nyahpepijat sesi pertama.

Sebelum memulakan sesi, senaraikan apa yang dilayani gateway. Id yang dikembalikan /v1/models adalah tepat rentetan yang mesti sepadan dengan kunci peta models anda. Kegagalan sesi pertama adalah konsisten. 401 bermaksud APISROUTER_API_KEY tidak kelihatan kepada proses OpenCode; echo pembolehubah dalam terminal yang sama anda lancarkan daripadanya. Ralat model-tidak-ditemui daripada gateway bermaksud kunci yang diisytiharkan tidak sepadan id yang dilayani, termasuk akhiran versi. Jika penyedia tidak muncul langsung, sahkan JSON itu, kerana koma tersasar atau kurungan tersalah letak menjadikan seluruh fail tidak boleh dibaca dan OpenCode kembali kepada lalai. Sebaik sahaja permintaan mengalir, konsol APIsRouter menunjukkan model per permintaan, kiraan token, dan perbelanjaan. Ejen pengekodan adalah beban kerja konteks panjang dan banyak giliran, dan melihat sesi mana dan model mana yang menggunakan token adalah cara anda memutuskan sama ada slot utama layak mendapat harganya.

curl -s https://api.apisrouter.com/v1/models \
  -H "Authorization: Bearer $APISROUTER_API_KEY" | head -50

Soalan lazim

Bolehkah OpenCode menggunakan model Claude, GPT, dan Kimi melalui satu penyedia custom?

Ya. Penyedia custom hanyalah baseURL ditambah senarai benar models. Apabila endpoint melayani berbilang vendor, isytiharkan satu entri per id dan setiap model yang diisytiharkan muncul dalam pemilih /models di bawah penyedia dan kunci yang sama, boleh ditukar semasa sesi.

Di mana kunci API diletakkan dalam opencode.json?

Dalam options.apiKey menggunakan templat persekitaran, contohnya "{env:APISROUTER_API_KEY}". Templat itu diselesaikan pada masa muat supaya kunci literal tidak pernah berada dalam fail konfigurasi. Eksport pembolehubah itu daripada profil shell anda supaya setiap terminal yang melancarkan OpenCode mewarisinya.

Patutkah blok penyedia berada dalam konfigurasi global atau projek?

Global, di ~/.config/opencode/opencode.json. OpenCode menggabungkan fail konfigurasi, jadi mengisytiharkan penyedia sekali secara global dan hanya menetapkan pilihan model setiap projek mengekalkan repo bebas daripada urusan kelayakan dan mengelakkan blok yang diduplikasi menyimpang.

Mengapa model saya tidak muncul dalam pemilih /models?

Model penyedia custom mesti diisytiharkan secara eksplisit; OpenCode tidak dapat menyenaraikan endpoint custom. Semak peta models mengandungi rentetan id yang tepat, termasuk akhiran versi, dan salin id daripada respons /v1/models gateway dan bukan menaipnya daripada ingatan.

Apakah perbezaan antara @ai-sdk/openai-compatible dan @ai-sdk/openai di sini?

@ai-sdk/openai-compatible bertutur /v1/chat/completions, protokol yang dilayani gateway berbilang vendor. @ai-sdk/openai bertutur protokol /v1/responses OpenAI. Untuk APIsRouter, guna @ai-sdk/openai-compatible; pakej lain akan menghantar ke route yang tidak dilayani gateway untuk tujuan ini.

Adakah had konteks yang diisytiharkan benar-benar penting?

Ya. OpenCode menggunakan limit.context untuk memutuskan bila sesi memerlukan pemadatan. Membiarkan had tidak diisytiharkan pada model konteks-panjang bermaksud sesi diringkaskan lebih awal daripada perlu, jadi tetapkan limit.context dan limit.output kepada apa yang benar-benar disokong model.