spark-desk
Version:
使用WebSocket调用 讯飞星火认知大模型 的js库
2 lines (1 loc) • 7.27 kB
JavaScript
"use strict";var e,t=require("crypto-js"),s=require("ws"),o=require("axios");exports.Version=void 0,(e=exports.Version||(exports.Version={})).Ultra="Ultra",e.Max32k="Max32k",e.Max="Max",e.Pro128k="Pro128k",e.Pro="Pro",e.Lite="Lite";const r={[exports.Version.Ultra]:"4.0Ultra",[exports.Version.Max32k]:"max-32k",[exports.Version.Max]:"generalv3.5",[exports.Version.Pro128k]:"pro-128k",[exports.Version.Pro]:"generalv3",[exports.Version.Lite]:"lite"};class n{constructor(e,t=.5,s=2048,o=4,r){this.domain=e,this.temperature=t,this.max_tokens=s,this.top_k=o,this.chat_id=r}static createFromVersion(e){if(e in r)return new n(r[e]);throw new Error("不存在的版本.")}toValue(){return{chat:{domain:this.domain,temperature:this.temperature,max_tokens:this.max_tokens,top_k:this.top_k,chat_id:this.chat_id}}}}var i,a;function p(e,t,s,o){return new(s||(s=Promise))((function(r,n){function i(e){try{p(o.next(e))}catch(e){n(e)}}function a(e){try{p(o.throw(e))}catch(e){n(e)}}function p(e){var t;e.done?r(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(i,a)}p((o=o.apply(e,t||[])).next())}))}exports.Role=void 0,(i=exports.Role||(exports.Role={})).Assistant="assistant",i.User="user",i.System="system","function"==typeof SuppressedError&&SuppressedError;class h{constructor(e=8192){this.tokenLength=e,this.history=[]}setTokenLength(e){this.tokenLength=e}static generateUid(){return Math.random().toString(36).substring(2,16)}getHistory(e=this.tokenLength){const t=[];for(let s of this.history){if(!(0+this.getMessageLength(s)<=e))return t;t.push(s)}return t}}class c extends h{setSystemContent(e){this.history.push({role:exports.Role.System,content:e})}getMessageLength(e){return e.content.length}constructor(e,t=h.generateUid(),s=8192){super(s),this.spark=e,this.uid=t,this.history=[]}speak(e,t=n.createFromVersion(this.spark.version),s){var o,r,i;return p(this,void 0,void 0,(function*(){if(e.length<=0)throw new Error("内容不可以为空.");const n=yield this.spark.request({header:{app_id:this.spark.APPID,uid:this.uid},parameter:t.toValue(),payload:{message:{text:[...this.getHistory(),{role:exports.Role.User,content:e}]}}},6e4,s);return this.history.push({role:exports.Role.User,content:e}),this.history.push({role:exports.Role.Assistant,content:n.getAllContent()}),{content:n.getAllContent(),promptTokens:null!==(o=n.getPromptTokens())&&void 0!==o?o:-1,completionTokens:null!==(r=n.getCompletionTokens())&&void 0!==r?r:-1,totalTokens:null!==(i=n.getTotalTokens())&&void 0!==i?i:-1,sid:n.getSid()}}))}}!function(e){e[e.Browser=0]="Browser",e[e.Node=1]="Node"}(a||(a={}));class l{constructor(e){this.url=e,this.environment=l.getEnvironment(),this.environment===a.Browser?this.webSocket=new WebSocket(e):this.webSocket=new s(e)}static getEnvironment(){return"undefined"!=typeof window?a.Browser:a.Node}addEventListener(e,t,o){(this.environment===a.Browser&&this.webSocket instanceof WebSocket||this.webSocket instanceof s)&&this.webSocket.addEventListener(e,t,o)}removeEventListener(e,t,o){(this.environment===a.Browser&&this.webSocket instanceof WebSocket||this.webSocket instanceof s)&&this.webSocket.removeEventListener(e,t,o)}close(){this.webSocket.close()}send(e){this.webSocket.send(e)}}class u{constructor(e){this.websocketResponses=e}getAllContent(){return this.hasError(),this.websocketResponses.map((e=>e.payload.choices.text.map((e=>e.content)).join(""))).join("")}getPromptTokens(){var e,t;return this.hasError(),null===(t=null===(e=this.websocketResponses.at(-1))||void 0===e?void 0:e.payload.usage)||void 0===t?void 0:t.text.prompt_tokens}getCompletionTokens(){var e,t;return this.hasError(),null===(t=null===(e=this.websocketResponses.at(-1))||void 0===e?void 0:e.payload.usage)||void 0===t?void 0:t.text.completion_tokens}getTotalTokens(){var e,t;return this.hasError(),null===(t=null===(e=this.websocketResponses.at(-1))||void 0===e?void 0:e.payload.usage)||void 0===t?void 0:t.text.total_tokens}hasError(){this.websocketResponses.forEach((e=>{if(0!==e.header.code)throw new Error(JSON.stringify(e))}))}getSid(){const[e=null]=this.websocketResponses;if(null===e)throw new Error("没有相应任何内容");return e.header.sid}}const d={[exports.Version.Ultra]:"wss://spark-api.xf-yun.com/v4.0/chat",[exports.Version.Max32k]:"wss://spark-api.xf-yun.com/chat/max-32k",[exports.Version.Max]:"wss://spark-api.xf-yun.com/v3.5/chat",[exports.Version.Pro128k]:" wss://spark-api.xf-yun.com/chat/pro-128k",[exports.Version.Pro]:"wss://spark-api.xf-yun.com/v3.1/chat",[exports.Version.Lite]:"wss://spark-api.xf-yun.com/v1.1/chat"};class k{}const x={[exports.Version.Ultra]:"4.0Ultra",[exports.Version.Max32k]:"max-32k",[exports.Version.Max]:"generalv3.5",[exports.Version.Pro128k]:"pro-128k",[exports.Version.Pro]:"generalv3",[exports.Version.Lite]:"lite"};class v extends h{getMessageLength(e){return e.content.length}setSystemContent(e){this.history.push({role:exports.Role.System,content:e})}constructor(e,t=h.generateUid(),s=8192){super(s),this.spark=e,this.uid=t}speak(e){return p(this,void 0,void 0,(function*(){const t=yield this.spark.request({model:x[this.spark.version],messages:[...this.getHistory(),{role:exports.Role.User,content:e}]}),s=t.data.choices[0].message.content;return this.history.push({role:exports.Role.User,content:e}),this.history.push({role:exports.Role.Assistant,content:s}),{content:s,promptTokens:t.data.usage.prompt_tokens,completionTokens:t.data.usage.completion_tokens,totalTokens:t.data.usage.total_tokens,sid:t.data.sid}}))}}class g extends k{constructor(e){super(),this.option=e}get version(){return this.option.version}createUser(e,t){return new v(this,e,t)}request(e){return p(this,void 0,void 0,(function*(){return o.post(this.getUrl(),e,{headers:{"Content-Type":"application/json",Authorization:`Bearer ${this.option.APIPassword}`}})}))}getUrl(){var e;return null!==(e=this.option.url)&&void 0!==e?e:g.DefaultUrl}}g.DefaultUrl="https://spark-api-open.xf-yun.com/v1/chat/completions",exports.AbstractSparkDesk=k,exports.HttpSparkDesk=g,exports.Parameter=n,exports.WebsocketResponseImpl=u,exports.WebsocketSparkDesk=class extends k{get version(){return this.option.version}constructor(e){super(),this.option=e}get APPID(){return this.option.APPID}getWebsocketUrl(){const e=this.option.APIKey,s=this.option.APISecret,o=this.getUrl();this.option.noEncryption&&(o.protocol="ws");const r=o.host,n=(new Date).toUTCString(),i=`host: ${r}\ndate: ${n}\nGET ${o.pathname} HTTP/1.1`,a=t.HmacSHA256(i,s),p=t.enc.Base64.stringify(a);return`${o}?authorization=${btoa(`api_key="${e}", algorithm="hmac-sha256", headers="host date request-line", signature="${p}"`)}&date=${n}&host=${r}`}getUrl(){if(this.option.version in d)return new URL(d[this.option.version]);throw new Error("不存在的版本.")}request(e,t=6e4,s){return p(this,void 0,void 0,(function*(){return new Promise(((o,r)=>{const n=setTimeout((()=>{r(new Error("请求超时")),i&&i.close()}),t),i=new l(this.getWebsocketUrl()),a=[];i.addEventListener("open",(()=>{i.send(JSON.stringify(e))})),i.addEventListener("message",(e=>{s&&s(e);const t=JSON.parse(e.data.toString());a.push(t)})),i.addEventListener("close",(()=>{clearTimeout(n),o(new u(a))})),i.addEventListener("error",r)}))}))}createUser(e,t){return new c(this,e,t)}},exports.WebsocketUser=c;