|
@@ -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 {
|