fix(hermes): prefill MiniMax provider keys that don't collide with Hermes built-ins (#8538)

Hermes routes model.provider `minimax` to its built-in provider and ignores a
same-named custom_provider, so no request is sent. The MiniMax presets now
prefill cc-switch-minimax / cc-switch-minimax-en, and MiniMax-M3.1-Flash
declares supports_vision so images go to the main request.
This commit is contained in:
SaladDay authored and GitHub committed 2026-10-19 18:01:30 +08:00
1 parent 734c4831dd
commit 0bbbb534fc
4 files changed
+58 -8

No files matched your search

@@ -2291,7 +2291,7 @@ function ProviderFormFull({
const preset = entry.preset as HermesProviderPreset;
const config = preset.settingsConfig;
hermesForm.resetHermesState(config);
hermesForm.resetHermesState(config, preset.providerKey);
form.reset({
name: preset.nameKey ? t(preset.nameKey) : preset.name,
@@ -44,7 +44,10 @@ export interface HermesFormState {
handleHermesApiModeChange: (mode: HermesApiMode) => void;
handleHermesModelsChange: (models: HermesModel[]) => void;
handleHermesRateLimitDelayChange: (delay: number | undefined) => void;
resetHermesState: (config?: Partial<HermesProviderSettingsConfig>) => void;
resetHermesState: (
config?: Partial<HermesProviderSettingsConfig>,
providerKey?: string,
) => void;
}
function parseHermesField<T>(
@@ -195,8 +198,8 @@ export function useHermesFormState({
);
const resetHermesState = useCallback(
(config?: Partial<HermesProviderSettingsConfig>) => {
setHermesProviderKey("");
(config?: Partial<HermesProviderSettingsConfig>, providerKey?: string) => {
setHermesProviderKey(providerKey ?? "");
setHermesBaseUrl(config?.base_url || "");
setHermesApiKey(config?.api_key || "");
setHermesApiMode(config?.api_mode ?? HERMES_DEFAULT_API_MODE);
+18 -4
View File
@@ -121,6 +121,12 @@ export interface HermesProviderPreset extends PresetFamilyFields {
isCustomTemplate?: boolean;
/** Optional top-level `model:` defaults written on switch. */
suggestedDefaults?: HermesSuggestedDefaults;
/**
* Provider key prefilled when the preset is picked. Set it when the obvious
* name is a Hermes built-in provider id (e.g. `minimax`): Hermes routes
* `model.provider` to the built-in, ignoring a same-named custom_provider.
*/
providerKey?: string;
}
export interface HermesProviderSettingsConfig {
@@ -2334,8 +2340,10 @@ export const hermesProviderPresets: HermesProviderPreset[] = [
regionKey: "cn",
websiteUrl: "https://platform.minimax.cn",
apiKeyUrl: "https://platform.minimax.cn/subscribe/token-plan",
// `minimax` / `minimax-cn` are Hermes built-ins that shadow custom_providers
providerKey: "cc-switch-minimax",
settingsConfig: {
name: "minimax",
name: "cc-switch-minimax",
base_url: "https://api.minimax.cn/v1",
api_key: "",
api_mode: "chat_completions",
@@ -2343,6 +2351,7 @@ export const hermesProviderPresets: HermesProviderPreset[] = [
{
id: "MiniMax-M3.1-Flash",
name: "MiniMax M3.1 Flash",
supports_vision: true,
},
{ id: "MiniMax-M3", name: "MiniMax M3" },
],
@@ -2354,7 +2363,7 @@ export const hermesProviderPresets: HermesProviderPreset[] = [
icon: "minimax",
iconColor: "#FF6B6B",
suggestedDefaults: {
model: { default: "MiniMax-M3.1-Flash", provider: "minimax" },
model: { default: "MiniMax-M3.1-Flash", provider: "cc-switch-minimax" },
},
},
{
@@ -2363,8 +2372,9 @@ export const hermesProviderPresets: HermesProviderPreset[] = [
regionKey: "intl",
websiteUrl: "https://platform.minimax.io",
apiKeyUrl: "https://platform.minimax.io/subscribe/coding-plan",
providerKey: "cc-switch-minimax-en",
settingsConfig: {
name: "minimax_en",
name: "cc-switch-minimax-en",
base_url: "https://api.minimax.io/v1",
api_key: "",
api_mode: "chat_completions",
@@ -2372,6 +2382,7 @@ export const hermesProviderPresets: HermesProviderPreset[] = [
{
id: "MiniMax-M3.1-Flash",
name: "MiniMax M3.1 Flash",
supports_vision: true,
},
{ id: "MiniMax-M3", name: "MiniMax M3" },
],
@@ -2383,7 +2394,10 @@ export const hermesProviderPresets: HermesProviderPreset[] = [
icon: "minimax",
iconColor: "#FF6B6B",
suggestedDefaults: {
model: { default: "MiniMax-M3.1-Flash", provider: "minimax_en" },
model: {
default: "MiniMax-M3.1-Flash",
provider: "cc-switch-minimax-en",
},
},
},
{
@@ -0,0 +1,33 @@
import { describe, expect, it } from "vitest";
import { hermesProviderPresets } from "@/config/hermesProviderPresets";
// Hermes routes `model.provider` to a built-in provider when the name is a
// canonical built-in id, ignoring a same-named custom_provider.
const HERMES_BUILTIN_MINIMAX_IDS = ["minimax", "minimax-cn", "minimax-oauth"];
describe("Hermes MiniMax presets", () => {
it.each(["MiniMax", "MiniMax en"])(
"%s prefills a provider key that no Hermes built-in shadows",
(name) => {
const preset = hermesProviderPresets.find((p) => p.name === name);
expect(preset).toBeDefined();
const key = preset!.providerKey;
expect(key).toMatch(/^[a-z0-9]+(-[a-z0-9]+)*$/);
expect(HERMES_BUILTIN_MINIMAX_IDS).not.toContain(key);
expect(preset!.settingsConfig.name).toBe(key);
expect(preset!.suggestedDefaults?.model.provider).toBe(key);
},
);
it.each(["MiniMax", "MiniMax en"])(
"%s declares image input for MiniMax-M3.1-Flash",
(name) => {
const preset = hermesProviderPresets.find((p) => p.name === name);
const flash = preset!.settingsConfig.models?.find(
(m) => m.id === "MiniMax-M3.1-Flash",
);
expect(flash?.supports_vision).toBe(true);
},
);
});