Selaa lähdekoodia

feat: 添加生产环境配置及优化AI接口调用

闪电 10 kuukautta sitten
vanhempi
commit
034b620a56
5 muutettua tiedostoa jossa 133 lisäystä ja 105 poistoa
  1. 2 1
      .env.development
  2. 22 0
      .env.zzprod
  3. 1 0
      package.json
  4. 40 60
      src/components/main/Navbar/cpns/aiDialog/aiDialog.vue
  5. 68 44
      src/views/main/phone/index.vue

+ 2 - 1
.env.development

@@ -35,4 +35,5 @@ VITE_APP_SIP_CONTACT_URL = "@192.168.1.19;transport=ws"
35 35
 # AI相关功能开启或关闭
36 36
 VITE_APP_AI_ASR = true
37 37
 VITE_APP_AI_SEARCH = true
38
-VITE_APP_AI_API = ''
38
+VITE_APP_AI_API = 'http://222.213.23.249:3000/api/chat/completions'
39
+VITE_APP_AI_API_KEY = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6ImQ5YjBkZTIxLTNhZDQtNGJjNC05OTNkLTFhN2I2NDk1ZmU5ZCJ9.7PHjU1Pgg7-UPlLdbUm5pGGINkwxmKta96jlDXPCKu8'

+ 22 - 0
.env.zzprod

@@ -0,0 +1,22 @@
1
+# 页面标题
2
+VITE_APP_TITLE = 智能客服中心
3
+
4
+# 生产环境配置
5
+VITE_APP_ENV = 'zzprod'
6
+
7
+# 若依管理系统/生产环境
8
+VITE_APP_BASE_API = 'http://1.194.161.64:8120/'
9
+VITE_APP_BASE_WS = 'ws://1.194.161.64:9000/ws'
10
+
11
+VITE_APP_PHONE_TYPE = 'PHONE'
12
+VITE_APP_CALL_TYPE = 'VIOCE'
13
+VITE_APP_SIP_URL = 'ws://1.194.161.64:5066'
14
+VITE_APP_SIP_IP = '1.194.161.64'
15
+VITE_APP_SIP_PASSWORD = '1234'
16
+VITE_APP_SIP_CONTACT_URL = "@1.194.161.64;transport=ws"
17
+
18
+# AI相关功能开启或关闭
19
+VITE_APP_AI_ASR = true
20
+VITE_APP_AI_SEARCH = true
21
+VITE_APP_AI_API = 'http://222.213.23.249:3000/api/chat/completions'
22
+VITE_APP_AI_API_KEY = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6ImQ5YjBkZTIxLTNhZDQtNGJjNC05OTNkLTFhN2I2NDk1ZmU5ZCJ9.7PHjU1Pgg7-UPlLdbUm5pGGINkwxmKta96jlDXPCKu8'

+ 1 - 0
package.json

@@ -8,6 +8,7 @@
8 8
     "dev": "vite",
9 9
     "css": "npx tailwindcss -i ./src/style.css -o ./src/assets/style.css --watch",
10 10
     "build:prod": "vite build",
11
+    "build:bayuan": "vite build --mode zzprod",
11 12
     "build:stage": "vite build --mode staging",
12 13
     "build:dev": "vite build --mode development",
13 14
     "prettier": "prettier --write .",

+ 40 - 60
src/components/main/Navbar/cpns/aiDialog/aiDialog.vue

@@ -401,41 +401,7 @@
401 401
     }
402 402
 
