渠道: 移除供应商下拉, 格式多选为唯一配置

- 前端渠道表单去掉"供应商"下拉, 只保留"支持的 API 格式"多选(默认 chat)
- 后端 provider 改为可选字段: 为空时按 formats 推断(仅 messages→anthropic,
  含 responses→openai, 否则 compatible), 兼容旧数据
- 保存时校验至少选择一种格式

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
Sakurasan
2026-08-15 16:55:48 +08:00
co-authored by Claude
parent 5eff32afd8
commit d9dcbc4fb3
2 changed files with 36 additions and 32 deletions
+8 -30
View File
@@ -18,8 +18,7 @@ const busyId = ref<number | null>(null)
const form = reactive({
name: '',
provider: 'openai' as 'openai' | 'anthropic' | 'compatible',
formats: [] as string[],
formats: ['chat'] as string[],
base_url: '',
api_key: '',
weight: 1,
@@ -29,17 +28,6 @@ const form = reactive({
enabled: true,
})
// 按供应商推断默认支持的协议格式
function defaultFormats(p: string): string[] {
if (p === 'anthropic') return ['messages']
if (p === 'openai') return ['chat', 'responses']
return ['chat']
}
function onProviderChange() {
form.formats = defaultFormats(form.provider)
}
async function load() {
try {
const { data } = await http.get('/admin/channels')
@@ -52,7 +40,7 @@ async function load() {
function openCreate() {
editing.value = null
Object.assign(form, {
name: '', provider: 'openai', formats: defaultFormats('openai'), base_url: '', api_key: '',
name: '', formats: ['chat'], base_url: '', api_key: '',
weight: 1, priority: 0, timeout_ms: 120000, max_concurrency: 16, enabled: true,
})
editOpen.value = true
@@ -61,7 +49,7 @@ function openCreate() {
function openEdit(ch: Channel) {
editing.value = ch
Object.assign(form, {
name: ch.name, provider: ch.provider, formats: [...(ch.formats || defaultFormats(ch.provider))],
name: ch.name, formats: [...(ch.formats?.length ? ch.formats : ['chat'])],
base_url: ch.base_url, api_key: '',
weight: ch.weight, priority: ch.priority, timeout_ms: ch.timeout_ms,
max_concurrency: ch.max_concurrency, enabled: ch.enabled,
@@ -70,6 +58,10 @@ function openEdit(ch: Channel) {
}
async function save() {
if (form.formats.length === 0) {
toast.err('请至少选择一种 API 格式')
return
}
saving.value = true
const payload = {
...form,
@@ -199,21 +191,7 @@ onMounted(load)
<Modal :open="editOpen" :title="editing ? '编辑渠道' : '添加渠道'" @close="editOpen = false">
<div class="space-y-4">
<div class="grid grid-cols-2 gap-4">
<Input v-model="form.name" label="名称" placeholder="openai" />
<label class="block">
<span class="mb-1.5 block text-xs font-medium text-muted">供应商</span>
<select
v-model="form.provider"
class="h-10 w-full rounded-md border border-edge2 bg-surface px-3 text-sm text-ink outline-none focus:border-accent"
@change="onProviderChange"
>
<option value="openai">OpenAI</option>
<option value="anthropic">Anthropic</option>
<option value="compatible">兼容</option>
</select>
</label>
</div>
<Input v-model="form.name" label="名称" placeholder="openai" />
<div>
<span class="mb-1.5 block text-xs font-medium text-muted">支持的 API 格式</span>
<div class="flex flex-wrap gap-2">