הוסיפו ספק מותאם אישית תואם OpenAI ל-OpenCode.
Updated 2026-07-29
OpenCode קורא ספקים מותאמים אישית ישירות מ-opencode.json. הצהירו על בלוק provider עם החבילה @ai-sdk/openai-compatible, כוונו את options.baseURL אל https://api.apisrouter.com/v1, וכל מודל שתפרטו הופך לבר-בחירה בבורר /models תחת מפתח אחד.
תשובה מהירה: בלוק provider אחד ב-opencode.json.
OpenCode תומך בספקים מותאמים אישית תואמי OpenAI באופן טבעי. הוסיפו ערך provider ל-opencode.json עם npm מוגדר ל-"@ai-sdk/openai-compatible", הגדירו את options.baseURL ל-https://api.apisrouter.com/v1, קראו את המפתח ממשתנה סביבה עם תבנית {env:...}, ופרטו את ה-ids של המודלים שאתם רוצים תחת models. אז הגדירו את שדה ה-model העליון ל-"apisrouter/<model-id>" ו-OpenCode מנתב את כל לולאת ה-agent דרך ה-gateway. זהו המסלול המתועד לספק מותאם אישית בתיעוד של OpenCode, לא wrapper או fork. קובץ ההגדרה חי או בשורש הפרויקט שלכם (opencode.json) או גלובלית ב-~/.config/opencode/opencode.json, ושניהם ממוזגים, כך שבלוק ה-provider יכול להיות מוצהר פעם אחת ומשומש מחדש על פני כל מאגר.
{
"$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 פותר ספקים ומודלים.
OpenCode (anomalyco ב-GitHub, אחד ה-agents התכנות בטרמינל עם הכי הרבה כוכבים, בערך 186K) בונה את שכבת הספק שלו על Vercel AI SDK. שדה ה-npm בבלוק provider נוקב באיזו חבילת SDK OpenCode טוען כדי לדבר עם הספק ההוא: "@ai-sdk/openai-compatible" מדבר את הפרוטוקול הסטנדרטי /v1/chat/completions, בעוד "@ai-sdk/openai" מדבר את הפרוטוקול /v1/responses של OpenAI. gateway רב-ספקים משרת chat completions, כך ש-openai-compatible היא החבילה הנכונה; בחירת "@ai-sdk/openai" מול endpoint של chat-completions היא הדרך הנפוצה ביותר שבה ההגדרה הזו נשברת. מודלים מכותבים כזוגות provider/model. ה-id של הספק הוא כל מפתח שבחרתם בבלוק provider ("apisrouter" למעלה), וה-id של המודל הוא המפתח בתוך מפת models, כך שהמודל ברירת המחדל הופך ל-"apisrouter/claude-sonnet-4-6". כל מה שאתם מצהירים מופיע בבורר /models בתוך ה-TUI, ניתן להחלפה באמצע-סשן. התנהגות אחת ששווה להפנים: עבור ספקים מותאמים אישית, מפת ה-models היא רשימת-היתר. ספקים מובנים מגיעים עם קטלוג ידוע, אבל OpenCode לא יכול לספור את המודלים של endpoint מותאם אישית בעצמו, כך שרק ids שהצהרתם עליהם במפורש בני-כתובת. כש-endpoint מאחורי baseURL משרת ids של Claude, GPT, DeepSeek, ו-Kimi זה לצד זה, הצהרה על ערך אחד לכל מודל הופכת את הבורר ל-switchboard חוצה-ספקים מאחורי מפתח יחיד.
הגדרה מלאה: תצורה גלובלית, תצורת פרויקט, מגבלות לכל מודל.
הפריסה הנקייה היא להצהיר על הספק פעם אחת בהגדרה הגלובלית ב-~/.config/opencode/opencode.json ולשמור רק בחירות לכל-פרויקט (איזה מודל, אילו agents) ב-opencode.json של כל פרויקט. OpenCode ממזג קבצי הגדרה במקום להחליף אותם, כך שקובץ הפרויקט נשאר קטן ובלוק ה-provider לעולם לא משוכפל. תבנית {env:APISROUTER_API_KEY} נפתרת בזמן הטעינה מהסביבה, מה שמשאיר את המפתח מחוץ לכל קובץ שעלול להיות מחויב ל-git. ייצאו אותו מפרופיל ה-shell שלכם כך שכל סשן טרמינל שמשיק את OpenCode יראה אותו. כל ערך מודל מקבל גם אובייקט limit עם תקרות טוקן להקשר ולפלט. הצהרה עליהן חשובה יותר משזה נראה: OpenCode משתמש בספרת ההקשר כדי להחליט מתי סשן צריך סיכום, כך שמודל ארוך-הקשר שהוצהר בלי מגבלות מטופל בשמרנות רבה יותר ממה שצריך. הגדירו את limit.context למה שהמודל באמת תומך בו וסשנים ארוכים יידחסו מאוחר יותר במקום מוקדם יותר.
{
"$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.
זרימת העבודה המעשית היא להחזיק את הסלוט הראשי על המודל שאתם סומכים עליו לעריכות ולסובב מועמדים דרך סשנים אמיתיים במקום benchmarks: אחר צהריים של diffs אמיתיים מול מאגר הקוד שלכם אומר לכם יותר מלוח-מובילים. ניתוב דרך endpoint אחד הופך כל מועמד לשינוי שורה אחת, והתצוגה לפי-מפתח מראה כמה כל ניסוי באמת עלה.
- model מנהיג את לולאת ה-agent הראשית: קריאת קבצים, תכנון עריכות, כתיבת diffs, הרצת כלים. הסלוט הזה רואה את ההקשרים הארוכים ביותר ועושה את הנדסת התוכנה בפועל, אז מודל תכנות מוביל (claude-sonnet-4-6, claude-opus-4-7, gpt-5.5) שייך כאן.
- small_model מטפל במשימות קלות כמו יצירת כותרות סשן. הוא יורה לעיתים קרובות אבל לעולם לא נושא את עבודת התכנות, אז id מהיר וזול הוא הצורה הנכונה; אין סיבה לשרוף טוקנים מובילים על כותרות.
- ids מכווני-קוד כמו gpt-5.6-sol ו-kimi-k2.7-code שווים הצהרה גם אם הם לא ברירת המחדל שלכם: מעבר אליהם לסשן עשיר-רפקטור הוא בחירה אחת ב-/models, לא עריכת הגדרה.
- מכיוון ששני הסלוטים מקבלים מחרוזות provider/model מול אותו בלוק provider, הסלוטים main ו-small יכולים להגיע מספקים שונים באותו סשן, משהו שאף מפתח ספק-יחיד לא מאפשר.
תשלום לפי שימוש · מתחת למחיר הרשמי
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.
חבילת SDK שגויה. "@ai-sdk/openai" שולח POST אל /v1/responses; gateway של chat-completions עונה לנתיב הזה עם שגיאה. אם הבקשה הראשונה שלכם נכשלת עם שגיאה בצורת-פרוטוקול או route ולא שגיאת אימות, בדקו ששדה ה-npm אומר "@ai-sdk/openai-compatible" בדיוק. מודל נעדר מהבורר. מודלי ספק-מותאם-אישית קיימים רק אם הוצהרו; שגיאת הקלדה במפתח models, או id שהנחתם אבל אף פעם לא הוספתם, פשוט לא מופיע ב-/models. ה-ids הם מחרוזות מדויקות כולל סיומות גרסה, ורשימת /v1/models של ה-gateway היא מקור האמת להעתיק ממנו. {env:...} לא נפתר. התבנית נפתרת מהסביבה של התהליך שהשיק את OpenCode. מפתח שיוצא בטרמינל אחד לא מגיע ל-instance של OpenCode שהושק מטרמינל אחר או ממשגר שולחן עבודה שאף פעם לא טען את הפרופיל שלכם. שימו את ה-export בפרופיל ה-shell, לא בסשן חד-פעמי. הפתעות מיזוג-הגדרה. מכיוון שהגדרות גלובליות ופרויקט ממוזגות, opencode.json של פרויקט שמגדיר model לספק שונה דורס בשקט את ברירת המחדל הגלובלית שלכם, ובלוק provider שנשאר מפרויקט ישן יכול להאפיל על ציפיות. כשניתוב נראה שגוי, קראו את שני הקבצים לפני שתחשדו שה-gateway מתנהג רע. baseURL בלי /v1. ה-SDK מוסיף נתיבי route כמו /chat/completions לכל base שאתם נותנים לו, אז https://api.apisrouter.com/v1 נכון והמארח הבודד לא. כשל בצורת-חיבור או 404 על הגדרה נכונה אחרת הוא כמעט תמיד זה.
מי מנתב את OpenCode דרך gateway.
- מפתחים שחיים ב-TUI כל היום ורוצים Claude, GPT, ו-Kimi בבורר /models אחד במקום לתחזק אישורי ספק נפרדים לכל ספק.
- מהנדסים שמשווים מודלי תכנות על עבודה אמיתית. כל מועמד הוא ערך מוצהר אחד ובחירת בורר אחת; השוואה סשן-מול-סשן לא צריכה חשבונות חדשים.
- צוותים שמאחדים סוד אחד. APISROUTER_API_KEY יחיד בתיעוד ה-onboarding מחליף רשימת מפתח ספק, ושימוש-לפי-מפתח מראה מי מוציא מה.
- משתמשים שמצמידים מודל main מוביל עם small_model זול מספק שונה, מה שהגדרות ספק-יחיד לא יכולות לבטא.
- מפתחים ללא גישה לחיוב של ספק נתון. גישה מבוססת-הטענה בלי דרישת כרטיס מסירה את התלות בהרשמה לכל ספק.
אמתו את ה-endpoint ובצעו דיבוג לסשן הראשון.
לפני שאתם מתחילים סשן, פרטו מה ה-gateway משרת. ה-ids שמוחזרים על ידי /v1/models הם בדיוק המחרוזות שמפת ה-models שלכם חייבת להתאים אליהן. כשלי סשן ראשון עקביים. 401 אומר ש-APISROUTER_API_KEY לא היה נראה לתהליך של OpenCode; בצעו echo למשתנה באותו טרמינל שממנו אתם משיקים. שגיאת model-not-found מה-gateway אומרת שהמפתח שהוצהר לא תואם id מוגש, כולל סיומות גרסה. אם הספק לא מופיע בכלל, אמתו את ה-JSON, מכיוון שפסיק עודף או סוגריים במקום לא נכון הופכים את כל הקובץ ללא-קריא ו-OpenCode חוזר לברירות מחדל. ברגע שבקשות זורמות, קונסולת APIsRouter מציגה מודל לכל בקשה, ספירות טוקן, והוצאה. agents של תכנות הם עומסי עבודה ארוכי-הקשר ורבי-תורים, ולראות אילו סשנים ואילו מודלים צורכים את הטוקנים הוא איך שאתם מחליטים אם הסלוט הראשי מרוויח את המחיר שלו.
curl -s https://api.apisrouter.com/v1/models \
-H "Authorization: Bearer $APISROUTER_API_KEY" | head -50שאלות נפוצות
האם OpenCode יכול להשתמש במודלי Claude, GPT, ו-Kimi דרך ספק מותאם אישית אחד?
כן. ספק מותאם אישית הוא פשוט baseURL בתוספת רשימת-היתר של models. כש-endpoint משרת ספקים מרובים, הצהירו ערך אחד לכל id וכל מודל שהוצהר מופיע בבורר /models תחת אותו ספק ומפתח, ניתן להחלפה באמצע-סשן.
לאן הולך מפתח ה-API ב-opencode.json?
ב-options.apiKey בעזרת תבנית הסביבה, לדוגמה "{env:APISROUTER_API_KEY}". התבנית נפתרת בזמן הטעינה כך שהמפתח המילולי לעולם לא יושב בקובץ ההגדרה. ייצאו את המשתנה מפרופיל ה-shell שלכם כך שכל טרמינל שמשיק את OpenCode יורש אותו.
האם בלוק ה-provider צריך לחיות בהגדרה הגלובלית או הפרויקטית?
גלובלית, ב-~/.config/opencode/opencode.json. OpenCode ממזג קבצי הגדרה, כך שהצהרה על הספק פעם אחת גלובלית והגדרת רק בחירת המודל לכל פרויקט משאירה מאגרים נקיים מ-plumbing של אישורים ומונעת מבלוקים משוכפלים להתרחק אחד מהשני.
למה המודל שלי לא מופיע בבורר /models?
מודלי ספק-מותאם-אישית חייבים להיות מוצהרים במפורש; OpenCode לא יכול לספור endpoint מותאם אישית. בדקו שמפת ה-models מכילה את מחרוזת ה-id המדויקת, כולל סיומות גרסה, והעתיקו ids מתגובת ה-/v1/models של ה-gateway במקום להקליד מהזיכרון.
מה ההבדל בין @ai-sdk/openai-compatible ל-@ai-sdk/openai כאן?
@ai-sdk/openai-compatible מדבר /v1/chat/completions, הפרוטוקול ש-gateways רב-ספקים משרתים. @ai-sdk/openai מדבר את הפרוטוקול /v1/responses של OpenAI. עבור APIsRouter, השתמשו ב-@ai-sdk/openai-compatible; החבילה האחרת תשלח POST ל-route שה-gateway לא משרת למטרה הזו.
האם מגבלות הקשר מוצהרות באמת משנות משהו?
כן. OpenCode משתמש ב-limit.context כדי להחליט מתי סשן צריך דחיסה. השארת מגבלות לא-מוצהרות על מודל ארוך-הקשר אומרת שסשנים מסוכמים מוקדם יותר מהנדרש, אז הגדירו את limit.context ו-limit.output למה שהמודל באמת תומך בו.