diff --git a/docs/screenshots/free-tier-budget-card.svg b/docs/screenshots/free-tier-budget-card.svg index d9c08c52df9c..a142a8b2ff9e 100644 --- a/docs/screenshots/free-tier-budget-card.svg +++ b/docs/screenshots/free-tier-budget-card.svg @@ -61,7 +61,7 @@ Qwen3.8 27B 6M -MiniMax-M2.7 6M +DeepSeek-V3.2 6M Arcee Trinity Large Prev 5M diff --git a/open-sse/config/freeModelCatalog.data.ts b/open-sse/config/freeModelCatalog.data.ts index 5b58c600ebcc..f181b8660bdd 100644 --- a/open-sse/config/freeModelCatalog.data.ts +++ b/open-sse/config/freeModelCatalog.data.ts @@ -22,7 +22,7 @@ import type { FreeModelBudget } from "./freeModelCatalog.ts"; * rewrites file timestamps on every deploy, which would report a months-old * catalog as "updated today". Bump this whenever the entries below change. */ -export const FREE_CATALOG_CURATED_AT = "2026-09-12"; +export const FREE_CATALOG_CURATED_AT = "2026-10-10"; export const FREE_MODEL_BUDGETS: FreeModelBudget[] = [ { provider: "agentrouter", modelId: "claude-opus-4-8", displayName: "Claude Opus 4.8", monthlyTokens: 0, creditTokens: 200000000, freeType: "one-time-initial", poolKey: "agentrouter", tos: "caution" }, @@ -388,11 +388,12 @@ export const FREE_MODEL_BUDGETS: FreeModelBudget[] = [ { provider: "qoder", modelId: "minimax-m3", displayName: "MiniMax-M3", monthlyTokens: 0, creditTokens: 1000000, freeType: "one-time-initial", poolKey: "qoder", tos: "caution" }, { provider: "reka", modelId: "reka-flash-3", displayName: "Reka Flash 3", monthlyTokens: 0, creditTokens: 0, freeType: "recurring-monthly", poolKey: "reka", tos: "caution" }, { provider: "reka", modelId: "reka-edge-2603", displayName: "Reka Edge 2603", monthlyTokens: 0, creditTokens: 0, freeType: "recurring-monthly", poolKey: "reka", tos: "caution" }, - { provider: "sambanova", modelId: "MiniMax-M2.7", displayName: "MiniMax-M2.7", monthlyTokens: 6000000, creditTokens: 0, freeType: "recurring-daily", poolKey: "sambanova", tos: "caution" }, + // evidence: public-page https://docs.sambanova.ai/docs/en/models/rate-limits re-read 2026-10-10 - Free Tier table lists DeepSeek-V3.1, Meta-Llama-3.3-70B-Instruct, gpt-oss-120b (production) and DeepSeek-V3.2, gemma-4-31B-it (preview) at 200,000 TPD each; MiniMax-M2.7 appears only under the Developer Tier and Llama-4-Maverick is not on the page. The page does not say how the token limit is enforced, so the 6M pool is an upper bound. { provider: "sambanova", modelId: "DeepSeek-V3.2", displayName: "DeepSeek-V3.2", monthlyTokens: 6000000, creditTokens: 0, freeType: "recurring-daily", poolKey: "sambanova", tos: "caution" }, - { provider: "sambanova", modelId: "Llama-4-Maverick-17B-128E-Instruct", displayName: "Llama-4-Maverick-17B-128E-Instruct", monthlyTokens: 6000000, creditTokens: 0, freeType: "recurring-daily", poolKey: "sambanova", tos: "caution" }, { provider: "sambanova", modelId: "Meta-Llama-3.3-70B-Instruct", displayName: "Meta-Llama-3.3-70B-Instruct", monthlyTokens: 6000000, creditTokens: 0, freeType: "recurring-daily", poolKey: "sambanova", tos: "caution" }, { provider: "sambanova", modelId: "gpt-oss-120b", displayName: "gpt-oss-120b", monthlyTokens: 6000000, creditTokens: 0, freeType: "recurring-daily", poolKey: "sambanova", tos: "caution" }, + { provider: "sambanova", modelId: "DeepSeek-V3.1", displayName: "DeepSeek-V3.1", monthlyTokens: 6000000, creditTokens: 0, freeType: "recurring-daily", poolKey: "sambanova", tos: "caution" }, + { provider: "sambanova", modelId: "gemma-4-31B-it", displayName: "gemma-4-31B-it", monthlyTokens: 6000000, creditTokens: 0, freeType: "recurring-daily", poolKey: "sambanova", tos: "caution" }, { provider: "scaleway", modelId: "qwen3-235b-a22b-instruct-2507", displayName: "Qwen3 235B A22B (1M free tok 🆓)", monthlyTokens: 0, creditTokens: 1000000, freeType: "one-time-initial", poolKey: "scaleway", tos: "ok" }, { provider: "scaleway", modelId: "llama-3.1-70b-instruct", displayName: "Llama 3.1 70B (🆓 EU)", monthlyTokens: 0, creditTokens: 1000000, freeType: "one-time-initial", poolKey: "scaleway", tos: "ok" }, { provider: "scaleway", modelId: "llama-3.1-8b-instruct", displayName: "Llama 3.1 8B (🆓 EU)", monthlyTokens: 0, creditTokens: 1000000, freeType: "one-time-initial", poolKey: "scaleway", tos: "ok" }, diff --git a/open-sse/config/providers/shared.ts b/open-sse/config/providers/shared.ts index 37f8a587f4d9..4e9777bba5dc 100644 --- a/open-sse/config/providers/shared.ts +++ b/open-sse/config/providers/shared.ts @@ -433,6 +433,8 @@ export const CHAT_OPENAI_COMPAT_MODELS: Record = { "Llama-4-Maverick-17B-128E-Instruct", "Meta-Llama-3.3-70B-Instruct", "gpt-oss-120b", + "DeepSeek-V3.1", + "gemma-4-31B-it", ]), nscale: buildModels([ "moonshotai/Kimi-K2.5", diff --git a/tests/unit/sambanova-free-models-2026-10.test.ts b/tests/unit/sambanova-free-models-2026-10.test.ts new file mode 100644 index 000000000000..39914c45ce67 --- /dev/null +++ b/tests/unit/sambanova-free-models-2026-10.test.ts @@ -0,0 +1,32 @@ +import test from "node:test"; +import assert from "node:assert/strict"; + +import { FREE_MODEL_BUDGETS } from "../../open-sse/config/freeModelCatalog.data.ts"; +import { CHAT_OPENAI_COMPAT_MODELS } from "../../open-sse/config/providers/shared.ts"; + +// Source: https://docs.sambanova.ai/docs/en/models/rate-limits (read 2026-10-09). The Free Tier table lists +// DeepSeek-V3.1, Meta-Llama-3.3-70B-Instruct, gpt-oss-120b, DeepSeek-V3.2 and gemma-4-31B-it; MiniMax-M2.7 is +// only in the Developer table and Llama-4-Maverick is not on the page. +const free = new Set( + FREE_MODEL_BUDGETS.filter((m) => m.provider === "sambanova").map((m) => m.modelId) +); +const registry = new Set(CHAT_OPENAI_COMPAT_MODELS.sambanova.map((m) => m.id)); + +test("SambaNova free catalog lists the models of its Free Tier table", () => { + for (const id of [ + "DeepSeek-V3.1", + "Meta-Llama-3.3-70B-Instruct", + "gpt-oss-120b", + "DeepSeek-V3.2", + "gemma-4-31B-it", + ]) { + assert.ok(free.has(id), `${id} must be in the SambaNova free catalog`); + assert.ok(registry.has(id), `${id} must be routable`); + } +}); + +test("SambaNova free catalog excludes models its page does not give to the Free Tier", () => { + for (const id of ["MiniMax-M2.7", "Llama-4-Maverick-17B-128E-Instruct"]) { + assert.ok(!free.has(id), `${id} must not be listed as free`); + } +});