5757 <el-option v-for =" m in fetchedModels" :key =" m" :label =" m" :value =" m" />
5858 </el-select >
5959 </el-form-item >
60+ <el-form-item label =" 支持的能力" >
61+ <div style =" width :100% " >
62+ <div style =" display :flex ;gap :8px ;align-items :center ;margin-bottom :6px " >
63+ <span style =" width :40px ;font-size :12px ;color :#666 " >Skills</span >
64+ <el-select v-model =" capSkills" size =" small" style =" flex :1 " multiple collapse-tags collapse-tags-tooltip clearable placeholder =" 勾选该模型支持的技能" >
65+ <el-option v-for =" s in skillOptions" :key =" s.id" :label =" `${s.skillName}(${s.groupName})`" :value =" s.id" />
66+ </el-select >
67+ </div >
68+ <div style =" display :flex ;gap :8px ;align-items :center ;margin-bottom :6px " >
69+ <span style =" width :40px ;font-size :12px ;color :#666 " >接口</span >
70+ <el-select v-model =" capApis" size =" small" style =" flex :1 " multiple collapse-tags collapse-tags-tooltip filterable clearable placeholder =" 勾选该模型可调用的接口" >
71+ <el-option v-for =" a in apiOptions" :key =" a.methodCode" :label =" `${a.methodName}(${a.methodCode})`" :value =" a.methodCode" />
72+ </el-select >
73+ </div >
74+ <div style =" display :flex ;gap :8px ;align-items :center ;margin-bottom :6px " >
75+ <span style =" width :40px ;font-size :12px ;color :#666 " >流程</span >
76+ <el-select v-model =" capFlows" size =" small" style =" flex :1 " multiple collapse-tags collapse-tags-tooltip filterable clearable placeholder =" 勾选该模型可调用的流程" >
77+ <el-option v-for =" f in flowOptions" :key =" f.flowKey" :label =" `${f.flowName}(${f.flowKey})`" :value =" f.flowKey" />
78+ </el-select >
79+ </div >
80+ <div style =" display :flex ;gap :8px ;align-items :center " >
81+ <span style =" width :40px ;font-size :12px ;color :#666 " >工具</span >
82+ <el-input v-model =" capTools" size =" small" style =" flex :1 " placeholder =" 逗号分隔的工具名(如 web_search, calculator)" />
83+ </div >
84+ </div >
85+ </el-form-item >
6086 <el-form-item label =" 启用" ><el-switch v-model =" form.enabled" /></el-form-item >
6187 <el-form-item label =" 备注" ><el-input v-model =" form.remark" /></el-form-item >
6288 </el-form >
@@ -83,6 +109,48 @@ const selectedModels = ref<string[]>([])
83109const testingConfig = ref (false )
84110const testMsg = ref (' ' )
85111const testOk = ref (false )
112+ // 支持的能力
113+ const capSkills = ref <number []>([])
114+ const capApis = ref <string []>([])
115+ const capFlows = ref <string []>([])
116+ const capTools = ref (' ' )
117+ const skillOptions = ref <any []>([])
118+ const apiOptions = ref <any []>([])
119+ const flowOptions = ref <any []>([])
120+
121+ async function loadCapabilityOptions() {
122+ try {
123+ const [skillRes, suiteRes, flowRes]: any [] = await Promise .all ([
124+ request .get (' /skill/list' , { params: { enabled: 1 } }),
125+ request .get (' /suite/list' ),
126+ request .post (' /flow/definition/page' , { pageNum: 1 , pageSize: 500 })
127+ ])
128+ skillOptions .value = skillRes .data || []
129+ flowOptions .value = flowRes .data ?.list || []
130+ const suites = suiteRes .data || []
131+ apiOptions .value = []
132+ for (const s of suites ) {
133+ try {
134+ const apisRes: any = await request .post (' /suite/api/list' , { suiteCode: s .suiteCode })
135+ for (const a of (apisRes .data || [])) {
136+ apiOptions .value .push ({ methodCode: a .methodCode , methodName: a .methodName })
137+ }
138+ } catch { /* 忽略单个套件失败 */ }
139+ }
140+ } catch { /* 忽略 */ }
141+ }
142+
143+ function parseCapabilities(json : string ) {
144+ try {
145+ const c = JSON .parse (json || ' {}' )
146+ capSkills .value = c .skills || []
147+ capApis .value = c .apis || []
148+ capFlows .value = c .flows || []
149+ capTools .value = (c .tools || []).join (' ,' )
150+ } catch {
151+ capSkills .value = []; capApis .value = []; capFlows .value = []; capTools .value = ' '
152+ }
153+ }
86154
87155// 预置供应商(选择后自动填默认接口地址)
88156const presetProviders = [
@@ -108,15 +176,19 @@ function openAdd() {
108176 form .value = { id: 0 , providerName: ' ' , baseUrl: ' ' , apiKey: ' ' , model: ' ' , models: ' ' , enabled: true , remark: ' ' }
109177 fetchedModels .value = []
110178 selectedModels .value = []
179+ parseCapabilities (' ' )
111180 testMsg .value = ' '
112181 dialogVisible .value = true
182+ loadCapabilityOptions ()
113183}
114184function openEdit(row : any ) {
115185 form .value = { ... row , enabled: row .enabled === 1 }
116186 fetchedModels .value = String (row .models || ' ' ).split (' ,' ).map ((s : string ) => s .trim ()).filter (Boolean )
117187 selectedModels .value = [... fetchedModels .value ]
188+ parseCapabilities (row .capabilities || ' ' )
118189 testMsg .value = ' '
119190 dialogVisible .value = true
191+ loadCapabilityOptions ()
120192}
121193
122194/** 选择预置供应商 → 自动填接口地址默认值 */
@@ -150,6 +222,12 @@ async function doFetchModels() {
150222
151223async function doSave() {
152224 form .value .models = selectedModels .value .join (' ,' )
225+ form .value .capabilities = JSON .stringify ({
226+ skills: capSkills .value ,
227+ apis: capApis .value ,
228+ flows: capFlows .value ,
229+ tools: capTools .value .split (' ,' ).map ((s : string ) => s .trim ()).filter (Boolean )
230+ })
153231 await request .post (' /ai/provider/save' , form .value )
154232 ElMessage .success (' 保存成功' )
155233 dialogVisible .value = false
0 commit comments