refactor(providers): drop the transitional tables, document how to add a provider

Step 6 of the provider refactor plan. FIXED_CRED_PROVIDERS, PROVIDER_LOGO_MAP,
OPTIONS_OPEN and NO_KEY_NEEDED had no readers left and are gone; the record's
fields are read where they were used. The fixture that compared the derived
tables with their old literal values is gone with them; tests/unit/providers.test.ts
keeps the record's own rules (21 providers in auto-detection, every note in
every UI language, https defaults only, fixed-credential providers, the
picker's order) and a new check that env.example names every record's
variables. docs/{en,cn,ja}/ai-providers.md end with a section on adding a
provider: one record, two env.example lines, one docs paragraph.
This commit is contained in:
dayuan.jiang
2026-10-12 21:17:51 +09:00
parent f811242568
commit e1c083dae0
7 changed files with 170 additions and 510 deletions
+3 -7
View File
@@ -6,7 +6,7 @@ import {
listProviderModels,
ModelListError,
} from "@/lib/provider-models"
import { PROVIDER_NAMES, PROVIDERS, type ProviderName } from "@/lib/providers"
import { PROVIDERS, type ProviderName } from "@/lib/providers"
import {
allowPrivateUrls,
isPrivateUrl,
@@ -16,11 +16,6 @@ import {
export const runtime = "nodejs"
// Public lists need no key
const NO_KEY_NEEDED = new Set<ProviderName>(
PROVIDER_NAMES.filter((p) => PROVIDERS[p].listNeedsNoKey),
)
/**
* The models a provider offers, for the "Fetch models" button in model
* settings. Answers { models: null } for providers that cannot list them,
@@ -45,7 +40,8 @@ export async function POST(req: Request) {
if (baseUrl && !allowPrivateUrls() && (await isPrivateUrl(baseUrl))) {
return NextResponse.json({ error: "Invalid base URL" }, { status: 400 })
}
if (!apiKey && !NO_KEY_NEEDED.has(provider)) {
// Public and local lists need no key
if (!apiKey && !PROVIDERS[provider].listNeedsNoKey) {
return NextResponse.json(
{ error: "API key is required" },
{ status: 400 },