mixin.js 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228
  1. import { v4 as uuidv4 } from "uuid";
  2. import { fetchEventSource } from "@microsoft/fetch-event-source";
  3. export const myMixin = {
  4. data() {
  5. return {
  6. userJson: {},
  7. new_url: 'https://appapi.cocorobo.cn',
  8. model: {}
  9. };
  10. },
  11. methods: {
  12. detectBrowser() {
  13. const ua = navigator.userAgent;
  14. // 按优先级顺序检测
  15. if (ua.includes("Edg/") || ua.includes("Edge/")) {
  16. return "Microsoft Edge";
  17. } else if (ua.includes("Firefox")) {
  18. return "Mozilla Firefox";
  19. } else if (ua.includes("Trident") || ua.includes("MSIE")) {
  20. return "Internet Explorer";
  21. } else if (ua.includes("360EE")) {
  22. return "360 Browser (极速模式)";
  23. } else if (ua.includes("360SE")) {
  24. return "360 Browser (安全模式)";
  25. } else if (ua.includes("SLBrowser")) {
  26. return "QQ Browser";
  27. } else if (ua.includes("UCBrowser")) {
  28. return "UC Browser";
  29. } else if (ua.includes("Opera") || ua.includes("OPR/")) {
  30. return "Opera";
  31. } else if (ua.includes("Chrome") && !ua.includes("Edg/")) {
  32. return "Google Chrome";
  33. } else if (ua.includes("Safari/") && !ua.includes("Chrome")) {
  34. return "Safari";
  35. } else {
  36. return "Other Browser";
  37. }
  38. },
  39. async addOp3(userTime, loadTime, object, status,api = 'selectUser') {
  40. if (!this.$route.query.userid) return
  41. try {
  42. if(!this.userJson || !this.userJson.accountNumber){
  43. let res = await this.ajax.get(this.$store.state.api + api, {
  44. userid: this.$route.query.userid
  45. });
  46. this.userJson = res.data[0][0]
  47. }
  48. } catch (e) {
  49. console.log(e);
  50. return this.addOp3(userTime, loadTime, object, status,'selectUser2');
  51. }
  52. let _time = new Date()
  53. .toLocaleString("zh-CN", { hour12: false, timeZone: "Asia/Shanghai" })
  54. .replace(/\//g, "-");
  55. let browser = this.detectBrowser();
  56. let params = {
  57. userid: this.$route.query.userid,
  58. username: this.userJson.username,
  59. accountNumber: this.userJson.accountNumber,
  60. org: this.userJson.orgName,
  61. school: this.userJson.schoolName,
  62. role: this.userJson.type =='1'?'老师':'学生',
  63. browser: browser,
  64. userTime: userTime == "1" ? _time : userTime, // 使用时间 1次的就1 其次传秒
  65. loadTime: loadTime, //load的时间没有就“”
  66. object: JSON.stringify(object), //执行信息传json
  67. status: status //成功返回success。失败返回error的信息
  68. };
  69. console.log('params',params);
  70. this.ajax
  71. .post(this.$store.state.apiM + "updateUserData2", [params])
  72. .then(res => {
  73. if (res.data.status == 1) {
  74. console.log("保存成功");
  75. } else {
  76. console.log("保存失败");
  77. }
  78. })
  79. .catch(e => {
  80. console.log("保存失败");
  81. console.log(e);
  82. });
  83. },
  84. async chat_no_stream(prompt=[], response_format = {
  85. "type": "text"
  86. }) {
  87. return await new Promise((resolve) => {
  88. let uid = uuidv4();
  89. let data = JSON.stringify({
  90. model: 'gpt-4o-2024-11-20',
  91. temperature: 0,
  92. max_tokens: 4096,
  93. top_p: 1,
  94. frequency_penalty: 0,
  95. presence_penalty: 0,
  96. messages: prompt,
  97. uid: uid,
  98. mind_map_question: '',
  99. stream: false,
  100. response_format: response_format
  101. });
  102. let config = {
  103. method: 'post',
  104. url: this.new_url + '/api/common/chat',
  105. headers: {
  106. 'Content-Type': 'application/json'
  107. },
  108. data: data,
  109. };
  110. this.ajax.post(config.url,data)
  111. .then((response) => {
  112. resolve(response.data.FunctionResponse.choices[0].message.content);
  113. })
  114. .catch( (error)=> {
  115. console.log(error);
  116. //this.$message.error('服务器繁忙');
  117. resolve(false);
  118. });
  119. });
  120. },
  121. async ai_generate_image(prompt) {
  122. return await new Promise((resolve) => {
  123. this.ajax
  124. .post(this.new_url + "/api/agents/generateImage", {
  125. prompt,
  126. size: "1024x1024"
  127. }).then(res => {
  128. resolve(res.data);
  129. }).catch(function (error) {
  130. console.log(error);
  131. resolve(false);
  132. });
  133. })
  134. },
  135. async getAgentModel(agentId) {
  136. if (this.model[agentId]) {
  137. return this.model[agentId]
  138. }
  139. const res = await this.ajax.get('https://appapi.cocorobo.cn/api/agents/agent/' + agentId)
  140. this.model[agentId] = res
  141. return this.model[agentId]
  142. },
  143. getTtsLanguage(language) {
  144. if (language === 'com') {
  145. return 'en-US'
  146. } else if (language === 'hk') {
  147. return 'zh-HK'
  148. } else {
  149. return 'zh-CN'
  150. }
  151. },
  152. chat_stream(msg, agentId, userId, language, onMessage, session_name, file_ids, modelName) {
  153. const self = this
  154. return new Promise(function(resolve) {
  155. self.getAgentModel(agentId).then(function(agentData) {
  156. var params = {
  157. id: agentId,
  158. file_ids: file_ids || [],
  159. message: 'Language: ' + (language === 'com' ? 'English' : (language === 'hk' ? 'Traditional Chinese' : 'Chinese')) + ' ' + msg + ' ' + (language === 'hk' ? '請用繁體中文回复' : (language === 'com' ? 'Please reply in English' : '请用中文回复')),
  160. uid: uuidv4(),
  161. stream: true,
  162. model: modelName || (agentData && agentData.modelType) || 'open-doubao',
  163. userId: userId,
  164. tts_language: self.getTtsLanguage(language),
  165. session_name: session_name || uuidv4()
  166. }
  167. var ctrl = new AbortController()
  168. var content = ''
  169. fetchEventSource('https://appapi.cocorobo.cn/api/agentchats/ai_agent_chat', {
  170. method: 'POST',
  171. body: JSON.stringify(params),
  172. signal: ctrl.signal,
  173. headers: {
  174. 'Content-Type': 'application/json',
  175. },
  176. onmessage: function(event) {
  177. var data = JSON.parse(event.data)
  178. if (data.content) {
  179. if (data.content != '[DONE]') {
  180. content += data.content
  181. onMessage({
  182. type: 'message',
  183. data: content
  184. })
  185. } else {
  186. onMessage({
  187. type: 'messageEnd',
  188. data: content
  189. })
  190. }
  191. }
  192. },
  193. onclose: function() {
  194. onMessage({
  195. type: 'close',
  196. data: 'SSE Connection closed'
  197. })
  198. },
  199. onerror: function(err) {
  200. onMessage({
  201. type: 'error',
  202. data: err.message || 'Unknown error'
  203. })
  204. throw err
  205. },
  206. }).catch(function(err) {
  207. onMessage({
  208. type: 'error',
  209. data: err || 'Unknown error'
  210. })
  211. console.log('err', err)
  212. })
  213. resolve({
  214. abort: function() { ctrl.abort() }
  215. })
  216. })
  217. })
  218. }
  219. }
  220. };