403 403
     async function getSearchDocs() {
404
-        let params = {
405
-            query: postChatText.value,
406
-            // mode: "local_kb",
407
-            // kb_name: "mszsk",
408
-            // top_k: 1,
409
-            // score_threshold: 0.5,
410
-            // stream: true,
411
-            // model: "glm-4",
412
-            // temperature: 0.7,
413
-            // max_tokens: 0,
414
-            // prompt_name: "default",
415
-            // return_direct: false
416
-
417
-            query: `你是一位专业的心理咨询师,擅长帮助来访者探索情绪、压力、人际关系等问题。请根据以下用户输入,提供专业、温暖且有针对性的心理咨询建议。如果用户的问题涉及具体心理困扰,请尝试引导用户深入思考,并提供适当的应对策略或情绪调节方法。
418
-
419
-用户输入:${postChatText.value}
420
-
421
-请根据以下步骤进行回复:
422
-1. **共情与理解**:首先对用户的情绪或困扰表示理解,建立信任感。
423
-2. **问题分析**:分析用户问题的可能根源或核心矛盾。
424
-3. **建议与引导**:提供具体的建议或引导用户思考解决方案。
425
-4. **总结与支持**:总结关键点,并鼓励用户尝试行动或进一步探索。
426
-
427
-注意:保持语气温和、专业,避免使用过于绝对的判断或建议,内容尽量言简意赅。`,
428
-				mode: "local_kb",
429
-				kb_name: "mszsk",
430
-				top_k: 1,
431
-				score_threshold: 0.5,
432
-				stream: true,
433
-				model: "glm-4",
434
-				temperature: 0.7,
435
-				max_tokens: 0,
436
-				prompt_name: "default",
437
-				return_direct: false
438
-        }
404
+        let params = {}
439 405
         const obj = {
440 406
             direction:2,
441 407
             loadingFlag:true,
@@ -447,7 +413,7 @@
447 413
         }, 200);
