From aa12873686db1d466e157792150c487c0dfb7b2e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rouzbeh=E2=80=A0?= <78313022+rqzbeh@users.noreply.github.com> Date: Sat, 22 Aug 2026 22:56:38 +0330 Subject: [PATCH] fix(providers): remove Hack Club AI provider (#11118) (#11123) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cherry-picked the author's cleaned single-commit head onto the current tip. One fix applied pre-merge: the removal migration collided at number 161 with today's config_audit_log migration (#11103) — renumbered to 162_remove_hackclub_provider.sql. Focused tests: remove-hackclub-11118 + provider-metrics-deleted-provider green; check:provider-consistency OK (266/348/0). Provider removal requested by Hack Club maintainers (#11118). Thank you @rqzbeh! --- docs/reference/FREE_TIERS.md | 3 --- docs/reference/PROVIDER_REFERENCE.md | 1 - open-sse/config/freeModelCatalog.data.ts | 3 --- open-sse/config/providers/index.ts | 2 -- .../providers/registry/hackclub/index.ts | 19 ----------------- .../162_remove_hackclub_provider.sql | 21 +++++++++++++++++++ src/shared/constants/providers.ts | 2 -- tests/unit/remove-hackclub-11118.test.ts | 7 +++++++ 8 files changed, 28 insertions(+), 30 deletions(-) delete mode 100644 open-sse/config/providers/registry/hackclub/index.ts create mode 100644 src/lib/db/migrations/162_remove_hackclub_provider.sql create mode 100644 tests/unit/remove-hackclub-11118.test.ts diff --git a/docs/reference/FREE_TIERS.md b/docs/reference/FREE_TIERS.md index a0ff471915..927dccf720 100644 --- a/docs/reference/FREE_TIERS.md +++ b/docs/reference/FREE_TIERS.md @@ -120,7 +120,6 @@ A 50-agent web-research pass (official docs + last-7-days news, adversarially ve | `firecrawl` | caution | Cloud API ToS has no explicit personal-proxy prohibition found, but the open-source self-hosted version is AGPL-3.0 (re… | | `gemini` | caution | ToS explicitly states the free tier is for "developers building with Google AI models for professional or business purp… | | `groq` | caution | Services Agreement §6.3 prohibits reselling, sublicensing, or distributing API access; §3.2 bars reselling/leasing acco… | -| `hackclub` | caution | Service is explicitly scoped to Hack Club teen members building projects/learning; no public ToS found explicitly permi… | | `huggingchat` | caution | Hugging Face ToS does not explicitly ban personal self-hosted proxies, but supplemental terms (referenced but not fully… | | `huggingface` | caution | ToS grants a limited license to access/use the service; the document does not explicitly permit or forbid a single-user… | | `hyperbolic` | caution | ToS grants API access "solely for your own personal or internal business purposes" and explicitly prohibits licensing, … | @@ -222,7 +221,6 @@ A 50-agent web-research pass (official docs + last-7-days news, adversarially ve | `duckduckgo-web` | keyless | — | — | avoid | 6 | | `freemodel-dev` | keyless | — | — | unknown | 4 | | `friendliai` | keyless | — | — | avoid | 2 | -| `hackclub` | keyless | — | — | caution | 3 | | `iflytek` | keyless | — | — | avoid | 1 | | `inference-net` | keyless | — | — | caution | 3 | | `liquid` | keyless | — | — | unknown | 1 | @@ -280,7 +278,6 @@ A 50-agent web-research pass (official docs + last-7-days news, adversarially ve - **`gitlawb`** — The shipped freeNote "Free tier available" is effectively stale. The original free MiMo access was removed in May 2026; the only remaining "free" option is a temporary promotional model (Nemotron 3 U… - **`gitlawb-gmi`** — Partially still accurate — free tier exists but is now narrowed to a single model (Nemotron 3 Ultra) after MiMo free access was revoked in late May 2026. The shipped note "Free tier available" unders… - **`groq`** — The shipped freeNote "30 RPM / 14.4K RPD" is accurate only for llama-3.1-8b-instant. Most other models (including llama-3.3-70b-versatile) have a much lower 1K RPD cap. The note omits model-specific … -- **`hackclub`** — The "30+ models" count appears accurate and still matches. The core offering remains free for Hack Club members. No evidence of tightening — still "$0 ALWAYS FREE" per the homepage. The freeNote omit… - **`huggingchat`** — The shipped freeNote ("Free LLM chat — no subscription required. Rate limits apply.") is partially accurate but significantly understates the restrictions. The free tier now operates on a hard $0.10/… - **`huggingface`** — Significantly tightened. The shipped freeNote ("Free Inference API for thousands of models") implied unlimited/generous free access, but as of mid-2025 the free tier is capped at $0.10/month in recur… - **`hyperbolic`** — Our shipped freeNote says "$1-5 trial credits on signup" — the $1 trial credit portion is accurate, but the "$5" figure refers to the minimum deposit required to unlock GPU rental (not free credits g… diff --git a/docs/reference/PROVIDER_REFERENCE.md b/docs/reference/PROVIDER_REFERENCE.md index d8e32e8da4..8233890cad 100644 --- a/docs/reference/PROVIDER_REFERENCE.md +++ b/docs/reference/PROVIDER_REFERENCE.md @@ -213,7 +213,6 @@ Use the dashboard at `/dashboard/providers` to enable, configure, and test each | `glm-cn` | `glmcn` | GLM Coding (China) | API key | [link](https://open.bigmodel.cn) | — | | `glmt` | `glmt` | GLM Thinking | API key | [link](https://open.bigmodel.cn) | — | | `groq` | `groq` | Groq | API key | [link](https://groq.com) | Free tier: 30 RPM / 14.4K RPD — no credit card | -| `hackclub` | `hc` | Hackclub AI | API key, aggregator | [link](https://ai.hackclub.com) | Sign in with your Hack Club account at ai.hackclub.com. | | `haiper` | `hp` | Haiper | API key, video | [link](https://haiper.ai) | Get API key at haiper.ai/haiper-api | | `hcnsec` | `hcnsec` | Huancheng Public API | API key | [link](https://api.hcnsec.cn) | Get API key at api.hcnsec.cn | | `helixmind` | `helixmind` | HelixMind | API key, aggregator | [link](https://helixmind.online) | Previously circulated 3 RPM/50 RPD and no-card claims were not confirmed during the 2026-08-02 audit; current quota and billing require account verification. | diff --git a/open-sse/config/freeModelCatalog.data.ts b/open-sse/config/freeModelCatalog.data.ts index e6ef081aa7..38c17abf2d 100644 --- a/open-sse/config/freeModelCatalog.data.ts +++ b/open-sse/config/freeModelCatalog.data.ts @@ -194,9 +194,6 @@ export const FREE_MODEL_BUDGETS: FreeModelBudget[] = [ { 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 }, - { provider: "hackclub", modelId: "meta-llama/llama-3.3-70b-instruct", displayName: "Llama 3.3 70B", monthlyTokens: 0, creditTokens: 0, freeType: "keyless", poolKey: "hackclub", tos: "caution" }, - { provider: "hackclub", modelId: "mistralai/mistral-7b-instruct", displayName: "Mistral 7B", monthlyTokens: 0, creditTokens: 0, freeType: "keyless", poolKey: "hackclub", tos: "caution" }, - { provider: "hackclub", modelId: "deepseek-ai/deepseek-coder-33b", displayName: "DeepSeek Coder 33B", monthlyTokens: 0, creditTokens: 0, freeType: "keyless", poolKey: "hackclub", tos: "caution" }, { 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" }, diff --git a/open-sse/config/providers/index.ts b/open-sse/config/providers/index.ts index 00861b2422..b0135fa524 100644 --- a/open-sse/config/providers/index.ts +++ b/open-sse/config/providers/index.ts @@ -70,7 +70,6 @@ import { togetherProvider } from "./registry/together/index.ts"; import { cohereProvider } from "./registry/cohere/index.ts"; import { cursorProvider, cursor_apiProvider } from "./registry/cursor/index.ts"; import { volcengineProvider } from "./registry/volcengine/index.ts"; -import { hackclubProvider } from "./registry/hackclub/index.ts"; import { freetheaiProvider } from "./registry/freetheai/index.ts"; import { g4f_groqProvider } from "./registry/g4f-groq/index.ts"; import { g4f_geminiProvider } from "./registry/g4f-gemini/index.ts"; @@ -336,7 +335,6 @@ export const REGISTRY: Record = { cursor: cursorProvider, "cursor-api": cursor_apiProvider, volcengine: volcengineProvider, - hackclub: hackclubProvider, freetheai: freetheaiProvider, "g4f-groq": g4f_groqProvider, "g4f-gemini": g4f_geminiProvider, diff --git a/open-sse/config/providers/registry/hackclub/index.ts b/open-sse/config/providers/registry/hackclub/index.ts deleted file mode 100644 index 272ee5f86c..0000000000 --- a/open-sse/config/providers/registry/hackclub/index.ts +++ /dev/null @@ -1,19 +0,0 @@ -import type { RegistryEntry } from "../../shared.ts"; - -export const hackclubProvider: RegistryEntry = { - id: "hackclub", - alias: "hc", - format: "openai", - executor: "default", - baseUrl: "https://ai.hackclub.com/proxy/v1/chat/completions", - modelsUrl: "https://ai.hackclub.com/proxy/v1/models", - authType: "optional", - authHeader: "bearer", - passthroughModels: true, - defaultContextLength: 128000, - models: [ - { id: "meta-llama/llama-3.3-70b-instruct", name: "Llama 3.3 70B" }, - { id: "mistralai/mistral-7b-instruct", name: "Mistral 7B" }, - { id: "deepseek-ai/deepseek-coder-33b", name: "DeepSeek Coder 33B" }, - ], -}; diff --git a/src/lib/db/migrations/162_remove_hackclub_provider.sql b/src/lib/db/migrations/162_remove_hackclub_provider.sql new file mode 100644 index 0000000000..4dd20904e9 --- /dev/null +++ b/src/lib/db/migrations/162_remove_hackclub_provider.sql @@ -0,0 +1,21 @@ +-- 162_remove_hackclub_provider.sql +-- Hack Club AI provider was removed from OmniRoute at the request of Hack Club's +-- maintainers (#11118). Clean up any locally stored configuration for it. +-- Historical request and usage records are intentionally preserved under the +-- provider identity that existed when they were written. + +DELETE FROM provider_connections +WHERE provider = 'hackclub'; + +DELETE FROM registered_keys +WHERE provider = 'hackclub'; + +DELETE FROM provider_key_limits +WHERE provider = 'hackclub'; + +DELETE FROM discovery_results +WHERE provider_id = 'hackclub'; + +DELETE FROM key_value +WHERE namespace = 'customModels' + AND key = 'hackclub'; diff --git a/src/shared/constants/providers.ts b/src/shared/constants/providers.ts index 6b4fd86a50..5c058958e7 100644 --- a/src/shared/constants/providers.ts +++ b/src/shared/constants/providers.ts @@ -106,7 +106,6 @@ export const AGGREGATOR_PROVIDER_IDS = new Set([ "empower", "poe", "chutes", - "hackclub", "freetheai", "g4f-groq", "g4f-gemini", @@ -238,7 +237,6 @@ const EXPLICIT_OPTIONAL_APIKEY_PROVIDER_IDS = new Set([ "searxng-search", "firecrawl", "copilot-web", - "hackclub", "g4f-groq", "g4f-gemini", "g4f-pollinations", diff --git a/tests/unit/remove-hackclub-11118.test.ts b/tests/unit/remove-hackclub-11118.test.ts new file mode 100644 index 0000000000..9dc39fe1b3 --- /dev/null +++ b/tests/unit/remove-hackclub-11118.test.ts @@ -0,0 +1,7 @@ +import test from "node:test"; +import assert from "node:assert/strict"; +import { REGISTRY } from "../../open-sse/config/providers/index.ts"; + +test("hackclub provider is removed from REGISTRY", () => { + assert.equal("hackclub" in REGISTRY, false); +});