@nebutra/ai-providers 1.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.frontier.md +35 -0
- package/README.md +46 -0
- package/dist/catalog.d.ts +128 -0
- package/dist/catalog.js +312 -0
- package/dist/catalog.js.map +1 -0
- package/dist/frontier.d.ts +191 -0
- package/dist/frontier.js +183 -0
- package/dist/frontier.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +783 -0
- package/dist/index.js.map +1 -0
- package/dist/meta.d.ts +25 -0
- package/dist/meta.js +474 -0
- package/dist/meta.js.map +1 -0
- package/package.json +82 -0
- package/templates/.env.example.template +28 -0
- package/templates/registry.ts.template +52 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/catalog.ts","../src/meta.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Model catalog — the single source of model/provider FACTS.\n *\n * Data comes from the upstream community catalog https://models.dev (via\n * `@tokenlens/fetch`), so model ids, providers, pricing, context windows and\n * capabilities are NOT hand-maintained here. Replaces the scattered hardcoded\n * lists (BYOK provider regex, the /models endpoint, seed fallbacks).\n *\n * Delivery: runtime fetch + in-memory TTL cache. The first call fetches; later\n * calls serve from cache until `MODEL_CATALOG_TTL_MS` (default 6h) elapses. On\n * fetch failure the last good catalog is reused, so a models.dev outage degrades\n * to \"slightly stale\" rather than \"down\". Accessors are async by design.\n */\n\nimport type { ProviderModel, ProvidersCatalog } from \"@tokenlens/core\";\nimport { fetchModels } from \"@tokenlens/fetch\";\n\n/** Our coarse provider buckets — one BYOK key + base URL per bucket. */\nexport type AIProviderId = \"OPENAI\" | \"ANTHROPIC\" | \"GOOGLE\" | \"SILICONFLOW\" | \"CUSTOM\";\n\n/**\n * Map models.dev provider IDs → our AIProvider buckets. Canonical home (the DB\n * seed imports this, instead of keeping a parallel copy). Unknown → CUSTOM.\n */\nexport const PROVIDER_MAP: Record<string, AIProviderId> = {\n openai: \"OPENAI\",\n anthropic: \"ANTHROPIC\",\n google: \"GOOGLE\",\n \"google-vertex\": \"GOOGLE\",\n \"google-vertex-anthropic\": \"ANTHROPIC\",\n \"amazon-bedrock\": \"ANTHROPIC\", // most bedrock usage is claude\n siliconflow: \"SILICONFLOW\",\n \"siliconflow-cn\": \"SILICONFLOW\", // SiliconFlow ecosystem (GLM / Qwen / DeepSeek / MiniMax / …)\n deepseek: \"SILICONFLOW\", // deepseek is siliconflow-compatible\n alibaba: \"SILICONFLOW\",\n \"alibaba-token-plan\": \"SILICONFLOW\",\n qwen: \"SILICONFLOW\",\n moonshot: \"SILICONFLOW\",\n zhipu: \"SILICONFLOW\",\n minimax: \"SILICONFLOW\",\n};\n\nexport function mapProvider(modelsDevProviderId: string): AIProviderId {\n return PROVIDER_MAP[modelsDevProviderId] ?? \"CUSTOM\";\n}\n\n/**\n * Output modality — the primary dimension for canvas orchestration (\"give me a\n * video model\", \"an image model\", …). Derived from models.dev `modalities.output`.\n */\nexport type ModelModality = \"text\" | \"image\" | \"video\" | \"audio\" | \"embedding\";\n\n/** Classify a model by what it PRODUCES (not what it consumes). */\nfunction classifyModality(model: ProviderModel): ModelModality {\n const out = model.modalities?.output ?? [];\n if (out.includes(\"video\")) return \"video\";\n if (out.includes(\"image\")) return \"image\";\n if (out.includes(\"audio\")) return \"audio\";\n if (/embedding/i.test(model.id) || out.includes(\"embedding\")) return \"embedding\";\n return \"text\";\n}\n\n/** Normalized, provider-agnostic model facts surfaced to the rest of the app. */\nexport interface ModelInfo {\n id: string;\n name: string;\n /** Our coarse bucket (for BYOK key selection / base URL). */\n provider: AIProviderId;\n /** The raw models.dev provider id (e.g. \"google-vertex\"). */\n rawProvider: string;\n /** What the model produces — the canvas-orchestration grouping key. */\n modality: ModelModality;\n contextWindow?: number;\n maxOutput?: number;\n pricing?: { inputPerMTok?: number; outputPerMTok?: number };\n capabilities: { reasoning: boolean; toolCall: boolean; vision: boolean };\n}\n\nfunction toModelInfo(rawProvider: string, model: ProviderModel): ModelInfo {\n const visionIn = model.modalities?.input?.includes(\"image\") ?? false;\n return {\n id: model.id,\n name: model.name ?? model.id,\n provider: mapProvider(rawProvider),\n rawProvider,\n modality: classifyModality(model),\n ...(model.limit?.context !== undefined ? { contextWindow: model.limit.context } : {}),\n ...(model.limit?.output !== undefined ? { maxOutput: model.limit.output } : {}),\n pricing: {\n ...(model.cost?.input !== undefined ? { inputPerMTok: model.cost.input } : {}),\n ...(model.cost?.output !== undefined ? { outputPerMTok: model.cost.output } : {}),\n },\n capabilities: {\n reasoning: model.reasoning ?? false,\n toolCall: model.tool_call ?? false,\n vision: visionIn,\n },\n };\n}\n\n// ─── Deduped, modality-grouped view (for canvas orchestration) ─────────────────\n//\n// models.dev lists the SAME logical model under dozens of aggregator providers\n// (e.g. minimax-m2.5 appears under 47). The canvas needs ONE entry per logical\n// model with the list of providers that can serve it (so it can pick a routable\n// id + compare cost). `dedupKey` collapses the bare name across aggregators.\n\n/** A single provider's offering of a logical model. */\nexport interface ModelOffering {\n /** Routable model id as listed by models.dev (aggregator-prefixed). */\n id: string;\n rawProvider: string;\n bucket: AIProviderId;\n pricing?: { inputPerMTok?: number; outputPerMTok?: number };\n contextWindow?: number;\n}\n\n/** One deduped logical model, with all the providers that serve it. */\nexport interface CatalogModel {\n key: string;\n name: string;\n modality: ModelModality;\n capabilities: { reasoning: boolean; toolCall: boolean; vision: boolean };\n /** Distinct provider buckets that serve it (for BYOK key selection). */\n buckets: AIProviderId[];\n offerings: ModelOffering[];\n}\n\n/** Collapse a model id to a logical key (drop aggregator path + separators). */\nfunction dedupKey(modelId: string): string {\n return modelId\n .toLowerCase()\n .replace(/^.*\\//, \"\") // keep only the final path segment\n .replace(/[._:\\-\\s]/g, \"\");\n}\n\n// ─── Runtime cache ────────────────────────────────────────────────────────────\n\ninterface CacheEntry {\n /** Per-id view (exact lookups: providerForModel, getModelInfo, resolveFrontier). */\n index: Map<string, ModelInfo>;\n /** Deduped logical view (canvas orchestration: listModelsByModality). */\n logical: CatalogModel[];\n fetchedAt: number;\n}\n\nconst TTL_MS = (() => {\n const n = Number.parseInt(process.env.MODEL_CATALOG_TTL_MS ?? \"21600000\", 10); // 6h\n return Number.isFinite(n) && n > 0 ? n : 21_600_000;\n})();\n\nlet cache: CacheEntry | null = null;\nlet inflight: Promise<CacheEntry> | null = null;\n\nfunction buildIndex(catalog: ProvidersCatalog): Map<string, ModelInfo> {\n const index = new Map<string, ModelInfo>();\n for (const [providerId, providerInfo] of Object.entries(catalog)) {\n for (const model of Object.values(providerInfo.models)) {\n // First writer wins; model ids are unique within models.dev.\n if (!index.has(model.id)) index.set(model.id, toModelInfo(providerId, model));\n }\n }\n return index;\n}\n\nfunction buildLogical(catalog: ProvidersCatalog): CatalogModel[] {\n const byKey = new Map<string, CatalogModel>();\n for (const [providerId, providerInfo] of Object.entries(catalog)) {\n for (const model of Object.values(providerInfo.models)) {\n const key = dedupKey(model.id);\n if (!key) continue;\n const bucket = mapProvider(providerId);\n const offering: ModelOffering = {\n id: model.id,\n rawProvider: providerId,\n bucket,\n pricing: {\n ...(model.cost?.input !== undefined ? { inputPerMTok: model.cost.input } : {}),\n ...(model.cost?.output !== undefined ? { outputPerMTok: model.cost.output } : {}),\n },\n ...(model.limit?.context !== undefined ? { contextWindow: model.limit.context } : {}),\n };\n const existing = byKey.get(key);\n if (existing) {\n existing.offerings.push(offering);\n if (!existing.buckets.includes(bucket)) existing.buckets.push(bucket);\n // Capabilities are the union across offerings.\n existing.capabilities.reasoning ||= model.reasoning ?? false;\n existing.capabilities.toolCall ||= model.tool_call ?? false;\n existing.capabilities.vision ||= model.modalities?.input?.includes(\"image\") ?? false;\n } else {\n byKey.set(key, {\n key,\n name: model.name ?? model.id,\n modality: classifyModality(model),\n capabilities: {\n reasoning: model.reasoning ?? false,\n toolCall: model.tool_call ?? false,\n vision: model.modalities?.input?.includes(\"image\") ?? false,\n },\n buckets: [bucket],\n offerings: [offering],\n });\n }\n }\n }\n return [...byKey.values()];\n}\n\nasync function loadCache(): Promise<CacheEntry> {\n const now = Date.now();\n if (cache && now - cache.fetchedAt < TTL_MS) return cache;\n if (inflight) return inflight;\n\n inflight = (async () => {\n try {\n const catalog = await fetchModels();\n cache = { index: buildIndex(catalog), logical: buildLogical(catalog), fetchedAt: Date.now() };\n return cache;\n } catch {\n // models.dev unreachable — reuse the last good catalog if we have one,\n // otherwise empty (callers degrade safely, e.g. BYOK → platform).\n if (cache) return cache;\n cache = { index: new Map(), logical: [], fetchedAt: Date.now() };\n return cache;\n } finally {\n inflight = null;\n }\n })();\n\n return inflight;\n}\n\nasync function loadIndex(): Promise<Map<string, ModelInfo>> {\n return (await loadCache()).index;\n}\n\n// ─── Public accessors ─────────────────────────────────────────────────────────\n\n/** Full model list (newest fetch, cached). */\nexport async function listModels(): Promise<ModelInfo[]> {\n return [...(await loadIndex()).values()];\n}\n\n/**\n * Deduped logical models for a given output modality — the canvas-orchestration\n * entry point. One entry per logical model, with the providers that serve it.\n * Sorted by offering count (most widely available first).\n */\nexport async function listModelsByModality(modality: ModelModality): Promise<CatalogModel[]> {\n const { logical } = await loadCache();\n return logical\n .filter((m) => m.modality === modality)\n .sort((a, b) => b.offerings.length - a.offerings.length);\n}\n\n/** Count of deduped logical models per modality (for canvas tab badges, etc.). */\nexport async function listModalities(): Promise<Record<ModelModality, number>> {\n const { logical } = await loadCache();\n const counts: Record<ModelModality, number> = {\n text: 0,\n image: 0,\n video: 0,\n audio: 0,\n embedding: 0,\n };\n for (const m of logical) counts[m.modality]++;\n return counts;\n}\n\n/** Look up a single model by id. `null` if unknown to the catalog. */\nexport async function getModelInfo(modelId: string): Promise<ModelInfo | null> {\n return (await loadIndex()).get(modelId) ?? null;\n}\n\n/**\n * Resolve the coarse provider bucket for a model id. Catalog-first; falls back\n * to id-prefix heuristics for brand-new models models.dev hasn't indexed yet.\n * `null` means \"unknown\" → callers should use the platform default.\n */\nexport async function providerForModel(modelId: string): Promise<AIProviderId | null> {\n const info = await getModelInfo(modelId);\n if (info) return info.provider;\n return providerFromIdHeuristic(modelId);\n}\n\n/** Last-resort id-prefix heuristic (only used when the catalog misses). */\nexport function providerFromIdHeuristic(modelId: string): AIProviderId | null {\n const m = modelId.toLowerCase().replace(/^[^/]+\\//, \"\"); // strip \"anthropic/\" style prefix\n if (/^(gpt-|o1|o3|o4|chatgpt|text-|davinci|babbage)/.test(m)) return \"OPENAI\";\n if (m.startsWith(\"claude\")) return \"ANTHROPIC\";\n if (m.startsWith(\"gemini\")) return \"GOOGLE\";\n if (/deepseek|qwen|glm|yi-|internlm|siliconflow|moonshot|kimi/.test(m)) return \"SILICONFLOW\";\n return null;\n}\n\n// ─── Frontier resolver (hybrid: live intersection + hardcoded fallback) ─────────\n//\n// Resolves a SEMANTIC tier (e.g. \"the latest reasoning model\") to a concrete\n// model id, picking the newest from the INTERSECTION of:\n// - gateway-routable ids (OpenRouter /api/v1/models — the gateway namespace), and\n// - models.dev catalog metadata (so the pick has pricing/context/capabilities).\n// On any failure (offline / empty) it returns the hardcoded fallback, so callers\n// always get a usable id. This is the \"don't hand-maintain model strings\" engine.\n\nexport type ModelTier =\n | \"reasoning\"\n | \"flagship\"\n | \"fast\"\n | \"openai-flagship\"\n | \"google-flagship\"\n | \"google-fast\";\n\ninterface TierRule {\n /** Match on the OpenRouter (gateway) id. */\n include: RegExp;\n /** Drop non-frontier variants (fast/mini/codex/image/…). */\n exclude: RegExp;\n /** Current frontier (audited 2026-06-05) — used when the live lists are unavailable. */\n fallback: string;\n}\n\nconst TIER_RULES: Record<ModelTier, TierRule> = {\n reasoning: {\n include: /^anthropic\\/claude-opus-/,\n exclude: /-(fast|mini|nano|image|codex)/,\n fallback: \"anthropic/claude-opus-4.8\",\n },\n flagship: {\n include: /^anthropic\\/claude-sonnet-/,\n exclude: /-(fast|mini|nano|image|codex)/,\n fallback: \"anthropic/claude-sonnet-4.6\",\n },\n fast: {\n include: /^anthropic\\/claude-haiku-/,\n exclude: /-(image|codex)/,\n fallback: \"anthropic/claude-haiku-4.5\",\n },\n \"openai-flagship\": {\n include: /^openai\\/gpt-5/,\n // Prefer full flagship over mini/nano/chat/image/codex variants\n exclude: /-(pro|mini|nano|codex|image|chat)|gpt-5\\.\\d+-(mini|nano|pro)/,\n // models.dev current OpenAI flagship (audited 2026-07); live resolver may pick newer\n fallback: \"openai/gpt-5.5\",\n },\n \"google-flagship\": {\n include: /^google\\/gemini-.*pro/,\n exclude: /-(image|tts|customtools)/,\n fallback: \"google/gemini-3.1-pro-preview\",\n },\n \"google-fast\": {\n include: /^google\\/gemini-.*flash/,\n exclude: /-(image|tts|lite)/,\n // models.dev: gemini-3.5-flash / 3.6-flash class\n fallback: \"google/gemini-3.5-flash\",\n },\n};\n\n/** The hardcoded frontier fallbacks, exported so consumers can mirror them. */\nexport const FRONTIER_FALLBACK: Record<ModelTier, string> = Object.fromEntries(\n Object.entries(TIER_RULES).map(([tier, rule]) => [tier, rule.fallback]),\n) as Record<ModelTier, string>;\n\nconst OPENROUTER_MODELS_URL =\n process.env.OPENROUTER_MODELS_URL ?? \"https://openrouter.ai/api/v1/models\";\n\nlet routableCache: { ids: Set<string>; fetchedAt: number } | null = null;\nlet routableInflight: Promise<Set<string>> | null = null;\n\n/** Gateway-routable model ids (OpenRouter), cached with the same TTL as the catalog. */\nasync function fetchRoutableIds(): Promise<Set<string>> {\n const now = Date.now();\n if (routableCache && now - routableCache.fetchedAt < TTL_MS) return routableCache.ids;\n if (routableInflight) return routableInflight;\n\n routableInflight = (async () => {\n try {\n const res = await fetch(OPENROUTER_MODELS_URL);\n if (!res.ok) throw new Error(`HTTP ${res.status}`);\n const json = (await res.json()) as { data?: Array<{ id?: string }> };\n const ids = new Set(\n (json.data ?? []).map((m) => m.id).filter((x): x is string => typeof x === \"string\"),\n );\n routableCache = { ids, fetchedAt: Date.now() };\n return ids;\n } catch {\n return routableCache?.ids ?? new Set<string>();\n } finally {\n routableInflight = null;\n }\n })();\n\n return routableInflight;\n}\n\n/** Collapse separators so `claude-opus-4.8` (OpenRouter) matches `claude-opus-4-8` (models.dev). */\nconst collapseId = (s: string): string => s.toLowerCase().replace(/[._-]/g, \"\");\nconst bareId = (id: string): string => {\n const slash = id.indexOf(\"/\");\n return slash >= 0 ? id.slice(slash + 1) : id;\n};\nconst versionOf = (id: string): number => {\n const m = bareId(id).match(/(\\d+(?:\\.\\d+)?)/);\n const raw = m?.[1];\n return raw ? Number.parseFloat(raw) : -1;\n};\n\n/**\n * Resolve a semantic tier to the newest concrete model id that is BOTH\n * gateway-routable and present in the models.dev catalog. Falls back to the\n * audited hardcoded frontier when the live lists are unavailable.\n */\nexport async function resolveFrontierModel(tier: ModelTier): Promise<string> {\n const rule = TIER_RULES[tier];\n try {\n const [routable, metaIndex] = await Promise.all([fetchRoutableIds(), loadIndex()]);\n if (routable.size === 0) return rule.fallback;\n\n const metaNorm = new Set([...metaIndex.keys()].map(collapseId));\n const candidates = [...routable].filter(\n (id) =>\n rule.include.test(id) && !rule.exclude.test(id) && metaNorm.has(collapseId(bareId(id))),\n );\n if (candidates.length === 0) return rule.fallback;\n\n candidates.sort((a, b) => versionOf(b) - versionOf(a));\n return candidates[0] ?? rule.fallback;\n } catch {\n return rule.fallback;\n }\n}\n\n// ─── Per-node model spec resolution ─────────────────────────────────────────────\n//\n// Resolves a node's model HINTS (id pin OR modality/effort/capability) to a\n// concrete model id. Mirrors agent-runtime NodeModelSpec structurally (plain\n// object — no cross-package dependency). Used by the workflow/agent executor.\n\nexport interface ModelSpecHints {\n /** Explicit pin — wins over every hint. Preset alias or `provider/model` id. */\n id?: string;\n reasoningEffort?: \"low\" | \"medium\" | \"high\" | \"xhigh\";\n modality?: ModelModality;\n capabilities?: { vision?: boolean; toolCall?: boolean; reasoning?: boolean };\n}\n\nconst EFFORT_TIER: Record<NonNullable<ModelSpecHints[\"reasoningEffort\"]>, ModelTier> = {\n low: \"fast\",\n medium: \"flagship\",\n high: \"flagship\",\n xhigh: \"reasoning\",\n};\n\nfunction pickByCapabilities(\n models: CatalogModel[],\n caps?: ModelSpecHints[\"capabilities\"],\n): CatalogModel | null {\n const filtered = caps\n ? models.filter(\n (m) =>\n (!caps.vision || m.capabilities.vision) &&\n (!caps.toolCall || m.capabilities.toolCall) &&\n (!caps.reasoning || m.capabilities.reasoning),\n )\n : models;\n return filtered[0] ?? null;\n}\n\n/**\n * Resolve a per-node model spec to a concrete model id. Precedence: explicit\n * `id` → non-text `modality` (most-available matching model) → `reasoningEffort`\n * tier (text frontier) → text `capabilities` match → `fallback` (the run\n * default). Never throws — degrades to `fallback`.\n */\nexport async function resolveModelSpec(spec: ModelSpecHints, fallback: string): Promise<string> {\n try {\n if (spec.id) return spec.id;\n\n if (spec.modality && spec.modality !== \"text\") {\n const match = pickByCapabilities(\n await listModelsByModality(spec.modality),\n spec.capabilities,\n );\n if (match) return match.offerings[0]?.id ?? match.key;\n return fallback;\n }\n\n if (spec.reasoningEffort) return resolveFrontierModel(EFFORT_TIER[spec.reasoningEffort]);\n\n if (spec.capabilities) {\n const match = pickByCapabilities(await listModelsByModality(\"text\"), spec.capabilities);\n if (match) return match.offerings[0]?.id ?? match.key;\n }\n\n return fallback;\n } catch {\n return fallback;\n }\n}\n\n/**\n * Default OpenAI-compatible base URL per provider bucket (env-overridable).\n * Single home for these — BYOK and any other caller import from here.\n */\nexport function providerBaseUrl(provider: AIProviderId): string | null {\n switch (provider) {\n case \"OPENAI\":\n return process.env.OPENAI_BASE_URL ?? \"https://api.openai.com/v1\";\n case \"ANTHROPIC\":\n return process.env.ANTHROPIC_BASE_URL ?? \"https://api.anthropic.com/v1\";\n case \"GOOGLE\":\n return (\n process.env.GOOGLE_BASE_URL ?? \"https://generativelanguage.googleapis.com/v1beta/openai\"\n );\n case \"SILICONFLOW\":\n return process.env.SILICONFLOW_BASE_URL ?? \"https://api.siliconflow.cn/v1\";\n default:\n // CUSTOM has no canonical endpoint — the caller must supply a baseUrl.\n return null;\n }\n}\n","/**\n * Provider registry metadata — single source of truth for the\n * create-sailor CLI and documentation generators.\n *\n * Coverage: 20 providers across direct labs, CN platforms, gateways,\n * inference accelerators, multimodal, local, and developer ecosystem.\n */\n\nexport type ProviderStatus = \"opencode\" | \"ai-sdk\" | \"cn-compatible\" | \"pending\";\n\nexport type ProviderCategory =\n | \"直接实验室\"\n | \"国内平台\"\n | \"云平台\"\n | \"推理加速\"\n | \"统一网关\"\n | \"多模态\"\n | \"本地部署\"\n | \"开发者生态\";\n\nexport interface ProviderMeta {\n id: string;\n name: string;\n category: ProviderCategory;\n status: ProviderStatus;\n docs: string;\n baseURL?: string;\n envVarPrefix: string;\n requiredEnvVars: string[];\n}\n\nexport const PROVIDERS: ProviderMeta[] = [\n // ─── 直接实验室 ───────────────────────────────────────────────\n {\n id: \"anthropic\",\n name: \"Anthropic\",\n category: \"直接实验室\",\n status: \"opencode\",\n docs: \"https://docs.anthropic.com\",\n envVarPrefix: \"ANTHROPIC\",\n requiredEnvVars: [\"ANTHROPIC_API_KEY\"],\n },\n {\n id: \"openai\",\n name: \"OpenAI\",\n category: \"直接实验室\",\n status: \"opencode\",\n docs: \"https://platform.openai.com/docs\",\n envVarPrefix: \"OPENAI\",\n requiredEnvVars: [\"OPENAI_API_KEY\"],\n },\n {\n id: \"deepseek\",\n name: \"DeepSeek\",\n category: \"直接实验室\",\n status: \"opencode\",\n docs: \"https://platform.deepseek.com/api-docs\",\n envVarPrefix: \"DEEPSEEK\",\n requiredEnvVars: [\"DEEPSEEK_API_KEY\"],\n },\n {\n id: \"xai\",\n name: \"xAI (Grok)\",\n category: \"直接实验室\",\n status: \"opencode\",\n docs: \"https://docs.x.ai/api\",\n envVarPrefix: \"XAI\",\n requiredEnvVars: [\"XAI_API_KEY\"],\n },\n {\n id: \"moonshot\",\n name: \"Moonshot (Kimi)\",\n category: \"直接实验室\",\n status: \"opencode\",\n docs: \"https://platform.moonshot.cn/docs\",\n envVarPrefix: \"MOONSHOT\",\n requiredEnvVars: [\"MOONSHOT_API_KEY\", \"MOONSHOT_BASE_URL\"],\n },\n {\n id: \"google\",\n name: \"Google Gemini\",\n category: \"直接实验室\",\n status: \"ai-sdk\",\n docs: \"https://ai.google.dev/gemini-api/docs\",\n envVarPrefix: \"GOOGLE_GENERATIVE_AI\",\n requiredEnvVars: [\"GOOGLE_GENERATIVE_AI_API_KEY\"],\n },\n {\n id: \"mistral\",\n name: \"Mistral AI\",\n category: \"直接实验室\",\n status: \"ai-sdk\",\n docs: \"https://docs.mistral.ai\",\n envVarPrefix: \"MISTRAL\",\n requiredEnvVars: [\"MISTRAL_API_KEY\"],\n },\n {\n id: \"cohere\",\n name: \"Cohere\",\n category: \"直接实验室\",\n status: \"ai-sdk\",\n docs: \"https://docs.cohere.com\",\n envVarPrefix: \"COHERE\",\n requiredEnvVars: [\"COHERE_API_KEY\"],\n },\n {\n id: \"perplexity\",\n name: \"Perplexity\",\n category: \"直接实验室\",\n status: \"cn-compatible\",\n docs: \"https://docs.perplexity.ai\",\n baseURL: \"https://api.perplexity.ai\",\n envVarPrefix: \"PERPLEXITY\",\n requiredEnvVars: [\"PERPLEXITY_API_KEY\"],\n },\n {\n id: \"ai21\",\n name: \"AI21 Labs\",\n category: \"直接实验室\",\n status: \"cn-compatible\",\n docs: \"https://docs.ai21.com\",\n baseURL: \"https://api.ai21.com/studio/v1\",\n envVarPrefix: \"AI21\",\n requiredEnvVars: [\"AI21_API_KEY\"],\n },\n {\n id: \"upstage\",\n name: \"Upstage (Solar)\",\n category: \"直接实验室\",\n status: \"cn-compatible\",\n docs: \"https://developers.upstage.ai/docs\",\n baseURL: \"https://api.upstage.ai/v1/solar\",\n envVarPrefix: \"UPSTAGE\",\n requiredEnvVars: [\"UPSTAGE_API_KEY\"],\n },\n\n // ─── 国内平台 ───────────────────────────────────────────────\n {\n id: \"siliconflow\",\n name: \"硅基流动 SiliconFlow\",\n category: \"国内平台\",\n status: \"cn-compatible\",\n docs: \"https://docs.siliconflow.cn\",\n baseURL: \"https://api.siliconflow.cn/v1\",\n envVarPrefix: \"SILICONFLOW\",\n requiredEnvVars: [\"SILICONFLOW_API_KEY\"],\n },\n {\n id: \"volcengine-ark\",\n name: \"火山引擎 ARK (豆包)\",\n category: \"国内平台\",\n status: \"cn-compatible\",\n docs: \"https://www.volcengine.com/docs/82379\",\n baseURL: \"https://ark.cn-beijing.volces.com/api/v3\",\n envVarPrefix: \"ARK\",\n requiredEnvVars: [\"ARK_API_KEY\"],\n },\n {\n id: \"bailian\",\n name: \"百炼 Bailian (通义)\",\n category: \"国内平台\",\n status: \"cn-compatible\",\n docs: \"https://help.aliyun.com/zh/model-studio\",\n baseURL: \"https://dashscope.aliyuncs.com/compatible-mode/v1\",\n envVarPrefix: \"DASHSCOPE\",\n requiredEnvVars: [\"DASHSCOPE_API_KEY\"],\n },\n {\n id: \"zhipu\",\n name: \"智谱 AI Zhipu\",\n category: \"国内平台\",\n status: \"ai-sdk\",\n docs: \"https://docs.bigmodel.cn\",\n baseURL: \"https://open.bigmodel.cn/api/paas/v4\",\n envVarPrefix: \"ZHIPU\",\n requiredEnvVars: [\"ZHIPU_API_KEY\"],\n },\n {\n id: \"baichuan\",\n name: \"百川智能 Baichuan\",\n category: \"国内平台\",\n status: \"cn-compatible\",\n docs: \"https://platform.baichuan-ai.com/docs\",\n baseURL: \"https://api.baichuan-ai.com/v1\",\n envVarPrefix: \"BAICHUAN\",\n requiredEnvVars: [\"BAICHUAN_API_KEY\"],\n },\n {\n id: \"minimax\",\n name: \"MiniMax (ABAB)\",\n category: \"国内平台\",\n status: \"cn-compatible\",\n docs: \"https://platform.minimaxi.com/document/guides\",\n baseURL: \"https://api.minimax.chat/v1\",\n envVarPrefix: \"MINIMAX\",\n requiredEnvVars: [\"MINIMAX_API_KEY\", \"MINIMAX_GROUP_ID\"],\n },\n {\n id: \"stepfun\",\n name: \"阶跃星辰 StepFun\",\n category: \"国内平台\",\n status: \"cn-compatible\",\n docs: \"https://platform.stepfun.com/docs\",\n baseURL: \"https://api.stepfun.com/v1\",\n envVarPrefix: \"STEPFUN\",\n requiredEnvVars: [\"STEPFUN_API_KEY\"],\n },\n {\n id: \"sensetime\",\n name: \"商汤 SenseNova\",\n category: \"国内平台\",\n status: \"cn-compatible\",\n docs: \"https://platform.sensenova.cn/docs\",\n // Token Plan OpenAI-compatible surface (NOT enterprise api.sensenova.cn)\n // Ref: https://github.com/OpenSenseNova/SenseNova6.7/blob/main/API_CN.md\n baseURL: \"https://token.sensenova.cn/v1\",\n envVarPrefix: \"SENSENOVA\",\n requiredEnvVars: [\"SENSENOVA_API_KEY\"],\n },\n {\n id: \"tencent\",\n name: \"腾讯混元 Hunyuan\",\n category: \"国内平台\",\n status: \"cn-compatible\",\n docs: \"https://cloud.tencent.com/document/product/1729\",\n baseURL: \"https://api.hunyuan.cloud.tencent.com/v1\",\n envVarPrefix: \"HUNYUAN\",\n requiredEnvVars: [\"HUNYUAN_API_KEY\"],\n },\n {\n id: \"lingyi\",\n name: \"零一万物 Yi\",\n category: \"国内平台\",\n status: \"cn-compatible\",\n docs: \"https://platform.lingyiwanwu.com/docs\",\n baseURL: \"https://api.lingyiwanwu.com/v1\",\n envVarPrefix: \"YI\",\n requiredEnvVars: [\"YI_API_KEY\"],\n },\n\n // ─── 统一网关 ───────────────────────────────────────────────\n {\n id: \"openrouter\",\n name: \"OpenRouter\",\n category: \"统一网关\",\n status: \"opencode\",\n docs: \"https://openrouter.ai/docs\",\n envVarPrefix: \"OPENROUTER\",\n requiredEnvVars: [\"OPENROUTER_API_KEY\"],\n },\n {\n id: \"vercel-gateway\",\n name: \"Vercel AI Gateway\",\n category: \"统一网关\",\n status: \"opencode\",\n docs: \"https://vercel.com/docs/ai-gateway\",\n envVarPrefix: \"AI_GATEWAY\",\n requiredEnvVars: [\"AI_GATEWAY_API_KEY\"],\n },\n {\n id: \"litellm\",\n name: \"LiteLLM Proxy\",\n category: \"统一网关\",\n status: \"cn-compatible\",\n docs: \"https://docs.litellm.ai\",\n baseURL: \"http://localhost:4000/v1\",\n envVarPrefix: \"LITELLM\",\n requiredEnvVars: [\"LITELLM_API_KEY\"],\n },\n {\n id: \"portkey\",\n name: \"Portkey\",\n category: \"统一网关\",\n status: \"cn-compatible\",\n docs: \"https://portkey.ai/docs\",\n baseURL: \"https://api.portkey.ai/v1\",\n envVarPrefix: \"PORTKEY\",\n requiredEnvVars: [\"PORTKEY_API_KEY\"],\n },\n {\n id: \"aws-bedrock\",\n name: \"AWS Bedrock\",\n category: \"云平台\",\n status: \"ai-sdk\",\n docs: \"https://aws.amazon.com/bedrock/\",\n envVarPrefix: \"AWS_BEDROCK\",\n requiredEnvVars: [\"AWS_ACCESS_KEY_ID\", \"AWS_SECRET_ACCESS_KEY\", \"AWS_REGION\"],\n },\n {\n id: \"azure-openai\",\n name: \"Azure OpenAI\",\n category: \"云平台\",\n status: \"ai-sdk\",\n docs: \"https://azure.microsoft.com/en-us/products/cognitive-services/openai-service/\",\n envVarPrefix: \"AZURE_OPENAI\",\n requiredEnvVars: [\"AZURE_OPENAI_API_KEY\", \"AZURE_OPENAI_ENDPOINT\"],\n },\n {\n id: \"gcp-vertex\",\n name: \"GCP Vertex AI\",\n category: \"云平台\",\n status: \"ai-sdk\",\n docs: \"https://cloud.google.com/vertex-ai\",\n envVarPrefix: \"GOOGLE_VERTEX\",\n requiredEnvVars: [\"GOOGLE_APPLICATION_CREDENTIALS\"],\n },\n\n // ─── 推理加速 ───────────────────────────────────────────────\n {\n id: \"groq\",\n name: \"Groq\",\n category: \"推理加速\",\n status: \"opencode\",\n docs: \"https://console.groq.com/docs\",\n envVarPrefix: \"GROQ\",\n requiredEnvVars: [\"GROQ_API_KEY\"],\n },\n {\n id: \"fireworks\",\n name: \"Fireworks AI\",\n category: \"推理加速\",\n status: \"opencode\",\n docs: \"https://docs.fireworks.ai\",\n envVarPrefix: \"FIREWORKS\",\n requiredEnvVars: [\"FIREWORKS_API_KEY\"],\n },\n {\n id: \"together\",\n name: \"Together AI\",\n category: \"推理加速\",\n status: \"opencode\",\n docs: \"https://docs.together.ai\",\n envVarPrefix: \"TOGETHER\",\n requiredEnvVars: [\"TOGETHER_API_KEY\"],\n },\n {\n id: \"huggingface\",\n name: \"Hugging Face\",\n category: \"推理加速\",\n status: \"opencode\",\n docs: \"https://huggingface.co/docs/inference-providers\",\n envVarPrefix: \"HF\",\n requiredEnvVars: [\"HF_API_KEY\"],\n },\n {\n id: \"replicate\",\n name: \"Replicate\",\n category: \"推理加速\",\n status: \"cn-compatible\",\n docs: \"https://replicate.com/docs\",\n envVarPrefix: \"REPLICATE\",\n requiredEnvVars: [\"REPLICATE_API_TOKEN\"],\n },\n {\n id: \"lepton\",\n name: \"Lepton AI\",\n category: \"推理加速\",\n status: \"cn-compatible\",\n docs: \"https://www.lepton.ai/docs\",\n baseURL: \"https://api.lepton.ai/v1\",\n envVarPrefix: \"LEPTON\",\n requiredEnvVars: [\"LEPTON_API_KEY\"],\n },\n {\n id: \"anyscale\",\n name: \"Anyscale Endpoints\",\n category: \"推理加速\",\n status: \"cn-compatible\",\n docs: \"https://docs.endpoints.anyscale.com/\",\n baseURL: \"https://api.endpoints.anyscale.com/v1\",\n envVarPrefix: \"ANYSCALE\",\n requiredEnvVars: [\"ANYSCALE_API_KEY\"],\n },\n {\n id: \"octoai\",\n name: \"OctoAI\",\n category: \"推理加速\",\n status: \"cn-compatible\",\n docs: \"https://octoai.cloud/docs\",\n baseURL: \"https://text.octoai.run/v1\",\n envVarPrefix: \"OCTOAI\",\n requiredEnvVars: [\"OCTOAI_TOKEN\"],\n },\n {\n id: \"deepinfra\",\n name: \"DeepInfra\",\n category: \"推理加速\",\n status: \"cn-compatible\",\n docs: \"https://deepinfra.com/docs\",\n baseURL: \"https://api.deepinfra.com/v1/openai\",\n envVarPrefix: \"DEEPINFRA\",\n requiredEnvVars: [\"DEEPINFRA_API_KEY\"],\n },\n {\n id: \"novita\",\n name: \"Novita AI\",\n category: \"推理加速\",\n status: \"cn-compatible\",\n docs: \"https://novita.ai/docs\",\n baseURL: \"https://api.novita.ai/v3/openai\",\n envVarPrefix: \"NOVITA\",\n requiredEnvVars: [\"NOVITA_API_KEY\"],\n },\n\n // ─── 多模态 ───────────────────────────────────────────────\n {\n id: \"black-forest-labs\",\n name: \"Black Forest Labs (FLUX)\",\n category: \"多模态\",\n status: \"ai-sdk\",\n docs: \"https://docs.bfl.ml\",\n envVarPrefix: \"BFL\",\n requiredEnvVars: [\"BFL_API_KEY\"],\n },\n {\n id: \"elevenlabs\",\n name: \"ElevenLabs (TTS)\",\n category: \"多模态\",\n status: \"ai-sdk\",\n docs: \"https://elevenlabs.io/docs\",\n envVarPrefix: \"ELEVENLABS\",\n requiredEnvVars: [\"ELEVENLABS_API_KEY\"],\n },\n {\n id: \"runway\",\n name: \"Runway (Video)\",\n category: \"多模态\",\n status: \"pending\",\n docs: \"https://runwayml.com\",\n envVarPrefix: \"RUNWAY\",\n requiredEnvVars: [\"RUNWAY_API_KEY\"],\n },\n {\n id: \"luma\",\n name: \"Luma (Video)\",\n category: \"多模态\",\n status: \"pending\",\n docs: \"https://lumalabs.ai\",\n envVarPrefix: \"LUMA\",\n requiredEnvVars: [\"LUMA_API_KEY\"],\n },\n {\n id: \"midjourney\",\n name: \"Midjourney\",\n category: \"多模态\",\n status: \"pending\",\n docs: \"https://docs.midjourney.com\",\n envVarPrefix: \"MIDJOURNEY\",\n requiredEnvVars: [],\n },\n\n // ─── 本地部署 ───────────────────────────────────────────────\n {\n id: \"ollama\",\n name: \"Ollama (本地)\",\n category: \"本地部署\",\n status: \"opencode\",\n docs: \"https://github.com/ollama/ollama\",\n baseURL: \"http://localhost:11434/v1\",\n envVarPrefix: \"OLLAMA\",\n requiredEnvVars: [\"OLLAMA_BASE_URL\"],\n },\n {\n id: \"lmstudio\",\n name: \"LM Studio\",\n category: \"本地部署\",\n status: \"cn-compatible\",\n docs: \"https://lmstudio.ai/docs\",\n baseURL: \"http://localhost:1234/v1\",\n envVarPrefix: \"LMSTUDIO\",\n requiredEnvVars: [],\n },\n {\n id: \"vllm\",\n name: \"vLLM\",\n category: \"本地部署\",\n status: \"cn-compatible\",\n docs: \"https://docs.vllm.ai\",\n baseURL: \"http://localhost:8000/v1\",\n envVarPrefix: \"VLLM\",\n requiredEnvVars: [],\n },\n {\n id: \"tgi\",\n name: \"HF TGI\",\n category: \"本地部署\",\n status: \"cn-compatible\",\n docs: \"https://huggingface.co/docs/text-generation-inference\",\n baseURL: \"http://localhost:8080/v1\",\n envVarPrefix: \"TGI\",\n requiredEnvVars: [],\n },\n];\n\nexport const PROVIDERS_BY_CATEGORY = PROVIDERS.reduce<Record<ProviderCategory, ProviderMeta[]>>(\n (acc, p) => {\n if (!acc[p.category]) acc[p.category] = [];\n acc[p.category].push(p);\n return acc;\n },\n {} as Record<ProviderCategory, ProviderMeta[]>,\n);\n\nexport function getProvider(id: string): ProviderMeta | undefined {\n return PROVIDERS.find((p) => p.id === id);\n}\n\nexport const isCNCompatible = (id: string): boolean => getProvider(id)?.status === \"cn-compatible\";\n"]}
|
package/dist/meta.d.ts
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Provider registry metadata — single source of truth for the
|
|
3
|
+
* create-sailor CLI and documentation generators.
|
|
4
|
+
*
|
|
5
|
+
* Coverage: 20 providers across direct labs, CN platforms, gateways,
|
|
6
|
+
* inference accelerators, multimodal, local, and developer ecosystem.
|
|
7
|
+
*/
|
|
8
|
+
type ProviderStatus = "opencode" | "ai-sdk" | "cn-compatible" | "pending";
|
|
9
|
+
type ProviderCategory = "直接实验室" | "国内平台" | "云平台" | "推理加速" | "统一网关" | "多模态" | "本地部署" | "开发者生态";
|
|
10
|
+
interface ProviderMeta {
|
|
11
|
+
id: string;
|
|
12
|
+
name: string;
|
|
13
|
+
category: ProviderCategory;
|
|
14
|
+
status: ProviderStatus;
|
|
15
|
+
docs: string;
|
|
16
|
+
baseURL?: string;
|
|
17
|
+
envVarPrefix: string;
|
|
18
|
+
requiredEnvVars: string[];
|
|
19
|
+
}
|
|
20
|
+
declare const PROVIDERS: ProviderMeta[];
|
|
21
|
+
declare const PROVIDERS_BY_CATEGORY: Record<ProviderCategory, ProviderMeta[]>;
|
|
22
|
+
declare function getProvider(id: string): ProviderMeta | undefined;
|
|
23
|
+
declare const isCNCompatible: (id: string) => boolean;
|
|
24
|
+
|
|
25
|
+
export { PROVIDERS, PROVIDERS_BY_CATEGORY, type ProviderCategory, type ProviderMeta, type ProviderStatus, getProvider, isCNCompatible };
|
package/dist/meta.js
ADDED
|
@@ -0,0 +1,474 @@
|
|
|
1
|
+
// src/meta.ts
|
|
2
|
+
var PROVIDERS = [
|
|
3
|
+
// ─── 直接实验室 ───────────────────────────────────────────────
|
|
4
|
+
{
|
|
5
|
+
id: "anthropic",
|
|
6
|
+
name: "Anthropic",
|
|
7
|
+
category: "\u76F4\u63A5\u5B9E\u9A8C\u5BA4",
|
|
8
|
+
status: "opencode",
|
|
9
|
+
docs: "https://docs.anthropic.com",
|
|
10
|
+
envVarPrefix: "ANTHROPIC",
|
|
11
|
+
requiredEnvVars: ["ANTHROPIC_API_KEY"]
|
|
12
|
+
},
|
|
13
|
+
{
|
|
14
|
+
id: "openai",
|
|
15
|
+
name: "OpenAI",
|
|
16
|
+
category: "\u76F4\u63A5\u5B9E\u9A8C\u5BA4",
|
|
17
|
+
status: "opencode",
|
|
18
|
+
docs: "https://platform.openai.com/docs",
|
|
19
|
+
envVarPrefix: "OPENAI",
|
|
20
|
+
requiredEnvVars: ["OPENAI_API_KEY"]
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
id: "deepseek",
|
|
24
|
+
name: "DeepSeek",
|
|
25
|
+
category: "\u76F4\u63A5\u5B9E\u9A8C\u5BA4",
|
|
26
|
+
status: "opencode",
|
|
27
|
+
docs: "https://platform.deepseek.com/api-docs",
|
|
28
|
+
envVarPrefix: "DEEPSEEK",
|
|
29
|
+
requiredEnvVars: ["DEEPSEEK_API_KEY"]
|
|
30
|
+
},
|
|
31
|
+
{
|
|
32
|
+
id: "xai",
|
|
33
|
+
name: "xAI (Grok)",
|
|
34
|
+
category: "\u76F4\u63A5\u5B9E\u9A8C\u5BA4",
|
|
35
|
+
status: "opencode",
|
|
36
|
+
docs: "https://docs.x.ai/api",
|
|
37
|
+
envVarPrefix: "XAI",
|
|
38
|
+
requiredEnvVars: ["XAI_API_KEY"]
|
|
39
|
+
},
|
|
40
|
+
{
|
|
41
|
+
id: "moonshot",
|
|
42
|
+
name: "Moonshot (Kimi)",
|
|
43
|
+
category: "\u76F4\u63A5\u5B9E\u9A8C\u5BA4",
|
|
44
|
+
status: "opencode",
|
|
45
|
+
docs: "https://platform.moonshot.cn/docs",
|
|
46
|
+
envVarPrefix: "MOONSHOT",
|
|
47
|
+
requiredEnvVars: ["MOONSHOT_API_KEY", "MOONSHOT_BASE_URL"]
|
|
48
|
+
},
|
|
49
|
+
{
|
|
50
|
+
id: "google",
|
|
51
|
+
name: "Google Gemini",
|
|
52
|
+
category: "\u76F4\u63A5\u5B9E\u9A8C\u5BA4",
|
|
53
|
+
status: "ai-sdk",
|
|
54
|
+
docs: "https://ai.google.dev/gemini-api/docs",
|
|
55
|
+
envVarPrefix: "GOOGLE_GENERATIVE_AI",
|
|
56
|
+
requiredEnvVars: ["GOOGLE_GENERATIVE_AI_API_KEY"]
|
|
57
|
+
},
|
|
58
|
+
{
|
|
59
|
+
id: "mistral",
|
|
60
|
+
name: "Mistral AI",
|
|
61
|
+
category: "\u76F4\u63A5\u5B9E\u9A8C\u5BA4",
|
|
62
|
+
status: "ai-sdk",
|
|
63
|
+
docs: "https://docs.mistral.ai",
|
|
64
|
+
envVarPrefix: "MISTRAL",
|
|
65
|
+
requiredEnvVars: ["MISTRAL_API_KEY"]
|
|
66
|
+
},
|
|
67
|
+
{
|
|
68
|
+
id: "cohere",
|
|
69
|
+
name: "Cohere",
|
|
70
|
+
category: "\u76F4\u63A5\u5B9E\u9A8C\u5BA4",
|
|
71
|
+
status: "ai-sdk",
|
|
72
|
+
docs: "https://docs.cohere.com",
|
|
73
|
+
envVarPrefix: "COHERE",
|
|
74
|
+
requiredEnvVars: ["COHERE_API_KEY"]
|
|
75
|
+
},
|
|
76
|
+
{
|
|
77
|
+
id: "perplexity",
|
|
78
|
+
name: "Perplexity",
|
|
79
|
+
category: "\u76F4\u63A5\u5B9E\u9A8C\u5BA4",
|
|
80
|
+
status: "cn-compatible",
|
|
81
|
+
docs: "https://docs.perplexity.ai",
|
|
82
|
+
baseURL: "https://api.perplexity.ai",
|
|
83
|
+
envVarPrefix: "PERPLEXITY",
|
|
84
|
+
requiredEnvVars: ["PERPLEXITY_API_KEY"]
|
|
85
|
+
},
|
|
86
|
+
{
|
|
87
|
+
id: "ai21",
|
|
88
|
+
name: "AI21 Labs",
|
|
89
|
+
category: "\u76F4\u63A5\u5B9E\u9A8C\u5BA4",
|
|
90
|
+
status: "cn-compatible",
|
|
91
|
+
docs: "https://docs.ai21.com",
|
|
92
|
+
baseURL: "https://api.ai21.com/studio/v1",
|
|
93
|
+
envVarPrefix: "AI21",
|
|
94
|
+
requiredEnvVars: ["AI21_API_KEY"]
|
|
95
|
+
},
|
|
96
|
+
{
|
|
97
|
+
id: "upstage",
|
|
98
|
+
name: "Upstage (Solar)",
|
|
99
|
+
category: "\u76F4\u63A5\u5B9E\u9A8C\u5BA4",
|
|
100
|
+
status: "cn-compatible",
|
|
101
|
+
docs: "https://developers.upstage.ai/docs",
|
|
102
|
+
baseURL: "https://api.upstage.ai/v1/solar",
|
|
103
|
+
envVarPrefix: "UPSTAGE",
|
|
104
|
+
requiredEnvVars: ["UPSTAGE_API_KEY"]
|
|
105
|
+
},
|
|
106
|
+
// ─── 国内平台 ───────────────────────────────────────────────
|
|
107
|
+
{
|
|
108
|
+
id: "siliconflow",
|
|
109
|
+
name: "\u7845\u57FA\u6D41\u52A8 SiliconFlow",
|
|
110
|
+
category: "\u56FD\u5185\u5E73\u53F0",
|
|
111
|
+
status: "cn-compatible",
|
|
112
|
+
docs: "https://docs.siliconflow.cn",
|
|
113
|
+
baseURL: "https://api.siliconflow.cn/v1",
|
|
114
|
+
envVarPrefix: "SILICONFLOW",
|
|
115
|
+
requiredEnvVars: ["SILICONFLOW_API_KEY"]
|
|
116
|
+
},
|
|
117
|
+
{
|
|
118
|
+
id: "volcengine-ark",
|
|
119
|
+
name: "\u706B\u5C71\u5F15\u64CE ARK (\u8C46\u5305)",
|
|
120
|
+
category: "\u56FD\u5185\u5E73\u53F0",
|
|
121
|
+
status: "cn-compatible",
|
|
122
|
+
docs: "https://www.volcengine.com/docs/82379",
|
|
123
|
+
baseURL: "https://ark.cn-beijing.volces.com/api/v3",
|
|
124
|
+
envVarPrefix: "ARK",
|
|
125
|
+
requiredEnvVars: ["ARK_API_KEY"]
|
|
126
|
+
},
|
|
127
|
+
{
|
|
128
|
+
id: "bailian",
|
|
129
|
+
name: "\u767E\u70BC Bailian (\u901A\u4E49)",
|
|
130
|
+
category: "\u56FD\u5185\u5E73\u53F0",
|
|
131
|
+
status: "cn-compatible",
|
|
132
|
+
docs: "https://help.aliyun.com/zh/model-studio",
|
|
133
|
+
baseURL: "https://dashscope.aliyuncs.com/compatible-mode/v1",
|
|
134
|
+
envVarPrefix: "DASHSCOPE",
|
|
135
|
+
requiredEnvVars: ["DASHSCOPE_API_KEY"]
|
|
136
|
+
},
|
|
137
|
+
{
|
|
138
|
+
id: "zhipu",
|
|
139
|
+
name: "\u667A\u8C31 AI Zhipu",
|
|
140
|
+
category: "\u56FD\u5185\u5E73\u53F0",
|
|
141
|
+
status: "ai-sdk",
|
|
142
|
+
docs: "https://docs.bigmodel.cn",
|
|
143
|
+
baseURL: "https://open.bigmodel.cn/api/paas/v4",
|
|
144
|
+
envVarPrefix: "ZHIPU",
|
|
145
|
+
requiredEnvVars: ["ZHIPU_API_KEY"]
|
|
146
|
+
},
|
|
147
|
+
{
|
|
148
|
+
id: "baichuan",
|
|
149
|
+
name: "\u767E\u5DDD\u667A\u80FD Baichuan",
|
|
150
|
+
category: "\u56FD\u5185\u5E73\u53F0",
|
|
151
|
+
status: "cn-compatible",
|
|
152
|
+
docs: "https://platform.baichuan-ai.com/docs",
|
|
153
|
+
baseURL: "https://api.baichuan-ai.com/v1",
|
|
154
|
+
envVarPrefix: "BAICHUAN",
|
|
155
|
+
requiredEnvVars: ["BAICHUAN_API_KEY"]
|
|
156
|
+
},
|
|
157
|
+
{
|
|
158
|
+
id: "minimax",
|
|
159
|
+
name: "MiniMax (ABAB)",
|
|
160
|
+
category: "\u56FD\u5185\u5E73\u53F0",
|
|
161
|
+
status: "cn-compatible",
|
|
162
|
+
docs: "https://platform.minimaxi.com/document/guides",
|
|
163
|
+
baseURL: "https://api.minimax.chat/v1",
|
|
164
|
+
envVarPrefix: "MINIMAX",
|
|
165
|
+
requiredEnvVars: ["MINIMAX_API_KEY", "MINIMAX_GROUP_ID"]
|
|
166
|
+
},
|
|
167
|
+
{
|
|
168
|
+
id: "stepfun",
|
|
169
|
+
name: "\u9636\u8DC3\u661F\u8FB0 StepFun",
|
|
170
|
+
category: "\u56FD\u5185\u5E73\u53F0",
|
|
171
|
+
status: "cn-compatible",
|
|
172
|
+
docs: "https://platform.stepfun.com/docs",
|
|
173
|
+
baseURL: "https://api.stepfun.com/v1",
|
|
174
|
+
envVarPrefix: "STEPFUN",
|
|
175
|
+
requiredEnvVars: ["STEPFUN_API_KEY"]
|
|
176
|
+
},
|
|
177
|
+
{
|
|
178
|
+
id: "sensetime",
|
|
179
|
+
name: "\u5546\u6C64 SenseNova",
|
|
180
|
+
category: "\u56FD\u5185\u5E73\u53F0",
|
|
181
|
+
status: "cn-compatible",
|
|
182
|
+
docs: "https://platform.sensenova.cn/docs",
|
|
183
|
+
// Token Plan OpenAI-compatible surface (NOT enterprise api.sensenova.cn)
|
|
184
|
+
// Ref: https://github.com/OpenSenseNova/SenseNova6.7/blob/main/API_CN.md
|
|
185
|
+
baseURL: "https://token.sensenova.cn/v1",
|
|
186
|
+
envVarPrefix: "SENSENOVA",
|
|
187
|
+
requiredEnvVars: ["SENSENOVA_API_KEY"]
|
|
188
|
+
},
|
|
189
|
+
{
|
|
190
|
+
id: "tencent",
|
|
191
|
+
name: "\u817E\u8BAF\u6DF7\u5143 Hunyuan",
|
|
192
|
+
category: "\u56FD\u5185\u5E73\u53F0",
|
|
193
|
+
status: "cn-compatible",
|
|
194
|
+
docs: "https://cloud.tencent.com/document/product/1729",
|
|
195
|
+
baseURL: "https://api.hunyuan.cloud.tencent.com/v1",
|
|
196
|
+
envVarPrefix: "HUNYUAN",
|
|
197
|
+
requiredEnvVars: ["HUNYUAN_API_KEY"]
|
|
198
|
+
},
|
|
199
|
+
{
|
|
200
|
+
id: "lingyi",
|
|
201
|
+
name: "\u96F6\u4E00\u4E07\u7269 Yi",
|
|
202
|
+
category: "\u56FD\u5185\u5E73\u53F0",
|
|
203
|
+
status: "cn-compatible",
|
|
204
|
+
docs: "https://platform.lingyiwanwu.com/docs",
|
|
205
|
+
baseURL: "https://api.lingyiwanwu.com/v1",
|
|
206
|
+
envVarPrefix: "YI",
|
|
207
|
+
requiredEnvVars: ["YI_API_KEY"]
|
|
208
|
+
},
|
|
209
|
+
// ─── 统一网关 ───────────────────────────────────────────────
|
|
210
|
+
{
|
|
211
|
+
id: "openrouter",
|
|
212
|
+
name: "OpenRouter",
|
|
213
|
+
category: "\u7EDF\u4E00\u7F51\u5173",
|
|
214
|
+
status: "opencode",
|
|
215
|
+
docs: "https://openrouter.ai/docs",
|
|
216
|
+
envVarPrefix: "OPENROUTER",
|
|
217
|
+
requiredEnvVars: ["OPENROUTER_API_KEY"]
|
|
218
|
+
},
|
|
219
|
+
{
|
|
220
|
+
id: "vercel-gateway",
|
|
221
|
+
name: "Vercel AI Gateway",
|
|
222
|
+
category: "\u7EDF\u4E00\u7F51\u5173",
|
|
223
|
+
status: "opencode",
|
|
224
|
+
docs: "https://vercel.com/docs/ai-gateway",
|
|
225
|
+
envVarPrefix: "AI_GATEWAY",
|
|
226
|
+
requiredEnvVars: ["AI_GATEWAY_API_KEY"]
|
|
227
|
+
},
|
|
228
|
+
{
|
|
229
|
+
id: "litellm",
|
|
230
|
+
name: "LiteLLM Proxy",
|
|
231
|
+
category: "\u7EDF\u4E00\u7F51\u5173",
|
|
232
|
+
status: "cn-compatible",
|
|
233
|
+
docs: "https://docs.litellm.ai",
|
|
234
|
+
baseURL: "http://localhost:4000/v1",
|
|
235
|
+
envVarPrefix: "LITELLM",
|
|
236
|
+
requiredEnvVars: ["LITELLM_API_KEY"]
|
|
237
|
+
},
|
|
238
|
+
{
|
|
239
|
+
id: "portkey",
|
|
240
|
+
name: "Portkey",
|
|
241
|
+
category: "\u7EDF\u4E00\u7F51\u5173",
|
|
242
|
+
status: "cn-compatible",
|
|
243
|
+
docs: "https://portkey.ai/docs",
|
|
244
|
+
baseURL: "https://api.portkey.ai/v1",
|
|
245
|
+
envVarPrefix: "PORTKEY",
|
|
246
|
+
requiredEnvVars: ["PORTKEY_API_KEY"]
|
|
247
|
+
},
|
|
248
|
+
{
|
|
249
|
+
id: "aws-bedrock",
|
|
250
|
+
name: "AWS Bedrock",
|
|
251
|
+
category: "\u4E91\u5E73\u53F0",
|
|
252
|
+
status: "ai-sdk",
|
|
253
|
+
docs: "https://aws.amazon.com/bedrock/",
|
|
254
|
+
envVarPrefix: "AWS_BEDROCK",
|
|
255
|
+
requiredEnvVars: ["AWS_ACCESS_KEY_ID", "AWS_SECRET_ACCESS_KEY", "AWS_REGION"]
|
|
256
|
+
},
|
|
257
|
+
{
|
|
258
|
+
id: "azure-openai",
|
|
259
|
+
name: "Azure OpenAI",
|
|
260
|
+
category: "\u4E91\u5E73\u53F0",
|
|
261
|
+
status: "ai-sdk",
|
|
262
|
+
docs: "https://azure.microsoft.com/en-us/products/cognitive-services/openai-service/",
|
|
263
|
+
envVarPrefix: "AZURE_OPENAI",
|
|
264
|
+
requiredEnvVars: ["AZURE_OPENAI_API_KEY", "AZURE_OPENAI_ENDPOINT"]
|
|
265
|
+
},
|
|
266
|
+
{
|
|
267
|
+
id: "gcp-vertex",
|
|
268
|
+
name: "GCP Vertex AI",
|
|
269
|
+
category: "\u4E91\u5E73\u53F0",
|
|
270
|
+
status: "ai-sdk",
|
|
271
|
+
docs: "https://cloud.google.com/vertex-ai",
|
|
272
|
+
envVarPrefix: "GOOGLE_VERTEX",
|
|
273
|
+
requiredEnvVars: ["GOOGLE_APPLICATION_CREDENTIALS"]
|
|
274
|
+
},
|
|
275
|
+
// ─── 推理加速 ───────────────────────────────────────────────
|
|
276
|
+
{
|
|
277
|
+
id: "groq",
|
|
278
|
+
name: "Groq",
|
|
279
|
+
category: "\u63A8\u7406\u52A0\u901F",
|
|
280
|
+
status: "opencode",
|
|
281
|
+
docs: "https://console.groq.com/docs",
|
|
282
|
+
envVarPrefix: "GROQ",
|
|
283
|
+
requiredEnvVars: ["GROQ_API_KEY"]
|
|
284
|
+
},
|
|
285
|
+
{
|
|
286
|
+
id: "fireworks",
|
|
287
|
+
name: "Fireworks AI",
|
|
288
|
+
category: "\u63A8\u7406\u52A0\u901F",
|
|
289
|
+
status: "opencode",
|
|
290
|
+
docs: "https://docs.fireworks.ai",
|
|
291
|
+
envVarPrefix: "FIREWORKS",
|
|
292
|
+
requiredEnvVars: ["FIREWORKS_API_KEY"]
|
|
293
|
+
},
|
|
294
|
+
{
|
|
295
|
+
id: "together",
|
|
296
|
+
name: "Together AI",
|
|
297
|
+
category: "\u63A8\u7406\u52A0\u901F",
|
|
298
|
+
status: "opencode",
|
|
299
|
+
docs: "https://docs.together.ai",
|
|
300
|
+
envVarPrefix: "TOGETHER",
|
|
301
|
+
requiredEnvVars: ["TOGETHER_API_KEY"]
|
|
302
|
+
},
|
|
303
|
+
{
|
|
304
|
+
id: "huggingface",
|
|
305
|
+
name: "Hugging Face",
|
|
306
|
+
category: "\u63A8\u7406\u52A0\u901F",
|
|
307
|
+
status: "opencode",
|
|
308
|
+
docs: "https://huggingface.co/docs/inference-providers",
|
|
309
|
+
envVarPrefix: "HF",
|
|
310
|
+
requiredEnvVars: ["HF_API_KEY"]
|
|
311
|
+
},
|
|
312
|
+
{
|
|
313
|
+
id: "replicate",
|
|
314
|
+
name: "Replicate",
|
|
315
|
+
category: "\u63A8\u7406\u52A0\u901F",
|
|
316
|
+
status: "cn-compatible",
|
|
317
|
+
docs: "https://replicate.com/docs",
|
|
318
|
+
envVarPrefix: "REPLICATE",
|
|
319
|
+
requiredEnvVars: ["REPLICATE_API_TOKEN"]
|
|
320
|
+
},
|
|
321
|
+
{
|
|
322
|
+
id: "lepton",
|
|
323
|
+
name: "Lepton AI",
|
|
324
|
+
category: "\u63A8\u7406\u52A0\u901F",
|
|
325
|
+
status: "cn-compatible",
|
|
326
|
+
docs: "https://www.lepton.ai/docs",
|
|
327
|
+
baseURL: "https://api.lepton.ai/v1",
|
|
328
|
+
envVarPrefix: "LEPTON",
|
|
329
|
+
requiredEnvVars: ["LEPTON_API_KEY"]
|
|
330
|
+
},
|
|
331
|
+
{
|
|
332
|
+
id: "anyscale",
|
|
333
|
+
name: "Anyscale Endpoints",
|
|
334
|
+
category: "\u63A8\u7406\u52A0\u901F",
|
|
335
|
+
status: "cn-compatible",
|
|
336
|
+
docs: "https://docs.endpoints.anyscale.com/",
|
|
337
|
+
baseURL: "https://api.endpoints.anyscale.com/v1",
|
|
338
|
+
envVarPrefix: "ANYSCALE",
|
|
339
|
+
requiredEnvVars: ["ANYSCALE_API_KEY"]
|
|
340
|
+
},
|
|
341
|
+
{
|
|
342
|
+
id: "octoai",
|
|
343
|
+
name: "OctoAI",
|
|
344
|
+
category: "\u63A8\u7406\u52A0\u901F",
|
|
345
|
+
status: "cn-compatible",
|
|
346
|
+
docs: "https://octoai.cloud/docs",
|
|
347
|
+
baseURL: "https://text.octoai.run/v1",
|
|
348
|
+
envVarPrefix: "OCTOAI",
|
|
349
|
+
requiredEnvVars: ["OCTOAI_TOKEN"]
|
|
350
|
+
},
|
|
351
|
+
{
|
|
352
|
+
id: "deepinfra",
|
|
353
|
+
name: "DeepInfra",
|
|
354
|
+
category: "\u63A8\u7406\u52A0\u901F",
|
|
355
|
+
status: "cn-compatible",
|
|
356
|
+
docs: "https://deepinfra.com/docs",
|
|
357
|
+
baseURL: "https://api.deepinfra.com/v1/openai",
|
|
358
|
+
envVarPrefix: "DEEPINFRA",
|
|
359
|
+
requiredEnvVars: ["DEEPINFRA_API_KEY"]
|
|
360
|
+
},
|
|
361
|
+
{
|
|
362
|
+
id: "novita",
|
|
363
|
+
name: "Novita AI",
|
|
364
|
+
category: "\u63A8\u7406\u52A0\u901F",
|
|
365
|
+
status: "cn-compatible",
|
|
366
|
+
docs: "https://novita.ai/docs",
|
|
367
|
+
baseURL: "https://api.novita.ai/v3/openai",
|
|
368
|
+
envVarPrefix: "NOVITA",
|
|
369
|
+
requiredEnvVars: ["NOVITA_API_KEY"]
|
|
370
|
+
},
|
|
371
|
+
// ─── 多模态 ───────────────────────────────────────────────
|
|
372
|
+
{
|
|
373
|
+
id: "black-forest-labs",
|
|
374
|
+
name: "Black Forest Labs (FLUX)",
|
|
375
|
+
category: "\u591A\u6A21\u6001",
|
|
376
|
+
status: "ai-sdk",
|
|
377
|
+
docs: "https://docs.bfl.ml",
|
|
378
|
+
envVarPrefix: "BFL",
|
|
379
|
+
requiredEnvVars: ["BFL_API_KEY"]
|
|
380
|
+
},
|
|
381
|
+
{
|
|
382
|
+
id: "elevenlabs",
|
|
383
|
+
name: "ElevenLabs (TTS)",
|
|
384
|
+
category: "\u591A\u6A21\u6001",
|
|
385
|
+
status: "ai-sdk",
|
|
386
|
+
docs: "https://elevenlabs.io/docs",
|
|
387
|
+
envVarPrefix: "ELEVENLABS",
|
|
388
|
+
requiredEnvVars: ["ELEVENLABS_API_KEY"]
|
|
389
|
+
},
|
|
390
|
+
{
|
|
391
|
+
id: "runway",
|
|
392
|
+
name: "Runway (Video)",
|
|
393
|
+
category: "\u591A\u6A21\u6001",
|
|
394
|
+
status: "pending",
|
|
395
|
+
docs: "https://runwayml.com",
|
|
396
|
+
envVarPrefix: "RUNWAY",
|
|
397
|
+
requiredEnvVars: ["RUNWAY_API_KEY"]
|
|
398
|
+
},
|
|
399
|
+
{
|
|
400
|
+
id: "luma",
|
|
401
|
+
name: "Luma (Video)",
|
|
402
|
+
category: "\u591A\u6A21\u6001",
|
|
403
|
+
status: "pending",
|
|
404
|
+
docs: "https://lumalabs.ai",
|
|
405
|
+
envVarPrefix: "LUMA",
|
|
406
|
+
requiredEnvVars: ["LUMA_API_KEY"]
|
|
407
|
+
},
|
|
408
|
+
{
|
|
409
|
+
id: "midjourney",
|
|
410
|
+
name: "Midjourney",
|
|
411
|
+
category: "\u591A\u6A21\u6001",
|
|
412
|
+
status: "pending",
|
|
413
|
+
docs: "https://docs.midjourney.com",
|
|
414
|
+
envVarPrefix: "MIDJOURNEY",
|
|
415
|
+
requiredEnvVars: []
|
|
416
|
+
},
|
|
417
|
+
// ─── 本地部署 ───────────────────────────────────────────────
|
|
418
|
+
{
|
|
419
|
+
id: "ollama",
|
|
420
|
+
name: "Ollama (\u672C\u5730)",
|
|
421
|
+
category: "\u672C\u5730\u90E8\u7F72",
|
|
422
|
+
status: "opencode",
|
|
423
|
+
docs: "https://github.com/ollama/ollama",
|
|
424
|
+
baseURL: "http://localhost:11434/v1",
|
|
425
|
+
envVarPrefix: "OLLAMA",
|
|
426
|
+
requiredEnvVars: ["OLLAMA_BASE_URL"]
|
|
427
|
+
},
|
|
428
|
+
{
|
|
429
|
+
id: "lmstudio",
|
|
430
|
+
name: "LM Studio",
|
|
431
|
+
category: "\u672C\u5730\u90E8\u7F72",
|
|
432
|
+
status: "cn-compatible",
|
|
433
|
+
docs: "https://lmstudio.ai/docs",
|
|
434
|
+
baseURL: "http://localhost:1234/v1",
|
|
435
|
+
envVarPrefix: "LMSTUDIO",
|
|
436
|
+
requiredEnvVars: []
|
|
437
|
+
},
|
|
438
|
+
{
|
|
439
|
+
id: "vllm",
|
|
440
|
+
name: "vLLM",
|
|
441
|
+
category: "\u672C\u5730\u90E8\u7F72",
|
|
442
|
+
status: "cn-compatible",
|
|
443
|
+
docs: "https://docs.vllm.ai",
|
|
444
|
+
baseURL: "http://localhost:8000/v1",
|
|
445
|
+
envVarPrefix: "VLLM",
|
|
446
|
+
requiredEnvVars: []
|
|
447
|
+
},
|
|
448
|
+
{
|
|
449
|
+
id: "tgi",
|
|
450
|
+
name: "HF TGI",
|
|
451
|
+
category: "\u672C\u5730\u90E8\u7F72",
|
|
452
|
+
status: "cn-compatible",
|
|
453
|
+
docs: "https://huggingface.co/docs/text-generation-inference",
|
|
454
|
+
baseURL: "http://localhost:8080/v1",
|
|
455
|
+
envVarPrefix: "TGI",
|
|
456
|
+
requiredEnvVars: []
|
|
457
|
+
}
|
|
458
|
+
];
|
|
459
|
+
var PROVIDERS_BY_CATEGORY = PROVIDERS.reduce(
|
|
460
|
+
(acc, p) => {
|
|
461
|
+
if (!acc[p.category]) acc[p.category] = [];
|
|
462
|
+
acc[p.category].push(p);
|
|
463
|
+
return acc;
|
|
464
|
+
},
|
|
465
|
+
{}
|
|
466
|
+
);
|
|
467
|
+
function getProvider(id) {
|
|
468
|
+
return PROVIDERS.find((p) => p.id === id);
|
|
469
|
+
}
|
|
470
|
+
var isCNCompatible = (id) => getProvider(id)?.status === "cn-compatible";
|
|
471
|
+
|
|
472
|
+
export { PROVIDERS, PROVIDERS_BY_CATEGORY, getProvider, isCNCompatible };
|
|
473
|
+
//# sourceMappingURL=meta.js.map
|
|
474
|
+
//# sourceMappingURL=meta.js.map
|