OpenCode-এ একটা কাস্টম OpenAI-compatible provider যোগ করুন।

Updated 2026-07-29

OpenCode সরাসরি opencode.json থেকে কাস্টম provider পড়ে। @ai-sdk/openai-compatible package দিয়ে একটা provider block declare করুন, options.baseURL-কে https://api.apisrouter.com/v1-এ point করুন, এবং আপনি যে মডেল list করেন তার প্রতিটা এক key-এর নিচে /models picker-এ selectable হয়ে যায়।

দ্রুত উত্তর: opencode.json-এ এক provider block।

OpenCode natively কাস্টম OpenAI-compatible provider সাপোর্ট করে। npm-কে "@ai-sdk/openai-compatible"-এ সেট করে opencode.json-এ একটা provider entry যোগ করুন, options.baseURL-কে https://api.apisrouter.com/v1-এ সেট করুন, {env:...} template দিয়ে environment variable থেকে key পড়ুন, এবং models-এর নিচে আপনি যে model id চান তা list করুন। তারপর top-level model field-কে "apisrouter/<model-id>"-এ সেট করুন এবং OpenCode পুরো agent loop gateway দিয়ে route করে। এটা OpenCode docs-এর documented কাস্টম-provider path, কোনো wrapper বা fork নয়। Config file আপনার project root-এ (opencode.json) অথবা globally ~/.config/opencode/opencode.json-এ থাকে, এবং দুটো merge হয়, তাই provider block একবার declare করে প্রতিটা repo জুড়ে reuse করা যায়।

{
  "$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"
}

OpenCode কীভাবে provider এবং model resolve করে।

OpenCode (GitHub-এ anomalyco, প্রায় 186K star-সহ সবচেয়ে বেশি star পাওয়া terminal coding agent-গুলোর একটা) Vercel AI SDK-এর উপর এর provider layer বানায়। একটা provider block-এর npm field বলে দেয় OpenCode সেই provider-এর সাথে কথা বলতে কোন SDK package load করে: "@ai-sdk/openai-compatible" standard /v1/chat/completions protocol বলে, যেখানে "@ai-sdk/openai" OpenAI-এর /v1/responses protocol বলে। একটা multi-vendor gateway chat completions serve করে, তাই openai-compatible সঠিক package; একটা chat-completions endpoint-এর বিরুদ্ধে "@ai-sdk/openai" বেছে নেওয়া এই setup ভাঙার সবচেয়ে সাধারণ উপায়। Model provider/model pair হিসেবে address করা হয়। provider id হলো আপনি provider block-এ যে key বেছেছেন (উপরে "apisrouter"), এবং model id হলো models map-এর ভেতরের key, তাই default model হয়ে যায় "apisrouter/claude-sonnet-4-6"। আপনি যা declare করেন তা সবই TUI-এর ভেতরে /models picker-এ দেখা যায়, mid-session switchable। Internalize করার যোগ্য একটা behavior: কাস্টম provider-এর জন্য, models map একটা allowlist। Built-in provider একটা known catalog সহ ship করে, কিন্তু OpenCode নিজে থেকে একটা কাস্টম endpoint-এর model enumerate করতে পারে না, তাই শুধু আপনি explicitly declare করা id-ই addressable। baseURL-এর পেছনের endpoint পাশাপাশি Claude, GPT, DeepSeek, এবং Kimi id serve করলে, প্রতি model একটা entry declare করা picker-কে একটা single key-এর পেছনে একটা cross-vendor switchboard বানিয়ে দেয়।

সম্পূর্ণ সেটআপ: global config, project config, per-model limit।

Clean layout হলো global config-এ ~/.config/opencode/opencode.json-এ provider একবার declare করা এবং প্রতিটা project-এর opencode.json-এ শুধু per-repo choice (কোন model, কোন agent) রাখা। OpenCode config file replace না করে merge করে, তাই project file ছোট থাকে এবং provider block কখনো duplicate হয় না। {env:APISROUTER_API_KEY} template load time-এ environment থেকে resolve হয়, যা key-কে commit হয়ে যেতে পারে এমন যেকোনো file-এর বাইরে রাখে। আপনার shell profile থেকে এটা export করুন যাতে OpenCode launch করা প্রতিটা terminal session এটা দেখতে পারে। প্রতিটা model entry context এবং output token ceiling সহ একটা limit object-ও accept করে। এগুলো declare করা দেখতে যতটা মনে হয় তার চেয়ে বেশি গুরুত্বপূর্ণ: OpenCode context figure ব্যবহার করে ঠিক করে কখন একটা session-এ summarization দরকার, তাই limit ছাড়া declare করা একটা long-context model যতটা হওয়া উচিত তার চেয়ে বেশি conservatively treat হয়। limit.context-কে model আসলে যা সাপোর্ট করে তাতে সেট করুন এবং লম্বা session আগে না হয়ে পরে compact হয়।

