diff --git a/docs/reference/FREE_TIERS.md b/docs/reference/FREE_TIERS.md index 8e003bb39f..d8e5121e10 100644 --- a/docs/reference/FREE_TIERS.md +++ b/docs/reference/FREE_TIERS.md @@ -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 | --- diff --git a/open-sse/config/freeModelCatalog.data.ts b/open-sse/config/freeModelCatalog.data.ts index f497f4d317..d5e0ba607c 100644 --- a/open-sse/config/freeModelCatalog.data.ts +++ b/open-sse/config/freeModelCatalog.data.ts @@ -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" }, ]; diff --git a/src/shared/constants/providers.ts b/src/shared/constants/providers.ts index a19e2b9cda..616b3fdcb8 100644 --- a/src/shared/constants/providers.ts +++ b/src/shared/constants/providers.ts @@ -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", }, diff --git a/tests/unit/discontinued-providers-2026.test.ts b/tests/unit/discontinued-providers-2026.test.ts index eb7866bb73..0af6bf5e2f 100644 --- a/tests/unit/discontinued-providers-2026.test.ts +++ b/tests/unit/discontinued-providers-2026.test.ts @@ -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)[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; + 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; - 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; 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"); }); }); diff --git a/tests/unit/gitlawb-provider.test.ts b/tests/unit/gitlawb-provider.test.ts index f8b15a5051..890beaa899 100644 --- a/tests/unit/gitlawb-provider.test.ts +++ b/tests/unit/gitlawb-provider.test.ts @@ -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 () => {