yangg 1 месяц назад
Родитель
Сommit
8feec8ffea
3 измененных файлов с 212 добавлено и 27 удалено
  1. 2 2
      .env.development
  2. 44 5
      src/components/ModelConfig/index.vue
  3. 166 20
      src/views/report.vue

+ 2 - 2
.env.development

@@ -1,3 +1,3 @@
 NODE_ENV=development
-VITE_BASE_AI_API=https://ylaiapi.raycos.com.cn
-VITE_BASE_AI_F_API=http://183.195.216.54:8084
+VITE_BASE_AI_API=http://192.168.100.187:8082
+VITE_BASE_AI_F_API=http://192.168.100.101:8084

+ 44 - 5
src/components/ModelConfig/index.vue

@@ -97,7 +97,7 @@
 </template>
 
 <script setup>
-import { ref, reactive } from 'vue';
+import { ref, reactive, onMounted } from 'vue';
 import { PlusOutlined } from '@ant-design/icons-vue';
 import { message } from 'ant-design-vue';
 
@@ -139,11 +139,46 @@ const MODEL_GROUPS = [
 
 const isPanelOpen = ref(false);
 const saving = ref(false);
+const loading = ref(false);
 const modelList = ref([
   { type: '', key: '', endpoint: '', name: '' }
 ]);
 
-const modelGroups = ref(MODEL_GROUPS);
+const modelGroups = ref([]);
+
+// 获取模型列表
+const fetchModels = async () => {
+  loading.value = true;
+  try {
+    const response = await fetch(`${import.meta.env.VITE_BASE_AI_API}/api/models`);
+    if (!response.ok) {
+      throw new Error('Failed to fetch models');
+    }
+    const data = await response.json();
+    
+    // 将API返回的模型数据转换为组件需要的格式
+    const apiModels = data.data.map(model => ({
+      label: model.name,
+      value: model.id,
+      endpoint: model.endpoint || '',
+      description: model.description || ''
+    }));
+
+    // 更新模型组
+    modelGroups.value = [
+      {
+        label: 'API模型',
+        options: apiModels
+      },
+      ...MODEL_GROUPS // 保留原有的模型组
+    ];
+  } catch (error) {
+    console.error('获取模型列表失败:', error);
+    message.error('获取模型列表失败');
+  } finally {
+    loading.value = false;
+  }
+};
 
 const getKeyPlaceholder = (type) => {
   const placeholders = {
@@ -163,7 +198,8 @@ const getKeyPlaceholder = (type) => {
 
 const handleModelChange = (value, index) => {
   const model = modelList.value[index];
-  const selectedOption = MODEL_GROUPS.flatMap(group => group.options)
+  const selectedOption = modelGroups.value
+    .flatMap(group => group.options)
     .find(option => option.value === value);
   
   if (selectedOption) {
@@ -222,8 +258,11 @@ const initConfig = () => {
   }
 };
 
-// 组件挂载时加载配置
-initConfig();
+// 组件挂载时加载配置和获取模型列表
+onMounted(async () => {
+  initConfig();
+  await fetchModels();
+});
 </script>
 
 <style scoped>

+ 166 - 20
src/views/report.vue

@@ -270,6 +270,28 @@
             </div>
           </div>
 
+          <div class="search-toggle-item">
+            <div class="toggle-content">
+              <!-- <SelectOutlined /> -->
+              <!-- <span class="toggle-text">模型选择</span> -->
+              <select 
+                class="model-select" 
+                :value="selectedModel"
+                @change="handleModelChange($event.target.value)"
+                :disabled="isLoadingModels"
+              >
+                <option v-if="isLoadingModels" value="">加载中...</option>
+                <option v-else-if="models.length === 0" value="">无可用模型</option>
+                <option 
+                  v-for="model in models" 
+                  :key="model.id" 
+                  :value="model.id"
+                >
+                  {{ model.name }}
+                </option>
+              </select>
+            </div>
+          </div>
 
         </div>
         <!-- 添加附件面板 -->
@@ -575,6 +597,7 @@ import {
   GlobalOutlined,
   DatabaseOutlined,
   FolderOutlined,
+  SelectOutlined,
 } from "@ant-design/icons-vue";
 import leftIcon from "../assets/svg/left.svg";
 import rightIcon from "../assets/svg/right.svg";
@@ -1093,30 +1116,58 @@ const sendMessage = async () => {
       image_urls: imageUrls,
       video_urls: videoUrls,
       documents: documentUrls,
+      merchant_id:3,
+      model_type: selectedModelInfo.value.type,
+      model_name: selectedModelInfo.value.name
     });
+    if(!enableWebSearch.value){
+        // 更新 session_id
+      if (response.data.session_id) {
+        session_id.value = response.data.session_id;
+      }
 
-    // 更新 session_id
-    if (response.data.data.session_id) {
-      session_id.value = response.data.data.session_id;
-    }
+      // 移除时消息并添加AI响应
+      messages.value = messages.value.filter(
+        (msg) => msg.id !== tempAiMessage.id
+      );
+      const aiMessage = reactive({
+        id: Date.now() + 2,
+        role: "assistant",
+        content:response.data.choices[0].message.content,
+        displayContent: "",
+        audioData: response.data.audio_info?.audio || null, // 保存音频数据
+      });
+      messages.value.push(aiMessage);
+      // 如果有音频数据,自动播放
+      if (aiMessage.audioData) {
+        playAudioMessage(aiMessage.audioData);
+      }
+      await typeMessage(aiMessage);
+    }else{
+   
+      if (response.data.data.session_id) {
+        session_id.value = response.data.data.session_id;
+      }
 
-    // 移除时消息并添加AI响应
-    messages.value = messages.value.filter(
-      (msg) => msg.id !== tempAiMessage.id
-    );
-    const aiMessage = reactive({
-      id: Date.now() + 2,
-      role: "assistant",
-      content: response.data.data.answer,
-      displayContent: "",
-      audioData: response.data.data.audio_info?.audio || null, // 保存音频数据
-    });
-    messages.value.push(aiMessage);
-    // 如果有音频数据,自动播放
-    if (aiMessage.audioData) {
-      playAudioMessage(aiMessage.audioData);
+      // 移除时消息并添加AI响应
+      messages.value = messages.value.filter(
+        (msg) => msg.id !== tempAiMessage.id
+      );
+      const aiMessage = reactive({
+        id: Date.now() + 2,
+        role: "assistant",
+        content:response.data.data.answer,
+        displayContent: "",
+        audioData: response.data.data.audio_info?.audio || null, // 保存音频数据
+      });
+      messages.value.push(aiMessage);
+      // 如果有音频数据,自动播放
+      if (aiMessage.audioData) {
+        playAudioMessage(aiMessage.audioData);
+      }
+      await typeMessage(aiMessage);
     }
-    await typeMessage(aiMessage);
+    
   } catch (error) {
     console.error("发送消息失败:", error);
     messages.value = messages.value.filter(
@@ -1568,6 +1619,58 @@ const updateCollapsedState = () => {
       }
     }
   };
+
+  // 添加新的响应式变量
+  const API_BASE_URL = import.meta.env.VITE_BASE_AI_API;
+  const models = ref([]);
+  const selectedModel = ref(null);
+  const isLoadingModels = ref(false);
+
+  // 添加计算属性获取选中的模型信息
+  const selectedModelInfo = computed(() => {
+    if (!selectedModel.value || !models.value.length) return { type: '', name: '' };
+    const model = models.value.find(m => m.id === selectedModel.value);
+    return {
+      type: model?.type || '',
+      name: model?.name || ''
+    };
+  });
+
+  // 添加获取模型列表的方法
+  const fetchModels = async () => {
+    isLoadingModels.value = true;
+    try {
+      const response = await fetch(`${API_BASE_URL}/api/models`);
+      const data = await response.json();
+      console.log(data);
+      if (data.code === 2000) {
+        // 确保每个模型对象都有必要的字段
+        models.value = (data.data.models || []).map(model => ({
+          id: model.id,
+          name: model.name,
+          type: model.type || model.model_type || 'default' // 确保有type字段
+        }));
+        if (models.value.length > 0) {
+          selectedModel.value = models.value[0].id; // 默认选择第一个模型
+        }
+      }
+    } catch (error) {
+      console.error('Failed to fetch models:', error);
+    } finally {
+      isLoadingModels.value = false;
+    }
+  };
+
+  // 添加模型选择改变的处理方法
+  const handleModelChange = (modelId) => {
+    selectedModel.value = modelId;
+  };
+
+  // 在组件挂载时获取模型列表
+  onMounted(() => {
+    fetchModels();
+    // ... existing onMounted code ...
+  });
  </script>
 
 <style scoped>
@@ -3704,6 +3807,49 @@ button,
   right: auto;
   left: -20px;
 }
+
+/* 添加模型选择框样式 */
+.model-select {
+  background: transparent;
+  border: 1px solid #d9d9d9;
+  border-radius: 4px;
+  padding: 4px 8px;
+  font-size: 14px;
+  color: rgba(0, 0, 0, 0.88);
+  cursor: pointer;
+  transition: all 0.3s;
+  outline: none;
+  margin-left: auto;
+  min-width: 120px;
+
+  &:hover {
+    border-color: #1677ff;
+  }
+
+  &:focus {
+    border-color: #1677ff;
+    box-shadow: 0 0 0 2px rgba(22, 119, 255, 0.1);
+  }
+
+  &:disabled {
+    background: #f5f5f5;
+    cursor: not-allowed;
+    color: rgba(0, 0, 0, 0.25);
+  }
+
+  option {
+    background: white;
+    color: rgba(0, 0, 0, 0.88);
+  }
+}
+
+@media screen and (max-width: 768px) {
+  .model-select {
+    min-width: 80px;
+    font-size: 12px;
+    padding: 2px 4px;
+  }
+}
 </style>
 <style lang="less" scoped>
 ::v-deep .message-content {