fix: add MiniMax highspeed variants and deduplicate model list

- Add MiniMax-M2.7/M2.5/M2.1/M2 -highspeed variants for both
  international and China providers (#17)
- Deduplicate models in /available-models response to fix
  repeated entries when using Copilot or other providers (#18)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
ekko
2026-04-17 12:04:20 +08:00
parent dcb477594b
commit 9a0b50f370
3 changed files with 26 additions and 7 deletions
+2 -2
View File
@@ -86,13 +86,13 @@ export const PROVIDER_PRESETS: ProviderPreset[] = [
label: 'MiniMax', label: 'MiniMax',
value: 'minimax', value: 'minimax',
base_url: 'https://api.minimax.io/anthropic/v1', base_url: 'https://api.minimax.io/anthropic/v1',
models: ['MiniMax-M2.7', 'MiniMax-M2.5', 'MiniMax-M2.1', 'MiniMax-M2'], models: ['MiniMax-M2.7', 'MiniMax-M2.7-highspeed', 'MiniMax-M2.5', 'MiniMax-M2.5-highspeed', 'MiniMax-M2.1', 'MiniMax-M2.1-highspeed', 'MiniMax-M2', 'MiniMax-M2-highspeed'],
}, },
{ {
label: 'MiniMax (China)', label: 'MiniMax (China)',
value: 'minimax-cn', value: 'minimax-cn',
base_url: 'https://api.minimaxi.com/v1', base_url: 'https://api.minimaxi.com/v1',
models: ['MiniMax-M2.7', 'MiniMax-M2.5', 'MiniMax-M2.1', 'MiniMax-M2'], models: ['MiniMax-M2.7', 'MiniMax-M2.7-highspeed', 'MiniMax-M2.5', 'MiniMax-M2.5-highspeed', 'MiniMax-M2.1', 'MiniMax-M2.1-highspeed', 'MiniMax-M2', 'MiniMax-M2-highspeed'],
}, },
{ {
label: 'Alibaba Cloud', label: 'Alibaba Cloud',
@@ -513,21 +513,40 @@ fsRoutes.get('/api/hermes/available-models', async (ctx) => {
for (const result of results) { for (const result of results) {
if (result.status === 'fulfilled' && result.value.models.length > 0) { if (result.status === 'fulfilled' && result.value.models.length > 0) {
const { key, label, base_url, models } = result.value const { key, label, base_url, models } = result.value
groups.push({ provider: key, label, base_url, models }) groups.push({ provider: key, label, base_url, models: [...new Set(models)] })
} else if (result.status === 'rejected') { } else if (result.status === 'rejected') {
console.error(`[available-models] Failed: ${result.reason?.message || result.reason}`) console.error(`[available-models] Failed: ${result.reason?.message || result.reason}`)
} }
} }
} }
// Deduplicate models within each group and merge groups with the same provider key
const dedupedGroups: typeof groups = []
const seenProviders = new Map<string, number>()
for (const g of groups) {
g.models = [...new Set(g.models)]
const existingIdx = seenProviders.get(g.provider)
if (existingIdx !== undefined) {
// Merge models into existing group
const existing = dedupedGroups[existingIdx]
const existingSet = new Set(existing.models)
for (const m of g.models) {
if (!existingSet.has(m)) existing.models.push(m)
}
} else {
seenProviders.set(g.provider, dedupedGroups.length)
dedupedGroups.push(g)
}
}
// Fallback: if no providers returned models, fall back to config.yaml parsing // Fallback: if no providers returned models, fall back to config.yaml parsing
if (groups.length === 0) { if (dedupedGroups.length === 0) {
const fallback = buildModelGroups(config) const fallback = buildModelGroups(config)
ctx.body = fallback ctx.body = fallback
return return
} }
ctx.body = { default: currentDefault, groups } ctx.body = { default: currentDefault, groups: dedupedGroups }
} catch (err: any) { } catch (err: any) {
ctx.status = 500 ctx.status = 500
ctx.body = { error: err.message } ctx.body = { error: err.message }
+2 -2
View File
@@ -86,13 +86,13 @@ export const PROVIDER_PRESETS: ProviderPreset[] = [
label: 'MiniMax', label: 'MiniMax',
value: 'minimax', value: 'minimax',
base_url: 'https://api.minimax.io/anthropic/v1', base_url: 'https://api.minimax.io/anthropic/v1',
models: ['MiniMax-M2.7', 'MiniMax-M2.5', 'MiniMax-M2.1', 'MiniMax-M2'], models: ['MiniMax-M2.7', 'MiniMax-M2.7-highspeed', 'MiniMax-M2.5', 'MiniMax-M2.5-highspeed', 'MiniMax-M2.1', 'MiniMax-M2.1-highspeed', 'MiniMax-M2', 'MiniMax-M2-highspeed'],
}, },
{ {
label: 'MiniMax (China)', label: 'MiniMax (China)',
value: 'minimax-cn', value: 'minimax-cn',
base_url: 'https://api.minimaxi.com/v1', base_url: 'https://api.minimaxi.com/v1',
models: ['MiniMax-M2.7', 'MiniMax-M2.5', 'MiniMax-M2.1', 'MiniMax-M2'], models: ['MiniMax-M2.7', 'MiniMax-M2.7-highspeed', 'MiniMax-M2.5', 'MiniMax-M2.5-highspeed', 'MiniMax-M2.1', 'MiniMax-M2.1-highspeed', 'MiniMax-M2', 'MiniMax-M2-highspeed'],
}, },
{ {
label: 'Alibaba Cloud', label: 'Alibaba Cloud',