-
- {iconSrc &&

}
-
{group.label}
-
-
+
+
+ {iconSrc && (
+

+ )}
+
{group.label}
+
{t('system_info.models_count', { count: group.items.length })}
-
+
- {group.items.map((model) => (
-
- {model.name}
- {model.alias && {model.alias}}
-
- ))}
+ {group.items.map((model) => {
+ const isCopied = copiedModelName === model.name;
+ return (
+
+ );
+ })}
);
diff --git a/apps/web/src/i18n/locales/en.json b/apps/web/src/i18n/locales/en.json
index 804a69d1e..84e957393 100644
--- a/apps/web/src/i18n/locales/en.json
+++ b/apps/web/src/i18n/locales/en.json
@@ -3395,7 +3395,8 @@
"claude_api_key": "Claude API key",
"commercial_mode_restart_required": "Commercial mode setting changed. Please restart the service for it to take effect",
"copy_failed": "Copy failed",
- "link_copied": "Link copied to clipboard"
+ "link_copied": "Link copied to clipboard",
+ "model_id_copied": "Model ID copied"
},
"language": {
"switch": "Language",
diff --git a/apps/web/src/i18n/locales/ru.json b/apps/web/src/i18n/locales/ru.json
index fdcaa03f2..54893121b 100644
--- a/apps/web/src/i18n/locales/ru.json
+++ b/apps/web/src/i18n/locales/ru.json
@@ -3395,7 +3395,8 @@
"claude_api_key": "API-ключ Claude",
"commercial_mode_restart_required": "Режим коммерческого использования изменён. Перезапустите сервис, чтобы применить изменения",
"copy_failed": "Не удалось скопировать",
- "link_copied": "Ссылка скопирована в буфер обмена"
+ "link_copied": "Ссылка скопирована в буфер обмена",
+ "model_id_copied": "ID модели скопирован"
},
"language": {
"switch": "Язык",
diff --git a/apps/web/src/i18n/locales/zh-CN.json b/apps/web/src/i18n/locales/zh-CN.json
index f09bf4584..47bf3ab43 100644
--- a/apps/web/src/i18n/locales/zh-CN.json
+++ b/apps/web/src/i18n/locales/zh-CN.json
@@ -3395,7 +3395,8 @@
"claude_api_key": "Claude API密钥",
"commercial_mode_restart_required": "商业模式开关已变更,请重启服务后生效",
"copy_failed": "复制失败",
- "link_copied": "已复制"
+ "link_copied": "已复制",
+ "model_id_copied": "模型 ID 已复制"
},
"language": {
"switch": "语言",
diff --git a/apps/web/src/i18n/locales/zh-TW.json b/apps/web/src/i18n/locales/zh-TW.json
index 889bf541c..6c496884c 100644
--- a/apps/web/src/i18n/locales/zh-TW.json
+++ b/apps/web/src/i18n/locales/zh-TW.json
@@ -3395,7 +3395,8 @@
"claude_api_key": "Claude API 金鑰",
"commercial_mode_restart_required": "商業模式開關已變更,請重啟服務後生效",
"copy_failed": "複製失敗",
- "link_copied": "已複製"
+ "link_copied": "已複製",
+ "model_id_copied": "模型 ID 已複製"
},
"language": {
"switch": "語言",
diff --git a/apps/web/src/utils/models.ts b/apps/web/src/utils/models.ts
index 5049fa0e6..c1b27c067 100644
--- a/apps/web/src/utils/models.ts
+++ b/apps/web/src/utils/models.ts
@@ -15,10 +15,17 @@ const MODEL_CATEGORIES = [
{ id: 'gemini', label: 'Gemini', patterns: [/gemini/i, /\bgai\b/i] },
{ id: 'kimi', label: 'Kimi', patterns: [/kimi/i] },
{ id: 'qwen', label: 'Qwen', patterns: [/qwen/i] },
- { id: 'glm', label: 'GLM', patterns: [/glm/i, /chatglm/i] },
+ { id: 'glm', label: 'ZHIPU', patterns: [/glm/i, /chatglm/i] },
{ id: 'grok', label: 'Grok', patterns: [/grok/i] },
{ id: 'deepseek', label: 'DeepSeek', patterns: [/deepseek/i] },
- { id: 'minimax', label: 'MiniMax', patterns: [/minimax/i, /abab/i] }
+ { id: 'minimax', label: 'MiniMax', patterns: [/minimax/i, /abab/i] },
+ { id: 'mimo', label: 'Mimo', patterns: [/mimo/i] },
+ { id: 'hunyuan', label: 'HunYuan', patterns: [/hunyuan/i] },
+ { id: 'bytedance', label: 'ByteDance', patterns: [/\bseed\b/i, /doubao/i] },
+ { id: 'volcengine', label: 'VolcEngine', patterns: [/\bark\b/i] },
+ { id: 'longcat', label: 'LongCat', patterns: [/longcat/i] },
+ { id: 'stepfun', label: 'StepFun', patterns: [/stepfun/i] },
+ { id: 'wenxin', label: 'WenXin', patterns: [/wenxin/i] },
];
const matchCategory = (text: string) => {
@@ -90,11 +97,14 @@ export interface ModelGroup {
items: ModelInfo[];
}
-export function classifyModels(models: ModelInfo[] = [], { otherLabel = 'Other' } = {}): ModelGroup[] {
+export function classifyModels(
+ models: ModelInfo[] = [],
+ { otherLabel = 'Other' } = {}
+): ModelGroup[] {
const groups: ModelGroup[] = MODEL_CATEGORIES.map((category) => ({
id: category.id,
label: category.label,
- items: []
+ items: [],
}));
const otherGroup: ModelGroup = { id: 'other', label: otherLabel, items: [] };