| 1 | import type { ProviderView } from "./types"; |
| 2 | import type { MockProviderPresetTemplate } from "./mockModelScopePreset"; |
| 3 | export function mockProviderTemplate(p: Pick<ProviderView, "name" | "kind" | "baseUrl" | "models" | "default" | "apiKeyEnv"> & Partial<ProviderView>): ProviderView { |
| 4 | return { |
| 5 | name: p.name, |
| 6 | builtIn: false, |
| 7 | added: true, |
| 8 | kind: p.kind, |
| 9 | baseUrl: p.baseUrl, |
| 10 | modelsUrl: p.modelsUrl ?? "", |
| 11 | models: p.models, |
| 12 | visionModels: p.visionModels ?? [], |
| 13 | visionModelsConfigured: Boolean(p.visionModelsConfigured ?? ((p.visionModels ?? []).length > 0)), |
| 14 | visionCapability: p.visionCapability, |
| 15 | default: p.default, |
| 16 | apiKeyEnv: p.apiKeyEnv, |
| 17 | headers: p.headers, |
| 18 | extraBody: p.extraBody, |
| 19 | authHeader: p.authHeader, |
| 20 | noProxy: p.noProxy, |
| 21 | keySet: Boolean(p.keySet), |
| 22 | balanceUrl: p.balanceUrl ?? "", |
| 23 | contextWindow: p.contextWindow ?? 0, |
| 24 | reasoningProtocol: p.reasoningProtocol ?? "", |
| 25 | thinking: p.thinking ?? "", |
| 26 | webSearch: Boolean(p.webSearch), |
| 27 | serverWebSearchCapability: Boolean(p.serverWebSearchCapability), |
| 28 | supportedEfforts: p.supportedEfforts ?? [], |
| 29 | defaultEffort: p.defaultEffort ?? "", |
| 30 | modelOverrides: p.modelOverrides, |
| 31 | }; |
| 32 | } |
| 33 | |
| 34 | export function mockPreset(id: string, label: string, description: string, keyEnv: string, provider: ProviderView, metadata: Partial<Pick<MockProviderPresetTemplate, "recommended" | "billingMode" | "displayGroup" | "displaySection" | "displayTier" | "routeKind" | "optional" | "displayOrder">> = {}): MockProviderPresetTemplate { |
| 35 | return { id, label, description, keyEnv, provider, providers: [provider], ...metadata }; |
| 36 | } |
| 37 | |
| 38 | export function mockBundlePreset(id: string, label: string, description: string, keyEnv: string, providers: ProviderView[], metadata: Partial<Pick<MockProviderPresetTemplate, "recommended" | "billingMode" | "displayGroup" | "displaySection" | "displayTier" | "routeKind" | "optional" | "displayOrder">> = {}): MockProviderPresetTemplate { |
| 39 | return { id, label, description, keyEnv, provider: providers[0], providers, ...metadata }; |
| 40 | } |
| 41 | |
| 42 | export const mockKimiAPIModels = ["kimi-k3", "kimi-k2.7-code", "kimi-k2.7-code-highspeed", "kimi-k2.6", "kimi-k2.5"]; |
| 43 | export const mockLongCatModels = ["LongCat-2.0"]; |
| 44 | export const mockTokenRhythmModels = ["deepseek-v4-flash", "deepseek-v4-pro", "glm-5", "glm-5.1", "minimax-m2.7", "kimi-k2.5", "kimi-k2.6", "minimax-m2.5", "mimo-v2.5-pro", "qwen3.7-max", "kimi-k2.7-code", "glm-5.2", "qwen3.8-max", "deepseek-v4-flash-0731"]; |
| 45 | export const mockTokenRhythmModelOverrides = mockTokenRhythmModels.flatMap((model) => { |
| 46 | if (model.startsWith("glm-")) return [{ model, reasoningProtocol: "glm", supportedEfforts: ["enabled", "disabled"], defaultEffort: "enabled" }]; |
| 47 | if (model.startsWith("deepseek-")) return [{ model, reasoningProtocol: "deepseek", supportedEfforts: model === "deepseek-v4-pro" ? ["disabled", "high", "max"] : ["disabled", "low", "high", "max"], defaultEffort: "high" }]; |
| 48 | return []; |
| 49 | }); |
| 50 | export const mockMiMoV25Models = ["mimo-v2.5-pro", "mimo-v2.5"]; |
| 51 | export const mockMiniMaxModels = ["MiniMax-M3", "MiniMax-M2.7", "MiniMax-M2.7-highspeed"]; |
| 52 | export const mockGLMAPIModels = ["glm-5.2", "glm-5.1", "glm-5", "glm-5-turbo", "glm-5v-turbo", "glm-4.7", "glm-4.7-flash", "glm-4.7-flashx", "glm-4.6", "glm-4.5", "glm-4.5-air", "glm-4.5-flash"]; |
| 53 | export const mockGLMCodingModels = ["glm-5.2", "glm-5.1", "glm-5", "glm-4.7"]; |
| 54 | export const mockGLMAnthropicModels = ["glm-5.2[1m]", "glm-5.2", "glm-5.1", "glm-5", "glm-4.7", "glm-4.5-air"]; |
| 55 | export const mockQwenAPIModels = ["qwen3.7-plus", "qwen3.7-max", "qwen3.6-plus", "qwen3.5-plus", "qwen3-max-2026-01-23", "qwen3-coder-next", "qwen3-coder-plus", "MiniMax-M2.5", "glm-5", "glm-4.7", "kimi-k2.5"]; |
| 56 | export const mockQwenPlanModels = ["qwen3.7-plus", "qwen3.6-plus", "kimi-k2.5", "glm-5", "MiniMax-M2.5", "qwen3.5-plus", "qwen3-max-2026-01-23", "qwen3-coder-next", "qwen3-coder-plus", "glm-4.7"]; |
| 57 | export const mockQwenPlanVisionModels = ["qwen3.7-plus", "qwen3.6-plus", "qwen3.5-plus", "kimi-k2.5"]; |
| 58 | export const mockStepFunModels = ["step-3.7-flash", "step-3.5-flash", "step-3.5-flash-2603"]; |
| 59 | export const mockOpenCodeGoModels = ["glm-5.3", "glm-5.2", "glm-5.1", "kimi-k3", "kimi-k2.7-code", "kimi-k2.6", "deepseek-v4-pro", "deepseek-v4-flash", "mimo-v2.5-pro", "mimo-v2.5", "hy3"]; |
| 60 | export const mockNovitaModels = ["zai-org/glm-5.2", "moonshotai/kimi-k2.7-code", "minimax/minimax-m3", "deepseek/deepseek-v4-pro", "deepseek/deepseek-v4-flash", "qwen/qwen3.7-max", "qwen/qwen3.6-plus", "zai-org/glm-5v-turbo"]; |
| 61 | export const mockGMIModels = ["zai-org/GLM-5.2-FP8", "deepseek-ai/DeepSeek-V4-Pro", "deepseek-ai/DeepSeek-V4-Flash", "moonshotai/Kimi-K2.7-Code", "anthropic/claude-sonnet-4.6", "openai/gpt-5.5"]; |
| 62 | export const mockVercelModels = ["anthropic/claude-sonnet-4.6", "anthropic/claude-opus-4.8", "openai/gpt-5.4", "openai/gpt-5.4-pro", "moonshotai/kimi-k2.7-code", "zai/glm-5.2", "deepseek/deepseek-v4-pro"]; |
| 63 | export const mockOllamaCloudModels = ["glm-5.2", "kimi-k2.7-code", "deepseek-v4-pro", "deepseek-v4-flash", "minimax-m3", "nemotron-3-nano:30b", "qwen3-coder-next"]; |
| 64 | |
| 65 |