OpenCode میں custom OpenAI-compatible provider شامل کریں۔

Updated 2026-07-29

OpenCode custom providers کو براہ راست opencode.json سے پڑھتا ہے۔ @ai-sdk/openai-compatible package کے ساتھ ایک provider block declare کریں، options.baseURL کو https://api.apisrouter.com/v1 پر point کریں، اور آپ جو بھی model فہرست کریں وہ ایک ہی key کے تحت /models picker میں منتخب کے قابل ہو جاتا ہے۔

فوری جواب: opencode.json میں ایک provider block۔

OpenCode custom OpenAI-compatible providers کو native طور پر سپورٹ کرتا ہے۔ opencode.json میں ایک provider entry شامل کریں جس کا npm "@ai-sdk/openai-compatible" پر set ہو، options.baseURL کو https://api.apisrouter.com/v1 پر set کریں، {env:...} template کے ساتھ environment variable سے key پڑھیں، اور models کے تحت وہ model ids فہرست کریں جو آپ چاہتے ہیں۔ پھر top-level model field کو "apisrouter/<model-id>" پر set کریں اور OpenCode پورا agent loop gateway کے ذریعے route کر دیتا ہے۔ یہ OpenCode docs میں documented custom-provider راستہ ہے، کوئی wrapper یا fork نہیں۔ config file آپ کے project root پر (opencode.json) یا globally ~/.config/opencode/opencode.json پر رہتی ہے، اور دونوں merge ہوتی ہیں، تو provider block ایک بار declare ہو کر ہر 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"
}

OpenCode providers اور models کیسے resolve کرتا ہے۔

OpenCode (GitHub پر anomalyco، تقریباً 186K stars کے ساتھ سب سے زیادہ starred terminal coding agents میں سے ایک) اپنی provider layer Vercel AI SDK پر بناتا ہے۔ provider block میں npm field یہ بتاتی ہے کہ OpenCode اس provider سے بات کرنے کے لیے کون سا SDK package لوڈ کرے: "@ai-sdk/openai-compatible" معیاری /v1/chat/completions protocol بولتا ہے، جبکہ "@ai-sdk/openai" OpenAI کا /v1/responses protocol بولتا ہے۔ ایک multi-vendor gateway chat completions سرو کرتا ہے، تو openai-compatible صحیح package ہے؛ ایک chat-completions endpoint کے خلاف "@ai-sdk/openai" چننا اس setup کے ٹوٹنے کا سب سے عام طریقہ ہے۔ Models کو provider/model جوڑوں کے طور پر address کیا جاتا ہے۔ provider id وہی key ہے جو آپ نے provider block میں چنی (اوپر "apisrouter")، اور model id models map کے اندر موجود key ہے، تو default model "apisrouter/claude-sonnet-4-6" بن جاتا ہے۔ آپ جو بھی declare کریں وہ TUI کے اندر /models picker میں نظر آتا ہے، session کے بیچ میں سوئچ کے قابل۔ ایک رویہ اندرونی کر لینے کے قابل: custom providers کے لیے، models map ایک allowlist ہے۔ Built-in providers ایک معلوم catalog کے ساتھ آتے ہیں، مگر OpenCode خود سے کسی custom endpoint کے models شمار نہیں کر سکتا، تو صرف وہی ids قابلِ رسائی ہوتی ہیں جو آپ واضح طور پر declare کریں۔ جب baseURL کے پیچھے موجود endpoint Claude، GPT، DeepSeek، اور Kimi ids ساتھ ساتھ سرو کرے، تو فی-model ایک entry declare کرنا picker کو ایک ہی key کے پیچھے cross-vendor switchboard میں بدل دیتا ہے۔

مکمل سیٹ اپ: global config، project config، فی-model limits۔

صاف ترتیب یہ ہے کہ provider کو ایک بار ~/.config/opencode/opencode.json کی global config میں declare کریں اور ہر project کے opencode.json میں صرف فی-repo انتخاب (کون سا model، کون سے agents) رکھیں۔ OpenCode config files کو replace کرنے کی بجائے merge کرتا ہے، تو project file چھوٹی رہتی ہے اور provider block کبھی duplicate نہیں ہوتا۔ {env:APISROUTER_API_KEY} template load time پر environment سے resolve ہوتا ہے، جو key کو کسی بھی ایسی file سے دور رکھتا ہے جو commit ہو سکے۔ اسے اپنے shell profile سے export کریں تاکہ ہر terminal session جو OpenCode لانچ کرے اسے دیکھ سکے۔ ہر model entry ایک limit object بھی قبول کرتا ہے جس میں context اور output token ceilings ہوتی ہیں۔ انہیں declare کرنا نظر آنے سے زیادہ اہم ہے: OpenCode context figure استعمال کرتا ہے یہ فیصلہ کرنے کے لیے کہ session کو کب summarization چاہیے، تو بغیر limits کے declare کیا گیا لمبے-context model اس سے زیادہ conservative treat ہوتا ہے جتنا اسے ہونا چاہیے۔ limit.context کو وہ set کریں جو model واقعی سپورٹ کرتا ہے اور لمبے sessions جلدی کی بجائے دیر سے 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 چننا۔

