mirror of
https://github.com/diegosouzapw/OmniRoute.git
synced 2026-08-11 17:52:31 +03:00
refactor(providers): split audited gateway catalog
This commit is contained in:
@@ -1391,14 +1391,9 @@ export const oneproxyStatsTool: McpToolDefinition<
|
||||
sourceEndpoints: ["/api/settings/oneproxy"],
|
||||
};
|
||||
|
||||
// ============ Agent Skills Tools ============
|
||||
|
||||
// --- omniroute_agent_skills_list ---
|
||||
export const agentSkillsListInput = z.object({
|
||||
category: z
|
||||
.enum(["api", "cli", "config"])
|
||||
.optional()
|
||||
.describe("Filter by category: 'api', 'cli', or 'config'"),
|
||||
category: z.enum(["api", "cli", "config"]).optional().describe("Filter: api, cli, or config"),
|
||||
area: z.string().optional().describe("Filter by area (e.g. 'providers', 'models', 'cli-serve')"),
|
||||
});
|
||||
|
||||
@@ -1486,7 +1481,6 @@ export const agentSkillsGetTool: McpToolDefinition<
|
||||
sourceEndpoints: ["/api/agent-skills/:id", "/api/agent-skills/:id/raw"],
|
||||
};
|
||||
|
||||
// --- omniroute_agent_skills_coverage ---
|
||||
export const agentSkillsCoverageInput = z.object({}).describe("No parameters required");
|
||||
|
||||
export const agentSkillsCoverageOutput = z.object({
|
||||
|
||||
395
src/shared/constants/providers/apikey/audited-free-gateways.ts
Normal file
395
src/shared/constants/providers/apikey/audited-free-gateways.ts
Normal file
@@ -0,0 +1,395 @@
|
||||
/**
|
||||
* Audited free-tier gateway entries kept separate from the legacy gateway catalog
|
||||
* so the file-size ratchet remains modular.
|
||||
*/
|
||||
export const APIKEY_PROVIDERS_AUDITED_FREE = {
|
||||
"zylo-api": {
|
||||
id: "zylo-api",
|
||||
alias: "zylo",
|
||||
name: "Zylo API",
|
||||
icon: "hub",
|
||||
color: "#2563EB",
|
||||
textIcon: "ZY",
|
||||
passthroughModels: true,
|
||||
website: "https://zyloai.net",
|
||||
hasFree: true,
|
||||
freeNote:
|
||||
"Basic plan: 10 RPM, 7,200 requests/day and 200,000 tokens/day; limited to Basic text models.",
|
||||
apiHint:
|
||||
"Create a free Zylo API key at https://zyloai.net, then use https://api.zyloai.net/v1 as the OpenAI-compatible base URL.",
|
||||
},
|
||||
unorouter: {
|
||||
id: "unorouter",
|
||||
alias: "unorouter",
|
||||
name: "UnoRouter",
|
||||
icon: "router",
|
||||
color: "#7C3AED",
|
||||
textIcon: "UR",
|
||||
passthroughModels: true,
|
||||
website: "https://unorouter.com",
|
||||
hasFree: true,
|
||||
freeNote:
|
||||
"Models with the :free suffix do not debit balance; limit is 1 request/minute per free model per user.",
|
||||
apiHint:
|
||||
"Create an UnoRouter token, then use https://api.unorouter.com/v1 as the OpenAI-compatible base URL.",
|
||||
},
|
||||
fastrouter: {
|
||||
id: "fastrouter",
|
||||
alias: "fastrouter",
|
||||
name: "FastRouter",
|
||||
icon: "speed",
|
||||
color: "#F97316",
|
||||
textIcon: "FR",
|
||||
passthroughModels: true,
|
||||
website: "https://fastrouter.ai",
|
||||
hasFree: true,
|
||||
freeNote:
|
||||
"Models with the :free suffix allow 10 requests/day per organization and model; availability may change.",
|
||||
apiHint:
|
||||
"Create a FastRouter API key, then use https://api.fastrouter.ai/api/v1 as the OpenAI-compatible base URL.",
|
||||
},
|
||||
anyapi: {
|
||||
id: "anyapi",
|
||||
alias: "anyapi",
|
||||
name: "AnyAPI AI",
|
||||
icon: "hub",
|
||||
color: "#0EA5E9",
|
||||
textIcon: "AA",
|
||||
passthroughModels: true,
|
||||
website: "https://anyapi.ai",
|
||||
hasFree: true,
|
||||
freeNote:
|
||||
"Free plan: 100,000 ANY Tokens/day and 100 RPM for eligible Free/Basic models; no credit card required.",
|
||||
apiHint:
|
||||
"Create and verify an AnyAPI account, then use https://api.anyapi.ai/v1 as the OpenAI-compatible base URL.",
|
||||
},
|
||||
electronhub: {
|
||||
id: "electronhub",
|
||||
alias: "electronhub",
|
||||
name: "Electron Hub",
|
||||
icon: "hub",
|
||||
color: "#22C55E",
|
||||
textIcon: "EH",
|
||||
passthroughModels: true,
|
||||
website: "https://www.electronhub.ai",
|
||||
hasFree: true,
|
||||
freeNote:
|
||||
"Free plan: 5 RPM, $0.25 weekly credits and 10 Neutrinos/day for :free models; family budgets also apply.",
|
||||
apiHint:
|
||||
"Create a free API key at https://app.electronhub.ai, then use https://api.electronhub.ai/v1 as the OpenAI-compatible base URL.",
|
||||
},
|
||||
llmgateway: {
|
||||
id: "llmgateway",
|
||||
alias: "llmgateway",
|
||||
name: "LLM Gateway",
|
||||
icon: "router",
|
||||
color: "#6366F1",
|
||||
textIcon: "LG",
|
||||
passthroughModels: true,
|
||||
website: "https://llmgateway.io",
|
||||
hasFree: true,
|
||||
freeNote:
|
||||
"Hosted Free plan: free-priced models are limited to 5 requests per 10 minutes when the account has no credits.",
|
||||
apiHint:
|
||||
"Create an LLM Gateway API key, then use https://api.llmgateway.io/v1 as the OpenAI-compatible base URL.",
|
||||
},
|
||||
"llm-kiwi": {
|
||||
id: "llm-kiwi",
|
||||
alias: "llmkiwi",
|
||||
name: "LLM.Kiwi",
|
||||
icon: "hub",
|
||||
color: "#84CC16",
|
||||
textIcon: "LK",
|
||||
passthroughModels: true,
|
||||
website: "https://llm.kiwi",
|
||||
hasFree: true,
|
||||
freeNote:
|
||||
"Free plan exposes auto and hrLLM; the published 40 requests/hour limit applies to hrLLM.",
|
||||
apiHint:
|
||||
"Create a free LLM.Kiwi key, then use https://api.llm.kiwi/v1 as the OpenAI-compatible base URL.",
|
||||
},
|
||||
literouter: {
|
||||
id: "literouter",
|
||||
alias: "literouter",
|
||||
name: "LiteRouter",
|
||||
icon: "router",
|
||||
color: "#2563EB",
|
||||
textIcon: "LR",
|
||||
passthroughModels: true,
|
||||
website: "https://literouter.com",
|
||||
hasFree: true,
|
||||
freeNote:
|
||||
"Free model variants use the :free suffix; daily credit limits vary by model and free input is capped at 5,000 tokens.",
|
||||
apiHint:
|
||||
"Create a LiteRouter API key, then use https://api.literouter.com/v1 as the OpenAI-compatible base URL.",
|
||||
},
|
||||
"mnn-ai": {
|
||||
id: "mnn-ai",
|
||||
alias: "mnn-ai",
|
||||
name: "MNN AI",
|
||||
icon: "hub",
|
||||
color: "#0F766E",
|
||||
textIcon: "MNN",
|
||||
passthroughModels: true,
|
||||
website: "https://mnnai.ru",
|
||||
hasFree: true,
|
||||
freeNote: "Free plan: $1 monthly credits, 10 RPM and access only to models marked Free.",
|
||||
apiHint:
|
||||
"Create an MNN AI API key, then use the primary https://api.mnnai.ru/v1 OpenAI-compatible endpoint. Review jurisdiction, privacy and regional data-transfer requirements before use.",
|
||||
},
|
||||
"meganova-ai": {
|
||||
id: "meganova-ai",
|
||||
alias: "meganova-ai",
|
||||
name: "MegaNova AI",
|
||||
icon: "router",
|
||||
color: "#7C3AED",
|
||||
textIcon: "MN",
|
||||
passthroughModels: true,
|
||||
website: "https://meganova.ai",
|
||||
hasFree: true,
|
||||
freeNote:
|
||||
"Free signup without a card. Published Tier 1 per-model quotas total 550 requests/day; they are not a shared global pool, and paid overage can apply if enabled.",
|
||||
apiHint:
|
||||
"Create a MegaNova API key, then use https://api.meganova.ai/v1 as the OpenAI-compatible base URL.",
|
||||
},
|
||||
mixlayer: {
|
||||
id: "mixlayer",
|
||||
alias: "mixlayer",
|
||||
name: "Mixlayer",
|
||||
icon: "router",
|
||||
color: "#0EA5E9",
|
||||
textIcon: "MX",
|
||||
passthroughModels: true,
|
||||
website: "https://www.mixlayer.com",
|
||||
hasFree: true,
|
||||
freeNote:
|
||||
"The qwen/qwen3.5-4b-free model is free for prototyping and rate-limited; no fixed public RPM or daily quota is confirmed.",
|
||||
apiHint:
|
||||
"Create a Mixlayer API key, then use https://models.mixlayer.ai/v1 as the OpenAI-compatible base URL.",
|
||||
},
|
||||
speka: {
|
||||
id: "speka",
|
||||
alias: "speka",
|
||||
name: "Speka AI",
|
||||
icon: "router",
|
||||
color: "#DB2777",
|
||||
textIcon: "SP",
|
||||
passthroughModels: true,
|
||||
website: "https://speka.me",
|
||||
hasFree: true,
|
||||
freeNote:
|
||||
"Free plan: $1 monthly usage, 10 RPM, one API key and access to open models and the playground; no card required.",
|
||||
apiHint:
|
||||
"Create a Speka API key, then use https://speka.me/v1 as the OpenAI-compatible base URL. Confirm current model availability and overage settings before use.",
|
||||
},
|
||||
tokenreply: {
|
||||
id: "tokenreply",
|
||||
alias: "tokenreply",
|
||||
name: "TokenReply",
|
||||
icon: "router",
|
||||
color: "#3B82F6",
|
||||
textIcon: "TR",
|
||||
passthroughModels: true,
|
||||
website: "https://www.tokenreply.com",
|
||||
hasFree: true,
|
||||
freeNote:
|
||||
"Free-tagged models have model- and campaign-specific daily limits; no fixed global free quota is published.",
|
||||
apiHint:
|
||||
"Create a TokenReply token, then use https://api.tokenreply.com/v1 as the OpenAI-compatible base URL and confirm the selected model's current limit.",
|
||||
},
|
||||
"yolo-auto": {
|
||||
id: "yolo-auto",
|
||||
alias: "yolo-auto",
|
||||
name: "Yolo-Auto",
|
||||
icon: "auto_awesome",
|
||||
color: "#F59E0B",
|
||||
textIcon: "YA",
|
||||
passthroughModels: true,
|
||||
website: "https://yolo-auto.com",
|
||||
hasFree: true,
|
||||
freeNote:
|
||||
"Free API access is request-limited and intended for testing; no numeric daily quota is published and free access is not promised indefinitely.",
|
||||
apiHint:
|
||||
"Create a yolo_ API key, then use https://yolo-auto.com/v1 as the OpenAI-compatible base URL.",
|
||||
},
|
||||
dxnt: {
|
||||
id: "dxnt",
|
||||
alias: "dxnt",
|
||||
name: "DXNT / DX Token",
|
||||
icon: "hub",
|
||||
color: "#111827",
|
||||
textIcon: "DX",
|
||||
passthroughModels: true,
|
||||
website: "https://www.dxnt.com",
|
||||
hasFree: true,
|
||||
freeNote:
|
||||
"Free accounts are documented at 100 calls/day; the quota may increase through invitations and can vary by account.",
|
||||
apiHint:
|
||||
"Create a DXNT API key, then use https://www.dxnt.com/v1 as the OpenAI-compatible base URL.",
|
||||
},
|
||||
"cloudcode-one": {
|
||||
id: "cloudcode-one",
|
||||
alias: "cloudcode-one",
|
||||
name: "CloudCode.ONE",
|
||||
icon: "router",
|
||||
color: "#6366F1",
|
||||
textIcon: "CC",
|
||||
passthroughModels: true,
|
||||
website: "https://cloudcode.one",
|
||||
hasFree: true,
|
||||
freeNote:
|
||||
"Published free models include glm-4.7-flash and glm-4.6v-flash; no numeric quota is published, and key creation may require credit or a coupon.",
|
||||
apiHint:
|
||||
"Create a CloudCode.ONE key, then use https://api.cloudcode.one/v1 as the OpenAI-compatible base URL. Key issuance may require credit or a coupon.",
|
||||
},
|
||||
ofoxai: {
|
||||
id: "ofoxai",
|
||||
alias: "ofoxai",
|
||||
name: "OfoxAI",
|
||||
icon: "router",
|
||||
color: "#0F766E",
|
||||
textIcon: "OF",
|
||||
passthroughModels: true,
|
||||
website: "https://ofox.ai",
|
||||
hasFree: true,
|
||||
freeNote:
|
||||
"The current catalog advertises 10+ free models without a public numeric quota; review upstream provenance, retention and training terms before production use.",
|
||||
apiHint:
|
||||
"Create an OfoxAI Bearer key, then use https://api.ofox.ai/v1 as the OpenAI-compatible base URL. This integration covers the OpenAI surface only.",
|
||||
},
|
||||
zerolimitai: {
|
||||
id: "zerolimitai",
|
||||
alias: "zerolimitai",
|
||||
name: "ZeroLimitAI",
|
||||
icon: "router",
|
||||
color: "#475569",
|
||||
textIcon: "ZL",
|
||||
passthroughModels: true,
|
||||
website: "https://www.zerolimitai.com",
|
||||
hasFree: true,
|
||||
freeNote:
|
||||
"Temporary free trial is advertised, but official pages conflict between 3 and 7 days; a 100-calls/day claim is not treated as permanent.",
|
||||
apiHint:
|
||||
"Create a ZeroLimitAI Bearer token, then use https://www.zerolimitai.com/api/v1 as the OpenAI-compatible base URL.",
|
||||
},
|
||||
chatanywhere: {
|
||||
id: "chatanywhere",
|
||||
alias: "chatanywhere",
|
||||
name: "ChatAnywhere",
|
||||
icon: "router",
|
||||
color: "#2563EB",
|
||||
textIcon: "CA",
|
||||
passthroughModels: true,
|
||||
website: "https://chatanywhere.tech",
|
||||
hasFree: true,
|
||||
freeNote:
|
||||
"Personal, educational or research use only: public documentation cites 10,000 points/day and 200 requests/day per IP/key; do not use for commercial traffic.",
|
||||
apiHint:
|
||||
"Create a ChatAnywhere key linked to GitHub, then use https://api.chatanywhere.org/v1 outside China. Review the non-commercial terms before enabling it.",
|
||||
},
|
||||
helyxai: {
|
||||
id: "helyxai",
|
||||
alias: "helyxai",
|
||||
name: "Helyx AI",
|
||||
icon: "hub",
|
||||
color: "#7C3AED",
|
||||
textIcon: "HX",
|
||||
passthroughModels: true,
|
||||
website: "https://helyxai.space",
|
||||
hasFree: true,
|
||||
freeNote:
|
||||
"Operational Free plan documents 100,000 tokens/day; the site's separate 2M+ marketing claim conflicts and is not treated as a quota guarantee.",
|
||||
apiHint:
|
||||
"Create a Helyx AI Bearer key, then use https://helyxai.space/v1 as the OpenAI-compatible base URL. Review terms and data retention first.",
|
||||
},
|
||||
auriko: {
|
||||
id: "auriko",
|
||||
alias: "auriko",
|
||||
name: "Auriko",
|
||||
icon: "hub",
|
||||
color: "#0891B2",
|
||||
textIcon: "AU",
|
||||
passthroughModels: true,
|
||||
website: "https://www.auriko.ai",
|
||||
hasFree: true,
|
||||
freeNote:
|
||||
"Free plan publishes 1,000 Platform RPM and 10,000 BYOK RPM. Platform inference still passes through provider cost; this is not a free-token pool or unlimited free inference.",
|
||||
apiHint:
|
||||
"Create an Auriko key with the ak_ prefix, then use https://api.auriko.ai/v1 as the OpenAI-compatible base URL. BYOK and platform credits have different cost semantics.",
|
||||
},
|
||||
"poixe-ai": {
|
||||
id: "poixe-ai",
|
||||
alias: "poixe-ai",
|
||||
name: "Poixe AI",
|
||||
icon: "router",
|
||||
color: "#EA580C",
|
||||
textIcon: "PX",
|
||||
passthroughModels: true,
|
||||
website: "https://poixe.com",
|
||||
hasFree: true,
|
||||
freeNote:
|
||||
"Current public free limits are small and model-group specific: 2 RPM/5 RPD for large-cup models and 20 RPM/50 RPD for small-cup models.",
|
||||
apiHint:
|
||||
"Create a Poixe Bearer key, then use https://api.poixe.com/v1 as the OpenAI-compatible base URL. Treat free model provenance and regional availability as experimental.",
|
||||
},
|
||||
"naga-ai": {
|
||||
id: "naga-ai",
|
||||
alias: "naga-ai",
|
||||
name: "Naga AI",
|
||||
icon: "router",
|
||||
color: "#059669",
|
||||
textIcon: "NA",
|
||||
passthroughModels: true,
|
||||
website: "https://naga.ac",
|
||||
hasFree: true,
|
||||
freeNote:
|
||||
"Models marked :free are publicly listed, but no numeric quota is confirmed. Naga's policy warns that free-tier prompts and outputs may be collected or used for training.",
|
||||
apiHint:
|
||||
"Create a Naga AI Bearer key, then use https://api.naga.ac/v1 as the OpenAI-compatible base URL. Never send sensitive data to the free tier without accepting its training policy.",
|
||||
},
|
||||
"chat-oripe": {
|
||||
id: "chat-oripe",
|
||||
alias: "chat-oripe",
|
||||
name: "Chat Oripe",
|
||||
icon: "router",
|
||||
color: "#64748B",
|
||||
textIcon: "CO",
|
||||
passthroughModels: true,
|
||||
website: "https://api.oriper.com",
|
||||
hasFree: true,
|
||||
freeNote:
|
||||
"Official metadata advertises 2M tokens/month, but the public site and documentation were blocked during audit; treat the quota and brand mapping as unconfirmed.",
|
||||
apiHint:
|
||||
"Use https://api.oriper.com/v1 only after confirming the provider's current documentation, terms and key issuance. No quota is guaranteed by this catalog.",
|
||||
},
|
||||
freeinference: {
|
||||
id: "freeinference",
|
||||
alias: "freeinference",
|
||||
name: "FreeInference",
|
||||
icon: "science",
|
||||
color: "#8B5CF6",
|
||||
textIcon: "FI",
|
||||
passthroughModels: true,
|
||||
website: "https://freeinference.org",
|
||||
hasFree: true,
|
||||
freeNote:
|
||||
"Free research access without a card; non-Harvard applicants require manual approval and no numeric quota is publicly guaranteed.",
|
||||
apiHint:
|
||||
"Apply for a FreeInference key, then use https://freeinference.org/v1 as the OpenAI-compatible base URL. Terms allow prompt/response logging and possible publication of anonymized research data; never send sensitive or production data.",
|
||||
},
|
||||
"free-ai": {
|
||||
id: "free-ai",
|
||||
alias: "free-ai",
|
||||
name: "Free.ai",
|
||||
icon: "hub",
|
||||
color: "#16A34A",
|
||||
textIcon: "FA",
|
||||
passthroughModels: true,
|
||||
website: "https://free.ai",
|
||||
hasFree: true,
|
||||
freeNote:
|
||||
"30,000 tokens/day cover self-hosted models after email verification. Usage beyond the pool can bill at raw cost, and premium external models are paid.",
|
||||
apiHint:
|
||||
"Create an sk-free- key, then use the nonstandard but OpenAI-shaped https://api.free.ai/v1/chat/ endpoint. Select a self-hosted zero-price model to stay within the free pool.",
|
||||
},
|
||||
};
|
||||
@@ -2,6 +2,8 @@
|
||||
* APIKEY provider catalog — gateways family (aggregators, multi-model routers & API marketplaces).
|
||||
* Pure data; merged by apikey/index.ts via spread (god-file decomposition; semantic split).
|
||||
*/
|
||||
import { APIKEY_PROVIDERS_AUDITED_FREE } from "./audited-free-gateways";
|
||||
|
||||
export const APIKEY_PROVIDERS_GATEWAYS = {
|
||||
// Cheaper Inference (https://cheaperinference.com) — OSS-sponsor gateway.
|
||||
// Cost-ranked reseller of 42 upstream models (Anthropic/OpenAI/Google/Moonshot/
|
||||
@@ -95,395 +97,7 @@ export const APIKEY_PROVIDERS_GATEWAYS = {
|
||||
"Create an API key at https://app.requesty.ai, then paste it here as a Bearer token. " +
|
||||
"OpenAI-compatible endpoint at https://router.requesty.ai/v1, with a live /v1/models catalog.",
|
||||
},
|
||||
"zylo-api": {
|
||||
id: "zylo-api",
|
||||
alias: "zylo",
|
||||
name: "Zylo API",
|
||||
icon: "hub",
|
||||
color: "#2563EB",
|
||||
textIcon: "ZY",
|
||||
passthroughModels: true,
|
||||
website: "https://zyloai.net",
|
||||
hasFree: true,
|
||||
freeNote:
|
||||
"Basic plan: 10 RPM, 7,200 requests/day and 200,000 tokens/day; limited to Basic text models.",
|
||||
apiHint:
|
||||
"Create a free Zylo API key at https://zyloai.net, then use https://api.zyloai.net/v1 as the OpenAI-compatible base URL.",
|
||||
},
|
||||
unorouter: {
|
||||
id: "unorouter",
|
||||
alias: "unorouter",
|
||||
name: "UnoRouter",
|
||||
icon: "router",
|
||||
color: "#7C3AED",
|
||||
textIcon: "UR",
|
||||
passthroughModels: true,
|
||||
website: "https://unorouter.com",
|
||||
hasFree: true,
|
||||
freeNote:
|
||||
"Models with the :free suffix do not debit balance; limit is 1 request/minute per free model per user.",
|
||||
apiHint:
|
||||
"Create an UnoRouter token, then use https://api.unorouter.com/v1 as the OpenAI-compatible base URL.",
|
||||
},
|
||||
fastrouter: {
|
||||
id: "fastrouter",
|
||||
alias: "fastrouter",
|
||||
name: "FastRouter",
|
||||
icon: "speed",
|
||||
color: "#F97316",
|
||||
textIcon: "FR",
|
||||
passthroughModels: true,
|
||||
website: "https://fastrouter.ai",
|
||||
hasFree: true,
|
||||
freeNote:
|
||||
"Models with the :free suffix allow 10 requests/day per organization and model; availability may change.",
|
||||
apiHint:
|
||||
"Create a FastRouter API key, then use https://api.fastrouter.ai/api/v1 as the OpenAI-compatible base URL.",
|
||||
},
|
||||
anyapi: {
|
||||
id: "anyapi",
|
||||
alias: "anyapi",
|
||||
name: "AnyAPI AI",
|
||||
icon: "hub",
|
||||
color: "#0EA5E9",
|
||||
textIcon: "AA",
|
||||
passthroughModels: true,
|
||||
website: "https://anyapi.ai",
|
||||
hasFree: true,
|
||||
freeNote:
|
||||
"Free plan: 100,000 ANY Tokens/day and 100 RPM for eligible Free/Basic models; no credit card required.",
|
||||
apiHint:
|
||||
"Create and verify an AnyAPI account, then use https://api.anyapi.ai/v1 as the OpenAI-compatible base URL.",
|
||||
},
|
||||
electronhub: {
|
||||
id: "electronhub",
|
||||
alias: "electronhub",
|
||||
name: "Electron Hub",
|
||||
icon: "hub",
|
||||
color: "#22C55E",
|
||||
textIcon: "EH",
|
||||
passthroughModels: true,
|
||||
website: "https://www.electronhub.ai",
|
||||
hasFree: true,
|
||||
freeNote:
|
||||
"Free plan: 5 RPM, $0.25 weekly credits and 10 Neutrinos/day for :free models; family budgets also apply.",
|
||||
apiHint:
|
||||
"Create a free API key at https://app.electronhub.ai, then use https://api.electronhub.ai/v1 as the OpenAI-compatible base URL.",
|
||||
},
|
||||
llmgateway: {
|
||||
id: "llmgateway",
|
||||
alias: "llmgateway",
|
||||
name: "LLM Gateway",
|
||||
icon: "router",
|
||||
color: "#6366F1",
|
||||
textIcon: "LG",
|
||||
passthroughModels: true,
|
||||
website: "https://llmgateway.io",
|
||||
hasFree: true,
|
||||
freeNote:
|
||||
"Hosted Free plan: free-priced models are limited to 5 requests per 10 minutes when the account has no credits.",
|
||||
apiHint:
|
||||
"Create an LLM Gateway API key, then use https://api.llmgateway.io/v1 as the OpenAI-compatible base URL.",
|
||||
},
|
||||
"llm-kiwi": {
|
||||
id: "llm-kiwi",
|
||||
alias: "llmkiwi",
|
||||
name: "LLM.Kiwi",
|
||||
icon: "hub",
|
||||
color: "#84CC16",
|
||||
textIcon: "LK",
|
||||
passthroughModels: true,
|
||||
website: "https://llm.kiwi",
|
||||
hasFree: true,
|
||||
freeNote:
|
||||
"Free plan exposes auto and hrLLM; the published 40 requests/hour limit applies to hrLLM.",
|
||||
apiHint:
|
||||
"Create a free LLM.Kiwi key, then use https://api.llm.kiwi/v1 as the OpenAI-compatible base URL.",
|
||||
},
|
||||
literouter: {
|
||||
id: "literouter",
|
||||
alias: "literouter",
|
||||
name: "LiteRouter",
|
||||
icon: "router",
|
||||
color: "#2563EB",
|
||||
textIcon: "LR",
|
||||
passthroughModels: true,
|
||||
website: "https://literouter.com",
|
||||
hasFree: true,
|
||||
freeNote:
|
||||
"Free model variants use the :free suffix; daily credit limits vary by model and free input is capped at 5,000 tokens.",
|
||||
apiHint:
|
||||
"Create a LiteRouter API key, then use https://api.literouter.com/v1 as the OpenAI-compatible base URL.",
|
||||
},
|
||||
"mnn-ai": {
|
||||
id: "mnn-ai",
|
||||
alias: "mnn-ai",
|
||||
name: "MNN AI",
|
||||
icon: "hub",
|
||||
color: "#0F766E",
|
||||
textIcon: "MNN",
|
||||
passthroughModels: true,
|
||||
website: "https://mnnai.ru",
|
||||
hasFree: true,
|
||||
freeNote: "Free plan: $1 monthly credits, 10 RPM and access only to models marked Free.",
|
||||
apiHint:
|
||||
"Create an MNN AI API key, then use the primary https://api.mnnai.ru/v1 OpenAI-compatible endpoint. Review jurisdiction, privacy and regional data-transfer requirements before use.",
|
||||
},
|
||||
"meganova-ai": {
|
||||
id: "meganova-ai",
|
||||
alias: "meganova-ai",
|
||||
name: "MegaNova AI",
|
||||
icon: "router",
|
||||
color: "#7C3AED",
|
||||
textIcon: "MN",
|
||||
passthroughModels: true,
|
||||
website: "https://meganova.ai",
|
||||
hasFree: true,
|
||||
freeNote:
|
||||
"Free signup without a card. Published Tier 1 per-model quotas total 550 requests/day; they are not a shared global pool, and paid overage can apply if enabled.",
|
||||
apiHint:
|
||||
"Create a MegaNova API key, then use https://api.meganova.ai/v1 as the OpenAI-compatible base URL.",
|
||||
},
|
||||
mixlayer: {
|
||||
id: "mixlayer",
|
||||
alias: "mixlayer",
|
||||
name: "Mixlayer",
|
||||
icon: "router",
|
||||
color: "#0EA5E9",
|
||||
textIcon: "MX",
|
||||
passthroughModels: true,
|
||||
website: "https://www.mixlayer.com",
|
||||
hasFree: true,
|
||||
freeNote:
|
||||
"The qwen/qwen3.5-4b-free model is free for prototyping and rate-limited; no fixed public RPM or daily quota is confirmed.",
|
||||
apiHint:
|
||||
"Create a Mixlayer API key, then use https://models.mixlayer.ai/v1 as the OpenAI-compatible base URL.",
|
||||
},
|
||||
speka: {
|
||||
id: "speka",
|
||||
alias: "speka",
|
||||
name: "Speka AI",
|
||||
icon: "router",
|
||||
color: "#DB2777",
|
||||
textIcon: "SP",
|
||||
passthroughModels: true,
|
||||
website: "https://speka.me",
|
||||
hasFree: true,
|
||||
freeNote:
|
||||
"Free plan: $1 monthly usage, 10 RPM, one API key and access to open models and the playground; no card required.",
|
||||
apiHint:
|
||||
"Create a Speka API key, then use https://speka.me/v1 as the OpenAI-compatible base URL. Confirm current model availability and overage settings before use.",
|
||||
},
|
||||
tokenreply: {
|
||||
id: "tokenreply",
|
||||
alias: "tokenreply",
|
||||
name: "TokenReply",
|
||||
icon: "router",
|
||||
color: "#3B82F6",
|
||||
textIcon: "TR",
|
||||
passthroughModels: true,
|
||||
website: "https://www.tokenreply.com",
|
||||
hasFree: true,
|
||||
freeNote:
|
||||
"Free-tagged models have model- and campaign-specific daily limits; no fixed global free quota is published.",
|
||||
apiHint:
|
||||
"Create a TokenReply token, then use https://api.tokenreply.com/v1 as the OpenAI-compatible base URL and confirm the selected model's current limit.",
|
||||
},
|
||||
"yolo-auto": {
|
||||
id: "yolo-auto",
|
||||
alias: "yolo-auto",
|
||||
name: "Yolo-Auto",
|
||||
icon: "auto_awesome",
|
||||
color: "#F59E0B",
|
||||
textIcon: "YA",
|
||||
passthroughModels: true,
|
||||
website: "https://yolo-auto.com",
|
||||
hasFree: true,
|
||||
freeNote:
|
||||
"Free API access is request-limited and intended for testing; no numeric daily quota is published and free access is not promised indefinitely.",
|
||||
apiHint:
|
||||
"Create a yolo_ API key, then use https://yolo-auto.com/v1 as the OpenAI-compatible base URL.",
|
||||
},
|
||||
dxnt: {
|
||||
id: "dxnt",
|
||||
alias: "dxnt",
|
||||
name: "DXNT / DX Token",
|
||||
icon: "hub",
|
||||
color: "#111827",
|
||||
textIcon: "DX",
|
||||
passthroughModels: true,
|
||||
website: "https://www.dxnt.com",
|
||||
hasFree: true,
|
||||
freeNote:
|
||||
"Free accounts are documented at 100 calls/day; the quota may increase through invitations and can vary by account.",
|
||||
apiHint:
|
||||
"Create a DXNT API key, then use https://www.dxnt.com/v1 as the OpenAI-compatible base URL.",
|
||||
},
|
||||
"cloudcode-one": {
|
||||
id: "cloudcode-one",
|
||||
alias: "cloudcode-one",
|
||||
name: "CloudCode.ONE",
|
||||
icon: "router",
|
||||
color: "#6366F1",
|
||||
textIcon: "CC",
|
||||
passthroughModels: true,
|
||||
website: "https://cloudcode.one",
|
||||
hasFree: true,
|
||||
freeNote:
|
||||
"Published free models include glm-4.7-flash and glm-4.6v-flash; no numeric quota is published, and key creation may require credit or a coupon.",
|
||||
apiHint:
|
||||
"Create a CloudCode.ONE key, then use https://api.cloudcode.one/v1 as the OpenAI-compatible base URL. Key issuance may require credit or a coupon.",
|
||||
},
|
||||
ofoxai: {
|
||||
id: "ofoxai",
|
||||
alias: "ofoxai",
|
||||
name: "OfoxAI",
|
||||
icon: "router",
|
||||
color: "#0F766E",
|
||||
textIcon: "OF",
|
||||
passthroughModels: true,
|
||||
website: "https://ofox.ai",
|
||||
hasFree: true,
|
||||
freeNote:
|
||||
"The current catalog advertises 10+ free models without a public numeric quota; review upstream provenance, retention and training terms before production use.",
|
||||
apiHint:
|
||||
"Create an OfoxAI Bearer key, then use https://api.ofox.ai/v1 as the OpenAI-compatible base URL. This integration covers the OpenAI surface only.",
|
||||
},
|
||||
zerolimitai: {
|
||||
id: "zerolimitai",
|
||||
alias: "zerolimitai",
|
||||
name: "ZeroLimitAI",
|
||||
icon: "router",
|
||||
color: "#475569",
|
||||
textIcon: "ZL",
|
||||
passthroughModels: true,
|
||||
website: "https://www.zerolimitai.com",
|
||||
hasFree: true,
|
||||
freeNote:
|
||||
"Temporary free trial is advertised, but official pages conflict between 3 and 7 days; a 100-calls/day claim is not treated as permanent.",
|
||||
apiHint:
|
||||
"Create a ZeroLimitAI Bearer token, then use https://www.zerolimitai.com/api/v1 as the OpenAI-compatible base URL.",
|
||||
},
|
||||
chatanywhere: {
|
||||
id: "chatanywhere",
|
||||
alias: "chatanywhere",
|
||||
name: "ChatAnywhere",
|
||||
icon: "router",
|
||||
color: "#2563EB",
|
||||
textIcon: "CA",
|
||||
passthroughModels: true,
|
||||
website: "https://chatanywhere.tech",
|
||||
hasFree: true,
|
||||
freeNote:
|
||||
"Personal, educational or research use only: public documentation cites 10,000 points/day and 200 requests/day per IP/key; do not use for commercial traffic.",
|
||||
apiHint:
|
||||
"Create a ChatAnywhere key linked to GitHub, then use https://api.chatanywhere.org/v1 outside China. Review the non-commercial terms before enabling it.",
|
||||
},
|
||||
helyxai: {
|
||||
id: "helyxai",
|
||||
alias: "helyxai",
|
||||
name: "Helyx AI",
|
||||
icon: "hub",
|
||||
color: "#7C3AED",
|
||||
textIcon: "HX",
|
||||
passthroughModels: true,
|
||||
website: "https://helyxai.space",
|
||||
hasFree: true,
|
||||
freeNote:
|
||||
"Operational Free plan documents 100,000 tokens/day; the site's separate 2M+ marketing claim conflicts and is not treated as a quota guarantee.",
|
||||
apiHint:
|
||||
"Create a Helyx AI Bearer key, then use https://helyxai.space/v1 as the OpenAI-compatible base URL. Review terms and data retention first.",
|
||||
},
|
||||
auriko: {
|
||||
id: "auriko",
|
||||
alias: "auriko",
|
||||
name: "Auriko",
|
||||
icon: "hub",
|
||||
color: "#0891B2",
|
||||
textIcon: "AU",
|
||||
passthroughModels: true,
|
||||
website: "https://www.auriko.ai",
|
||||
hasFree: true,
|
||||
freeNote:
|
||||
"Free plan publishes 1,000 Platform RPM and 10,000 BYOK RPM. Platform inference still passes through provider cost; this is not a free-token pool or unlimited free inference.",
|
||||
apiHint:
|
||||
"Create an Auriko key with the ak_ prefix, then use https://api.auriko.ai/v1 as the OpenAI-compatible base URL. BYOK and platform credits have different cost semantics.",
|
||||
},
|
||||
"poixe-ai": {
|
||||
id: "poixe-ai",
|
||||
alias: "poixe-ai",
|
||||
name: "Poixe AI",
|
||||
icon: "router",
|
||||
color: "#EA580C",
|
||||
textIcon: "PX",
|
||||
passthroughModels: true,
|
||||
website: "https://poixe.com",
|
||||
hasFree: true,
|
||||
freeNote:
|
||||
"Current public free limits are small and model-group specific: 2 RPM/5 RPD for large-cup models and 20 RPM/50 RPD for small-cup models.",
|
||||
apiHint:
|
||||
"Create a Poixe Bearer key, then use https://api.poixe.com/v1 as the OpenAI-compatible base URL. Treat free model provenance and regional availability as experimental.",
|
||||
},
|
||||
"naga-ai": {
|
||||
id: "naga-ai",
|
||||
alias: "naga-ai",
|
||||
name: "Naga AI",
|
||||
icon: "router",
|
||||
color: "#059669",
|
||||
textIcon: "NA",
|
||||
passthroughModels: true,
|
||||
website: "https://naga.ac",
|
||||
hasFree: true,
|
||||
freeNote:
|
||||
"Models marked :free are publicly listed, but no numeric quota is confirmed. Naga's policy warns that free-tier prompts and outputs may be collected or used for training.",
|
||||
apiHint:
|
||||
"Create a Naga AI Bearer key, then use https://api.naga.ac/v1 as the OpenAI-compatible base URL. Never send sensitive data to the free tier without accepting its training policy.",
|
||||
},
|
||||
"chat-oripe": {
|
||||
id: "chat-oripe",
|
||||
alias: "chat-oripe",
|
||||
name: "Chat Oripe",
|
||||
icon: "router",
|
||||
color: "#64748B",
|
||||
textIcon: "CO",
|
||||
passthroughModels: true,
|
||||
website: "https://api.oriper.com",
|
||||
hasFree: true,
|
||||
freeNote:
|
||||
"Official metadata advertises 2M tokens/month, but the public site and documentation were blocked during audit; treat the quota and brand mapping as unconfirmed.",
|
||||
apiHint:
|
||||
"Use https://api.oriper.com/v1 only after confirming the provider's current documentation, terms and key issuance. No quota is guaranteed by this catalog.",
|
||||
},
|
||||
freeinference: {
|
||||
id: "freeinference",
|
||||
alias: "freeinference",
|
||||
name: "FreeInference",
|
||||
icon: "science",
|
||||
color: "#8B5CF6",
|
||||
textIcon: "FI",
|
||||
passthroughModels: true,
|
||||
website: "https://freeinference.org",
|
||||
hasFree: true,
|
||||
freeNote:
|
||||
"Free research access without a card; non-Harvard applicants require manual approval and no numeric quota is publicly guaranteed.",
|
||||
apiHint:
|
||||
"Apply for a FreeInference key, then use https://freeinference.org/v1 as the OpenAI-compatible base URL. Terms allow prompt/response logging and possible publication of anonymized research data; never send sensitive or production data.",
|
||||
},
|
||||
"free-ai": {
|
||||
id: "free-ai",
|
||||
alias: "free-ai",
|
||||
name: "Free.ai",
|
||||
icon: "hub",
|
||||
color: "#16A34A",
|
||||
textIcon: "FA",
|
||||
passthroughModels: true,
|
||||
website: "https://free.ai",
|
||||
hasFree: true,
|
||||
freeNote:
|
||||
"30,000 tokens/day cover self-hosted models after email verification. Usage beyond the pool can bill at raw cost, and premium external models are paid.",
|
||||
apiHint:
|
||||
"Create an sk-free- key, then use the nonstandard but OpenAI-shaped https://api.free.ai/v1/chat/ endpoint. Select a self-hosted zero-price model to stay within the free pool.",
|
||||
},
|
||||
...APIKEY_PROVIDERS_AUDITED_FREE,
|
||||
dgrid: {
|
||||
id: "dgrid",
|
||||
alias: "dgrid",
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
// Characterization of the providers.ts catalog split (god-file decomposition): the host became a
|
||||
// barrel that re-exports 10 data catalogs now living under constants/providers/*, and APIKEY is
|
||||
// merged from 6 semantic family files (apikey/<family>.ts). Locks: the public surface (every catalog
|
||||
// + helpers still exported), the spread-merge integrity (198 APIKEY entries, no loss/dup), and that
|
||||
// + helpers still exported), the spread-merge integrity (223 APIKEY entries, no loss/dup), and that
|
||||
// load-time Zod validation still runs. Pure-data move → behavior must be identical.
|
||||
// Count was 171 before obsolete provider removals (PR #6675: glhf/kluster/cablyai/inclusionai etc.,
|
||||
// 171->167) plus #6126 (ClinePass dual-auth): the API-key-only APIKEY_PROVIDERS_GATEWAYS entry was
|
||||
@@ -17,7 +17,8 @@
|
||||
// sarvam+plamo in regional) to 193, then #8170 (inception/typhoon — inception in frontier-labs,
|
||||
// typhoon in regional) to 195, then Firecrawl dual search+fetch under SEARCH_PROVIDERS.firecrawl
|
||||
// (removed specialty-media duplicate) to 194, #8861 (Xiaomi MiMo Token Plan, regional) to 195, and
|
||||
// the Cheaper Inference gateway (OSS-sponsor reseller, gateways family) to 198 (UnoRouter #9009, Raycast Pro #8895).
|
||||
// the Cheaper Inference gateway (OSS-sponsor reseller, gateways family) to 196, and the audited
|
||||
// free-tier gateway expansion added 27 entries, bringing the current total to 223.
|
||||
import { test } from "node:test";
|
||||
import assert from "node:assert/strict";
|
||||
|
||||
@@ -46,12 +47,12 @@ test("barrel still exports every catalog + key helpers", () => {
|
||||
}
|
||||
});
|
||||
|
||||
test("APIKEY_PROVIDERS merges the 6 family files into 199 entries (no loss / no dup)", async () => {
|
||||
test("APIKEY_PROVIDERS merges the 6 family files into 223 entries (no loss / no dup)", async () => {
|
||||
const keys = Object.keys((P as Record<string, object>).APIKEY_PROVIDERS);
|
||||
assert.equal(keys.length, 199);
|
||||
assert.equal(new Set(keys).size, 199, "duplicate keys after spread-merge");
|
||||
assert.equal(keys.length, 223);
|
||||
assert.equal(new Set(keys).size, 223, "duplicate keys after spread-merge");
|
||||
// the merged object's entry-count equals the sum of the 6 semantic family files; families are a
|
||||
// strict partition (every provider in exactly one), so the sum must be exactly 199.
|
||||
// strict partition (every provider in exactly one), so the sum must be exactly 223.
|
||||
const families: [string, string][] = [
|
||||
["gateways", "APIKEY_PROVIDERS_GATEWAYS"],
|
||||
["frontier-labs", "APIKEY_PROVIDERS_FRONTIER"],
|
||||
@@ -71,7 +72,7 @@ test("APIKEY_PROVIDERS merges the 6 family files into 199 entries (no loss / no
|
||||
seen.add(k);
|
||||
}
|
||||
}
|
||||
assert.equal(famTotal, 199, "families must partition all 199 providers");
|
||||
assert.equal(famTotal, 223, "families must partition all 223 providers");
|
||||
});
|
||||
|
||||
test("AI_PROVIDERS Proxy aggregates all sections; lookups resolve", () => {
|
||||
|
||||
Reference in New Issue
Block a user