diff --git a/apps/desktop/src/components/editor/EditorSettingsDialog.vue b/apps/desktop/src/components/editor/EditorSettingsDialog.vue index 5e293ad07d..e86f00f349 100644 --- a/apps/desktop/src/components/editor/EditorSettingsDialog.vue +++ b/apps/desktop/src/components/editor/EditorSettingsDialog.vue @@ -67,6 +67,7 @@ import { normalizeAiHeaders, getAiProviderPreset, getAiProviderPresetId, + getAiProviderPresetDefaultEndpoint, getAiProviderPresetOption, isAiPartnerProviderPreset, type AiProvider, @@ -247,7 +248,7 @@ import { METADATA_CACHE_HARD_MAX_MEMORY_MB, METADATA_CACHE_MIN_MEMORY_MB, normal import { databaseManifestEntry, manifestDatabaseTypes } from "@/lib/database/databaseDriverManifest"; import { buildConnectionGroupIdPathMap, connectionGroupDestinationRows, connectionIdsInGroups } from "@/lib/sidebar/sidebarLayout"; -const { t } = useI18n(); +const { t, locale } = useI18n(); const { toast } = useToast(); const settingsStore = useSettingsStore(); const connectionStore = useConnectionStore(); @@ -4368,7 +4369,7 @@ function aiSelectProvider(presetId: string) { aiEditProvider.value = provider; aiEditApiKey.value = ""; aiEditAuthMethod.value = preset.authMethod; - aiEditEndpoint.value = preset.endpoint; + aiEditEndpoint.value = getAiProviderPresetDefaultEndpoint(preset, locale.value); aiEditModel.value = preset.group === "partner" ? preset.model : ""; aiEditLegacyModels.value = preset.group === "partner" ? [...(preset.models ?? [])] : []; aiEditApiStyle.value = preset.apiStyle; diff --git a/apps/desktop/src/stores/__tests__/settingsStore.spec.ts b/apps/desktop/src/stores/__tests__/settingsStore.spec.ts index 7d81d635d5..48f68870ae 100644 --- a/apps/desktop/src/stores/__tests__/settingsStore.spec.ts +++ b/apps/desktop/src/stores/__tests__/settingsStore.spec.ts @@ -7,6 +7,7 @@ import { EXECUTE_MODE_CURRENT_DEFAULT_VERSION, SIDEBAR_BROWSE_OBJECTS_MIGRATION_VERSION, enforceRightSidebarPanelExclusivity, + getAiProviderPresetDefaultEndpoint, normalizeAiConfig, normalizeDesktopSettings, normalizeEditorSettings, @@ -771,6 +772,18 @@ describe("settingsStore AI API key normalization", () => { expect(normalizeAiConfig({ endpoint: "https://api.moonshot.cn/v1", model: "kimi-k2.5" }).provider).toBe("kimi"); }); + it("uses the mainland MiniMax endpoint only for new zh-CN presets", () => { + expect(getAiProviderPresetDefaultEndpoint(AI_PROVIDER_PRESETS.minimax, "zh-CN")).toBe("https://api.minimaxi.com/v1"); + expect(getAiProviderPresetDefaultEndpoint(AI_PROVIDER_PRESETS.minimax, "zh-TW")).toBe("https://api.minimax.io/v1"); + expect(getAiProviderPresetDefaultEndpoint(AI_PROVIDER_PRESETS.minimax, "en")).toBe("https://api.minimax.io/v1"); + expect(getAiProviderPresetDefaultEndpoint(AI_PROVIDER_PRESETS.openai, "zh-CN")).toBe(AI_PROVIDER_PRESETS.openai.endpoint); + }); + + it("preserves saved MiniMax endpoints during normalization", () => { + expect(normalizeAiConfig({ provider: "minimax", endpoint: "https://api.minimaxi.com/v1" }).endpoint).toBe("https://api.minimaxi.com/v1"); + expect(normalizeAiConfig({ provider: "minimax", endpoint: "https://minimax.example.com/v1" }).endpoint).toBe("https://minimax.example.com/v1"); + }); + it("normalizes OpenCode CLI path and environment settings", () => { expect( normalizeAiConfig({ diff --git a/apps/desktop/src/stores/settingsStore.ts b/apps/desktop/src/stores/settingsStore.ts index 7542a8fb1e..af9c41fe28 100644 --- a/apps/desktop/src/stores/settingsStore.ts +++ b/apps/desktop/src/stores/settingsStore.ts @@ -486,6 +486,13 @@ export function getAiProviderPresetOption(id: string): AiProviderPreset | AiPart return AI_PROVIDER_PARTNER_PRESETS.find((preset) => preset.id === id) ?? AI_PROVIDER_PRESETS[id as AiProvider] ?? AI_PROVIDER_PRESETS.custom; } +export function getAiProviderPresetDefaultEndpoint(preset: AiProviderPreset | AiPartnerProviderPreset, locale: string): string { + if (preset.provider === "minimax" && locale === "zh-CN") { + return "https://api.minimaxi.com/v1"; + } + return preset.endpoint; +} + export function getAiProviderPresetId(provider: AiProvider, endpoint = ""): string { const preset = getAiProviderPreset(provider, endpoint); return "id" in preset ? preset.id : provider;