UNPKG

spark-desk

Version:

使用WebSocket调用 讯飞星火认知大模型 的js库

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