From efe2b76eb5dd0a6b23602e5634d34299b7f8f4bc Mon Sep 17 00:00:00 2001 From: Sunner Sun Date: Tue, 30 May 2023 22:19:04 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20add=20QianWen=20(=E9=80=9A=E4=B9=89?= =?UTF-8?q?=E5=8D=83=E9=97=AE)=20support?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Known issue: Login status lost after relaunching ChatALL --- src/assets/bots/qianwen-logo.png | Bin 0 -> 21459 bytes src/background.js | 16 ++ src/bots/QianWenBot.js | 161 ++++++++++++++++++ src/bots/index.js | 2 + .../BotSettings/QianWenBotSettings.vue | 33 ++++ src/components/SettingsModal.vue | 2 + src/i18n/locales/en.json | 3 + src/i18n/locales/zh.json | 3 + src/store/index.js | 6 + 9 files changed, 226 insertions(+) create mode 100644 src/assets/bots/qianwen-logo.png create mode 100644 src/bots/QianWenBot.js create mode 100644 src/components/BotSettings/QianWenBotSettings.vue diff --git a/src/assets/bots/qianwen-logo.png b/src/assets/bots/qianwen-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..fc044ca6c3d4261d654b84d61e51cf8594c6140a GIT binary patch literal 21459 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 literal 0 HcmV?d00001 diff --git a/src/background.js b/src/background.js index 07a0c1400..fc9132f70 100644 --- a/src/background.js +++ b/src/background.js @@ -145,6 +145,22 @@ function createNewWindow(url, userAgent = "") { newWin.destroy(); // Destroy the window manually }); } + + // Get QianWen bot's XSRF-TOKEN + if (url.includes("tongyi.aliyun.com")) { + newWin.on("close", async (e) => { + try { + e.preventDefault(); // Prevent the window from closing + const token = await newWin.webContents.executeJavaScript( + 'document.cookie.split("; ").find((cookie) => cookie.startsWith("XSRF-TOKEN="))?.split("=")[1];', + ); + mainWindow.webContents.send("QIANWEN-XSRF-TOKEN", token); + } catch (error) { + console.error(error); + } + newWin.destroy(); // Destroy the window manually + }); + } } ipcMain.handle("create-new-window", (event, url, userAgent) => { diff --git a/src/bots/QianWenBot.js b/src/bots/QianWenBot.js new file mode 100644 index 000000000..66a1ee8eb --- /dev/null +++ b/src/bots/QianWenBot.js @@ -0,0 +1,161 @@ +import AsyncLock from "async-lock"; +import Bot from "@/bots/Bot"; +import axios from "axios"; +import store from "@/store"; +import { SSE } from "sse.js"; + +function generateRandomId() { + let randomStr = ""; + for (let i = 0; i < 32; i++) { + randomStr += Math.floor(Math.random() * 16).toString(16); + } + return randomStr; +} + +export default class QianWenBot extends Bot { + static _brandId = "qianWen"; // Brand id of the bot, should be unique. Used in i18n. + static _className = "QianWenBot"; // Class name of the bot + static _logoFilename = "qianwen-logo.png"; // Place it in assets/bots/ + static _loginUrl = "https://tongyi.aliyun.com/"; + static _lock = new AsyncLock(); // AsyncLock for prompt requests + + constructor() { + super(); + } + + getRequestHeaders() { + return { + "x-xsrf-token": store.state.qianWen?.xsrfToken, + }; + } + + /** + * Check whether the bot is logged in, settings are correct, etc. + * @returns {boolean} - true if the bot is available, false otherwise. + * @sideeffect - Set this.constructor._isAvailable + */ + async checkAvailability() { + await axios + .post( + "https://tongyi.aliyun.com/qianwen/querySign", + {}, + { headers: this.getRequestHeaders() }, + ) + .then((resp) => { + this.constructor._isAvailable = resp.data?.success; + if (!resp.data?.success) { + console.error("Error QianWen check login:", resp.data); + } + }) + .catch((error) => { + console.error("Error QianWen check login:", error); + this.constructor._isAvailable = false; + }); + + return this.isAvailable(); // Always return like this + } + + /** + * Send a prompt to the bot and call onResponse(response, callbackParam) + * when the response is ready. + * @param {string} prompt + * @param {function} onUpdateResponse params: callbackParam, Object {content, done} + * @param {object} callbackParam - Just pass it to onUpdateResponse() as is + */ + // eslint-disable-next-line + async _sendPrompt(prompt, onUpdateResponse, callbackParam) { + const context = await this.getChatContext(); + const headers = { + ...this.getRequestHeaders(), + accept: "text/event-stream", + "content-type": "application/json", + }; + const payload = JSON.stringify({ + action: "next", + msgId: generateRandomId(), + parentMsgId: context.parentMessageId || "0", + contents: [ + { + contentType: "text", + content: prompt, + }, + ], + timeout: 17, + openSearch: false, + sessionId: context.sessionId, + model: "", + }); + + return new Promise((resolve, reject) => { + try { + const source = new SSE( + "https://tongyi.aliyun.com/qianwen/conversation", + { + headers, + payload, + withCredentials: true, + }, + ); + + source.addEventListener("message", (event) => { + if (event.data === "") { + // Empty message usually means error + const resp = JSON.parse(source.chunk); + if (resp?.failed) { + reject(new Error(`${resp?.errorCode} ${resp?.errorMsg}`)); + return; + } + } + const data = JSON.parse(event.data); + onUpdateResponse(callbackParam, { + content: data.content[0], + done: false, + }); + if (data.stopReason === undefined || data.stopReason === "stop") { + onUpdateResponse(callbackParam, { done: true }); + context.parentMessageId = data.msgId; + this.setChatContext(context); + resolve(); + } + }); + + source.addEventListener("error", (event) => { + console.error(event); + reject(new Error(event)); + }); + + source.stream(); + } catch (err) { + reject(err); + } + }); + } + + /** + * Should implement this method if the bot supports conversation. + * The conversation structure is defined by the subclass. + * @param null + * @returns {any} - Conversation structure. null if not supported. + */ + async createChatContext() { + let context = null; + await axios + .post( + "https://tongyi.aliyun.com/qianwen/addSession", + { firstQuery: "ChatALL" }, // A hack to set session name + { headers: this.getRequestHeaders() }, + ) + .then((resp) => { + if (resp.data?.success) { + const sessionId = resp.data?.data?.sessionId; + const userId = resp.data?.data?.userId; + const parentMsgId = "0"; + context = { sessionId, parentMsgId, userId }; + } + }) + .catch((err) => { + console.error("Error QianWen adding sesion:", err); + }); + return context; + } +} diff --git a/src/bots/index.js b/src/bots/index.js index c5ee7fd6d..70efec1ea 100644 --- a/src/bots/index.js +++ b/src/bots/index.js @@ -18,6 +18,7 @@ import ClaudeBot from "@/bots/lmsys/ClaudeBot"; import DevBot from "@/bots/DevBot"; import GradioAppBot from "@/bots/huggingface/GradioAppBot"; import HuggingChatBot from "@/bots/huggingface/HuggingChatBot"; +import QianWenBot from "./QianWenBot"; const all = [ ChatGPT35Bot.getInstance(), @@ -31,6 +32,7 @@ const all = [ ClaudeBot.getInstance(), BardBot.getInstance(), WenxinQianfanBot.getInstance(), + QianWenBot.getInstance(), SparkBot.getInstance(), HuggingChatBot.getInstance(), VicunaBot.getInstance(), diff --git a/src/components/BotSettings/QianWenBotSettings.vue b/src/components/BotSettings/QianWenBotSettings.vue new file mode 100644 index 000000000..03db49f2f --- /dev/null +++ b/src/components/BotSettings/QianWenBotSettings.vue @@ -0,0 +1,33 @@ + + + diff --git a/src/components/SettingsModal.vue b/src/components/SettingsModal.vue index c06ec84ef..006408513 100644 --- a/src/components/SettingsModal.vue +++ b/src/components/SettingsModal.vue @@ -55,6 +55,7 @@ import WenxinQianfanBotSettings from "@/components/BotSettings/WenxinQianfanBotS import GradioAppBotSettings from "@/components/BotSettings/GradioAppBotSettings.vue"; import LMSYSBotSettings from "@/components/BotSettings/LMSYSBotSettings.vue"; import HuggingChatBotSettings from "@/components/BotSettings/HuggingChatBotSettings.vue"; +import QianWenBotSettings from "@/components/BotSettings/QianWenBotSettings.vue"; const { t: $t, locale } = useI18n(); const store = useStore(); @@ -72,6 +73,7 @@ const settings = [ HuggingChatBotSettings, LMSYSBotSettings, MOSSBotSettings, + QianWenBotSettings, SparkBotSettings, ]; diff --git a/src/i18n/locales/en.json b/src/i18n/locales/en.json index 120dbb335..04f1dc0d8 100644 --- a/src/i18n/locales/en.json +++ b/src/i18n/locales/en.json @@ -101,6 +101,9 @@ "temperature2": "More random", "apiKey": "API Key" }, + "qianWen": { + "name": "QianWen" + }, "spark": { "name": "iFlytek Spark" }, diff --git a/src/i18n/locales/zh.json b/src/i18n/locales/zh.json index c8bc32d6d..6df315378 100644 --- a/src/i18n/locales/zh.json +++ b/src/i18n/locales/zh.json @@ -101,6 +101,9 @@ "temperature2": "更具随机性", "apiKey": "API 密钥" }, + "qianWen": { + "name": "通义千问" + }, "spark": { "name": "讯飞星火" }, diff --git a/src/store/index.js b/src/store/index.js index 2bd025e41..8649b7e3a 100644 --- a/src/store/index.js +++ b/src/store/index.js @@ -49,6 +49,9 @@ export default createStore({ moss: { token: "", }, + qianWen: { + xsrfToken: "", + }, wenxinQianfan: { apiKey: "", secretKey: "", @@ -83,6 +86,9 @@ export default createStore({ setMoss(state, token) { state.moss.token = token; }, + setQianWenToken(state, token) { + state.qianWen.xsrfToken = token; + }, setWenxinQianfan(state, values) { state.wenxinQianfan = { ...state.wenxinQianfan, ...values }; },