Browse Source

新增对通义千问的支持

Pchen 1 year ago
parent
commit
24349217a3

+ 2 - 5
API/ChatGPT.js

@@ -1,10 +1,8 @@
 const axios = require('axios')
 const axios = require('axios')
 const sqlite3 = require('sqlite3')
 const sqlite3 = require('sqlite3')
 
 
-//sqlite数据库路径
-let sqliteDbPath = "./db/data.db"
 //打开数据库
 //打开数据库
-var db = new sqlite3.Database(sqliteDbPath)
+const db = new sqlite3.Database("./db/data.db")
 
 
 function getConfigValue(configName) {
 function getConfigValue(configName) {
     return new Promise((resolve, reject) => {
     return new Promise((resolve, reject) => {
@@ -51,8 +49,7 @@ async function getGPTMessage(message) {
             headers: { 'Content-Type': 'application/json', Authorization: token }
             headers: { 'Content-Type': 'application/json', Authorization: token }
         })
         })
 
 
-        const apiData = responseData.data
-        const apiMessage = apiData.choices[0].message.content
+        const apiMessage = responseData.data.choices[0].message.content
 
 
         return apiMessage
         return apiMessage
     } catch (error) {
     } catch (error) {

+ 84 - 0
API/tongyi.js

@@ -0,0 +1,84 @@
+const axios = require('axios')
+const sqlite3 = require('sqlite3')
+
+const db = new sqlite3.Database("./db/data.db")
+
+function getConfigValue(configName) {
+    return new Promise((resolve, reject) => {
+        const query = 'SELECT value FROM tongyiconfig WHERE config = ?';
+        db.get(query, [configName], (err, row) => {
+            if (err) {
+                reject(err);
+            } else {
+                const configValue = row ? row.value : null;
+                // 处理字符串 'null',如果是 'null' 则返回 null
+                resolve(configValue === 'null' ? null : configValue)
+            }
+        })
+    })
+}
+
+// 读取配置信息并设置相应的变量
+async function loadConfigValues() {
+    try {
+        apiKey = await getConfigValue('apiKey')
+        apiUrl = await getConfigValue('apiUrl')
+        maxTokensStr = await getConfigValue('max_tokens')
+        temperatureStr = await getConfigValue('temperature')
+        model = await getConfigValue('model')
+        presets = await getConfigValue('presets')
+        temperature = parseFloat(temperatureStr)
+        max_tokens = parseInt(maxTokensStr)
+    } catch (error) {
+        console.error('加载通义api接口设置失败!', error)
+    }
+}
+
+// 调用函数加载配置信息
+loadConfigValues()
+
+async function getTYMessage(message) {
+    const requestData = {
+        model: model,
+        input: {
+            messages: [
+                { "role": "system", "content": presets },
+                { "role": "user", "content": message }
+            ],
+        },
+        parameters: {
+            max_tokens: max_tokens,
+            temperature: temperature
+        }
+    }
+
+    const token = "Bearer " + apiKey
+
+    try {
+        const responseData = await axios.post(apiUrl, requestData, {
+            headers: { 'Content-Type': 'application/json', Authorization: token }
+        })
+
+        const apiMessage = responseData.data.output.text
+
+        return apiMessage
+    } catch (error) {
+        console.error("向api接口发送请求时出现错误")
+        return error
+    }
+}
+
+// 更新api设置到数据库
+function updateTYConfig(configName, configValue) {
+    const query = 'REPLACE INTO tongyiconfig (config, value) VALUES (?, ?)';
+    db.run(query, [configName, configValue], (err) => {
+        if (err) {
+            console.error('更新数据失败:', err);
+        }
+        loadConfigValues()
+    })
+}
+
+module.exports = {
+    updateTYConfig, getTYMessage
+}

+ 1 - 1
README.md

@@ -1,6 +1,6 @@
 <h1 align="center">Web Wechat Bot</h1>
 <h1 align="center">Web Wechat Bot</h1>
 
 
-「Web Wechat Bot」是一个基于Wechaty、可通过网页远程登录管理、可接入讯飞星火、ChatGPT等大语言模型的微信聊天机器人,使用微信网页版协议。你可以通过网页登录微信、设置回复规则、配置API接口等。
+「Web Wechat Bot」是一个基于Wechaty、可通过网页远程登录管理、可接入讯飞星火、ChatGPT、通义千问等大语言模型的微信聊天机器人,使用微信网页版协议。你可以通过网页登录微信、设置回复规则、配置API接口等。
 
 
 
 
 
 

BIN
db/data.db


File diff suppressed because it is too large
+ 0 - 0
public/css/app.0388ddb0.css


BIN
public/favicon.ico


+ 1 - 1
public/index.html

@@ -1 +1 @@
-<!doctype html><html lang=""><head><meta charset="utf-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width,initial-scale=1"><link rel="icon" href="favicon.ico"><title>webbot</title><script defer="defer" src="js/chunk-vendors.310ecf7c.js"></script><script defer="defer" src="js/app.7f67ff3c.js"></script><link href="css/chunk-vendors.0e83c255.css" rel="stylesheet"><link href="css/app.a1a2bfd3.css" rel="stylesheet"></head><body><noscript><strong>We're sorry but webbot doesn't work properly without JavaScript enabled. Please enable it to continue.</strong></noscript><div id="app"></div></body></html>
+<!doctype html><html lang=""><head><meta charset="utf-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width,initial-scale=1"><link rel="icon" href="favicon.ico"><title>webbot</title><script defer="defer" src="js/chunk-vendors.310ecf7c.js"></script><script defer="defer" src="js/app.5f03a5a3.js"></script><link href="css/chunk-vendors.0e83c255.css" rel="stylesheet"><link href="css/app.0388ddb0.css" rel="stylesheet"></head><body><noscript><strong>We're sorry but webbot doesn't work properly without JavaScript enabled. Please enable it to continue.</strong></noscript><div id="app"></div></body></html>

File diff suppressed because it is too large
+ 0 - 0
public/js/app.5f03a5a3.js


File diff suppressed because it is too large
+ 0 - 0
public/js/app.5f03a5a3.js.map


File diff suppressed because it is too large
+ 0 - 0
public/js/app.7f67ff3c.js


File diff suppressed because it is too large
+ 0 - 0
public/js/app.7f67ff3c.js.map


+ 26 - 2
router.js

@@ -1,6 +1,7 @@
 const express = require('express')
 const express = require('express')
 const { updateGPTConfig } = require('./API/ChatGPT')
 const { updateGPTConfig } = require('./API/ChatGPT')
 const { updateXunfeiConfig } = require('./API/xunfei')
 const { updateXunfeiConfig } = require('./API/xunfei')
+const { updateTYConfig } = require('./API/tongyi')
 const { sendMessageToAPI } = require('./wechat/main')
 const { sendMessageToAPI } = require('./wechat/main')
 const sqlite3 = require('sqlite3')
 const sqlite3 = require('sqlite3')
 const jsonwebtoken = require('jsonwebtoken')
 const jsonwebtoken = require('jsonwebtoken')
@@ -126,7 +127,6 @@ router.post('/changeaccount', findusername, (req, res) => {
                                 res.send({ status: 500, msg: "更新账户信息失败" })
                                 res.send({ status: 500, msg: "更新账户信息失败" })
                             } else {
                             } else {
                                 res.send({ status: 200, msg: "账户信息更新成功" })
                                 res.send({ status: 200, msg: "账户信息更新成功" })
-
                             }
                             }
                         })
                         })
                     }
                     }
