2025-05-18 17:18:29 +08:00
|
|
|
|
<template>
|
2026-01-02 15:46:55 +08:00
|
|
|
|
<div class="model-providers-section">
|
2026-03-24 02:32:35 +08:00
|
|
|
|
<div class="header-section">
|
|
|
|
|
|
<div class="header-content">
|
|
|
|
|
|
<div class="section-title">自定义供应商</div>
|
2026-04-26 16:24:54 +08:00
|
|
|
|
<p class="section-description">查看自定义的LLM供应商配置。</p>
|
2025-05-18 17:18:29 +08:00
|
|
|
|
</div>
|
2026-03-24 02:32:35 +08:00
|
|
|
|
</div>
|
2025-11-16 21:24:26 +08:00
|
|
|
|
|
2026-04-26 16:24:54 +08:00
|
|
|
|
<a-alert type="info">
|
|
|
|
|
|
<template #message>
|
|
|
|
|
|
<span>改动提醒</span>
|
|
|
|
|
|
</template>
|
|
|
|
|
|
<template #description>
|
|
|
|
|
|
项目已启用新版的模型配置,自定义程度更高,且支持 Embedding / Rerank 模型,您可以
|
|
|
|
|
|
<a @click="goToNewModelConfig">点击此处</a>
|
2026-04-26 18:51:38 +08:00
|
|
|
|
跳转到新版模型配置页面。 已配置模型将会在 0.6.x 期间继续使用,0.7
|
|
|
|
|
|
版本将不再支持老版的模型调用。
|
2026-04-26 16:24:54 +08:00
|
|
|
|
为了更加稳定的模型调用和更好的用户体验,建议尽快迁移到新的模型配置。
|
|
|
|
|
|
</template>
|
|
|
|
|
|
</a-alert>
|
|
|
|
|
|
|
|
|
|
|
|
<div v-if="tableData.length === 0" class="empty-state">
|
|
|
|
|
|
<a-empty description="暂无自定义供应商" />
|
2025-05-18 17:18:29 +08:00
|
|
|
|
</div>
|
2025-11-16 21:24:26 +08:00
|
|
|
|
|
2026-04-26 16:24:54 +08:00
|
|
|
|
<div v-for="item in tableData" :key="item.id" class="provider-block">
|
2026-04-26 18:51:38 +08:00
|
|
|
|
<h4 class="provider-name">
|
|
|
|
|
|
{{ item.name }} <span class="provider-id">({{ item.id }})</span>
|
|
|
|
|
|
</h4>
|
2026-04-26 16:24:54 +08:00
|
|
|
|
<a-descriptions bordered :column="1" size="small">
|
|
|
|
|
|
<a-descriptions-item label="API地址">{{ item.base_url }}</a-descriptions-item>
|
|
|
|
|
|
<a-descriptions-item label="默认模型">{{ item.default }}</a-descriptions-item>
|
|
|
|
|
|
<a-descriptions-item label="API密钥">{{ item.env }}</a-descriptions-item>
|
|
|
|
|
|
<a-descriptions-item label="文档地址">
|
|
|
|
|
|
<a v-if="item.url" :href="item.url" target="_blank">{{ item.url }}</a>
|
|
|
|
|
|
<span v-else>无</span>
|
|
|
|
|
|
</a-descriptions-item>
|
2026-04-26 18:51:38 +08:00
|
|
|
|
<a-descriptions-item label="可用模型">{{
|
|
|
|
|
|
item.models?.join(', ') || '无'
|
|
|
|
|
|
}}</a-descriptions-item>
|
2026-04-26 16:24:54 +08:00
|
|
|
|
</a-descriptions>
|
2025-05-18 17:18:29 +08:00
|
|
|
|
</div>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
</template>
|
|
|
|
|
|
|
|
|
|
|
|
<script setup>
|
2026-04-26 16:24:54 +08:00
|
|
|
|
import { computed } from 'vue'
|
|
|
|
|
|
import { useRouter } from 'vue-router'
|
2026-01-15 06:01:34 +08:00
|
|
|
|
import { useConfigStore } from '@/stores/config'
|
2025-05-18 17:18:29 +08:00
|
|
|
|
|
2026-01-15 06:01:34 +08:00
|
|
|
|
const configStore = useConfigStore()
|
2026-04-26 16:24:54 +08:00
|
|
|
|
const router = useRouter()
|
2025-05-18 17:18:29 +08:00
|
|
|
|
|
2026-04-26 16:24:54 +08:00
|
|
|
|
const tableData = computed(() => {
|
2026-01-15 06:01:34 +08:00
|
|
|
|
const providers = configStore.config?.model_names || {}
|
2026-04-26 16:24:54 +08:00
|
|
|
|
return Object.entries(providers)
|
|
|
|
|
|
.filter(([, value]) => value.custom === true)
|
|
|
|
|
|
.map(([id, provider]) => ({
|
|
|
|
|
|
key: id,
|
|
|
|
|
|
id,
|
|
|
|
|
|
name: provider.name || '',
|
|
|
|
|
|
base_url: provider.base_url || '',
|
|
|
|
|
|
default: provider.default || '',
|
|
|
|
|
|
env: provider.env || '',
|
|
|
|
|
|
models: provider.models || [],
|
|
|
|
|
|
url: provider.url || ''
|
|
|
|
|
|
}))
|
2026-01-15 06:01:34 +08:00
|
|
|
|
})
|
2025-11-16 21:24:26 +08:00
|
|
|
|
|
2026-04-26 16:24:54 +08:00
|
|
|
|
const goToNewModelConfig = () => {
|
|
|
|
|
|
router.push('/model-config')
|
2026-01-15 06:01:34 +08:00
|
|
|
|
}
|
2025-05-18 17:18:29 +08:00
|
|
|
|
</script>
|
|
|
|
|
|
|
|
|
|
|
|
<style lang="less" scoped>
|
2026-04-26 16:24:54 +08:00
|
|
|
|
.provider-block {
|
|
|
|
|
|
margin: 16px 0;
|
2025-12-19 14:41:23 +08:00
|
|
|
|
|
2026-04-26 16:24:54 +08:00
|
|
|
|
.provider-name {
|
|
|
|
|
|
margin: 0 0 8px 0;
|
|
|
|
|
|
font-weight: 500;
|
2025-12-19 14:41:23 +08:00
|
|
|
|
color: var(--gray-900);
|
|
|
|
|
|
|
2026-04-26 16:24:54 +08:00
|
|
|
|
.provider-id {
|
|
|
|
|
|
font-weight: 400;
|
|
|
|
|
|
color: var(--gray-500);
|
2025-11-16 21:24:26 +08:00
|
|
|
|
font-size: 13px;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2026-04-26 16:24:54 +08:00
|
|
|
|
.empty-state {
|
|
|
|
|
|
text-align: center;
|
|
|
|
|
|
padding: 40px 20px;
|
|
|
|
|
|
background: var(--gray-25);
|
2025-05-18 17:18:29 +08:00
|
|
|
|
border-radius: 8px;
|
2026-04-26 16:24:54 +08:00
|
|
|
|
border: 1px dashed var(--gray-300);
|
2025-12-16 15:47:50 +08:00
|
|
|
|
}
|
2025-10-10 14:59:12 +08:00
|
|
|
|
</style>
|