tycoding 1 рік тому
батько
коміт
3c6222743c

+ 8 - 2
langchat-client/src/main/java/cn/tycoding/langchat/client/controller/ClientModelController.java

@@ -50,14 +50,20 @@ public class ClientModelController {
     @GetMapping("/getChatModels")
     public R<List<AigcModel>> getChatModels() {
         List<AigcModel> list = aigcModelService.getChatModels();
-        list.forEach(i -> i.setApiKey(null));
+        list.forEach(i -> {
+            i.setApiKey(null);
+            i.setSecretKey(null);
+        });
         return R.ok(list);
     }
 
     @GetMapping("/getImageModels")
     public R<List<AigcModel>> getImageModels() {
         List<AigcModel> list = aigcModelService.getImageModels();
-        list.forEach(i -> i.setApiKey(null));
+        list.forEach(i -> {
+            i.setApiKey(null);
+            i.setSecretKey(null);
+        });
         return R.ok(list);
     }
 }

+ 6 - 0
langchat-server/src/main/java/cn/tycoding/langchat/server/controller/AigcModelController.java

@@ -60,6 +60,12 @@ public class AigcModelController {
         }
         String key = StrUtil.hide(model.getApiKey(), 3, model.getApiKey().length() - 4);
         model.setApiKey(key);
+
+        if (StrUtil.isBlank(model.getSecretKey())) {
+            return;
+        }
+        String sec = StrUtil.hide(model.getSecretKey(), 3, model.getSecretKey().length() - 4);
+        model.setApiKey(sec);
     }
 
     @GetMapping("/page")

+ 86 - 15
langchat-ui/src/views/aigc/model/components/embedding/columns.ts

@@ -15,11 +15,52 @@
  */
 
 import { FormSchema } from '@/components/Form';
-import { LLMProviders } from '@/views/aigc/model/components/chat/data';
+import { ProviderEnum } from '@/views/aigc/model/components/chat/data';
 import { ModelTypeEnum } from '@/api/models';
 import { isNullOrWhitespace } from '@/utils/is';
 