448 414
         try {
449 415
             params = {
450
-                model: 'glm-4-air',
416
+                model: 'deepseek-r1:32b',
451 417
 				messages: [{
452 418
 					role: 'system',
453 419
 					content: `你是一位专业的心理咨询师,擅长帮助来访者探索情绪、压力、人际关系等问题。请根据以下用户输入,提供专业、温暖且有针对性的心理咨询建议。如果用户的问题涉及具体心理困扰,请尝试引导用户深入思考,并提供适当的应对策略或情绪调节方法。
@@ -469,19 +435,33 @@
469 435
 				stream: true,
470 436
             }
471 437
             // 发送请求
472
-            // fetchEventSource('https://open.bigmodel.cn/api/paas/v4/chat/completions', {
473
-                let response = await fetch("https://open.bigmodel.cn/api/paas/v4/chat/completions",
474 438
             // let response = await fetch("http://192.168.1.89:7861/chat/kb_chat",
439
+            const url = import.meta.env.VITE_APP_AI_API || 'https://open.bigmodel.cn/api/paas/v4/chat/completions'
440
+            let response = await fetch(url,
441
+            
475 442
                 {
476 443
                     method: "post",
477 444
                     responseType: "stream",
478 445
                     headers: {
479 446
                         "Content-Type": "application/json",
480
-                        "Authorization": 'Bearer 1711c0bfa059f253fce0921015a44fc8.VZVQz66PrwJ2NqLP',
447
+                        "Authorization": `Bearer ${import.meta.env.VITE_APP_AI_API_KEY}`
481 448
                     },
482 449
                     body: JSON.stringify(params),
483 450
                 }
484 451
             );
452
+            // // 发送请求
453
+            //     let response = await fetch("https://open.bigmodel.cn/api/paas/v4/chat/completions",
454
+            // // let response = await fetch("http://192.168.1.89:7861/chat/kb_chat",
455
+            //     {
456
+            //         method: "post",
457
+            //         responseType: "stream",
458
+            //         headers: {
459
+            //             "Content-Type": "application/json",
460
+            //             "Authorization": 'Bearer 1711c0bfa059f253fce0921015a44fc8.VZVQz66PrwJ2NqLP',
461
+            //         },
462
+            //         body: JSON.stringify(params),
463
+            //     }
464
+            // );
485 465
             // ok字段判断是否成功获取到数据流
486 466
             if (!response.ok) {
487 467
                 throw new Error("Network response was not ok");
@@ -511,7 +491,7 @@
511 491
                         const resultData = JSON.parse(text)
512 492
                         let resultText = resultData.choices[0].delta.content
513 493
                         // console.log(resultData.choices[0].delta.content, "输出分段返回的数据")
514
-                        chatData.value[chatData.value.length -1].page_content += resultText
494
+                        chatData.value[chatData.value.length -1].page_content += resultText || ''
515 495
                         chatData.value[chatData.value.length-1].loadingFlag = false
516 496
                         setTimeout(() => {
517 497
                             roll();
@@ -530,27 +510,27 @@
530 510
 
531 511
     }
532 512
     const conModelData = [
533
-        {
534
-            icon:'✍️',
535
-            title:'标题大师',
536
-            content:'请帮我拟定几个合适的标题,我的主题或内容是:'
537
-        },
538
-        {
539
-            icon:'💬 ',
540
-            title:'疾病咨询',
541
-            content:'请帮我查询一下,心脏病'
542
-        },
513
+        // {
514
+        //     icon:'✍️',
515
+        //     title:'标题大师',
516
+        //     content:'请帮我拟定几个合适的标题,我的主题或内容是:'
517
+        // },
518
+        // {
519
+        //     icon:'💬 ',
520
+        //     title:'疾病咨询',
521
+        //     content:'请帮我查询一下,心脏病'
522
+        // },
543 523
         
544
-        {
545
-            icon:'🔍',
546
-            title:'功能查询',
547
-            content:'怎么添加员工?'
548
-        },
549
-        {
550
-            icon:'📈 ',
551
-            title:'工单查询',
552
-            content:'帮我查询所有产品线下2024-10-01 到 2024-10-31的工单数据'
553
-        },
524
+        // {
525
+        //     icon:'🔍',
526
+        //     title:'功能查询',
527
+        //     content:'怎么添加员工?'
528
+        // },
529
+        // {
530
+        //     icon:'📈 ',
531
+        //     title:'工单查询',
532
+        //     content:'帮我查询所有产品线下2024-10-01 到 2024-10-31的工单数据'
533
+        // },
554 534
     ]
555 535
     
556 536
     const quesModelData = [

+ 68 - 44
src/views/main/phone/index.vue

@@ -1055,8 +1055,42 @@ const aiSubmit = async () => {
1055 1055
     aiLoading.value = true;
1056 1056
     let text = transcripts.value.map((o) => o.page_content).join('');
1057 1057
     if (text?.length > 10) {
1058
-        const tx = `请从以下咨询对话中提取关键信息生成结构化工单:
1059
-        咨询对话内容:${text}
1058
+        const res = await getSearchDocs(text);
1059
+        console.log(res, 'res');
1060
+            
1061
+        res.split('\n').forEach((o) => {
1062
+            if (o.startsWith('【内容总结】')) form.value.description = o.replace('【内容总结】', '').replace(':', '');
1063
+            // if (o.startsWith('【事件地址】')) form.value.address = o.replace('【事件地址】', '').replace(':', '');
1064
+            // if (o.startsWith('【姓名】')) form.value.customerName = o.replace('【姓名】', '').replace(':', '');
1065
+            
1066
+        })
1067
+
1068
+        aiLoading.value = false;
1069
+        
1070
+    } else {
1071
+        aiLoading.value = false;
1072
+    }
1073
+}
1074
+async function getSearchDocs (text) {
1075
+    // const params = {
1076
+    //     query: text,
1077
+    //     mode: "local_kb",
1078
+    //     kb_name: "mszsk",
1079
+    //     top_k: 1,
1080
+    //     score_threshold: 0.5,
1081
+    //     stream: true,
1082
+    //     model: "glm-4",
1083
+    //     temperature: 0.7,
1084
+    //     max_tokens: 0,
1085
+    //     prompt_name: "default",
1086
+    //     return_direct: false
1087
+    // }
1088
+    const params = {
1089
+        "model": "deepseek-r1:32b",
1090
+      "messages": [
1091
+        {
1092
+          "role": "user",
1093
+          "content": `请从以下咨询对话中提取关键信息生成结构化工单:
1060 1094
 地理位置提取:识别来访者明确提到的居住地或当前位置
1061 1095
 格式:[省/市/区/街道/楼栋号/房间号](如未提及则标记"未知")
1062 1096
 注意模糊表述(如"北方城市""江浙地区"等需保留原话)
@@ -1083,50 +1117,40 @@ const aiSubmit = async () => {
1083 1117
 示例输出:
1084 1118
 【地理位置】:浙江省杭州市
1085 1119
 【内容总结】:来访者诉持续三个月失眠症状,伴有社交场合手抖等躯体化表现,提及近期出现惊恐发作经历(地铁喘不过气),社会功能受损(工作受影响)
1086
-【工单类型】: 焦虑障碍
1087
-`;
1088
-        const res = await getSearchDocs(tx);
1089
-        console.log(res, 'res');
1090
-            
1091
-        res.split('\n').forEach((o) => {
1092
-            if (o.startsWith('【内容总结】')) form.value.description = o.replace('【内容总结】', '').replace(':', '');
1093
-            // if (o.startsWith('【事件地址】')) form.value.address = o.replace('【事件地址】', '').replace(':', '');
1094
-            // if (o.startsWith('【姓名】')) form.value.customerName = o.replace('【姓名】', '').replace(':', '');
1095
-            
1096
-        })
1097
-
1098
-        aiLoading.value = false;
1099
-        
1100
-    } else {
1101
-        aiLoading.value = false;
1102
-    }
1103
-}
1104
-async function getSearchDocs (text) {
1105
-    const params = {
1106
-        query: text,
1107
-        mode: "local_kb",
1108
-        kb_name: "mszsk",
1109
-        top_k: 1,
1110
-        score_threshold: 0.5,
1111
-        stream: true,
1112
-        model: "glm-4",
1113
-        temperature: 0.7,
1114
-        max_tokens: 0,
1115
-        prompt_name: "default",
1116
-        return_direct: false
1117
-    }
1120
+【工单类型】: 焦虑障碍`
1121
+        }, {
1122
+          "role": "user",
1123
+          "content": text
1124
+        }
1125
+      ],
1126
+      "stream": true
1127
+    };
1118 1128
     try {
1119 1129
         // 发送请求
1120
-        let response = await fetch("http://192.168.1.89:7861/chat/chat",
1121
-            {
1122
-                method: "post",
1123
-                // responseType: "stream",
1124
-                headers: {
1125
-                    "Content-Type": "application/json",
1126
-                },
1127
-                body: JSON.stringify(params),
1128
-            }
1129
-        );
1130
+        // let response = await fetch("http://192.168.1.89:7861/chat/chat",
1131
+        //     {
1132
+        //         method: "post",
1133
+        //         // responseType: "stream",
1134
+        //         headers: {
1135
+        //             "Content-Type": "application/json",
1136
+        //         },
1137
+        //         body: JSON.stringify(params),
1138
+        //     }
1139
+        // );
1140
+
1141
+        const url = import.meta.env.VITE_APP_AI_API || 'https://open.bigmodel.cn/api/paas/v4/chat/completions'
1142
+            let response = await fetch(url,
1143
+            
1144
+                {
1145
+                    method: "post",
1146
+                    responseType: "stream",
1147
+                    headers: {
1148
+                        "Content-Type": "application/json",
1149
+                        "Authorization": `Bearer ${import.meta.env.VITE_APP_AI_API_KEY}`
1150
+                    },
1151
+                    body: JSON.stringify(params),
1152
+                }
1153
+            );
1130 1154
 
1131 1155
         let resultStr = '';
1132 1156