fix(free-tiers): retire 4 re-verified-dead free tiers, flag iflytek/sparkdesk ToS, clarify monsterapi one-time (#4152)

Case-by-case follow-up on the 2026-06-17 refresh deferred items. Each dead tier was
re-verified against its official source on 2026-06-18 before flipping (qwen-web lesson):

- aimlapi -> hasFree:false. docs.aimlapi.com/faq/free-tier states "The Free Tier is
  currently paused"; now pay-as-you-go (min $20 top-up).
- gitlawb + gitlawb-gmi -> hasFree:false. Free MiMo revoked 2026-05-24 (GitHub
  Gitlawb/openclaude#1345 "OPENGATEWAY REVOKED THE ONLY 1 FREE MODEL"); Nemotron promo
  ended 2026-06; Opengateway is now a pay-as-you-go credit gateway. Removed 40 stale
  gitlawb-gmi catalog records.
- yi -> hasFree:false. Yi-Light retired; platform.01.ai is pay-as-you-go (Yi-Lightning
  paid); open weights are download-only. Removed 1 stale catalog record.
- iflytek / sparkdesk -> kept hasFree:true with a ToS-caution freeNote: Spark Lite is
  free but the ToS prohibits programmatic extraction / relay to third parties (iflytek
  also requires Chinese real-name auth).
- monsterapi -> freeNote tightened to "one-time signup trial" (recurring plan = 0
  credits/mo); the budget catalog already classified it one-time-initial.

The dead providers stay registered (paid use still works); only the free-tier
advertisement is removed. FREE_TIERS.md "Removed" note + budget table reconciled.

Tests: gitlawb-provider guard updated (hasFree now false for both gitlawb variants);
discontinued-providers-2026 extended to cover the 4 new flips + an iflytek ToS-caution
assertion. Re-verified live 2026-06-18 (Hard Rule #18).
This commit is contained in:
Diego Rodrigues de Sa e Souza
2026-06-18 03:46:52 -03:00
committed by GitHub
parent 3cdaedc896
commit c82462d4ef
5 changed files with 31 additions and 69 deletions

View File

@@ -35,7 +35,7 @@ Biggest **documented** contributors: `mistral` 1.00B, `llm7` 150M, `longcat` 150
A 50-agent web-research pass (official docs + last-7-days news, adversarially verified) refreshed the whole catalog. Highlights:
- **Removed (discontinued / shut down in 2026):** `chutes` (free tier ended 2026-03), `phind` (company shut down 2026-01), `kluster` (sunset 2026-06-09 → MITO), `glhf` (beta ended), `gitlawb` (free model revoked 2026-05-24), `aimlapi` / `theoldllm` / `featherless-ai` (no current free tier).
- **Removed / no free tier (2026):** `chutes` (free tier ended 2026-03), `phind` (company shut down 2026-01), `kluster` (sunset 2026-06-09 → MITO), `glhf` (beta ended), `gitlawb` + `gitlawb-gmi` (MiMo free revoked 2026-05-24, Nemotron promo ended 2026-06 — re-verified 2026-06-18), `aimlapi` (free tier paused — re-verified 2026-06-18), `yi` (Yi-Light retired, pay-as-you-go — re-verified 2026-06-18), `theoldllm` / `featherless-ai` (no current free tier). `iflytek` / `sparkdesk` stay listed but carry a ToS-caution note (Spark Lite is free; the ToS restricts proxy/relay use).
- **GitHub Models** — closed to **new** customers on 2026-06-16; existing accounts keep API/playground access, so it stays in the catalog with a note (not removed).
- **Gemini** — `2.0 Flash` / `2.0 Flash-Lite` shut down 2026-06-01 and `2.5 Pro` left the free tier (2026-04); free tier is now **Flash-family only** (2.5/3/3.1/3.5 Flash + Gemma). The catalog now **pools** the Flash family (was inflated by counting each variant separately: 462M → 60M).
- **Corrected numbers:** `cloudflare-ai` 122M → **30M** (real 10k-Neurons/day), `doubao` reclassified as a one-time signup credit (not recurring), `llm7` 4M → **150M** (documented 5M tokens/day), `together` "-Free" endpoints discontinued → only the **$25** signup credit remains, `longcat` retired 6 legacy models → **LongCat-2.0-Preview** only.
@@ -230,7 +230,6 @@ A 50-agent web-research pass (official docs + last-7-days news, adversarially ve
| `freemodel-dev` | keyless | — | — | unknown | 4 |
| `friendliai` | keyless | — | — | avoid | 2 |
| `gemini-cli` | keyless | — | — | avoid | 9 |
| `gitlawb-gmi` | keyless | — | — | ambiguous | 40 |
| `hackclub` | keyless | — | — | caution | 3 |
| `iflytek` | keyless | — | — | avoid | 1 |
| `inference-net` | keyless | — | — | caution | 3 |
@@ -251,7 +250,6 @@ A 50-agent web-research pass (official docs + last-7-days news, adversarially ve
| `stepfun` | keyless | — | — | ok | 1 |
| `t3-web` | keyless | — | — | avoid | 23 |
| `uncloseai` | keyless | — | — | caution | 3 |
| `yi` | keyless | — | — | unknown | 1 |
---

View File

@@ -193,46 +193,6 @@ export const FREE_MODEL_BUDGETS: FreeModelBudget[] = [
{ provider: "github-models", modelId: "microsoft/Phi-4", displayName: "Phi-4 (Free)", monthlyTokens: 18000000, creditTokens: 0, freeType: "recurring-daily", poolKey: "github-models", tos: "caution" },
{ provider: "github-models", modelId: "openai/text-embedding-3-large", displayName: "Text Embedding 3 Large (Free)", monthlyTokens: 18000000, creditTokens: 0, freeType: "recurring-daily", poolKey: "github-models", tos: "caution" },
{ provider: "github-models", modelId: "openai/text-embedding-3-small", displayName: "Text Embedding 3 Small (Free)", monthlyTokens: 18000000, creditTokens: 0, freeType: "recurring-daily", poolKey: "github-models", tos: "caution" },
{ provider: "gitlawb-gmi", modelId: "XiaomiMiMo/MiMo-V2.5-Pro", displayName: "MiMo-V2.5-Pro (GMI)", monthlyTokens: 0, creditTokens: 0, freeType: "keyless", poolKey: "gitlawb-gmi", tos: "ambiguous" },
{ provider: "gitlawb-gmi", modelId: "XiaomiMiMo/MiMo-V2.5", displayName: "MiMo-V2.5 (GMI)", monthlyTokens: 0, creditTokens: 0, freeType: "keyless", poolKey: "gitlawb-gmi", tos: "ambiguous" },
{ provider: "gitlawb-gmi", modelId: "openai/gpt-5.5", displayName: "GPT-5.5", monthlyTokens: 0, creditTokens: 0, freeType: "keyless", poolKey: "gitlawb-gmi", tos: "ambiguous" },
{ provider: "gitlawb-gmi", modelId: "openai/gpt-5.4-pro", displayName: "GPT-5.4 Pro", monthlyTokens: 0, creditTokens: 0, freeType: "keyless", poolKey: "gitlawb-gmi", tos: "ambiguous" },
{ provider: "gitlawb-gmi", modelId: "openai/gpt-5.4", displayName: "GPT-5.4", monthlyTokens: 0, creditTokens: 0, freeType: "keyless", poolKey: "gitlawb-gmi", tos: "ambiguous" },
{ provider: "gitlawb-gmi", modelId: "openai/gpt-5.4-mini", displayName: "GPT-5.4 Mini", monthlyTokens: 0, creditTokens: 0, freeType: "keyless", poolKey: "gitlawb-gmi", tos: "ambiguous" },
{ provider: "gitlawb-gmi", modelId: "openai/gpt-5.4-nano", displayName: "GPT-5.4 Nano", monthlyTokens: 0, creditTokens: 0, freeType: "keyless", poolKey: "gitlawb-gmi", tos: "ambiguous" },
{ provider: "gitlawb-gmi", modelId: "openai/gpt-5.3-codex", displayName: "GPT-5.3 Codex", monthlyTokens: 0, creditTokens: 0, freeType: "keyless", poolKey: "gitlawb-gmi", tos: "ambiguous" },
{ provider: "gitlawb-gmi", modelId: "openai/gpt-5.2-codex", displayName: "GPT-5.2 Codex", monthlyTokens: 0, creditTokens: 0, freeType: "keyless", poolKey: "gitlawb-gmi", tos: "ambiguous" },
{ provider: "gitlawb-gmi", modelId: "openai/gpt-5.2", displayName: "GPT-5.2", monthlyTokens: 0, creditTokens: 0, freeType: "keyless", poolKey: "gitlawb-gmi", tos: "ambiguous" },
{ provider: "gitlawb-gmi", modelId: "openai/gpt-5.1", displayName: "GPT-5.1", monthlyTokens: 0, creditTokens: 0, freeType: "keyless", poolKey: "gitlawb-gmi", tos: "ambiguous" },
{ provider: "gitlawb-gmi", modelId: "openai/gpt-5", displayName: "GPT-5", monthlyTokens: 0, creditTokens: 0, freeType: "keyless", poolKey: "gitlawb-gmi", tos: "ambiguous" },
{ provider: "gitlawb-gmi", modelId: "openai/gpt-4o", displayName: "GPT-4o", monthlyTokens: 0, creditTokens: 0, freeType: "keyless", poolKey: "gitlawb-gmi", tos: "ambiguous" },
{ provider: "gitlawb-gmi", modelId: "openai/gpt-4o-mini", displayName: "GPT-4o Mini", monthlyTokens: 0, creditTokens: 0, freeType: "keyless", poolKey: "gitlawb-gmi", tos: "ambiguous" },
{ provider: "gitlawb-gmi", modelId: "anthropic/claude-opus-4.7", displayName: "Claude Opus 4.7", monthlyTokens: 0, creditTokens: 0, freeType: "keyless", poolKey: "gitlawb-gmi", tos: "ambiguous" },
{ provider: "gitlawb-gmi", modelId: "anthropic/claude-opus-4.6", displayName: "Claude Opus 4.6", monthlyTokens: 0, creditTokens: 0, freeType: "keyless", poolKey: "gitlawb-gmi", tos: "ambiguous" },
{ provider: "gitlawb-gmi", modelId: "anthropic/claude-opus-4.5", displayName: "Claude Opus 4.5", monthlyTokens: 0, creditTokens: 0, freeType: "keyless", poolKey: "gitlawb-gmi", tos: "ambiguous" },
{ provider: "gitlawb-gmi", modelId: "anthropic/claude-opus-4.1", displayName: "Claude Opus 4.1", monthlyTokens: 0, creditTokens: 0, freeType: "keyless", poolKey: "gitlawb-gmi", tos: "ambiguous" },
{ provider: "gitlawb-gmi", modelId: "anthropic/claude-sonnet-4.6", displayName: "Claude Sonnet 4.6", monthlyTokens: 0, creditTokens: 0, freeType: "keyless", poolKey: "gitlawb-gmi", tos: "ambiguous" },
{ provider: "gitlawb-gmi", modelId: "anthropic/claude-sonnet-4.5", displayName: "Claude Sonnet 4.5", monthlyTokens: 0, creditTokens: 0, freeType: "keyless", poolKey: "gitlawb-gmi", tos: "ambiguous" },
{ provider: "gitlawb-gmi", modelId: "anthropic/claude-sonnet-4", displayName: "Claude Sonnet 4", monthlyTokens: 0, creditTokens: 0, freeType: "keyless", poolKey: "gitlawb-gmi", tos: "ambiguous" },
{ provider: "gitlawb-gmi", modelId: "anthropic/claude-haiku-4.5", displayName: "Claude Haiku 4.5", monthlyTokens: 0, creditTokens: 0, freeType: "keyless", poolKey: "gitlawb-gmi", tos: "ambiguous" },
{ provider: "gitlawb-gmi", modelId: "deepseek-ai/DeepSeek-V4-Pro", displayName: "DeepSeek V4 Pro", monthlyTokens: 0, creditTokens: 0, freeType: "keyless", poolKey: "gitlawb-gmi", tos: "ambiguous" },
{ provider: "gitlawb-gmi", modelId: "deepseek-ai/DeepSeek-V4-Flash", displayName: "DeepSeek V4 Flash", monthlyTokens: 0, creditTokens: 0, freeType: "keyless", poolKey: "gitlawb-gmi", tos: "ambiguous" },
{ provider: "gitlawb-gmi", modelId: "deepseek-ai/DeepSeek-R1-0528", displayName: "DeepSeek R1", monthlyTokens: 0, creditTokens: 0, freeType: "keyless", poolKey: "gitlawb-gmi", tos: "ambiguous" },
{ provider: "gitlawb-gmi", modelId: "deepseek-ai/DeepSeek-V3.2", displayName: "DeepSeek V3.2", monthlyTokens: 0, creditTokens: 0, freeType: "keyless", poolKey: "gitlawb-gmi", tos: "ambiguous" },
{ provider: "gitlawb-gmi", modelId: "google/gemini-3.1-pro-preview", displayName: "Gemini 3.1 Pro", monthlyTokens: 0, creditTokens: 0, freeType: "keyless", poolKey: "gitlawb-gmi", tos: "ambiguous" },
{ provider: "gitlawb-gmi", modelId: "google/gemini-3.1-flash-lite-preview", displayName: "Gemini 3.1 Flash Lite", monthlyTokens: 0, creditTokens: 0, freeType: "keyless", poolKey: "gitlawb-gmi", tos: "ambiguous" },
{ provider: "gitlawb-gmi", modelId: "google/gemini-3-flash-preview", displayName: "Gemini 3 Flash", monthlyTokens: 0, creditTokens: 0, freeType: "keyless", poolKey: "gitlawb-gmi", tos: "ambiguous" },
{ provider: "gitlawb-gmi", modelId: "zai-org/GLM-5.1-FP8", displayName: "GLM-5.1", monthlyTokens: 0, creditTokens: 0, freeType: "keyless", poolKey: "gitlawb-gmi", tos: "ambiguous" },
{ provider: "gitlawb-gmi", modelId: "zai-org/GLM-5-FP8", displayName: "GLM-5", monthlyTokens: 0, creditTokens: 0, freeType: "keyless", poolKey: "gitlawb-gmi", tos: "ambiguous" },
{ provider: "gitlawb-gmi", modelId: "moonshotai/Kimi-K2.6", displayName: "Kimi K2.6", monthlyTokens: 0, creditTokens: 0, freeType: "keyless", poolKey: "gitlawb-gmi", tos: "ambiguous" },
{ provider: "gitlawb-gmi", modelId: "moonshotai/Kimi-K2.5", displayName: "Kimi K2.5", monthlyTokens: 0, creditTokens: 0, freeType: "keyless", poolKey: "gitlawb-gmi", tos: "ambiguous" },
{ provider: "gitlawb-gmi", modelId: "MiniMaxAI/MiniMax-M2.7", displayName: "MiniMax M2.7", monthlyTokens: 0, creditTokens: 0, freeType: "keyless", poolKey: "gitlawb-gmi", tos: "ambiguous" },
{ provider: "gitlawb-gmi", modelId: "MiniMaxAI/MiniMax-M2.5", displayName: "MiniMax M2.5", monthlyTokens: 0, creditTokens: 0, freeType: "keyless", poolKey: "gitlawb-gmi", tos: "ambiguous" },
{ provider: "gitlawb-gmi", modelId: "Qwen/Qwen3.6-Max-Preview", displayName: "Qwen3.6 Max", monthlyTokens: 0, creditTokens: 0, freeType: "keyless", poolKey: "gitlawb-gmi", tos: "ambiguous" },
{ provider: "gitlawb-gmi", modelId: "Qwen/Qwen3.6-Plus", displayName: "Qwen3.6 Plus", monthlyTokens: 0, creditTokens: 0, freeType: "keyless", poolKey: "gitlawb-gmi", tos: "ambiguous" },
{ provider: "gitlawb-gmi", modelId: "Qwen/Qwen3.5-397B-A17B", displayName: "Qwen3.5 397B", monthlyTokens: 0, creditTokens: 0, freeType: "keyless", poolKey: "gitlawb-gmi", tos: "ambiguous" },
{ provider: "gitlawb-gmi", modelId: "Qwen/Qwen3-Coder-480B-A35B-Instruct-FP8", displayName: "Qwen3 Coder 480B", monthlyTokens: 0, creditTokens: 0, freeType: "keyless", poolKey: "gitlawb-gmi", tos: "ambiguous" },
{ provider: "gitlawb-gmi", modelId: "nvidia/NVIDIA-Nemotron-3-Nano-Omni", displayName: "Nemotron 3 Nano", monthlyTokens: 0, creditTokens: 0, freeType: "keyless", poolKey: "gitlawb-gmi", tos: "ambiguous" },
{ provider: "glm-cn", modelId: "glm-4-flash", displayName: "GLM-4-Flash", monthlyTokens: 0, creditTokens: 0, freeType: "recurring-uncapped", poolKey: "zhipu-flash-free", tos: "ok" },
{ provider: "glm-cn", modelId: "glm-4.5-flash", displayName: "GLM-4.5-Flash", monthlyTokens: 0, creditTokens: 0, freeType: "recurring-uncapped", poolKey: "zhipu-flash-free", tos: "ok" },
{ provider: "glm-cn", modelId: "glm-4.7-flash", displayName: "GLM-4.7-Flash", monthlyTokens: 0, creditTokens: 0, freeType: "recurring-uncapped", poolKey: "zhipu-flash-free", tos: "ok" },
@@ -499,5 +459,4 @@ export const FREE_MODEL_BUDGETS: FreeModelBudget[] = [
{ provider: "vertex", modelId: "GLM-5.1-FP8", displayName: "GLM-5.1 (Vertex Partner)", monthlyTokens: 0, creditTokens: 300000000, freeType: "one-time-initial", poolKey: "vertex", tos: "caution" },
{ provider: "vertex", modelId: "claude-opus-4-7", displayName: "Claude Opus 4.7 (Vertex)", monthlyTokens: 0, creditTokens: 300000000, freeType: "one-time-initial", poolKey: "vertex", tos: "caution" },
{ provider: "vertex", modelId: "claude-sonnet-4-6", displayName: "Claude Sonnet 4.6 (Vertex)", monthlyTokens: 0, creditTokens: 300000000, freeType: "one-time-initial", poolKey: "vertex", tos: "caution" },
{ provider: "yi", modelId: "yi-large", displayName: "Yi Large", monthlyTokens: 0, creditTokens: 0, freeType: "keyless", poolKey: "yi", tos: "unknown" },
];

View File

@@ -1730,8 +1730,8 @@ export const APIKEY_PROVIDERS = {
color: "#10B981",
textIcon: "GLB",
website: "https://opengateway.gitlawb.com",
hasFree: true,
freeNote: "Free tier available — no credit card required",
hasFree: false,
freeNote: "Free MiMo (xiaomi/mimo-v2.5) revoked 2026-05 — Opengateway is now a pay-as-you-go credit gateway; no recurring free model.",
apiHint: "Get your API key from Gitlawb Opengateway dashboard.",
},
"gitlawb-gmi": {
@@ -1742,8 +1742,8 @@ export const APIKEY_PROVIDERS = {
color: "#10B981",
textIcon: "GMI",
website: "https://opengateway.gitlawb.com",
hasFree: true,
freeNote: "Free tier available — no credit card required",
hasFree: false,
freeNote: "Free Nemotron promo ended 2026-06 — the GMI Cloud route is now pay-as-you-go credit only.",
apiHint: "Get your API key from Gitlawb Opengateway dashboard.",
},
"inference-net": {
@@ -1796,9 +1796,9 @@ export const APIKEY_PROVIDERS = {
color: "#6366F1",
textIcon: "AI",
website: "https://aimlapi.com",
hasFree: true,
hasFree: false,
freeNote:
"$0.025/day free credits — 200+ models (GPT-4o, Claude, Gemini, Llama) via single endpoint",
"Free tier paused (2026) — AI/ML API is now pay-as-you-go only (min $20 top-up); no recurring free credits.",
passthroughModels: true,
},
novita: {
@@ -2058,7 +2058,7 @@ export const APIKEY_PROVIDERS = {
textIcon: "IF",
website: "https://xinghuo.xfyun.cn",
hasFree: true,
freeNote: "Free Spark Lite models. China's voice AI leader.",
freeNote: "Spark Lite is free (2 QPS rate-limited), but iFlytek ToS §2.4(3) prohibits programmatic extraction and requires Chinese real-name auth — use with caution.",
passthroughModels: true,
authHint: "Get API key at console.xfyun.cn",
},
@@ -2083,8 +2083,8 @@ export const APIKEY_PROVIDERS = {
color: "#10B981",
textIcon: "YI",
website: "https://01.ai",
hasFree: true,
freeNote: "Free Yi-Light models. Kai-Fu Lee's company.",
hasFree: false,
freeNote: "No free API tier (2026) — Yi-Light retired; platform.01.ai is pay-as-you-go (Yi-Lightning paid). Open weights are download-only.",
passthroughModels: true,
authHint: "Get API key at platform.lingyiwanwu.com",
},
@@ -2162,7 +2162,7 @@ export const APIKEY_PROVIDERS = {
textIcon: "SD",
website: "https://xinghuo.xfyun.cn",
hasFree: true,
freeNote: "Free iFlytek Spark models (alias for iflytek).",
freeNote: "Spark Lite free (alias for iflytek), but ToS restricts to personal/non-commercial use and prohibits relaying access to third parties — use with caution.",
passthroughModels: true,
authHint: "Get API key at console.xfyun.cn",
},
@@ -2267,7 +2267,7 @@ export const APIKEY_PROVIDERS = {
textIcon: "MA",
website: "https://monsterapi.ai",
hasFree: true,
freeNote: "Free credits for decentralized GPU inference. No credit card required.",
freeNote: "One-time signup trial credits for decentralized GPU inference (no recurring free plan). No credit card required.",
passthroughModels: true,
authHint: "Get API key at monsterapi.ai",
},

View File

@@ -1,13 +1,15 @@
import { describe, it } from "node:test";
import assert from "node:assert";
// 2026-06-17 free-tier refresh: providers whose free tier is confirmed gone (high confidence,
// no OmniRoute-path nuance) have hasFree flipped to false so the dashboard / onboarding no longer
// advertises a free tier that does not exist. The budget catalog already dropped them.
// 2026-06-17 free-tier refresh + 2026-06-18 live re-verification: providers whose free tier is
// confirmed gone have hasFree flipped to false so the dashboard / onboarding no longer advertises a
// free tier that does not exist. The budget catalog already dropped them. The 2026-06-18 batch
// (gitlawb, gitlawb-gmi, aimlapi, yi) was each re-verified against the official source before flipping
// (aimlapi docs: "The Free Tier is currently paused"; gitlawb GitHub issue #1345: MiMo revoked).
describe("2026 discontinued free tiers — providers.ts hasFree reconciliation", () => {
it("APIKEY_PROVIDERS dead tiers no longer advertise a free tier", async () => {
const { APIKEY_PROVIDERS } = await import("../../src/shared/constants/providers.ts");
for (const id of ["chutes", "kluster", "glhf", "phind"]) {
for (const id of ["chutes", "kluster", "glhf", "phind", "gitlawb", "gitlawb-gmi", "aimlapi", "yi"]) {
const p = (APIKEY_PROVIDERS as Record<string, { hasFree?: boolean }>)[id];
assert.ok(p, `${id} should still exist in APIKEY_PROVIDERS (provider not removed, only its free flag)`);
assert.strictEqual(p.hasFree, false, `${id} should have hasFree:false (discontinued in 2026)`);
@@ -21,15 +23,16 @@ describe("2026 discontinued free tiers — providers.ts hasFree reconciliation",
assert.strictEqual(p.hasFree, false, "phind web/cookie should have hasFree:false (phind.com shut down 2026-01)");
});
it("intentionally-kept providers still advertise free (guarded / lower-confidence — not flipped)", async () => {
const { APIKEY_PROVIDERS, NOAUTH_PROVIDERS } = await import("../../src/shared/constants/providers.ts");
// gitlawb has a dedicated test asserting hasFree:true; aimlapi/theoldllm were medium-confidence in
// the research (and theoldllm had refuted claims). Left as-is on purpose — flipping risks a
// qwen-web-style error (OAuth/api tier death vs the path OmniRoute actually uses).
const apikey = APIKEY_PROVIDERS as Record<string, { hasFree?: boolean }>;
it("intentionally-kept providers still advertise free (genuinely free / ToS-flagged, not flipped)", async () => {
const { NOAUTH_PROVIDERS, APIKEY_PROVIDERS } = await import("../../src/shared/constants/providers.ts");
// theoldllm is a keyless, no-signup web chat (genuinely free, just no catalogable API tier) — kept.
// iflytek/sparkdesk stay hasFree:true but carry a ToS-caution freeNote (Spark Lite is free, the ToS
// restricts proxy/relay use). gitlawb/gitlawb-gmi/aimlapi/yi were re-verified dead 2026-06-18 and are
// asserted false above — keeping them out of this list guards against a silent re-flip-to-true.
const noauth = NOAUTH_PROVIDERS as Record<string, { hasFree?: boolean }>;
assert.strictEqual(apikey["gitlawb"]?.hasFree, true, "gitlawb intentionally kept hasFree:true");
assert.strictEqual(apikey["aimlapi"]?.hasFree, true, "aimlapi intentionally kept hasFree:true");
const apikey = APIKEY_PROVIDERS as Record<string, { hasFree?: boolean; freeNote?: string }>;
assert.strictEqual(noauth["theoldllm"]?.hasFree, true, "theoldllm intentionally kept hasFree:true");
assert.strictEqual(apikey["iflytek"]?.hasFree, true, "iflytek kept free with ToS-caution note");
assert.match(apikey["iflytek"]?.freeNote ?? "", /caution/i, "iflytek freeNote should carry a caution");
});
});

View File

@@ -10,7 +10,8 @@ describe("Gitlawb Opengateway providers", () => {
assert.strictEqual(provider.id, "gitlawb");
assert.strictEqual(provider.alias, "glb");
assert.ok(provider.name.includes("Gitlawb"));
assert.strictEqual(provider.hasFree, true);
// Free MiMo (xiaomi/mimo-v2.5) revoked 2026-05; Opengateway is now pay-as-you-go (re-verified 2026-06-18).
assert.strictEqual(provider.hasFree, false);
});
it("should have registry entry with correct baseUrl", async () => {
@@ -52,7 +53,8 @@ describe("Gitlawb Opengateway providers", () => {
assert.ok(provider, "gitlawb-gmi should exist in APIKEY_PROVIDERS");
assert.strictEqual(provider.id, "gitlawb-gmi");
assert.strictEqual(provider.alias, "glb-gmi");
assert.strictEqual(provider.hasFree, true);
// Free Nemotron promo ended 2026-06; GMI Cloud route is pay-as-you-go (re-verified 2026-06-18).
assert.strictEqual(provider.hasFree, false);
});
it("should have registry entry with gmi-cloud baseUrl", async () => {