free-coding-models 0.5.94 โ 0.5.96
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 +12 -8
- package/bin/free-coding-models.js +2 -0
- package/changelog/v0.5.95.md +20 -0
- package/changelog/v0.5.96.md +22 -0
- package/package.json +1 -1
- package/sources.js +84 -27
- package/src/core/config.js +16 -0
- package/src/core/i18n/index.js +49 -0
- package/src/core/i18n/locales/en.js +991 -0
- package/src/core/i18n/locales/zh-CN.js +991 -0
- package/src/core/opencode.js +15 -8
- package/src/core/ping.js +31 -1
- package/src/core/playground.js +20 -19
- package/src/core/provider-key-tester.js +1 -0
- package/src/core/provider-metadata.js +9 -0
- package/src/core/quota-capabilities.js +2 -0
- package/src/core/router-daemon.js +37 -6
- package/src/core/router-dashboard.js +15 -14
- package/src/core/router-v2/tui-dashboard.js +27 -26
- package/src/tui/app.js +2 -0
- package/src/tui/cli-help.js +45 -21
- package/src/tui/command-palette.js +19 -1
- package/src/tui/key-handler.js +21 -1
- package/src/tui/overlays.js +113 -107
- package/src/tui/render-helpers.js +4 -3
- package/src/tui/render-table.js +137 -132
- package/src/tui/theme.js +2 -0
- package/web/dist/assets/index-Cq9X7sN8.js +45 -0
- package/web/dist/assets/index-DZFdxy2N.css +1 -0
- package/web/dist/index.html +2 -2
- package/web/server.js +58 -6
- package/web/dist/assets/index-CCaxIOti.css +0 -1
- package/web/dist/assets/index-ClaihG9x.js +0 -45
package/README.md
CHANGED
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
|
|
7
7
|
<p align="center">
|
|
8
8
|
<strong>Find the fastest free coding model in seconds.</strong><br>
|
|
9
|
-
Live latency, stability and verdicts for
|
|
9
|
+
Live latency, stability and verdicts for 259 models from 25 free AI providers, then install the one you pick straight into your favorite coding tool.<br><br>
|
|
10
10
|
<strong>Works with:</strong> OpenCode CLI / Desktop / WebUI, OpenClaw, Crush, Goose, Aider, Kilo CLI, Qwen Code, OpenHands, Amp, Hermes, Continue, Cline, Xcode, Pi, ZCode, ForgeCode, Copilot, jcode, Caveman Code and more.
|
|
11
11
|
</p>
|
|
12
12
|
|
|
@@ -24,7 +24,7 @@ free-coding-models
|
|
|
24
24
|
```
|
|
25
25
|
|
|
26
26
|
<p align="center">
|
|
27
|
-
<sub>Then create a free account on one of the <a href="#-providers">
|
|
27
|
+
<sub>Then create a free account on one of the <a href="#-providers">25 providers</a> to grab an API key.</sub>
|
|
28
28
|
</p>
|
|
29
29
|
|
|
30
30
|
<p align="center">
|
|
@@ -35,7 +35,7 @@ free-coding-models
|
|
|
35
35
|
|
|
36
36
|
## ๐ก Why this tool?
|
|
37
37
|
|
|
38
|
-
There is a large catalog of free and free-limited coding models (**
|
|
38
|
+
There is a large catalog of free and free-limited coding models (**25 providers / 259 live models**, generated from [`sources.js`](./sources.js)). Which one is fastest *right now*? Which one is actually stable, versus just lucky on the last ping?
|
|
39
39
|
|
|
40
40
|
`free-coding-models` (FCM) answers that by pinging every model in parallel, showing live latency, and computing a **live Stability Score (0-100)** combining p95 latency, jitter, spike rate and uptime. Average latency alone is misleading: a model that randomly spikes to 6 seconds is not reliable.
|
|
41
41
|
|
|
@@ -87,17 +87,17 @@ free-coding-models --fiable # print the single most reliable model
|
|
|
87
87
|
|
|
88
88
|
## ๐ข Providers
|
|
89
89
|
|
|
90
|
-
**
|
|
90
|
+
**25 active providers / 259 live models**, sorted by live model count. Top 8:
|
|
91
91
|
|
|
92
92
|
| Provider | Models | Best tier | Env var |
|
|
93
93
|
|----------|--------|-----------|---------|
|
|
94
94
|
| [Alibaba DashScope](https://modelstudio.console.alibabacloud.com) | 29 | S+ | `DASHSCOPE_API_KEY` |
|
|
95
|
-
| [
|
|
95
|
+
| [Kilo](https://kilo.ai) | 21 | S+ | `KILO_API_KEY` |
|
|
96
96
|
| [OpenRouter](https://openrouter.ai/keys) | 21 | S+ | `OPENROUTER_API_KEY` |
|
|
97
|
-
| [
|
|
97
|
+
| [Pollinations AI](https://enter.pollinations.ai) | 21 | S+ | `POLLINATIONS_API_KEY` |
|
|
98
98
|
| [Ollama Cloud](https://ollama.com/settings/keys) | 20 | S+ | `OLLAMA_API_KEY` |
|
|
99
|
-
| [
|
|
100
|
-
| [
|
|
99
|
+
| [Cloudflare AI](https://dash.cloudflare.com) | 15 | S | `CLOUDFLARE_API_TOKEN` |
|
|
100
|
+
| [OVHcloud AI](https://endpoints.ai.cloud.ovh.net) | 13 | S+ | `OVH_AI_ENDPOINTS_ACCESS_TOKEN` |
|
|
101
101
|
| [NVIDIA NIM](https://build.nvidia.com) | 12 | S+ | `NVIDIA_API_KEY` |
|
|
102
102
|
|
|
103
103
|
> ๐งพ **What "free" means here:** free is a property of the *(provider, model)* pair, never of the provider as a whole. A row is listed only when that exact model id costs $0 to call through that provider (permanent free tier, `:free` variant, or free plan), verified live at audit time. The same open-weights model can be free on one host and paid on another - paid siblings are deliberately excluded. Full breakdown and badge legend: [`docs/providers.md`](./docs/providers.md).
|
|
@@ -129,6 +129,10 @@ The TUI is the heart of FCM: a live, sortable table of every model with real lat
|
|
|
129
129
|
|
|
130
130
|
Mouse support: click headers to sort, double-click a row to launch, right-click to favorite, scroll to navigate.
|
|
131
131
|
|
|
132
|
+
### Languages
|
|
133
|
+
|
|
134
|
+
The TUI and Web Dashboard support English (default) and Simplified Chinese (`zh-CN`). Change **Language** in Settings; the preference is shared and saved in your local config.
|
|
135
|
+
|
|
132
136
|
> ๐ **Full key table, mouse reference and workflows:** [`docs/tui.md`](./docs/tui.md) ยท Stability score and columns: [`docs/stability.md`](./docs/stability.md)
|
|
133
137
|
|
|
134
138
|
---
|
|
@@ -32,6 +32,7 @@ if (_configDirIdx !== -1 && process.argv[_configDirIdx + 1] && !process.argv[_co
|
|
|
32
32
|
import chalk from 'chalk';
|
|
33
33
|
import { parseArgs, TIER_LETTER_MAP } from '../src/core/utils.js';
|
|
34
34
|
import { loadConfig, saveConfig } from '../src/core/config.js';
|
|
35
|
+
import { setLocale } from '../src/core/i18n/index.js';
|
|
35
36
|
import { ensureTelemetryConfig } from '../src/core/telemetry.js';
|
|
36
37
|
import { ensureFavoritesConfig } from '../src/core/favorites.js';
|
|
37
38
|
import { buildCliHelpText } from '../src/tui/cli-help.js';
|
|
@@ -69,6 +70,7 @@ async function main() {
|
|
|
69
70
|
const cliArgs = parseArgs(process.argv);
|
|
70
71
|
|
|
71
72
|
if (cliArgs.helpMode) {
|
|
73
|
+
setLocale(loadConfig().settings?.language || 'en');
|
|
72
74
|
console.log();
|
|
73
75
|
console.log(buildCliHelpText({ chalk, title: 'free-coding-models' }));
|
|
74
76
|
console.log();
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
# Changelog v0.5.95 - 2026-09-22
|
|
2
|
+
|
|
3
|
+
### Added
|
|
4
|
+
- ๐ Pollinations: Claude Opus 5 (S+, 1M), Claude Sonnet 5 (S, 1M), LongCat 2.0 (A, 1M) and DeepSeek V4.1 Flash (A+, 1M) are now reachable free via Pollen credits. Flagged gemini-3.1-pro-preview as reporting 'down' on the live catalog, re-verify next audit.
|
|
5
|
+
- ๐ OrcaRouter: the fusion family (fusion S, fusion-mini A+, fusion-flash B+) now reports $0 with real context lengths, so all three are listed.
|
|
6
|
+
- ๐ซ๐ท Mistral: Mistral Large 3 (mistral-large-2512, S+, 256k) re-added. The 2026-09-16 removal was stale, the 675B MoE flagship is back in the official catalog. Also added Leanstral 1.5 (B, 256k, Lean 4 theorem proving).
|
|
7
|
+
- โก NVIDIA NIM: GLM-5.3-Flash (S+, 1M) verified live on the free integrate API.
|
|
8
|
+
- ๐ซ๐ท Scaleway: Qwen3.8 27B (A+, 256k) added to the Serverless catalog.
|
|
9
|
+
- ๐งฉ OpenCode Zen: MiMo-V2.6 Flash Free (S+, 200k) new free promo model on the live Zen endpoint.
|
|
10
|
+
- ๐งฑ Kilo: Nemotron 3.5 Content Safety (C, 128k) added for breadth, matching OpenRouter/Requesty.
|
|
11
|
+
- ๐ SiliconFlow: Hunyuan MT 7B (C, 33k) added as the new $0 chat model.
|
|
12
|
+
|
|
13
|
+
### Removed
|
|
14
|
+
- ๐ชฆ Novita: bunny, Qwen 3.6 Plus, Qwen 3.5 Plus and GLM 4.6 (dev) all gone paid or delisted. Only the 3 Ling 3.0 Flash variants stay free (time-limited).
|
|
15
|
+
- ๐ชฆ SiliconFlow: DeepSeek R1 0528 Qwen3 8B and Qwen3.5 4B dropped off the official free pricing list.
|
|
16
|
+
- ๐ชฆ Mistral: Magistral Medium officially deprecated upstream 2026-05-22, replacement Mistral Medium 3.5 (already listed).
|
|
17
|
+
|
|
18
|
+
### Changed
|
|
19
|
+
- ๐ Full 24-provider re-audit, live-verified 2026-09-22: 247 โ 254 free models. 14 providers confirmed with zero changes (groq, cerebras, googleai, cloudflare, openrouter, sambanova, ovhcloud, codestral, zai, qwen, llm7, routeway, requesty, vercel-gateway, ollama-cloud).
|
|
20
|
+
- โ
Test updated: NVIDIA static-head expectation now reflects the new catalog order.
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
# Changelog v0.5.96 - 2026-09-26
|
|
2
|
+
|
|
3
|
+
Community release: 3 issues fixed, 5 pull requests merged (4 new contributors), 1 declined with reason. The catalog moves to **25 providers / 259 models** with the addition of onomeo and 2 Mistral coding models, minus 6 Pollinations models that silently left the free tier.
|
|
4
|
+
|
|
5
|
+
### Added
|
|
6
|
+
|
|
7
|
+
- **๐จ๐ณ Simplified Chinese localization** (PR #193 by @Mavlan): the TUI and the Web Dashboard now share one i18n layer, English stays the default and `zh-CN` is one setting away. The language preference is persisted in the shared config and exposed through the web Settings API. CLI help, settings, router, install, search and command-palette text are all localized, and CJK display-width handling is reused for TUI columns and overlay clipping.
|
|
8
|
+
- **onomeo provider** (PR #187 by @Owaid0723666, who also disclosed operating the service): 9 free coding models behind a daily check-in credit system (50k credits on day 1, up to 200k/day with a streak, no card). Wired end to end: env var `ONOMEO_API_KEY`, key test against `GET /v1/models`, quota badge `limited`, theme colors, Docker env passthrough and provider card on the website. Model ids verified live against the public catalog; premium models deliberately not listed.
|
|
9
|
+
- **Mistral coding model aliases** (PR #192 by @MrTodone): `mistral-code-latest` and `mistral-code-fim-latest` join the Mistral provider (both live-verified aliases of codestral-2508, 256k context), handy for clients that address the `mistral-code-*` family directly.
|
|
10
|
+
|
|
11
|
+
### Fixed
|
|
12
|
+
|
|
13
|
+
- **Daemon dashboard "[object Object]" toast on every open** (issue #189): the daemon's embedded dashboard only stubbed `GET /api/tool-mode`, so the frontend's POST (URL write-back of `?toolMode=`) fell through to the OpenAI-style 404 catch-all. The daemon now handles GET and POST like `web/server.js`: GET returns the persisted `settings.preferredToolMode` instead of a hardcoded `opencode`, POST validates and persists the mode, and the frontend hook extracts nested `error.message` so any future failure reads as a sentence, not `[object Object]`. Covered by 4 new integration tests.
|
|
14
|
+
- **"Unrecognized flag: --model" when launching OpenCode v2** (issue #194): OpenCode v2 rejects flags its entry points don't know, and `opencode web` never accepted `--model` at all. FCM already wrote your pick into `opencode.json` (`config.model`) before every launch, so the flag was redundant: all launch paths (CLI, Web, Desktop, snap/flatpak) now spawn bare and let the config default apply. Works identically on OpenCode v1 and v2.
|
|
15
|
+
- **6 Pollinations models that quietly became paid** (issue #190, reported by @holakoyad): `minimax-m2.7`, `qwen/qwen3.8-max`, `google/gemini-3.1-pro-preview`, `nvidia/nemotron-3-ultra`, `qwen/qwen3-coder-next` and `gemma-4-31b` answer HTTP 200 with the error text embedded in the completion content on free keys, so status-code probes saw them as healthy. All 6 are removed (free alternatives remain on their original providers), and probes now sniff pollinations completions for the paid-Pollen message and report `402` instead of a fake `200`. Covered by 4 new unit tests.
|
|
16
|
+
- **Router v2 failover settings wiped on restart** (PR #191 by @MrTodone): `lastResortModel`, `bodyReadTimeoutMs`, `totalBudgetMs` and `contentValidation` were silently stripped by the config normalizer on every `load() โ save()` round-trip. Unknown failover keys now survive normalization (the daemon still sanitizes them at read time), with round-trip regression tests.
|
|
17
|
+
- **Web Settings API key deletion could resurrect itself** (PR #195 by @ming076): `/api/settings` saved keys with a plain `saveConfig()` whose on-disk merge could restore a just-deleted key. Key add/update/delete now goes through the provider-scoped `persistApiKeysForProvider()` helper, and persistence failures return a real error instead of a fake success.
|
|
18
|
+
|
|
19
|
+
### Changed
|
|
20
|
+
|
|
21
|
+
- Provider counts: **24 โ 25 providers, 254 โ 259 models** (minus 6 paid Pollinations, plus 9 onomeo, plus 2 Mistral aliases). `docs/providers.md` regenerated from `sources.js`, README counts and Top-8 table refreshed, website catalog mirror synced.
|
|
22
|
+
- Declined the chalk 5 โ 6 dependabot bump (PR #183): chalk 6 requires Node 22 while FCM supports Node 18+ and CI tests Node 20. It will be revisited when the minimum Node version moves to 22.
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "free-coding-models",
|
|
3
|
-
"version": "0.5.
|
|
3
|
+
"version": "0.5.96",
|
|
4
4
|
"description": "Find the fastest coding LLM models in seconds โ ping free models from multiple providers, pick the best one for OpenCode, Cursor, or any AI coding assistant.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"nvidia",
|
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, pollinations, siliconflow, requesty, orcarouter, vercelGateway โ 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, vercelGateway, onomeo โ 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]
|
|
@@ -50,6 +50,7 @@ export const nvidiaNim = [
|
|
|
50
50
|
// 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)
|
|
51
51
|
// Removed (2026-09-21): deepseek-ai/deepseek-v4-flash-0731 (DeepSeek V4 Flash) โ NVIDIA deprecation banner on the model page: deprecated 2026-09-19, no longer supported after 2026-09-21; DeepSeek retired V4 Flash in favor of V4.1 Flash (not registered on NIM)
|
|
52
52
|
['moonshotai/kimi-k3', 'Kimi K3', 'S+', '76.8%', '1M'], // Fixed (2026-09-21): tier 'S' โ 'S+' + sweScore '-' โ '76.8%' (tracker-sourced SWE-bench Verified; 76.8% is S+ on the documented scale)
|
|
53
|
+
['z-ai/glm-5.3-flash', 'GLM-5.3-Flash', 'S+', '-', '1M'], // Added (2026-09-22) โ live on NIM /v1/models (needed a 230s cold start on first probe)
|
|
53
54
|
// 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`)
|
|
54
55
|
['nvidia/nemotron-3-ultra-550b-a55b', 'Nemotron 3 Ultra', 'S+', '71.9%', '1M'],
|
|
55
56
|
['poolside/laguna-xs-2.1', 'Laguna XS 2.1', 'S+', '70.9%', '262k'], // Added (2026-08-13)
|
|
@@ -211,19 +212,24 @@ export const githubModels = [
|
|
|
211
212
|
export const mistral = [
|
|
212
213
|
// โโ S+ tier โ SWE-bench Verified โฅ70% โโ
|
|
213
214
|
['mistral-medium-3-5', 'Mistral Medium 3.5', 'S+', '77.6%', '256k'], // Fixed (2026-09-16): mistral-medium-3-5-26-04 โ mistral-medium-3-5 (live /v1/models, ctx 262144)
|
|
215
|
+
['mistral-large-2512', 'Mistral Large 3', 'S+', '-', '256k'], // Re-added (2026-09-22) โ the 2026-09-16 removal was stale: Mistral Large 3 (675B MoE, GA 2025-12) is back in the official catalog
|
|
214
216
|
// Removed (2026-08-13): devstral-2512 (Devstral 2) โ Mistral deprecation, full retirement 2026-07-31
|
|
215
217
|
// Removed (2026-09-16): mistral-large-3-25-12 (Mistral Large 3) โ no `large` model exists in the live catalog at all
|
|
216
218
|
// Removed (2026-09-16): zai-glm-5-2 (Z.ai GLM 5.2) โ absent from /v1/models; a direct call returns 403 tier_not_allowed (paid tier only), so it never belonged in a free catalog
|
|
217
219
|
// โโ A+ tier โโ
|
|
218
|
-
|
|
220
|
+
// Removed (2026-09-22): magistral-medium-latest (Magistral Medium) โ officially deprecated upstream 2026-05-22, "Use Mistral Medium 3.5"; replacement: mistral-medium-3-5
|
|
219
221
|
// โโ A tier โ SWE-bench Verified 40โ50% โโ
|
|
220
222
|
['mistral-small-2603', 'Mistral Small 4', 'A', '48.0%', '256k'], // Fixed (2026-09-16): mistral-small-4-0-26-03 โ mistral-small-2603 (live /v1/models, ctx 262144)
|
|
221
223
|
// โโ B+ tier โ SWE-bench Verified 30โ35% โโ
|
|
222
224
|
['ministral-14b-2512', 'Ministral 3 14B', 'B+', '-', '256k'], // Fixed (2026-09-16): ministral-3-14b-25-12 โ ministral-14b-2512 (live /v1/models, ctx 262144)
|
|
223
225
|
// โโ B tier โ SWE-bench Verified 20โ30% โโ
|
|
224
226
|
['ministral-8b-2512', 'Ministral 3 8B', 'B', '-', '256k'], // Fixed (2026-09-16): ministral-3-8b-25-12 โ ministral-8b-2512 (live /v1/models, ctx 262144)
|
|
227
|
+
['labs-leanstral-1-5', 'Leanstral 1.5', 'B', '-', '256k'], // Added (2026-09-22) โ free-listed on Mistral LP; targets Lean 4 theorem proving, niche coding use
|
|
225
228
|
['ministral-3b-2512', 'Ministral 3 3B', 'B', '-', '128k'], // Fixed (2026-09-16): ministral-3-3b-25-12 โ ministral-3b-2512; ctx 256k โ 128k (max_context_length 131072)
|
|
226
229
|
// Removed (2026-09-16): mistral-small-creative-25-12 (Mistral Small Creative) โ absent from the live catalog
|
|
230
|
+
// โโ Coding models (codestral-2508 aliases, live-verified 2026-09-22 via api.mistral.ai/v1/models) โโ
|
|
231
|
+
['mistral-code-latest', 'Mistral Code', 'A', '-', '256k'], // Added (2026-09-22): aliases codestral-2508 / codestral-latest; ctx 256000
|
|
232
|
+
['mistral-code-fim-latest', 'Mistral Code FIM', 'A', '-', '256k'], // Added (2026-09-22): FIM alias of codestral-2508; ctx 256000
|
|
227
233
|
]
|
|
228
234
|
|
|
229
235
|
// ๐ Mistral Codestral source - https://codestral.mistral.ai
|
|
@@ -255,6 +261,7 @@ export const scaleway = [
|
|
|
255
261
|
['gemma-4-26b-a4b-it', 'Gemma 4 26B MoE', 'A+', '-', '256k'],
|
|
256
262
|
// Removed (2026-09-02): gemma-4-31b-it (Gemma 4 31B IT) โ Dedicated tier only, not available on Serverless
|
|
257
263
|
['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)
|
|
264
|
+
['qwen3.8-27b', 'Qwen3.8 27B', 'A+', '-', '256k'], // Added (2026-09-22) โ new Serverless model on the official catalog (agentic/coding optimized)
|
|
258
265
|
// โโ A- tier โ SWE-bench Verified 35โ40% โโ
|
|
259
266
|
['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)
|
|
260
267
|
// โโ B+ tier โ SWE-bench Verified 30โ35% โโ
|
|
@@ -282,8 +289,7 @@ export const googleai = [
|
|
|
282
289
|
// Removed (2026-09-21): gemini-3.1-pro-preview re-removed โ the 2026-09-15 re-add resurrected a paid-only model (free tier "Not available" on the official pricing page since ~April 2026); best free alternative: gemini-3.5-flash
|
|
283
290
|
// Removed (2026-09-05): gemini-2.0-flash โ not listed on the official pricing page (PR #178 addition reverted)
|
|
284
291
|
// โ ๏ธ Gemini 2.5 family retires no earlier than 2026-10-16 per Google deprecation policy
|
|
285
|
-
|
|
286
|
-
['gemma-4-26b-a4b-it', 'Gemma 4 26B MoE', 'A', '38.0%', '256k'], // Added (2026-09-21) โ new in the free tier per official docs
|
|
292
|
+
// Removed (2026-09-21): gemma-4-31b-it + gemma-4-26b-a4b-it (Gemma 4 entries) โ Gemma pages are gone from ai.google.dev (404 on /gemini-api/docs/models/gemma), Gemma is no longer served via the Gemini API free tier; the free Gemma route is now NVIDIA NIM
|
|
287
293
|
]
|
|
288
294
|
|
|
289
295
|
// ๐ ZAI source - https://open.z.ai
|
|
@@ -402,7 +408,7 @@ export const ovhcloud = [
|
|
|
402
408
|
['Qwen3.5-397B-A17B', 'Qwen3.5 397B MoE', 'S+', '76.2%', '262k'],
|
|
403
409
|
['Qwen3.6-27B', 'Qwen3.6 27B', 'S+', '77.2%', '262k'],
|
|
404
410
|
// Removed (2026-07-27): Qwen3-Coder-30B-A3B-Instruct (Qwen3 Coder 30B MoE) โ no longer in catalog
|
|
405
|
-
|
|
411
|
+
// Removed (2026-09-21): Qwen3-Coder-30B-A3B-Instruct (Qwen3 Coder 30B A3B) โ absent from the official AI Endpoints catalog page (20 models, no coder model); the 2026-09-21 morning re-add was erroneous
|
|
406
412
|
['gpt-oss-120b', 'GPT OSS 120B', 'S', '62.4%', '131k'],
|
|
407
413
|
['gpt-oss-20b', 'GPT OSS 20B', 'A+', '50.3%', '131k'],
|
|
408
414
|
['Meta-Llama-3_3-70B-Instruct', 'Llama 3.3 70B', 'B', '22.0%', '131k'],
|
|
@@ -410,9 +416,7 @@ export const ovhcloud = [
|
|
|
410
416
|
// Removed (2026-08-13): Mistral-Small-3.2-24B-Instruct-2506 (Mistral Small 3.2) โ no longer in OVHcloud public catalog (endpoint still reachable but not listed)
|
|
411
417
|
// Removed (2026-07-27): Mistral-7B-Instruct-v0.3 (Mistral 7B Instruct) โ no longer in catalog
|
|
412
418
|
// Removed (2026-08-13): Mistral-Nemo-Instruct-2407 (Mistral Nemo) โ no longer in OVHcloud public catalog
|
|
413
|
-
|
|
414
|
-
['Mistral-Nemo-Instruct-2407', 'Mistral Nemo 12B', 'B', '-', '65k'], // Re-added (2026-09-21) โ back in the official catalog
|
|
415
|
-
['Mistral-7B-Instruct-v0.3', 'Mistral 7B v0.3', 'C', '-', '65k'], // Re-added (2026-09-21) โ back in the official catalog
|
|
419
|
+
// Removed (2026-09-21): Mistral-Small-3.2-24B-Instruct-2506 + Mistral-Nemo-Instruct-2407 + Mistral-7B-Instruct-v0.3 re-removed โ none of the three Mistral models appear on the official AI Endpoints catalog page; the 2026-09-21 morning re-adds were erroneous
|
|
416
420
|
['Qwen3.5-9B', 'Qwen3.5 9B', 'B+', '30.0%', '262k'],
|
|
417
421
|
['Qwen2.5-VL-72B-Instruct', 'Qwen2.5-VL 72B', 'S', '-', '32k'], // Added (2026-08-13)
|
|
418
422
|
// โโ Embeddings โโ
|
|
@@ -437,6 +441,7 @@ export const opencodeZen = [
|
|
|
437
441
|
// Removed (2026-09-05): deepseek-v4-flash-free (DeepSeek V4 Flash Free) - deprecated: marked status=deprecated in the models.dev registry (2026-09-05) and dropped from the docs free-models pricing table; free promo ended
|
|
438
442
|
['deepseek-v4-flash-free', 'DeepSeek V4 Flash Free', 'S+', '79.0%', '200k'], // Re-added (2026-09-21) โ free again per the live Zen /v1/models list and models.dev ($0 pricing); still absent from the docs pricing table so re-verify at next audit
|
|
439
443
|
['mimo-v2.5-free', 'MiMo-V2.5 Free', 'S+', '-', '200k'],
|
|
444
|
+
['mimo-v2.6-flash-free', 'MiMo-V2.6 Flash Free', 'S+', '-', '200k'], // Added (2026-09-22) โ new free promo model on the live Zen /v1/models list
|
|
440
445
|
['nemotron-3-ultra-free', 'Nemotron 3 Ultra Free', 'S+', '71.9%', '1M'],
|
|
441
446
|
// Removed (2026-09-05): hy3-free (Tencent Hy3 Free) โ absent from live /v1/models (66 models checked)
|
|
442
447
|
['nemotron-3.5-lightning-free', 'Nemotron 3.5 Lightning Free', 'S+', '-', '262k'], // Added (2026-08-13)
|
|
@@ -444,6 +449,7 @@ export const opencodeZen = [
|
|
|
444
449
|
['ling-3.0-flash-fin-free', 'Ling 3.0 Flash Fin Free', 'B+', '-', '262k'], // Added (2026-09-05) โ new id in live /v1/models (was ling-3.0-flash-free)
|
|
445
450
|
['muse-spark-1.2-contributor-free', 'Muse Spark 1.2 Contributor Free', 'A+', '-', '1M'],
|
|
446
451
|
['muse-spark-1.3-contributor-free', 'Muse Spark 1.3 Contributor Free', 'S+', '-', '1M'],
|
|
452
|
+
['jev-1.13-free', 'Jev 1.13 Free', 'B+', '-', '200k'], // Added (2026-09-21) โ new free model on the live Zen /v1/models list (74 models checked)
|
|
447
453
|
]
|
|
448
454
|
|
|
449
455
|
// ๐ Kilo source - https://api.kilo.ai/api/gateway
|
|
@@ -474,6 +480,7 @@ export const kilo = [
|
|
|
474
480
|
['nex-agi/nex-n2.5-pro:free', 'Nex AGI Nex-N2.5-Pro (free)', 'A', '-', '262k'], // Added (2026-09-15) โ verified via live audit
|
|
475
481
|
['nvidia/nemotron-3-nano-omni-30b-a3b-reasoning:free', 'NVIDIA Nemotron 3 Nano Omni (free)', 'A+', '-', '262k'], // Added (2026-09-21) โ new in the live free gateway list
|
|
476
482
|
['qwen/qwen3.8-27b:free', 'Qwen3.8 27B (free)', 'S', '-', '262k'], // Added (2026-09-21) โ new in the live free gateway list
|
|
483
|
+
['nvidia/nemotron-3.5-content-safety:free', 'NVIDIA Nemotron 3.5 Content Safety (free)', 'C', '-', '128k'], // Added (2026-09-22) โ content-safety classifier, marginal but kept for breadth (matches OpenRouter/Requesty)
|
|
477
484
|
]
|
|
478
485
|
|
|
479
486
|
// ๐ LLM7 source - https://api.llm7.io/v1
|
|
@@ -532,10 +539,10 @@ export const novita = [
|
|
|
532
539
|
// Removed (2026-07-27): qwen/qwen3.5-plus (Qwen3.5 Plus) โ no longer in novita catalog
|
|
533
540
|
['inclusionai/ling-3.0-flash-fin', 'Ling 3.0 Flash Fin', 'B+', '-', '256k'],
|
|
534
541
|
['inclusionai/ling-3.0-flash-sante', 'Ling 3.0 Flash Sante', 'B+', '-', '256k'],
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
542
|
+
// Removed (2026-09-22): bunny (Bunny (free tier)) โ no longer on the Novita pricing/catalog page, only paid variants remain
|
|
543
|
+
// Removed (2026-09-22): qwen/qwen3.6-plus (Qwen 3.6 Plus (free tier)) โ no longer in the Novita catalog, only paid Qwen3.6 variants remain
|
|
544
|
+
// Removed (2026-09-22): qwen/qwen3.5-plus (Qwen 3.5 Plus (free tier)) โ no longer in the Novita catalog, Qwen3.5 now paid-only size variants
|
|
545
|
+
// Removed (2026-09-22): dev/glm46 (GLM 4.6 (dev, free)) โ GLM 4.6 is now paid ($0.55/$2.20 per M), no free GLM tier left; cheapest GLM: glm-5.3-flash (paid)
|
|
539
546
|
['inclusionai/ling-3.0-flash-vl', 'Ling 3.0 Flash VL', 'B+', '-', '256k'], // Added (2026-09-15) โ verified via live audit
|
|
540
547
|
]
|
|
541
548
|
|
|
@@ -546,30 +553,41 @@ export const novita = [
|
|
|
546
553
|
// ๐ anonymous path only reaches the default model via GET /text. Daily Pollen grants per tier renew free.
|
|
547
554
|
// ๐ Verified live 2026-09-21 via GET /v1/models (411 models): the old short ids (openai, deepseek, kimi,
|
|
548
555
|
// ๐ laguna...) are no longer primary ids but still resolve as aliases of the canonical namespaced models.
|
|
556
|
+
// ๐ Note (2026-09-21): the anonymous tier (text.pollinations.ai/models) now lists ONLY openai-fast;
|
|
557
|
+
// ๐ the models below need the free API key + Pollen credits (gen.pollinations.ai). Re-check the Pollen
|
|
558
|
+
// ๐ free-grant policy at next audit: if grants stop covering these models, this list must shrink to openai-fast.
|
|
559
|
+
// ๐ Note (2026-09-26, issue #190): a subset of models now requires PAID Pollen even with a free key โ they
|
|
560
|
+
// ๐ return HTTP 200 with the error embedded in the completion content ("not enough credits / needs paid
|
|
561
|
+
// ๐ Pollen"), so status-code-only probes see them as healthy. 6 such models were removed; when auditing
|
|
562
|
+
// ๐ Pollinations, sniff the completion content for that message, not just the HTTP status.
|
|
549
563
|
export const pollinations = [
|
|
550
564
|
// โโ S+ tier โ SWE-bench Verified โฅ70% โโ
|
|
551
565
|
['laguna', 'Laguna S 2.1', 'S+', '-', '1M'], // Fixed (2026-09-21): alias now resolves to poolside/laguna-s-2.1 (Laguna S 2.1), was Laguna XS.2; score cleared (S 2.1 has no published SWE-bench Verified)
|
|
552
|
-
|
|
566
|
+
// Removed (2026-09-26): minimax-m2.7 (MiniMax M2.7) โ now requires paid Pollen: HTTP 200 with an embedded "not enough credits, this model needs paid Pollen" error on free-tier keys (issue #190); replacement: minimax (MiniMax M3, still free via Pollen grants)
|
|
553
567
|
['glm-5.3', 'Z.ai GLM-5.3', 'S+', '-', '1M'],
|
|
554
568
|
['kimi', 'Moonshot Kimi K2.6', 'S+', '80.2%', '262k'],
|
|
555
569
|
['minimax', 'MiniMax M3', 'S+', '80.5%', '524k'],
|
|
556
570
|
['moonshotai/kimi-k3', 'Moonshot Kimi K3', 'S+', '76.8%', '1M'], // Added (2026-09-21) โ canonical id, healthy on live /v1/models; score follows the Kimi K3 entry on NVIDIA
|
|
557
571
|
['deepseek/deepseek-v4-pro', 'DeepSeek V4 Pro', 'S+', '-', '1M'], // Added (2026-09-21) โ canonical id, healthy on live /v1/models
|
|
558
|
-
|
|
559
|
-
|
|
572
|
+
// Removed (2026-09-26): qwen/qwen3.8-max (Qwen3.8 Max) โ requires paid Pollen (embedded credits error on free-tier keys, issue #190); still free on DashScope
|
|
573
|
+
// Removed (2026-09-26): google/gemini-3.1-pro-preview (Gemini 3.1 Pro Preview) โ requires paid Pollen (embedded credits error on free-tier keys, issue #190); no free Gemini Pro tier anywhere
|
|
560
574
|
['openai/gpt-5.5', 'OpenAI GPT-5.5', 'S+', '-', '1M'], // Added (2026-09-21) โ canonical id, healthy on live /v1/models
|
|
561
575
|
['openai/gpt-6-astra', 'OpenAI GPT-6 Astra', 'S+', '-', '1M'], // Added (2026-09-21) โ canonical id, healthy on live /v1/models
|
|
562
576
|
['z-ai/glm-5.3-flash', 'Z.ai GLM-5.3 Flash', 'S+', '-', '1M'], // Added (2026-09-21) โ canonical id, healthy on live /v1/models
|
|
563
|
-
|
|
577
|
+
// Removed (2026-09-26): nvidia/nemotron-3-ultra (NVIDIA Nemotron 3 Ultra) โ requires paid Pollen (embedded credits error on free-tier keys, issue #190); still free on NVIDIA NIM
|
|
578
|
+
['anthropic/claude-opus-5', 'Claude Opus 5', 'S+', '-', '1M'], // Added (2026-09-22) โ healthy on live /v1/models, free via Pollen credits
|
|
564
579
|
// โโ S tier โ SWE-bench Verified 60โ70% โโ
|
|
580
|
+
['anthropic/claude-sonnet-5', 'Claude Sonnet 5', 'S', '-', '1M'], // Added (2026-09-22) โ healthy on live /v1/models, free via Pollen credits
|
|
565
581
|
['qwen-coder', 'Qwen3 Coder 30B', 'A+', '51.6%', '262k'], // Fixed (2026-09-21): alias now resolves to qwen/qwen3-coder-30b-a3b-instruct; re-scored from the 480B figure to the 30B SWE-bench Verified
|
|
566
582
|
['deepseek', 'DeepSeek V4 Flash', 'S+', '79.0%', '1M'], // Fixed (2026-09-21): alias now resolves to deepseek/deepseek-v4-flash (V4 Flash 0731), was V3; re-scored per the V4 Flash family entry
|
|
567
583
|
['kimi-code', 'Kimi K2.7 Code', 'S', '60.4%', '262k'], // Fixed (2026-09-21): alias now resolves to moonshotai/kimi-k2.7-code, was K2 Code
|
|
568
584
|
['openai', 'OpenAI GPT-5.4 Nano', 'B+', '-', '400k'], // Fixed (2026-09-21): alias now resolves to openai/gpt-5.4-nano (was a generic GPT alias); re-tiered to the nano class
|
|
569
|
-
|
|
585
|
+
// Removed (2026-09-26): qwen/qwen3-coder-next (Qwen3 Coder Next) โ requires paid Pollen (embedded credits error on free-tier keys, issue #190); still free on DashScope
|
|
570
586
|
['openai/gpt-5.6-luna', 'OpenAI GPT-5.6 Luna', 'S', '-', '1M'], // Added (2026-09-21) โ canonical id, healthy on live /v1/models
|
|
571
587
|
// โโ A+ tier โ SWE-bench Verified 50โ60% โโ
|
|
572
|
-
['
|
|
588
|
+
['deepseek/deepseek-v4.1-flash', 'DeepSeek V4.1 Flash', 'A+', '-', '1M'], // Added (2026-09-22) โ healthy on live /v1/models, successor to V4 Flash
|
|
589
|
+
['meituan/longcat-2.0', 'LongCat 2.0', 'A', '-', '1M'], // Added (2026-09-22) โ healthy on live /v1/models, new MoE agentic/coding model on the network
|
|
590
|
+
// Removed (2026-09-26): gemma-4-31b (Gemma 4 31B) โ requires paid Pollen (embedded credits error on free-tier keys, issue #190); the free Gemma route is NVIDIA NIM
|
|
573
591
|
['gpt-oss', 'GPT OSS 20B', 'A+', '50.3%', '131k'],
|
|
574
592
|
['qwen3.7-flash', 'Qwen3.7 Flash', 'A+', '-', '1M'],
|
|
575
593
|
// โโ B+ tier โโ
|
|
@@ -584,15 +602,14 @@ export const pollinations = [
|
|
|
584
602
|
// ๐ and still reachable with free-tier rate limits (1000 RPM). Keep only the chat text models here.
|
|
585
603
|
export const siliconflow = [
|
|
586
604
|
// โโ A tier โ SWE-bench Verified 40โ50% โโ
|
|
587
|
-
|
|
588
|
-
|
|
605
|
+
// Removed (2026-09-21): THUDM/GLM-Z1-9B-0414 + THUDM/GLM-4-9B-0414 โ deprecated 2026-03-12 per official release notes, service terminated
|
|
606
|
+
// Removed (2026-09-22): deepseek-ai/DeepSeek-R1-0528-Qwen3-8B (DeepSeek R1 0528 Qwen3 8B) โ no longer on the official pricing page free list, deepseek-ai catalog is paid-only now
|
|
589
607
|
// โโ B+ tier โโ
|
|
590
|
-
|
|
608
|
+
// Removed (2026-09-21): Qwen/Qwen3-8B ($0.06/M) + Qwen/Qwen2.5-7B-Instruct ($0.05/M) โ no longer free, both now paid on the official model pages; replacement: Qwen/Qwen3.5-4B
|
|
591
609
|
// Removed (2026-09-05): deepseek-ai/DeepSeek-R1-Distill-Qwen-7B (DeepSeek R1 Distill Qwen 7B) - No longer listed on SiliconFlow pricing/catalog page (0 of 184 model records); superseded by the newer R1-0528 Qwen3 distill
|
|
592
|
-
|
|
593
|
-
['THUDM/GLM-4-9B-0414', 'GLM-4 9B', 'B+', '-', '32k'],
|
|
594
|
-
['Qwen/Qwen2.5-7B-Instruct', 'Qwen2.5 7B Instruct', 'B', '-', '32k'],
|
|
610
|
+
// Removed (2026-09-22): Qwen/Qwen3.5-4B (Qwen3.5 4B) โ absent from the official pricing page free list, remaining Qwen3.5 sizes are all paid
|
|
595
611
|
['XingChenAGI/Xing4.0-29B', 'Xing4.0 29B', 'A-', '-', '262k'], // Added (2026-09-21) โ new $0 model on the official pricing page (181 records checked); engineering/coding focused
|
|
612
|
+
['tencent/Hunyuan-MT-7B', 'Hunyuan MT 7B', 'C', '-', '33k'], // Added (2026-09-22) โ new $0 model on the official pricing page (translation-tuned, kept for breadth)
|
|
596
613
|
// Removed (2026-09-21): Qwen/Qwen2.5-Coder-7B-Instruct (Qwen2.5 Coder 7B Instruct) โ taken offline by SiliconFlow (official release note 2026-03-10, effective 2026-03-17; 0 of 181 records on today's pricing page); the 2026-09-15 re-add was erroneous. Replacement: Qwen/Qwen3-8B
|
|
597
614
|
]
|
|
598
615
|
|
|
@@ -626,9 +643,9 @@ export const requesty = [
|
|
|
626
643
|
// ๐ OpenAI-compatible gateway: https://api.orcarouter.ai/v1/chat/completions
|
|
627
644
|
// ๐ Zero-markup AI gateway: token prices are passed through at provider rates, so only
|
|
628
645
|
// ๐ the explicitly $-0 models are listed here. Verified live 2026-09-21 via GET /v1/models.
|
|
629
|
-
// ๐ orcarouter/free reports $0 pricing and stays listed. The orcarouter/fusion family
|
|
630
|
-
// ๐ reports $0
|
|
631
|
-
// ๐
|
|
646
|
+
// ๐ orcarouter/free reports $0 pricing and stays listed. The orcarouter/fusion family now
|
|
647
|
+
// ๐ reports $0 with context lengths (verified live 2026-09-22, 197 models checked), so the
|
|
648
|
+
// ๐ adaptive-routing trio is listed; lineage is still undocumented, re-verify next audit.
|
|
632
649
|
export const orcarouter = [
|
|
633
650
|
// โโ S+ tier โ SWE-bench Verified โฅ70% โโ
|
|
634
651
|
['deepseek/deepseek-v4-flash-free', 'DeepSeek V4 Flash (Free)', 'S+', '79.0%', '1M'],
|
|
@@ -638,6 +655,10 @@ export const orcarouter = [
|
|
|
638
655
|
// โโ A+ tier โ SWE-bench Verified 50โ60% โโ
|
|
639
656
|
// Removed (2026-09-15): qwen/qwen3.8-27b-free (Qwen3.8 27B (Free)) โ no longer in catalog; only paid variant remains; replacement: z-ai/glm-5.3-flash-free
|
|
640
657
|
['z-ai/glm-5.3-flash-free', 'GLM-5.3 Flash (Free)', 'A+', '-', '1M'], // Added (2026-09-15) โ verified via live audit
|
|
658
|
+
// โโ A tier โ SWE-bench Verified 40โ50% โโ
|
|
659
|
+
['orcarouter/fusion-mini', 'OrcaRouter Fusion Mini', 'A+', '-', '1M'], // Added (2026-09-22) โ $0 per live /v1/models, adaptive-routed (undocumented lineage)
|
|
660
|
+
['orcarouter/fusion', 'OrcaRouter Fusion', 'S', '-', '1M'], // Added (2026-09-22) โ $0 per live /v1/models, adaptive-routed (undocumented lineage)
|
|
661
|
+
['orcarouter/fusion-flash', 'OrcaRouter Fusion Flash', 'B+', '-', '256k'], // Added (2026-09-22) โ $0 per live /v1/models, adaptive-routed (undocumented lineage)
|
|
641
662
|
]
|
|
642
663
|
|
|
643
664
|
// ๐ Vercel AI Gateway source - https://vercel.com/docs/ai-gateway
|
|
@@ -692,6 +713,35 @@ export const ollamaCloud = [
|
|
|
692
713
|
['nemotron-3-nano:30b', 'Nemotron 3 Nano 30B', 'A-', '38.8%', '1M'],
|
|
693
714
|
]
|
|
694
715
|
|
|
716
|
+
// ๐ onomeo source - https://onomeo.com/docs
|
|
717
|
+
// ๐ OpenAI-compatible gateway: https://onomeo.com/v1/chat/completions (streaming + tool calls)
|
|
718
|
+
// ๐ Public beta: not every feature is guaranteed to work; feedback is welcome at https://onomeo.com/feedback.
|
|
719
|
+
// ๐ Free credits come from a daily check-in, no card: 50,000 on day 1, rising to 200,000/day from
|
|
720
|
+
// ๐ day 7 of a streak (a missed day resets it). Every call spends credits and the cost per reply
|
|
721
|
+
// ๐ varies by model (https://onomeo.com/models), so this is a small allowance.
|
|
722
|
+
// ๐ Premium models are not listed; each account that has not paid can spend up to 50,000 credits/day on them.
|
|
723
|
+
// ๐ Optional: $5 one-time buys 1,000,000 credits. Limits: 12 req/min per key, 60 req per 5 hours
|
|
724
|
+
// ๐ per account, 120 per 5 hours per IP, and a site-wide pool of 450 per 5 hours for accounts
|
|
725
|
+
// ๐ that have not bought credits.
|
|
726
|
+
// ๐ Some upstreams may train on prompts; each model page (https://onomeo.com/models/<id>) says which.
|
|
727
|
+
// ๐ Ids and ctx checked 2026-09-26 against the public https://onomeo.com/api/info
|
|
728
|
+
// ๐ (`models`, `modelFacts`); /v1/models needs a key.
|
|
729
|
+
export const onomeo = [
|
|
730
|
+
// โโ S+ tier โ SWE-bench Verified โฅ70% โโ
|
|
731
|
+
['deepseek-v4-flash', 'DeepSeek V4 Flash', 'S+', '79.0%', '1M'],
|
|
732
|
+
['glm-5.2', 'GLM 5.2', 'S+', '82.8%', '1M'],
|
|
733
|
+
// โโ S tier โ SWE-bench Verified 60โ70% โโ
|
|
734
|
+
['gemini-3.1-flash-lite', 'Gemini 3.1 Flash Lite', 'S', '62.8%', '1M'],
|
|
735
|
+
['@cf/openai/gpt-oss-120b', 'GPT OSS 120B', 'S', '62.4%', '128k'],
|
|
736
|
+
['nvidia/nemotron-3-super-120b-a12b', 'Nemotron 3 Super', 'S', '60.5%', '262k'],
|
|
737
|
+
// โโ A+ tier โ SWE-bench Verified 50โ60% โโ
|
|
738
|
+
['openai/gpt-oss-20b', 'GPT OSS 20B', 'A+', '50.3%', '128k'],
|
|
739
|
+
['z-ai/glm-5.3-flash-free', 'GLM-5.3 Flash', 'A+', '-', '1M'],
|
|
740
|
+
['stepfun/step-3.7-flash:free', 'Step 3.7 Flash', 'A+', '-', '256k'],
|
|
741
|
+
// โโ A tier โ SWE-bench Verified 40โ50% โโ
|
|
742
|
+
['codestral-latest', 'Codestral Latest', 'A', '40.0%', '256k'],
|
|
743
|
+
]
|
|
744
|
+
|
|
695
745
|
// ๐ All sources combined - used by the main script
|
|
696
746
|
// ๐ Each source has: name (display), url (API endpoint), models (array of model tuples)
|
|
697
747
|
// ๐ Providers ordered by generosity of free tier (most generous first)
|
|
@@ -884,6 +934,13 @@ export const sources = {
|
|
|
884
934
|
quotaCode: 'free',
|
|
885
935
|
models: ollamaCloud,
|
|
886
936
|
},
|
|
937
|
+
onomeo: {
|
|
938
|
+
name: 'onomeo',
|
|
939
|
+
url: 'https://onomeo.com/v1/chat/completions',
|
|
940
|
+
quota: 'Daily check-in credits ยท 12 RPM ยท 60 req/5h',
|
|
941
|
+
quotaCode: 'limited',
|
|
942
|
+
models: onomeo,
|
|
943
|
+
},
|
|
887
944
|
}
|
|
888
945
|
|
|
889
946
|
// ๐ Flatten all models from all sources โ each entry includes providerKey as 6th element
|
package/src/core/config.js
CHANGED
|
@@ -105,6 +105,7 @@ import { readFileSync, writeFileSync, existsSync, mkdirSync, readdirSync, statSy
|
|
|
105
105
|
import { homedir } from 'node:os'
|
|
106
106
|
import { join, resolve, dirname } from 'node:path'
|
|
107
107
|
import { syncShellEnv } from './shell-env.js'
|
|
108
|
+
import { DEFAULT_LOCALE, normalizeLocale } from './i18n/index.js'
|
|
108
109
|
|
|
109
110
|
// ๐ Expand leading ~/ or bare ~ to homedir so --config-dir ~/.config/... works.
|
|
110
111
|
// ๐ resolve() alone does NOT expand tilde, it would treat ~ as a literal folder.
|
|
@@ -188,6 +189,7 @@ const ENV_VARS = {
|
|
|
188
189
|
requesty: 'REQUESTY_API_KEY',
|
|
189
190
|
orcarouter: 'ORCAROUTER_API_KEY',
|
|
190
191
|
'vercel-gateway': ['VERCEL_AI_GATEWAY_API_KEY', 'AI_GATEWAY_API_KEY'],
|
|
192
|
+
onomeo: 'ONOMEO_API_KEY',
|
|
191
193
|
}
|
|
192
194
|
|
|
193
195
|
// ๐ Smart Router defaults are intentionally conservative: balanced probing,
|
|
@@ -331,6 +333,7 @@ function normalizeSettingsSection(settings) {
|
|
|
331
333
|
delete safeSettings.footerHidden
|
|
332
334
|
return {
|
|
333
335
|
...safeSettings,
|
|
336
|
+
language: normalizeLocale(safeSettings.language),
|
|
334
337
|
hideUnconfiguredModels: typeof safeSettings.hideUnconfiguredModels === 'boolean' ? safeSettings.hideUnconfiguredModels : true,
|
|
335
338
|
favoritesPinnedAndSticky: typeof safeSettings.favoritesPinnedAndSticky === 'boolean' ? safeSettings.favoritesPinnedAndSticky : false,
|
|
336
339
|
runAiSpeedTestOnStartup: typeof safeSettings.runAiSpeedTestOnStartup === 'boolean' ? safeSettings.runAiSpeedTestOnStartup : false,
|
|
@@ -456,10 +459,22 @@ function normalizeRouterFailover(failover, routerFallback = {}) {
|
|
|
456
459
|
const rawStreamStall = numberOrNull(safeFailover.streamStallTimeoutMs) ?? numberOrNull(routerFallback.streamStallTimeoutMs)
|
|
457
460
|
const rawRequestTimeout = numberOrNull(safeFailover.requestTimeoutMs) ?? numberOrNull(routerFallback.requestTimeoutMs)
|
|
458
461
|
|
|
462
|
+
// ๐ router-v2 documented failover fields (lastResortModel,
|
|
463
|
+
// bodyReadTimeoutMs, totalBudgetMs, contentValidation โ docs/router-v2.md)
|
|
464
|
+
// are read by the daemon at runtime but are not v1 knobs normalized here.
|
|
465
|
+
// Carry any unknown keys through so they survive load()/save() round-trips
|
|
466
|
+
// instead of being silently dropped from the on-disk config.
|
|
467
|
+
const v1FailoverKeys = new Set(['maxRetries', 'streamStallTimeoutMs', 'requestTimeoutMs'])
|
|
468
|
+
const extras = {}
|
|
469
|
+
for (const key of Object.keys(safeFailover)) {
|
|
470
|
+
if (!v1FailoverKeys.has(key)) extras[key] = safeFailover[key]
|
|
471
|
+
}
|
|
472
|
+
|
|
459
473
|
return {
|
|
460
474
|
maxRetries: normalizePositiveInteger(rawMaxRetries, DEFAULT_ROUTER_SETTINGS.failover.maxRetries, { min: 1, max: 20 }),
|
|
461
475
|
streamStallTimeoutMs: normalizePositiveInteger(rawStreamStall, DEFAULT_ROUTER_SETTINGS.failover.streamStallTimeoutMs, { min: 1000, max: 120000 }),
|
|
462
476
|
requestTimeoutMs: normalizePositiveInteger(rawRequestTimeout, DEFAULT_ROUTER_SETTINGS.failover.requestTimeoutMs, { min: 1000, max: 300000 }),
|
|
477
|
+
...extras,
|
|
463
478
|
}
|
|
464
479
|
}
|
|
465
480
|
|
|
@@ -1295,6 +1310,7 @@ export function isProviderEnabled(config, providerKey) {
|
|
|
1295
1310
|
*/
|
|
1296
1311
|
export function _emptyProfileSettings() {
|
|
1297
1312
|
return {
|
|
1313
|
+
language: DEFAULT_LOCALE,
|
|
1298
1314
|
tierFilter: null, // ๐ null = show all tiers, or 'S'|'A'|'B'|'C'|'D'
|
|
1299
1315
|
sortColumn: 'avg', // ๐ default sort column
|
|
1300
1316
|
sortAsc: true, // ๐ true = ascending (fastest first for latency)
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import en from './locales/en.js'
|
|
2
|
+
import zhCN from './locales/zh-CN.js'
|
|
3
|
+
|
|
4
|
+
export const DEFAULT_LOCALE = 'en'
|
|
5
|
+
export const SUPPORTED_LOCALES = Object.freeze(['en', 'zh-CN'])
|
|
6
|
+
export const LOCALE_OPTIONS = Object.freeze([
|
|
7
|
+
Object.freeze({ value: 'en', labelKey: 'common.language.english' }),
|
|
8
|
+
Object.freeze({ value: 'zh-CN', labelKey: 'common.language.simplifiedChinese' }),
|
|
9
|
+
])
|
|
10
|
+
|
|
11
|
+
const dictionaries = Object.freeze({ en, 'zh-CN': zhCN })
|
|
12
|
+
let activeLocale = DEFAULT_LOCALE
|
|
13
|
+
|
|
14
|
+
export function normalizeLocale(locale) {
|
|
15
|
+
return SUPPORTED_LOCALES.includes(locale) ? locale : DEFAULT_LOCALE
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export function getLocale() {
|
|
19
|
+
return activeLocale
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export function setLocale(locale) {
|
|
23
|
+
activeLocale = normalizeLocale(locale)
|
|
24
|
+
return activeLocale
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export function createTranslator(resources = dictionaries) {
|
|
28
|
+
return (locale, key, values = {}) => {
|
|
29
|
+
if (typeof key !== 'string') return ''
|
|
30
|
+
const active = normalizeLocale(locale)
|
|
31
|
+
const localized = resources[active]?.[key]
|
|
32
|
+
const fallback = resources[DEFAULT_LOCALE]?.[key]
|
|
33
|
+
const template = typeof localized === 'string' ? localized : typeof fallback === 'string' ? fallback : key
|
|
34
|
+
return template.replace(/\{([\w.]+)\}/g, (match, name) => {
|
|
35
|
+
const value = values && Object.prototype.hasOwnProperty.call(values, name) ? values[name] : undefined
|
|
36
|
+
return value === null || value === undefined ? match : String(value)
|
|
37
|
+
})
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
const translate = createTranslator()
|
|
42
|
+
|
|
43
|
+
export function t(key, values = {}) {
|
|
44
|
+
return translate(activeLocale, key, values)
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
export function hasTranslation(locale, key) {
|
|
48
|
+
return typeof dictionaries[normalizeLocale(locale)]?.[key] === 'string'
|
|
49
|
+
}
|