diff --git a/open-sse/config/freeModelCatalog.data.ts b/open-sse/config/freeModelCatalog.data.ts index 2d82b69382..e45e352b31 100644 --- a/open-sse/config/freeModelCatalog.data.ts +++ b/open-sse/config/freeModelCatalog.data.ts @@ -16,7 +16,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-08-30"; +export const FREE_CATALOG_CURATED_AT = "2026-09-02"; 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" }, @@ -173,20 +173,31 @@ export const FREE_MODEL_BUDGETS: FreeModelBudget[] = [ { provider: "freemodel-dev", modelId: "gpt-5.3-codex", displayName: "GPT-5.3 Codex", monthlyTokens: 0, creditTokens: 0, freeType: "one-time-initial", poolKey: "freemodel-dev", tos: "unknown" }, { provider: "friendliai", modelId: "meta-llama-3.1-70b-instruct", displayName: "meta-llama-3.1-70b-instruct", monthlyTokens: 0, creditTokens: 0, freeType: "keyless", poolKey: "friendliai", tos: "avoid" }, { provider: "friendliai", modelId: "meta-llama-3.1-8b-instruct", displayName: "meta-llama-3.1-8b-instruct", monthlyTokens: 0, creditTokens: 0, freeType: "keyless", poolKey: "friendliai", tos: "avoid" }, - { provider: "gemini", modelId: "gemini-2.5-flash", displayName: "Gemini 2.5 Flash", monthlyTokens: 60000000, creditTokens: 0, freeType: "recurring-daily", poolKey: "gemini-free", tos: "caution" }, - { provider: "gemini", modelId: "gemini-2.5-flash-lite", displayName: "Gemini 2.5 Flash-Lite", monthlyTokens: 0, creditTokens: 0, freeType: "recurring-daily", poolKey: "gemini-free", tos: "caution" }, - { provider: "gemini", modelId: "gemini-3-flash-preview", displayName: "Gemini 3 Flash Preview", monthlyTokens: 0, creditTokens: 0, freeType: "recurring-daily", poolKey: "gemini-free", tos: "caution" }, - { provider: "gemini", modelId: "gemini-3.1-flash-lite", displayName: "Gemini 3.1 Flash-Lite", monthlyTokens: 0, creditTokens: 0, freeType: "recurring-daily", poolKey: "gemini-free", tos: "caution" }, + // evidence: public-page https://ai.google.dev/gemini-api/docs/rate-limits (2026-08-18) — the per-model + // free-tier table was removed on 2025-12-23; the page now only says limits "can be viewed in Google AI + // Studio" and are "applied per project". No published token/RPD figure ⇒ recurring-uncapped (listed, + // never summed). Re-verify if Google republishes a table. + { provider: "gemini", modelId: "gemini-2.5-flash", displayName: "Gemini 2.5 Flash", monthlyTokens: 0, creditTokens: 0, freeType: "recurring-uncapped", poolKey: "gemini-free", tos: "caution" }, + { provider: "gemini", modelId: "gemini-2.5-flash-lite", displayName: "Gemini 2.5 Flash-Lite", monthlyTokens: 0, creditTokens: 0, freeType: "recurring-uncapped", poolKey: "gemini-free", tos: "caution" }, + { provider: "gemini", modelId: "gemini-3-flash-preview", displayName: "Gemini 3 Flash Preview", monthlyTokens: 0, creditTokens: 0, freeType: "recurring-uncapped", poolKey: "gemini-free", tos: "caution" }, + { provider: "gemini", modelId: "gemini-3.1-flash-lite", displayName: "Gemini 3.1 Flash-Lite", monthlyTokens: 0, creditTokens: 0, freeType: "recurring-uncapped", poolKey: "gemini-free", tos: "caution" }, { 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" }, { provider: "glm-cn", modelId: "glm-signup-bonus", displayName: "Z.AI — 20M signup bonus", monthlyTokens: 0, creditTokens: 20000000, freeType: "one-time-initial", poolKey: "zhipu-signup", tos: "ok" }, - // hardStopGuaranteed: Groq pricing page states "Free tier: 30 RPM / 14.4K RPD — no credit card" (open-sse/services/../providers/apikey/frontier-labs.ts:71-81). - { provider: "groq", modelId: "meta-llama/llama-4-scout-17b-16e-instruct", displayName: "Llama 4 Scout", monthlyTokens: 15000000, creditTokens: 0, freeType: "recurring-daily", poolKey: "groq", tos: "caution", hardStopGuaranteed: true }, - { provider: "groq", modelId: "llama-3.3-70b-versatile", displayName: "Llama 3.3 70B", monthlyTokens: 15000000, creditTokens: 0, freeType: "recurring-daily", poolKey: "groq", tos: "caution", hardStopGuaranteed: true }, - { provider: "groq", modelId: "openai/gpt-oss-120b", displayName: "GPT-OSS 120B", monthlyTokens: 15000000, creditTokens: 0, freeType: "recurring-daily", poolKey: "groq", tos: "caution", hardStopGuaranteed: true }, - { provider: "groq", modelId: "openai/gpt-oss-20b", displayName: "GPT-OSS 20B", monthlyTokens: 15000000, creditTokens: 0, freeType: "recurring-daily", poolKey: "groq", tos: "caution", hardStopGuaranteed: true }, - { provider: "groq", modelId: "qwen/qwen3-32b", displayName: "Qwen3 32B", monthlyTokens: 15000000, creditTokens: 0, freeType: "recurring-daily", poolKey: "groq", tos: "caution", hardStopGuaranteed: true }, + // evidence: public-page https://console.groq.com/docs/rate-limits (2026-09-02) — "Free Plan Limits": + // 200K TPD per model for the five chat models below; "Rate limits apply at the organization level". + // 200K × 30 = 6M per model; the cap is per model, so each row counts on its own (poolKey null). + // hardStopGuaranteed: same page — "When you exceed rate limits, our API returns a 429 Too Many Requests"; + // https://console.groq.com/docs/billing-faqs — the Free tier has no payment method on file ("To upgrade + // from the Free tier to the Developer tier, you'll need to provide a valid payment method"). + // Retired from the free tier (https://console.groq.com/docs/deprecations): llama-4-scout and qwen3-32b + // (2026-07-17), llama-3.3-70b-versatile (2026-08-16) — deliberately absent below. + { provider: "groq", modelId: "openai/gpt-oss-120b", displayName: "GPT-OSS 120B", monthlyTokens: 6000000, creditTokens: 0, freeType: "recurring-daily", poolKey: null, tos: "caution", hardStopGuaranteed: true }, + { provider: "groq", modelId: "openai/gpt-oss-20b", displayName: "GPT-OSS 20B", monthlyTokens: 6000000, creditTokens: 0, freeType: "recurring-daily", poolKey: null, tos: "caution", hardStopGuaranteed: true }, + { provider: "groq", modelId: "openai/gpt-oss-safeguard-20b", displayName: "GPT-OSS Safeguard 20B", monthlyTokens: 6000000, creditTokens: 0, freeType: "recurring-daily", poolKey: null, tos: "caution", hardStopGuaranteed: true }, + { provider: "groq", modelId: "qwen/qwen3.6-27b", displayName: "Qwen3.6 27B", monthlyTokens: 6000000, creditTokens: 0, freeType: "recurring-daily", poolKey: null, tos: "caution", hardStopGuaranteed: true }, + { provider: "groq", modelId: "qwen/qwen3.8-27b", displayName: "Qwen3.8 27B", monthlyTokens: 6000000, creditTokens: 0, freeType: "recurring-daily", poolKey: null, tos: "caution", hardStopGuaranteed: true }, { provider: "huggingchat", modelId: "baidu/ERNIE-4.5-VL-424B-A47B-Base-PT", displayName: "ERNIE 4.5 VL 424B A47B Base PT", monthlyTokens: 500000, creditTokens: 0, freeType: "recurring-monthly", poolKey: "huggingchat", tos: "caution" }, { provider: "huggingchat", modelId: "CohereLabs/c4ai-command-r7b-12-2024", displayName: "Command R7B 12-2024", monthlyTokens: 500000, creditTokens: 0, freeType: "recurring-monthly", poolKey: "huggingchat", tos: "caution" }, { provider: "huggingchat", modelId: "CohereLabs/command-a-reasoning-08-2025", displayName: "Command A Reasoning 08-2025", monthlyTokens: 500000, creditTokens: 0, freeType: "recurring-monthly", poolKey: "huggingchat", tos: "caution" }, @@ -255,11 +266,16 @@ export const FREE_MODEL_BUDGETS: FreeModelBudget[] = [ { provider: "llm7", modelId: "deepseek-r1-0528", displayName: "DeepSeek R1 (LLM7)", monthlyTokens: 0, creditTokens: 0, freeType: "recurring-daily", poolKey: "llm7-free", tos: "caution" }, { provider: "llm7", modelId: "qwen2.5-coder-32b-instruct", displayName: "Qwen2.5 Coder 32B (LLM7)", monthlyTokens: 0, creditTokens: 0, freeType: "recurring-daily", poolKey: "llm7-free", tos: "caution" }, { provider: "longcat", modelId: "LongCat-2.0", displayName: "LongCat-2.0", monthlyTokens: 0, creditTokens: 10000000, freeType: "one-time-initial", poolKey: "longcat-free", tos: "caution" }, - { provider: "mistral", modelId: "mistral-large-latest", displayName: "Mistral Large 3", monthlyTokens: 1000000000, creditTokens: 0, freeType: "recurring-monthly", poolKey: "mistral", tos: "caution" }, - { provider: "mistral", modelId: "mistral-medium-3-5", displayName: "Mistral Medium 3.5", monthlyTokens: 1000000000, creditTokens: 0, freeType: "recurring-monthly", poolKey: "mistral", tos: "caution" }, - { provider: "mistral", modelId: "mistral-small-latest", displayName: "Mistral Small 4", monthlyTokens: 1000000000, creditTokens: 0, freeType: "recurring-monthly", poolKey: "mistral", tos: "caution" }, - { provider: "mistral", modelId: "devstral-latest", displayName: "Devstral 2", monthlyTokens: 1000000000, creditTokens: 0, freeType: "recurring-monthly", poolKey: "mistral", tos: "caution" }, - { provider: "mistral", modelId: "codestral-latest", displayName: "Codestral", monthlyTokens: 1000000000, creditTokens: 0, freeType: "recurring-monthly", poolKey: "mistral", tos: "caution" }, + // evidence: public-page https://docs.mistral.ai/admin/billing-usage/usage-limits (2026-09-02) — "Free mode lets you + // create API keys and use included monthly usage within the limits shown on the Limits page"; help.mistral.ai/698531 — + // "Tokens per month: overall consumption cap", "set at the organization level". The numeric cap (1B) is only visible + // inside the console and has NOT been console-verified yet ⇒ recurring-uncapped (0) until a dated verification + // (`evidence: console-verified AAAA-MM-DD por `) is recorded here; restoring 1B without it is forbidden. + { provider: "mistral", modelId: "mistral-large-latest", displayName: "Mistral Large 3", monthlyTokens: 0, creditTokens: 0, freeType: "recurring-uncapped", poolKey: "mistral", tos: "caution" }, + { provider: "mistral", modelId: "mistral-medium-3-5", displayName: "Mistral Medium 3.5", monthlyTokens: 0, creditTokens: 0, freeType: "recurring-uncapped", poolKey: "mistral", tos: "caution" }, + { provider: "mistral", modelId: "mistral-small-latest", displayName: "Mistral Small 4", monthlyTokens: 0, creditTokens: 0, freeType: "recurring-uncapped", poolKey: "mistral", tos: "caution" }, + { provider: "mistral", modelId: "devstral-latest", displayName: "Devstral 2", monthlyTokens: 0, creditTokens: 0, freeType: "recurring-uncapped", poolKey: "mistral", tos: "caution" }, + { provider: "mistral", modelId: "codestral-latest", displayName: "Codestral", monthlyTokens: 0, creditTokens: 0, freeType: "recurring-uncapped", poolKey: "mistral", tos: "caution" }, { provider: "monsterapi", modelId: "llama-3-8b-fuse", displayName: "Llama 3 8B Fuse", monthlyTokens: 0, creditTokens: 0, freeType: "one-time-initial", poolKey: "monsterapi", tos: "ambiguous" }, { provider: "morph", modelId: "morph-v3-large", displayName: "morph-v3-large", monthlyTokens: 400000, creditTokens: 0, freeType: "recurring-monthly", poolKey: "morph", tos: "ok" }, { provider: "morph", modelId: "morph-v3-fast", displayName: "morph-v3-fast", monthlyTokens: 400000, creditTokens: 0, freeType: "recurring-monthly", poolKey: "morph", tos: "ok" }, @@ -289,14 +305,17 @@ export const FREE_MODEL_BUDGETS: FreeModelBudget[] = [ { provider: "nvidia", modelId: "openai/gpt-oss-120b", displayName: "GPT OSS 120B", monthlyTokens: 0, creditTokens: 0, freeType: "one-time-initial", poolKey: "nvidia", tos: "caution" }, { provider: "nvidia", modelId: "openai/gpt-oss-20b", displayName: "GPT OSS 20B", monthlyTokens: 0, creditTokens: 0, freeType: "one-time-initial", poolKey: "nvidia", tos: "caution" }, { provider: "nvidia", modelId: "nvidia/nemotron-3-super-120b-a12b", displayName: "Nemotron 3 Super 120B A12B", monthlyTokens: 0, creditTokens: 0, freeType: "one-time-initial", poolKey: "nvidia", tos: "caution" }, - { provider: "ollama-cloud", modelId: "deepseek-v4-pro", displayName: "DeepSeek V4 Pro", monthlyTokens: 20000000, creditTokens: 0, freeType: "recurring-monthly", poolKey: "ollama-cloud", tos: "ambiguous" }, - { provider: "ollama-cloud", modelId: "deepseek-v4-flash", displayName: "DeepSeek V4 Flash", monthlyTokens: 20000000, creditTokens: 0, freeType: "recurring-monthly", poolKey: "ollama-cloud", tos: "ambiguous" }, - { provider: "ollama-cloud", modelId: "kimi-k2.6", displayName: "Kimi K2.6", monthlyTokens: 20000000, creditTokens: 0, freeType: "recurring-monthly", poolKey: "ollama-cloud", tos: "ambiguous" }, - { provider: "ollama-cloud", modelId: "glm-5.1", displayName: "GLM 5.1", monthlyTokens: 20000000, creditTokens: 0, freeType: "recurring-monthly", poolKey: "ollama-cloud", tos: "ambiguous" }, - { provider: "ollama-cloud", modelId: "minimax-m2.7", displayName: "MiniMax M2.7", monthlyTokens: 20000000, creditTokens: 0, freeType: "recurring-monthly", poolKey: "ollama-cloud", tos: "ambiguous" }, - { provider: "ollama-cloud", modelId: "gemma4:31b", displayName: "Gemma 4 31B", monthlyTokens: 20000000, creditTokens: 0, freeType: "recurring-monthly", poolKey: "ollama-cloud", tos: "ambiguous" }, - { provider: "ollama-cloud", modelId: "nemotron-3-super", displayName: "NVIDIA Nemotron 3 Super", monthlyTokens: 20000000, creditTokens: 0, freeType: "recurring-monthly", poolKey: "ollama-cloud", tos: "ambiguous" }, - { provider: "ollama-cloud", modelId: "qwen3.5:397b", displayName: "Qwen 3.5 397B", monthlyTokens: 20000000, creditTokens: 0, freeType: "recurring-monthly", poolKey: "ollama-cloud", tos: "ambiguous" }, + // evidence: public-page https://ollama.com/pricing (2026-09-02) — Free plan: "Starter usage credits + // included · Includes access to starter models · Add credits to unlock all models"; docs.ollama.com/cloud: + // "usage resets monthly". No token figure and no named starter-model list ⇒ recurring-uncapped. + { provider: "ollama-cloud", modelId: "deepseek-v4-pro", displayName: "DeepSeek V4 Pro", monthlyTokens: 0, creditTokens: 0, freeType: "recurring-uncapped", poolKey: "ollama-cloud", tos: "ambiguous" }, + { provider: "ollama-cloud", modelId: "deepseek-v4-flash", displayName: "DeepSeek V4 Flash", monthlyTokens: 0, creditTokens: 0, freeType: "recurring-uncapped", poolKey: "ollama-cloud", tos: "ambiguous" }, + { provider: "ollama-cloud", modelId: "kimi-k2.6", displayName: "Kimi K2.6", monthlyTokens: 0, creditTokens: 0, freeType: "recurring-uncapped", poolKey: "ollama-cloud", tos: "ambiguous" }, + { provider: "ollama-cloud", modelId: "glm-5.1", displayName: "GLM 5.1", monthlyTokens: 0, creditTokens: 0, freeType: "recurring-uncapped", poolKey: "ollama-cloud", tos: "ambiguous" }, + { provider: "ollama-cloud", modelId: "minimax-m2.7", displayName: "MiniMax M2.7", monthlyTokens: 0, creditTokens: 0, freeType: "recurring-uncapped", poolKey: "ollama-cloud", tos: "ambiguous" }, + { provider: "ollama-cloud", modelId: "gemma4:31b", displayName: "Gemma 4 31B", monthlyTokens: 0, creditTokens: 0, freeType: "recurring-uncapped", poolKey: "ollama-cloud", tos: "ambiguous" }, + { provider: "ollama-cloud", modelId: "nemotron-3-super", displayName: "NVIDIA Nemotron 3 Super", monthlyTokens: 0, creditTokens: 0, freeType: "recurring-uncapped", poolKey: "ollama-cloud", tos: "ambiguous" }, + { provider: "ollama-cloud", modelId: "qwen3.5:397b", displayName: "Qwen 3.5 397B", monthlyTokens: 0, creditTokens: 0, freeType: "recurring-uncapped", poolKey: "ollama-cloud", tos: "ambiguous" }, { provider: "opencode", modelId: "big-pickle", displayName: "Big Pickle", monthlyTokens: 0, creditTokens: 0, freeType: "keyless", poolKey: "opencode", tos: "avoid" }, { provider: "opencode", modelId: "deepseek-v4-flash-free", displayName: "DeepSeek V4 Flash Free", monthlyTokens: 0, creditTokens: 0, freeType: "keyless", poolKey: "opencode", tos: "avoid" }, { provider: "opencode", modelId: "minimax-m2.5-free", displayName: "MiniMax M2.5 Free", monthlyTokens: 0, creditTokens: 0, freeType: "keyless", poolKey: "opencode", tos: "avoid" }, @@ -465,7 +484,16 @@ export const FREE_MODEL_BUDGETS: FreeModelBudget[] = [ { provider: "routeway", modelId: "laguna-m.1:free", displayName: "Laguna M.1 (free)", monthlyTokens: 0, creditTokens: 0, freeType: "recurring-uncapped", poolKey: "routeway-free", tos: "caution" }, { provider: "routeway", modelId: "laguna-xs.2:free", displayName: "Laguna XS.2 (free)", monthlyTokens: 0, creditTokens: 0, freeType: "recurring-uncapped", poolKey: "routeway-free", tos: "caution" }, { provider: "routeway", modelId: "llama-3.2-3b-instruct:free", displayName: "Llama 3.2 3B Instruct (free)", monthlyTokens: 0, creditTokens: 0, freeType: "recurring-uncapped", poolKey: "routeway-free", tos: "caution" }, - { provider: "nara", modelId: "tencent-hy3", displayName: "Tencent Hy3", monthlyTokens: 150000000, creditTokens: 0, freeType: "recurring-daily", poolKey: "nara-free", tos: "caution" }, - { provider: "nara", modelId: "mistral-large", displayName: "Mistral Large", monthlyTokens: 150000000, creditTokens: 0, freeType: "recurring-daily", poolKey: "nara-free", tos: "caution" }, - { provider: "nara", modelId: "mistral-medium-3-5", displayName: "Mistral Medium 3.5", monthlyTokens: 150000000, creditTokens: 0, freeType: "recurring-daily", poolKey: "nara-free", tos: "caution" }, + // evidence: api-public https://router.bynara.id/api/plans (2026-09-02) — plan "free": token_cap_daily=7000000, + // rpm_limit=15, models=[agnes-2.0-flash, agnes-2.5-flash, laguna-s-2.1, minimax-m3-free, mistral-large, + // mistral-medium-3-5, qwen3.8-27b, stepfun-3.7-flash]; home: "Token Cap 7M / day · Free tokens reset daily + // at 07:00 WIB". One daily bucket per account ⇒ single pool: 7M × 30 = 210M. Key requires linking Telegram. + { provider: "nara", modelId: "agnes-2.0-flash", displayName: "Agnes 2.0 Flash", monthlyTokens: 210000000, creditTokens: 0, freeType: "recurring-daily", poolKey: "nara-free", tos: "caution" }, + { provider: "nara", modelId: "agnes-2.5-flash", displayName: "Agnes 2.5 Flash", monthlyTokens: 210000000, creditTokens: 0, freeType: "recurring-daily", poolKey: "nara-free", tos: "caution" }, + { provider: "nara", modelId: "laguna-s-2.1", displayName: "Laguna S 2.1", monthlyTokens: 210000000, creditTokens: 0, freeType: "recurring-daily", poolKey: "nara-free", tos: "caution" }, + { provider: "nara", modelId: "minimax-m3-free", displayName: "MiniMax M3 Free", monthlyTokens: 210000000, creditTokens: 0, freeType: "recurring-daily", poolKey: "nara-free", tos: "caution" }, + { provider: "nara", modelId: "mistral-large", displayName: "Mistral Large", monthlyTokens: 210000000, creditTokens: 0, freeType: "recurring-daily", poolKey: "nara-free", tos: "caution" }, + { provider: "nara", modelId: "mistral-medium-3-5", displayName: "Mistral Medium 3.5", monthlyTokens: 210000000, creditTokens: 0, freeType: "recurring-daily", poolKey: "nara-free", tos: "caution" }, + { provider: "nara", modelId: "qwen3.8-27b", displayName: "Qwen3.8 27B", monthlyTokens: 210000000, creditTokens: 0, freeType: "recurring-daily", poolKey: "nara-free", tos: "caution" }, + { provider: "nara", modelId: "stepfun-3.7-flash", displayName: "StepFun 3.7 Flash", monthlyTokens: 210000000, creditTokens: 0, freeType: "recurring-daily", poolKey: "nara-free", tos: "caution" }, ]; diff --git a/open-sse/config/freeTierCatalog.ts b/open-sse/config/freeTierCatalog.ts index 339f01a100..f68a53a3e2 100644 --- a/open-sse/config/freeTierCatalog.ts +++ b/open-sse/config/freeTierCatalog.ts @@ -6,20 +6,21 @@ * (explicit daily/monthly token cap, or documented RPD × ~800 tokens × 30). * * Deliberately EXCLUDED (rate-limit-only, no published token cap — theoretical, - * not granted): tencent, siliconflow, nvidia, baidu, publicai, sparkdesk. + * not granted): tencent, siliconflow, nvidia, baidu, publicai, sparkdesk, + * gemini (no per-model limits published since 2025-12), ollama-cloud (starter + * credits, no figure). * One-time signup credits and discontinued tiers are excluded (do not recur). */ export type TosVerdict = "ok" | "caution" | "ambiguous" | "avoid" | "unknown"; export const FREE_TIER_BUDGETS: Record = { mistral: 1_000_000_000, + nara: 210_000_000, "cloudflare-ai": 122_000_000, - gemini: 60_000_000, doubao: 60_000_000, cerebras: 30_000_000, "api-airforce": 24_000_000, - "ollama-cloud": 20_000_000, - groq: 15_000_000, + groq: 30_000_000, bluesminds: 7_200_000, sambanova: 6_000_000, "arcee-ai": 4_800_000, diff --git a/open-sse/config/providers/registry/groq/index.ts b/open-sse/config/providers/registry/groq/index.ts index 974e24e710..154ca7a574 100644 --- a/open-sse/config/providers/registry/groq/index.ts +++ b/open-sse/config/providers/registry/groq/index.ts @@ -24,6 +24,7 @@ export const groqProvider: RegistryEntry = { { id: "openai/gpt-oss-20b", name: "GPT-OSS 20B" }, { id: "qwen/qwen3-32b", name: "Qwen3 32B" }, { id: "qwen/qwen3.6-27b", name: "Qwen3.6 27B" }, + { id: "qwen/qwen3.8-27b", name: "Qwen3.8 27B" }, { id: "openai/gpt-oss-safeguard-20b", name: "GPT-OSS Safeguard 20B" }, ], }; diff --git a/open-sse/config/providers/registry/nara/index.ts b/open-sse/config/providers/registry/nara/index.ts index e2f840d4e7..177e8f39ba 100644 --- a/open-sse/config/providers/registry/nara/index.ts +++ b/open-sse/config/providers/registry/nara/index.ts @@ -4,16 +4,60 @@ import { buildOpenAiCompatibleRegistryEntry } from "../../shared.ts"; /** * NaraRouter — OpenAI-compatible aggregator (router.bynara.id). * - * Free key issued via their Telegram channel. The free tier is a shared - * 5M-tokens/day pool; many models are gated behind - * credit/plan, so only the free-tier models are pinned. + * Free key issued after linking a Telegram account. The free plan is one + * 7M-tokens/day bucket per account (GET /api/plans, 2026-09-02); only the + * plan's own models are pinned. Context lengths mirror the same models in + * our own registry (agnes, poolside, novita, stepfun); qwen3.8-27b has no + * published context yet, so it carries none. */ export const naraProvider: RegistryEntry = buildOpenAiCompatibleRegistryEntry({ id: "nara", baseUrl: "https://router.bynara.id/v1/chat/completions", models: [ - { id: "tencent-hy3", name: "Tencent Hy3", contextLength: 1000000 }, + { + id: "agnes-2.0-flash", + name: "Agnes 2.0 Flash", + contextLength: 262144, + toolCalling: true, + supportsVision: true, + supportsReasoning: true, + }, + { + id: "agnes-2.5-flash", + name: "Agnes 2.5 Flash", + contextLength: 524288, + toolCalling: true, + supportsVision: true, + supportsReasoning: true, + }, + { + id: "laguna-s-2.1", + name: "Laguna S 2.1", + contextLength: 262144, + toolCalling: true, + supportsReasoning: true, + }, + { + id: "minimax-m3-free", + name: "MiniMax M3 (free)", + contextLength: 1000000, + supportsVision: true, + supportsReasoning: true, + }, { id: "mistral-large", name: "Mistral Large", contextLength: 252000, toolCalling: true }, - { id: "mistral-medium-3-5", name: "Mistral Medium 3.5", contextLength: 256000, toolCalling: true, supportsVision: true }, + { + id: "mistral-medium-3-5", + name: "Mistral Medium 3.5", + contextLength: 256000, + toolCalling: true, + supportsVision: true, + }, + { id: "qwen3.8-27b", name: "Qwen3.8 27B", toolCalling: true }, + { + id: "stepfun-3.7-flash", + name: "StepFun 3.7 Flash", + contextLength: 262144, + toolCalling: true, + }, ], }); diff --git a/src/shared/constants/providers/apikey/gateways.ts b/src/shared/constants/providers/apikey/gateways.ts index 1a37aab7f3..8551f5daff 100644 --- a/src/shared/constants/providers/apikey/gateways.ts +++ b/src/shared/constants/providers/apikey/gateways.ts @@ -15,7 +15,8 @@ export const APIKEY_PROVIDERS_GATEWAYS = { color: "#6366F1", textIcon: "1M", website: "https://1min.ai", - authHint: "Create an API key at https://docs.1min.ai/docs/api/create-api-key, then paste it here.", + authHint: + "Create an API key at https://docs.1min.ai/docs/api/create-api-key, then paste it here.", apiHint: "1min.ai uses a proprietary chat API (single prompt string + SSE) instead of OpenAI chat/completions. OmniRoute flattens OpenAI messages into a labeled prompt and translates the SSE stream.", passthroughModels: true, @@ -47,7 +48,8 @@ export const APIKEY_PROVIDERS_GATEWAYS = { website: "https://freebuff.com", hasFree: true, serviceKinds: ["llm"], - authHint: "Enter Freebuff / Codebuff Auth Token (obtained via CLI login or automated harvester).", + authHint: + "Enter Freebuff / Codebuff Auth Token (obtained via CLI login or automated harvester).", freeNote: "Free Codebuff / Freebuff AI models.", apiHint: "Token is authenticated against Codebuff upstream session pool.", passthroughModels: true, @@ -1327,9 +1329,10 @@ export const APIKEY_PROVIDERS_GATEWAYS = { passthroughModels: true, website: "https://bynara.id", hasFree: true, - freeNote: "Free tier is a shared 5M tokens/day pool; some models are gated behind credit/plan.", + freeNote: + "Free plan: one 7M tokens/day bucket per account (15 req/min) across the plan's 8 models; others need credit.", authHint: - "Get a free API key via NaraRouter's Telegram channel, then paste it here as a Bearer token.", + "Create a free NaraRouter account, link your Telegram (required before /v1 answers), then paste the key here as a Bearer token.", apiHint: "OpenAI-compatible endpoint at https://router.bynara.id/v1. Free-tier models are pinned; others need credit.", }, diff --git a/tests/unit/autoCombo/strict-zero-cost-filter.test.ts b/tests/unit/autoCombo/strict-zero-cost-filter.test.ts index 59ab8c226c..6966ec6f94 100644 --- a/tests/unit/autoCombo/strict-zero-cost-filter.test.ts +++ b/tests/unit/autoCombo/strict-zero-cost-filter.test.ts @@ -50,7 +50,8 @@ const KEYLESS = { }; // A real quota-based entry with hardStopGuaranteed: true (added by this feature), // as a concrete single-connection candidate. -const QUOTA_SAFE = { provider: "groq", model: "llama-3.3-70b-versatile", connectionId: REAL_CONN }; +// 2026-09-02: was groq/llama-3.3-70b-versatile, retired from the Groq free tier on 2026-08-16. +const QUOTA_SAFE = { provider: "groq", model: "openai/gpt-oss-120b", connectionId: REAL_CONN }; // A real quota-based entry WITHOUT hardStopGuaranteed (agentrouter: one-time-initial, // no usage adapter, no documented "no credit card" claim — must never pass). const QUOTA_UNGUARANTEED = { @@ -69,7 +70,7 @@ const PAID = { provider: "openai", model: "gpt-4o", connectionId: REAL_CONN }; test("sanity: fixtures exist in the real catalog with the metadata these tests assume", () => { const groqEntry = FREE_MODEL_BUDGETS.find( - (m) => m.provider === "groq" && m.modelId === "llama-3.3-70b-versatile" + (m) => m.provider === "groq" && m.modelId === "openai/gpt-oss-120b" ); assert.equal(groqEntry?.hardStopGuaranteed, true, "groq must carry hardStopGuaranteed: true"); const arEntry = FREE_MODEL_BUDGETS.find( @@ -121,7 +122,7 @@ test("model absent from the free catalog is excluded even under a known provider // 5. quota SAFE + fresh + hardStop → PASS test("quota-based candidate with hardStopGuaranteed, fresh SAFE state above threshold passes", () => { const entry = FREE_MODEL_BUDGETS.find( - (m) => m.provider === "groq" && m.modelId === "llama-3.3-70b-versatile" + (m) => m.provider === "groq" && m.modelId === "openai/gpt-oss-120b" ); assert.deepEqual( evaluateCandidateConnections( @@ -137,7 +138,7 @@ test("quota-based candidate with hardStopGuaranteed, fresh SAFE state above thre // 6. quota exhausted → EXCLUDE test("EXHAUSTED status excludes even with a fresh checkedAt", () => { const entry = FREE_MODEL_BUDGETS.find( - (m) => m.provider === "groq" && m.modelId === "llama-3.3-70b-versatile" + (m) => m.provider === "groq" && m.modelId === "openai/gpt-oss-120b" ); const state = freshState({ status: "EXHAUSTED", remainingFreeAllowance: 0 }); assert.deepEqual( @@ -149,7 +150,7 @@ test("EXHAUSTED status excludes even with a fresh checkedAt", () => { // 7. usage adapter absent (no state resolvable) → EXCLUDE test("quota-based candidate with no resolvable state is excluded, not assumed safe", () => { const entry = FREE_MODEL_BUDGETS.find( - (m) => m.provider === "groq" && m.modelId === "llama-3.3-70b-versatile" + (m) => m.provider === "groq" && m.modelId === "openai/gpt-oss-120b" ); assert.deepEqual( evaluateCandidateConnections(QUOTA_SAFE, entry, () => undefined, BASE_OPTIONS), @@ -162,7 +163,7 @@ test("quota-based candidate with no resolvable state is excluded, not assumed sa // here — same assertion as #7, the important contract is "never falls back to SAFE"). test("UNKNOWN status excludes", () => { const entry = FREE_MODEL_BUDGETS.find( - (m) => m.provider === "groq" && m.modelId === "llama-3.3-70b-versatile" + (m) => m.provider === "groq" && m.modelId === "openai/gpt-oss-120b" ); const state = freshState({ status: "UNKNOWN", remainingFreeAllowance: null }); assert.deepEqual( @@ -174,7 +175,7 @@ test("UNKNOWN status excludes", () => { // 9. usage state stale → EXCLUDE test("stale checkedAt excludes even when status is SAFE", () => { const entry = FREE_MODEL_BUDGETS.find( - (m) => m.provider === "groq" && m.modelId === "llama-3.3-70b-versatile" + (m) => m.provider === "groq" && m.modelId === "openai/gpt-oss-120b" ); const stale = freshState({ checkedAt: "2026-08-19T00:00:00.000Z" }); // >24h before NOW assert.deepEqual( diff --git a/tests/unit/free-providers-batch-2026-07.test.ts b/tests/unit/free-providers-batch-2026-07.test.ts index e58c6f5dd2..5c913d562e 100644 --- a/tests/unit/free-providers-batch-2026-07.test.ts +++ b/tests/unit/free-providers-batch-2026-07.test.ts @@ -47,12 +47,12 @@ test("providers with no published token quota never inflate the headline", () => } }); -test("nara is a single shared 5M/day pool, counted once", () => { +test("nara is a single shared 7M/day pool, counted once", () => { const rows = byProvider("nara"); assert.ok(rows.length >= 1); - // 5M tokens/day shared across all models => 150M/month, deduped by poolKey. + // 7M tokens/day shared across all plan models => 210M/month (re-audited 2026-09-02, GET /api/plans). assert.ok(rows.every((m) => m.poolKey === "nara-free")); - assert.ok(rows.every((m) => m.monthlyTokens === 150_000_000)); + assert.ok(rows.every((m) => m.monthlyTokens === 210_000_000)); assert.ok(rows.every((m) => m.freeType === "recurring-daily")); }); diff --git a/tests/unit/free-tier-catalog.test.ts b/tests/unit/free-tier-catalog.test.ts index 6f4b23e356..a2d61bd4b7 100644 --- a/tests/unit/free-tier-catalog.test.ts +++ b/tests/unit/free-tier-catalog.test.ts @@ -7,7 +7,7 @@ import { } from "../../open-sse/config/freeTierCatalog.ts"; test("FREE_TIER_BUDGETS holds positive integer monthly-token budgets", () => { - assert.ok(Object.keys(FREE_TIER_BUDGETS).length >= 19); + assert.ok(Object.keys(FREE_TIER_BUDGETS).length >= 18); // 2026-09-02: gemini + ollama-cloud left (no published cap), nara joined for (const [id, tokens] of Object.entries(FREE_TIER_BUDGETS)) { assert.ok(Number.isInteger(tokens) && tokens > 0, `${id} must be a positive integer`); } @@ -27,16 +27,20 @@ test("FREE_TIER_TOS marks proxy-prohibited providers as avoid", () => { test("computeFreeTierTotals sums the documented budgets", () => { const t = computeFreeTierTotals(); - assert.equal(t.providerCount, 19); - assert.ok(t.documentedMonthlyTokens >= 1_350_000_000); - assert.ok(t.documentedMonthlyTokens <= 1_450_000_000); + // 2026-09-02 re-audit: gemini + ollama-cloud left the legacy map (no published cap), nara joined; groq → 30M + assert.equal(t.providerCount, 18); + // 2026-09-02 re-audit: gemini + ollama-cloud left the legacy map (no published cap), nara joined; groq → 30M (legacy sum 1,505,025,000) + assert.ok(t.documentedMonthlyTokens >= 1_450_000_000); + assert.ok(t.documentedMonthlyTokens <= 1_550_000_000); assert.equal(typeof t.headline, "string"); - assert.match(t.headline, /1\.3/); + // 2026-09-02 re-audit: gemini + ollama-cloud left the legacy map (no published cap), nara joined; groq → 30M ("over 1.51B …") + assert.match(t.headline, /1\.5/); }); test("computeFreeTierTotals can exclude ToS-avoid providers", () => { const all = computeFreeTierTotals(); const clean = computeFreeTierTotals({ excludeTosAvoid: true }); assert.equal(all.documentedMonthlyTokens - clean.documentedMonthlyTokens, 25_000); - assert.equal(clean.providerCount, 18); + // 2026-09-02 re-audit: gemini + ollama-cloud left the legacy map (no published cap), nara joined; groq → 30M + assert.equal(clean.providerCount, 17); });