diff --git a/web/src/components/keys/GroupFormModal.vue b/web/src/components/keys/GroupFormModal.vue index 2d6358e..019dc40 100644 --- a/web/src/components/keys/GroupFormModal.vue +++ b/web/src/components/keys/GroupFormModal.vue @@ -2,18 +2,18 @@ import { keysApi } from "@/api/keys"; import { settingsApi } from "@/api/settings"; import type { Group, GroupConfigOption, UpstreamInfo } from "@/types/models"; -import { Add, Close, Remove } from "@vicons/ionicons5"; +import { Add, Close, HelpCircleOutline, Remove } from "@vicons/ionicons5"; import { NButton, NCard, - NCollapse, - NCollapseItem, NForm, NFormItem, + NIcon, NInput, NInputNumber, NModal, NSelect, + NTooltip, useMessage, type FormRules, } from "naive-ui"; @@ -27,6 +27,7 @@ interface Props { interface Emits { (e: "update:show", value: boolean): void; (e: "success", value: Group): void; + (e: "switchToGroup", groupId: number): void; } // 配置项类型 @@ -51,7 +52,7 @@ interface GroupFormData { display_name: string; description: string; upstreams: UpstreamInfo[]; - channel_type: "openai" | "gemini" | "anthropic"; + channel_type: "anthropic" | "gemini" | "openai"; sort: number; test_model: string; validation_endpoint: string; @@ -89,11 +90,11 @@ const configOptionsFetched = ref(false); const testModelPlaceholder = computed(() => { switch (formData.channel_type) { case "openai": - return "如:gpt-4.1-nano"; + return "gpt-4.1-nano"; case "gemini": - return "如:gemini-2.0-flash-lite"; + return "gemini-2.0-flash-lite"; case "anthropic": - return "如:claude-3-haiku-20240307"; + return "claude-3-haiku-20240307"; default: return "请输入模型名称"; } @@ -112,6 +113,19 @@ const upstreamPlaceholder = computed(() => { } }); +const validationEndpointPlaceholder = computed(() => { + switch (formData.channel_type) { + case "openai": + return "/v1/chat/completions"; + case "anthropic": + return "/v1/messages"; + case "gemini": + return ""; // Gemini 不显示此字段 + default: + return "请输入验证端点路径"; + } +}); + // 表单验证规则 const rules: FormRules = { name: [ @@ -326,6 +340,10 @@ async function handleSubmit() { } emit("success", res); + // 如果是新建模式,发出切换到新分组的事件 + if (!props.group?.id && res.id) { + emit("switchToGroup", res.id); + } handleClose(); } finally { loading.value = false; @@ -363,52 +381,152 @@ async function handleSubmit() {