free-coding-models 0.5.80 → 0.5.83
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +56 -34
- package/bin/free-coding-models.js +20 -0
- package/changelog/v0.5.81.md +25 -0
- package/changelog/v0.5.82.md +23 -0
- package/changelog/v0.5.83.md +22 -0
- package/package.json +2 -2
- package/sources.js +163 -64
- package/src/core/benchmark.js +1 -1
- package/src/core/config.js +4 -0
- package/src/core/endpoint-installer.js +7 -2
- package/src/core/kilo.js +8 -1
- package/src/core/models-dev-index.js +1 -0
- package/src/core/opencode.js +16 -2
- package/src/core/ping.js +14 -4
- package/src/core/provider-key-tester.js +5 -2
- package/src/core/provider-metadata.js +36 -9
- package/src/core/quota-capabilities.js +4 -0
- package/src/core/router-daemon.js +2 -2
- package/src/core/security.js +132 -65
- package/src/core/sync-set.js +1 -1
- package/src/core/tool-launchers.js +15 -5
- package/src/core/utils.js +88 -1
- package/src/tui/app.js +7 -5
- package/src/tui/cli-help.js +1 -0
- package/src/tui/command-palette.js +3 -2
- package/src/tui/key-handler.js +172 -61
- package/src/tui/overlays.js +135 -94
- package/src/tui/render-helpers.js +42 -3
- package/src/tui/render-table.js +74 -4
- package/src/tui/theme.js +6 -0
- package/src/tui/tui-state.js +15 -1
- package/web/dist/assets/{index-B5mIBUi5.js → index-CSoKc1qF.js} +4 -4
- package/web/dist/index.html +1 -1
package/sources.js
CHANGED
|
@@ -29,7 +29,7 @@
|
|
|
29
29
|
* 📖 Secondary: https://swe-rebench.com (independent evals, scores are lower)
|
|
30
30
|
* 📖 Leaderboard tracker: https://www.marc0.dev/en/leaderboard
|
|
31
31
|
*
|
|
32
|
-
* @exports nvidiaNim, groq, cerebras, sambanova, openrouter, githubModels, mistral, codestral, scaleway, googleai, zai, qwen, cloudflare, ovhcloud, opencodeZen, kilo, llm7, routeway, novita, ollamaCloud — model arrays per active provider
|
|
32
|
+
* @exports nvidiaNim, groq, cerebras, sambanova, openrouter, githubModels, mistral, codestral, scaleway, googleai, zai, qwen, cloudflare, ovhcloud, opencodeZen, kilo, llm7, routeway, novita, ollamaCloud, pollinations, siliconflow, requesty, orcarouter — model arrays per active provider
|
|
33
33
|
* @exports sources — map of active free/free-limited providers, each with { name, url, models }
|
|
34
34
|
|
|
35
35
|
* @exports MODELS — flat array of [modelId, label, tier, sweScore, ctx, providerKey]
|
|
@@ -43,17 +43,19 @@ export const nvidiaNim = [
|
|
|
43
43
|
// ── S+ tier — SWE-bench Verified ≥70% ──
|
|
44
44
|
// Removed (2026-08-23): z-ai/glm-5.2 (GLM 5.1) — no longer in integrate.api.nvidia.com/v1/models (102 models live)
|
|
45
45
|
['moonshotai/kimi-k2.6', 'Kimi K2.6', 'S+', '80.2%', '262k'],
|
|
46
|
-
|
|
46
|
+
// Removed (2026-08-30): deepseek-ai/deepseek-v4-pro (DeepSeek V4 Pro) — 410 Gone per NVIDIA NIM forum; replaced by deepseek-v4-flash:0731 (forums.developer.nvidia.com/t/deepseek-v4-pro-flash-removed/379558)
|
|
47
47
|
['deepseek-ai/deepseek-v4-flash-0731', 'DeepSeek V4 Flash', 'S+', '79.0%', '1M'], // Fixed (2026-08-13): id 'deepseek-ai/deepseek-v4-flash' → 'deepseek-ai/deepseek-v4-flash-0731' (NIM /v1/models only exposes the -0731 suffix)
|
|
48
|
-
|
|
48
|
+
// Removed (2026-08-30): stepfun-ai/step-3.7-flash (Step 3.7 Flash) — 410 Gone per NVIDIA NIM TUI ping (no replacement listed; superseded by step-3.7-flash via Routeway `step-3.7-flash:free`)
|
|
49
49
|
['nvidia/nemotron-3-ultra-550b-a55b', 'Nemotron 3 Ultra', 'S+', '71.9%', '1M'],
|
|
50
50
|
['poolside/laguna-xs-2.1', 'Laguna XS 2.1', 'S+', '70.9%', '262k'], // Added (2026-08-13)
|
|
51
|
+
['meta/muse-glimmer-30b', 'Muse Glimmer 30B', 'B+', '-', '128k'], // Added (2026-09-02) — new in NIM catalog
|
|
51
52
|
// ── S tier — SWE-bench Verified 60–70% ──
|
|
52
53
|
['openai/gpt-oss-120b', 'GPT OSS 120B', 'S', '62.4%', '128k'],
|
|
53
54
|
// Removed (2026-07-27): meta/llama-4-maverick-17b-128e-instruct (Llama 4 Maverick) — EOL 2026-07-27 (HTTP 410 Gone)
|
|
54
55
|
// Removed (2026-08-23): mistralai/mistral-medium-3.5-128b (Mistral Medium 3.5) — no longer in integrate.api.nvidia.com/v1/models (still on Mistral LP directly)
|
|
55
56
|
// Removed (2026-07-27): mistralai/mistral-small-4-119b-2603 (Mistral Small 4) — EOL 2026-07-27 (HTTP 410 Gone)
|
|
56
57
|
['minimaxai/minimax-m3', 'MiniMax M3', 'S+', '78.4%', '1M'],
|
|
58
|
+
['moonshotai/kimi-k3', 'Kimi K3', 'S', '-', '262k'], // Added (2026-09-02) — new in NIM catalog
|
|
57
59
|
['mistralai/mistral-nemotron', 'Mistral Nemotron', 'S', '-', '128k'], // Fixed ID (2026-07-27): nvidia/mistral-nemotron → mistralai/mistral-nemotron
|
|
58
60
|
// Removed (2026-07-27): deepseek-ai/deepseek-v3.2 (DeepSeek V3.2) — HTTP 404
|
|
59
61
|
// ── A+ tier — SWE-bench Verified 50–60% ──
|
|
@@ -61,30 +63,30 @@ export const nvidiaNim = [
|
|
|
61
63
|
['nvidia/nemotron-3-super-120b-a12b', 'Nemotron 3 Super', 'S', '60.5%', '128k'],
|
|
62
64
|
['nvidia/nemotron-3-nano-omni-30b-a3b-reasoning', 'Nemotron 3 Omni', 'A+', '52.0%', '256k'],
|
|
63
65
|
// Removed (2026-07-27): meta-llama/llama-4-scout-17b-16e-instruct (Llama 4 Scout) — HTTP 404
|
|
64
|
-
|
|
66
|
+
// Removed (2026-08-30): nvidia/llama-3.3-nemotron-super-49b-v1.5 (Llama 3.3 Nemotron Super 49B) — 410 Gone per NVIDIA NIM TUI ping
|
|
65
67
|
// ── A tier — SWE-bench Verified 40–50% ──
|
|
66
|
-
['nvidia/nemotron-3-
|
|
68
|
+
['nvidia/nemotron-nano-3-30b-a3b', 'Nemotron Nano 30B', 'A-', '38.8%', '1M'],
|
|
67
69
|
['openai/gpt-oss-20b', 'GPT OSS 20B', 'A+', '50.3%', '128k'],
|
|
68
70
|
['google/gemma-4-31b-it', 'Gemma 4 31B', 'A+', '52.0%', '256k'],
|
|
69
|
-
|
|
71
|
+
// Removed (2026-08-30): mistralai/mistral-large-2-instruct (Mistral Large 2) — 404 NOT FOUND per NVIDIA NIM TUI ping (model not in NIM catalog; use Mistral LP `mistral-large-2512`)
|
|
70
72
|
// Removed (2026-07-27): qwen/qwen2.5-coder-32b-instruct (Qwen2.5 Coder 32B) — EOL 2026-05-12 (HTTP 410 Gone)
|
|
71
73
|
// Removed (2026-07-27): deepseek-ai/deepseek-r1 (DeepSeek R1) — HTTP 404
|
|
72
74
|
// Removed (2026-07-27): nvidia/nemotron-3-nano (Nemotron 3 Nano) — HTTP 404 (replaced by nvidia/nvidia-nemotron-nano-9b-v2)
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
75
|
+
// Removed (2026-08-30): nvidia/nvidia-nemotron-nano-9b-v2 (Nemotron Nano 9B v2) — 410 Gone per NVIDIA NIM TUI ping (superseded by nvidia/nemotron-nano-3-30b-a3b)
|
|
76
|
+
// Removed (2026-08-30): meta/llama-3.3-70b-instruct (Llama 3.3 70B) — 410 Gone per NVIDIA NIM TUI ping (no longer in NIM catalog)
|
|
77
|
+
// Removed (2026-08-30): deepseek-ai/deepseek-coder-6.7b-instruct (DeepSeek Coder 6.7B) — 404 NOT FOUND per NVIDIA NIM TUI ping
|
|
78
|
+
// Removed (2026-08-30): meta/codellama-70b (CodeLlama 70B) — 404 NOT FOUND per NVIDIA NIM TUI ping (docs.nvidia.com still lists CodeLlama but not via NIM `integrate.api` free tier)
|
|
79
|
+
// Removed (2026-08-30): mistralai/codestral-22b-instruct-v0.1 (Codestral 22B) — 404 NOT FOUND per NVIDIA NIM TUI ping (use Codestral `codestral-2508` via Mistral LP)
|
|
80
|
+
// Removed (2026-08-30): ibm/granite-34b-code-instruct (Granite 34B Code) — 404 NOT FOUND per NVIDIA NIM TUI ping
|
|
79
81
|
// ── A- tier — SWE-bench Verified 35–40% ──
|
|
80
82
|
// Removed (2026-07-27): bytedance/seed-oss-36b-instruct (Seed OSS 36B) — EOL 2026-07-27 (HTTP 410 Gone)
|
|
81
83
|
// Removed (2026-07-27): stockmark/stockmark-2-100b-instruct (Stockmark 100B) — EOL 2026-07-15 (HTTP 410 Gone)
|
|
82
84
|
// ── B+ tier — SWE-bench Verified 30–35% ──
|
|
83
85
|
// Removed (2026-07-27): mistralai/ministral-14b-instruct-2512 (Ministral 14B) — EOL 2026-07-27 (HTTP 410 Gone)
|
|
84
|
-
|
|
86
|
+
// Removed (2026-08-30): thinkingmachines/inkling (Inkling) — 410 Gone per NVIDIA NIM TUI ping (per Model Deprecation Request 378412)
|
|
85
87
|
// ── B tier — SWE-bench Verified 20–30% ──
|
|
86
88
|
['meta/llama-3.2-11b-vision-instruct', 'Llama 3.2 11B Vision', 'B', '28.0%', '128k'],
|
|
87
|
-
|
|
89
|
+
// Removed (2026-08-30): nvidia/nemotron-mini-4b-instruct (Nemotron Mini 4B) — 410 Gone per NVIDIA NIM TUI ping
|
|
88
90
|
// ── C tier — lightweight/edge models ──
|
|
89
91
|
// Removed (2026-07-27): microsoft/phi-4-mini-instruct (Phi 4 Mini) — EOL 2026-07-15 (HTTP 410 Gone)
|
|
90
92
|
]
|
|
@@ -107,6 +109,7 @@ export const cerebras = [
|
|
|
107
109
|
// Removed (2026-08-23): zai-glm-4.7 (GLM 4.7) — shutdown 2026-08-17 per Cerebras official notice
|
|
108
110
|
// ── S tier — SWE-bench Verified 60–70% ──
|
|
109
111
|
['gpt-oss-120b', 'GPT OSS 120B', 'S', '62.4%', '65k'], // Fixed (2026-07-27): ctx '128k' → '65k' (free tier per official docs)
|
|
112
|
+
// Removed (2026-09-05): MiniMax-M3 (MiniMax M3) — HTTP 404 "Model does not exist" per live API ping (PR #178 addition reverted)
|
|
110
113
|
// ── A tier — SWE-bench Verified 40–50% ──
|
|
111
114
|
['gemma-4-31b', 'Gemma 4 31B', 'A+', '52.0%', '65k'], // Fixed (2026-07-27): ctx '128k' → '65k' (free tier per official docs)
|
|
112
115
|
]
|
|
@@ -117,6 +120,7 @@ export const cerebras = [
|
|
|
117
120
|
export const sambanova = [
|
|
118
121
|
// ── S+ tier ──
|
|
119
122
|
['MiniMax-M2.7', 'MiniMax M2.7', 'S+', '78.0%', '196k'], // Fixed (2026-07-27): ctx '192k' → '196k' (API exact 196608)
|
|
123
|
+
['MiniMax-M3', 'MiniMax M3', 'S+', '78.4%', '196k'], // Added (2026-09-02) — verified live 2026-09-05 via /v1/models
|
|
120
124
|
// ── S tier ──
|
|
121
125
|
['DeepSeek-V3.1', 'DeepSeek V3.1', 'S', '66.0%', '131k'], // Fixed (2026-07-27): ctx '128k' → '131k' (API exact 131072)
|
|
122
126
|
['DeepSeek-V3.2', 'DeepSeek V3.2', 'S+', '70.0%', '32k'],
|
|
@@ -141,39 +145,28 @@ export const sambanova = [
|
|
|
141
145
|
export const openrouter = [
|
|
142
146
|
// ── S+ tier — SWE-bench Verified ≥70% ──
|
|
143
147
|
['nvidia/nemotron-3-ultra-550b-a55b:free', 'Nemotron 3 Ultra', 'S+', '71.9%', '1M'],
|
|
144
|
-
// Removed (2026-08-13): poolside/laguna-m.1:free (Poolside Laguna M.1) — no longer in OpenRouter catalog (neither :free nor paid)
|
|
145
148
|
['poolside/laguna-xs-2.1:free', 'Poolside Laguna XS 2.1', 'S+', '70.9%', '262k'],
|
|
146
|
-
|
|
149
|
+
['poolside/laguna-s-2.1:free', 'Poolside Laguna S 2.1', 'S+', '-', '262k'],
|
|
150
|
+
['minimax/minimax-m2.7:free', 'MiniMax M2.7', 'S+', '56.2%', '262k'], // Added (2026-09-02)
|
|
151
|
+
['minimax/minimax-m3:free', 'MiniMax M3', 'S+', '78.4%', '1M'], // Added (2026-09-02)
|
|
152
|
+
['z-ai/glm-5.2:free', 'GLM-5.2', 'S+', '-', '1M'], // Added (2026-09-02)
|
|
147
153
|
// ── S tier — SWE-bench Verified 60–70% ──
|
|
148
154
|
['cohere/north-mini-code:free', 'North Mini Code', 'S', '-', '256k'],
|
|
149
|
-
|
|
150
|
-
// Removed (2026-07-27): qwen/qwen3-coder:free (Qwen3 Coder) — no longer on OpenRouter free tier
|
|
151
|
-
['poolside/laguna-s-2.1:free', 'Poolside Laguna S 2.1', 'S+', '-', '262k'], // Added (2026-07-27)
|
|
155
|
+
['nvidia/nemotron-3-super-120b-a12b:free', 'Nemotron 3 Super', 'S', '60.5%', '262k'],
|
|
152
156
|
// ── A+ tier — SWE-bench Verified 50–60% ──
|
|
153
|
-
['nvidia/nemotron-3-super-120b-a12b:free', 'Nemotron 3 Super', 'S', '60.5%', '262k'], // Fixed (2026-08-13): ctx '1M' → '262k' (real API ctx)
|
|
154
157
|
['nvidia/nemotron-3-nano-omni-30b-a3b-reasoning:free', 'Nemotron 3 Omni', 'A+', '52.0%', '256k'],
|
|
155
|
-
// Removed (2026-08-13): inclusionai/ling-3.0-flash:free (Ling-3.0 Flash) — :free variant removed, now paid-only
|
|
156
|
-
['liquid/lfm-2.5-2.6b:free', 'LiquidAI LFM2.5-2.6B', 'C', '-', '128k'], // Added (2026-08-13)
|
|
157
|
-
['nvidia/nemotron-3.5-lightning:free', 'NVIDIA Nemotron 3.5 Lightning', 'B+', '-', '1M'], // Added (2026-08-13)
|
|
158
|
-
// ── A tier — SWE-bench Verified 40–50% ──
|
|
159
|
-
['nvidia/nemotron-3-nano-30b-a3b:free', 'Nemotron Nano 30B', 'A-', '38.8%', '256k'],
|
|
160
|
-
['nvidia/nemotron-nano-12b-v2-vl:free', 'Nemotron Nano 12B VL', 'A', '20.0%', '128k'],
|
|
161
158
|
['google/gemma-4-31b-it:free', 'Gemma 4 31B', 'A+', '52.0%', '262k'],
|
|
162
159
|
['google/gemma-4-26b-a4b-it:free', 'Gemma 4 26B MoE', 'A', '38.0%', '262k'],
|
|
163
|
-
// Removed (2026-07-27): meta-llama/llama-3.3-70b-instruct:free (Llama 3.3 70B Instruct) — no longer on free tier
|
|
164
|
-
// Removed (2026-07-27): nousresearch/hermes-3-llama-3.1-405b:free (Hermes 3 Llama 3.1 405B) — no longer on free tier
|
|
165
|
-
// Removed (2026-07-27): qwen/qwen3-next-80b-a3b-instruct:free (Qwen3 Next 80B A3B) — no longer on free tier
|
|
166
160
|
// ── B+ tier — SWE-bench Verified 30–35% ──
|
|
167
|
-
['
|
|
168
|
-
|
|
161
|
+
['liquid/lfm-2.5-2.6b:free', 'LiquidAI LFM2.5-2.6B', 'C', '-', '128k'],
|
|
162
|
+
['nvidia/nemotron-3.5-lightning:free', 'NVIDIA Nemotron 3.5 Lightning', 'B+', '-', '1M'],
|
|
163
|
+
['inclusionai/ling-3.0-flash-fin:free', 'Ling 3.0 Flash Fin', 'B+', '-', '128k'], // Added (2026-09-02)
|
|
164
|
+
['thinkingmachines/inkling:free', 'Inkling', 'B+', '-', '262k'], // Added (2026-09-02)
|
|
169
165
|
// ── B tier — SWE-bench Verified 20–30% ──
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
// Removed (2026-07-27): cognitivecomputations/dolphin-mistral-24b-venice-edition:free (Dolphin Mistral 24B Venice) — no longer on free tier
|
|
166
|
+
['thinkingmachines/inkling-small:free', 'Inkling Small', 'B', '-', '128k'], // Added (2026-09-02)
|
|
167
|
+
['dots-studio/dots-3-note-preview:free', 'Dots 3 Note Preview', 'B', '-', '128k'], // Added (2026-09-02)
|
|
173
168
|
// ── C tier — lightweight/edge models ──
|
|
174
169
|
['nvidia/nemotron-3.5-content-safety:free', 'Nemotron 3.5 Content Safety', 'C', '-', '128k'],
|
|
175
|
-
// Removed (2026-07-27): liquid/lfm-2.5-1.2b-instruct:free (LFM 2.5 1.2B Instruct) — no longer on free tier
|
|
176
|
-
// Removed (2026-07-27): liquid/lfm-2.5-1.2b-thinking:free (LFM 2.5 1.2B Thinking) — no longer on free tier
|
|
177
170
|
]
|
|
178
171
|
|
|
179
172
|
// 📖 GitHub Models source - https://models.github.ai
|
|
@@ -218,26 +211,25 @@ export const codestral = [
|
|
|
218
211
|
// 📖 1M free tokens — API keys at https://console.scaleway.com/iam/api-keys
|
|
219
212
|
export const scaleway = [
|
|
220
213
|
// ── S+ tier — SWE-bench Verified ≥70% ──
|
|
221
|
-
['devstral-2-123b-instruct-2512', 'Devstral 2 123B', 'S+', '72.2%', '200k'], // Fixed (2026-08-13): ctx '260k' → '200k' (Serverless tier per official Scaleway catalog)
|
|
222
|
-
['qwen3-235b-a22b-instruct-2507', 'Qwen3 235B', 'A', '45.2%', '250k'],
|
|
223
214
|
['glm-5.2', 'GLM 5.2', 'S+', '82.8%', '256k'], // Fixed (2026-08-13): ctx '1M' → '256k' (Serverless tier per official catalog)
|
|
224
215
|
['deepseek-v4-flash-0731', 'DeepSeek V4 Flash', 'S+', '-', '256k'], // Added (2026-08-13)
|
|
216
|
+
['devstral-2-123b-instruct-2512', 'Devstral 2 123B', 'S+', '72.2%', '200k'], // Restored (2026-09-05) — still Serverless per official docs; PR #178 EOL claim not confirmed
|
|
225
217
|
// ── S tier — SWE-bench Verified 60–70% ──
|
|
226
218
|
['qwen3.5-397b-a17b', 'Qwen3.5 400B VLM', 'S+', '76.2%', '250k'],
|
|
227
219
|
['gpt-oss-120b', 'GPT OSS 120B', 'S', '62.4%', '128k'],
|
|
228
220
|
['mistral-medium-3.5-128b', 'Mistral Medium 3.5 128B', 'S+', '77.6%', '180k'], // Fixed (2026-07-27): ctx '256k' → '180k' (Serverless tier)
|
|
229
221
|
// ── A+ tier — SWE-bench Verified 50–60% ──
|
|
230
|
-
// Removed (2026-08-13): mistral-large-3-675b-instruct-2512 (Mistral Large 675B) — Dedicated tier only, not available on Serverless
|
|
231
222
|
['qwen3-coder-30b-a3b-instruct', 'Qwen3 Coder 30B', 'A+', '51.6%', '128k'],
|
|
232
223
|
['qwen3.6-35b-a3b', 'Qwen3.6 35B MoE', 'S+', '73.4%', '256k'],
|
|
233
|
-
['holo2-30b-a3b', 'Holo2 30B', 'A+', '52.0%', '22k'],
|
|
224
|
+
['holo2-30b-a3b', 'Holo2 30B', 'A+', '52.0%', '22k'], // Added (2026-08-13)
|
|
234
225
|
['gemma-4-26b-a4b-it', 'Gemma 4 26B MoE', 'A+', '-', '256k'],
|
|
235
|
-
// Removed (2026-
|
|
226
|
+
// Removed (2026-09-02): gemma-4-31b-it (Gemma 4 31B IT) — Dedicated tier only, not available on Serverless
|
|
227
|
+
['qwen3-235b-a22b-instruct-2507', 'Qwen3 235B', 'A', '45.2%', '250k'], // Restored (2026-09-05) — still Serverless per official docs (silently dropped by PR #178)
|
|
236
228
|
// ── A- tier — SWE-bench Verified 35–40% ──
|
|
237
229
|
['llama-3.3-70b-instruct', 'Llama 3.3 70B', 'B', '22.0%', '100k'], // Fixed (2026-08-13): ctx '128k' → '100k' (Serverless tier per official catalog)
|
|
238
230
|
// ── B+ tier — SWE-bench Verified 30–35% ──
|
|
239
231
|
['mistral-small-3.2-24b-instruct-2506', 'Mistral Small 3.2', 'B', '20.0%', '128k'],
|
|
240
|
-
['pixtral-12b-2409', 'Pixtral 12B', 'B+', '-', '128k'],
|
|
232
|
+
['pixtral-12b-2409', 'Pixtral 12B', 'B+', '-', '128k'], // Restored (2026-09-05) — still Serverless per official docs; PR #178 EOL claim not confirmed
|
|
241
233
|
// ── B tier — SWE-bench Verified 20–30% ──
|
|
242
234
|
['gemma-3-27b-it', 'Gemma 3 27B', 'B', '22.0%', '40k'],
|
|
243
235
|
]
|
|
@@ -245,16 +237,18 @@ export const scaleway = [
|
|
|
245
237
|
// 📖 Google AI Studio source - https://aistudio.google.com
|
|
246
238
|
// 📖 OpenAI-compatible endpoint exposes Gemini models; free quotas vary by model and region.
|
|
247
239
|
export const googleai = [
|
|
240
|
+
['gemini-3.8-flash', 'Gemini 3.8 Flash', 'S+', '-', '1M'], // Added (2026-09-02) — free tier per official pricing page
|
|
248
241
|
['gemini-3.7-flash', 'Gemini 3.7 Flash', 'S+', '-', '1M'], // Added (2026-08-13)
|
|
249
242
|
['gemini-3.6-flash', 'Gemini 3.6 Flash', 'S+', '-', '1M'], // Added (2026-07-27)
|
|
250
|
-
['gemini-3.5-flash', 'Gemini 3.5 Flash', 'S+', '78.0%', '1M'],
|
|
251
|
-
['gemini-3.1-pro-preview', 'Gemini 3.1 Pro Preview', 'S+', '80.6%', '1M'],
|
|
252
|
-
['gemini-3-flash-preview', 'Gemini 3 Flash Preview', 'S+', '78.0%', '1M'],
|
|
243
|
+
['gemini-3.5-flash', 'Gemini 3.5 Flash', 'S+', '78.0%', '1M'], // Added (2026-09-02)
|
|
253
244
|
['gemini-3.5-flash-lite', 'Gemini 3.5 Flash Lite', 'S', '-', '1M'], // Added (2026-07-27)
|
|
254
245
|
['gemini-3.1-flash-lite', 'Gemini 3.1 Flash Lite', 'S', '62.8%', '1M'],
|
|
255
|
-
['gemini-2.5-pro', 'Gemini 2.5 Pro', 'S', '63.8%', '1M'],
|
|
256
246
|
['gemini-2.5-flash', 'Gemini 2.5 Flash', 'A+', '54.0%', '1M'],
|
|
257
247
|
['gemini-2.5-flash-lite', 'Gemini 2.5 Flash Lite', 'A', '42.6%', '1M'],
|
|
248
|
+
['gemini-3-flash-preview', 'Gemini 3 Flash Preview', 'S+', '78.0%', '1M'], // Restored (2026-09-05) — free tier confirmed per official pricing page
|
|
249
|
+
['gemini-2.5-pro', 'Gemini 2.5 Pro', 'S', '63.8%', '1M'], // Restored (2026-09-05) — free tier confirmed per official pricing page
|
|
250
|
+
// Removed (2026-09-02): gemini-3.1-pro-preview (Gemini 3.1 Pro Preview) — free tier "Not available" per official pricing page (rechecked 2026-09-05)
|
|
251
|
+
// Removed (2026-09-05): gemini-2.0-flash — not listed on the official pricing page (PR #178 addition reverted)
|
|
258
252
|
]
|
|
259
253
|
|
|
260
254
|
// 📖 ZAI source - https://open.z.ai
|
|
@@ -263,6 +257,7 @@ export const googleai = [
|
|
|
263
257
|
// 📖 glm-4.7-flash is free but was returning "overloaded" 429s; API /models lists only 9 text models.
|
|
264
258
|
export const zai = [
|
|
265
259
|
// ── S+ tier — SWE-bench Verified ≥70% ──
|
|
260
|
+
['zai/glm-5.3-flash', 'GLM-5.3-Flash', 'S+', '-', '1M'], // Added (2026-09-02)
|
|
266
261
|
['zai/glm-5.2', 'GLM-5.2', 'S+', '-', '1M'], // Added (2026-08-13)
|
|
267
262
|
// ── S tier — SWE-bench Verified 60–70% ──
|
|
268
263
|
['zai/glm-4.7-flash', 'GLM-4.7-Flash', 'A+', '59.2%', '200k'], // Fixed (2026-07-27): ctx '203k' → '200k' per official docs
|
|
@@ -340,8 +335,8 @@ export const cloudflare = [
|
|
|
340
335
|
['@cf/ibm-granite/granite-4.0-h-micro', 'Granite 4.0 Micro', 'B+', '30.0%', '128k'], // Fixed (2026-07-27): namespace 'ibm' → 'ibm-granite'
|
|
341
336
|
// ── B tier — SWE-bench Verified 20–30% ──
|
|
342
337
|
['@cf/meta/llama-3.1-8b-instruct-fast', 'Llama 3.1 8B Instruct (Fast)', 'C', '18.0%', '128k'],
|
|
343
|
-
|
|
344
|
-
|
|
338
|
+
// Removed (2026-08-30): @cf/google/gemma-3-12b-it (Gemma 3 12B IT) — Deprecated 2026-05-30 per Cloudflare Workers AI docs (developers.cloudflare.com/workers-ai/models/gemma-3-12b-it)
|
|
339
|
+
// Removed (2026-08-30): @cf/moonshotai/kimi-k2.5 (Kimi K2.5) — Deprecated 2026-05-30 per Cloudflare changelog; replaced by @cf/moonshotai/kimi-k2.6 (developers.cloudflare.com/changelog/post/2026-05-08-planned-model-deprecations)
|
|
345
340
|
]
|
|
346
341
|
|
|
347
342
|
// 📖 OVHcloud AI Endpoints - https://endpoints.ai.cloud.ovh.net
|
|
@@ -377,15 +372,13 @@ export const ovhcloud = [
|
|
|
377
372
|
// 📖 Config: set provider to opencode/<model-id> in OpenCode config
|
|
378
373
|
export const opencodeZen = [
|
|
379
374
|
['big-pickle', 'Big Pickle', 'S+', '72.0%', '200k'],
|
|
380
|
-
|
|
375
|
+
['deepseek-v4-flash-free', 'DeepSeek V4 Flash Free', 'S+', '79.0%', '200k'], // Restored (2026-09-02) — still in /v1/models live
|
|
381
376
|
['mimo-v2.5-free', 'MiMo-V2.5 Free', 'S+', '-', '200k'],
|
|
382
377
|
['nemotron-3-ultra-free', 'Nemotron 3 Ultra Free', 'S+', '71.9%', '200k'],
|
|
383
|
-
// Removed (2026-
|
|
384
|
-
// Removed (2026-08-23): laguna-s-2.1-free (Laguna S 2.1 Free) — dropped from Zen free-tier docs/pricing (still on /models but no longer free)
|
|
385
|
-
// Removed (2026-08-13): ling-3.0-flash-free (Ling-3.0-flash Free) — no longer in OpenCode Zen free-tier API
|
|
386
|
-
['hy3-free', 'Tencent Hy3 Free', 'S', '-', '200k'], // Added (2026-08-13) — brought back after July removal
|
|
378
|
+
// Removed (2026-09-05): hy3-free (Tencent Hy3 Free) — absent from live /v1/models (66 models checked)
|
|
387
379
|
['nemotron-3.5-lightning-free', 'Nemotron 3.5 Lightning Free','S+','-', '200k'], // Added (2026-08-13)
|
|
388
|
-
|
|
380
|
+
['laguna-s-2.1-free', 'Laguna S 2.1 Free', 'S+', '-', '200k'], // Restored (2026-09-05) — back in live /v1/models
|
|
381
|
+
['ling-3.0-flash-fin-free', 'Ling 3.0 Flash Fin Free', 'B+', '-', '200k'], // Added (2026-09-05) — new id in live /v1/models (was ling-3.0-flash-free)
|
|
389
382
|
]
|
|
390
383
|
|
|
391
384
|
// 📖 Kilo source - https://api.kilo.ai/api/gateway
|
|
@@ -401,11 +394,13 @@ export const kilo = [
|
|
|
401
394
|
// 📖 Pro-tagged models from /v1/models are intentionally excluded.
|
|
402
395
|
export const llm7 = [
|
|
403
396
|
// 📖 LLM7 live /v1/models: only `turbo` tier is free (noKeyNeeded). All `pro` models are usage-based paid.
|
|
397
|
+
// 📖 Verified live 2026-09-05: turbo tier = minimax-m2.7, gpt-oss, mistral-Nemo-Instruct-2407, codestral-latest.
|
|
398
|
+
// Removed (2026-09-05): glm-5.3, glm-5.3-flash, gemini-3.5-flash-low, gpt-5.4, gpt-5.4-mini, gpt-5.5, gpt-5.6-sol, grok-4.5, grok-4.6 — tier=pro usage_based_only (paid) or nonexistent on /v1/models (PR #178 additions reverted)
|
|
404
399
|
// ── S+ tier — SWE-bench Verified ≥70% ──
|
|
405
400
|
['minimax-m2.7', 'MiniMax M2.7', 'S+', '78.0%', '180k'],
|
|
406
401
|
// ── A+ tier — SWE-bench Verified 50–60% ──
|
|
407
|
-
|
|
408
|
-
['gpt-oss
|
|
402
|
+
// Removed (2026-09-05): gemini-3.1-flash-lite (Gemini 3.1 Flash Lite) — now tier=pro usage_based_only (paid) per live /v1/models
|
|
403
|
+
['gpt-oss', 'GPT OSS 20B', 'A+', '50.3%', '131k'], // Fixed (2026-09-05): id 'gpt-oss:20b' → 'gpt-oss', ctx '128k' → '131k' (live 131072)
|
|
409
404
|
['mistral-Nemo-Instruct-2407', 'Mistral Nemo 12B Instruct', 'A-', '-', '128k'], // Added (2026-08-13)
|
|
410
405
|
// ── A tier — SWE-bench Verified 40–50% ──
|
|
411
406
|
['codestral-latest', 'Codestral Latest', 'A', '40.0%', '32k'],
|
|
@@ -416,14 +411,12 @@ export const llm7 = [
|
|
|
416
411
|
// 📖 Live catalog checked 2026-06-11; only chat-completions models with free pricing are listed.
|
|
417
412
|
export const routeway = [
|
|
418
413
|
// ── S+ tier — SWE-bench Verified ≥70% ──
|
|
419
|
-
|
|
420
|
-
// Removed (2026-08-13): step-3.5-flash:free (Step 3.5 Flash) — superseded by step-3.7-flash:free
|
|
421
|
-
// Removed (2026-07-27): laguna-m.1:free (Poolside Laguna M.1) — unavailable on Routeway
|
|
422
|
-
['laguna-xs.2:free', 'Poolside Laguna XS.2', 'S', '68.2%', '131k'],
|
|
414
|
+
['deepseek-v4-flash:free', 'DeepSeek V4 Flash', 'S+', '79.0%', '256k'], // Restored (2026-09-02) — back in zero-price catalog
|
|
423
415
|
['step-3.7-flash:free', 'Step 3.7 Flash', 'S+', '74.4%', '256k'], // Added (2026-07-27)
|
|
416
|
+
['minimax-m2.7:free', 'MiniMax M2.7', 'S+', '78.0%', '256k'], // Added (2026-09-02)
|
|
417
|
+
['muse-glimmer-30b:free', 'Muse Glimmer 30B', 'B+', '-', '256k'], // Added (2026-09-02)
|
|
424
418
|
// ── S tier — SWE-bench Verified 60–70% ──
|
|
425
|
-
|
|
426
|
-
// Removed (2026-08-13): ling-2.6-flash:free (Ling 2.6 Flash) — no longer in zero-price catalog
|
|
419
|
+
['laguna-xs.2:free', 'Poolside Laguna XS.2', 'S', '68.2%', '131k'],
|
|
427
420
|
['gpt-oss-120b:free', 'GPT OSS 120B', 'S', '60.0%', '131k'],
|
|
428
421
|
// ── A tier — SWE-bench Verified 40–50% ──
|
|
429
422
|
['gemma-4-31b-it:free', 'Gemma 4 31B', 'A+', '52.0%', '262k'],
|
|
@@ -450,6 +443,84 @@ export const novita = [
|
|
|
450
443
|
// Removed (2026-07-27): qwen/qwen3.5-plus (Qwen3.5 Plus) — no longer in novita catalog
|
|
451
444
|
]
|
|
452
445
|
|
|
446
|
+
// 📖 Pollinations AI source - https://gen.pollinations.ai
|
|
447
|
+
// 📖 OpenAI-compatible endpoint: https://gen.pollinations.ai/v1/chat/completions
|
|
448
|
+
// 📖 Free tier: anonymous without key or free API key from https://enter.pollinations.ai
|
|
449
|
+
// 📖 Daily Pollen grants per tier (seed/flower/nectar) — free models cost Pollen but grants renew daily; anonymous tier has rate limits.
|
|
450
|
+
// 📖 Verified live 2026-08-23 via GET /v1/models (319 models); IDs below are live and coding-relevant.
|
|
451
|
+
export const pollinations = [
|
|
452
|
+
// ── S+ tier — SWE-bench Verified ≥70% ──
|
|
453
|
+
['laguna', 'Laguna XS.2', 'S+', '70.9%', '1M'],
|
|
454
|
+
['minimax-m2.7', 'MiniMax M2.7', 'S+', '78.0%', '200k'],
|
|
455
|
+
// ── S tier — SWE-bench Verified 60–70% ──
|
|
456
|
+
['qwen-coder', 'Qwen3 Coder', 'S', '69.6%', '262k'],
|
|
457
|
+
['deepseek', 'DeepSeek V3', 'S', '66.0%', '1M'],
|
|
458
|
+
['kimi-code', 'Kimi K2 Code', 'S', '60.4%', '262k'],
|
|
459
|
+
['openai', 'OpenAI GPT', 'S', '62.4%', '400k'],
|
|
460
|
+
// ── A+ tier — SWE-bench Verified 50–60% ──
|
|
461
|
+
['gemma-4-31b', 'Gemma 4 31B', 'A+', '52.0%', '262k'],
|
|
462
|
+
['gpt-oss', 'GPT OSS 20B', 'A+', '50.3%', '131k'],
|
|
463
|
+
['qwen3.7-flash', 'Qwen3.7 Flash', 'A+', '-', '1M'],
|
|
464
|
+
// ── B+ tier ──
|
|
465
|
+
['nemotron-3.5-lightning', 'Nemotron 3.5 Lightning', 'B+', '-', '262k'],
|
|
466
|
+
]
|
|
467
|
+
|
|
468
|
+
// 📖 SiliconFlow source - https://api.siliconflow.cn/v1/chat/completions
|
|
469
|
+
// 📖 OpenAI-compatible endpoint: https://api.siliconflow.cn/v1
|
|
470
|
+
// 📖 Free tier: permanently free models at $0 (no card needed beyond phone SMS verification).
|
|
471
|
+
// 📖 Verified 2026-08-23 via pricing page + docs: THUDM/GLM-Z1-9B-0414 is 免费; Qwen3-8B and DeepSeek-R1-Distill-Qwen-7B
|
|
472
|
+
// 📖 documented as free in SiliconFlow guide 2026-06-05 ("Three models are completely free: Qwen3-8B, DeepSeek-R1-Distill-Qwen-7B, DeepSeek-OCR")
|
|
473
|
+
// 📖 and still reachable with free-tier rate limits (1000 RPM). Keep only the chat text models here.
|
|
474
|
+
export const siliconflow = [
|
|
475
|
+
// ── A tier — SWE-bench Verified 40–50% ──
|
|
476
|
+
['THUDM/GLM-Z1-9B-0414', 'GLM-Z1 9B', 'A', '-', '32k'],
|
|
477
|
+
// ── B+ tier ──
|
|
478
|
+
['Qwen/Qwen3-8B', 'Qwen3 8B', 'B+', '30.0%', '32k'],
|
|
479
|
+
['deepseek-ai/DeepSeek-R1-Distill-Qwen-7B', 'DeepSeek R1 Distill Qwen 7B', 'A', '-', '32k'],
|
|
480
|
+
]
|
|
481
|
+
|
|
482
|
+
// 📖 Requesty source - https://router.requesty.ai/v1
|
|
483
|
+
// 📖 OpenAI-compatible gateway: https://router.requesty.ai/v1/chat/completions
|
|
484
|
+
// 📖 Free tier: 200 req/day on zero-price free models (4× OpenRouter), no card, EU residency, routing/caching included.
|
|
485
|
+
// 📖 Verified live 2026-08-23 via GET /v1/models (676 models, 12 with input_price=0 & output_price=0).
|
|
486
|
+
export const requesty = [
|
|
487
|
+
// ── S+ tier — SWE-bench Verified ≥70% ──
|
|
488
|
+
['nvidia/nemotron-3-ultra-550b-a55b', 'Nemotron 3 Ultra', 'S+', '71.9%', '1M'],
|
|
489
|
+
['poolside/laguna-xs.2', 'Laguna XS.2', 'S+', '70.9%', '32k'],
|
|
490
|
+
// ── S tier — SWE-bench Verified 60–70% ──
|
|
491
|
+
['nvidia/nemotron-3-super-120b-a12b', 'Nemotron 3 Super', 'S', '60.5%', '1M'],
|
|
492
|
+
['poolside/laguna-m.1', 'Laguna M.1', 'S', '-', '32k'],
|
|
493
|
+
// ── A+ tier — SWE-bench Verified 50–60% ──
|
|
494
|
+
['google/gemma-4-31b-it', 'Gemma 4 31B', 'A+', '52.0%', '262k'],
|
|
495
|
+
['nvidia/nemotron-3-nano-omni-30b-a3b-reasoning', 'Nemotron 3 Omni', 'A+', '52.0%', '131k'],
|
|
496
|
+
// ── A tier — SWE-bench Verified 40–50% ──
|
|
497
|
+
['nvidia/nemotron-nano-3-30b-a3b', 'Nemotron Nano 30B', 'A-', '38.8%', '262k'],
|
|
498
|
+
// ── B+ tier — SWE-bench Verified 30–35% ──
|
|
499
|
+
['nvidia/nemotron-3.5-lightning-30b-a3b', 'Nemotron 3.5 Lightning', 'B+', '-', '1M'],
|
|
500
|
+
// ── B tier — SWE-bench Verified 20–30% ──
|
|
501
|
+
['mistral/leanstral-1-5', 'Leanstral 1.5', 'B', '-', '262k'],
|
|
502
|
+
['novita/inclusionai/ling-3.0-tiny', 'Ling 3.0 Tiny', 'B', '-', '262k'],
|
|
503
|
+
// ── C tier — other zero-price models (kept for breadth) ──
|
|
504
|
+
['nvidia/nemotron-3.5-content-safety', 'Nemotron Content Safety', 'C', '-', '131k'],
|
|
505
|
+
['nvidia/muse-glimmer-30b', 'Muse Glimmer 30B', 'C', '-', '131k'],
|
|
506
|
+
]
|
|
507
|
+
|
|
508
|
+
// 📖 OrcaRouter source - https://api.orcarouter.ai/v1
|
|
509
|
+
// 📖 OpenAI-compatible gateway: https://api.orcarouter.ai/v1/chat/completions
|
|
510
|
+
// 📖 Zero-markup AI gateway: token prices are passed through at provider rates, so only
|
|
511
|
+
// 📖 the explicitly $-0 models are listed here. Verified live 2026-08-30 via GET /v1/models
|
|
512
|
+
// 📖 (204 models, 3 with pricing.request=0). The orcarouter/fusion + orcarouter/free
|
|
513
|
+
// 📖 adaptive-routing models are reachable through the same endpoint for users who opt
|
|
514
|
+
// 📖 into pay-as-you-go billing, but are not free so they stay out of this catalog.
|
|
515
|
+
export const orcarouter = [
|
|
516
|
+
// ── S+ tier — SWE-bench Verified ≥70% ──
|
|
517
|
+
['deepseek/deepseek-v4-flash-free', 'DeepSeek V4 Flash (Free)', 'S+', '79.0%', '1M'],
|
|
518
|
+
// ── S tier — SWE-bench Verified 60–70% ──
|
|
519
|
+
['tencent/hy3-free', 'Tencent Hy3 (Free)', 'S', '-', '256k'],
|
|
520
|
+
// ── A+ tier — SWE-bench Verified 50–60% ──
|
|
521
|
+
['qwen/qwen3.8-27b-free', 'Qwen3.8 27B (Free)', 'A+', '-', '64k'],
|
|
522
|
+
]
|
|
523
|
+
|
|
453
524
|
// 📖 Ollama Cloud source - https://ollama.com/pricing and https://ollama.com/search?c=cloud
|
|
454
525
|
// 📖 Free plan includes cloud model access with session/weekly limits. This list keeps coding-relevant cloud models only.
|
|
455
526
|
// 📖 Catalog verified 2026-07-18 against official Ollama cloud model search page.
|
|
@@ -536,7 +607,7 @@ export const sources = {
|
|
|
536
607
|
},
|
|
537
608
|
cloudflare: {
|
|
538
609
|
name: 'Cloudflare AI',
|
|
539
|
-
url: 'https://api.cloudflare.com/client/v4/accounts/{
|
|
610
|
+
url: 'https://api.cloudflare.com/client/v4/accounts/{$CLOUDFLARE_ACCOUNT_ID}/ai/v1/chat/completions',
|
|
540
611
|
quota: 'Free · 10k neurons/day',
|
|
541
612
|
quotaCode: 'limited',
|
|
542
613
|
models: cloudflare,
|
|
@@ -592,7 +663,7 @@ export const sources = {
|
|
|
592
663
|
},
|
|
593
664
|
|
|
594
665
|
'opencode-zen': {
|
|
595
|
-
name: '
|
|
666
|
+
name: 'OpencodeZen',
|
|
596
667
|
url: 'https://opencode.ai/zen/v1/chat/completions',
|
|
597
668
|
quota: 'Free · Zen key required',
|
|
598
669
|
quotaCode: 'free',
|
|
@@ -629,6 +700,34 @@ export const sources = {
|
|
|
629
700
|
quotaCode: 'limited',
|
|
630
701
|
models: novita, // Empty — kept for backward compat in user configs
|
|
631
702
|
},
|
|
703
|
+
pollinations: {
|
|
704
|
+
name: 'Pollinations AI',
|
|
705
|
+
url: 'https://gen.pollinations.ai/v1/chat/completions',
|
|
706
|
+
quota: 'Free · daily Pollen grants · key at enter.pollinations.ai',
|
|
707
|
+
quotaCode: 'free',
|
|
708
|
+
models: pollinations,
|
|
709
|
+
},
|
|
710
|
+
siliconflow: {
|
|
711
|
+
name: 'SiliconFlow',
|
|
712
|
+
url: 'https://api.siliconflow.cn/v1/chat/completions',
|
|
713
|
+
quota: 'Free · 3 models @ $0 · 1000 RPM',
|
|
714
|
+
quotaCode: 'free',
|
|
715
|
+
models: siliconflow,
|
|
716
|
+
},
|
|
717
|
+
requesty: {
|
|
718
|
+
name: 'Requesty',
|
|
719
|
+
url: 'https://router.requesty.ai/v1/chat/completions',
|
|
720
|
+
quota: 'Free · 200 req/day · no card',
|
|
721
|
+
quotaCode: 'free',
|
|
722
|
+
models: requesty,
|
|
723
|
+
},
|
|
724
|
+
orcarouter: {
|
|
725
|
+
name: 'OrcaRouter',
|
|
726
|
+
url: 'https://api.orcarouter.ai/v1/chat/completions',
|
|
727
|
+
quota: 'Free · 3 $-0 models · zero markup',
|
|
728
|
+
quotaCode: 'free',
|
|
729
|
+
models: orcarouter,
|
|
730
|
+
},
|
|
632
731
|
'ollama-cloud': {
|
|
633
732
|
name: 'Ollama Cloud',
|
|
634
733
|
url: 'https://ollama.com/v1/chat/completions',
|
package/src/core/benchmark.js
CHANGED
|
@@ -141,7 +141,7 @@ export function buildBenchmarkRequest(apiKey, modelId, providerKey, url) {
|
|
|
141
141
|
|
|
142
142
|
const headers = { 'Content-Type': 'application/json' }
|
|
143
143
|
if (apiKey) headers.Authorization = `Bearer ${apiKey}`
|
|
144
|
-
if (providerKey === 'openrouter') {
|
|
144
|
+
if (providerKey === 'openrouter' || providerKey === 'orcarouter') {
|
|
145
145
|
headers['HTTP-Referer'] = 'https://github.com/vava-nessa/free-coding-models'
|
|
146
146
|
headers['X-Title'] = 'free-coding-models'
|
|
147
147
|
}
|
package/src/core/config.js
CHANGED
|
@@ -183,6 +183,10 @@ const ENV_VARS = {
|
|
|
183
183
|
routeway: 'ROUTEWAY_API_KEY',
|
|
184
184
|
novita: 'NOVITA_API_KEY',
|
|
185
185
|
'ollama-cloud': 'OLLAMA_API_KEY',
|
|
186
|
+
pollinations: ['POLLINATIONS_API_KEY', 'POLLINATIONS_TOKEN'],
|
|
187
|
+
siliconflow: 'SILICONFLOW_API_KEY',
|
|
188
|
+
requesty: 'REQUESTY_API_KEY',
|
|
189
|
+
orcarouter: 'ORCAROUTER_API_KEY',
|
|
186
190
|
}
|
|
187
191
|
|
|
188
192
|
// 📖 Smart Router defaults are intentionally conservative: balanced probing,
|
|
@@ -171,7 +171,10 @@ function resolveProviderBaseUrl(providerKey) {
|
|
|
171
171
|
if (providerKey === 'cloudflare') {
|
|
172
172
|
const accountId = (process.env.CLOUDFLARE_ACCOUNT_ID || '').trim()
|
|
173
173
|
if (!accountId) return null
|
|
174
|
-
return providerUrl
|
|
174
|
+
return providerUrl
|
|
175
|
+
.replace(/\{\$CLOUDFLARE_ACCOUNT_ID\}/g, encodeURIComponent(accountId))
|
|
176
|
+
.replace(/\{account_id\}/g, encodeURIComponent(accountId))
|
|
177
|
+
.replace(/\/chat\/completions$/i, '')
|
|
175
178
|
}
|
|
176
179
|
|
|
177
180
|
return providerUrl
|
|
@@ -189,7 +192,9 @@ function resolveGooseBaseUrl(providerKey) {
|
|
|
189
192
|
if (providerKey === 'cloudflare') {
|
|
190
193
|
const accountId = (process.env.CLOUDFLARE_ACCOUNT_ID || '').trim()
|
|
191
194
|
if (!accountId) return null
|
|
192
|
-
return providerUrl
|
|
195
|
+
return providerUrl
|
|
196
|
+
.replace(/\{\$CLOUDFLARE_ACCOUNT_ID\}/g, encodeURIComponent(accountId))
|
|
197
|
+
.replace(/\{account_id\}/g, encodeURIComponent(accountId))
|
|
193
198
|
}
|
|
194
199
|
return providerUrl
|
|
195
200
|
}
|
package/src/core/kilo.js
CHANGED
|
@@ -110,6 +110,13 @@ export async function startKilo(model, fcmConfig) {
|
|
|
110
110
|
options: { baseURL: 'https://openrouter.ai/api/v1', apiKey: '{env:OPENROUTER_API_KEY}' },
|
|
111
111
|
models: {}
|
|
112
112
|
}
|
|
113
|
+
} else if (providerKey === 'orcarouter') {
|
|
114
|
+
config.provider.orcarouter = {
|
|
115
|
+
npm: '@ai-sdk/openai-compatible',
|
|
116
|
+
name: 'OrcaRouter',
|
|
117
|
+
options: { baseURL: 'https://api.orcarouter.ai/v1', apiKey: '{env:ORCAROUTER_API_KEY}' },
|
|
118
|
+
models: {}
|
|
119
|
+
}
|
|
113
120
|
} else if (providerKey === 'huggingface') {
|
|
114
121
|
config.provider.huggingface = {
|
|
115
122
|
npm: '@ai-sdk/openai-compatible',
|
|
@@ -163,7 +170,7 @@ export async function startKilo(model, fcmConfig) {
|
|
|
163
170
|
config.provider.siliconflow = {
|
|
164
171
|
npm: '@ai-sdk/openai-compatible',
|
|
165
172
|
name: 'SiliconFlow',
|
|
166
|
-
options: { baseURL: 'https://api.siliconflow.
|
|
173
|
+
options: { baseURL: 'https://api.siliconflow.cn/v1', apiKey: '{env:SILICONFLOW_API_KEY}' },
|
|
167
174
|
models: {}
|
|
168
175
|
}
|
|
169
176
|
} else if (providerKey === 'together') {
|
package/src/core/opencode.js
CHANGED
|
@@ -425,6 +425,13 @@ export async function startOpenCode(model, fcmConfig) {
|
|
|
425
425
|
options: { baseURL: 'https://openrouter.ai/api/v1', apiKey: '{env:OPENROUTER_API_KEY}' },
|
|
426
426
|
models: {}
|
|
427
427
|
}
|
|
428
|
+
} else if (providerKey === 'orcarouter') {
|
|
429
|
+
config.provider.orcarouter = {
|
|
430
|
+
npm: '@ai-sdk/openai-compatible',
|
|
431
|
+
name: 'OrcaRouter',
|
|
432
|
+
options: { baseURL: 'https://api.orcarouter.ai/v1', apiKey: '{env:ORCAROUTER_API_KEY}' },
|
|
433
|
+
models: {}
|
|
434
|
+
}
|
|
428
435
|
} else if (providerKey === 'huggingface') {
|
|
429
436
|
config.provider.huggingface = {
|
|
430
437
|
npm: '@ai-sdk/openai-compatible',
|
|
@@ -478,7 +485,7 @@ export async function startOpenCode(model, fcmConfig) {
|
|
|
478
485
|
config.provider.siliconflow = {
|
|
479
486
|
npm: '@ai-sdk/openai-compatible',
|
|
480
487
|
name: 'SiliconFlow',
|
|
481
|
-
options: { baseURL: 'https://api.siliconflow.
|
|
488
|
+
options: { baseURL: 'https://api.siliconflow.cn/v1', apiKey: '{env:SILICONFLOW_API_KEY}' },
|
|
482
489
|
models: {}
|
|
483
490
|
}
|
|
484
491
|
} else if (providerKey === 'together') {
|
|
@@ -793,6 +800,13 @@ export async function startOpenCodeDesktop(model, fcmConfig) {
|
|
|
793
800
|
options: { baseURL: 'https://openrouter.ai/api/v1', apiKey: '{env:OPENROUTER_API_KEY}' },
|
|
794
801
|
models: {}
|
|
795
802
|
}
|
|
803
|
+
} else if (providerKey === 'orcarouter') {
|
|
804
|
+
config.provider.orcarouter = {
|
|
805
|
+
npm: '@ai-sdk/openai-compatible',
|
|
806
|
+
name: 'OrcaRouter',
|
|
807
|
+
options: { baseURL: 'https://api.orcarouter.ai/v1', apiKey: '{env:ORCAROUTER_API_KEY}' },
|
|
808
|
+
models: {}
|
|
809
|
+
}
|
|
796
810
|
} else if (providerKey === 'huggingface') {
|
|
797
811
|
config.provider.huggingface = {
|
|
798
812
|
npm: '@ai-sdk/openai-compatible',
|
|
@@ -846,7 +860,7 @@ export async function startOpenCodeDesktop(model, fcmConfig) {
|
|
|
846
860
|
config.provider.siliconflow = {
|
|
847
861
|
npm: '@ai-sdk/openai-compatible',
|
|
848
862
|
name: 'SiliconFlow',
|
|
849
|
-
options: { baseURL: 'https://api.siliconflow.
|
|
863
|
+
options: { baseURL: 'https://api.siliconflow.cn/v1', apiKey: '{env:SILICONFLOW_API_KEY}' },
|
|
850
864
|
models: {}
|
|
851
865
|
}
|
|
852
866
|
} else if (providerKey === 'together') {
|
package/src/core/ping.js
CHANGED
|
@@ -56,12 +56,17 @@ const DISABLED_THINKING_RETRY_STATUSES = new Set([400, 422])
|
|
|
56
56
|
const disabledThinkingUnsupportedProviders = new Set()
|
|
57
57
|
|
|
58
58
|
// 📖 resolveCloudflareUrl: Cloudflare's OpenAI-compatible endpoint is account-scoped.
|
|
59
|
-
// 📖 We resolve
|
|
59
|
+
// 📖 We resolve the placeholder from the CLOUDFLARE_ACCOUNT_ID env var so provider
|
|
60
|
+
// 📖 setup can stay simple in config. Supports both the `{account_id}` placeholder
|
|
61
|
+
// 📖 and the explicit `{$CLOUDFLARE_ACCOUNT_ID}` form used in sources.js.
|
|
60
62
|
export function resolveCloudflareUrl(url) {
|
|
61
63
|
const accountId = (process.env.CLOUDFLARE_ACCOUNT_ID || '').trim()
|
|
62
|
-
|
|
63
|
-
if (!
|
|
64
|
-
|
|
64
|
+
const hasPlaceholder = url.includes('{$CLOUDFLARE_ACCOUNT_ID}') || url.includes('{account_id}')
|
|
65
|
+
if (!hasPlaceholder) return url
|
|
66
|
+
const replacement = accountId ? encodeURIComponent(accountId) : 'missing-account-id'
|
|
67
|
+
return url
|
|
68
|
+
.replace(/\{\$CLOUDFLARE_ACCOUNT_ID\}/g, replacement)
|
|
69
|
+
.replace(/\{account_id\}/g, replacement)
|
|
65
70
|
}
|
|
66
71
|
|
|
67
72
|
// 📖 buildChatCompletionPingBody: Use the smallest useful chat-completion probe.
|
|
@@ -130,6 +135,11 @@ export function buildPingRequest(apiKey, modelId, providerKey, url, options = {}
|
|
|
130
135
|
headers['HTTP-Referer'] = 'https://github.com/vava-nessa/free-coding-models'
|
|
131
136
|
headers['X-Title'] = 'free-coding-models'
|
|
132
137
|
}
|
|
138
|
+
if (providerKey === 'orcarouter') {
|
|
139
|
+
// 📖 OrcaRouter uses the same app-identification convention as OpenRouter.
|
|
140
|
+
headers['HTTP-Referer'] = 'https://github.com/vava-nessa/free-coding-models'
|
|
141
|
+
headers['X-Title'] = 'free-coding-models'
|
|
142
|
+
}
|
|
133
143
|
|
|
134
144
|
return {
|
|
135
145
|
url,
|
|
@@ -65,7 +65,10 @@ export const PROVIDER_AUTH_ENDPOINTS = {
|
|
|
65
65
|
fireworks: { url: 'https://api.fireworks.ai/v1/models', method: 'GET' },
|
|
66
66
|
hyperbolic: { url: 'https://api.hyperbolic.xyz/v1/models', method: 'GET' },
|
|
67
67
|
scaleway: { url: 'https://api.scaleway.ai/v1/models', method: 'GET' },
|
|
68
|
-
siliconflow: { url: 'https://api.siliconflow.
|
|
68
|
+
siliconflow: { url: 'https://api.siliconflow.cn/v1/models', method: 'GET' },
|
|
69
|
+
pollinations: null,
|
|
70
|
+
requesty: null,
|
|
71
|
+
orcarouter: { url: 'https://api.orcarouter.ai/v1/models', method: 'GET' },
|
|
69
72
|
together: { url: 'https://api.together.xyz/v1/models', method: 'GET' },
|
|
70
73
|
perplexity: { url: 'https://api.perplexity.ai/v1/models', method: 'GET' },
|
|
71
74
|
chutes: { url: 'https://chutes.ai/v1/models', method: 'GET' },
|
|
@@ -101,7 +104,7 @@ export async function testProviderKeyDirect(apiKey, providerKey) {
|
|
|
101
104
|
|
|
102
105
|
const { url, method } = authConfig
|
|
103
106
|
const headers = { Authorization: `Bearer ${apiKey}` }
|
|
104
|
-
if (providerKey === 'openrouter') {
|
|
107
|
+
if (providerKey === 'openrouter' || providerKey === 'orcarouter') {
|
|
105
108
|
headers['HTTP-Referer'] = 'https://github.com/vava-nessa/free-coding-models'
|
|
106
109
|
headers['X-Title'] = 'free-coding-models'
|
|
107
110
|
}
|