عملی workflow یہ ہے کہ main slot کو اس model پر رکھیں جس پر آپ edits کے لیے بھروسہ کریں اور candidates کو benchmarks کی بجائے حقیقی sessions پر گھمائیں: اپنے ہی codebase کے خلاف حقیقی diffs کی ایک شام کسی leaderboard سے زیادہ بتاتی ہے۔ ایک endpoint کے ذریعے route کرنا ہر candidate کو ایک-لائن change بنا دیتا ہے، اور per-key usage view ظاہر کرتا ہے کہ ہر experiment کی اصل لاگت کیا رہی۔

  • model اصل agent loop چلاتا ہے: files پڑھنا، edits کی منصوبہ بندی، diffs لکھنا، tools چلانا۔ یہ slot سب سے لمبے contexts دیکھتا ہے اور اصل engineering کرتا ہے، تو ایک frontier coding model (claude-sonnet-4-6، claude-opus-4-7، gpt-5.5) یہاں موزوں ہے۔
  • small_model session title generation جیسے ہلکے tasks سنبھالتا ہے۔ یہ اکثر چلتا ہے مگر کبھی coding کام نہیں کرتا، تو ایک تیز، سستی id صحیح انتخاب ہے؛ titles پر frontier tokens جلانے کی کوئی وجہ نہیں۔
  • gpt-5.6-sol اور kimi-k2.7-code جیسی coding-tuned ids declare کرنے کے قابل ہیں چاہے وہ آپ کی default نہ ہوں: refactor-heavy session کے لیے ان پر سوئچ کرنا ایک /models انتخاب ہے، config edit نہیں۔
  • چونکہ دونوں slots ایک ہی provider block کے خلاف provider/model strings لیتے ہیں، main اور small slots ایک ہی session میں مختلف vendors سے آ سکتے ہیں، جو کوئی single-vendor key اجازت نہیں دیتی۔

استعمال کے مطابق ادائیگی · سرکاری قیمت سے کم

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 custom providers سے مخصوص failure modes۔

غلط SDK package۔ "@ai-sdk/openai" /v1/responses پر post کرتا ہے؛ ایک chat-completions gateway اس route کا جواب error کے ساتھ دیتا ہے۔ اگر آپ کی پہلی request auth error کی بجائے protocol- یا route-شکل کے error پر fail ہو، تو چیک کریں کہ npm field بالکل "@ai-sdk/openai-compatible" کہتی ہے۔ Picker سے غائب model۔ Custom-provider models صرف تب موجود ہوتے ہیں جب declare کیے گئے ہوں؛ models key میں typo، یا کوئی id جو آپ نے فرض کی مگر کبھی شامل نہ کی، /models میں بس ظاہر نہیں ہوتی۔ Ids exact strings ہیں جن میں version suffixes شامل ہیں، اور gateway کی /v1/models فہرست وہ authoritative source ہے جہاں سے copy کریں۔ Unresolved {env:...}۔ template اس process کے environment سے resolve ہوتا ہے جس نے OpenCode لانچ کیا۔ ایک terminal میں export کی گئی key کسی دوسرے terminal سے لانچ ہونے والے OpenCode instance تک، یا کسی desktop launcher تک جس نے آپ کی profile کبھی source نہیں کی، نہیں پہنچتی۔ export کو shell profile میں رکھیں، کسی one-off session میں نہیں۔ Config-merge حیرتیں۔ چونکہ global اور project configs merge ہوتی ہیں، ایک project opencode.json جو model کو مختلف provider پر set کرے آپ کے global default کو خاموشی سے override کر دیتا ہے، اور کسی پرانے project میں بچا ہوا provider block توقعات پر سایہ ڈال سکتا ہے۔ جب routing غلط لگے، gateway پر شک کرنے سے پہلے دونوں files پڑھیں۔ بغیر /v1 والا baseURL۔ SDK آپ کے دیے گئے base پر /chat/completions جیسے route paths append کرتا ہے، تو https://api.apisrouter.com/v1 درست ہے اور صرف host نہیں۔ کسی اور طرح سے صحیح config پر connection یا 404-شکل کی failure تقریباً ہمیشہ یہی ہوتی ہے۔