-export const schemas: FormSchema[] = [
+export const LLMProviders: any[] = [
+  {
+    model: ProviderEnum.OPENAI,
+    name: 'OpenAI',
+    models: ['text-embedding-3-small', 'text-embedding-3-large', 'text-embedding-ada-002'],
+  },
+  {
+    model: ProviderEnum.AZURE_OPENAI,
+    name: 'Azure OpenAI',
+    models: [
+      'text-embedding-3-small',
+      'text-embedding-3-small-1',
+      'text-embedding-3-large',
+      'text-embedding-3-large-1',
+      'text-embedding-ada-002',
+      'text-embedding-ada-002-1',
+      'text-embedding-ada-002-2',
+    ],
+  },
+  {
+    model: ProviderEnum.OLLAMA,
+    name: 'Ollama',
+    models: [],
+  },
+  {
+    model: ProviderEnum.Q_FAN,
+    name: '百度千帆大模型',
+    models: ['Embedding-V1', 'bge-large-zh', 'bge-large-en', 'tao-8k'],
+  },
+  {
+    model: ProviderEnum.Q_WEN,
+    name: '阿里千问大模型',
+    models: ['text-embedding-v1', 'text-embedding-v2'],
+  },
+  {
+    model: ProviderEnum.ZHIPU,
+    name: '智普AI',
+    models: ['embedding-2', 'text_embedding'],
+  },
+];
+
+export const baseSchemas: FormSchema[] = [
   {
     field: 'id',
     label: 'ID',
@@ -37,6 +78,7 @@ export const schemas: FormSchema[] = [
     field: 'provider',
     label: 'LLM供应商',
     component: 'NSelect',
+    slot: 'providerSlot',
     componentProps: {
       options: LLMProviders,
       labelField: 'name',
@@ -88,19 +130,6 @@ export const schemas: FormSchema[] = [
       },
     ],
   },
-  {
-    field: 'temperature',
-    label: '生成随机性',
-    labelMessage: '调高参数会使得模型的输出更多样性和创新性,反之降低参数将会减少多样性',
-    component: 'NSlider',
-    rules: [{ type: 'number', required: true, message: '请输入生成随机性', trigger: ['blur'] }],
-    componentProps: {
-      defaultValue: 0.8,
-      step: 0.05,
-      min: 0,
-      max: 2,
-    },
-  },
   {
     field: 'dimensions',
     label: 'Dimensions',
@@ -108,6 +137,8 @@ export const schemas: FormSchema[] = [
     component: 'NSelect',
     rules: [{ type: 'number', required: true, message: '请选择向量维数', trigger: ['blur'] }],
     componentProps: {
+      tag: true,
+      filterable: true,
       options: [
         {
           label: '384',
@@ -125,3 +156,43 @@ export const schemas: FormSchema[] = [
     },
   },
 ];
+
+export const openaiSchemas: FormSchema[] = [...baseSchemas];
+export const azureOpenaiSchemas: FormSchema[] = [...baseSchemas];
+export const ollamaSchemas: FormSchema[] = [...baseSchemas];
+export const qfanSchemas: FormSchema[] = [
+  ...baseSchemas,
+  {
+    field: 'secretKey',
+    label: 'Secret Key',
+    labelMessage: '对于某些模型需要此配置',
+    isHidden: false,
+    component: 'NInput',
+  },
+];
+export const qwenSchemas: FormSchema[] = [...baseSchemas];
+export const zhipuSchemas: FormSchema[] = [...baseSchemas];
+
+export function getSchemas(provider: string) {
+  switch (provider) {
+    case ProviderEnum.OPENAI: {
+      return openaiSchemas;
+    }
+    case ProviderEnum.AZURE_OPENAI: {
+      return azureOpenaiSchemas;
+    }
+    case ProviderEnum.OLLAMA: {
+      return ollamaSchemas;
+    }
+    case ProviderEnum.Q_FAN: {
+      return qfanSchemas;
+    }
+    case ProviderEnum.Q_WEN: {
+      return qwenSchemas;
+    }
+    case ProviderEnum.ZHIPU: {
+      return zhipuSchemas;
+    }
+  }
+  return baseSchemas;
+}

+ 19 - 2
langchat-ui/src/views/aigc/model/components/embedding/index.vue

@@ -16,12 +16,13 @@
 
 <script lang="ts" setup>
   import { BasicForm, useForm } from '@/components/Form';
-  import { schemas } from './columns';
+  import { getSchemas, LLMProviders } from './columns';
   import { isNullOrWhitespace } from '@/utils/is';
   import { add, list as getModels, update } from '@/api/aigc/model';
   import { useMessage } from 'naive-ui';
   import { onMounted } from 'vue';
   import { ModelTypeEnum } from '@/api/models';
+  import { ref } from 'vue-demi';
 
   const ms = useMessage();
   const [register, { setFieldsValue }] = useForm({
@@ -30,14 +31,20 @@
     layout: 'horizontal',
     submitButtonText: '提交',
   });
+  const schemas = ref();
 
   onMounted(async () => {
     const data = await getModels({ type: ModelTypeEnum.EMBEDDING });
     if (data != null && data.length >= 0) {
       setFieldsValue({ ...data[0] });
+      schemas.value = getSchemas(data[0].provider);
     }
   });
 
+  function onChange(val) {
+    schemas.value = getSchemas(val);
+  }
+
   async function onSubmit(values: any) {
     if (values !== false) {
       const data = { ...values };
@@ -62,7 +69,17 @@
         title="如果需要使用知识库的能力,则必须配置Embedding向量模型。Dimensions代表向量纬度,不同的模型配置不一样,此值和VectorStore的配置要完全对应,如果在application.yml已经配置了VectorStore的Dimensions参数,那么这里也应该保持相同,否则需要删除VectorStore表重新启动项目"
         type="info"
       />
-      <BasicForm :schemas="schemas" class="mt-5" @register="register" @submit="onSubmit" />
+      <BasicForm :schemas="schemas" class="mt-5" @register="register" @submit="onSubmit">
+        <template #providerSlot="{ model, field }">
+          <n-select
+            v-model:value="model[field]"
+            :options="LLMProviders"
+            label-field="name"
+            value-field="model"
+            @change="onChange"
+          />
+        </template>
+      </BasicForm>
     </div>
   </div>
 </template>