@@ -165,7 +165,6 @@ router.get('/getstatus',async(req,res) => {
 
 
 router.post('/chat',async(req,res) => {
 router.post('/chat',async(req,res) => {
     try{
     try{
-        console.log('收到:',req.body)
         const response = await sendMessageToAPI(req.body.msg)
         const response = await sendMessageToAPI(req.body.msg)
         res.send({status:200,msg:response}) 
         res.send({status:200,msg:response}) 
     } catch(err) {
     } catch(err) {
@@ -203,6 +202,16 @@ router.post('/getxfconfig', async (req, res) => {
     })
     })
 })
 })
 
 
+router.post('/gettyconfig', async (req, res) => {
+    db.all('SELECT * FROM tongyiconfig', [], (err, rows) => {
+        if (err) {
+            res.send({ status: 500, msg: '查询失败!' })
+            return
+        }
+        res.send({ status: 200, msg: rows })
+    })
+})
+
 router.post('/gptconfig',async(req,res) => {
 router.post('/gptconfig',async(req,res) => {
     const { apiKey,apiUrl,app_code,model } = req.body
     const { apiKey,apiUrl,app_code,model } = req.body
     try {
     try {
@@ -232,6 +241,21 @@ router.post('/xfconfig', async (req, res) => {
     }
     }
 })
 })
 
 
+router.post('/tyconfig', async (req, res) => {
+    const { temperature, max_tokens, model, apiKey, presets, apiUrl } = req.body
+    try {
+        updateTYConfig("temperature", temperature)
+        updateTYConfig("max_tokens", max_tokens)
+        updateTYConfig("presets", presets)
+        updateTYConfig("apiKey", apiKey)
+        updateTYConfig("model", model)
+        updateTYConfig("apiUrl", apiUrl)
+        res.send({ status: 200, msg: '设置成功!' })
+    } catch (error) {
+        res.send({ status: 500, msg: '设置失败!' })
+    }
+})
+
 //获取机器人设置
 //获取机器人设置
 router.post('/getwxconfig', async (req, res) => {
 router.post('/getwxconfig', async (req, res) => {
     db.all('SELECT * FROM wxconfig', [], (err, rows) => {
     db.all('SELECT * FROM wxconfig', [], (err, rows) => {

+ 9 - 3
wechat/main.js

@@ -1,7 +1,9 @@
 const { WechatyBuilder } = require("wechaty")
 const { WechatyBuilder } = require("wechaty")
 const { getGPTMessage } = require('../API/ChatGPT')
 const { getGPTMessage } = require('../API/ChatGPT')
 const { getXunfeiMessage } = require('../API/xunfei')
 const { getXunfeiMessage } = require('../API/xunfei')
+const { getTYMessage } = require('../API/tongyi')
 const sqlite3 = require('sqlite3')
 const sqlite3 = require('sqlite3')
+const { response } = require("express")
 
 
 //sqlite数据库路径
 //sqlite数据库路径
 let sqliteDbPath = "./db/data.db"
 let sqliteDbPath = "./db/data.db"
@@ -64,8 +66,13 @@ async function sendMessageToAPI(message) {
         const response = await getGPTMessage(message)
         const response = await getGPTMessage(message)
         const content = prefix + response + suffix
         const content = prefix + response + suffix
         return content
         return content
-    }  else {
-        return
+    }  else if(usemodel === 'tongyi'){
+        const response = await getTYMessage(message)
+        const content = prefix + response + suffix
+        return content
+    } else {
+        const content = prefix + '请前往设置页面选择Bot使用的模型' + suffix
+        return content
     }
     }
 }
 }
 
 
@@ -168,7 +175,6 @@ async function wxlogin() {
                                         return
                                         return
                                     }
                                     }
                                 } else if (foundWords.length > 0) {
                                 } else if (foundWords.length > 0) {
-                                    console.log('发现关键字')
                                     const apiMessage = await sendMessageToAPI(content)
                                     const apiMessage = await sendMessageToAPI(content)
                                     const senmsg = '@' + talkername + '  ' + apiMessage 
                                     const senmsg = '@' + talkername + '  ' + apiMessage 
                                     room.say(senmsg)
                                     room.say(senmsg)

Some files were not shown because too many files changed in this diff