2025-05-18 17:18:29 +08:00
|
|
|
<template>
|
2025-07-24 00:46:15 +08:00
|
|
|
<a-dropdown trigger="click">
|
2025-05-18 17:39:11 +08:00
|
|
|
<a class="model-select" @click.prevent>
|
2025-05-20 20:49:50 +08:00
|
|
|
<!-- <BulbOutlined /> -->
|
|
|
|
|
<a-tooltip :title="model_name" placement="right">
|
|
|
|
|
<span class="model-text text"> {{ model_name }} </span>
|
2025-05-18 17:18:29 +08:00
|
|
|
</a-tooltip>
|
2025-05-20 20:49:50 +08:00
|
|
|
<span class="text" style="color: #aaa;">{{ model_provider }} </span>
|
2025-05-18 17:18:29 +08:00
|
|
|
</a>
|
|
|
|
|
<template #overlay>
|
|
|
|
|
<a-menu class="scrollable-menu">
|
|
|
|
|
<a-menu-item-group v-for="(item, key) in modelKeys" :key="key" :title="modelNames[item]?.name">
|
|
|
|
|
<a-menu-item v-for="(model, idx) in modelNames[item]?.models" :key="`${item}-${idx}`" @click="handleSelectModel(item, model)">
|
|
|
|
|
{{ model }}
|
|
|
|
|
</a-menu-item>
|
|
|
|
|
</a-menu-item-group>
|
|
|
|
|
<a-menu-item-group v-if="customModels.length > 0" title="自定义模型">
|
|
|
|
|
<a-menu-item v-for="(model, idx) in customModels" :key="`custom-${idx}`" @click="handleSelectModel('custom', model.custom_id)">
|
|
|
|
|
custom/{{ model.custom_id }}
|
|
|
|
|
</a-menu-item>
|
|
|
|
|
</a-menu-item-group>
|
|
|
|
|
</a-menu>
|
|
|
|
|
</template>
|
|
|
|
|
</a-dropdown>
|
|
|
|
|
</template>
|
|
|
|
|
|
|
|
|
|
<script setup>
|
|
|
|
|
import { computed } from 'vue'
|
|
|
|
|
import { BulbOutlined } from '@ant-design/icons-vue'
|
|
|
|
|
import { useConfigStore } from '@/stores/config'
|
|
|
|
|
|
2025-05-20 20:49:50 +08:00
|
|
|
const props = defineProps({
|
|
|
|
|
model_name: {
|
|
|
|
|
type: String,
|
|
|
|
|
default: ''
|
|
|
|
|
},
|
|
|
|
|
model_provider: {
|
|
|
|
|
type: String,
|
|
|
|
|
default: ''
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
|
2025-05-18 17:18:29 +08:00
|
|
|
const configStore = useConfigStore()
|
|
|
|
|
const emit = defineEmits(['select-model'])
|
|
|
|
|
|
|
|
|
|
// 从configStore中获取所需数据
|
|
|
|
|
const modelNames = computed(() => configStore.config?.model_names)
|
|
|
|
|
const modelStatus = computed(() => configStore.config?.model_provider_status)
|
|
|
|
|
const customModels = computed(() => configStore.config?.custom_models || [])
|
|
|
|
|
|
|
|
|
|
// 筛选 modelStatus 中为真的key
|
|
|
|
|
const modelKeys = computed(() => {
|
|
|
|
|
return Object.keys(modelStatus.value || {}).filter(key => modelStatus.value?.[key])
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
// 选择模型的方法
|
|
|
|
|
const handleSelectModel = (provider, name) => {
|
|
|
|
|
emit('select-model', { provider, name })
|
|
|
|
|
}
|
|
|
|
|
</script>
|
|
|
|
|
|
|
|
|
|
<style lang="less" scoped>
|
|
|
|
|
.model-select {
|
|
|
|
|
overflow: hidden;
|
|
|
|
|
text-overflow: ellipsis;
|
|
|
|
|
white-space: nowrap;
|
2025-09-19 00:58:35 +08:00
|
|
|
padding: 4px 8px;
|
2025-05-18 17:39:11 +08:00
|
|
|
cursor: pointer;
|
2025-09-19 00:58:35 +08:00
|
|
|
border: 1px solid var(--gray-200);
|
2025-05-18 17:39:11 +08:00
|
|
|
border-radius: 8px;
|
|
|
|
|
display: flex;
|
|
|
|
|
align-items: center;
|
|
|
|
|
gap: 0.5rem;
|
|
|
|
|
background-color: white;
|
|
|
|
|
|
|
|
|
|
&.borderless {
|
|
|
|
|
border: none;
|
|
|
|
|
}
|
2025-05-18 17:18:29 +08:00
|
|
|
|
2025-05-20 20:49:50 +08:00
|
|
|
&.max-width {
|
|
|
|
|
max-width: 380px;
|
|
|
|
|
}
|
|
|
|
|
|
2025-05-18 17:18:29 +08:00
|
|
|
.model-text {
|
|
|
|
|
overflow: hidden;
|
|
|
|
|
text-overflow: ellipsis;
|
2025-07-24 00:46:15 +08:00
|
|
|
color: #000;
|
2025-05-18 17:18:29 +08:00
|
|
|
}
|
2025-05-18 17:39:11 +08:00
|
|
|
|
|
|
|
|
|
2025-05-18 17:18:29 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
.scrollable-menu {
|
|
|
|
|
max-height: 300px;
|
|
|
|
|
overflow-y: auto;
|
|
|
|
|
|
|
|
|
|
&::-webkit-scrollbar {
|
|
|
|
|
width: 6px;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
&::-webkit-scrollbar-track {
|
|
|
|
|
background: transparent;
|
|
|
|
|
border-radius: 3px;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
&::-webkit-scrollbar-thumb {
|
|
|
|
|
background: var(--gray-400);
|
|
|
|
|
border-radius: 3px;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
&::-webkit-scrollbar-thumb:hover {
|
|
|
|
|
background: var(--gray-500);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
</style>
|
|
|
|
|
|
2025-08-24 18:54:54 +08:00
|
|
|
<style lang="less" scoped>
|
|
|
|
|
// 将全局样式移到scoped中以避免样式污染
|
|
|
|
|
:deep(.ant-dropdown-menu) {
|
2025-05-18 17:18:29 +08:00
|
|
|
&.scrollable-menu {
|
|
|
|
|
max-height: 300px;
|
|
|
|
|
overflow-y: auto;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
</style>
|