fix(catalog): re-audit gemini, ollama-cloud, groq, nara and mistral against official pages

This commit is contained in:
diegosouzapw
2026-09-02 10:44:32 -03:00
parent ad8a136cfc
commit 2de08b39c9
8 changed files with 138 additions and 56 deletions

View File

@@ -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 <quem>`) 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" },
];

View File

@@ -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<string, number> = {
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,

View File

@@ -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" },
],
};

View File

@@ -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,
},
],
});

View File

@@ -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.",
},

View File

@@ -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(

View File

@@ -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"));
});

View File

@@ -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);
});