feat: 前台AI聊天模型列表只显示显示名称+能力,不再显示供应商

This commit is contained in:
qyyfw committed 2026-07-10 21:08:15 +08:00
1 parent 821438cfe4
commit 0c017d380c
2 files changed
+49 -23

No files matched your search

+25 -11
View File
@@ -667,20 +667,38 @@
font-weight: 500; font-weight: 500;
} }
/* 模型能力徽标(图像/视频) */ /* 模型能力徽标(能力标签) */
.model-cap-badge { .model-cap-badge {
margin-left: auto;
flex-shrink: 0; flex-shrink: 0;
font-size: 11px; font-size: 11px;
line-height: 1; line-height: 1;
padding: 3px 7px; padding: 3px 7px;
border-radius: 999px; border-radius: 999px;
background: linear-gradient(135deg, #6C63FF 0%, #8B7CFF 100%); background: rgba(108, 99, 255, 0.1);
color: #fff; color: #6C63FF;
font-weight: 600; border: 1px solid rgba(108, 99, 255, 0.25);
font-weight: 500;
letter-spacing: 0.3px; letter-spacing: 0.3px;
} }
.model-cap-list {
display: flex;
flex-wrap: wrap;
gap: 4px;
width: 100%;
margin-top: 2px;
}
.model-display-name {
font-weight: 500;
color: var(--color-text-primary);
flex: 1 1 auto;
min-width: 0;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.dropdown-item.danger { .dropdown-item.danger {
color: var(--color-error); color: var(--color-error);
} }
@@ -704,17 +722,13 @@
.model-dropdown-item { .model-dropdown-item {
display: flex; display: flex;
align-items: center; align-items: center;
flex-wrap: wrap;
gap: var(--space-sm); gap: var(--space-sm);
width: 100%; width: 100%;
} }
.model-provider-tag { .model-provider-tag {
font-size: 10px; display: none;
color: var(--color-text-tertiary);
margin-left: auto;
background: var(--color-bg-tertiary);
padding: 1px 6px;
border-radius: var(--radius-full);
} }
.attach-dropdown-title { .attach-dropdown-title {
+24 -12
View File
@@ -466,6 +466,21 @@ const ChatPage: React.FC = () => {
// Selected model info(Auto 为按能力自动匹配平台默认模型) // Selected model info(Auto 为按能力自动匹配平台默认模型)
const AUTO_MODEL = { id: 'auto', name: 'Auto 自动', display_name: 'Auto 自动', status: 'free', provider_name: '按能力匹配', price_per_million_tokens: 0, capabilities: [] as string[] }; const AUTO_MODEL = { id: 'auto', name: 'Auto 自动', display_name: 'Auto 自动', status: 'free', provider_name: '按能力匹配', price_per_million_tokens: 0, capabilities: [] as string[] };
// 能力标签映射(用于模型选项列表展示)
const CAPABILITY_LABELS: Record<string, string> = {
text: '文本对话',
thinking: '推理思考',
vision: '视觉理解',
tool: '工具调用',
image: '图像生成',
audio: '语音合成',
asr: '语音识别',
ocr: 'OCR识别',
embedding: '嵌入向量',
rerank: '重排序',
video: '视频生成',
};
const selectedModel = selectedModelId === 'auto' const selectedModel = selectedModelId === 'auto'
? AUTO_MODEL ? AUTO_MODEL
: (chatModels.find(m => m.id === selectedModelId) || chatModels[0] || AUTO_MODEL); : (chatModels.find(m => m.id === selectedModelId) || chatModels[0] || AUTO_MODEL);
@@ -790,7 +805,7 @@ const ChatPage: React.FC = () => {
trigger={ trigger={
<div className="model-selector"> <div className="model-selector">
<IconModel /> <IconModel />
<span className="model-name">{selectedModel.name}</span> <span className="model-name">{selectedModel.display_name || selectedModel.name}</span>
<span className="model-badge">{(selectedModel.status === 'free' || selectedModel.price_per_million_tokens === 0) ? '免费' : '付费'}</span> <span className="model-badge">{(selectedModel.status === 'free' || selectedModel.price_per_million_tokens === 0) ? '免费' : '付费'}</span>
<IconChevronDown /> <IconChevronDown />
</div> </div>
@@ -815,15 +830,12 @@ const ChatPage: React.FC = () => {
onClick={() => setSelectedModelId(model.id)} onClick={() => setSelectedModelId(model.id)}
> >
<div className="model-dropdown-item"> <div className="model-dropdown-item">
<span>{model.name}</span> <span className="model-display-name">{model.display_name || model.name}</span>
<span className="model-provider-tag">{model.provider_name || model.providerName || ''}</span> <span className="model-cap-list">
{(() => { {(model.capabilities || []).map((cap: string) => (
const caps = model.capabilities || []; <span key={cap} className="model-cap-badge">{CAPABILITY_LABELS[cap] || cap}</span>
const label = caps.includes('image') && caps.includes('video') ? '图像/视频' ))}
: caps.includes('image') ? '图像' </span>
: caps.includes('video') ? '视频' : '';
return label ? <span className="model-cap-badge">{label}</span> : null;
})()}
</div> </div>
</button> </button>
))} ))}
@@ -845,7 +857,7 @@ const ChatPage: React.FC = () => {
<IconEmpty /> <IconEmpty />
<p className="empty-title">开始一段新对话</p> <p className="empty-title">开始一段新对话</p>
<p className="empty-desc"> <p className="empty-desc">
向 {selectedModel.name} 发送消息,开始对话 向 {selectedModel.display_name || selectedModel.name} 发送消息,开始对话
</p> </p>
</div> </div>
) : ( ) : (
@@ -1007,7 +1019,7 @@ const ChatPage: React.FC = () => {
<textarea <textarea
ref={inputRef} ref={inputRef}
className="chat-textarea" className="chat-textarea"
placeholder={`向 ${selectedModel.name} 发送消息...`} placeholder={`向 ${selectedModel.display_name || selectedModel.name} 发送消息...`}
value={inputValue} value={inputValue}
onChange={(e) => setInputValue(e.target.value)} onChange={(e) => setInputValue(e.target.value)}
onKeyDown={handleKeyDown} onKeyDown={handleKeyDown}