{
  "$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"
}

model এবং small_model বেছে নেওয়া।

Practical workflow হলো main slot-কে আপনি edit-এর জন্য যে model trust করেন তাতে রাখা এবং benchmark-এর বদলে real session-এর মধ্য দিয়ে candidate rotate করা: আপনার নিজের codebase-এ বাস্তব diff-এর একটা বিকেল একটা leaderboard-এর চেয়ে বেশি বলে দেয়। এক endpoint দিয়ে route করা প্রতিটা candidate-কে একটা one-line change বানিয়ে দেয়, এবং per-key usage view দেখায় প্রতিটা experiment আসলে কত খরচ করেছে।

  • model main agent loop চালায়: file পড়া, edit plan করা, diff লেখা, tool চালানো। এই slot সবচেয়ে লম্বা context দেখে এবং আসল engineering করে, তাই একটা frontier coding model (claude-sonnet-4-6, claude-opus-4-7, gpt-5.5)-এর জায়গা এখানে।
  • small_model session title generation-এর মতো lightweight task handle করে। এটা প্রায়ই fire হয় কিন্তু কখনো coding কাজ বহন করে না, তাই একটা fast, inexpensive id-ই সঠিক shape; title-এ frontier token পোড়ানোর কোনো কারণ নেই।
  • gpt-5.6-sol এবং kimi-k2.7-code-এর মতো coding-tuned id declare করার যোগ্য এমনকি সেগুলো আপনার default না হলেও: একটা refactor-heavy session-এর জন্য সেগুলোতে switch করা একটা /models selection, config edit নয়।
  • দুই slot-ই যেহেতু একই provider block-এর বিরুদ্ধে provider/model string নেয়, main এবং small slot একই session-এ ভিন্ন vendor থেকে আসতে পারে, যা কোনো single-vendor key allow করে না।

ব্যবহার অনুযায়ী পেমেন্ট · অফিশিয়াল মূল্যের নিচে

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

মডেলঅফিশিয়াল মূল্যআমাদের মূল্য
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

OpenCode কাস্টম provider-specific failure mode।

ভুল SDK package। "@ai-sdk/openai" /v1/responses-এ post করে; একটা chat-completions gateway একটা error দিয়ে সেই route-এর জবাব দেয়। আপনার প্রথম request একটা auth error না হয়ে একটা protocol- বা route-shaped error দিয়ে fail করলে, npm field ঠিক "@ai-sdk/openai-compatible" বলছে কিনা check করুন। Picker থেকে model অনুপস্থিত। কাস্টম-provider model শুধু declare করা থাকলেই বিদ্যমান; models key-তে একটা typo, বা আপনি ধরে নিয়েছেন কিন্তু কখনো যোগ করেননি এমন একটা id, শুধু /models-এ দেখা যায় না। Id গুলো exact string version suffix সহ, এবং gateway-র /v1/models listing হলো copy করার source of truth। Unresolved {env:...}। Template OpenCode launch করা process-এর environment থেকে resolve হয়। একটা terminal-এ export করা একটা key অন্য একটা terminal থেকে launch করা একটা OpenCode instance-এ বা আপনার profile কখনো source না করা একটা desktop launcher থেকে পৌঁছায় না। export-টা shell profile-এ রাখুন, কোনো one-off session-এ নয়। Config-merge surprise। যেহেতু global এবং project config merge হয়, model-কে ভিন্ন provider-এ সেট করা একটা project opencode.json নীরবে আপনার global default override করে, এবং একটা পুরনো project-এ বেঁচে যাওয়া একটা provider block expectation-কে shadow করতে পারে। routing ভুল দেখালে, gateway misbehave করেছে ধরে নেওয়ার আগে দুটো file পড়ুন। /v1 ছাড়া baseURL। SDK আপনার দেওয়া base-এ /chat/completions-এর মতো route path append করে, তাই https://api.apisrouter.com/v1 সঠিক এবং bare host নয়। অন্যথায়-সঠিক একটা config-এ একটা connection বা 404-shaped failure প্রায় সবসময়ই এটাই।

