import {dayjs} from "element-plus"; import axios from "./axios"; import {AI_AVATAR, OPEN_AI_KEY} from "./env"; class BaseModel { constructor(props) { for (const k in props) { this[k] = props[k]; } this.headers = { "Content-Type": "application/json", Accept: "application/json", } } setApiKey(key) { this.apiKey = key this.headers.Authorization = `Bearer ${key}` } } export class ChatGPT extends BaseModel { static base = "https://chatwithai.pages.dev" static avatar = AI_AVATAR static name = "ChatGPT" static id = "gpt-3.5-turbo" static desc = "ChatGPT-3.5所基于的模型" constructor(params) { const {avatar, name, desc, id} = ChatGPT super({avatar, name, desc, id, ...params}) this.setApiKey(OPEN_AI_KEY) } async chat(history) { const messages = history.map(e => ({role: e.role, content: e.msg})) return await axios.post(ChatGPT.base + "/v1/chat/completions", JSON.stringify({messages, model: this.id}), { headers: { Authorization: 'Bearer ' + this.apiKey, "Content-Type": "application/json", Accept: "application/json", }, }).then(res => res.json()).then(data => data?.choices?.[0]?.message?.content || "key无效或网络波动,请重新尝试"); } async chatStream(history) { const messages = history.map(e => ({role: e.role, content: e.msg})) return await axios.post(ChatGPT.base + "/v1/chat/completions", JSON.stringify({messages, model: this.id, stream: true}), { headers: { Authorization: 'Bearer ' + this.apiKey, "Content-Type": "application/json", Accept: "application/json", }, }).then(res => res?.body?.getReader()); } async getAccount() { const {headers} = this const usages = await axios.get(ChatGPT.base + "/v1/dashboard/billing/subscription", {headers}).then(res => res.json()); const endDate = usages.access_until if (endDate) { const startDate = new Date(endDate - 90 * 24 * 60 * 60); const formattedDate = time => dayjs(time).format("YYYY-MM-DD") return await axios.get(`${ChatGPT.base}/v1/dashboard/billing/usage?start_date=${formattedDate(startDate * 1000)}&end_date=${formattedDate(endDate * 1000)}`, {headers}).then(res => res.json()).then(res => { usages.total_usage = res.total_usage const names = usages.account_name.split(" ") return { ...usages, username: names.at(-1) + names[0], usage: (usages.total_usage / 100)?.toFixed(2), total: usages.hard_limit_usd?.toFixed(2) } }); } else return Promise.reject("没有权限或者网络异常,请重新尝试!") } } /** * ChatGLM 基于chatGLM-130B的api */ export class ChatGLM extends BaseModel { static base = "https://maas.aminer.cn/api/paas" static avatar = "https://cdn.cunwuyun.cn/chat/chatglm.svg" static name = "ChatGLM" static id = "chatglm-130b" static desc = "ChatGLM-130B所基于的模型" constructor(params) { const {avatar, name, desc, id} = ChatGLM super({avatar, name, desc, id, ...params}) this.getToken().then(e => this.setApiKey(e)) } getToken() { const encrypted = "MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAMZXxmDh2Rs1lh3Ymud1eVBjds/9SfjczHJFpNe9+0FsUffILVMTBcTqmdPZxjC6M1Ad2EHaHMWXZuc0fIc4Lh8CAwEAAQ==" return axios.post(ChatGLM.base + "/passApiToken/createApiToken", JSON.stringify({apiKey: "4e3ceff669c143dfa09e763663aa72cd", encrypted}), { headers: this.headers, }).then(res => res.json()).then(data => data?.token || "key无效或网络波动,请重新尝试"); } async chat(history, callback) { const context = await axios.post(ChatGLM.base + "/v1/stream_context").then(res => res.json()); return await axios.get(ChatGPT.base + "/v1/stream", {params: context.result}) } }