refactor(open-sse): registry consolidation + DRY media/oauth/adhoc cleanup

- Single-source registry: oauth clientId/tokenUrl, usage URLs, image/embed
  configs, search defaultModel, codex fixedPort, google token url derive.
- Remove 29 unused OmniRoute providers (registry 100→71); media intact.
- De-adhoc: codex literals → registry format/oauth flags; reasoningInject,
  image/embed openrouter headers + xai bodyFields config-driven.
- Add REGISTRY_TEMPLATE.js + expand PROVIDER_DEFAULTS/schema JSDoc.
- Baselines updated; PROVIDERS 62 + alias 90 byte-for-byte, golden snapshots.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
decoluaandCursor committed 2026-06-14 13:15:48 +07:00
1 parent 9105dd0e25
commit bb9e9aa91f
166 files changed
+3089 -3067

No files matched your search

+98
View File
@@ -0,0 +1,98 @@
/**
* REGISTRY ENTRY TEMPLATE — copy into registry/{id}.js when adding a new provider.
*
* NOT imported by registry/index.js (lives outside registry/, static-import list ignores it).
* Delete every block your provider does not need. Only `id` + `category` are required.
* Field contract: see schema.js `@typedef RegistryEntry`. Runtime builders: providers/index.js.
*
* Quick recipes:
* - Plain API-key LLM → id, alias, category:"apikey", display, transport{baseUrl}, models.
* - OAuth LLM (device/PKCE)→ add oauth{...}; clientId/tokenUrl auto-inject into transport.
* - Media-only (tts/stt/…) → drop `models`+chat baseUrl, fill media{serviceKinds, *Config}.
*/
// import { CLAUDE_API_HEADERS, GOOGLE_OAUTH_CLIENT, OPENAI_COMPAT_BASE } from "./shared.js";
export default {
// ── identity ────────────────────────────────────────────────────────────
id: "example", // REQUIRED. kebab-case, unique.
alias: "ex", // short key for PROVIDER_MODELS (defaults to id if omitted).
aliases: ["example-ai"], // optional extra lookup tokens.
uiAlias: "ex", // optional UI badge token.
category: "apikey", // REQUIRED. "apikey" | "oauth" | "freeTier" | ...
// ── auth hints (only when relevant) ──────────────────────────────────────
authType: "apikey", // "apikey" | "oauth".
hasOAuth: false, // true if an OAuth flow exists.
authModes: ["apikey"], // e.g. ["oauth","apikey"] when both supported.
// noAuth: true, // local/free providers needing no credential.
// ── UI display ───────────────────────────────────────────────────────────
display: {
name: "Example",
icon: "bolt", // material icon name OR textIcon fallback.
color: "#3B82F6",
textIcon: "EX",
website: "https://example.com",
notice: { apiKeyUrl: "https://example.com/keys" }, // or signupUrl.
// deprecated: true, deprecationNotice: "RISK_NOTICE",
// kindNotice: { image: "Requires paid plan." },
// mediaPriority: 1,
},
// ── transport (HTTP runtime) → PROVIDERS[id] ─────────────────────────────
// Defaults applied: format:"openai". Declare ONLY what differs.
transport: {
baseUrl: "https://api.example.com/v1/chat/completions",
format: "openai", // "openai" | "claude" | "gemini" | "openai-responses" | ...
// validateUrl: "https://api.example.com/v1/models",
// headers: { "User-Agent": "..." }, // static fingerprint (anti-ban) lives here.
// auth: { header: "x-api-key", scheme: "raw" },
// forceStream: true, urlSuffix: "?beta=true",
// quirks: { dropOutputConfig: true },
// retry: { 429: { attempts: 6 }, 503: { attempts: 3 } },
// usage: { url: "https://api.example.com/usage" }, // or { urls: [...] } for multi-call.
// modelsFetcher: { url: "https://api.example.com/models", type: "openai" }, // dynamic model list.
// regions: { sgp: "https://sgp...", cn: "https://cn..." }, defaultRegion: "sgp",
// NOTE: clientId/clientSecret/tokenUrl are injected from `oauth` — do NOT duplicate here.
},
// ── oauth flow → PROVIDER_OAUTH[id] (omit for pure API-key) ───────────────
// oauth: {
// clientId: "app_xxx",
// authorizeUrl: "https://auth.example.com/oauth/authorize", // PKCE/code flow.
// tokenUrl: "https://auth.example.com/oauth/token",
// deviceCodeUrl: "https://auth.example.com/device", // device-code flow.
// refreshUrl: "https://auth.example.com/oauth/token",
// scope: "openid profile offline_access", // or scopes: [...].
// codeChallengeMethod: "S256",
// redirectUri: "http://127.0.0.1:1455/auth/callback", fixedPort: 1455, callbackPath: "/auth/callback",
// extraParams: { foo: "bar" },
// refresh: { encoding: "form", scope: "openid offline_access" }, // "form" | "json".
// refreshLeadMs: 300000,
// userInfoUrl: "https://example.com/userinfo",
// },
// ── media (non-LLM services) → PROVIDER_MEDIA[id] ────────────────────────
// media: {
// serviceKinds: ["llm", "tts", "stt", "embedding", "image", "imageToText", "webSearch"],
// ttsConfig: { baseUrl: "...", authType: "apikey", authHeader: "bearer", format: "openai", defaultModel: "tts-1", models: [{ id: "tts-1", name: "TTS-1" }] },
// sttConfig: { baseUrl: "...", authType: "apikey", authHeader: "bearer", format: "openai", models: [{ id: "whisper-1", name: "Whisper" }] },
// embeddingConfig: { baseUrl: "...", authType: "apikey", authHeader: "bearer", models: [{ id: "emb-1", name: "Emb", dimensions: 1536 }] },
// imageConfig: { baseUrl: "https://api.example.com/v1/images/generations" },
// searchViaChat: { defaultModel: "ex-search", pricingUrl: "https://example.com/pricing" },
// // hiddenKinds: ["image"],
// },
// ── models (omit = no key; [] = explicit empty) ──────────────────────────
models: [
{ id: "example-large", name: "Example Large" },
// { id: "example-img", name: "Example Image", type: "image", capabilities: ["text2img"], params: ["size"] },
// { id: "example-emb", name: "Example Embed", type: "embedding" },
],
// ── optional flags ───────────────────────────────────────────────────────
// features: { usage: true },
// thinkingConfig: { options: ["auto", "none", "low", "high"], defaultMode: "auto" },
// passthroughModels: true,
};
+20 -4
View File
@@ -1,21 +1,37 @@
// Single source: build PROVIDERS + PROVIDER_MODELS from registry/{id}.js (transport + models co-located).
import REGISTRY from "./registry/index.js";
import { PROVIDER_DEFAULTS } from "./schema.js";
import { normalizeModel } from "./models/schema.js";
import { buildTtsProviderModels } from "../config/ttsModels.js";
// transport: re-apply shared default (format:"openai") like the old defineProviders()
function buildTransport(transport) {
// oauth block is canonical for these fields; inject into transport so executors reading
// this.config.{clientId,clientSecret,tokenUrl} keep working without duplicating in transport
const OAUTH_INJECT_FIELDS = ["clientId", "clientSecret", "tokenUrl"];
// transport: re-apply shared default (format:"openai") + inject oauth-canonical fields
function buildTransport(transport, oauth) {
const t = { ...transport };
if (!t.format) t.format = PROVIDER_DEFAULTS.format;
if (oauth) {
for (const f of OAUTH_INJECT_FIELDS) {
if (t[f] === undefined && oauth[f] !== undefined) t[f] = oauth[f];
}
}
return t;
}
export const PROVIDERS = {};
export const PROVIDER_MODELS = {};
export const PROVIDER_OAUTH = {};
export const PROVIDER_MEDIA = {};
for (const entry of REGISTRY) {
if (entry.transport) PROVIDERS[entry.id] = buildTransport(entry.transport);
if (entry.transport) PROVIDERS[entry.id] = buildTransport(entry.transport, entry.oauth);
// models omitted (undefined) → provider has no model list key; [] is a valid explicit empty list
if (entry.models !== undefined) PROVIDER_MODELS[entry.alias] = entry.models;
// normalizeModel: accept terse "id" strings + derive name via regex when omitted
// alias defaults to id (doc 01 §2); without fallback all alias-less providers collide on key `undefined`
if (entry.models !== undefined) PROVIDER_MODELS[entry.alias || entry.id] = entry.models.map(normalizeModel);
if (entry.oauth) PROVIDER_OAUTH[entry.id] = entry.oauth;
if (entry.media) PROVIDER_MEDIA[entry.id] = entry.media;
}
// TTS model/voice tables keyed by special names (openai-tts-models, ...), not provider ids
+1 -1
View File
@@ -1,5 +1,5 @@
// Codex auto-generates a "-review" variant for each llm model (review quota family)
const CODEX_REVIEW_SUFFIX = "-review";
export const CODEX_REVIEW_SUFFIX = "-review";
export function withCodexReviewModels(models) {
return models.flatMap((model) => {
+33
View File
@@ -0,0 +1,33 @@
// Derive a display name from a model id when the entry omits `name` (mirrors PATTERN_PRICING).
// Provider entries that ship their own `name` always win; this is only a fallback for terse entries.
// Capitalize a hyphen/space separated token group: "coder-plus" → "Coder Plus".
function titleCase(s) {
return s
.split(/[-_\s]+/)
.filter(Boolean)
.map((w) => (/^\d/.test(w) ? w : w.charAt(0).toUpperCase() + w.slice(1)))
.join(" ");
}
// Ordered: first match wins. Keep specific patterns above generic ones.
export const NAME_PATTERNS = [
[/^kimi-k(\d+(?:\.\d+)?)(-thinking)?$/i, (m) => `Kimi K${m[1]}${m[2] ? " Thinking" : ""}`],
[/^glm-(\d+(?:\.\d+)?)(v)?$/i, (m) => `GLM ${m[1]}${m[2] ? "V (Vision)" : ""}`],
[/^minimax-m(\d+(?:\.\d+)?)$/i, (m) => `MiniMax M${m[1]}`],
[/^gpt-(.+)$/i, (m) => `GPT ${titleCase(m[1])}`],
[/^gemini-(.+)$/i, (m) => `Gemini ${titleCase(m[1])}`],
[/^grok-(.+)$/i, (m) => `Grok ${titleCase(m[1])}`],
[/^deepseek-(.+)$/i, (m) => `DeepSeek ${titleCase(m[1])}`],
[/^qwen([\d.]+.*)$/i, (m) => `Qwen ${titleCase(m[1])}`],
];
// id → display name (regex fallback → id verbatim)
export function deriveModelName(id) {
if (typeof id !== "string") return id;
for (const [re, fn] of NAME_PATTERNS) {
const m = id.match(re);
if (m) return fn(m);
}
return id;
}
+10
View File
@@ -1,3 +1,5 @@
import { deriveModelName } from "./namePatterns.js";
// Model defaults centralized (was scattered as `m.type || "llm"`, `quotaFamily || "normal"`, etc.)
export const MODEL_DEFAULTS = {
type: "llm",
@@ -6,6 +8,14 @@ export const MODEL_DEFAULTS = {
targetFormat: null
};
// Normalize a registry model entry: accept terse "id" string, fill name via regex when omitted.
// Override always wins (raw spread last); name falls back to regex → id.
export function normalizeModel(raw) {
const model = typeof raw === "string" ? { id: raw } : raw;
if (model.name !== undefined) return model;
return { ...model, name: deriveModelName(model.id) };
}
// Resolve a single field with its default (keeps accessor call-sites one-liners)
export function modelType(model) {
return model?.type || MODEL_DEFAULTS.type;
@@ -1,17 +0,0 @@
import { CLAUDE_CLI_SPOOF_HEADERS } from "../shared.js";
export default {
id: "agentrouter",
alias: "agentrouter",
transport: {
baseUrl: "https://agentrouter.org/v1/messages",
format: "claude",
headers: { ...CLAUDE_CLI_SPOOF_HEADERS }
},
models: [
{ id: "claude-opus-4-6", name: "Claude 4.6 Opus" },
{ id: "claude-haiku-4-5-20251001", name: "Claude 4.5 Haiku" },
{ id: "glm-5.1", name: "GLM 5.1" },
{ id: "deepseek-v3.2", name: "DeepSeek V3.2" }
]
};
-17
View File
@@ -1,17 +0,0 @@
export default {
"id": "ai21",
"alias": "ai21",
"transport": {
"baseUrl": "https://api.ai21.com/studio/v1/chat/completions"
},
"models": [
{
"id": "jamba-large",
"name": "Jamba 1.5 Large"
},
{
"id": "jamba-mini",
"name": "Jamba 1.5 Mini"
}
]
};
-29
View File
@@ -1,29 +0,0 @@
export default {
"id": "aimlapi",
"alias": "aimlapi",
"transport": {
"baseUrl": "https://api.aimlapi.com/v1/chat/completions"
},
"models": [
{
"id": "gpt-4o",
"name": "GPT-4o"
},
{
"id": "gpt-4o-mini",
"name": "GPT-4o Mini"
},
{
"id": "claude-3-5-sonnet-20241022",
"name": "Claude 3.5 Sonnet"
},
{
"id": "gemini-2.0-flash-exp",
"name": "Gemini 2.0 Flash"
},
{
"id": "meta-llama/Meta-Llama-3.1-70B-Instruct-Turbo",
"name": "Llama 3.1 70B"
}
]
};
@@ -1,6 +1,18 @@
export default {
"id": "alicode-intl",
"alias": "alicode-intl",
display: {
"name": "Alibaba Intl",
"icon": "cloud",
"color": "#FF6A00",
"textIcon": "ALi",
"website": "https://modelstudio.console.alibabacloud.com",
"notice": {
"apiKeyUrl": "https://modelstudio.console.alibabacloud.com/?apiKey=1"
}
},
category: "apikey",
"transport": {
"baseUrl": "https://coding-intl.dashscope.aliyuncs.com/v1/chat/completions",
"headers": {}
+12
View File
@@ -1,6 +1,18 @@
export default {
"id": "alicode",
"alias": "alicode",
display: {
"name": "Alibaba",
"icon": "cloud",
"color": "#FF6A00",
"textIcon": "ALi",
"website": "https://bailian.console.aliyun.com",
"notice": {
"apiKeyUrl": "https://bailian.console.aliyun.com/?apiKey=1"
}
},
category: "apikey",
"transport": {
"baseUrl": "https://coding.dashscope.aliyuncs.com/v1/chat/completions",
"headers": {}
+14
View File
@@ -3,11 +3,25 @@ import { CLAUDE_API_HEADERS } from "../shared.js";
export default {
id: "anthropic",
alias: "anthropic",
display: {
"name": "Anthropic",
"icon": "smart_toy",
"color": "#D97757",
"textIcon": "AN",
"website": "https://console.anthropic.com",
"notice": {
"apiKeyUrl": "https://console.anthropic.com/settings/keys"
}
},
category: "apikey",
transport: {
baseUrl: "https://api.anthropic.com/v1/messages",
format: "claude",
headers: { ...CLAUDE_API_HEADERS }
},
media: {
serviceKinds: ["llm", "imageToText"]
},
models: [
{ id: "claude-sonnet-4-20250514", name: "Claude Sonnet 4" },
{ id: "claude-opus-4-20250514", name: "Claude Opus 4" },
+42 -1
View File
@@ -4,6 +4,19 @@ import { ANTIGRAVITY_OAUTH_CLIENT } from "../shared.js";
export default {
id: "antigravity",
alias: "ag",
display: {
"name": "Antigravity",
"icon": "rocket_launch",
"color": "#F59E0B",
"website": "https://antigravity.google",
"notice": {
"signupUrl": "https://antigravity.google"
},
"deprecated": true,
"deprecationNotice": "RISK_NOTICE"
},
category: "oauth",
uiAlias: "ag",
transport: {
baseUrls: [
"https://daily-cloudcode-pa.googleapis.com",
@@ -11,8 +24,35 @@ export default {
],
format: "antigravity",
headers: { "User-Agent": `antigravity/1.107.0 ${platform()}/${arch()}` },
// 429/503 use computeRetryDelay hook (Retry-After header/body → cap, else backoff)
retry: { 429: { attempts: 6 }, 503: { attempts: 3 } },
usage: {
quotaApiUrl: "https://cloudcode-pa.googleapis.com/v1internal:fetchAvailableModels",
loadProjectApiUrl: "https://cloudcode-pa.googleapis.com/v1internal:loadCodeAssist",
tokenUrl: "https://oauth2.googleapis.com/token"
},
...ANTIGRAVITY_OAUTH_CLIENT
},
oauth: {
authorizeUrl: "https://accounts.google.com/o/oauth2/v2/auth",
tokenUrl: "https://oauth2.googleapis.com/token",
userInfoUrl: "https://www.googleapis.com/oauth2/v1/userinfo",
scopes: [
"https://www.googleapis.com/auth/cloud-platform",
"https://www.googleapis.com/auth/userinfo.email",
"https://www.googleapis.com/auth/userinfo.profile",
"https://www.googleapis.com/auth/cclog",
"https://www.googleapis.com/auth/experimentsandconfigs"
],
apiEndpoint: "https://cloudcode-pa.googleapis.com",
apiVersion: "v1internal",
loadCodeAssistEndpoint: "https://cloudcode-pa.googleapis.com/v1internal:loadCodeAssist",
onboardUserEndpoint: "https://cloudcode-pa.googleapis.com/v1internal:onboardUser",
loadCodeAssistUserAgent: "google-api-nodejs-client/9.15.1",
loadCodeAssistApiClient: "google-cloud-sdk vscode_cloudshelleditor/0.1"
,
refreshLeadMs: 300000
},
models: [
{ id: "gemini-3-flash-agent", name: "Gemini 3.5 Flash (High)" },
{ id: "gemini-3.5-flash-low", name: "Gemini 3.5 Flash (Medium)" },
@@ -23,5 +63,6 @@ export default {
{ id: "claude-opus-4-6-thinking", name: "Claude Opus 4.6 (Thinking)" },
{ id: "gpt-oss-120b-medium", name: "GPT-OSS 120B (Medium)" },
{ id: "gemini-3-flash", name: "Gemini 3 Flash", thinking: false }
]
],
features: {"usage":true},
};
+21 -1
View File
@@ -1,8 +1,28 @@
export default {
"id": "assemblyai",
"alias": "assemblyai",
display: {
"name": "AssemblyAI",
"icon": "record_voice_over",
"color": "#0062FF",
"textIcon": "AA",
"website": "https://assemblyai.com",
"notice": {
"apiKeyUrl": "https://www.assemblyai.com/app/api-keys"
}
},
category: "apikey",
uiAlias: "aai",
authType: "apikey",
aliases: ["aai"],
"transport": {
"baseUrl": "https://api.assemblyai.com/v1/audio/transcriptions"
"baseUrl": "https://api.assemblyai.com/v1/audio/transcriptions",
"validateUrl": "https://api.assemblyai.com/v1/account"
},
media: {
serviceKinds: ["stt"],
sttConfig: { baseUrl: "https://api.assemblyai.com/v2/transcript", authType: "apikey", authHeader: "authorization", format: "assemblyai", models: [{ id: "best", name: "Best (Nano + Universal)" }, { id: "nano", name: "Nano (Fast)" }] }
},
"models": [
{
+12
View File
@@ -1,6 +1,18 @@
export default {
"id": "azure",
"alias": "azure",
display: {
"name": "Azure OpenAI",
"icon": "cloud",
"color": "#0078D4",
"textIcon": "AZ",
"website": "https://azure.microsoft.com/en-us/products/ai-services/openai-service",
"notice": {
"apiKeyUrl": "https://portal.azure.com/#view/Microsoft_Azure_ProjectOxford/CognitiveServicesHub/~/OpenAI"
}
},
category: "apikey",
hasProviderSpecificData: true,
"transport": {
"baseUrl": "",
"headers": {}
-17
View File
@@ -1,17 +0,0 @@
export default {
"id": "baseten",
"alias": "baseten",
"transport": {
"baseUrl": "https://inference.baseten.co/v1/chat/completions"
},
"models": [
{
"id": "deepseek-ai/DeepSeek-R1",
"name": "DeepSeek R1"
},
{
"id": "meta-llama/Llama-3.3-70B-Instruct",
"name": "Llama 3.3 70B"
}
]
};
-17
View File
@@ -1,17 +0,0 @@
export default {
"id": "bazaarlink",
"alias": "bazaarlink",
"transport": {
"baseUrl": "https://bazaarlink.ai/api/v1/chat/completions"
},
"models": [
{
"id": "auto:free",
"name": "Auto Free (Zero Cost)"
},
{
"id": "auto",
"name": "Auto (Best Model)"
}
]
};
@@ -1,6 +1,21 @@
export default {
"id": "black-forest-labs",
"alias": "black-forest-labs",
display: {
"name": "Black Forest Labs",
"icon": "image",
"color": "#111827",
"textIcon": "BF",
"website": "https://blackforestlabs.ai",
"notice": {
"apiKeyUrl": "https://api.bfl.ai"
}
},
category: "apikey",
uiAlias: "bfl",
authType: "apikey",
aliases: ["bfl"],
"transport": null,
"models": [
{
+14
View File
@@ -1,6 +1,20 @@
export default {
"id": "blackbox",
"alias": "blackbox",
display: {
"name": "Blackbox AI",
"icon": "smart_toy",
"color": "#5B5FEF",
"textIcon": "BB",
"website": "https://blackbox.ai",
"notice": {
"apiKeyUrl": "https://www.blackbox.ai/api-management"
}
},
category: "apikey",
uiAlias: "bb",
aliases: ["bb"],
"transport": {
"baseUrl": "https://api.blackbox.ai/chat/completions"
},
+18
View File
@@ -1,10 +1,28 @@
export default {
"id": "byteplus",
"alias": "byteplus",
display: {
"name": "BytePlus ModelArk",
"icon": "cloud",
"color": "#2563EB",
"textIcon": "BP",
"website": "https://console.byteplus.com/ark",
"notice": {
"text": "Free credits for new accounts. Access to Seed 2.0, Kimi K2 Thinking, GLM 4.7, GPT-OSS-120B models.",
"apiKeyUrl": "https://console.byteplus.com/ark/region:ark+ap-southeast-1/apiKey"
}
},
category: "freeTier",
uiAlias: "bpm",
aliases: ["bpm"],
"transport": {
"baseUrl": "https://ark.ap-southeast.bytepluses.com/api/coding/v3/chat/completions",
"headers": {}
},
media: {
serviceKinds: ["llm"]
},
"models": [
{
"id": "seed-2-0-pro-260328",
-21
View File
@@ -1,21 +0,0 @@
export default {
"id": "bytez",
"alias": "bytez",
"transport": {
"baseUrl": "https://api.bytez.com/models/v2"
},
"models": [
{
"id": "meta-llama/Llama-3.3-70B-Instruct",
"name": "Llama 3.3 70B"
},
{
"id": "mistralai/Mistral-7B-Instruct-v0.3",
"name": "Mistral 7B v0.3"
},
{
"id": "Qwen/Qwen2.5-72B-Instruct",
"name": "Qwen 2.5 72B"
}
]
};
+14 -1
View File
@@ -1,8 +1,21 @@
export default {
"id": "cerebras",
"alias": "cerebras",
display: {
"name": "Cerebras",
"icon": "memory",
"color": "#FF4F00",
"textIcon": "CB",
"website": "https://www.cerebras.ai",
"notice": {
"apiKeyUrl": "https://cloud.cerebras.ai/platform"
}
},
category: "apikey",
"transport": {
"baseUrl": "https://api.cerebras.ai/v1/chat/completions"
"baseUrl": "https://api.cerebras.ai/v1/chat/completions",
"validateUrl": "https://api.cerebras.ai/v1/models",
"quirks": { "dropClientMetadata": true }
},
"models": [
{
+16 -1
View File
@@ -1,7 +1,22 @@
export default {
"id": "chutes",
"alias": "chutes",
display: {
"name": "Chutes AI",
"icon": "water_drop",
"color": "#ffffffff",
"textIcon": "CH",
"website": "https://chutes.ai",
"notice": {
"apiKeyUrl": "https://chutes.ai/app/api"
}
},
category: "apikey",
uiAlias: "ch",
aliases: ["ch"],
"transport": {
"baseUrl": "https://llm.chutes.ai/v1/chat/completions"
"baseUrl": "https://llm.chutes.ai/v1/chat/completions",
"validateUrl": "https://llm.chutes.ai/v1/models"
}
};
+30 -2
View File
@@ -3,13 +3,40 @@ import { CLAUDE_CLI_SPOOF_HEADERS } from "../shared.js";
export default {
id: "claude",
alias: "cc",
display: {
"name": "Claude Code",
"icon": "smart_toy",
"color": "#D97757",
"website": "https://claude.ai",
"notice": {
"signupUrl": "https://claude.ai"
},
"deprecated": true,
"deprecationNotice": "RISK_NOTICE"
},
category: "oauth",
uiAlias: "cc",
transport: {
baseUrl: "https://api.anthropic.com/v1/messages",
format: "claude",
urlSuffix: "?beta=true",
headers: { ...CLAUDE_CLI_SPOOF_HEADERS },
quirks: { cloakToolsOnOAuth: true },
auth: {"apiKey":{"header":"x-api-key","scheme":"raw"},"oauth":{"header":"Authorization","scheme":"bearer"},"hooks":["claudeOverlay"]},
usage: {
oauthUrl: "https://api.anthropic.com/api/oauth/usage",
orgUrl: "https://api.anthropic.com/v1/organizations/{org_id}/usage",
settingsUrl: "https://api.anthropic.com/v1/settings"
},
},
oauth: {
clientId: "9d1c250a-e61b-44d9-88ed-5944d1962f5e",
tokenUrl: "https://api.anthropic.com/v1/oauth/token"
authorizeUrl: "https://claude.ai/oauth/authorize",
tokenUrl: "https://api.anthropic.com/v1/oauth/token",
scopes: ["org:create_api_key", "user:profile", "user:inference"],
codeChallengeMethod: "S256",
refreshLeadMs: 14400000,
refresh: {"encoding":"json"}
},
models: [
{ id: "claude-opus-4-8", name: "Claude Opus 4.8" },
@@ -19,5 +46,6 @@ export default {
{ id: "claude-opus-4-5-20251101", name: "Claude 4.5 Opus" },
{ id: "claude-sonnet-4-5-20250929", name: "Claude 4.5 Sonnet" },
{ id: "claude-haiku-4-5-20251001", name: "Claude 4.5 Haiku" }
]
],
features: {"usage":true},
};
+22 -1
View File
@@ -1,6 +1,19 @@
export default {
"id": "cline",
"alias": "cl",
display: {
"name": "Cline",
"icon": "smart_toy",
"color": "#5B9BD5",
"textIcon": "CL",
"website": "https://cline.bot",
"notice": {
"signupUrl": "https://cline.bot"
}
},
category: "oauth",
uiAlias: "cl",
"transport": {
"baseUrl": "https://api.cline.bot/api/v1/chat/completions",
"headers": {
@@ -8,6 +21,14 @@ export default {
"X-Title": "Cline"
},
"tokenUrl": "https://api.cline.bot/api/v1/auth/token",
"refreshUrl": "https://api.cline.bot/api/v1/auth/refresh",
auth: {"combined":true,"header":"Authorization","scheme":"bearer","hooks":["clineHeaders"]},
},
"oauth": {
"appBaseUrl": "https://app.cline.bot",
"apiBaseUrl": "https://api.cline.bot",
"authorizeUrl": "https://api.cline.bot/api/v1/auth/authorize",
"tokenExchangeUrl": "https://api.cline.bot/api/v1/auth/token",
"refreshUrl": "https://api.cline.bot/api/v1/auth/refresh"
},
"models": [
@@ -43,5 +64,5 @@ export default {
"id": "kwaipilot/kat-coder-pro",
"name": "KAT Coder Pro"
}
]
],
};
@@ -1,9 +1,29 @@
export default {
"id": "cloudflare-ai",
"alias": "cloudflare-ai",
display: {
"name": "Cloudflare",
"icon": "cloud",
"color": "#F38020",
"textIcon": "CF",
"website": "https://developers.cloudflare.com/workers-ai/",
"notice": {
"text": "Workers AI free tier. Requires a Cloudflare API token and Account ID.",
"apiKeyUrl": "https://dash.cloudflare.com/profile/api-tokens"
}
},
category: "freeTier",
uiAlias: "cf",
hasProviderSpecificData: true,
aliases: ["cf"],
"transport": {
"baseUrl": "https://api.cloudflare.com/client/v4/accounts/{accountId}/ai/v1/chat/completions"
},
media: {
serviceKinds: ["llm", "image"],
hasProviderSpecificData: true
},
"models": [
{
"id": "@cf/meta/llama-3.2-1b-instruct",
+14 -3
View File
@@ -1,7 +1,18 @@
export default {
"id": "codebuddy",
"alias": "codebuddy",
"id": "codebuddy", display: { name: "CodeBuddy", icon: "smart_toy", color: "#006EFF", website: "https://copilot.tencent.com", notice: { signupUrl: "https://copilot.tencent.com" } },
category: "oauth",
"transport": {
"baseUrl": "https://copilot.tencent.com/v1/chat/completions"
"baseUrl": "https://copilot.tencent.com/v1/chat/completions",
auth: {"combined":true,"header":"Authorization","scheme":"bearer"},
},
"oauth": {
"baseUrl": "https://copilot.tencent.com",
"stateUrl": "https://copilot.tencent.com/v2/plugin/auth/state",
"tokenUrl": "https://copilot.tencent.com/v2/plugin/auth/token",
"refreshUrl": "https://copilot.tencent.com/v2/plugin/auth/token/refresh",
"userAgent": "CLI/2.63.2 CodeBuddy/2.63.2",
"platform": "CLI",
"pollInterval": 5000
}
};
+44 -2
View File
@@ -3,6 +3,23 @@ import { withCodexReviewModels } from "../models/helpers.js";
export default {
id: "codex",
alias: "cx",
display: {
"name": "OpenAI Codex",
"icon": "code",
"color": "#3B82F6",
"website": "https://chatgpt.com/codex",
"notice": {
"signupUrl": "https://chatgpt.com/codex"
},
"deprecated": true,
"deprecationNotice": "RISK_NOTICE",
"kindNotice": {
"image": "Requires a ChatGPT Plus (or higher) account. Free accounts are not supported for image generation."
}
},
category: "oauth",
uiAlias: "cx",
thinkingConfig: {"options":["auto","none","low","medium","high"],"defaultMode":"auto"},
transport: {
baseUrl: "https://chatgpt.com/backend-api/codex/responses",
format: "openai-responses",
@@ -11,8 +28,32 @@ export default {
"originator": "codex_cli_rs",
"User-Agent": "codex_cli_rs/0.136.0"
},
usage: { url: "https://chatgpt.com/backend-api/wham/usage" }
},
oauth: {
clientId: "app_EMoamEEZ73f0CkXaXp7hrann",
tokenUrl: "https://auth.openai.com/oauth/token"
authorizeUrl: "https://auth.openai.com/oauth/authorize",
tokenUrl: "https://auth.openai.com/oauth/token",
scope: "openid profile email offline_access",
codeChallengeMethod: "S256",
fixedPort: 1455,
callbackPath: "/auth/callback",
extraParams: {
id_token_add_organizations: "true",
codex_cli_simplified_flow: "true",
originator: "codex_cli_rs"
}
,
refreshLeadMs: 432000000
,
refresh: {"encoding":"form","scope":"openid profile email offline_access"}
,
maxRefreshAgeMs: 691200000
,
trackRefreshAt: true
},
media: {
serviceKinds: ["llm", "image"]
},
models: withCodexReviewModels([
{ id: "gpt-5.5", name: "GPT 5.5" },
@@ -27,5 +68,6 @@ export default {
{ id: "gpt-5.5-image", name: "GPT 5.5 Image", type: "image", capabilities: ["text2img", "edit"], params: ["size", "quality", "background", "image_detail", "output_format"] },
{ id: "gpt-5.4-image", name: "GPT 5.4 Image", type: "image", capabilities: ["text2img", "edit"], params: ["size", "quality", "background", "image_detail", "output_format"] },
{ id: "gpt-5.3-image", name: "GPT 5.3 Image", type: "image", capabilities: ["text2img", "edit"], params: ["size", "quality", "background", "image_detail", "output_format"] }
])
]),
features: {"usage":true},
};
+14 -1
View File
@@ -1,8 +1,21 @@
export default {
"id": "cohere",
"alias": "cohere",
display: {
"name": "Cohere",
"icon": "hub",
"color": "#39594D",
"textIcon": "CO",
"website": "https://cohere.com",
"notice": {
"apiKeyUrl": "https://dashboard.cohere.com/api-keys"
}
},
category: "apikey",
"transport": {
"baseUrl": "https://api.cohere.ai/v1/chat/completions"
"baseUrl": "https://api.cohere.ai/v1/chat/completions",
"validateUrl": "https://api.cohere.ai/v1/models"
},
"models": [
{
+9
View File
@@ -1,6 +1,15 @@
export default {
"id": "comfyui",
"alias": "comfyui",
display: {
"name": "ComfyUI",
"icon": "account_tree",
"color": "#4CAF50",
"textIcon": "CF",
"website": "https://github.com/comfyanonymous/ComfyUI"
},
category: "apikey",
"transport": null,
"models": [
{
@@ -1,6 +1,20 @@
export default {
"id": "commandcode",
"alias": "commandcode",
display: {
"name": "Command Code",
"icon": "smart_toy",
"color": "#000000",
"textIcon": "CC",
"website": "https://commandcode.ai",
"notice": {
"text": "Use your CommandCode CLI API key (starts with user_...) from ~/.commandcode/auth.json or commandcode.ai/studio.",
"apiKeyUrl": "https://commandcode.ai/studio"
}
},
category: "apikey",
uiAlias: "cmc",
aliases: ["cmc"],
"transport": {
"baseUrl": "https://api.commandcode.ai/alpha/generate",
"format": "commandcode",
@@ -1,25 +0,0 @@
export default {
"id": "completions",
"alias": "completions",
"transport": {
"baseUrl": "https://completions.me/api/v1/chat/completions"
},
"models": [
{
"id": "claude-opus-4",
"name": "Claude Opus 4"
},
{
"id": "claude-sonnet-4",
"name": "Claude Sonnet 4"
},
{
"id": "gpt-4o",
"name": "GPT-4o"
},
{
"id": "gemini-2.0-flash",
"name": "Gemini 2.0 Flash"
}
]
};
+26
View File
@@ -1,6 +1,18 @@
export default {
"id": "cursor",
"alias": "cu",
display: {
"name": "Cursor IDE",
"icon": "edit_note",
"color": "#00D4AA",
"website": "https://cursor.com",
"notice": {
"signupUrl": "https://cursor.com"
}
},
category: "oauth",
uiAlias: "cu",
"transport": {
"baseUrl": "https://api2.cursor.sh",
"chatPath": "/aiserver.v1.ChatService/StreamUnifiedChatWithTools",
@@ -13,6 +25,20 @@ export default {
},
"clientVersion": "3.1.0"
},
"oauth": {
"apiEndpoint": "https://api2.cursor.sh",
"chatEndpoint": "/aiserver.v1.ChatService/StreamUnifiedChatWithTools",
"modelsEndpoint": "/aiserver.v1.AiService/GetDefaultModelNudgeData",
"api3Endpoint": "https://api3.cursor.sh",
"agentEndpoint": "https://agent.api5.cursor.sh",
"agentNonPrivacyEndpoint": "https://agentn.api5.cursor.sh",
"clientVersion": "3.1.0",
"clientType": "ide",
"dbKeys": {
"accessToken": "cursorAuth/accessToken",
"machineId": "storage.serviceMachineId"
}
},
"models": [
{
"id": "default",
+20
View File
@@ -1,9 +1,29 @@
export default {
"id": "deepgram",
"alias": "deepgram",
display: {
"name": "Deepgram",
"icon": "mic",
"color": "#13EF93",
"textIcon": "DG",
"website": "https://deepgram.com",
"notice": {
"text": "$200 free credit on signup (no card required). Aura-1: $0.015/1k chars, Aura-2: $0.030/1k chars (Pay-As-You-Go).",
"apiKeyUrl": "https://console.deepgram.com/api-keys"
}
},
category: "apikey",
uiAlias: "dg",
authType: "apikey",
aliases: ["dg"],
"transport": {
"baseUrl": "https://api.deepgram.com/v1/listen"
},
media: {
serviceKinds: ["stt"],
sttConfig: { baseUrl: "https://api.deepgram.com/v1/listen", authType: "apikey", authHeader: "token", format: "deepgram", models: [{ id: "nova-3", name: "Nova 3" }, { id: "nova-2", name: "Nova 2" }, { id: "nova", name: "Nova" }] }
},
"models": [
{
"id": "nova-3",
-21
View File
@@ -1,21 +0,0 @@
export default {
"id": "deepinfra",
"alias": "deepinfra",
"transport": {
"baseUrl": "https://api.deepinfra.com/v1/openai/chat/completions"
},
"models": [
{
"id": "meta-llama/Meta-Llama-3.1-70B-Instruct",
"name": "Llama 3.1 70B"
},
{
"id": "deepseek-ai/DeepSeek-V3",
"name": "DeepSeek V3"
},
{
"id": "Qwen/Qwen2.5-72B-Instruct",
"name": "Qwen 2.5 72B"
}
]
};
+17 -1
View File
@@ -1,8 +1,24 @@
export default {
"id": "deepseek",
"alias": "deepseek",
display: {
"name": "DeepSeek",
"icon": "bolt",
"color": "#4D6BFE",
"textIcon": "DS",
"website": "https://deepseek.com",
"notice": {
"apiKeyUrl": "https://platform.deepseek.com/api_keys"
}
},
category: "apikey",
uiAlias: "ds",
aliases: ["ds"],
"transport": {
"baseUrl": "https://api.deepseek.com/chat/completions"
"baseUrl": "https://api.deepseek.com/chat/completions",
"validateUrl": "https://api.deepseek.com/models",
reasoningInject: { scope: "all" }
},
"models": [
{
-22
View File
@@ -1,22 +0,0 @@
export default {
"id": "enally",
"alias": "enally",
"transport": {
"baseUrl": "https://ai.enally.in/v1/chat/completions",
"authHeader": "x-api-key"
},
"models": [
{
"id": "gpt-4o",
"name": "GPT-4o"
},
{
"id": "gpt-4o-mini",
"name": "GPT-4o Mini"
},
{
"id": "claude-3-5-sonnet",
"name": "Claude 3.5 Sonnet"
}
]
};
+15
View File
@@ -1,6 +1,21 @@
export default {
"id": "fal-ai",
"alias": "fal-ai",
display: {
"name": "Fal.ai",
"icon": "image",
"color": "#2563EB",
"textIcon": "FL",
"website": "https://fal.ai",
"notice": {
"apiKeyUrl": "https://fal.ai/dashboard/keys"
}
},
category: "apikey",
uiAlias: "fal",
authType: "apikey",
aliases: ["fal"],
"transport": null,
"models": [
{
+18 -1
View File
@@ -1,8 +1,25 @@
export default {
"id": "fireworks",
"alias": "fireworks",
display: {
"name": "Fireworks AI",
"icon": "local_fire_department",
"color": "#7B2EF2",
"textIcon": "FW",
"website": "https://fireworks.ai",
"notice": {
"apiKeyUrl": "https://fireworks.ai/account/api-keys"
}
},
category: "apikey",
authType: "apikey",
"transport": {
"baseUrl": "https://api.fireworks.ai/inference/v1/chat/completions"
"baseUrl": "https://api.fireworks.ai/inference/v1/chat/completions",
"validateUrl": "https://api.fireworks.ai/inference/v1/models"
},
media: {
embeddingConfig: { baseUrl: "https://api.fireworks.ai/inference/v1/embeddings" }
},
"models": [
{
-25
View File
@@ -1,25 +0,0 @@
export default {
"id": "freetheai",
"alias": "freetheai",
"transport": {
"baseUrl": "https://api.freetheai.xyz/v1/chat/completions"
},
"models": [
{
"id": "gpt-4o",
"name": "GPT-4o"
},
{
"id": "claude-3-5-sonnet",
"name": "Claude 3.5 Sonnet"
},
{
"id": "gemini-1.5-pro",
"name": "Gemini 1.5 Pro"
},
{
"id": "deepseek-chat",
"name": "DeepSeek Chat"
}
]
};
+33 -1
View File
@@ -3,11 +3,42 @@ import { GOOGLE_OAUTH_CLIENT } from "../shared.js";
export default {
"id": "gemini-cli",
"alias": "gc",
display: {
"name": "Gemini CLI",
"icon": "terminal",
"color": "#4285F4",
"website": "https://github.com/google-gemini/gemini-cli",
"notice": {
"signupUrl": "https://github.com/google-gemini/gemini-cli"
},
"deprecated": true,
"deprecationNotice": "RISK_NOTICE"
},
category: "free",
uiAlias: "gc",
"transport": {
"baseUrl": "https://cloudcode-pa.googleapis.com/v1internal",
"format": "gemini-cli",
cliVersion: "0.34.0",
apiClient: "google-genai-sdk/1.41.0 gl-node/v22.19.0",
usage: {
quotaUrl: "https://cloudcode-pa.googleapis.com/v1internal:retrieveUserQuota",
loadCodeAssistUrl: "https://cloudcode-pa.googleapis.com/v1internal:loadCodeAssist"
},
...GOOGLE_OAUTH_CLIENT
},
"oauth": {
"authorizeUrl": "https://accounts.google.com/o/oauth2/v2/auth",
"tokenUrl": "https://oauth2.googleapis.com/token",
"userInfoUrl": "https://www.googleapis.com/oauth2/v1/userinfo",
"scopes": [
"https://www.googleapis.com/auth/cloud-platform",
"https://www.googleapis.com/auth/userinfo.email",
"https://www.googleapis.com/auth/userinfo.profile"
]
,
refresh: {"encoding":"form"}
},
"models": [
{
"id": "gemini-3-flash-preview",
@@ -17,5 +48,6 @@ export default {
"id": "gemini-3-pro-preview",
"name": "Gemini 3 Pro Preview"
}
]
],
features: {"usage":true},
};
+22 -2
View File
@@ -3,10 +3,30 @@ import { GOOGLE_OAUTH_CLIENT } from "../shared.js";
export default {
"id": "gemini",
"alias": "gemini",
display: {
"name": "Gemini",
"icon": "diamond",
"color": "#4285F4",
"textIcon": "GE",
"website": "https://ai.google.dev",
"notice": {
"apiKeyUrl": "https://aistudio.google.com/app/apikey"
},
"mediaPriority": 1
},
category: "freeTier",
"transport": {
"baseUrl": "https://generativelanguage.googleapis.com/v1beta/models",
"format": "gemini",
...GOOGLE_OAUTH_CLIENT
...GOOGLE_OAUTH_CLIENT,
auth: {"apiKey":{"header":"x-goog-api-key","scheme":"raw"},"oauth":{"header":"Authorization","scheme":"bearer"}},
},
media: {
serviceKinds: ["llm", "embedding", "image", "imageToText", "webSearch", "tts", "stt"],
ttsConfig: { baseUrl: "https://generativelanguage.googleapis.com/v1beta/models", authType: "apikey", authHeader: "key", format: "gemini-tts", models: [{ id: "gemini-2.5-flash-preview-tts", name: "Gemini 2.5 Flash TTS" }, { id: "gemini-2.5-pro-preview-tts", name: "Gemini 2.5 Pro TTS" }] },
sttConfig: { baseUrl: "https://generativelanguage.googleapis.com/v1beta/models", authType: "apikey", authHeader: "key", format: "gemini-stt", models: [{ id: "gemini-2.5-pro", name: "Gemini 2.5 Pro (Best)" }, { id: "gemini-2.5-flash", name: "Gemini 2.5 Flash" }, { id: "gemini-2.5-flash-lite", name: "Gemini 2.5 Flash Lite (Cheapest)" }, { id: "gemini-2.0-flash", name: "Gemini 2.0 Flash" }] },
embeddingConfig: { baseUrl: "https://generativelanguage.googleapis.com/v1beta/models", authType: "apikey", authHeader: "key", models: [{ id: "text-embedding-004", name: "Text Embedding 004", dimensions: 768 }, { id: "embedding-001", name: "Embedding 001", dimensions: 768 }] },
searchViaChat: { defaultModel: "gemini-2.5-flash", pricingUrl: "https://ai.google.dev/pricing", freeTier: "Free tier: 15 RPM, 1M tokens/day on gemini-2.5-flash via AI Studio." }
},
"models": [
{
@@ -119,5 +139,5 @@ export default {
"prompt"
]
}
]
],
};
+35 -2
View File
@@ -1,6 +1,20 @@
export default {
"id": "github",
"alias": "gh",
display: {
"name": "GitHub Copilot",
"icon": "code",
"color": "#333333",
"website": "https://github.com/features/copilot",
"notice": {
"signupUrl": "https://github.com/features/copilot"
},
"deprecated": true,
"deprecationNotice": "RISK_NOTICE"
},
category: "oauth",
uiAlias: "gh",
"transport": {
"baseUrl": "https://api.githubcopilot.com/chat/completions",
"responsesUrl": "https://api.githubcopilot.com/responses",
@@ -16,7 +30,25 @@ export default {
"Accept": "application/json",
"Content-Type": "application/json"
},
"clientId": "Iv1.b507a08c87ecfe98"
copilot: { vscodeVersion: "1.110.0", chatVersion: "0.38.0", userAgent: "GitHubCopilotChat/0.38.0", apiVersion: "2025-04-01" },
usage: { url: "https://api.github.com/copilot_internal/user" }
},
"oauth": {
"clientId": "Iv1.b507a08c87ecfe98",
"authorizeUrl": "https://github.com/login/oauth/authorize",
"deviceCodeUrl": "https://github.com/login/device/code",
"tokenUrl": "https://github.com/login/oauth/access_token",
"userInfoUrl": "https://api.github.com/user",
"scopes": "read:user",
"apiVersion": "2022-11-28",
"copilotTokenUrl": "https://api.github.com/copilot_internal/v2/token",
"userAgent": "GitHubCopilotChat/0.26.7",
"editorVersion": "vscode/1.85.0",
"editorPluginVersion": "copilot-chat/0.26.7"
},
media: {
serviceKinds: ["llm", "embedding"],
embeddingConfig: { baseUrl: "https://models.github.ai/inference/embeddings", authType: "apikey", authHeader: "bearer", models: [{ id: "text-embedding-3-small", name: "Text Embedding 3 Small (GitHub)", dimensions: 1536 }, { id: "text-embedding-3-large", name: "Text Embedding 3 Large (GitHub)", dimensions: 3072 }] }
},
"models": [
{
@@ -125,5 +157,6 @@ export default {
"name": "Text Embedding 3 Large (GitHub)",
"type": "embedding"
}
]
],
features: {"usage":true},
};
+13 -3
View File
@@ -1,7 +1,17 @@
export default {
"id": "gitlab",
"alias": "gitlab",
"id": "gitlab", display: { name: "GitLab Duo", icon: "code", color: "#FC6D26", textIcon: "GL", website: "https://gitlab.com", notice: { signupUrl: "https://gitlab.com" } },
category: "oauth",
"transport": {
"baseUrl": "https://gitlab.com/api/v4/chat/completions"
"baseUrl": "https://gitlab.com/api/v4/chat/completions",
auth: {"combined":true,"header":"Authorization","scheme":"bearer"},
},
"oauth": {
"defaultBaseUrl": "https://gitlab.com",
"authorizeUrlPath": "/oauth/authorize",
"tokenUrlPath": "/oauth/token",
"userInfoUrlPath": "/api/v4/user",
"scope": "api read_user",
"codeChallengeMethod": "S256"
}
};
-21
View File
@@ -1,21 +0,0 @@
export default {
"id": "glhf",
"alias": "glhf",
"transport": {
"baseUrl": "https://glhf.chat/api/openai/v1/chat/completions"
},
"models": [
{
"id": "hf:meta-llama/Meta-Llama-3.1-405B-Instruct",
"name": "Llama 3.1 405B"
},
{
"id": "hf:meta-llama/Meta-Llama-3.1-70B-Instruct",
"name": "Llama 3.1 70B"
},
{
"id": "hf:Qwen/Qwen2.5-72B-Instruct",
"name": "Qwen 2.5 72B"
}
]
};
+16 -2
View File
@@ -1,9 +1,22 @@
export default {
"id": "glm-cn",
"alias": "glm-cn",
display: {
"name": "GLM (China)",
"icon": "code",
"color": "#DC2626",
"textIcon": "GC",
"website": "https://open.bigmodel.cn",
"notice": {
"apiKeyUrl": "https://open.bigmodel.cn/usercenter/apikeys"
}
},
category: "apikey",
"transport": {
"baseUrl": "https://open.bigmodel.cn/api/coding/paas/v4/chat/completions",
"headers": {}
"headers": {},
usage: { url: "https://open.bigmodel.cn/api/monitor/usage/quota/limit" }
},
"models": [
{
@@ -26,5 +39,6 @@ export default {
"id": "glm-4.5-air",
"name": "GLM-4.5-Air"
}
]
],
features: {"usage":true,"usageApikey":true},
};
+16 -2
View File
@@ -3,16 +3,30 @@ import { CLAUDE_API_HEADERS } from "../shared.js";
export default {
id: "glm",
alias: "glm",
display: {
"name": "GLM Coding",
"icon": "code",
"color": "#2563EB",
"textIcon": "GL",
"website": "https://open.bigmodel.cn",
"notice": {
"apiKeyUrl": "https://open.bigmodel.cn/usercenter/apikeys"
}
},
category: "apikey",
transport: {
baseUrl: "https://api.z.ai/api/anthropic/v1/messages",
format: "claude",
urlSuffix: "?beta=true",
headers: { ...CLAUDE_API_HEADERS }
headers: { ...CLAUDE_API_HEADERS },
auth: { "combined": true, "header": "x-api-key", "scheme": "raw" },
usage: { url: "https://api.z.ai/api/monitor/usage/quota/limit" },
},
models: [
{ id: "glm-5.1", name: "GLM 5.1" },
{ id: "glm-5", name: "GLM 5" },
{ id: "glm-4.7", name: "GLM 4.7" },
{ id: "glm-4.6v", name: "GLM 4.6V (Vision)" }
]
],
features: { "usage": true, "usageApikey": true },
};
+14
View File
@@ -1,6 +1,20 @@
export default {
"id": "grok-web",
"alias": "grok-web",
display: {
"name": "Grok Web (Subscription)",
"icon": "auto_awesome",
"color": "#1DA1F2",
"textIcon": "GW",
"website": "https://grok.com"
},
category: "webCookie",
uiAlias: "gw",
authType: "cookie",
authHint: "Paste your sso= cookie value from grok.com",
passthroughModels: true,
aliases: ["gw"],
"transport": {
"baseUrl": "https://grok.com/rest/app-chat/conversations/new",
"format": "grok-web",
+18 -1
View File
@@ -1,8 +1,25 @@
export default {
"id": "groq",
"alias": "groq",
display: {
"name": "Groq",
"icon": "speed",
"color": "#F55036",
"textIcon": "GQ",
"website": "https://groq.com",
"notice": {
"apiKeyUrl": "https://console.groq.com/keys"
}
},
category: "apikey",
"transport": {
"baseUrl": "https://api.groq.com/openai/v1/chat/completions"
"baseUrl": "https://api.groq.com/openai/v1/chat/completions",
"validateUrl": "https://api.groq.com/openai/v1/models"
},
media: {
serviceKinds: ["llm", "imageToText", "stt"],
sttConfig: { baseUrl: "https://api.groq.com/openai/v1/audio/transcriptions", authType: "apikey", authHeader: "bearer", format: "openai", models: [{ id: "whisper-large-v3", name: "Whisper Large v3" }, { id: "whisper-large-v3-turbo", name: "Whisper Large v3 Turbo" }, { id: "distil-whisper-large-v3-en", name: "Distil Whisper Large v3 EN" }] }
},
"models": [
{
@@ -1,6 +1,22 @@
export default {
"id": "huggingface",
"alias": "huggingface",
display: {
"name": "HuggingFace",
"icon": "face",
"color": "#FFD21E",
"textIcon": "HF",
"website": "https://huggingface.co",
"notice": {
"apiKeyUrl": "https://huggingface.co/settings/tokens"
}
},
category: "apikey",
uiAlias: "hf",
authType: "apikey",
hiddenKinds: ["tts"],
aliases: ["hf"],
"transport": null,
"models": [
{
+17 -1
View File
@@ -1,8 +1,24 @@
export default {
"id": "hyperbolic",
"alias": "hyperbolic",
display: {
"name": "Hyperbolic",
"icon": "bolt",
"color": "#00D4FF",
"textIcon": "HY",
"website": "https://hyperbolic.xyz",
"notice": {
"apiKeyUrl": "https://app.hyperbolic.xyz/settings"
}
},
category: "apikey",
uiAlias: "hyp",
authType: "apikey",
aliases: ["hyp"],
"transport": {
"baseUrl": "https://api.hyperbolic.xyz/v1/chat/completions"
"baseUrl": "https://api.hyperbolic.xyz/v1/chat/completions",
"validateUrl": "https://api.hyperbolic.xyz/v1/models"
},
"models": [
{
Loaded 50 of 166 files, more files were not shown because too many files have changed in this diff. Show more