কারা একটা gateway দিয়ে OpenCode route করে।

  • Developer যারা সারাদিন TUI-তে থাকেন এবং প্রতি vendor-এ আলাদা provider credential maintain না করে এক /models picker-এ Claude, GPT, এবং Kimi চান।
  • Engineer যারা real কাজে coding model তুলনা করেন। প্রতিটা candidate একটা declared entry এবং একটা picker selection; session-by-session comparison-এর কোনো নতুন account দরকার নেই।
  • Team যারা এক secret standardize করে। onboarding docs-এ একটা single APISROUTER_API_KEY একটা per-vendor key checklist-এর জায়গা নেয়, এবং per-key usage দেখায় কে কী খরচ করছে।
  • ব্যবহারকারী যারা একটা frontier main model-এর সাথে ভিন্ন vendor-এর একটা low-priced small_model pair করেন, যা single-vendor config প্রকাশ করতে পারে না।
  • Developer যাদের কোনো নির্দিষ্ট vendor-এর billing-এ access নেই। কোনো card requirement ছাড়া Top-up based access প্রতি provider sign-up dependency সরিয়ে দেয়।

Endpoint verify করুন এবং প্রথম session debug করুন।

একটা session শুরু করার আগে, gateway যা serve করে তা list করুন। /v1/models দ্বারা ফেরত আসা id গুলো ঠিক সেই string যাতে আপনার models map key মিলতে হবে। First-session failure consistent। একটা 401 মানে APISROUTER_API_KEY OpenCode process-এ visible ছিল না; আপনি যে terminal থেকে launch করছেন সেখানেই variable echo করুন। gateway থেকে একটা model-not-found error মানে declared key একটা served id-এর সাথে মেলে না, version suffix সহ। provider একদমই না দেখালে, JSON validate করুন, যেহেতু একটা trailing comma বা misplaced brace পুরো file-কে unreadable করে দেয় এবং OpenCode default-এ fall back করে। Request চলতে শুরু করলে, APIsRouter console per-request model, token count, এবং spend দেখায়। Coding agent হলো long-context, many-turn workload, এবং কোন session এবং কোন model token খরচ করছে তা দেখাই বলে দেয় main slot এর দাম উসুল করছে কিনা।

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

সাধারণ প্রশ্ন

OpenCode কি এক কাস্টম provider দিয়ে Claude, GPT, এবং Kimi মডেল ব্যবহার করতে পারে?

হ্যাঁ। একটা কাস্টম provider শুধু একটা baseURL প্লাস একটা models allowlist। endpoint একাধিক vendor serve করলে, প্রতি id একটা entry declare করুন এবং প্রতিটা declared model একই provider ও key-এর নিচে /models picker-এ দেখা যায়, mid-session switchable।

opencode.json-এ API key কোথায় যায়?

options.apiKey-তে environment template ব্যবহার করে, উদাহরণ হিসেবে "{env:APISROUTER_API_KEY}"। Template load time-এ resolve হয় তাই literal key কখনো config file-এ বসে থাকে না। আপনার shell profile থেকে variable export করুন যাতে OpenCode launch করা প্রতিটা terminal এটা inherit করে।

Provider block কি global নাকি project config-এ থাকা উচিত?

Global, ~/.config/opencode/opencode.json-এ। OpenCode config file merge করে, তাই provider একবার globally declare করা এবং শুধু প্রতি project model choice সেট করা repo-কে credential plumbing থেকে মুক্ত রাখে এবং duplicated block আলাদা হয়ে যাওয়া এড়ায়।

আমার model কেন /models picker-এ দেখা যাচ্ছে না?

কাস্টম-provider model অবশ্যই explicitly declare করতে হবে; OpenCode একটা কাস্টম endpoint enumerate করতে পারে না। models map-এ exact id string আছে কিনা check করুন, version suffix সহ, এবং memory থেকে টাইপ না করে gateway-র /v1/models response থেকে id copy করুন।

@ai-sdk/openai-compatible এবং @ai-sdk/openai-এর মধ্যে পার্থক্য কী?

@ai-sdk/openai-compatible /v1/chat/completions বলে, যে protocol multi-vendor gateway serve করে। @ai-sdk/openai OpenAI-এর /v1/responses protocol বলে। APIsRouter-এর জন্য, @ai-sdk/openai-compatible ব্যবহার করুন; অন্য package এমন একটা route-এ post করবে যা gateway এই purpose-এর জন্য serve করে না।

Declared context limit কি আসলে গুরুত্বপূর্ণ?

হ্যাঁ। OpenCode limit.context ব্যবহার করে ঠিক করে কখন একটা session-এ compaction দরকার। একটা long-context model-এ limit undeclared রাখলে session প্রয়োজনের চেয়ে আগে summarize হয়ে যায়, তাই limit.context এবং limit.output-কে model genuinely যা সাপোর্ট করে তাতে সেট করুন।