OpenCode کو gateway کے ذریعے کون route کرتا ہے۔

  • وہ developers جو پورا دن TUI میں رہتے ہیں اور فی-vendor علیحدہ provider credentials رکھنے کی بجائے ایک ہی /models picker میں Claude، GPT، اور Kimi چاہتے ہیں۔
  • وہ engineers جو حقیقی کام پر coding models کا موازنہ کرتے ہیں۔ ہر candidate ایک declared entry اور ایک picker انتخاب ہے؛ session-by-session موازنے کو نئے accounts کی ضرورت نہیں۔
  • وہ teams جو ایک secret پر standardize کرتی ہیں۔ onboarding docs میں ایک واحد APISROUTER_API_KEY فی-vendor key checklist کی جگہ لے لیتی ہے، اور per-key usage دکھاتا ہے کون کتنا خرچ کرتا ہے۔
  • وہ users جو ایک frontier main model کو کسی مختلف vendor کے کم قیمت small_model کے ساتھ pair کرتے ہیں، جو single-vendor configs ظاہر نہیں کر سکتیں۔
  • وہ developers جن کے پاس کسی مخصوص vendor کی billing تک رسائی نہیں۔ Top-up پر مبنی رسائی بغیر کارڈ کی شرط کے فی-provider sign-up کا انحصار ختم کر دیتی ہے۔

Endpoint verify کریں اور پہلا session debug کریں۔

Session شروع کرنے سے پہلے gateway جو سرو کرتا ہے وہ فہرست کریں۔ /v1/models سے واپس آنے والی ids بالکل وہی strings ہیں جن سے آپ کی models map keys میچ ہونی چاہئیں۔ پہلے-session کی failures مستقل ہیں۔ 401 کا مطلب ہے APISROUTER_API_KEY OpenCode process کو نظر نہیں آئی؛ اسی terminal میں جہاں سے آپ لانچ کرتے ہیں variable echo کریں۔ gateway کی طرف سے model-not-found error کا مطلب ہے declared key کسی served id سے میچ نہیں کرتی، version suffixes سمیت۔ اگر provider بالکل ظاہر نہ ہو، تو JSON validate کریں، کیونکہ trailing comma یا غلط جگہ brace پوری file کو ناقابلِ پڑھائی بنا دیتی ہے اور OpenCode defaults پر واپس آ جاتا ہے۔ جب requests چلنے لگیں تو APIsRouter console فی-request model، token counts، اور spend دکھاتا ہے۔ Coding agents لمبے-context، many-turn workloads ہیں، اور یہ دیکھنا کہ کون سے sessions اور کون سے models tokens کھاتے ہیں یہی طریقہ ہے یہ فیصلہ کرنے کا کہ main slot اپنی قیمت کما رہا ہے یا نہیں۔

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

عمومی سوالات

کیا OpenCode ایک ہی custom provider کے ذریعے Claude، GPT، اور Kimi models استعمال کر سکتا ہے؟

جی ہاں۔ ایک custom provider محض ایک baseURL جمع models allowlist ہے۔ جب endpoint متعدد vendors سرو کرے، فی-id ایک entry declare کریں اور ہر declared model اسی provider اور key کے تحت /models picker میں نظر آتا ہے، session کے بیچ میں سوئچ کے قابل۔

opencode.json میں API key کہاں جاتی ہے؟

options.apiKey میں environment template استعمال کرتے ہوئے، مثلاً "{env:APISROUTER_API_KEY}"۔ template load time پر resolve ہوتا ہے تو literal key کبھی config file میں نہیں بیٹھتی۔ variable کو اپنے shell profile سے export کریں تاکہ OpenCode لانچ کرنے والا ہر terminal اسے inherit کرے۔

کیا provider block global یا project config میں رہنی چاہیے؟

Global میں، ~/.config/opencode/opencode.json پر۔ OpenCode config files کو merge کرتا ہے، تو provider کو ایک بار globally declare کرنا اور فی-project صرف model انتخاب set کرنا repos کو credentials plumbing سے آزاد رکھتا ہے اور duplicated blocks کو الگ ہونے سے بچاتا ہے۔

میرا model /models picker میں کیوں نظر نہیں آتا؟

Custom-provider models کو واضح طور پر declare ہونا ضروری ہے؛ OpenCode کسی custom endpoint کے models شمار نہیں کر سکتا۔ چیک کریں models map میں exact id string موجود ہے، version suffixes سمیت، اور یاد سے ٹائپ کرنے کی بجائے gateway کے /v1/models response سے ids copy کریں۔

@ai-sdk/openai-compatible اور @ai-sdk/openai میں یہاں کیا فرق ہے؟

@ai-sdk/openai-compatible /v1/chat/completions بولتا ہے، وہی protocol جو multi-vendor gateways سرو کرتے ہیں۔ @ai-sdk/openai OpenAI کا نیا /v1/responses protocol بولتا ہے۔ APIsRouter کے لیے @ai-sdk/openai-compatible استعمال کریں؛ دوسری package اس مقصد کے لیے gateway کے سرو نہ کیے گئے route پر post کرے گی۔

کیا declared context limits واقعی اہم ہیں؟

جی ہاں۔ OpenCode limit.context استعمال کرتا ہے یہ فیصلہ کرنے کے لیے کہ session کو کب compaction چاہیے۔ کسی لمبے-context model پر limits غیر-declared چھوڑنا sessions کو ضرورت سے پہلے summarize کروا دیتا ہے، تو limit.context اور limit.output کو وہ set کریں جو model واقعی سپورٹ کرتا ہے۔