ctod 1.0.1 → 1.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README_ZH.md +1 -1
- package/dist/index.js +13 -12
- package/dist/index.js.map +3 -3
- package/examples/google.ts +1 -1
- package/examples/openai.ts +1 -1
- package/examples/plugin.ts +1 -1
- package/lib/broker/chat.ts +62 -5
- package/lib/service/openai/chat.ts +2 -21
- package/lib/service/openai/vision.ts +3 -3
- package/package.json +1 -1
- package/types/lib/broker/chat.d.ts +12 -0
- package/types/lib/service/openai/chat.d.ts +0 -6
- package/types/lib/service/openai/vision.d.ts +1 -1
package/README_ZH.md
CHANGED
|
@@ -26,7 +26,7 @@
|
|
|
26
26
|
|
|
27
27
|
在對話過程中,CtoD 採用 [zod](https://zod.dev/basics) 來驗證請求與回復資料是否符合預期,以確保一致性,只要保持這個互動模式,就可以利用在 API 串接或是自動化系統上。
|
|
28
28
|
|
|
29
|
-
我們還附帶支援 `OpenAI`, `Google`, `X`, `anthropic`, `llama.cpp` 等主流 LLM
|
|
29
|
+
我們還附帶支援 `OpenAI`, `Google`, `X`, `anthropic`, `llama.cpp` 等主流 LLM 雲端或本地服務。
|
|
30
30
|
|
|
31
31
|
## 安裝
|
|
32
32
|
|
package/dist/index.js
CHANGED
|
@@ -1,20 +1,21 @@
|
|
|
1
|
-
var
|
|
1
|
+
var ie=Object.defineProperty;var Ce=(a,e,t)=>e in a?ie(a,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):a[e]=t;var D=(a,e)=>{for(var t in e)ie(a,t,{get:e[t],enumerable:!0})};var o=(a,e,t)=>Ce(a,typeof e!="symbol"?e+"":e,t);var ge={};D(ge,{LimiterPlugin:()=>ve,LimiterPluginGlobState:()=>Pe,PrintLogPlugin:()=>Se,RetryPlugin:()=>we,RolePlugin:()=>Ae});import{Event as xe}from"power-helper";var y=class{constructor(e){o(this,"_event",new xe);o(this,"_params");this._params=e}use(e){return{instance:this,params:e,send:t=>{this._event.emit("receive",t)},receive:t=>{this._event.on("receive",t)},__receiveData:null}}};var le=new y({name:"retry",params:a=>({retry:a.number().default(1),printWarn:a.boolean().default(!0)}),receiveData:()=>({}),onInstall({log:a,attach:e,params:t}){e("parseFailed",async({count:n,retry:r,messages:s,changeMessages:i})=>{n<=t.retry&&(t.printWarn&&a.print(`Is Failed, Retry ${n} times.`),i(s),r())})}});var ce=new y({name:"print-log",params:a=>({detail:a.boolean().default(!1)}),receiveData:()=>({}),onInstall({params:a,log:e,attach:t}){t("talkBefore",async({lastUserMessage:n,messages:r})=>{e.print("Send:",{color:"green"}),a.detail?e.print(`
|
|
2
2
|
`+JSON.stringify(r,null,4)):e.print(`
|
|
3
3
|
`+n)}),t("talkAfter",async({parseText:n})=>{e.print("Receive:",{color:"cyan"}),e.print(`
|
|
4
4
|
`+n)}),t("succeeded",async({output:n})=>{e.print("Output:",{color:"yellow"});try{e.print(`
|
|
5
5
|
`+JSON.stringify(n,null,4))}catch{e.print(`
|
|
6
|
-
`+n)}})}});import{Event as
|
|
6
|
+
`+n)}})}});import{Event as ke,flow as be,Schedule as Te}from"power-helper";var F={limit:3,interval:6e4},m={event:new ke,schedule:null,waitTimes:[],waitQueue:[]},H={event:m.event,config:F,closeSchedule:()=>{m.schedule&&(m.schedule.close(),m.schedule=null)},plugin:new y({name:"limiter",params:()=>({}),receiveData:()=>({}),onInstall({attach:a}){m.schedule==null&&(m.schedule=new Te,m.schedule.add("calc queue",1e3,async()=>{let e=Date.now();if(m.waitTimes=m.waitTimes.filter(t=>e-t<F.interval),m.waitTimes.length!==F.limit){let t=m.waitQueue.shift();t&&(m.waitTimes.push(Date.now()),m.event.emit("run",{id:t}))}else m.waitTimes[0]&&m.event.emit("waitTimeChange",{waitTime:Math.floor(60-(e-m.waitTimes[0])/1e3)})}),m.schedule.play()),a("talkBefore",async()=>{let e=be.createUuid();return m.waitQueue.push(e),new Promise(t=>{m.event.on("run",({id:n},{off:r})=>{n===e&&(r(),t())})})})}})};var pe=new y({name:"role",params:a=>({role:a.string()}),receiveData:()=>({}),onInstall({attach:a,params:e}){a("start",async({messages:t,changeMessages:n})=>{n([{role:"user",content:`\u4F60\u73FE\u5728\u662F${e.role}\u3002`},{role:"assistant",content:`\u6C92\u554F\u984C\uFF0C\u6211\u73FE\u5728\u662F${e.role}\uFF0C\u6709\u4EC0\u9EBC\u53EF\u4EE5\u5E6B\u4F60\u7684\u55CE\uFF1F`},...t])})}});var Se=ce,we=le,ve=H.plugin,Pe=H,Ae=pe;var ue={};D(ue,{requireJsonResponse:()=>me,requireJsonResponseWithHandlebars:()=>Me,requireJsonResponseWithJsonSchema:()=>Re});import _e from"handlebars";import{record as Oe}from"power-helper";var me=(a,e)=>[...Array.isArray(a)?a:[a],"Please respond using the following JSON format and minify the JSON without including any explanation: ","{",Object.entries(e).map(([t,n])=>[`/* ${n.desc} */`,`"${t}": ${JSON.stringify(n.example)}`].join(`
|
|
7
7
|
`)).join(`,
|
|
8
8
|
`),"}"].join(`
|
|
9
|
-
`),
|
|
10
|
-
`);var
|
|
11
|
-
`):r}}getValidate(){return{input:this.params.input,output:this.params.output}}changeOutputSchema(e){this.params.output=e}async parse(e){let t,n="",r=[];for(let s of this.params.parsers)try{t=await s.read(e),n=s.name}catch(i){t=void 0,r.push({name:s.name,error:i})}try{return{output:X(t,this.params.output),parserName:n,parserFails:r}}catch(s){throw new P(s,r)}}};var R=class{constructor(e){
|
|
12
|
-
`):k.content}))},changeMessages:
|
|
13
|
-
`):
|
|
14
|
-
`);
|
|
15
|
-
`)
|
|
9
|
+
`),Me=(a,e,t)=>{let n=_e.create();return n.registerHelper("DATA",function(r){return JSON.stringify(r)}),n.registerHelper("ENV",function(r){return this.__envs&&r?this.__envs[r]:""}),n.registerHelper("INPUT",function(){return JSON.stringify(Oe.omit(this,["__envs"]))}),n.registerHelper("JOIN",function(r){return Array.isArray(r)?r.join():JSON.stringify(r)}),n.compile(me(e,t))(a)},Re=(a,e)=>[...Array.isArray(a)?a:[a],"Please provide JSON data according to the following JSON Schema format:",JSON.stringify(e)].join(`
|
|
10
|
+
`);var he={};D(he,{s2t:()=>w,t2s:()=>S});import{Converter as de}from"opencc-js";var S=a=>de({from:"tw",to:"cn"})(a),w=a=>de({from:"cn",to:"tw"})(a);import je from"json5";var O=class a{constructor(e){o(this,"params");this.params=e}static JsonMessage(){return new a({name:"JsonMessage",handler:async e=>{try{return JSON.parse(e)}catch{let n=/{(?:[^{}]|(?:{[^{}]*}))*}/,r=e.match(n)?.[0]||"";return je.parse(r)}}})}get name(){return this.params.name}async read(e){return await this.params.handler(e)}};import{Event as Ee,flow as Z,Hook as Ge,Log as Je}from"power-helper";import{z as L,toJSONSchema as Ie}from"zod";function X(a,e){return L.object(e(L)).parse(a||{})}function h(a){let e=Ie(L.object(a()));return delete e.$schema,e}var P=class{constructor(e,t){o(this,"isParserError",!0);o(this,"parserFails",[]);o(this,"error");this.error=e,this.parserFails=t}};var M=class{constructor(e){o(this,"params");this.params=e}get __schemeType(){return null}get __outputType(){return null}async compile(e,t){let n=this.params.input?X(e,this.params.input):e,r=this.params.question?await this.params.question(n,t):"";return{scheme:n,prompt:Array.isArray(r)?r.join(`
|
|
11
|
+
`):r}}getValidate(){return{input:this.params.input,output:this.params.output}}changeOutputSchema(e){this.params.output=e}async parse(e){let t,n="",r=[];for(let s of this.params.parsers)try{t=await s.read(e),n=s.name}catch(i){t=void 0,r.push({name:s.name,error:i})}try{return{output:X(t,this.params.output),parserName:n,parserFails:r}}catch(s){throw new P(s,r)}}};import{z as fe}from"zod";var R=class{constructor(e){o(this,"__hookType");o(this,"log");o(this,"hook",new Ge);o(this,"params");o(this,"plugins",{});o(this,"installed",!1);o(this,"translator");o(this,"event",new Ee);this.log=new Je(e.name??"no name"),this.params=e,this.translator=new M({...e,parsers:[O.JsonMessage()]})}_install(){if(this.installed===!1){this.installed=!0;let e={log:this.log,attach:this.hook.attach.bind(this.hook),attachAfter:this.hook.attachAfter.bind(this.hook),translator:this.translator};if(this.params.plugins){this.plugins=typeof this.params.plugins=="function"?this.params.plugins():this.params.plugins;for(let t in this.plugins)this.plugins[t].instance._params.onInstall({...e,params:this.plugins[t].params,receive:this.plugins[t].receive})}this.params.install?.(e)}}async cancel(e){e?this.event.emit("cancel",{requestId:e}):this.event.emit("cancelAll",{})}requestWithId(e){this._install();let t=Z.createUuid(),n=null,r=!1,s=!1,i=new AbortController,l=[this.event.on("cancel",({requestId:d})=>{d===t&&p()}),this.event.on("cancelAll",()=>{p()})],c=()=>l.forEach(d=>d.off()),p=()=>{r===!1&&(s&&n&&n(),i.abort(),r=!0,c())},g=d=>{n=()=>{d()}},u=async()=>{let d=this.translator.getValidate(),v=null,se={},x=new Map,ae=await this.translator.compile(e,{schema:d}),oe=[],C=[];ae.prompt&&C.push({role:"user",content:ae.prompt});for(let f in this.plugins)se[f]={send:k=>this.plugins[f].send({id:t,data:k})};return await this.hook.notify("start",{id:t,data:e,schema:d,plugins:se,messages:C,metadata:x,setPreMessages:f=>{oe=f.map(k=>({...k,content:Array.isArray(k.content)?k.content.join(`
|
|
12
|
+
`):k.content}))},changeMessages:f=>{C=f},changeOutputSchema:f=>{this.translator.changeOutputSchema(f),d=this.translator.getValidate()}}),C=[...oe,...C],await Z.asyncWhile(async({count:f,doBreak:k})=>{if(f>=99)return k();let j="",I="",U=!1,W=C.filter(b=>b.role==="user").slice(-1)[0]?.content||"";try{await this.hook.notify("talkBefore",{id:t,data:e,messages:C,metadata:x,lastUserMessage:W});let b=this.params.request(C,{id:t,count:f,schema:d,onCancel:g,metadata:x,abortController:i,isRetry:U});if(r)n&&n(),i.abort();else try{s=!0,j=await b,I=j}finally{s=!1}r===!1&&(await this.hook.notify("talkAfter",{id:t,data:e,response:j,messages:C,parseText:I,metadata:x,lastUserMessage:W,parseFail:_=>{throw new P(_,[])},changeParseText:_=>{I=_}}),v=(await this.translator.parse(I)).output,await this.hook.notify("succeeded",{id:t,output:v,metadata:x})),await this.hook.notify("done",{id:t,metadata:x}),k()}catch(b){if(b instanceof P){if(await this.hook.notify("parseFailed",{id:t,error:b.error,count:f,response:j,messages:C,metadata:x,lastUserMessage:W,parserFails:b.parserFails,retry:()=>{U=!0},changeMessages:_=>{C=_}}),U===!1)throw await this.hook.notify("done",{id:t,metadata:x}),b}else throw await this.hook.notify("done",{id:t,metadata:x}),b}}),v};return{id:t,request:(async()=>{try{return await u()}finally{c()}})()}}async request(e){let{request:t}=this.requestWithId(e);return await t}async getPreRequestInfo(e){this._install();let t=Z.createUuid(),n=this.translator.getValidate(),r={},s=new Map,i=await this.translator.compile(e,{schema:n}),l=[],c=[];return i.prompt&&c.push({role:"user",content:i.prompt}),await this.hook.notify("start",{id:t,data:e,schema:n,plugins:r,messages:c,metadata:s,setPreMessages:g=>{l=g.map(u=>({...u,content:Array.isArray(u.content)?u.content.join(`
|
|
13
|
+
`):u.content}))},changeMessages:g=>{c=g},changeOutputSchema:g=>{this.translator.changeOutputSchema(g),n=this.translator.getValidate()}}),{outputSchema:n.output(fe),outputJsonSchema:h(()=>n.output(fe)),requestMessages:[...l,...c]}}};import*as Ve from"zod";var Q=class{constructor(e){o(this,"params");this.params=e}createBrokerBuilder(e){return{create:t=>new R({output:()=>({}),install:n=>{e?.install?.(n),n.attach("start",async({id:r,plugins:s,data:i,metadata:l,changeMessages:c,changeOutputSchema:p})=>{let g=await t({id:r,data:i,plugins:s,zod:Ve,setMessages:u=>{c(u.map(T=>({role:T.role,content:Array.isArray(T.content)?T.content.join(`
|
|
14
|
+
`):T.content})))},metadata:l});p(()=>g)})},plugins:this.params.plugins?()=>this.params.plugins():void 0,request:this.params.request})}}};import qe from"axios";var E=class{constructor(e){o(this,"openai");o(this,"config",{model:"gpt-5",maxTokens:void 0,temperature:.7});this.openai=e}setConfig(e){Object.assign(this.config,e)}async view(e){let t=await this.openai._axios.post(`${this.openai._baseUrl}/v1/chat/completions`,{model:this.config.model,n:1,messages:e,max_tokens:this.config.maxTokens,temperature:this.config.temperature},{headers:{"Content-Type":"application/json",Authorization:`Bearer ${this.openai._apiKey}`}}),r=(t.data.choices||[])[0]?.message||{role:"assistant",content:""};return{id:t?.data.id,text:r.content,apiResponse:t.data}}};import{json as Be}from"power-helper";var G=class{constructor(e){o(this,"openai");o(this,"config",{n:1,model:"gpt-4o",temperature:1,maxTokens:void 0});this.openai=e}setConfig(e){Object.assign(this.config,e)}async moderations(e){let t=await this.openai._axios.post(`${this.openai._baseUrl}/v1/moderations`,{input:e},{headers:{"Content-Type":"application/json",Authorization:`Bearer ${this.openai._apiKey}`}});return{isSafe:t.data.results?.[0]?.flagged===!1,result:t.data}}async talk(e=[],t){let n=Be.jpjs(e),r;t?.jsonSchema&&(r={type:"json_schema",json_schema:t.jsonSchema});let s=await this.openai._axios.post(`${this.openai._baseUrl}/v1/chat/completions`,{model:this.config.model,n:this.config.n,messages:n,response_format:r,temperature:this.config.temperature},{signal:t?.abortController?.signal,headers:{"Content-Type":"application/json",Authorization:`Bearer ${this.openai._apiKey}`}}),i=s.data.choices||[],l=i[0]?.message||{role:"assistant",content:""};return n.push(l),{id:s?.data.id,text:l.content,newMessages:n,isDone:i[0]?.finish_reason==="stop",apiResponse:s.data}}talkStream(e){let t=new AbortController;return fetch(`${this.openai._baseUrl}/v1/chat/completions`,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${this.openai._apiKey}`},body:JSON.stringify({model:this.config.model,stream:!0,messages:e.messages}),signal:t.signal}).then(async n=>{let r=n.body?.pipeThrough(new TextDecoderStream).getReader();if(!r)throw new Error("Can not get reader");for(;;){let{value:s,done:i}=await r.read();if(i)break;let l=s.split(`
|
|
15
|
+
`);for(let c of l)if(c.length!==0&&!c.startsWith(":")){if(c==="data: [DONE]"){e.onEnd();break}try{let g=JSON.parse(c.substring(6)).choices[0].delta.content;e.onMessage(g)}catch(p){e.onWarn(p)}}}}).catch(n=>{n.name==="AbortError"?e.onEnd():e.onError(n)}),{cancel:()=>t.abort()}}async keepTalk(e,t=[]){let n=await this.talk([...t,{role:"user",content:Array.isArray(e)?e.join(`
|
|
16
|
+
`):e}]);return{result:n,nextTalk:r=>this.keepTalk(r,n.newMessages)}}};var J=class{constructor(e){o(this,"openai");o(this,"config",{model:"dall-e-2",size:"1024x1024"});this.openai=e}setConfig(e){Object.assign(this.config,e)}async create(e){return(await this.openai._axios.post(`${this.openai._baseUrl}/v1/images/generations`,{prompt:e,n:1,size:this.config.size,model:this.config.model,response_format:"b64_json"},{timeout:3e5,headers:{"Content-Type":"application/json",Authorization:`Bearer ${this.openai._apiKey}`}})).data}};var Y=class a{constructor(e=""){o(this,"_axios",qe.create());o(this,"_apiKey","");o(this,"_baseUrl","https://api.openai.com");this._apiKey=e}static createChatRequest(e,t={},n){return async(r,{abortController:s})=>{let i=new a(typeof e=="string"?e:await e()),l=i.createChat();n&&(n.axios&&i.setAxios(n.axios),n.baseUrl&&i.setBaseUrl(n.baseUrl)),l.setConfig(typeof t=="function"?await t():t);let{text:c}=await l.talk(r,{abortController:s});return c}}static createChatRequestWithJsonSchema(e){return async(t,{schema:n,onCancel:r})=>{let s=new a(typeof e.apiKey=="string"?e.apiKey:await e.apiKey()),i=s.createChat(),l=new AbortController;e.config&&i.setConfig(typeof e.config=="function"?await e.config():e.config),e.axios&&s.setAxios(e.axios),r(()=>l.abort());let c=h(n.output),{text:p}=await i.talk(t,{abortController:l,jsonSchema:{name:"data",strict:!0,schema:c}});return p}}setAxios(e){this._axios=e}setBaseUrl(e){this._baseUrl=e}setConfiguration(e){this._apiKey=e}createChat(){return new G(this)}createVision(){return new E(this)}createImagesGeneration(){return new J(this)}};import $e from"axios";import{flow as Ke,Once as Ne}from"power-helper";import{Template as ye}from"@huggingface/jinja";var A=class{constructor(e){o(this,"core");o(this,"streamAbortControllers",[]);this.core=e}createAbortController(){let e=new AbortController,t=Ke.createUuid();return this.streamAbortControllers.push({id:t,controller:e}),{signal:e.signal,controllerId:t}}removeAbortController(e){this.streamAbortControllers=this.streamAbortControllers.filter(t=>t.id!==e)}async stream(e){let{signal:t,controllerId:n}=this.createAbortController(),r=()=>{this.removeAbortController(n),e.onEnd()},s=async i=>{if(i.body){let l=i.body.getReader(),c=!1,p="";for(;!c;){let{value:g,done:u}=await l.read();if(g){p+=new TextDecoder("utf-8").decode(g);let T=p.split(`
|
|
16
17
|
|
|
17
|
-
`);p=T.pop()||"",T.forEach(u=>{if(u.includes("[DONE]")&&(l=!0),u.startsWith("data:"))try{let v=JSON.parse(u.replace("data: ",""));e.onMessage(v)}catch(v){e.onWarn(v)}})}C&&(l=!0)}r()}else e.onError(new Error("Body not found."))};fetch(`${this.core.config.baseUrl}/${e.path}`,{method:"POST",body:JSON.stringify(typeof e.data=="function"?await e.data():e.data),signal:t,headers:{"Content-Type":"application/json",...this.core.config.headers}}).then(s).catch(i=>{i instanceof Error&&i.message.includes("The user aborted a request")?r():e.onError(i)})}async fetch(e){let{signal:t,controllerId:n}=this.createAbortController();try{return{data:(await this.core.core._axios.post(`${this.core.config.baseUrl}/${e.path}`,e.data,{signal:t,headers:{"Content-Type":"application/json",...this.core.config.headers}})).data}}finally{this.removeAbortController(n)}}cancel(){this.streamAbortControllers.forEach(e=>e.controller.abort()),this.streamAbortControllers=[]}export(){return{cancel:this.cancel.bind(this)}}},B=class{constructor(e){a(this,"getProp",new qe({handler:async()=>{let e=`${this.config.baseUrl}/props`,{data:t}=await this.core._axios.get(e,{});return t}}));a(this,"core");a(this,"config",{baseUrl:"",headers:{},autoConvertTraditionalChinese:!0});this.core=e}setConfig(e){this.config={...this.config,...e}}completion(e){let t=e.messages.at(-1)||"",n=new A(this);return{...n.export(),run:async()=>{let r=await this.getProp.run(),i=new fe(r.chat_template).render({bos_token:r.bos_token,messages:e.messages}).slice(0,r.eos_token.length*-1-1),c=await n.fetch({path:"completion",data:{...e.options||{},prompt:this.config.autoConvertTraditionalChinese?w(i):i}}),l=this.config.autoConvertTraditionalChinese?S(c.data.content):c.data.content;return{message:l,fullMessage:`${t}${l}`}}}}completionStream(e){let t=new A(this);return t.stream({path:"completion",onEnd:e.onEnd||(()=>null),onMessage:n=>{let r=this.config.autoConvertTraditionalChinese?S(n.content):n.content;e.onMessage(r)},onWarn:e.onWarn||(()=>null),onError:e.onError||(()=>null),data:async()=>{let n=await this.getProp.run(),s=new fe(n.chat_template).render({bos_token:n.bos_token,messages:e.messages}).slice(0,n.eos_token.length*-1-1);return{...e.options||{},prompt:this.config.autoConvertTraditionalChinese?w(s):s,stream:!0}}}),t.export()}talk(e){let t=new A(this);return{...t.export(),run:async()=>{let r=(await t.fetch({path:"v1/chat/completions",data:{...e.options||{},response_format:e.response_format,messages:e.messages.map(s=>({role:s.role,content:this.config.autoConvertTraditionalChinese?w(s.content):s.content}))}})).data.choices[0].message.content||"";return{message:this.config.autoConvertTraditionalChinese?S(r):r}}}}talkStream(e){let t=new A(this);return t.stream({path:"v1/chat/completions",onEnd:e.onEnd||(()=>null),onMessage:n=>{let r=n.choices[0].delta.content;if(r){let s=this.config.autoConvertTraditionalChinese?S(r):r;e.onMessage(s)}},onWarn:e.onWarn||(()=>null),onError:e.onError||(()=>null),data:{...e.options||{},stream:!0,messages:e.messages.map(n=>({role:n.role,content:this.config.autoConvertTraditionalChinese?w(n.content):n.content}))}}),t.export()}};var Y=class o{constructor(){a(this,"_axios",Ne.create())}static createChatRequestWithJsonSchema(e){return async(t,{schema:n,onCancel:r})=>{let s=new o,i=s.createCompletion(),c=typeof e.config=="function"?await e.config():e.config;i.setConfig(c);let l=y(n.output);e.axios&&s.setAxios(e.axios),i.config.autoConvertTraditionalChinese&&(l=JSON.parse(w(JSON.stringify(l))));let{run:p,cancel:m}=i.talk({options:e.talkOptions,messages:t,response_format:{type:"json_object",schema:l}});r(m);let{message:C}=await p();return i.config.autoConvertTraditionalChinese?S(C):C}}setAxios(e){this._axios=e}createCompletion(){return new B(this)}};import{json as $e}from"power-helper";var V=class{constructor(e){a(this,"google");a(this,"config",{model:"gemini-2.0-flash",maxTokens:1024,temperature:.7});this.google=e}setConfig(e){Object.assign(this.config,e)}async talk(e=[]){let t=$e.jpjs(e),r=(await this.google.googleGenAI.models.generateContent({model:this.config.model,contents:t,config:{temperature:this.config.temperature,maxOutputTokens:this.config.maxTokens}})).text;return{text:r,newMessages:[...t,{role:"model",parts:[{text:r}]}]}}talkStream(e){let t={controller:new AbortController};return this.google.googleGenAI.models.generateContentStream({model:this.config.model,contents:e.messages,config:{abortSignal:t.controller.signal,temperature:this.config.temperature,maxOutputTokens:this.config.maxTokens}}).then(async r=>{try{for await(let s of r){let i=s.candidates?.[0].content?.parts?.[0].text||"";e.onMessage(i)}e.onEnd()}catch(s){if(t.controller.signal.aborted)e.onEnd();else throw s}}).catch(r=>{e.onError(r)}),{cancel:()=>{t.controller.abort()}}}};var K=class{constructor(e){a(this,"google");a(this,"config",{model:"imagen-4.0-generate-001",size:"1K",aspectRatio:"1:1"});this.google=e}setConfig(e){Object.assign(this.config,e)}async create(e){return{images:(await this.google.googleGenAI.models.generateImages({model:this.config.model,prompt:e,config:{numberOfImages:1,aspectRatio:this.config.aspectRatio,imageSize:this.config.size}})).generatedImages?.map(n=>({url:n.image?.imageBytes||"",mimeType:n.image?.mimeType||""}))||[]}}};var ee=class o{constructor(e){a(this,"googleGenAI");this.googleGenAI=e}static chatGPTMessageToGoogleChatMessage(e){let t=n=>typeof n=="string"?[{text:n}]:Array.isArray(n)?n.map(({type:r,image_url:s,text:i})=>{if(r==="image_url"){let c=s?.url||"",l=c.includes("data:image/png")?"image/png":"image/jpeg";return{inlineData:{data:c.split("base64,")[1]||"",mimeType:l}}}else return{text:i||""}}):[];return e.map(n=>n.role==="user"||n.role==="system"?{role:"user",parts:t(n.content)}:{role:"model",parts:t(n.content)})}static createChatRequestWithJsonSchema(e){let t=e.googleGenAI,n=r=>(r.type==="object"?(delete r.additionalProperties,Object.keys(r.properties).forEach(s=>{n(r.properties[s])})):r.type==="array"&&n(r.items),r);return async(r,{schema:s,abortController:i})=>{let c=typeof e.config=="function"?await e.config():e.config;return(await t.models.generateContent({model:e.model,contents:o.chatGPTMessageToGoogleChatMessage(r),config:{abortSignal:i.signal,maxOutputTokens:c.maxTokens,temperature:c.temperature,responseMimeType:"application/json",responseJsonSchema:y(s.output)}})).text||""}}createChat(){return new V(this)}createImagesGeneration(){return new K(this)}};var q=class{constructor(e){a(this,"config");this.config=e}translateMessages(e){return{system:e.find(t=>t.role==="system")?.content,messages:e.filter(t=>t.role!=="system")}}createChatAndStructureBody(e,t){let n=this.config(),r=this.translateMessages(e);return{model:n.model,max_tokens:n.maxTokens,temperature:n.temperature,system:r.system,messages:r.messages,tools:[{name:"data",description:"Response Data",input_schema:t}],tool_choice:{type:"tool",name:"data"}}}parseChatAndStructureResult(e){let n=("content"in e?e.content.find(r=>r.type==="tool_use"):null)?.input||null;return n==null?"null":JSON.stringify(n)}createTalkBody(e){let t=this.config(),n=this.translateMessages(e);return{model:t.model,max_tokens:t.maxTokens,temperature:t.temperature,system:n.system,messages:n.messages}}parseTalkResult(e){let t="",n="content"in e?e.content.find(r=>r.type==="text"):null;return n&&(t=n.text),t}createTalkStreamBody(e){let t=this.config(),n=this.translateMessages(e);return{model:t.model,max_tokens:t.maxTokens,temperature:t.temperature,system:n.system,stream:!0,messages:n.messages}}},N=class{constructor(e){a(this,"anthropic");a(this,"dataGenerator",new q(()=>this.config));a(this,"config",{model:"claude-3-5-haiku-latest",maxTokens:8192,temperature:.7});this.anthropic=e}setConfig(e){Object.assign(this.config,e)}async chatAndStructure(e,t,n){let r=this.anthropic.anthropicSdk,s=this.dataGenerator.createChatAndStructureBody(e,t),i=await r.messages.create(s,{signal:n?.abortController?.signal});return this.dataGenerator.parseChatAndStructureResult(i)}async talk(e=[]){let t=this.anthropic.anthropicSdk,n=this.dataGenerator.createTalkBody(e),r=await t.messages.create(n);return this.dataGenerator.parseTalkResult(r)}talkStream(e){let t=null,n=this.anthropic.anthropicSdk,{onMessage:r,onEnd:s,onError:i}=e,c=this.dataGenerator.createTalkStreamBody(e.messages);return(async()=>{try{let p=await n.messages.create(c);if(p!=null&&"controller"in p){t=p;for await(let m of t)if(m.type==="content_block_delta"){let C="text"in m.delta?m.delta.text:"";r(C)}}s()}catch(p){i(p)}})(),{cancel:()=>{let p=setInterval(()=>{t&&t.controller&&(t.controller.abort(),clearInterval(p))},10)}}}};var te=class o{constructor(e){a(this,"anthropicSdk");this.anthropicSdk=e}static chatGPTMessageToAnthropicChatMessage(e){return e.map(n=>({role:n.role,content:typeof n.content=="string"?n.content:n.content.map(r=>{if(r.type==="image_url"){let s=r.image_url?.url||"";return{type:"image",source:{type:"base64",media_type:s.slice(5).split(";")[0],data:s.split(",")[1]}}}return{type:"text",text:r.text}})}))}static createChatRequestWithJsonSchema(e){let n=new o(e.anthropicSdk).createChat();return n.setConfig(e.config||{}),async(r,{schema:s,abortController:i})=>{let c=y(s.output);return await n.chatAndStructure(r,c,{abortController:i})}}createChat(){return new N(this)}};import We from"axios";import{json as ze}from"power-helper";var $=class{constructor(e){a(this,"xAi");a(this,"config",{n:1,model:"grok-3",temperature:1,maxTokens:void 0,forceJsonFormat:!0});this.xAi=e}setConfig(e){Object.assign(this.config,e)}async talk(e=[],t){let n=ze.jpjs(e),r;this.config.forceJsonFormat&&(r={type:"json_object"}),this.config.forceJsonFormat&&t?.jsonSchema&&(r={type:"json_schema",json_schema:t.jsonSchema});let s=await this.xAi._axios.post("https://api.x.ai/v1/chat/completions",{model:this.config.model,n:this.config.n,messages:n,response_format:r,temperature:this.config.temperature},{signal:t?.abortController?.signal,headers:{"Content-Type":"application/json",Authorization:`Bearer ${this.xAi._apiKey}`}}),i=s.data.choices||[],c=i[0]?.message||{role:"assistant",content:""};return n.push(c),{id:s?.data.id,text:c.content,newMessages:n,isDone:i[0]?.finish_reason==="stop",apiResponse:s.data}}talkStream(e){let t=new AbortController;return fetch("https://api.x.ai/v1/chat/completions",{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${this.xAi._apiKey}`},body:JSON.stringify({model:this.config.model,stream:!0,messages:e.messages}),signal:t.signal}).then(async n=>{if(!n.ok){let s=await n.text();throw new Error(`Error: ${s}`)}let r=n.body?.pipeThrough(new TextDecoderStream).getReader();if(!r)throw new Error("Can not get reader");for(;;){let{value:s,done:i}=await r.read();if(i)break;let c=s.split(`
|
|
18
|
-
`);for(let
|
|
19
|
-
`):e}]);return{result:n,nextTalk:r=>this.keepTalk(r,n.newMessages)}}};var z=class{constructor(e){
|
|
18
|
+
`);p=T.pop()||"",T.forEach(d=>{if(d.includes("[DONE]")&&(c=!0),d.startsWith("data:"))try{let v=JSON.parse(d.replace("data: ",""));e.onMessage(v)}catch(v){e.onWarn(v)}})}u&&(c=!0)}r()}else e.onError(new Error("Body not found."))};fetch(`${this.core.config.baseUrl}/${e.path}`,{method:"POST",body:JSON.stringify(typeof e.data=="function"?await e.data():e.data),signal:t,headers:{"Content-Type":"application/json",...this.core.config.headers}}).then(s).catch(i=>{i instanceof Error&&i.message.includes("The user aborted a request")?r():e.onError(i)})}async fetch(e){let{signal:t,controllerId:n}=this.createAbortController();try{return{data:(await this.core.core._axios.post(`${this.core.config.baseUrl}/${e.path}`,e.data,{signal:t,headers:{"Content-Type":"application/json",...this.core.config.headers}})).data}}finally{this.removeAbortController(n)}}cancel(){this.streamAbortControllers.forEach(e=>e.controller.abort()),this.streamAbortControllers=[]}export(){return{cancel:this.cancel.bind(this)}}},V=class{constructor(e){o(this,"getProp",new Ne({handler:async()=>{let e=`${this.config.baseUrl}/props`,{data:t}=await this.core._axios.get(e,{});return t}}));o(this,"core");o(this,"config",{baseUrl:"",headers:{},autoConvertTraditionalChinese:!0});this.core=e}setConfig(e){this.config={...this.config,...e}}completion(e){let t=e.messages.at(-1)||"",n=new A(this);return{...n.export(),run:async()=>{let r=await this.getProp.run(),i=new ye(r.chat_template).render({bos_token:r.bos_token,messages:e.messages}).slice(0,r.eos_token.length*-1-1),l=await n.fetch({path:"completion",data:{...e.options||{},prompt:this.config.autoConvertTraditionalChinese?S(i):i}}),c=this.config.autoConvertTraditionalChinese?w(l.data.content):l.data.content;return{message:c,fullMessage:`${t}${c}`}}}}completionStream(e){let t=new A(this);return t.stream({path:"completion",onEnd:e.onEnd||(()=>null),onMessage:n=>{let r=this.config.autoConvertTraditionalChinese?w(n.content):n.content;e.onMessage(r)},onWarn:e.onWarn||(()=>null),onError:e.onError||(()=>null),data:async()=>{let n=await this.getProp.run(),s=new ye(n.chat_template).render({bos_token:n.bos_token,messages:e.messages}).slice(0,n.eos_token.length*-1-1);return{...e.options||{},prompt:this.config.autoConvertTraditionalChinese?S(s):s,stream:!0}}}),t.export()}talk(e){let t=new A(this);return{...t.export(),run:async()=>{let r=(await t.fetch({path:"v1/chat/completions",data:{...e.options||{},response_format:e.response_format,messages:e.messages.map(s=>({role:s.role,content:this.config.autoConvertTraditionalChinese?S(s.content):s.content}))}})).data.choices[0].message.content||"";return{message:this.config.autoConvertTraditionalChinese?w(r):r}}}}talkStream(e){let t=new A(this);return t.stream({path:"v1/chat/completions",onEnd:e.onEnd||(()=>null),onMessage:n=>{let r=n.choices[0].delta.content;if(r){let s=this.config.autoConvertTraditionalChinese?w(r):r;e.onMessage(s)}},onWarn:e.onWarn||(()=>null),onError:e.onError||(()=>null),data:{...e.options||{},stream:!0,messages:e.messages.map(n=>({role:n.role,content:this.config.autoConvertTraditionalChinese?S(n.content):n.content}))}}),t.export()}};var ee=class a{constructor(){o(this,"_axios",$e.create())}static createChatRequestWithJsonSchema(e){return async(t,{schema:n,onCancel:r})=>{let s=new a,i=s.createCompletion(),l=typeof e.config=="function"?await e.config():e.config;i.setConfig(l);let c=h(n.output);e.axios&&s.setAxios(e.axios),i.config.autoConvertTraditionalChinese&&(c=JSON.parse(S(JSON.stringify(c))));let{run:p,cancel:g}=i.talk({options:e.talkOptions,messages:t,response_format:{type:"json_object",schema:c}});r(g);let{message:u}=await p();return i.config.autoConvertTraditionalChinese?w(u):u}}setAxios(e){this._axios=e}createCompletion(){return new V(this)}};import{json as ze}from"power-helper";var B=class{constructor(e){o(this,"google");o(this,"config",{model:"gemini-2.0-flash",maxTokens:1024,temperature:.7});this.google=e}setConfig(e){Object.assign(this.config,e)}async talk(e=[]){let t=ze.jpjs(e),r=(await this.google.googleGenAI.models.generateContent({model:this.config.model,contents:t,config:{temperature:this.config.temperature,maxOutputTokens:this.config.maxTokens}})).text;return{text:r,newMessages:[...t,{role:"model",parts:[{text:r}]}]}}talkStream(e){let t={controller:new AbortController};return this.google.googleGenAI.models.generateContentStream({model:this.config.model,contents:e.messages,config:{abortSignal:t.controller.signal,temperature:this.config.temperature,maxOutputTokens:this.config.maxTokens}}).then(async r=>{try{for await(let s of r){let i=s.candidates?.[0].content?.parts?.[0].text||"";e.onMessage(i)}e.onEnd()}catch(s){if(t.controller.signal.aborted)e.onEnd();else throw s}}).catch(r=>{e.onError(r)}),{cancel:()=>{t.controller.abort()}}}};var q=class{constructor(e){o(this,"google");o(this,"config",{model:"imagen-4.0-generate-001",size:"1K",aspectRatio:"1:1"});this.google=e}setConfig(e){Object.assign(this.config,e)}async create(e){return{images:(await this.google.googleGenAI.models.generateImages({model:this.config.model,prompt:e,config:{numberOfImages:1,aspectRatio:this.config.aspectRatio,imageSize:this.config.size}})).generatedImages?.map(n=>({url:n.image?.imageBytes||"",mimeType:n.image?.mimeType||""}))||[]}}};var te=class a{constructor(e){o(this,"googleGenAI");this.googleGenAI=e}static chatGPTMessageToGoogleChatMessage(e){let t=n=>typeof n=="string"?[{text:n}]:Array.isArray(n)?n.map(({type:r,image_url:s,text:i})=>{if(r==="image_url"){let l=s?.url||"",c=l.includes("data:image/png")?"image/png":"image/jpeg";return{inlineData:{data:l.split("base64,")[1]||"",mimeType:c}}}else return{text:i||""}}):[];return e.map(n=>n.role==="user"||n.role==="system"?{role:"user",parts:t(n.content)}:{role:"model",parts:t(n.content)})}static createChatRequestWithJsonSchema(e){let t=e.googleGenAI,n=r=>(r.type==="object"?(delete r.additionalProperties,Object.keys(r.properties).forEach(s=>{n(r.properties[s])})):r.type==="array"&&n(r.items),r);return async(r,{schema:s,abortController:i})=>{let l=typeof e.config=="function"?await e.config():e.config;return(await t.models.generateContent({model:e.model,contents:a.chatGPTMessageToGoogleChatMessage(r),config:{abortSignal:i.signal,maxOutputTokens:l.maxTokens,temperature:l.temperature,responseMimeType:"application/json",responseJsonSchema:h(s.output)}})).text||""}}createChat(){return new B(this)}createImagesGeneration(){return new q(this)}};var K=class{constructor(e){o(this,"config");this.config=e}translateMessages(e){return{system:e.find(t=>t.role==="system")?.content,messages:e.filter(t=>t.role!=="system")}}createChatAndStructureBody(e,t){let n=this.config(),r=this.translateMessages(e);return{model:n.model,max_tokens:n.maxTokens,temperature:n.temperature,system:r.system,messages:r.messages,tools:[{name:"data",description:"Response Data",input_schema:t}],tool_choice:{type:"tool",name:"data"}}}parseChatAndStructureResult(e){let n=("content"in e?e.content.find(r=>r.type==="tool_use"):null)?.input||null;return n==null?"null":JSON.stringify(n)}createTalkBody(e){let t=this.config(),n=this.translateMessages(e);return{model:t.model,max_tokens:t.maxTokens,temperature:t.temperature,system:n.system,messages:n.messages}}parseTalkResult(e){let t="",n="content"in e?e.content.find(r=>r.type==="text"):null;return n&&(t=n.text),t}createTalkStreamBody(e){let t=this.config(),n=this.translateMessages(e);return{model:t.model,max_tokens:t.maxTokens,temperature:t.temperature,system:n.system,stream:!0,messages:n.messages}}},N=class{constructor(e){o(this,"anthropic");o(this,"dataGenerator",new K(()=>this.config));o(this,"config",{model:"claude-3-5-haiku-latest",maxTokens:8192,temperature:.7});this.anthropic=e}setConfig(e){Object.assign(this.config,e)}async chatAndStructure(e,t,n){let r=this.anthropic.anthropicSdk,s=this.dataGenerator.createChatAndStructureBody(e,t),i=await r.messages.create(s,{signal:n?.abortController?.signal});return this.dataGenerator.parseChatAndStructureResult(i)}async talk(e=[]){let t=this.anthropic.anthropicSdk,n=this.dataGenerator.createTalkBody(e),r=await t.messages.create(n);return this.dataGenerator.parseTalkResult(r)}talkStream(e){let t=null,n=this.anthropic.anthropicSdk,{onMessage:r,onEnd:s,onError:i}=e,l=this.dataGenerator.createTalkStreamBody(e.messages);return(async()=>{try{let p=await n.messages.create(l);if(p!=null&&"controller"in p){t=p;for await(let g of t)if(g.type==="content_block_delta"){let u="text"in g.delta?g.delta.text:"";r(u)}}s()}catch(p){i(p)}})(),{cancel:()=>{let p=setInterval(()=>{t&&t.controller&&(t.controller.abort(),clearInterval(p))},10)}}}};var ne=class a{constructor(e){o(this,"anthropicSdk");this.anthropicSdk=e}static chatGPTMessageToAnthropicChatMessage(e){return e.map(n=>({role:n.role,content:typeof n.content=="string"?n.content:n.content.map(r=>{if(r.type==="image_url"){let s=r.image_url?.url||"";return{type:"image",source:{type:"base64",media_type:s.slice(5).split(";")[0],data:s.split(",")[1]}}}return{type:"text",text:r.text}})}))}static createChatRequestWithJsonSchema(e){let n=new a(e.anthropicSdk).createChat();return n.setConfig(e.config||{}),async(r,{schema:s,abortController:i})=>{let l=h(s.output);return await n.chatAndStructure(r,l,{abortController:i})}}createChat(){return new N(this)}};import We from"axios";import{json as Ue}from"power-helper";var $=class{constructor(e){o(this,"xAi");o(this,"config",{n:1,model:"grok-3",temperature:1,maxTokens:void 0,forceJsonFormat:!0});this.xAi=e}setConfig(e){Object.assign(this.config,e)}async talk(e=[],t){let n=Ue.jpjs(e),r;this.config.forceJsonFormat&&(r={type:"json_object"}),this.config.forceJsonFormat&&t?.jsonSchema&&(r={type:"json_schema",json_schema:t.jsonSchema});let s=await this.xAi._axios.post("https://api.x.ai/v1/chat/completions",{model:this.config.model,n:this.config.n,messages:n,response_format:r,temperature:this.config.temperature},{signal:t?.abortController?.signal,headers:{"Content-Type":"application/json",Authorization:`Bearer ${this.xAi._apiKey}`}}),i=s.data.choices||[],l=i[0]?.message||{role:"assistant",content:""};return n.push(l),{id:s?.data.id,text:l.content,newMessages:n,isDone:i[0]?.finish_reason==="stop",apiResponse:s.data}}talkStream(e){let t=new AbortController;return fetch("https://api.x.ai/v1/chat/completions",{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${this.xAi._apiKey}`},body:JSON.stringify({model:this.config.model,stream:!0,messages:e.messages}),signal:t.signal}).then(async n=>{if(!n.ok){let s=await n.text();throw new Error(`Error: ${s}`)}let r=n.body?.pipeThrough(new TextDecoderStream).getReader();if(!r)throw new Error("Can not get reader");for(;;){let{value:s,done:i}=await r.read();if(i)break;let l=s.split(`
|
|
19
|
+
`);for(let c of l)if(c.length!==0&&!c.startsWith(":")){if(c==="data: [DONE]"){e.onEnd();break}try{let g=JSON.parse(c.substring(6)).choices[0].delta.content;e.onMessage(g)}catch(p){e.onWarn(p)}}}}).catch(n=>{n.name==="AbortError"?e.onEnd():e.onError(n)}),{cancel:()=>t.abort()}}async keepTalk(e,t=[]){let n=await this.talk([...t,{role:"user",content:Array.isArray(e)?e.join(`
|
|
20
|
+
`):e}]);return{result:n,nextTalk:r=>this.keepTalk(r,n.newMessages)}}};var z=class{constructor(e){o(this,"xAi");o(this,"config",{model:"grok-2-image"});this.xAi=e}setConfig(e){Object.assign(this.config,e)}async create(e){return(await this.xAi._axios.post("https://api.x.ai/v1/images/generations",{prompt:e,n:1,model:this.config.model,response_format:"b64_json"},{timeout:3e5,headers:{"Content-Type":"application/json",Authorization:`Bearer ${this.xAi._apiKey}`}})).data}};var re=class a{constructor(e=""){o(this,"_axios",We.create());o(this,"_apiKey","");this._apiKey=e}static createChatRequest(e,t={},n){return async(r,{onCancel:s})=>{let i=new a(typeof e=="string"?e:await e()),l=i.createChat(),c=new AbortController;n&&n.axios&&i.setAxios(n.axios),l.setConfig(typeof t=="function"?await t():t),s(()=>c.abort());let{text:p}=await l.talk(r,{abortController:c});return p}}static createChatRequestWithJsonSchema(e){return async(t,{schema:n,abortController:r})=>{let s=new a(typeof e.apiKey=="string"?e.apiKey:await e.apiKey()),i=s.createChat();e.config&&i.setConfig(typeof e.config=="function"?await e.config():e.config),e.axios&&s.setAxios(e.axios);let l=h(n.output),{text:c}=await i.talk(t,{abortController:r,jsonSchema:{name:"data",strict:!0,schema:l}});return c}}setAxios(e){this._axios=e}setConfiguration(e){this._apiKey=e}createChat(){return new $(this)}createImagesGeneration(){return new z(this)}};export{K as AnthropicChatDataGenerator,ne as AnthropicCtodService,R as ChatBroker,y as ChatBrokerPlugin,Q as CtoD,y as CtoDPlugin,te as GoogleCtodService,ee as LlamaCppCtodService,Y as OpenAICtodService,O as TextParser,M as Translator,re as XCtodService,he as chineseConverter,ge as plugins,ue as templates,h as validateToJsonSchema};
|
|
20
21
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../lib/plugins/index.ts", "../lib/core/plugin.ts", "../lib/plugins/retry.ts", "../lib/plugins/print-log.ts", "../lib/plugins/limiter.ts", "../lib/plugins/role.ts", "../lib/templates.ts", "../lib/utils/chinese-conv.ts", "../lib/core/parser.ts", "../lib/broker/chat.ts", "../lib/utils/validate.ts", "../lib/utils/error.ts", "../lib/core/translator.ts", "../lib/ctod.ts", "../lib/service/openai/index.ts", "../lib/service/openai/vision.ts", "../lib/service/openai/chat.ts", "../lib/service/openai/images-generation.ts", "../lib/service/llama-cpp/index.ts", "../lib/service/llama-cpp/completion.ts", "../lib/service/google/chat.ts", "../lib/service/google/images-generation.ts", "../lib/service/google/index.ts", "../lib/service/anthropic/chat.ts", "../lib/service/anthropic/index.ts", "../lib/service/x/index.ts", "../lib/service/x/chat.ts", "../lib/service/x/images-generation.ts"],
|
|
4
|
-
"sourcesContent": ["import Retry from './retry.js'\nimport PrintLog from './print-log.js'\nimport Limiter from './limiter.js'\nimport Role from './role.js'\n\n/**\n * @zh \u4E00\u500B\u57FA\u65BC\u5370\u51FA log \u7684 plugin\u3002\n * @en A plugin based on printing log.\n */\n\nexport const PrintLogPlugin = PrintLog\n\n/**\n * @zh \u7576\u89E3\u6790\u5931\u6557\u6642\uFF0C\u6703\u81EA\u52D5\u91CD\u8A66\u7684\u5C0D\u8A71\u3002\n * @en A conversation that will automatically retry when parsing fails.\n */\n\nexport const RetryPlugin = Retry\n\n/**\n * @zh \u9650\u5236\u4F7F\u7528\u6D41\u91CF\uFF0C\u9019\u500B plugin \u53EF\u4EE5\u6709\u6548\u8B93\u6240\u6709\u5C0D\u8A71\u4E0D\u6703\u518D\u9650\u5236\u5167\u540C\u6642\u767C\u9001\uFF0C\u53EF\u7528\u65BC\u5728\u958B\u767C\u904E\u7A0B\u4E2D\u906D\u9047\u4F3A\u670D\u5668\u56E0\u983B\u7387\u904E\u9AD8\u800C\u963B\u64CB\u8ACB\u6C42\u3002\n * @en Limit the use of traffic. This plugin can effectively prevent all conversations from being sent at the same time within the limit, and can be used when the server blocks requests due to high frequency during development.\n */\n\nexport const LimiterPlugin = Limiter.plugin\n\n/**\n * @zh \u6392\u7A0B\u7CFB\u7D71\u5C07\u5168\u57DF\u8A17\u7BA1\uFF0C\u6709\u4EC0\u9EBC\u5FC5\u8981\u8A2D\u5B9A\u53EF\u4EE5\u4F86\u66F4\u52D5\u5B83\u7684\u72C0\u614B\uFF0C\u4F8B\u5982\uFF1A\u95DC\u9589\u6392\u7A0B\u3002\n * @en The scheduling system will be globally hosted. What is necessary to set can come to change its status, for example: close the schedule.\n */\nexport const LimiterPluginGlobState = Limiter\n\n/**\n * @zh \u8A2D\u5B9A\u89D2\u8272\u626E\u6F14\u3002\n * @en Set role play.\n */\n\nexport const RolePlugin = Role\n", "import { Translator } from './translator.js'\nimport { ChatBrokerHooks } from '../broker/chat.js'\nimport { Log, Hook, Event } from 'power-helper'\nimport { ValidateCallback, ValidateCallbackOutputs } from '../utils/validate.js'\n\ntype BrokerHooks = ChatBrokerHooks<any, any, any, any>\ntype BrokerPluginParams<\n T extends ValidateCallback<any>,\n R extends ValidateCallback<any>\n> = {\n name: string\n params: T\n receiveData: R\n onInstall: (context: {\n log: Log\n params: ValidateCallbackOutputs<T>\n attach: Hook<BrokerHooks>['attach']\n attachAfter: Hook<BrokerHooks>['attachAfter']\n translator: Translator<any, any>\n receive: (callback: (params: {\n id: string\n data: ValidateCallbackOutputs<R>\n }) => void) => void\n }) => void\n}\n\nexport class ChatBrokerPlugin<\n T extends ValidateCallback<any>,\n R extends ValidateCallback<any>\n> {\n _event = new Event()\n _params: BrokerPluginParams<T, R>\n constructor(params: BrokerPluginParams<T, R>) {\n this._params = params\n }\n\n use(params: ValidateCallbackOutputs<T>) {\n return {\n instance: this as any,\n params,\n send: (data: ValidateCallbackOutputs<R>) => { this._event.emit('receive', data) },\n receive: (callback: any) => { this._event.on('receive', callback) },\n __receiveData: null as unknown as ValidateCallbackOutputs<R>\n }\n }\n}\n", "import { ChatBrokerPlugin } from '../core/plugin.js'\n\nexport default new ChatBrokerPlugin({\n name: 'retry',\n params: z => {\n return {\n retry: z.number().default(1),\n printWarn: z.boolean().default(true)\n }\n },\n receiveData: () => {\n return {}\n },\n onInstall({ log, attach, params }) {\n attach('parseFailed', async({ count, retry, messages, changeMessages }) => {\n if (count <= params.retry) {\n if (params.printWarn) {\n log.print(`Is Failed, Retry ${count} times.`)\n }\n changeMessages(messages)\n retry()\n }\n })\n }\n})\n", "import { ChatBrokerPlugin } from '../core/plugin.js'\n\nexport default new ChatBrokerPlugin({\n name: 'print-log',\n params: z => {\n return {\n detail: z.boolean().default(false)\n }\n },\n receiveData: () => {\n return {}\n },\n onInstall({ params, log, attach }) {\n attach('talkBefore', async({ lastUserMessage, messages }) => {\n log.print('Send:', { color: 'green' })\n if (params.detail) {\n log.print('\\n' + JSON.stringify(messages, null, 4))\n } else {\n log.print('\\n' + lastUserMessage)\n }\n })\n attach('talkAfter', async({ parseText }) => {\n log.print('Receive:', { color: 'cyan' })\n log.print('\\n' + parseText)\n })\n attach('succeeded', async({ output }) => {\n log.print('Output:', { color: 'yellow' })\n try {\n log.print('\\n' + JSON.stringify(output, null, 4))\n } catch (error) {\n log.print('\\n' + output)\n }\n })\n }\n})\n", "import { ChatBrokerPlugin } from '../core/plugin.js'\nimport { Event, flow, Schedule } from 'power-helper'\n\ntype Events = {\n run: {\n id: string\n }\n waitTimeChange: {\n waitTime: number\n }\n}\n\nconst config = {\n limit: 3,\n interval: 60000,\n}\n\nconst state = {\n event: new Event<Events>(),\n schedule: null as Schedule | null,\n waitTimes: [] as number[],\n waitQueue: [] as string[]\n}\n\nexport default {\n /**\n * @zh \u4F60\u53EF\u4EE5\u76E3\u807D\u4E00\u4E9B\u4E8B\u4EF6\u884C\u70BA\uFF0C\u4F8B\u5982\u9084\u9700\u8981\u7B49\u5F85\u591A\u5C11\u6642\u9593\u3002\n * @en You can listen for some event behaviors, such as how long you still need to wait.\n */\n\n event: state.event,\n\n /**\n * @zh \u9810\u8A2D\u662F\u6BCF\u5206\u9418\u9650\u52363\u6B21\uFF0C\u4F60\u53EF\u4EE5\u5728\u8A2D\u5B9A\u4E2D\u6539\u8B8A\u9650\u5236\u6D41\u91CF\u3002\n * @en By default, the limit is 3 times per minute, and you can change the limit flow in the settings.\n */\n\n config,\n\n /**\n * @zh \u7531\u65BC\u6392\u7A0B\u6703\u5728\u80CC\u666F\u6301\u7E8C\u5012\u6578\uFF0C\u5982\u679C\u6709\u95DC\u9589\u7A0B\u5F0F\u7684\u9700\u6C42\uFF0C\u9700\u8981\u624B\u52D5\u9032\u884C\u79FB\u9664\u3002\n * @en Since the schedule will continue to count down in the background, if there is a need to close the program, you need to manually remove it.\n */\n\n closeSchedule: () => {\n if (state.schedule) {\n state.schedule.close()\n state.schedule = null\n }\n },\n\n /**\n * @zh Plugin \u7684\u63A5\u53E3\n * @en Plugin interface\n */\n\n plugin: new ChatBrokerPlugin({\n name: 'limiter',\n params: () => {\n return {}\n },\n receiveData: () => {\n return {}\n },\n onInstall({ attach }) {\n if (state.schedule == null) {\n state.schedule = new Schedule()\n state.schedule.add('calc queue', 1000, async() => {\n const now = Date.now()\n state.waitTimes = state.waitTimes.filter(time => {\n return now - time < config.interval\n })\n if (state.waitTimes.length !== config.limit) {\n let nextId = state.waitQueue.shift()\n if (nextId) {\n state.waitTimes.push(Date.now())\n state.event.emit('run', {\n id: nextId\n })\n }\n } else if (state.waitTimes[0]) {\n state.event.emit('waitTimeChange', {\n waitTime: Math.floor(60 - (now - state.waitTimes[0]) / 1000)\n })\n }\n })\n state.schedule.play()\n }\n attach('talkBefore', async() => {\n const uid = flow.createUuid()\n state.waitQueue.push(uid)\n return new Promise(resolve => {\n state.event.on('run', ({ id }, { off }) => {\n if (id === uid) {\n off()\n resolve()\n }\n })\n })\n })\n }\n })\n}\n", "import { ChatBrokerPlugin } from '../core/plugin.js'\n\nexport default new ChatBrokerPlugin({\n name: 'role',\n params: z => {\n return {\n role: z.string()\n }\n },\n receiveData: () => {\n return {}\n },\n onInstall({ attach, params }) {\n attach('start', async({ messages, changeMessages }) => {\n changeMessages([\n {\n role: 'user',\n content: `\u4F60\u73FE\u5728\u662F${params.role}\u3002`\n },\n {\n role: 'assistant',\n content: `\u6C92\u554F\u984C\uFF0C\u6211\u73FE\u5728\u662F${params.role}\uFF0C\u6709\u4EC0\u9EBC\u53EF\u4EE5\u5E6B\u4F60\u7684\u55CE\uFF1F`\n },\n ...messages\n ])\n })\n }\n})\n", "import Handlebars from 'handlebars'\nimport { record } from 'power-helper'\n\ntype JsonResponseFormat = {\n desc: string\n example: any\n}\n\n/**\n * @zh \u5354\u52A9\u4F7F\u7528\u8005\u5C07\u683C\u5F0F\u9700\u6C42\u8F49\u6210\u8AD6\u6558\u8A9E\u53E5\u3002\n * @en Assist the user in converting the formatting requirements into declarative sentences.\n */\n\nexport const requireJsonResponse = (question: string | string[], format: Record<string, JsonResponseFormat>) => {\n return [\n ...(Array.isArray(question) ? question : [question]),\n 'Please respond using the following JSON format and minify the JSON without including any explanation: ',\n '{',\n Object.entries(format).map(([key, value]) => {\n return [\n `/* ${value.desc} */`,\n `\"${key}\": ${JSON.stringify(value.example)}`,\n ].join('\\n')\n }).join(',\\n'),\n '}'\n ].join('\\n')\n}\n\n/**\n * @zh \u5354\u52A9\u4F7F\u7528\u8005\u5C07\u683C\u5F0F\u9700\u6C42\u8F49\u6210\u8AD6\u6558\u8A9E\u53E5\uFF0C\u652F\u63F4 Handlebars\u3002\n * @en Assist the user in converting the formatting requirements into declarative sentences, support Handlebars.\n */\n\nexport const requireJsonResponseWithHandlebars = (\n value: Record<string, any>,\n question: string | string[],\n format: Record<string, JsonResponseFormat>\n) => {\n const handlebars = Handlebars.create()\n\n handlebars.registerHelper('DATA', function(this: any, value) {\n return JSON.stringify(value)\n })\n\n handlebars.registerHelper('ENV', function(this: any, value) {\n return this.__envs && value ? this.__envs[value] : ''\n })\n\n handlebars.registerHelper('INPUT', function(this: any) {\n return JSON.stringify(record.omit(this, ['__envs']))\n })\n\n handlebars.registerHelper('JOIN', function(this: any, value) {\n return Array.isArray(value) ? value.join() : JSON.stringify(value)\n })\n\n return handlebars.compile(requireJsonResponse(question, format))(value)\n}\n\n/**\n * @zh \u5354\u52A9\u4F7F\u7528\u8005\u5C07\u683C\u5F0F\u9700\u6C42\u8F49\u6210\u8AD6\u6558\u8A9E\u53E5\uFF0C\u4E26\u652F\u63F4 Json Schema\u3002\n * @en Assist the user in converting the formatting requirements into declarative sentences, and support Json Schema.\n */\n\nexport const requireJsonResponseWithJsonSchema = (question: string | string[], format: Record<string, any>) => {\n return [\n ...(Array.isArray(question) ? question : [question]),\n 'Please provide JSON data according to the following JSON Schema format:',\n JSON.stringify(format)\n ].join('\\n')\n}\n", "import { Converter } from 'opencc-js'\n\n/**\n * @zh \u7E41\u4F53\u8F6C\u7B80\u4F53\n * @en Traditional to Simplified\n*/\nexport const t2s = (text: string) => {\n const converter = Converter({\n from: 'tw',\n to: 'cn'\n })\n return converter(text)\n}\n\n/**\n * @zh \u7B80\u4F53\u8F6C\u7E41\u4F53\n * @en Simplified to Traditional\n */\nexport const s2t = (text: string) => {\n const converter = Converter({\n from: 'cn',\n to: 'tw'\n })\n return converter(text)\n}\n", "import JSON5 from 'json5'\n\ntype TextParserParams = {\n /**\n * @zh \u89E3\u8B80\u5668\u540D\u5B57\u3002\n * @en The name of the parser.\n */\n name: string\n /**\n * @zh \u89E3\u8B80\u6587\u672C\u3002\n * @en Read the text.\n */\n handler: (text: string) => Promise<any>\n}\n\nexport class TextParser {\n private params: TextParserParams\n\n /**\n * @zh \u76E1\u53EF\u80FD\u5C07\u6587\u5B57\u5167\u7684 json \u89E3\u8B80\u51FA\u4F86\u3002\n * @en Try to read the json in the text as much as possible.\n */\n\n static JsonMessage() {\n return new TextParser({\n name: 'JsonMessage',\n handler: async (text) => {\n try {\n const result = JSON.parse(text)\n return result\n } catch (error) {\n const jsonRegex = /{(?:[^{}]|(?:{[^{}]*}))*}/\n const matchedText = text.match(jsonRegex)?.[0] || ''\n return JSON5.parse(matchedText)\n }\n }\n })\n }\n\n constructor(params: TextParserParams) {\n this.params = params\n }\n\n /**\n * @zh \u89E3\u8B80\u5668\u540D\u5B57\u3002\n * @en The name of the parser.\n */\n\n get name() {\n return this.params.name\n }\n\n /**\n * @zh \u89E3\u8B80\u6587\u672C\u3002\n * @en Read the text.\n */\n\n async read(text: string) {\n const result = await this.params.handler(text)\n return result\n }\n}\n", "import { TextParser } from '../core/parser.js'\nimport { ChatBrokerPlugin } from '../core/plugin.js'\nimport { Event, flow, Hook, Log } from 'power-helper'\nimport { Translator, TranslatorParams } from '../core/translator.js'\nimport { ValidateCallback, ValidateCallbackOutputs } from '../utils/validate.js'\nimport { ParserError } from '../utils/error.js'\n\nexport type Message = {\n role: 'system' | 'user' | 'assistant' | (string & Record<string, unknown>)\n name?: string\n content: string\n}\n\nexport type ChatBrokerHooks<\n S extends ValidateCallback<any>,\n O extends ValidateCallback<any>,\n P extends ChatBrokerPlugin<any, any>,\n PS extends Record<string, ReturnType<P['use']>>\n> = {\n\n /**\n * @zh \u7B2C\u4E00\u6B21\u804A\u5929\u7684\u6642\u5019\u89F8\u767C\n * @en Triggered when chatting for the first time\n */\n\n start: {\n id: string\n data: ValidateCallbackOutputs<S>\n metadata: Map<string, any>\n plugins: {\n [K in keyof PS]: {\n send: (data: PS[K]['__receiveData']) => void\n }\n }\n schema: {\n input?: S\n output: O\n }\n messages: Message[]\n setPreMessages: (messages: (Omit<Message, 'content'> & { content: string | string[] })[]) => void\n changeMessages: (messages: Message[]) => void\n changeOutputSchema: (output: O) => void\n }\n\n /**\n * @zh \u767C\u9001\u804A\u5929\u8A0A\u606F\u7D66\u6A5F\u5668\u4EBA\u524D\u89F8\u767C\n * @en Triggered before sending chat message to bot\n */\n\n talkBefore: {\n id: string\n data: ValidateCallbackOutputs<S>\n messages: Message[]\n metadata: Map<string, any>\n lastUserMessage: string\n }\n\n /**\n * @zh \u7576\u804A\u5929\u6A5F\u5668\u4EBA\u56DE\u50B3\u8CC7\u6599\u7684\u6642\u5019\u89F8\u767C\n * @en Triggered when the chatbot returns data\n */\n\n talkAfter: {\n id: string\n data: ValidateCallbackOutputs<S>\n response: any\n messages: Message[]\n parseText: string\n metadata: Map<string, any>\n lastUserMessage: string\n /**\n * @zh \u5BA3\u544A\u89E3\u6790\u5931\u6557\n * @en Declare parsing failure\n */\n parseFail: (error: any) => void\n changeParseText: (text: string) => void\n }\n\n /**\n * @zh \u7576\u56DE\u50B3\u8CC7\u6599\u7B26\u5408\u898F\u683C\u6642\u89F8\u767C\n * @en Triggered when the returned data meets the specifications\n */\n\n succeeded: {\n id: string\n metadata: Map<string, any>\n output: ValidateCallbackOutputs<O>\n }\n\n /**\n * @zh \u7576\u56DE\u50B3\u8CC7\u6599\u4E0D\u7B26\u5408\u898F\u683C\uFF0C\u6216\u662F\u89E3\u6790\u932F\u8AA4\u6642\u89F8\u767C\n * @en Triggered when the returned data does not meet the specifications or parsing errors\n */\n\n parseFailed: {\n id: string\n error: any\n retry: () => void\n count: number\n response: any\n metadata: Map<string, any>\n parserFails: { name: string, error: any }[]\n messages: Message[]\n lastUserMessage: string\n changeMessages: (messages: Message[]) => void\n }\n\n /**\n * @zh \u4E0D\u8AD6\u6210\u529F\u5931\u6557\uFF0C\u57F7\u884C\u7D50\u675F\u7684\u6642\u5019\u6703\u57F7\u884C\u3002\n * @en It will be executed when the execution is completed, regardless of success or failure.\n */\n\n done: {\n id: string\n metadata: Map<string, any>\n }\n}\n\nexport type RequestContext = {\n id: string\n count: number\n isRetry: boolean\n metadata: Map<string, any>\n abortController: AbortController\n onCancel: (cb: () => void) => void\n schema: {\n input: any\n output: any\n }\n}\n\nexport type Params<\n S extends ValidateCallback<any>,\n O extends ValidateCallback<any>,\n C extends Record<string, any>,\n P extends ChatBrokerPlugin<any, any>,\n PS extends Record<string, ReturnType<P['use']>>\n> = Omit<TranslatorParams<S, O>, 'parsers'> & {\n name?: string\n plugins?: PS | (() => PS)\n request: (messages: Message[], context: RequestContext) => Promise<string>\n install?: (context: {\n log: Log\n attach: Hook<C>['attach']\n attachAfter: Hook<C>['attachAfter']\n translator: Translator<S, O>\n }) => void\n}\n\nexport class ChatBroker<\n S extends ValidateCallback<any>,\n O extends ValidateCallback<any>,\n P extends ChatBrokerPlugin<any, any>,\n PS extends Record<string, ReturnType<P['use']>>,\n C extends ChatBrokerHooks<S, O, P, PS> = ChatBrokerHooks<S, O, P, PS>\n> {\n protected __hookType!: C\n protected log: Log\n protected hook = new Hook<C>()\n protected params: Params<S, O, C, P, PS>\n protected plugins = {} as PS\n protected installed = false\n protected translator: Translator<S, O>\n protected event = new Event<{\n cancel: {\n requestId: string\n }\n cancelAll: any\n }>()\n\n constructor(params: Params<S, O, C, P, PS>) {\n this.log = new Log(params.name ?? 'no name')\n this.params = params\n this.translator = new Translator({\n ...params,\n parsers: [\n TextParser.JsonMessage()\n ]\n })\n }\n\n protected _install(): any {\n if (this.installed === false) {\n this.installed = true\n const context = {\n log: this.log,\n attach: this.hook.attach.bind(this.hook),\n attachAfter: this.hook.attachAfter.bind(this.hook),\n translator: this.translator\n }\n if (this.params.plugins) {\n this.plugins = typeof this.params.plugins === 'function' ? this.params.plugins() : this.params.plugins\n for (let key in this.plugins) {\n this.plugins[key].instance._params.onInstall({\n ...context,\n params: this.plugins[key].params,\n receive: this.plugins[key].receive\n })\n }\n }\n this.params.install?.(context)\n }\n }\n\n async cancel(requestId?: string) {\n if (requestId) {\n this.event.emit('cancel', {\n requestId\n })\n } else {\n this.event.emit('cancelAll', {})\n }\n }\n\n requestWithId<T extends Translator<S, O>>(data: T['__schemeType']): {\n id: string\n request: Promise<T['__outputType']>\n } {\n this._install()\n let id = flow.createUuid()\n let waitCancel = null as (() => void) | null\n let isCancel = false\n let isSending = false\n let abortController = new AbortController()\n\n // =================\n //\n // event\n //\n\n let listeners = [\n this.event.on('cancel', ({ requestId }) => {\n if (requestId === id) {\n cancelTrigger()\n }\n }),\n this.event.on('cancelAll', () => {\n cancelTrigger()\n })\n ]\n let eventOff = () => listeners.forEach(e => e.off())\n let cancelTrigger = () => {\n if (isCancel === false) {\n if (isSending && waitCancel) {\n waitCancel()\n }\n abortController.abort()\n isCancel = true\n eventOff()\n }\n }\n let onCancel = (cb: () => void) => {\n waitCancel = () => {\n cb()\n }\n }\n\n // =================\n //\n // main\n //\n\n let request = async() => {\n let schema = this.translator.getValidate()\n let output: any = null\n let plugins = {} as any\n let metadata = new Map()\n let question = await this.translator.compile(data, {\n schema\n })\n let preMessages: Message[] = []\n let messages: Message[] = []\n if (question.prompt) {\n messages.push({\n role: 'user',\n content: question.prompt\n })\n }\n for (let key in this.plugins) {\n plugins[key] = {\n send: (data: any) => this.plugins[key].send({\n id,\n data\n })\n }\n }\n await this.hook.notify('start', {\n id,\n data,\n schema,\n plugins,\n messages,\n metadata,\n setPreMessages: ms => {\n preMessages = ms.map(e => {\n return {\n ...e,\n content: Array.isArray(e.content) ? e.content.join('\\n') : e.content\n }\n })\n },\n changeMessages: ms => {\n messages = ms\n },\n changeOutputSchema: output => {\n this.translator.changeOutputSchema(output)\n schema = this.translator.getValidate()\n }\n })\n messages = [\n ...preMessages,\n ...messages\n ]\n await flow.asyncWhile(async ({ count, doBreak }) => {\n if (count >= 99) {\n return doBreak()\n }\n let response = ''\n let parseText = ''\n let retryFlag = false\n let lastUserMessage = messages.filter(e => e.role === 'user').slice(-1)[0]?.content || ''\n try {\n await this.hook.notify('talkBefore', {\n id,\n data,\n messages,\n metadata,\n lastUserMessage\n })\n const sender = this.params.request(messages, {\n id,\n count,\n schema,\n onCancel,\n metadata,\n abortController,\n isRetry: retryFlag\n })\n if (isCancel) {\n if (waitCancel) {\n waitCancel()\n }\n abortController.abort()\n } else {\n try {\n isSending = true\n response = await sender\n parseText = response\n } finally {\n isSending = false\n }\n }\n if (isCancel === false) {\n await this.hook.notify('talkAfter', {\n id,\n data,\n response,\n messages,\n parseText,\n metadata,\n lastUserMessage,\n parseFail: (error) => {\n throw new ParserError(error, [])\n },\n changeParseText: text => {\n parseText = text\n }\n })\n output = (await this.translator.parse(parseText)).output\n await this.hook.notify('succeeded', {\n id,\n output,\n metadata\n })\n }\n await this.hook.notify('done', {\n id,\n metadata\n })\n doBreak()\n } catch (error: any) {\n // \u5982\u679C\u89E3\u6790\u932F\u8AA4\uFF0C\u53EF\u4EE5\u9078\u64C7\u662F\u5426\u91CD\u65B0\u89E3\u8B80\n if (error instanceof ParserError) {\n await this.hook.notify('parseFailed', {\n id,\n error: error.error,\n count,\n response,\n messages,\n metadata,\n lastUserMessage,\n parserFails: error.parserFails,\n retry: () => {\n retryFlag = true\n },\n changeMessages: ms => {\n messages = ms\n }\n })\n if (retryFlag === false) {\n await this.hook.notify('done', {\n id,\n metadata\n })\n throw error\n }\n } else {\n await this.hook.notify('done', {\n id,\n metadata\n })\n throw error\n }\n }\n })\n return output\n }\n const send = async() => {\n try {\n const result = await request()\n return result\n } finally {\n eventOff()\n }\n }\n return {\n id,\n request: send()\n }\n }\n\n /**\n * @zh \u5C07\u8ACB\u6C42\u767C\u51FA\u81F3\u804A\u5929\u6A5F\u5668\u4EBA\u3002\n * @en Send request to chatbot.\n */\n\n async request<T extends Translator<S, O>>(data: T['__schemeType']): Promise<T['__outputType']> {\n const { request } = this.requestWithId(data)\n const output = await request\n return output\n }\n}\n", "import { z, toJSONSchema } from 'zod'\n\nexport type ValidateCallback<T extends Record<string, z.ZodTypeAny>> = (_z: typeof z) => {\n [K in keyof T]: T[K]\n}\n\nexport type ValidateCallbackOutputs<\n T extends ValidateCallback<any>,\n R = ReturnType<T>\n> = {\n [K in keyof R]: R[K] extends z.ZodTypeAny ? z.infer<R[K]> : R[K]\n}\n\nexport function definedValidateSchema<T extends ValidateCallback<any>>(cb: T): T {\n return cb\n}\n\nexport function validate<\n T extends ValidateCallback<any>,\n R = ReturnType<T>\n>(target: any, schemaCallback: T) {\n return z.object(schemaCallback(z)).parse(target || {}) as {\n [K in keyof R]: R[K] extends z.ZodTypeAny ? z.infer<R[K]> : R[K]\n }\n}\n\nexport function validateToJsonSchema<T extends ValidateCallback<any>>(target: () => T) {\n const schema = toJSONSchema(z.object(target()))\n delete schema.$schema\n return schema\n}\n", "type ParserFail = {\n name: string\n error: any\n}\n\nexport class ParserError {\n isParserError = true\n parserFails: ParserFail[] = []\n error: any\n constructor(error: any, parserFails: ParserFail[]) {\n this.error = error\n this.parserFails = parserFails\n }\n}\n", "import { TextParser } from './parser.js'\nimport { validate, ValidateCallback, ValidateCallbackOutputs } from '../utils/validate.js'\nimport { ParserError } from '../utils/error.js'\n\nexport type TranslatorParams<\n S extends ValidateCallback<any>,\n O extends ValidateCallback<any>\n> = {\n /**\n * @zh \u8F38\u5165\u7684\u8CC7\u6599\u683C\u5F0F\u3002\n * @en The input data format.\n */\n input?: S\n /**\n * @zh \u8F38\u51FA\u7684\u8CC7\u6599\u683C\u5F0F\u3002\n * @en The output data format.\n */\n output: O\n /**\n * @zh \u8A3B\u518A\u89E3\u8B80\u6587\u5B57\u7684\u89E3\u6790\u5668\u3002\n * @en Register the parser to interpret the text.\n */\n parsers: TextParser[]\n /**\n * @zh \u7D44\u5408\u8F38\u5165\u8CC7\u6599\u6210\u70BA\u63D0\u793A\u6587\u5B57\u3002\n * @en Combine the input data into a prompt.\n */\n question?: (data: ValidateCallbackOutputs<S>, context: {\n schema: {\n input?: S\n output: O\n }\n }) => Promise<string | string[]>\n}\n\nexport class Translator<\n S extends ValidateCallback<any>,\n O extends ValidateCallback<any>\n> {\n private params: TranslatorParams<S, O>\n\n constructor(params: TranslatorParams<S, O>) {\n this.params = params\n }\n\n get __schemeType(): ValidateCallbackOutputs<S> {\n return null as any\n }\n\n get __outputType(): ValidateCallbackOutputs<O> {\n return null as any\n }\n\n /**\n * @zh \u7D44\u5408\u8F38\u5165\u8CC7\u6599\u6210\u70BA\u63D0\u793A\u6587\u5B57\u3002\n * @en Combine the input data into a prompt.\n */\n\n async compile(data: ValidateCallbackOutputs<S>, context: {\n schema: {\n input?: S\n output: O\n }\n }) {\n const scheme = this.params.input ? validate(data, this.params.input) : data\n const prompt = this.params.question ? await this.params.question(scheme, context) : ''\n return {\n scheme,\n prompt: Array.isArray(prompt) ? prompt.join('\\n') : prompt\n }\n }\n\n getValidate() {\n return {\n input: this.params.input,\n output: this.params.output\n }\n }\n\n changeOutputSchema(schema: O) {\n this.params.output = schema\n }\n\n /**\n * @zh \u5C07\u6587\u5B57\u8F49\u63DB\u6210\u5E8F\u5217\u5316\u8CC7\u6599\u3002\n * @en Convert text to serialized data.\n */\n\n async parse(text: string) {\n let result: any = undefined\n let parserName = ''\n let parserFails: { name: string, error: any }[] = []\n for (let parse of this.params.parsers) {\n try {\n result = await parse.read(text)\n parserName = parse.name\n } catch (error) {\n result = undefined\n parserFails.push({\n name: parse.name,\n error\n })\n }\n }\n try {\n let output = validate(result, this.params.output)\n return {\n output,\n parserName,\n parserFails\n }\n } catch (error) {\n throw new ParserError(error, parserFails)\n }\n }\n}\n", "import { ChatBroker, Message, Params as ChatBrokerParams, ChatBrokerHooks, RequestContext } from './broker/chat.js'\nimport { ChatBrokerPlugin } from './core/plugin.js'\nimport * as z from 'zod'\n\ntype IO = any\n\nexport class CtoD<\n P extends ChatBrokerPlugin<IO, IO>,\n PS extends Record<string, ReturnType<P['use']>>\n> {\n params\n constructor(params: {\n request: (messages: Message[], context: RequestContext) => Promise<string>\n plugins?: () => PS\n }) {\n this.params = params\n }\n\n createBrokerBuilder<I extends Record<string, any>>(params?: {\n install?: ChatBrokerParams<() => I, IO, ChatBrokerHooks<() => I, IO, P, PS>, P, PS>['install']\n }) {\n return {\n create: <O extends Record<string, z.ZodTypeAny>>(install: (context: {\n id: string\n zod: typeof z\n data: I\n plugins: {\n [K in keyof PS]: {\n send: (data: PS[K]['__receiveData']) => void\n }\n }\n setMessages: (messages: (Omit<Message, 'content'> & { content: string | string[] })[]) => void\n metadata: Map<string, any>\n }) => Promise<O>) => {\n return new ChatBroker<\n () => I,\n () => O,\n P,\n PS,\n ChatBrokerHooks<() => I, () => O, P, PS>\n >({\n output: () => ({} as any),\n install: (context) => {\n params?.install?.(context)\n context.attach('start', async({ id, plugins, data, metadata, changeMessages, changeOutputSchema }) => {\n const schema = await install({\n id,\n data: data as any,\n plugins,\n zod: z,\n setMessages: (messages) => {\n changeMessages(messages.map(e => {\n return {\n role: e.role,\n content: Array.isArray(e.content) ? e.content.join('\\n') : e.content\n }\n }))\n },\n metadata\n })\n changeOutputSchema(() => schema)\n })\n },\n plugins: this.params.plugins ? () => this.params.plugins!() : undefined,\n request: this.params.request\n })\n }\n }\n }\n}\n", "import axios from 'axios'\nimport { OpenAIVision } from './vision.js'\nimport { OpenAIChat, Config } from './chat.js'\nimport { OpenAIImagesGeneration } from './images-generation.js'\nimport { validateToJsonSchema } from '../../utils/validate.js'\n\nexport class OpenAICtodService {\n _axios = axios.create()\n _apiKey = ''\n _baseUrl = 'https://api.openai.com'\n\n static createChatRequest(\n apiKey: string | (() => Promise<string>),\n config: Partial<Config> | (() => Promise<Partial<Config>>) = {},\n options?: {\n axios?: any\n baseUrl?: string\n }\n ) {\n return async(messages: any[], { abortController }: any) => {\n const openai = new OpenAICtodService(typeof apiKey === 'string' ? apiKey : await apiKey())\n const chat = openai.createChat()\n if (options) {\n if (options.axios) {\n openai.setAxios(options.axios)\n }\n if (options.baseUrl) {\n openai.setBaseUrl(options.baseUrl)\n }\n }\n chat.setConfig(typeof config === 'function' ? await config() : config)\n const { text } = await chat.talk(messages, {\n abortController\n })\n return text\n }\n }\n\n static createChatRequestWithJsonSchema(params: {\n axios?: any\n apiKey: string | (() => Promise<string>)\n config?: Partial<Pick<Config, 'model' | 'temperature'>> | (() => Promise<Partial<Pick<Config, 'model' | 'temperature'>>>)\n }) {\n return async(messages: any[], { schema, onCancel }: any) => {\n const openai = new OpenAICtodService(typeof params.apiKey === 'string' ? params.apiKey : await params.apiKey())\n const chat = openai.createChat()\n const abortController = new AbortController()\n if (params.config) {\n chat.setConfig(typeof params.config === 'function' ? await params.config() : params.config)\n }\n if (params.axios) {\n openai.setAxios(params.axios)\n }\n onCancel(() => abortController.abort())\n const jsonSchema = validateToJsonSchema(schema.output)\n const { text } = await chat.talk(messages, {\n abortController,\n jsonSchema: {\n name: 'data',\n strict: true,\n schema: jsonSchema\n }\n })\n return text\n }\n }\n\n constructor(apiKey = '') {\n this._apiKey = apiKey\n }\n\n /**\n * @zh \u5982\u679C\u4F60\u6709\u9700\u8981\u7279\u5225\u8A2D\u5B9A axios\uFF0C\u8ACB\u4F7F\u7528\u9019\u65B9\u6CD5\u3002\n * @en If you need to set axios, please use this method.\n */\n\n setAxios(axios: any) {\n this._axios = axios\n }\n\n /**\n * @zh \u5982\u679C\u4F60\u6709\u9700\u8981\u7279\u5225\u8A2D\u5B9A baseUrl\uFF0C\u8ACB\u4F7F\u7528\u9019\u65B9\u6CD5\u3002\n * @en If you need to set baseUrl, please use this method.\n */\n\n setBaseUrl(baseUrl: string) {\n this._baseUrl = baseUrl\n }\n\n /**\n * @zh \u8A2D\u5B9A api key\u3002\n * @en Set api key.\n */\n\n setConfiguration(apiKey: string) {\n this._apiKey = apiKey\n }\n\n createChat() {\n return new OpenAIChat(this)\n }\n\n createVision() {\n return new OpenAIVision(this)\n }\n\n createImagesGeneration() {\n return new OpenAIImagesGeneration(this)\n }\n}\n", "import { OpenAICtodService } from './index.js'\n\ntype ImageContent = {\n type: 'image_url' | 'text'\n text?: string\n image_url?: {\n url: string\n detail?: string\n }\n}\n\nexport type VisionMessage = {\n role: 'system' | 'user' | 'assistant'\n name?: string\n content: string | ImageContent[]\n}\n\ntype ApiResponse = {\n id: string\n object: string\n created: number\n model: string\n usage: {\n prompt_tokens: number\n completion_tokens: number\n total_tokens: number\n }\n choices: Array<{\n message: {\n role: string\n content: string\n }\n finish_details: {\n type: string\n }\n index: number\n }>\n}\n\nexport type Config = {\n /**\n * @zh \u9078\u64C7\u904B\u884C\u7684\u6A21\u578B\u3002\n * @en How many chat completion choices to generate for each input message.\n */\n model: 'gpt-4-vision-preview'\n /**\n * @zh \u5192\u96AA\u6307\u6578\uFF0C\u6578\u503C\u7531 0 ~ 2 \u4E4B\u9593\u3002\n * @en What sampling temperature to use, between 0 and 2. Higher values like 0.8 will make the output more random, while lower values like 0.2 will make it more focused and deterministic.\n */\n temperature: number\n /**\n * @zh \u6BCF\u6B21\u5C0D\u8A71\u6700\u591A\u7522\u751F\u5E7E\u500B tokens\u3002\n * @en How many tokens to complete to.\n */\n maxTokens?: number\n}\n\nexport class OpenAIVision {\n openai: OpenAICtodService\n config: Config = {\n model: 'gpt-4-vision-preview',\n maxTokens: undefined,\n temperature: 1\n }\n\n constructor(openai: OpenAICtodService) {\n this.openai = openai\n }\n\n /**\n * @zh \u6539\u8B8A\u5C0D\u8A71\u7684\u4E00\u4E9B\u8A2D\u5B9A\n * @en Change some settings of the conversation\n */\n\n setConfig(options: Partial<Config>) {\n Object.assign(this.config, options)\n }\n\n /**\n * @zh \u8FA8\u8B58\u5716\u7247\n * @en Recognize images\n */\n\n async view(messages: VisionMessage[]) {\n const result = await this.openai._axios.post<ApiResponse>(`${this.openai._baseUrl}/v1/chat/completions`, {\n model: this.config.model,\n n: 1,\n messages,\n max_tokens: this.config.maxTokens,\n temperature: this.config.temperature\n }, {\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${this.openai._apiKey}`\n }\n })\n const choices = result.data.choices || []\n const message = choices[0]?.message || {\n role: 'assistant',\n content: ''\n }\n return {\n id: result?.data.id as string,\n text: message.content as string,\n apiResponse: result.data\n }\n }\n}\n\nexport type OpenAIChatVisionResponse = Awaited<ReturnType<OpenAIVision['view']>>\n", "import { json } from 'power-helper'\nimport { OpenAICtodService } from './index.js'\n\nexport type ChatGPTMessage = {\n role: 'system' | 'user' | 'assistant'\n name?: string\n content: string\n}\n\ntype ApiResponse = {\n id: string\n object: string\n created: number\n choices: Array<{\n index: number\n finish_reason: string\n message: {\n role: 'system' | 'user' | 'assistant'\n name?: string\n content: string\n }\n }>\n usage: {\n prompt_tokens: number\n completion_tokens: number\n total_tokens: number\n }\n}\n\nexport type Config = {\n /**\n * @zh \u4E00\u6B21\u56DE\u61C9\u6578\u91CF\n * @en How many chat completion choices to generate for each input message.\n */\n n: number\n /**\n * @zh \u9078\u64C7\u904B\u884C\u7684\u6A21\u578B'\n * @en The model to use for this chat completion.\n */\n model: string\n /**\n * @zh \u5192\u96AA\u6307\u6578\uFF0C\u6578\u503C\u7531 0 ~ 2 \u4E4B\u9593\uFF0C\u8D8A\u4F4E\u56DE\u61C9\u8D8A\u7A69\u5B9A\u3002\n * @en What sampling temperature to use, between 0 and 2. Higher values like 0.8 will make the output more random, while lower values like 0.2 will make it more focused and deterministic.\n */\n temperature: number\n /**\n * @zh \u662F\u5426\u5F37\u5236\u8981\u56DE\u50B3 JSON \u683C\u5F0F\u7684\u8CC7\u6599\n * @en Whether to force the return of JSON format data\n */\n forceJsonFormat: boolean\n /**\n * @zh \u6BCF\u6B21\u5C0D\u8A71\u6700\u591A\u7522\u751F\u5E7E\u500B tokens\u3002\n * @en How many tokens to complete to.\n */\n maxTokens?: number\n}\n\nexport class OpenAIChat {\n openai: OpenAICtodService\n config: Config = {\n n: 1,\n model: 'gpt-4o',\n temperature: 1,\n maxTokens: undefined,\n forceJsonFormat: true\n }\n\n constructor(openai: OpenAICtodService) {\n this.openai = openai\n }\n\n /**\n * @zh \u6539\u8B8A\u5C0D\u8A71\u7684\u4E00\u4E9B\u8A2D\u5B9A\n * @en Change some settings of the conversation\n */\n\n setConfig(options: Partial<Config>) {\n Object.assign(this.config, options)\n }\n\n /**\n * @zh \u6AA2\u8996\u5167\u5BB9\u662F\u5426\u7B26\u5408 OpenAI \u7684\u5BE9\u67E5\n * @en View content for OpenAI moderation\n */\n\n async moderations(input: string) {\n const result = await this.openai._axios.post<any>(`${this.openai._baseUrl}/v1/moderations`, {\n input: input\n }, {\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${this.openai._apiKey}`\n }\n })\n return {\n isSafe: result.data.results?.[0]?.flagged === false,\n result: result.data\n }\n }\n\n /**\n * @zh \u9032\u884C\u5C0D\u8A71\n * @en Talk to the AI\n */\n\n async talk(messages: ChatGPTMessage[] = [], options?: {\n /** \u8981 forceJsonFormat \u70BA true \u624D\u6703\u751F\u6548 */\n jsonSchema?: any\n abortController?: AbortController\n }) {\n const newMessages = json.jpjs(messages)\n const isSupportJson = [\n 'gpt-4-turbo-preview',\n 'gpt-4-turbo',\n 'gpt-4o',\n 'gpt-4o-mini',\n 'gpt-3.5-turbo-1106'\n ].includes(this.config.model)\n let response_format: any = undefined\n if (isSupportJson && this.config.forceJsonFormat) {\n response_format = {\n type: 'json_object'\n }\n }\n if (isSupportJson && this.config.forceJsonFormat && options?.jsonSchema) {\n response_format = {\n type: 'json_schema',\n json_schema: options.jsonSchema\n }\n }\n const result = await this.openai._axios.post<ApiResponse>(`${this.openai._baseUrl}/v1/chat/completions`, {\n model: this.config.model,\n n: this.config.n,\n messages: newMessages,\n response_format,\n temperature: this.config.temperature\n }, {\n signal: options?.abortController?.signal,\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${this.openai._apiKey}`\n }\n })\n const choices = result.data.choices || []\n const message = choices[0]?.message || {\n role: 'assistant',\n content: ''\n }\n newMessages.push(message)\n return {\n id: result?.data.id as string,\n text: message.content as string,\n newMessages,\n isDone: choices[0]?.finish_reason === 'stop',\n apiResponse: result.data\n }\n }\n\n talkStream(params: {\n messages: any[]\n onMessage: (_message: string) => void\n onEnd: () => void\n onWarn: (_warn: any) => void\n onError: (_error: any) => void\n }) {\n const controller = new AbortController()\n fetch(`${this.openai._baseUrl}/v1/chat/completions`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${this.openai._apiKey}`\n },\n body: JSON.stringify({\n model: this.config.model,\n stream: true,\n messages: params.messages\n }),\n signal: controller.signal\n }).then(async response => {\n const reader = response.body?.pipeThrough(new TextDecoderStream()).getReader()\n if (!reader) {\n throw new Error('Can not get reader')\n }\n\n while (true) {\n const { value, done } = await reader.read()\n if (done) {\n break\n }\n const items = value.split('\\n')\n for (let item of items) {\n if (item.length === 0) {\n continue\n }\n if (item.startsWith(':')) {\n continue\n }\n if (item === 'data: [DONE]') {\n params.onEnd()\n break\n }\n try {\n const result = JSON.parse(item.substring(6))\n const content = result.choices[0].delta.content\n params.onMessage(content)\n } catch (error) {\n params.onWarn(error)\n }\n }\n }\n }).catch(error => {\n if (error.name === 'AbortError') {\n params.onEnd()\n } else {\n params.onError(error)\n }\n })\n return {\n cancel: () => controller.abort()\n }\n }\n\n /**\n * @zh \u958B\u555F\u6301\u7E8C\u6027\u5C0D\u8A71\n */\n\n async keepTalk(prompt: string | string[], oldMessages: ChatGPTMessage[] = []) {\n const result = await this.talk([\n ...oldMessages,\n {\n role: 'user',\n content: Array.isArray(prompt) ? prompt.join('\\n') : prompt\n }\n ])\n return {\n result,\n nextTalk: (prompt: string | string[]) => this.keepTalk(prompt, result.newMessages)\n }\n }\n}\n\nexport type OpenAIChatTalkResponse = Awaited<ReturnType<OpenAIChat['talk']>>\n", "import { OpenAICtodService } from './index.js'\n\ntype ApiResponse = {\n created: string\n data: {\n b64_json: string\n }[]\n}\n\ntype Config = {\n /**\n * @zh \u6A21\u578B\uFF0C\u652F\u63F4 dall-e-2 \u548C dall-e-3\n * @en Model, support dall-e-2 and dall-e-3\n */\n model: 'dall-e-2' | 'dall-e-3'\n /**\n * @zh \u89E3\u6790\u5EA6\uFF0C\u4F8B\u5982 1024x1024\n * @en Resolution, for example 1024x1024\n */\n size: `${number}x${number}`\n}\n\nexport class OpenAIImagesGeneration {\n private openai: OpenAICtodService\n private config: Config = {\n model: 'dall-e-2',\n size: '1024x1024'\n }\n\n constructor(openai: OpenAICtodService) {\n this.openai = openai\n }\n\n /**\n * @zh \u6539\u8B8A\u5C0D\u8A71\u7684\u4E00\u4E9B\u8A2D\u5B9A\n * @en Change some settings of the conversation\n */\n\n setConfig(options: Partial<Config>) {\n Object.assign(this.config, options)\n }\n\n /**\n * @zh \u7522\u751F\u5716\u7247\n * @en Generate image\n */\n\n async create(prompt: string) {\n const result = await this.openai._axios.post<ApiResponse>(`${this.openai._baseUrl}/v1/images/generations`, {\n prompt,\n n: 1,\n size: this.config.size,\n model: this.config.model,\n response_format: 'b64_json'\n }, {\n timeout: 1000 * 60 * 5,\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${this.openai._apiKey}`\n }\n })\n return result.data\n }\n}\n", "import axios, { AxiosInstance } from 'axios'\nimport { s2t, t2s } from '../../utils/chinese-conv.js'\nimport { validateToJsonSchema } from '../../utils/validate.js'\nimport { LlamaCppCompletion, Config } from './completion.js'\n\nexport class LlamaCppCtodService {\n _axios = axios.create()\n\n static createChatRequestWithJsonSchema(params: {\n axios?: AxiosInstance\n config: Partial<Config> | (() => Promise<Partial<Config>>)\n talkOptions?: any\n }) {\n return async(messages: any[], { schema, onCancel }: any) => {\n const ll3cpp = new LlamaCppCtodService()\n const chat = ll3cpp.createCompletion()\n const config = typeof params.config === 'function' ? await params.config() : params.config\n chat.setConfig(config)\n let formatSchema = validateToJsonSchema(schema.output)\n if (params.axios) {\n ll3cpp.setAxios(params.axios)\n }\n if (chat.config.autoConvertTraditionalChinese) {\n formatSchema = JSON.parse(t2s(JSON.stringify(formatSchema)))\n }\n const { run, cancel } = chat.talk({\n options: params.talkOptions,\n messages: messages,\n response_format: {\n type: 'json_object',\n schema: formatSchema\n }\n })\n onCancel(cancel)\n const { message } = await run()\n return chat.config.autoConvertTraditionalChinese ? s2t(message) : message\n }\n }\n\n /**\n * @zh \u5982\u679C\u4F60\u6709\u9700\u8981\u7279\u5225\u8A2D\u5B9A axios\uFF0C\u8ACB\u4F7F\u7528\u9019\u65B9\u6CD5\u3002\n * @en If you need to set axios, please use this method.\n */\n\n setAxios(axios: AxiosInstance) {\n this._axios = axios\n }\n\n /**\n * @zh \u5EFA\u7ACB \u88DC\u5F37/ \u5C0D\u8A71\u7269\u4EF6\u3002\n * @en Create completion object.\n */\n\n createCompletion() {\n return new LlamaCppCompletion(this)\n }\n}\n", "import { LlamaCppCtodService } from './index.js'\nimport { flow, Once } from 'power-helper'\nimport { s2t, t2s } from '../../utils/chinese-conv.js'\nimport { Template } from '@huggingface/jinja'\n\ntype Message = {\n role: string\n content: string\n}\n\ntype Options = any\n\nexport type Config = {\n baseUrl: string\n headers: Record<string, string>\n autoConvertTraditionalChinese: boolean\n}\n\ntype Stream = {\n onMessage: (message: string) => void\n onEnd?: () => void\n onWarn?: (error: any) => void\n onError?: (error: any) => void\n}\n\nclass Requester {\n private core: LlamaCppCompletion\n private streamAbortControllers: {\n id: string\n controller: AbortController\n }[] = []\n\n constructor(core: LlamaCppCompletion) {\n this.core = core\n }\n\n private createAbortController() {\n const streamAbortController = new AbortController()\n const streamAbortControllerId = flow.createUuid()\n this.streamAbortControllers.push({\n id: streamAbortControllerId,\n controller: streamAbortController\n })\n return {\n signal: streamAbortController.signal,\n controllerId: streamAbortControllerId\n }\n }\n\n private removeAbortController(streamAbortControllerId: string) {\n this.streamAbortControllers = this.streamAbortControllers.filter(e => e.id !== streamAbortControllerId)\n }\n\n async stream(params: {\n path: string\n data: Record<string, any> | (() => Promise<any>)\n onMessage: (data: any) => void\n onEnd: () => void\n onWarn: (error: any) => void\n onError: (error: any) => void\n }) {\n const { signal, controllerId } = this.createAbortController()\n const end = () => {\n this.removeAbortController(controllerId)\n params.onEnd()\n }\n const reader = async(response: Response) => {\n if (response.body) {\n let reader = response.body.getReader()\n let done = false\n let chunk = ''\n while (!done) {\n const { value, done: readerDone } = await reader.read()\n if (value) {\n chunk += new TextDecoder('utf-8').decode(value)\n const payloads = chunk.split('\\n\\n')\n chunk = payloads.pop() || ''\n payloads.forEach(payload => {\n if (payload.includes('[DONE]')) {\n done = true\n }\n if (payload.startsWith('data:')) {\n try {\n const data = JSON.parse(payload.replace('data: ', ''))\n params.onMessage(data)\n } catch (error) {\n params.onWarn(error)\n }\n }\n })\n }\n if (readerDone) {\n done = true\n }\n }\n end()\n } else {\n params.onError(new Error('Body not found.'))\n }\n }\n fetch(`${this.core.config.baseUrl}/${params.path}`, {\n method: 'POST',\n body: JSON.stringify(typeof params.data === 'function' ? (await params.data()) : params.data),\n signal,\n headers: {\n 'Content-Type': 'application/json',\n ...this.core.config.headers\n }\n })\n .then(reader)\n .catch(error => {\n if (error instanceof Error && error.message.includes('The user aborted a request')) {\n end()\n } else {\n params.onError(error)\n }\n })\n }\n\n async fetch(params: {\n path: string\n data: any\n }) {\n const { signal, controllerId } = this.createAbortController()\n try {\n const result = await this.core.core._axios.post(`${this.core.config.baseUrl}/${params.path}`, params.data, {\n signal,\n headers: {\n 'Content-Type': 'application/json',\n ...this.core.config.headers\n }\n })\n return {\n data: result.data\n }\n } finally {\n this.removeAbortController(controllerId)\n }\n }\n\n cancel() {\n this.streamAbortControllers.forEach(e => e.controller.abort())\n this.streamAbortControllers = []\n }\n\n export() {\n return {\n cancel: this.cancel.bind(this)\n }\n }\n}\n\nexport class LlamaCppCompletion {\n private getProp = new Once({\n handler: async() => {\n const url = `${this.config.baseUrl}/props`\n const { data: props } = await this.core._axios.get<{\n chat_template: string\n bos_token: string\n eos_token: string\n }>(url, {})\n return props\n }\n })\n\n core: LlamaCppCtodService\n config: Config = {\n baseUrl: '',\n headers: {},\n autoConvertTraditionalChinese: true\n }\n\n constructor(core: LlamaCppCtodService) {\n this.core = core\n }\n\n setConfig(config: Partial<Config>) {\n this.config = {\n ...this.config,\n ...config\n }\n }\n\n completion(params: {\n options?: Options\n messages: Message[]\n }) {\n const lastMessage = params.messages.at(-1) || ''\n const requester = new Requester(this)\n return {\n ...requester.export(),\n run: async(): Promise<{\n message: string\n fullMessage: string\n }> => {\n const props = await this.getProp.run()\n const template = new Template(props.chat_template)\n const prompt = template.render({\n bos_token: props.bos_token,\n messages: params.messages\n }).slice(0, props.eos_token.length * -1 - 1)\n const result = await requester.fetch({\n path: 'completion',\n data: {\n ...(params.options || {}),\n prompt: this.config.autoConvertTraditionalChinese ? t2s(prompt) : prompt\n }\n })\n const message = this.config.autoConvertTraditionalChinese ? s2t(result.data.content) : result.data.content\n return {\n message,\n fullMessage: `${lastMessage}${message}`\n }\n }\n }\n }\n\n completionStream(params: Stream & {\n messages: Message[]\n options?: Options\n }) {\n const requester = new Requester(this)\n requester.stream({\n path: 'completion',\n onEnd: params.onEnd || (() => null),\n onMessage: e => {\n const message = this.config.autoConvertTraditionalChinese ? s2t(e.content) : e.content\n params.onMessage(message)\n },\n onWarn: params.onWarn || (() => null),\n onError: params.onError || (() => null),\n data: async() => {\n const props = await this.getProp.run()\n const template = new Template(props.chat_template)\n const prompt = template.render({\n bos_token: props.bos_token,\n messages: params.messages\n }).slice(0, props.eos_token.length * -1 - 1)\n return {\n ...(params.options || {}),\n prompt: this.config.autoConvertTraditionalChinese ? t2s(prompt) : prompt,\n stream: true\n }\n }\n })\n return requester.export()\n }\n\n talk(params: {\n options?: Options\n messages: Message[]\n response_format?: {\n type: 'json_object'\n schema: any\n }\n }) {\n const requester = new Requester(this)\n return {\n ...requester.export(),\n run: async(): Promise<{\n message: string\n }> => {\n const result = await requester.fetch({\n path: 'v1/chat/completions',\n data: {\n ...(params.options || {}),\n response_format: params.response_format,\n messages: params.messages.map(e => {\n return {\n role: e.role,\n content: this.config.autoConvertTraditionalChinese ? t2s(e.content) : e.content\n }\n })\n }\n })\n const content = result.data.choices[0].message.content || ''\n return {\n message: this.config.autoConvertTraditionalChinese ? s2t(content) : content\n }\n }\n }\n }\n\n talkStream(params: Stream & {\n options?: Options\n messages: Message[]\n }) {\n const requester = new Requester(this)\n requester.stream({\n path: 'v1/chat/completions',\n onEnd: params.onEnd || (() => null),\n onMessage: e => {\n let content = e.choices[0].delta.content\n if (content) {\n const message = this.config.autoConvertTraditionalChinese ? s2t(content) : content\n params.onMessage(message)\n }\n },\n onWarn: params.onWarn || (() => null),\n onError: params.onError || (() => null),\n data: {\n ...(params.options || {}),\n stream: true,\n messages: params.messages.map(e => {\n return {\n role: e.role,\n content: this.config.autoConvertTraditionalChinese ? t2s(e.content) : e.content\n }\n })\n }\n })\n return requester.export()\n }\n}\n", "import { json } from 'power-helper'\nimport { GoogleCtodService } from './index.js'\n\n/**\n * if data:\n * data: base64 string,\n * mimeType: image/jpeg,\n */\n\ntype Part = {\n text: string\n} | {\n inlineData: {\n data: string\n mimeType: string\n }\n}\n\nexport type GoogleMessage = {\n role: 'model' | 'user'\n parts: Part[]\n}\n\nexport type Config = {\n /**\n * @zh \u9078\u64C7\u904B\u884C\u7684\u6A21\u578B\u3002\n * @en What model to use.\n */\n model: string\n maxTokens: number\n temperature: number\n}\n\nexport class GoogleChat {\n google: GoogleCtodService\n config: Config = {\n model: 'gemini-2.0-flash',\n maxTokens: 1024,\n temperature: 0.7\n }\n\n constructor(google: GoogleCtodService) {\n this.google = google\n }\n\n /**\n * @zh \u6539\u8B8A\u5C0D\u8A71\u7684\u4E00\u4E9B\u8A2D\u5B9A\n * @en Change some settings of the conversation\n */\n\n setConfig(options: Partial<Config>) {\n Object.assign(this.config, options)\n }\n\n /**\n * @zh \u9032\u884C\u5C0D\u8A71\n * @en Talk to the AI\n */\n\n async talk(messages: GoogleMessage[] = []) {\n const newMessages = json.jpjs(messages)\n const response = await this.google.googleGenAI.models.generateContent({\n model: this.config.model,\n contents: newMessages,\n config: {\n temperature: this.config.temperature,\n maxOutputTokens: this.config.maxTokens\n }\n })\n const text = response.text\n return {\n text,\n newMessages: [\n ...newMessages,\n {\n role: 'model',\n parts: [\n {\n text\n }\n ]\n }\n ]\n }\n }\n\n /**\n * @zh \u9032\u884C\u5C0D\u8A71\uFF0C\u4E26\u4E14\u4EE5\u4E32\u6D41\u7684\u65B9\u5F0F\u8F38\u51FA\n * @en Talk to the AI and output in a streaming way\n */\n\n talkStream(params: {\n messages: GoogleMessage[]\n onMessage: (_message: string) => void\n onEnd: () => void\n onWarn: (_warn: any) => void\n onError: (_error: any) => void\n }) {\n const state = {\n controller: new AbortController()\n }\n const model = this.google.googleGenAI.models.generateContentStream({\n model: this.config.model,\n contents: params.messages,\n config: {\n abortSignal: state.controller.signal,\n temperature: this.config.temperature,\n maxOutputTokens: this.config.maxTokens,\n }\n })\n model.then(async(stream) => {\n try {\n for await (const chunk of stream) {\n const chunkText = chunk.candidates?.[0].content?.parts?.[0].text || ''\n params.onMessage(chunkText)\n }\n params.onEnd()\n } catch (error) {\n if (state.controller.signal.aborted) {\n params.onEnd()\n } else {\n throw error\n }\n }\n })\n .catch((error) => {\n params.onError(error)\n })\n return {\n cancel: () => {\n state.controller.abort()\n }\n }\n }\n}\n\nexport type GoogleChatTalkResponse = Awaited<ReturnType<GoogleChat['talk']>>\n", "import { GoogleCtodService } from './index.js'\n\ntype Config = {\n model: string\n size: string\n aspectRatio: string\n}\n\nexport class GoogleImagesGeneration {\n private google: GoogleCtodService\n private config: Config = {\n model: 'imagen-4.0-generate-001',\n size: '1K',\n aspectRatio: '1:1'\n }\n\n constructor(google: GoogleCtodService) {\n this.google = google\n }\n\n /**\n * @zh \u6539\u8B8A\u5C0D\u8A71\u7684\u4E00\u4E9B\u8A2D\u5B9A\n * @en Change some settings of the conversation\n */\n\n setConfig(options: Partial<Config>) {\n Object.assign(this.config, options)\n }\n\n /**\n * @zh \u7522\u751F\u5716\u7247\n * @en Generate image\n */\n\n async create(prompt: string) {\n const response = await this.google.googleGenAI.models.generateImages({\n model: this.config.model,\n prompt,\n config: {\n numberOfImages: 1,\n aspectRatio: this.config.aspectRatio,\n imageSize: this.config.size\n }\n })\n return {\n images: response.generatedImages?.map(e => {\n return {\n url: e.image?.imageBytes || '',\n mimeType: e.image?.mimeType || ''\n }\n }) || []\n }\n }\n}\n", "import { validateToJsonSchema } from '../../utils/validate.js'\nimport { GoogleMessage, GoogleChat, Config } from './chat.js'\nimport { GoogleImagesGeneration } from './images-generation.js'\nimport type { GoogleGenAI } from '@google/genai'\n\ntype GPTContent = {\n type: 'image_url' | 'text'\n text?: string\n image_url?: {\n url: string\n detail?: string\n }\n}\n\ntype GPTMessage = {\n role: 'system' | 'user' | 'assistant'\n content: string | GPTContent[]\n}\n\nexport class GoogleCtodService {\n googleGenAI: GoogleGenAI\n\n constructor(googleGenAI: any) {\n this.googleGenAI = googleGenAI\n }\n\n static chatGPTMessageToGoogleChatMessage(messages: GPTMessage[]): GoogleMessage[] {\n const contentToParts = (content: string | GPTMessage['content']): GoogleMessage['parts'] => {\n if (typeof content === 'string') {\n return [\n {\n text: content\n }\n ]\n } else if (Array.isArray(content)) {\n return content.map(({ type, image_url, text }): GoogleMessage['parts'][number] => {\n if (type === 'image_url') {\n // base64\n const url = image_url?.url || ''\n const mimeType = url.includes('data:image/png') ? 'image/png' : 'image/jpeg'\n return {\n inlineData: {\n data: url.split('base64,')[1] || '',\n mimeType\n }\n }\n } else {\n return {\n text: text || ''\n }\n }\n })\n }\n return []\n }\n return messages.map((message) => {\n if (message.role === 'user' || message.role === 'system') {\n return {\n role: 'user',\n parts: contentToParts(message.content)\n }\n } else {\n return {\n role: 'model',\n parts: contentToParts(message.content)\n }\n }\n })\n }\n\n static createChatRequestWithJsonSchema(params: {\n googleGenAI: any\n config: Partial<Omit<Config, 'model'>> | (() => Promise<Partial<Omit<Config, 'model'>>>)\n model: string\n }) {\n const googleGenAI: GoogleGenAI = params.googleGenAI\n const removeAdditionalProperties = (schema: any) => {\n if (schema.type === 'object') {\n delete schema.additionalProperties\n Object.keys(schema.properties).forEach((key) => {\n removeAdditionalProperties(schema.properties[key])\n })\n } else if (schema.type === 'array') {\n removeAdditionalProperties(schema.items)\n }\n return schema\n }\n return async (messages: any[], { schema, abortController }: any) => {\n const config = typeof params.config === 'function' ? await params.config() : params.config\n const response = await googleGenAI.models.generateContent({\n model: params.model,\n contents: GoogleCtodService.chatGPTMessageToGoogleChatMessage(messages),\n config: {\n abortSignal: abortController.signal,\n maxOutputTokens: config.maxTokens,\n temperature: config.temperature,\n responseMimeType: 'application/json',\n responseJsonSchema: validateToJsonSchema(schema.output)\n }\n })\n return response.text || ''\n }\n }\n\n createChat() {\n return new GoogleChat(this)\n }\n\n createImagesGeneration() {\n return new GoogleImagesGeneration(this)\n }\n}\n", "import { AnthropicCtodService } from './index.js'\n\ntype AnthropicSdk = AnthropicCtodService['anthropicSdk']\n\nexport type Message = {\n role: string\n content: string\n}\n\nexport type Config = {\n /**\n * @zh \u9078\u64C7\u904B\u884C\u7684\u6A21\u578B\u3002\n * @en What model to use.\n */\n model: string\n maxTokens: number\n temperature: number\n}\n\nexport class AnthropicChatDataGenerator {\n private config: () => Config\n constructor(config: () => Config) {\n this.config = config\n }\n\n /**\n * \u79FB\u9664 system \u8A0A\u606F\n */\n\n private translateMessages(messages: any[]) {\n return {\n system: messages.find(e => e.role === 'system')?.content,\n messages: messages.filter(e => e.role !== 'system')\n }\n }\n\n createChatAndStructureBody(messages: Message[], jsonSchema: any): Parameters<AnthropicSdk['messages']['create']>[0] {\n const config = this.config()\n const translateMessages = this.translateMessages(messages)\n return {\n model: config.model,\n max_tokens: config.maxTokens,\n temperature: config.temperature,\n system: translateMessages.system,\n messages: translateMessages.messages,\n tools: [\n {\n name: 'data',\n description: 'Response Data',\n input_schema: jsonSchema\n }\n ],\n tool_choice: {\n type: 'tool',\n name: 'data'\n }\n }\n }\n\n parseChatAndStructureResult(result: Awaited<ReturnType<AnthropicSdk['messages']['create']>>): string {\n let toolUseContent: any = 'content' in result ? result.content.find(e => e.type === 'tool_use') : null\n let response = toolUseContent?.input || null\n if (response == null) {\n return 'null'\n }\n return JSON.stringify(response)\n }\n\n createTalkBody(messages: Message[]): Parameters<AnthropicSdk['messages']['create']>[0] {\n const config = this.config()\n const newMessages = this.translateMessages(messages)\n return {\n model: config.model,\n max_tokens: config.maxTokens,\n temperature: config.temperature,\n system: newMessages.system,\n messages: newMessages.messages\n }\n }\n\n parseTalkResult(result: Awaited<ReturnType<AnthropicSdk['messages']['create']>>): string {\n let output = ''\n let textContent: any = 'content' in result ? result.content.find(e => e.type === 'text') : null\n if (textContent) {\n output = textContent.text\n }\n return output\n }\n\n createTalkStreamBody(messages: Message[]): Parameters<AnthropicSdk['messages']['create']>[0] {\n const config = this.config()\n const newMessages = this.translateMessages(messages)\n return {\n model: config.model,\n max_tokens: config.maxTokens,\n temperature: config.temperature,\n system: newMessages.system,\n stream: true,\n messages: newMessages.messages\n }\n }\n}\n\nexport class AnthropicChat {\n anthropic: AnthropicCtodService\n dataGenerator = new AnthropicChatDataGenerator(() => this.config)\n config: Config = {\n model: 'claude-3-5-haiku-latest',\n maxTokens: 8192,\n temperature: 0.7\n }\n\n constructor(anthropic: AnthropicCtodService) {\n this.anthropic = anthropic\n }\n\n /**\n * @zh \u6539\u8B8A\u5C0D\u8A71\u7684\u4E00\u4E9B\u8A2D\u5B9A\n * @en Change some settings of the conversation\n */\n\n setConfig(options: Partial<Config>) {\n Object.assign(this.config, options)\n }\n\n /**\n * @zh \u9032\u884C\u5C0D\u8A71\uFF0C\u4E26\u4E14\u4EE5\u7D50\u69CB\u5316\u7684\u65B9\u5F0F\u8F38\u51FA\n * @en Talk to the AI and output in a structured way\n */\n\n async chatAndStructure(messages: Message[], jsonSchema: any, options?: { abortController?: AbortController }) {\n const anthropic = this.anthropic.anthropicSdk\n const body = this.dataGenerator.createChatAndStructureBody(messages, jsonSchema)\n const msg = await anthropic.messages.create(body, {\n signal: options?.abortController?.signal\n })\n return this.dataGenerator.parseChatAndStructureResult(msg)\n }\n\n /**\n * @zh \u9032\u884C\u5C0D\u8A71\n * @en Talk to the AI\n */\n\n async talk(messages: Message[] = []) {\n const anthropic = this.anthropic.anthropicSdk\n const body = this.dataGenerator.createTalkBody(messages)\n const msg = await anthropic.messages.create(body)\n return this.dataGenerator.parseTalkResult(msg)\n }\n\n /**\n * @zh \u9032\u884C\u5C0D\u8A71\uFF0C\u4E26\u4E14\u4EE5\u4E32\u6D41\u7684\u65B9\u5F0F\u8F38\u51FA\n * @en Talk to the AI and output in a streaming way\n */\n\n talkStream(params: {\n messages: Message[]\n onMessage: (_message: string) => void\n onEnd: () => void\n onWarn: (_warn: any) => void\n onError: (_error: any) => void\n }) {\n let stream: Extract<Awaited<ReturnType<typeof anthropic.messages.create>>, { controller: any }> | null = null\n const anthropic = this.anthropic.anthropicSdk\n const { onMessage, onEnd, onError } = params\n const body = this.dataGenerator.createTalkStreamBody(params.messages)\n const performStreamedChat = async () => {\n try {\n let result = await anthropic.messages.create(body)\n if (result != null && 'controller' in result) {\n stream = result\n for await (const messageStream of stream) {\n if (messageStream.type === 'content_block_delta') {\n const deltaText = 'text' in messageStream.delta ? messageStream.delta.text : ''\n onMessage(deltaText)\n }\n }\n }\n onEnd()\n } catch (error) {\n onError(error)\n }\n }\n performStreamedChat()\n return {\n cancel: () => {\n const int = setInterval(() => {\n if (stream && stream.controller) {\n stream.controller.abort()\n clearInterval(int)\n }\n }, 10)\n }\n }\n }\n}\n\nexport type AnthropicChatTalkResponse = Awaited<ReturnType<AnthropicChat['talk']>>\n", "import { validateToJsonSchema } from '../../utils/validate.js'\nimport { Config, AnthropicChat } from './chat.js'\nimport type { Anthropic } from '@anthropic-ai/sdk'\n\ntype GPTContent = {\n type: 'image_url' | 'text'\n text?: string\n image_url?: {\n url: string\n detail?: string\n }\n}\n\ntype GPTMessage = {\n role: string\n content: string | GPTContent[]\n}\n\nexport class AnthropicCtodService {\n anthropicSdk: Anthropic\n\n constructor(anthropicSdk: any) {\n this.anthropicSdk = anthropicSdk\n }\n\n static chatGPTMessageToAnthropicChatMessage(messages: GPTMessage[]): any[] {\n const newMessage = messages.map(e => {\n return {\n role: e.role,\n content: typeof e.content === 'string'\n ? e.content\n : e.content.map((content) => {\n if (content.type === 'image_url') {\n const url = content.image_url?.url || ''\n return {\n type: 'image',\n source: {\n type: 'base64',\n media_type: url.slice(5).split(';')[0],\n data: url.split(',')[1]\n }\n }\n }\n return {\n type: 'text',\n text: content.text\n }\n })\n }\n })\n return newMessage\n }\n\n static createChatRequestWithJsonSchema(params: {\n anthropicSdk: any\n config?: Partial<Config>\n }) {\n const anthropic = new AnthropicCtodService(params.anthropicSdk)\n const chat = anthropic.createChat()\n chat.setConfig(params.config || {})\n return async (messages: any[], { schema, abortController }: any) => {\n const jsonSchema = validateToJsonSchema(schema.output)\n const content = await chat.chatAndStructure(messages, jsonSchema, {\n abortController\n })\n return content\n }\n }\n\n createChat() {\n return new AnthropicChat(this)\n }\n}\n", "import axios from 'axios'\nimport { XChat, Config } from './chat.js'\nimport { XImagesGeneration } from './images-generation.js'\nimport { validateToJsonSchema } from '../../utils/validate.js'\n\nexport class XCtodService {\n _axios = axios.create()\n _apiKey = ''\n\n static createChatRequest(\n apiKey: string | (() => Promise<string>),\n config: Partial<Config> | (() => Promise<Partial<Config>>) = {},\n options?: {\n axios?: any\n }\n ) {\n return async(messages: any[], { onCancel }: any) => {\n const xAi = new XCtodService(typeof apiKey === 'string' ? apiKey : await apiKey())\n const chat = xAi.createChat()\n const abortController = new AbortController()\n if (options && options.axios) {\n xAi.setAxios(options.axios)\n }\n chat.setConfig(typeof config === 'function' ? await config() : config)\n onCancel(() => abortController.abort())\n const { text } = await chat.talk(messages, {\n abortController\n })\n return text\n }\n }\n\n static createChatRequestWithJsonSchema(params: {\n axios?: any\n apiKey: string | (() => Promise<string>)\n config?: Partial<Pick<Config, 'model' | 'temperature'>> | (() => Promise<Partial<Pick<Config, 'model' | 'temperature'>>>)\n }) {\n return async(messages: any[], { schema, abortController }: any) => {\n const xAi = new XCtodService(typeof params.apiKey === 'string' ? params.apiKey : await params.apiKey())\n const chat = xAi.createChat()\n if (params.config) {\n chat.setConfig(typeof params.config === 'function' ? await params.config() : params.config)\n }\n if (params.axios) {\n xAi.setAxios(params.axios)\n }\n const jsonSchema = validateToJsonSchema(schema.output)\n const { text } = await chat.talk(messages, {\n abortController,\n jsonSchema: {\n name: 'data',\n strict: true,\n schema: jsonSchema\n }\n })\n return text\n }\n }\n\n constructor(apiKey = '') {\n this._apiKey = apiKey\n }\n\n /**\n * @zh \u5982\u679C\u4F60\u6709\u9700\u8981\u7279\u5225\u8A2D\u5B9A axios\uFF0C\u8ACB\u4F7F\u7528\u9019\u65B9\u6CD5\u3002\n * @en If you need to set axios, please use this method.\n */\n\n setAxios(axios: any) {\n this._axios = axios\n }\n\n /**\n * @zh \u8A2D\u5B9A api key\u3002\n * @en Set api key.\n */\n\n setConfiguration(apiKey: string) {\n this._apiKey = apiKey\n }\n\n createChat() {\n return new XChat(this)\n }\n\n createImagesGeneration() {\n return new XImagesGeneration(this)\n }\n}\n", "import { json } from 'power-helper'\nimport { XCtodService } from './index.js'\n\nexport type XMessage = {\n role: 'system' | 'user' | 'assistant'\n name?: string\n content: string\n}\n\ntype ApiResponse = {\n id: string\n object: string\n created: number\n choices: Array<{\n index: number\n finish_reason: string\n message: {\n role: 'system' | 'user' | 'assistant'\n name?: string\n content: string\n }\n }>\n usage: {\n prompt_tokens: number\n completion_tokens: number\n total_tokens: number\n }\n}\n\nexport type Config = {\n /**\n * @zh \u4E00\u6B21\u56DE\u61C9\u6578\u91CF\n * @en How many chat completion choices to generate for each input message.\n */\n n: number\n /**\n * @zh \u9078\u64C7\u904B\u884C\u7684\u6A21\u578B'\n * @en The model to use for this chat completion.\n */\n model: string\n /**\n * @zh \u5192\u96AA\u6307\u6578\uFF0C\u6578\u503C\u7531 0 ~ 2 \u4E4B\u9593\uFF0C\u8D8A\u4F4E\u56DE\u61C9\u8D8A\u7A69\u5B9A\u3002\n * @en What sampling temperature to use, between 0 and 2. Higher values like 0.8 will make the output more random, while lower values like 0.2 will make it more focused and deterministic.\n */\n temperature: number\n /**\n * @zh \u662F\u5426\u5F37\u5236\u8981\u56DE\u50B3 JSON \u683C\u5F0F\u7684\u8CC7\u6599\n * @en Whether to force the return of JSON format data\n */\n forceJsonFormat: boolean\n /**\n * @zh \u6BCF\u6B21\u5C0D\u8A71\u6700\u591A\u7522\u751F\u5E7E\u500B tokens\u3002\n * @en How many tokens to complete to.\n */\n maxTokens?: number\n}\n\nexport class XChat {\n xAi: XCtodService\n config: Config = {\n n: 1,\n model: 'grok-3',\n temperature: 1,\n maxTokens: undefined,\n forceJsonFormat: true\n }\n\n constructor(xAi: XCtodService) {\n this.xAi = xAi\n }\n\n /**\n * @zh \u6539\u8B8A\u5C0D\u8A71\u7684\u4E00\u4E9B\u8A2D\u5B9A\n * @en Change some settings of the conversation\n */\n\n setConfig(options: Partial<Config>) {\n Object.assign(this.config, options)\n }\n\n /**\n * @zh \u9032\u884C\u5C0D\u8A71\n * @en Talk to the AI\n */\n\n async talk(messages: XMessage[] = [], options?: {\n /** \u8981 forceJsonFormat \u70BA true \u624D\u6703\u751F\u6548 */\n jsonSchema?: any\n abortController?: AbortController\n }) {\n const newMessages = json.jpjs(messages)\n let response_format: any = undefined\n if (this.config.forceJsonFormat) {\n response_format = {\n type: 'json_object'\n }\n }\n if (this.config.forceJsonFormat && options?.jsonSchema) {\n response_format = {\n type: 'json_schema',\n json_schema: options.jsonSchema\n }\n }\n const result = await this.xAi._axios.post<ApiResponse>('https://api.x.ai/v1/chat/completions', {\n model: this.config.model,\n n: this.config.n,\n messages: newMessages,\n response_format,\n temperature: this.config.temperature\n }, {\n signal: options?.abortController?.signal,\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${this.xAi._apiKey}`\n }\n })\n const choices = result.data.choices || []\n const message = choices[0]?.message || {\n role: 'assistant',\n content: ''\n }\n newMessages.push(message)\n return {\n id: result?.data.id as string,\n text: message.content as string,\n newMessages,\n isDone: choices[0]?.finish_reason === 'stop',\n apiResponse: result.data\n }\n }\n\n talkStream(params: {\n messages: any[]\n onMessage: (_message: string) => void\n onEnd: () => void\n onWarn: (_warn: any) => void\n onError: (_error: any) => void\n }) {\n const controller = new AbortController()\n fetch('https://api.x.ai/v1/chat/completions', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${this.xAi._apiKey}`\n },\n body: JSON.stringify({\n model: this.config.model,\n stream: true,\n messages: params.messages\n }),\n signal: controller.signal\n }).then(async response => {\n if (!response.ok) {\n const errorText = await response.text()\n throw new Error(`Error: ${errorText}`)\n }\n const reader = response.body?.pipeThrough(new TextDecoderStream()).getReader()\n if (!reader) {\n throw new Error('Can not get reader')\n }\n while (true) {\n const { value, done } = await reader.read()\n if (done) {\n break\n }\n const items = value.split('\\n')\n for (let item of items) {\n if (item.length === 0) {\n continue\n }\n if (item.startsWith(':')) {\n continue\n }\n if (item === 'data: [DONE]') {\n params.onEnd()\n break\n }\n try {\n const result = JSON.parse(item.substring(6))\n const content = result.choices[0].delta.content\n params.onMessage(content)\n } catch (error) {\n params.onWarn(error)\n }\n }\n }\n }).catch(error => {\n if (error.name === 'AbortError') {\n params.onEnd()\n } else {\n params.onError(error)\n }\n })\n return {\n cancel: () => controller.abort()\n }\n }\n\n /**\n * @zh \u958B\u555F\u6301\u7E8C\u6027\u5C0D\u8A71\n */\n\n async keepTalk(prompt: string | string[], oldMessages: XMessage[] = []) {\n const result = await this.talk([\n ...oldMessages,\n {\n role: 'user',\n content: Array.isArray(prompt) ? prompt.join('\\n') : prompt\n }\n ])\n return {\n result,\n nextTalk: (prompt: string | string[]) => this.keepTalk(prompt, result.newMessages)\n }\n }\n}\n", "import { XCtodService } from './index.js'\n\ntype ApiResponse = {\n created: string\n data: {\n b64_json: string\n }[]\n}\n\ntype Config = {\n /**\n * @zh \u6A21\u578B\uFF0C\u652F\u63F4 grok-2-image\n * @en Model, support grok-2-image\n */\n model: 'grok-2-image'\n}\n\nexport class XImagesGeneration {\n private xAi: XCtodService\n private config: Config = {\n model: 'grok-2-image'\n }\n\n constructor(xAi: XCtodService) {\n this.xAi = xAi\n }\n\n /**\n * @zh \u6539\u8B8A\u5C0D\u8A71\u7684\u4E00\u4E9B\u8A2D\u5B9A\n * @en Change some settings of the conversation\n */\n\n setConfig(options: Partial<Config>) {\n Object.assign(this.config, options)\n }\n\n /**\n * @zh \u7522\u751F\u5716\u7247\n * @en Generate image\n */\n\n async create(prompt: string) {\n const result = await this.xAi._axios.post<ApiResponse>('https://api.x.ai/v1/images/generations', {\n prompt,\n n: 1,\n model: this.config.model,\n response_format: 'b64_json'\n }, {\n timeout: 1000 * 60 * 5,\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${this.xAi._apiKey}`\n }\n })\n return result.data\n }\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["plugins_exports", "__export", "LimiterPlugin", "LimiterPluginGlobState", "PrintLogPlugin", "RetryPlugin", "RolePlugin", "Event", "ChatBrokerPlugin", "params", "__publicField", "Event", "data", "callback", "retry_default", "ChatBrokerPlugin", "z", "log", "attach", "params", "count", "retry", "messages", "changeMessages", "print_log_default", "ChatBrokerPlugin", "z", "params", "log", "attach", "lastUserMessage", "messages", "parseText", "output", "Event", "flow", "Schedule", "config", "state", "limiter_default", "ChatBrokerPlugin", "attach", "now", "time", "nextId", "uid", "resolve", "id", "off", "role_default", "ChatBrokerPlugin", "z", "attach", "params", "messages", "changeMessages", "PrintLogPlugin", "print_log_default", "RetryPlugin", "retry_default", "LimiterPlugin", "limiter_default", "LimiterPluginGlobState", "RolePlugin", "role_default", "templates_exports", "__export", "requireJsonResponse", "requireJsonResponseWithHandlebars", "requireJsonResponseWithJsonSchema", "Handlebars", "record", "question", "format", "key", "value", "handlebars", "chinese_conv_exports", "__export", "s2t", "t2s", "Converter", "text", "JSON5", "TextParser", "_TextParser", "params", "__publicField", "text", "jsonRegex", "matchedText", "JSON5", "Event", "flow", "Hook", "Log", "z", "toJSONSchema", "validate", "target", "schemaCallback", "z", "validateToJsonSchema", "schema", "toJSONSchema", "ParserError", "error", "parserFails", "__publicField", "Translator", "params", "__publicField", "data", "context", "scheme", "validate", "prompt", "schema", "text", "result", "parserName", "parserFails", "parse", "error", "ParserError", "ChatBroker", "params", "__publicField", "Hook", "Event", "Log", "Translator", "TextParser", "context", "key", "requestId", "data", "id", "flow", "waitCancel", "isCancel", "isSending", "abortController", "listeners", "cancelTrigger", "eventOff", "e", "onCancel", "cb", "request", "schema", "output", "plugins", "metadata", "question", "preMessages", "messages", "ms", "count", "doBreak", "response", "parseText", "retryFlag", "lastUserMessage", "sender", "error", "ParserError", "text", "z", "CtoD", "params", "__publicField", "install", "ChatBroker", "context", "id", "plugins", "data", "metadata", "changeMessages", "changeOutputSchema", "schema", "z", "messages", "e", "axios", "OpenAIVision", "openai", "__publicField", "options", "messages", "result", "message", "json", "OpenAIChat", "openai", "__publicField", "options", "input", "result", "messages", "newMessages", "json", "
|
|
4
|
+
"sourcesContent": ["import Retry from './retry.js'\nimport PrintLog from './print-log.js'\nimport Limiter from './limiter.js'\nimport Role from './role.js'\n\n/**\n * @zh \u4E00\u500B\u57FA\u65BC\u5370\u51FA log \u7684 plugin\u3002\n * @en A plugin based on printing log.\n */\n\nexport const PrintLogPlugin = PrintLog\n\n/**\n * @zh \u7576\u89E3\u6790\u5931\u6557\u6642\uFF0C\u6703\u81EA\u52D5\u91CD\u8A66\u7684\u5C0D\u8A71\u3002\n * @en A conversation that will automatically retry when parsing fails.\n */\n\nexport const RetryPlugin = Retry\n\n/**\n * @zh \u9650\u5236\u4F7F\u7528\u6D41\u91CF\uFF0C\u9019\u500B plugin \u53EF\u4EE5\u6709\u6548\u8B93\u6240\u6709\u5C0D\u8A71\u4E0D\u6703\u518D\u9650\u5236\u5167\u540C\u6642\u767C\u9001\uFF0C\u53EF\u7528\u65BC\u5728\u958B\u767C\u904E\u7A0B\u4E2D\u906D\u9047\u4F3A\u670D\u5668\u56E0\u983B\u7387\u904E\u9AD8\u800C\u963B\u64CB\u8ACB\u6C42\u3002\n * @en Limit the use of traffic. This plugin can effectively prevent all conversations from being sent at the same time within the limit, and can be used when the server blocks requests due to high frequency during development.\n */\n\nexport const LimiterPlugin = Limiter.plugin\n\n/**\n * @zh \u6392\u7A0B\u7CFB\u7D71\u5C07\u5168\u57DF\u8A17\u7BA1\uFF0C\u6709\u4EC0\u9EBC\u5FC5\u8981\u8A2D\u5B9A\u53EF\u4EE5\u4F86\u66F4\u52D5\u5B83\u7684\u72C0\u614B\uFF0C\u4F8B\u5982\uFF1A\u95DC\u9589\u6392\u7A0B\u3002\n * @en The scheduling system will be globally hosted. What is necessary to set can come to change its status, for example: close the schedule.\n */\nexport const LimiterPluginGlobState = Limiter\n\n/**\n * @zh \u8A2D\u5B9A\u89D2\u8272\u626E\u6F14\u3002\n * @en Set role play.\n */\n\nexport const RolePlugin = Role\n", "import { Translator } from './translator.js'\nimport { ChatBrokerHooks } from '../broker/chat.js'\nimport { Log, Hook, Event } from 'power-helper'\nimport { ValidateCallback, ValidateCallbackOutputs } from '../utils/validate.js'\n\ntype BrokerHooks = ChatBrokerHooks<any, any, any, any>\ntype BrokerPluginParams<\n T extends ValidateCallback<any>,\n R extends ValidateCallback<any>\n> = {\n name: string\n params: T\n receiveData: R\n onInstall: (context: {\n log: Log\n params: ValidateCallbackOutputs<T>\n attach: Hook<BrokerHooks>['attach']\n attachAfter: Hook<BrokerHooks>['attachAfter']\n translator: Translator<any, any>\n receive: (callback: (params: {\n id: string\n data: ValidateCallbackOutputs<R>\n }) => void) => void\n }) => void\n}\n\nexport class ChatBrokerPlugin<\n T extends ValidateCallback<any>,\n R extends ValidateCallback<any>\n> {\n _event = new Event()\n _params: BrokerPluginParams<T, R>\n constructor(params: BrokerPluginParams<T, R>) {\n this._params = params\n }\n\n use(params: ValidateCallbackOutputs<T>) {\n return {\n instance: this as any,\n params,\n send: (data: ValidateCallbackOutputs<R>) => { this._event.emit('receive', data) },\n receive: (callback: any) => { this._event.on('receive', callback) },\n __receiveData: null as unknown as ValidateCallbackOutputs<R>\n }\n }\n}\n", "import { ChatBrokerPlugin } from '../core/plugin.js'\n\nexport default new ChatBrokerPlugin({\n name: 'retry',\n params: z => {\n return {\n retry: z.number().default(1),\n printWarn: z.boolean().default(true)\n }\n },\n receiveData: () => {\n return {}\n },\n onInstall({ log, attach, params }) {\n attach('parseFailed', async({ count, retry, messages, changeMessages }) => {\n if (count <= params.retry) {\n if (params.printWarn) {\n log.print(`Is Failed, Retry ${count} times.`)\n }\n changeMessages(messages)\n retry()\n }\n })\n }\n})\n", "import { ChatBrokerPlugin } from '../core/plugin.js'\n\nexport default new ChatBrokerPlugin({\n name: 'print-log',\n params: z => {\n return {\n detail: z.boolean().default(false)\n }\n },\n receiveData: () => {\n return {}\n },\n onInstall({ params, log, attach }) {\n attach('talkBefore', async({ lastUserMessage, messages }) => {\n log.print('Send:', { color: 'green' })\n if (params.detail) {\n log.print('\\n' + JSON.stringify(messages, null, 4))\n } else {\n log.print('\\n' + lastUserMessage)\n }\n })\n attach('talkAfter', async({ parseText }) => {\n log.print('Receive:', { color: 'cyan' })\n log.print('\\n' + parseText)\n })\n attach('succeeded', async({ output }) => {\n log.print('Output:', { color: 'yellow' })\n try {\n log.print('\\n' + JSON.stringify(output, null, 4))\n } catch (error) {\n log.print('\\n' + output)\n }\n })\n }\n})\n", "import { ChatBrokerPlugin } from '../core/plugin.js'\nimport { Event, flow, Schedule } from 'power-helper'\n\ntype Events = {\n run: {\n id: string\n }\n waitTimeChange: {\n waitTime: number\n }\n}\n\nconst config = {\n limit: 3,\n interval: 60000,\n}\n\nconst state = {\n event: new Event<Events>(),\n schedule: null as Schedule | null,\n waitTimes: [] as number[],\n waitQueue: [] as string[]\n}\n\nexport default {\n /**\n * @zh \u4F60\u53EF\u4EE5\u76E3\u807D\u4E00\u4E9B\u4E8B\u4EF6\u884C\u70BA\uFF0C\u4F8B\u5982\u9084\u9700\u8981\u7B49\u5F85\u591A\u5C11\u6642\u9593\u3002\n * @en You can listen for some event behaviors, such as how long you still need to wait.\n */\n\n event: state.event,\n\n /**\n * @zh \u9810\u8A2D\u662F\u6BCF\u5206\u9418\u9650\u52363\u6B21\uFF0C\u4F60\u53EF\u4EE5\u5728\u8A2D\u5B9A\u4E2D\u6539\u8B8A\u9650\u5236\u6D41\u91CF\u3002\n * @en By default, the limit is 3 times per minute, and you can change the limit flow in the settings.\n */\n\n config,\n\n /**\n * @zh \u7531\u65BC\u6392\u7A0B\u6703\u5728\u80CC\u666F\u6301\u7E8C\u5012\u6578\uFF0C\u5982\u679C\u6709\u95DC\u9589\u7A0B\u5F0F\u7684\u9700\u6C42\uFF0C\u9700\u8981\u624B\u52D5\u9032\u884C\u79FB\u9664\u3002\n * @en Since the schedule will continue to count down in the background, if there is a need to close the program, you need to manually remove it.\n */\n\n closeSchedule: () => {\n if (state.schedule) {\n state.schedule.close()\n state.schedule = null\n }\n },\n\n /**\n * @zh Plugin \u7684\u63A5\u53E3\n * @en Plugin interface\n */\n\n plugin: new ChatBrokerPlugin({\n name: 'limiter',\n params: () => {\n return {}\n },\n receiveData: () => {\n return {}\n },\n onInstall({ attach }) {\n if (state.schedule == null) {\n state.schedule = new Schedule()\n state.schedule.add('calc queue', 1000, async() => {\n const now = Date.now()\n state.waitTimes = state.waitTimes.filter(time => {\n return now - time < config.interval\n })\n if (state.waitTimes.length !== config.limit) {\n let nextId = state.waitQueue.shift()\n if (nextId) {\n state.waitTimes.push(Date.now())\n state.event.emit('run', {\n id: nextId\n })\n }\n } else if (state.waitTimes[0]) {\n state.event.emit('waitTimeChange', {\n waitTime: Math.floor(60 - (now - state.waitTimes[0]) / 1000)\n })\n }\n })\n state.schedule.play()\n }\n attach('talkBefore', async() => {\n const uid = flow.createUuid()\n state.waitQueue.push(uid)\n return new Promise(resolve => {\n state.event.on('run', ({ id }, { off }) => {\n if (id === uid) {\n off()\n resolve()\n }\n })\n })\n })\n }\n })\n}\n", "import { ChatBrokerPlugin } from '../core/plugin.js'\n\nexport default new ChatBrokerPlugin({\n name: 'role',\n params: z => {\n return {\n role: z.string()\n }\n },\n receiveData: () => {\n return {}\n },\n onInstall({ attach, params }) {\n attach('start', async({ messages, changeMessages }) => {\n changeMessages([\n {\n role: 'user',\n content: `\u4F60\u73FE\u5728\u662F${params.role}\u3002`\n },\n {\n role: 'assistant',\n content: `\u6C92\u554F\u984C\uFF0C\u6211\u73FE\u5728\u662F${params.role}\uFF0C\u6709\u4EC0\u9EBC\u53EF\u4EE5\u5E6B\u4F60\u7684\u55CE\uFF1F`\n },\n ...messages\n ])\n })\n }\n})\n", "import Handlebars from 'handlebars'\nimport { record } from 'power-helper'\n\ntype JsonResponseFormat = {\n desc: string\n example: any\n}\n\n/**\n * @zh \u5354\u52A9\u4F7F\u7528\u8005\u5C07\u683C\u5F0F\u9700\u6C42\u8F49\u6210\u8AD6\u6558\u8A9E\u53E5\u3002\n * @en Assist the user in converting the formatting requirements into declarative sentences.\n */\n\nexport const requireJsonResponse = (question: string | string[], format: Record<string, JsonResponseFormat>) => {\n return [\n ...(Array.isArray(question) ? question : [question]),\n 'Please respond using the following JSON format and minify the JSON without including any explanation: ',\n '{',\n Object.entries(format).map(([key, value]) => {\n return [\n `/* ${value.desc} */`,\n `\"${key}\": ${JSON.stringify(value.example)}`,\n ].join('\\n')\n }).join(',\\n'),\n '}'\n ].join('\\n')\n}\n\n/**\n * @zh \u5354\u52A9\u4F7F\u7528\u8005\u5C07\u683C\u5F0F\u9700\u6C42\u8F49\u6210\u8AD6\u6558\u8A9E\u53E5\uFF0C\u652F\u63F4 Handlebars\u3002\n * @en Assist the user in converting the formatting requirements into declarative sentences, support Handlebars.\n */\n\nexport const requireJsonResponseWithHandlebars = (\n value: Record<string, any>,\n question: string | string[],\n format: Record<string, JsonResponseFormat>\n) => {\n const handlebars = Handlebars.create()\n\n handlebars.registerHelper('DATA', function(this: any, value) {\n return JSON.stringify(value)\n })\n\n handlebars.registerHelper('ENV', function(this: any, value) {\n return this.__envs && value ? this.__envs[value] : ''\n })\n\n handlebars.registerHelper('INPUT', function(this: any) {\n return JSON.stringify(record.omit(this, ['__envs']))\n })\n\n handlebars.registerHelper('JOIN', function(this: any, value) {\n return Array.isArray(value) ? value.join() : JSON.stringify(value)\n })\n\n return handlebars.compile(requireJsonResponse(question, format))(value)\n}\n\n/**\n * @zh \u5354\u52A9\u4F7F\u7528\u8005\u5C07\u683C\u5F0F\u9700\u6C42\u8F49\u6210\u8AD6\u6558\u8A9E\u53E5\uFF0C\u4E26\u652F\u63F4 Json Schema\u3002\n * @en Assist the user in converting the formatting requirements into declarative sentences, and support Json Schema.\n */\n\nexport const requireJsonResponseWithJsonSchema = (question: string | string[], format: Record<string, any>) => {\n return [\n ...(Array.isArray(question) ? question : [question]),\n 'Please provide JSON data according to the following JSON Schema format:',\n JSON.stringify(format)\n ].join('\\n')\n}\n", "import { Converter } from 'opencc-js'\n\n/**\n * @zh \u7E41\u4F53\u8F6C\u7B80\u4F53\n * @en Traditional to Simplified\n*/\nexport const t2s = (text: string) => {\n const converter = Converter({\n from: 'tw',\n to: 'cn'\n })\n return converter(text)\n}\n\n/**\n * @zh \u7B80\u4F53\u8F6C\u7E41\u4F53\n * @en Simplified to Traditional\n */\nexport const s2t = (text: string) => {\n const converter = Converter({\n from: 'cn',\n to: 'tw'\n })\n return converter(text)\n}\n", "import JSON5 from 'json5'\n\ntype TextParserParams = {\n /**\n * @zh \u89E3\u8B80\u5668\u540D\u5B57\u3002\n * @en The name of the parser.\n */\n name: string\n /**\n * @zh \u89E3\u8B80\u6587\u672C\u3002\n * @en Read the text.\n */\n handler: (text: string) => Promise<any>\n}\n\nexport class TextParser {\n private params: TextParserParams\n\n /**\n * @zh \u76E1\u53EF\u80FD\u5C07\u6587\u5B57\u5167\u7684 json \u89E3\u8B80\u51FA\u4F86\u3002\n * @en Try to read the json in the text as much as possible.\n */\n\n static JsonMessage() {\n return new TextParser({\n name: 'JsonMessage',\n handler: async (text) => {\n try {\n const result = JSON.parse(text)\n return result\n } catch (error) {\n const jsonRegex = /{(?:[^{}]|(?:{[^{}]*}))*}/\n const matchedText = text.match(jsonRegex)?.[0] || ''\n return JSON5.parse(matchedText)\n }\n }\n })\n }\n\n constructor(params: TextParserParams) {\n this.params = params\n }\n\n /**\n * @zh \u89E3\u8B80\u5668\u540D\u5B57\u3002\n * @en The name of the parser.\n */\n\n get name() {\n return this.params.name\n }\n\n /**\n * @zh \u89E3\u8B80\u6587\u672C\u3002\n * @en Read the text.\n */\n\n async read(text: string) {\n const result = await this.params.handler(text)\n return result\n }\n}\n", "import { TextParser } from '../core/parser.js'\nimport { ChatBrokerPlugin } from '../core/plugin.js'\nimport { Event, flow, Hook, Log } from 'power-helper'\nimport { Translator, TranslatorParams } from '../core/translator.js'\nimport { ValidateCallback, ValidateCallbackOutputs, validateToJsonSchema } from '../utils/validate.js'\nimport { ParserError } from '../utils/error.js'\nimport { z } from 'zod'\n\nexport type Message = {\n role: 'system' | 'user' | 'assistant' | (string & Record<string, unknown>)\n name?: string\n content: string\n}\n\nexport type ChatBrokerHooks<\n S extends ValidateCallback<any>,\n O extends ValidateCallback<any>,\n P extends ChatBrokerPlugin<any, any>,\n PS extends Record<string, ReturnType<P['use']>>\n> = {\n\n /**\n * @zh \u7B2C\u4E00\u6B21\u804A\u5929\u7684\u6642\u5019\u89F8\u767C\n * @en Triggered when chatting for the first time\n */\n\n start: {\n id: string\n data: ValidateCallbackOutputs<S>\n metadata: Map<string, any>\n plugins: {\n [K in keyof PS]: {\n send: (data: PS[K]['__receiveData']) => void\n }\n }\n schema: {\n input?: S\n output: O\n }\n messages: Message[]\n setPreMessages: (messages: (Omit<Message, 'content'> & { content: string | string[] })[]) => void\n changeMessages: (messages: Message[]) => void\n changeOutputSchema: (output: O) => void\n }\n\n /**\n * @zh \u767C\u9001\u804A\u5929\u8A0A\u606F\u7D66\u6A5F\u5668\u4EBA\u524D\u89F8\u767C\n * @en Triggered before sending chat message to bot\n */\n\n talkBefore: {\n id: string\n data: ValidateCallbackOutputs<S>\n messages: Message[]\n metadata: Map<string, any>\n lastUserMessage: string\n }\n\n /**\n * @zh \u7576\u804A\u5929\u6A5F\u5668\u4EBA\u56DE\u50B3\u8CC7\u6599\u7684\u6642\u5019\u89F8\u767C\n * @en Triggered when the chatbot returns data\n */\n\n talkAfter: {\n id: string\n data: ValidateCallbackOutputs<S>\n response: any\n messages: Message[]\n parseText: string\n metadata: Map<string, any>\n lastUserMessage: string\n /**\n * @zh \u5BA3\u544A\u89E3\u6790\u5931\u6557\n * @en Declare parsing failure\n */\n parseFail: (error: any) => void\n changeParseText: (text: string) => void\n }\n\n /**\n * @zh \u7576\u56DE\u50B3\u8CC7\u6599\u7B26\u5408\u898F\u683C\u6642\u89F8\u767C\n * @en Triggered when the returned data meets the specifications\n */\n\n succeeded: {\n id: string\n metadata: Map<string, any>\n output: ValidateCallbackOutputs<O>\n }\n\n /**\n * @zh \u7576\u56DE\u50B3\u8CC7\u6599\u4E0D\u7B26\u5408\u898F\u683C\uFF0C\u6216\u662F\u89E3\u6790\u932F\u8AA4\u6642\u89F8\u767C\n * @en Triggered when the returned data does not meet the specifications or parsing errors\n */\n\n parseFailed: {\n id: string\n error: any\n retry: () => void\n count: number\n response: any\n metadata: Map<string, any>\n parserFails: { name: string, error: any }[]\n messages: Message[]\n lastUserMessage: string\n changeMessages: (messages: Message[]) => void\n }\n\n /**\n * @zh \u4E0D\u8AD6\u6210\u529F\u5931\u6557\uFF0C\u57F7\u884C\u7D50\u675F\u7684\u6642\u5019\u6703\u57F7\u884C\u3002\n * @en It will be executed when the execution is completed, regardless of success or failure.\n */\n\n done: {\n id: string\n metadata: Map<string, any>\n }\n}\n\nexport type RequestContext = {\n id: string\n count: number\n isRetry: boolean\n metadata: Map<string, any>\n abortController: AbortController\n onCancel: (cb: () => void) => void\n schema: {\n input: any\n output: any\n }\n}\n\nexport type Params<\n S extends ValidateCallback<any>,\n O extends ValidateCallback<any>,\n C extends Record<string, any>,\n P extends ChatBrokerPlugin<any, any>,\n PS extends Record<string, ReturnType<P['use']>>\n> = Omit<TranslatorParams<S, O>, 'parsers'> & {\n name?: string\n plugins?: PS | (() => PS)\n request: (messages: Message[], context: RequestContext) => Promise<string>\n install?: (context: {\n log: Log\n attach: Hook<C>['attach']\n attachAfter: Hook<C>['attachAfter']\n translator: Translator<S, O>\n }) => void\n}\n\nexport class ChatBroker<\n S extends ValidateCallback<any>,\n O extends ValidateCallback<any>,\n P extends ChatBrokerPlugin<any, any>,\n PS extends Record<string, ReturnType<P['use']>>,\n C extends ChatBrokerHooks<S, O, P, PS> = ChatBrokerHooks<S, O, P, PS>\n> {\n protected __hookType!: C\n protected log: Log\n protected hook = new Hook<C>()\n protected params: Params<S, O, C, P, PS>\n protected plugins = {} as PS\n protected installed = false\n protected translator: Translator<S, O>\n protected event = new Event<{\n cancel: {\n requestId: string\n }\n cancelAll: any\n }>()\n\n constructor(params: Params<S, O, C, P, PS>) {\n this.log = new Log(params.name ?? 'no name')\n this.params = params\n this.translator = new Translator({\n ...params,\n parsers: [\n TextParser.JsonMessage()\n ]\n })\n }\n\n protected _install(): any {\n if (this.installed === false) {\n this.installed = true\n const context = {\n log: this.log,\n attach: this.hook.attach.bind(this.hook),\n attachAfter: this.hook.attachAfter.bind(this.hook),\n translator: this.translator\n }\n if (this.params.plugins) {\n this.plugins = typeof this.params.plugins === 'function' ? this.params.plugins() : this.params.plugins\n for (let key in this.plugins) {\n this.plugins[key].instance._params.onInstall({\n ...context,\n params: this.plugins[key].params,\n receive: this.plugins[key].receive\n })\n }\n }\n this.params.install?.(context)\n }\n }\n\n async cancel(requestId?: string) {\n if (requestId) {\n this.event.emit('cancel', {\n requestId\n })\n } else {\n this.event.emit('cancelAll', {})\n }\n }\n\n requestWithId<T extends Translator<S, O>>(data: T['__schemeType']): {\n id: string\n request: Promise<T['__outputType']>\n } {\n this._install()\n let id = flow.createUuid()\n let waitCancel = null as (() => void) | null\n let isCancel = false\n let isSending = false\n let abortController = new AbortController()\n\n // =================\n //\n // event\n //\n\n const listeners = [\n this.event.on('cancel', ({ requestId }) => {\n if (requestId === id) {\n cancelTrigger()\n }\n }),\n this.event.on('cancelAll', () => {\n cancelTrigger()\n })\n ]\n const eventOff = () => listeners.forEach(e => e.off())\n const cancelTrigger = () => {\n if (isCancel === false) {\n if (isSending && waitCancel) {\n waitCancel()\n }\n abortController.abort()\n isCancel = true\n eventOff()\n }\n }\n const onCancel = (cb: () => void) => {\n waitCancel = () => {\n cb()\n }\n }\n\n // =================\n //\n // main\n //\n\n let request = async() => {\n let schema = this.translator.getValidate()\n let output: any = null\n let plugins = {} as any\n let metadata = new Map()\n let question = await this.translator.compile(data, {\n schema\n })\n let preMessages: Message[] = []\n let messages: Message[] = []\n if (question.prompt) {\n messages.push({\n role: 'user',\n content: question.prompt\n })\n }\n for (let key in this.plugins) {\n plugins[key] = {\n send: (data: any) => this.plugins[key].send({\n id,\n data\n })\n }\n }\n await this.hook.notify('start', {\n id,\n data,\n schema,\n plugins,\n messages,\n metadata,\n setPreMessages: ms => {\n preMessages = ms.map(e => {\n return {\n ...e,\n content: Array.isArray(e.content) ? e.content.join('\\n') : e.content\n }\n })\n },\n changeMessages: ms => {\n messages = ms\n },\n changeOutputSchema: output => {\n this.translator.changeOutputSchema(output)\n schema = this.translator.getValidate()\n }\n })\n messages = [\n ...preMessages,\n ...messages\n ]\n await flow.asyncWhile(async ({ count, doBreak }) => {\n if (count >= 99) {\n return doBreak()\n }\n let response = ''\n let parseText = ''\n let retryFlag = false\n let lastUserMessage = messages.filter(e => e.role === 'user').slice(-1)[0]?.content || ''\n try {\n await this.hook.notify('talkBefore', {\n id,\n data,\n messages,\n metadata,\n lastUserMessage\n })\n const sender = this.params.request(messages, {\n id,\n count,\n schema,\n onCancel,\n metadata,\n abortController,\n isRetry: retryFlag\n })\n if (isCancel) {\n if (waitCancel) {\n waitCancel()\n }\n abortController.abort()\n } else {\n try {\n isSending = true\n response = await sender\n parseText = response\n } finally {\n isSending = false\n }\n }\n if (isCancel === false) {\n await this.hook.notify('talkAfter', {\n id,\n data,\n response,\n messages,\n parseText,\n metadata,\n lastUserMessage,\n parseFail: (error) => {\n throw new ParserError(error, [])\n },\n changeParseText: text => {\n parseText = text\n }\n })\n output = (await this.translator.parse(parseText)).output\n await this.hook.notify('succeeded', {\n id,\n output,\n metadata\n })\n }\n await this.hook.notify('done', {\n id,\n metadata\n })\n doBreak()\n } catch (error: any) {\n // \u5982\u679C\u89E3\u6790\u932F\u8AA4\uFF0C\u53EF\u4EE5\u9078\u64C7\u662F\u5426\u91CD\u65B0\u89E3\u8B80\n if (error instanceof ParserError) {\n await this.hook.notify('parseFailed', {\n id,\n error: error.error,\n count,\n response,\n messages,\n metadata,\n lastUserMessage,\n parserFails: error.parserFails,\n retry: () => {\n retryFlag = true\n },\n changeMessages: ms => {\n messages = ms\n }\n })\n if (retryFlag === false) {\n await this.hook.notify('done', {\n id,\n metadata\n })\n throw error\n }\n } else {\n await this.hook.notify('done', {\n id,\n metadata\n })\n throw error\n }\n }\n })\n return output\n }\n const send = async() => {\n try {\n const result = await request()\n return result\n } finally {\n eventOff()\n }\n }\n return {\n id,\n request: send()\n }\n }\n\n /**\n * @zh \u5C07\u8ACB\u6C42\u767C\u51FA\u81F3\u804A\u5929\u6A5F\u5668\u4EBA\u3002\n * @en Send request to chatbot.\n */\n\n async request<T extends Translator<S, O>>(data: T['__schemeType']): Promise<T['__outputType']> {\n const { request } = this.requestWithId(data)\n const output = await request\n return output\n }\n\n /**\n * @zh \u53D6\u5F97\u9810\u5148\u8ACB\u6C42\u7684\u8CC7\u8A0A\uFF0C\u5305\u542B\u8F38\u51FA\u898F\u683C\u8207\u9810\u8A2D\u8A0A\u606F\uFF0C\u9019\u751F\u547D\u9031\u671F\u53EA\u6703\u57F7\u884C\u5230 start \u968E\u6BB5\u70BA\u6B62\uFF0C\u4E5F\u4E0D\u6703\u89F8\u767C plugin\u3002\n * @en Get pre-request information, including output specifications and default messages. This life cycle will only execute up to the start stage and will not trigger plugins.\n */\n\n async getPreRequestInfo<T extends Translator<S, O>>(data: T['__schemeType']) {\n this._install()\n let id = flow.createUuid()\n let schema = this.translator.getValidate()\n let plugins = {} as any\n let metadata = new Map()\n let question = await this.translator.compile(data, {\n schema\n })\n let preMessages: Message[] = []\n let messages: Message[] = []\n if (question.prompt) {\n messages.push({\n role: 'user',\n content: question.prompt\n })\n }\n await this.hook.notify('start', {\n id,\n data,\n schema,\n plugins,\n messages,\n metadata,\n setPreMessages: ms => {\n preMessages = ms.map(e => {\n return {\n ...e,\n content: Array.isArray(e.content) ? e.content.join('\\n') : e.content\n }\n })\n },\n changeMessages: ms => {\n messages = ms\n },\n changeOutputSchema: output => {\n this.translator.changeOutputSchema(output)\n schema = this.translator.getValidate()\n }\n })\n const outputSchema = schema.output(z)\n return {\n outputSchema,\n outputJsonSchema: validateToJsonSchema(() => schema.output(z) as any),\n requestMessages: [\n ...preMessages,\n ...messages\n ]\n }\n }\n}\n", "import { z, toJSONSchema } from 'zod'\n\nexport type ValidateCallback<T extends Record<string, z.ZodTypeAny>> = (_z: typeof z) => {\n [K in keyof T]: T[K]\n}\n\nexport type ValidateCallbackOutputs<\n T extends ValidateCallback<any>,\n R = ReturnType<T>\n> = {\n [K in keyof R]: R[K] extends z.ZodTypeAny ? z.infer<R[K]> : R[K]\n}\n\nexport function definedValidateSchema<T extends ValidateCallback<any>>(cb: T): T {\n return cb\n}\n\nexport function validate<\n T extends ValidateCallback<any>,\n R = ReturnType<T>\n>(target: any, schemaCallback: T) {\n return z.object(schemaCallback(z)).parse(target || {}) as {\n [K in keyof R]: R[K] extends z.ZodTypeAny ? z.infer<R[K]> : R[K]\n }\n}\n\nexport function validateToJsonSchema<T extends ValidateCallback<any>>(target: () => T) {\n const schema = toJSONSchema(z.object(target()))\n delete schema.$schema\n return schema\n}\n", "type ParserFail = {\n name: string\n error: any\n}\n\nexport class ParserError {\n isParserError = true\n parserFails: ParserFail[] = []\n error: any\n constructor(error: any, parserFails: ParserFail[]) {\n this.error = error\n this.parserFails = parserFails\n }\n}\n", "import { TextParser } from './parser.js'\nimport { validate, ValidateCallback, ValidateCallbackOutputs } from '../utils/validate.js'\nimport { ParserError } from '../utils/error.js'\n\nexport type TranslatorParams<\n S extends ValidateCallback<any>,\n O extends ValidateCallback<any>\n> = {\n /**\n * @zh \u8F38\u5165\u7684\u8CC7\u6599\u683C\u5F0F\u3002\n * @en The input data format.\n */\n input?: S\n /**\n * @zh \u8F38\u51FA\u7684\u8CC7\u6599\u683C\u5F0F\u3002\n * @en The output data format.\n */\n output: O\n /**\n * @zh \u8A3B\u518A\u89E3\u8B80\u6587\u5B57\u7684\u89E3\u6790\u5668\u3002\n * @en Register the parser to interpret the text.\n */\n parsers: TextParser[]\n /**\n * @zh \u7D44\u5408\u8F38\u5165\u8CC7\u6599\u6210\u70BA\u63D0\u793A\u6587\u5B57\u3002\n * @en Combine the input data into a prompt.\n */\n question?: (data: ValidateCallbackOutputs<S>, context: {\n schema: {\n input?: S\n output: O\n }\n }) => Promise<string | string[]>\n}\n\nexport class Translator<\n S extends ValidateCallback<any>,\n O extends ValidateCallback<any>\n> {\n private params: TranslatorParams<S, O>\n\n constructor(params: TranslatorParams<S, O>) {\n this.params = params\n }\n\n get __schemeType(): ValidateCallbackOutputs<S> {\n return null as any\n }\n\n get __outputType(): ValidateCallbackOutputs<O> {\n return null as any\n }\n\n /**\n * @zh \u7D44\u5408\u8F38\u5165\u8CC7\u6599\u6210\u70BA\u63D0\u793A\u6587\u5B57\u3002\n * @en Combine the input data into a prompt.\n */\n\n async compile(data: ValidateCallbackOutputs<S>, context: {\n schema: {\n input?: S\n output: O\n }\n }) {\n const scheme = this.params.input ? validate(data, this.params.input) : data\n const prompt = this.params.question ? await this.params.question(scheme, context) : ''\n return {\n scheme,\n prompt: Array.isArray(prompt) ? prompt.join('\\n') : prompt\n }\n }\n\n getValidate() {\n return {\n input: this.params.input,\n output: this.params.output\n }\n }\n\n changeOutputSchema(schema: O) {\n this.params.output = schema\n }\n\n /**\n * @zh \u5C07\u6587\u5B57\u8F49\u63DB\u6210\u5E8F\u5217\u5316\u8CC7\u6599\u3002\n * @en Convert text to serialized data.\n */\n\n async parse(text: string) {\n let result: any = undefined\n let parserName = ''\n let parserFails: { name: string, error: any }[] = []\n for (let parse of this.params.parsers) {\n try {\n result = await parse.read(text)\n parserName = parse.name\n } catch (error) {\n result = undefined\n parserFails.push({\n name: parse.name,\n error\n })\n }\n }\n try {\n let output = validate(result, this.params.output)\n return {\n output,\n parserName,\n parserFails\n }\n } catch (error) {\n throw new ParserError(error, parserFails)\n }\n }\n}\n", "import { ChatBroker, Message, Params as ChatBrokerParams, ChatBrokerHooks, RequestContext } from './broker/chat.js'\nimport { ChatBrokerPlugin } from './core/plugin.js'\nimport * as z from 'zod'\n\ntype IO = any\n\nexport class CtoD<\n P extends ChatBrokerPlugin<IO, IO>,\n PS extends Record<string, ReturnType<P['use']>>\n> {\n params\n constructor(params: {\n request: (messages: Message[], context: RequestContext) => Promise<string>\n plugins?: () => PS\n }) {\n this.params = params\n }\n\n createBrokerBuilder<I extends Record<string, any>>(params?: {\n install?: ChatBrokerParams<() => I, IO, ChatBrokerHooks<() => I, IO, P, PS>, P, PS>['install']\n }) {\n return {\n create: <O extends Record<string, z.ZodTypeAny>>(install: (context: {\n id: string\n zod: typeof z\n data: I\n plugins: {\n [K in keyof PS]: {\n send: (data: PS[K]['__receiveData']) => void\n }\n }\n setMessages: (messages: (Omit<Message, 'content'> & { content: string | string[] })[]) => void\n metadata: Map<string, any>\n }) => Promise<O>) => {\n return new ChatBroker<\n () => I,\n () => O,\n P,\n PS,\n ChatBrokerHooks<() => I, () => O, P, PS>\n >({\n output: () => ({} as any),\n install: (context) => {\n params?.install?.(context)\n context.attach('start', async({ id, plugins, data, metadata, changeMessages, changeOutputSchema }) => {\n const schema = await install({\n id,\n data: data as any,\n plugins,\n zod: z,\n setMessages: (messages) => {\n changeMessages(messages.map(e => {\n return {\n role: e.role,\n content: Array.isArray(e.content) ? e.content.join('\\n') : e.content\n }\n }))\n },\n metadata\n })\n changeOutputSchema(() => schema)\n })\n },\n plugins: this.params.plugins ? () => this.params.plugins!() : undefined,\n request: this.params.request\n })\n }\n }\n }\n}\n", "import axios from 'axios'\nimport { OpenAIVision } from './vision.js'\nimport { OpenAIChat, Config } from './chat.js'\nimport { OpenAIImagesGeneration } from './images-generation.js'\nimport { validateToJsonSchema } from '../../utils/validate.js'\n\nexport class OpenAICtodService {\n _axios = axios.create()\n _apiKey = ''\n _baseUrl = 'https://api.openai.com'\n\n static createChatRequest(\n apiKey: string | (() => Promise<string>),\n config: Partial<Config> | (() => Promise<Partial<Config>>) = {},\n options?: {\n axios?: any\n baseUrl?: string\n }\n ) {\n return async(messages: any[], { abortController }: any) => {\n const openai = new OpenAICtodService(typeof apiKey === 'string' ? apiKey : await apiKey())\n const chat = openai.createChat()\n if (options) {\n if (options.axios) {\n openai.setAxios(options.axios)\n }\n if (options.baseUrl) {\n openai.setBaseUrl(options.baseUrl)\n }\n }\n chat.setConfig(typeof config === 'function' ? await config() : config)\n const { text } = await chat.talk(messages, {\n abortController\n })\n return text\n }\n }\n\n static createChatRequestWithJsonSchema(params: {\n axios?: any\n apiKey: string | (() => Promise<string>)\n config?: Partial<Pick<Config, 'model' | 'temperature'>> | (() => Promise<Partial<Pick<Config, 'model' | 'temperature'>>>)\n }) {\n return async(messages: any[], { schema, onCancel }: any) => {\n const openai = new OpenAICtodService(typeof params.apiKey === 'string' ? params.apiKey : await params.apiKey())\n const chat = openai.createChat()\n const abortController = new AbortController()\n if (params.config) {\n chat.setConfig(typeof params.config === 'function' ? await params.config() : params.config)\n }\n if (params.axios) {\n openai.setAxios(params.axios)\n }\n onCancel(() => abortController.abort())\n const jsonSchema = validateToJsonSchema(schema.output)\n const { text } = await chat.talk(messages, {\n abortController,\n jsonSchema: {\n name: 'data',\n strict: true,\n schema: jsonSchema\n }\n })\n return text\n }\n }\n\n constructor(apiKey = '') {\n this._apiKey = apiKey\n }\n\n /**\n * @zh \u5982\u679C\u4F60\u6709\u9700\u8981\u7279\u5225\u8A2D\u5B9A axios\uFF0C\u8ACB\u4F7F\u7528\u9019\u65B9\u6CD5\u3002\n * @en If you need to set axios, please use this method.\n */\n\n setAxios(axios: any) {\n this._axios = axios\n }\n\n /**\n * @zh \u5982\u679C\u4F60\u6709\u9700\u8981\u7279\u5225\u8A2D\u5B9A baseUrl\uFF0C\u8ACB\u4F7F\u7528\u9019\u65B9\u6CD5\u3002\n * @en If you need to set baseUrl, please use this method.\n */\n\n setBaseUrl(baseUrl: string) {\n this._baseUrl = baseUrl\n }\n\n /**\n * @zh \u8A2D\u5B9A api key\u3002\n * @en Set api key.\n */\n\n setConfiguration(apiKey: string) {\n this._apiKey = apiKey\n }\n\n createChat() {\n return new OpenAIChat(this)\n }\n\n createVision() {\n return new OpenAIVision(this)\n }\n\n createImagesGeneration() {\n return new OpenAIImagesGeneration(this)\n }\n}\n", "import { OpenAICtodService } from './index.js'\n\ntype ImageContent = {\n type: 'image_url' | 'text'\n text?: string\n image_url?: {\n url: string\n detail?: string\n }\n}\n\nexport type VisionMessage = {\n role: 'system' | 'user' | 'assistant'\n name?: string\n content: string | ImageContent[]\n}\n\ntype ApiResponse = {\n id: string\n object: string\n created: number\n model: string\n usage: {\n prompt_tokens: number\n completion_tokens: number\n total_tokens: number\n }\n choices: Array<{\n message: {\n role: string\n content: string\n }\n finish_details: {\n type: string\n }\n index: number\n }>\n}\n\nexport type Config = {\n /**\n * @zh \u9078\u64C7\u904B\u884C\u7684\u6A21\u578B\u3002\n * @en How many chat completion choices to generate for each input message.\n */\n model: string\n /**\n * @zh \u5192\u96AA\u6307\u6578\uFF0C\u6578\u503C\u7531 0 ~ 2 \u4E4B\u9593\u3002\n * @en What sampling temperature to use, between 0 and 2. Higher values like 0.8 will make the output more random, while lower values like 0.2 will make it more focused and deterministic.\n */\n temperature: number\n /**\n * @zh \u6BCF\u6B21\u5C0D\u8A71\u6700\u591A\u7522\u751F\u5E7E\u500B tokens\u3002\n * @en How many tokens to complete to.\n */\n maxTokens?: number\n}\n\nexport class OpenAIVision {\n openai: OpenAICtodService\n config: Config = {\n model: 'gpt-5',\n maxTokens: undefined,\n temperature: 0.7\n }\n\n constructor(openai: OpenAICtodService) {\n this.openai = openai\n }\n\n /**\n * @zh \u6539\u8B8A\u5C0D\u8A71\u7684\u4E00\u4E9B\u8A2D\u5B9A\n * @en Change some settings of the conversation\n */\n\n setConfig(options: Partial<Config>) {\n Object.assign(this.config, options)\n }\n\n /**\n * @zh \u8FA8\u8B58\u5716\u7247\n * @en Recognize images\n */\n\n async view(messages: VisionMessage[]) {\n const result = await this.openai._axios.post<ApiResponse>(`${this.openai._baseUrl}/v1/chat/completions`, {\n model: this.config.model,\n n: 1,\n messages,\n max_tokens: this.config.maxTokens,\n temperature: this.config.temperature\n }, {\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${this.openai._apiKey}`\n }\n })\n const choices = result.data.choices || []\n const message = choices[0]?.message || {\n role: 'assistant',\n content: ''\n }\n return {\n id: result?.data.id as string,\n text: message.content as string,\n apiResponse: result.data\n }\n }\n}\n\nexport type OpenAIChatVisionResponse = Awaited<ReturnType<OpenAIVision['view']>>\n", "import { json } from 'power-helper'\nimport { OpenAICtodService } from './index.js'\n\nexport type ChatGPTMessage = {\n role: 'system' | 'user' | 'assistant'\n name?: string\n content: string\n}\n\ntype ApiResponse = {\n id: string\n object: string\n created: number\n choices: Array<{\n index: number\n finish_reason: string\n message: {\n role: 'system' | 'user' | 'assistant'\n name?: string\n content: string\n }\n }>\n usage: {\n prompt_tokens: number\n completion_tokens: number\n total_tokens: number\n }\n}\n\nexport type Config = {\n /**\n * @zh \u4E00\u6B21\u56DE\u61C9\u6578\u91CF\n * @en How many chat completion choices to generate for each input message.\n */\n n: number\n /**\n * @zh \u9078\u64C7\u904B\u884C\u7684\u6A21\u578B'\n * @en The model to use for this chat completion.\n */\n model: string\n /**\n * @zh \u5192\u96AA\u6307\u6578\uFF0C\u6578\u503C\u7531 0 ~ 2 \u4E4B\u9593\uFF0C\u8D8A\u4F4E\u56DE\u61C9\u8D8A\u7A69\u5B9A\u3002\n * @en What sampling temperature to use, between 0 and 2. Higher values like 0.8 will make the output more random, while lower values like 0.2 will make it more focused and deterministic.\n */\n temperature: number\n /**\n * @zh \u6BCF\u6B21\u5C0D\u8A71\u6700\u591A\u7522\u751F\u5E7E\u500B tokens\u3002\n * @en How many tokens to complete to.\n */\n maxTokens?: number\n}\n\nexport class OpenAIChat {\n openai: OpenAICtodService\n config: Config = {\n n: 1,\n model: 'gpt-4o',\n temperature: 1,\n maxTokens: undefined\n }\n\n constructor(openai: OpenAICtodService) {\n this.openai = openai\n }\n\n /**\n * @zh \u6539\u8B8A\u5C0D\u8A71\u7684\u4E00\u4E9B\u8A2D\u5B9A\n * @en Change some settings of the conversation\n */\n\n setConfig(options: Partial<Config>) {\n Object.assign(this.config, options)\n }\n\n /**\n * @zh \u6AA2\u8996\u5167\u5BB9\u662F\u5426\u7B26\u5408 OpenAI \u7684\u5BE9\u67E5\n * @en View content for OpenAI moderation\n */\n\n async moderations(input: string) {\n const result = await this.openai._axios.post<any>(`${this.openai._baseUrl}/v1/moderations`, {\n input: input\n }, {\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${this.openai._apiKey}`\n }\n })\n return {\n isSafe: result.data.results?.[0]?.flagged === false,\n result: result.data\n }\n }\n\n /**\n * @zh \u9032\u884C\u5C0D\u8A71\n * @en Talk to the AI\n */\n\n async talk(messages: ChatGPTMessage[] = [], options?: {\n jsonSchema?: any\n abortController?: AbortController\n }) {\n const newMessages = json.jpjs(messages)\n let response_format: any = undefined\n if (options?.jsonSchema) {\n response_format = {\n type: 'json_schema',\n json_schema: options.jsonSchema\n }\n }\n const result = await this.openai._axios.post<ApiResponse>(`${this.openai._baseUrl}/v1/chat/completions`, {\n model: this.config.model,\n n: this.config.n,\n messages: newMessages,\n response_format,\n temperature: this.config.temperature\n }, {\n signal: options?.abortController?.signal,\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${this.openai._apiKey}`\n }\n })\n const choices = result.data.choices || []\n const message = choices[0]?.message || {\n role: 'assistant',\n content: ''\n }\n newMessages.push(message)\n return {\n id: result?.data.id as string,\n text: message.content as string,\n newMessages,\n isDone: choices[0]?.finish_reason === 'stop',\n apiResponse: result.data\n }\n }\n\n talkStream(params: {\n messages: any[]\n onMessage: (_message: string) => void\n onEnd: () => void\n onWarn: (_warn: any) => void\n onError: (_error: any) => void\n }) {\n const controller = new AbortController()\n fetch(`${this.openai._baseUrl}/v1/chat/completions`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${this.openai._apiKey}`\n },\n body: JSON.stringify({\n model: this.config.model,\n stream: true,\n messages: params.messages\n }),\n signal: controller.signal\n }).then(async response => {\n const reader = response.body?.pipeThrough(new TextDecoderStream()).getReader()\n if (!reader) {\n throw new Error('Can not get reader')\n }\n\n while (true) {\n const { value, done } = await reader.read()\n if (done) {\n break\n }\n const items = value.split('\\n')\n for (let item of items) {\n if (item.length === 0) {\n continue\n }\n if (item.startsWith(':')) {\n continue\n }\n if (item === 'data: [DONE]') {\n params.onEnd()\n break\n }\n try {\n const result = JSON.parse(item.substring(6))\n const content = result.choices[0].delta.content\n params.onMessage(content)\n } catch (error) {\n params.onWarn(error)\n }\n }\n }\n }).catch(error => {\n if (error.name === 'AbortError') {\n params.onEnd()\n } else {\n params.onError(error)\n }\n })\n return {\n cancel: () => controller.abort()\n }\n }\n\n /**\n * @zh \u958B\u555F\u6301\u7E8C\u6027\u5C0D\u8A71\n */\n\n async keepTalk(prompt: string | string[], oldMessages: ChatGPTMessage[] = []) {\n const result = await this.talk([\n ...oldMessages,\n {\n role: 'user',\n content: Array.isArray(prompt) ? prompt.join('\\n') : prompt\n }\n ])\n return {\n result,\n nextTalk: (prompt: string | string[]) => this.keepTalk(prompt, result.newMessages)\n }\n }\n}\n\nexport type OpenAIChatTalkResponse = Awaited<ReturnType<OpenAIChat['talk']>>\n", "import { OpenAICtodService } from './index.js'\n\ntype ApiResponse = {\n created: string\n data: {\n b64_json: string\n }[]\n}\n\ntype Config = {\n /**\n * @zh \u6A21\u578B\uFF0C\u652F\u63F4 dall-e-2 \u548C dall-e-3\n * @en Model, support dall-e-2 and dall-e-3\n */\n model: 'dall-e-2' | 'dall-e-3'\n /**\n * @zh \u89E3\u6790\u5EA6\uFF0C\u4F8B\u5982 1024x1024\n * @en Resolution, for example 1024x1024\n */\n size: `${number}x${number}`\n}\n\nexport class OpenAIImagesGeneration {\n private openai: OpenAICtodService\n private config: Config = {\n model: 'dall-e-2',\n size: '1024x1024'\n }\n\n constructor(openai: OpenAICtodService) {\n this.openai = openai\n }\n\n /**\n * @zh \u6539\u8B8A\u5C0D\u8A71\u7684\u4E00\u4E9B\u8A2D\u5B9A\n * @en Change some settings of the conversation\n */\n\n setConfig(options: Partial<Config>) {\n Object.assign(this.config, options)\n }\n\n /**\n * @zh \u7522\u751F\u5716\u7247\n * @en Generate image\n */\n\n async create(prompt: string) {\n const result = await this.openai._axios.post<ApiResponse>(`${this.openai._baseUrl}/v1/images/generations`, {\n prompt,\n n: 1,\n size: this.config.size,\n model: this.config.model,\n response_format: 'b64_json'\n }, {\n timeout: 1000 * 60 * 5,\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${this.openai._apiKey}`\n }\n })\n return result.data\n }\n}\n", "import axios, { AxiosInstance } from 'axios'\nimport { s2t, t2s } from '../../utils/chinese-conv.js'\nimport { validateToJsonSchema } from '../../utils/validate.js'\nimport { LlamaCppCompletion, Config } from './completion.js'\n\nexport class LlamaCppCtodService {\n _axios = axios.create()\n\n static createChatRequestWithJsonSchema(params: {\n axios?: AxiosInstance\n config: Partial<Config> | (() => Promise<Partial<Config>>)\n talkOptions?: any\n }) {\n return async(messages: any[], { schema, onCancel }: any) => {\n const ll3cpp = new LlamaCppCtodService()\n const chat = ll3cpp.createCompletion()\n const config = typeof params.config === 'function' ? await params.config() : params.config\n chat.setConfig(config)\n let formatSchema = validateToJsonSchema(schema.output)\n if (params.axios) {\n ll3cpp.setAxios(params.axios)\n }\n if (chat.config.autoConvertTraditionalChinese) {\n formatSchema = JSON.parse(t2s(JSON.stringify(formatSchema)))\n }\n const { run, cancel } = chat.talk({\n options: params.talkOptions,\n messages: messages,\n response_format: {\n type: 'json_object',\n schema: formatSchema\n }\n })\n onCancel(cancel)\n const { message } = await run()\n return chat.config.autoConvertTraditionalChinese ? s2t(message) : message\n }\n }\n\n /**\n * @zh \u5982\u679C\u4F60\u6709\u9700\u8981\u7279\u5225\u8A2D\u5B9A axios\uFF0C\u8ACB\u4F7F\u7528\u9019\u65B9\u6CD5\u3002\n * @en If you need to set axios, please use this method.\n */\n\n setAxios(axios: AxiosInstance) {\n this._axios = axios\n }\n\n /**\n * @zh \u5EFA\u7ACB \u88DC\u5F37/ \u5C0D\u8A71\u7269\u4EF6\u3002\n * @en Create completion object.\n */\n\n createCompletion() {\n return new LlamaCppCompletion(this)\n }\n}\n", "import { LlamaCppCtodService } from './index.js'\nimport { flow, Once } from 'power-helper'\nimport { s2t, t2s } from '../../utils/chinese-conv.js'\nimport { Template } from '@huggingface/jinja'\n\ntype Message = {\n role: string\n content: string\n}\n\ntype Options = any\n\nexport type Config = {\n baseUrl: string\n headers: Record<string, string>\n autoConvertTraditionalChinese: boolean\n}\n\ntype Stream = {\n onMessage: (message: string) => void\n onEnd?: () => void\n onWarn?: (error: any) => void\n onError?: (error: any) => void\n}\n\nclass Requester {\n private core: LlamaCppCompletion\n private streamAbortControllers: {\n id: string\n controller: AbortController\n }[] = []\n\n constructor(core: LlamaCppCompletion) {\n this.core = core\n }\n\n private createAbortController() {\n const streamAbortController = new AbortController()\n const streamAbortControllerId = flow.createUuid()\n this.streamAbortControllers.push({\n id: streamAbortControllerId,\n controller: streamAbortController\n })\n return {\n signal: streamAbortController.signal,\n controllerId: streamAbortControllerId\n }\n }\n\n private removeAbortController(streamAbortControllerId: string) {\n this.streamAbortControllers = this.streamAbortControllers.filter(e => e.id !== streamAbortControllerId)\n }\n\n async stream(params: {\n path: string\n data: Record<string, any> | (() => Promise<any>)\n onMessage: (data: any) => void\n onEnd: () => void\n onWarn: (error: any) => void\n onError: (error: any) => void\n }) {\n const { signal, controllerId } = this.createAbortController()\n const end = () => {\n this.removeAbortController(controllerId)\n params.onEnd()\n }\n const reader = async(response: Response) => {\n if (response.body) {\n let reader = response.body.getReader()\n let done = false\n let chunk = ''\n while (!done) {\n const { value, done: readerDone } = await reader.read()\n if (value) {\n chunk += new TextDecoder('utf-8').decode(value)\n const payloads = chunk.split('\\n\\n')\n chunk = payloads.pop() || ''\n payloads.forEach(payload => {\n if (payload.includes('[DONE]')) {\n done = true\n }\n if (payload.startsWith('data:')) {\n try {\n const data = JSON.parse(payload.replace('data: ', ''))\n params.onMessage(data)\n } catch (error) {\n params.onWarn(error)\n }\n }\n })\n }\n if (readerDone) {\n done = true\n }\n }\n end()\n } else {\n params.onError(new Error('Body not found.'))\n }\n }\n fetch(`${this.core.config.baseUrl}/${params.path}`, {\n method: 'POST',\n body: JSON.stringify(typeof params.data === 'function' ? (await params.data()) : params.data),\n signal,\n headers: {\n 'Content-Type': 'application/json',\n ...this.core.config.headers\n }\n })\n .then(reader)\n .catch(error => {\n if (error instanceof Error && error.message.includes('The user aborted a request')) {\n end()\n } else {\n params.onError(error)\n }\n })\n }\n\n async fetch(params: {\n path: string\n data: any\n }) {\n const { signal, controllerId } = this.createAbortController()\n try {\n const result = await this.core.core._axios.post(`${this.core.config.baseUrl}/${params.path}`, params.data, {\n signal,\n headers: {\n 'Content-Type': 'application/json',\n ...this.core.config.headers\n }\n })\n return {\n data: result.data\n }\n } finally {\n this.removeAbortController(controllerId)\n }\n }\n\n cancel() {\n this.streamAbortControllers.forEach(e => e.controller.abort())\n this.streamAbortControllers = []\n }\n\n export() {\n return {\n cancel: this.cancel.bind(this)\n }\n }\n}\n\nexport class LlamaCppCompletion {\n private getProp = new Once({\n handler: async() => {\n const url = `${this.config.baseUrl}/props`\n const { data: props } = await this.core._axios.get<{\n chat_template: string\n bos_token: string\n eos_token: string\n }>(url, {})\n return props\n }\n })\n\n core: LlamaCppCtodService\n config: Config = {\n baseUrl: '',\n headers: {},\n autoConvertTraditionalChinese: true\n }\n\n constructor(core: LlamaCppCtodService) {\n this.core = core\n }\n\n setConfig(config: Partial<Config>) {\n this.config = {\n ...this.config,\n ...config\n }\n }\n\n completion(params: {\n options?: Options\n messages: Message[]\n }) {\n const lastMessage = params.messages.at(-1) || ''\n const requester = new Requester(this)\n return {\n ...requester.export(),\n run: async(): Promise<{\n message: string\n fullMessage: string\n }> => {\n const props = await this.getProp.run()\n const template = new Template(props.chat_template)\n const prompt = template.render({\n bos_token: props.bos_token,\n messages: params.messages\n }).slice(0, props.eos_token.length * -1 - 1)\n const result = await requester.fetch({\n path: 'completion',\n data: {\n ...(params.options || {}),\n prompt: this.config.autoConvertTraditionalChinese ? t2s(prompt) : prompt\n }\n })\n const message = this.config.autoConvertTraditionalChinese ? s2t(result.data.content) : result.data.content\n return {\n message,\n fullMessage: `${lastMessage}${message}`\n }\n }\n }\n }\n\n completionStream(params: Stream & {\n messages: Message[]\n options?: Options\n }) {\n const requester = new Requester(this)\n requester.stream({\n path: 'completion',\n onEnd: params.onEnd || (() => null),\n onMessage: e => {\n const message = this.config.autoConvertTraditionalChinese ? s2t(e.content) : e.content\n params.onMessage(message)\n },\n onWarn: params.onWarn || (() => null),\n onError: params.onError || (() => null),\n data: async() => {\n const props = await this.getProp.run()\n const template = new Template(props.chat_template)\n const prompt = template.render({\n bos_token: props.bos_token,\n messages: params.messages\n }).slice(0, props.eos_token.length * -1 - 1)\n return {\n ...(params.options || {}),\n prompt: this.config.autoConvertTraditionalChinese ? t2s(prompt) : prompt,\n stream: true\n }\n }\n })\n return requester.export()\n }\n\n talk(params: {\n options?: Options\n messages: Message[]\n response_format?: {\n type: 'json_object'\n schema: any\n }\n }) {\n const requester = new Requester(this)\n return {\n ...requester.export(),\n run: async(): Promise<{\n message: string\n }> => {\n const result = await requester.fetch({\n path: 'v1/chat/completions',\n data: {\n ...(params.options || {}),\n response_format: params.response_format,\n messages: params.messages.map(e => {\n return {\n role: e.role,\n content: this.config.autoConvertTraditionalChinese ? t2s(e.content) : e.content\n }\n })\n }\n })\n const content = result.data.choices[0].message.content || ''\n return {\n message: this.config.autoConvertTraditionalChinese ? s2t(content) : content\n }\n }\n }\n }\n\n talkStream(params: Stream & {\n options?: Options\n messages: Message[]\n }) {\n const requester = new Requester(this)\n requester.stream({\n path: 'v1/chat/completions',\n onEnd: params.onEnd || (() => null),\n onMessage: e => {\n let content = e.choices[0].delta.content\n if (content) {\n const message = this.config.autoConvertTraditionalChinese ? s2t(content) : content\n params.onMessage(message)\n }\n },\n onWarn: params.onWarn || (() => null),\n onError: params.onError || (() => null),\n data: {\n ...(params.options || {}),\n stream: true,\n messages: params.messages.map(e => {\n return {\n role: e.role,\n content: this.config.autoConvertTraditionalChinese ? t2s(e.content) : e.content\n }\n })\n }\n })\n return requester.export()\n }\n}\n", "import { json } from 'power-helper'\nimport { GoogleCtodService } from './index.js'\n\n/**\n * if data:\n * data: base64 string,\n * mimeType: image/jpeg,\n */\n\ntype Part = {\n text: string\n} | {\n inlineData: {\n data: string\n mimeType: string\n }\n}\n\nexport type GoogleMessage = {\n role: 'model' | 'user'\n parts: Part[]\n}\n\nexport type Config = {\n /**\n * @zh \u9078\u64C7\u904B\u884C\u7684\u6A21\u578B\u3002\n * @en What model to use.\n */\n model: string\n maxTokens: number\n temperature: number\n}\n\nexport class GoogleChat {\n google: GoogleCtodService\n config: Config = {\n model: 'gemini-2.0-flash',\n maxTokens: 1024,\n temperature: 0.7\n }\n\n constructor(google: GoogleCtodService) {\n this.google = google\n }\n\n /**\n * @zh \u6539\u8B8A\u5C0D\u8A71\u7684\u4E00\u4E9B\u8A2D\u5B9A\n * @en Change some settings of the conversation\n */\n\n setConfig(options: Partial<Config>) {\n Object.assign(this.config, options)\n }\n\n /**\n * @zh \u9032\u884C\u5C0D\u8A71\n * @en Talk to the AI\n */\n\n async talk(messages: GoogleMessage[] = []) {\n const newMessages = json.jpjs(messages)\n const response = await this.google.googleGenAI.models.generateContent({\n model: this.config.model,\n contents: newMessages,\n config: {\n temperature: this.config.temperature,\n maxOutputTokens: this.config.maxTokens\n }\n })\n const text = response.text\n return {\n text,\n newMessages: [\n ...newMessages,\n {\n role: 'model',\n parts: [\n {\n text\n }\n ]\n }\n ]\n }\n }\n\n /**\n * @zh \u9032\u884C\u5C0D\u8A71\uFF0C\u4E26\u4E14\u4EE5\u4E32\u6D41\u7684\u65B9\u5F0F\u8F38\u51FA\n * @en Talk to the AI and output in a streaming way\n */\n\n talkStream(params: {\n messages: GoogleMessage[]\n onMessage: (_message: string) => void\n onEnd: () => void\n onWarn: (_warn: any) => void\n onError: (_error: any) => void\n }) {\n const state = {\n controller: new AbortController()\n }\n const model = this.google.googleGenAI.models.generateContentStream({\n model: this.config.model,\n contents: params.messages,\n config: {\n abortSignal: state.controller.signal,\n temperature: this.config.temperature,\n maxOutputTokens: this.config.maxTokens,\n }\n })\n model.then(async(stream) => {\n try {\n for await (const chunk of stream) {\n const chunkText = chunk.candidates?.[0].content?.parts?.[0].text || ''\n params.onMessage(chunkText)\n }\n params.onEnd()\n } catch (error) {\n if (state.controller.signal.aborted) {\n params.onEnd()\n } else {\n throw error\n }\n }\n })\n .catch((error) => {\n params.onError(error)\n })\n return {\n cancel: () => {\n state.controller.abort()\n }\n }\n }\n}\n\nexport type GoogleChatTalkResponse = Awaited<ReturnType<GoogleChat['talk']>>\n", "import { GoogleCtodService } from './index.js'\n\ntype Config = {\n model: string\n size: string\n aspectRatio: string\n}\n\nexport class GoogleImagesGeneration {\n private google: GoogleCtodService\n private config: Config = {\n model: 'imagen-4.0-generate-001',\n size: '1K',\n aspectRatio: '1:1'\n }\n\n constructor(google: GoogleCtodService) {\n this.google = google\n }\n\n /**\n * @zh \u6539\u8B8A\u5C0D\u8A71\u7684\u4E00\u4E9B\u8A2D\u5B9A\n * @en Change some settings of the conversation\n */\n\n setConfig(options: Partial<Config>) {\n Object.assign(this.config, options)\n }\n\n /**\n * @zh \u7522\u751F\u5716\u7247\n * @en Generate image\n */\n\n async create(prompt: string) {\n const response = await this.google.googleGenAI.models.generateImages({\n model: this.config.model,\n prompt,\n config: {\n numberOfImages: 1,\n aspectRatio: this.config.aspectRatio,\n imageSize: this.config.size\n }\n })\n return {\n images: response.generatedImages?.map(e => {\n return {\n url: e.image?.imageBytes || '',\n mimeType: e.image?.mimeType || ''\n }\n }) || []\n }\n }\n}\n", "import { validateToJsonSchema } from '../../utils/validate.js'\nimport { GoogleMessage, GoogleChat, Config } from './chat.js'\nimport { GoogleImagesGeneration } from './images-generation.js'\nimport type { GoogleGenAI } from '@google/genai'\n\ntype GPTContent = {\n type: 'image_url' | 'text'\n text?: string\n image_url?: {\n url: string\n detail?: string\n }\n}\n\ntype GPTMessage = {\n role: 'system' | 'user' | 'assistant'\n content: string | GPTContent[]\n}\n\nexport class GoogleCtodService {\n googleGenAI: GoogleGenAI\n\n constructor(googleGenAI: any) {\n this.googleGenAI = googleGenAI\n }\n\n static chatGPTMessageToGoogleChatMessage(messages: GPTMessage[]): GoogleMessage[] {\n const contentToParts = (content: string | GPTMessage['content']): GoogleMessage['parts'] => {\n if (typeof content === 'string') {\n return [\n {\n text: content\n }\n ]\n } else if (Array.isArray(content)) {\n return content.map(({ type, image_url, text }): GoogleMessage['parts'][number] => {\n if (type === 'image_url') {\n // base64\n const url = image_url?.url || ''\n const mimeType = url.includes('data:image/png') ? 'image/png' : 'image/jpeg'\n return {\n inlineData: {\n data: url.split('base64,')[1] || '',\n mimeType\n }\n }\n } else {\n return {\n text: text || ''\n }\n }\n })\n }\n return []\n }\n return messages.map((message) => {\n if (message.role === 'user' || message.role === 'system') {\n return {\n role: 'user',\n parts: contentToParts(message.content)\n }\n } else {\n return {\n role: 'model',\n parts: contentToParts(message.content)\n }\n }\n })\n }\n\n static createChatRequestWithJsonSchema(params: {\n googleGenAI: any\n config: Partial<Omit<Config, 'model'>> | (() => Promise<Partial<Omit<Config, 'model'>>>)\n model: string\n }) {\n const googleGenAI: GoogleGenAI = params.googleGenAI\n const removeAdditionalProperties = (schema: any) => {\n if (schema.type === 'object') {\n delete schema.additionalProperties\n Object.keys(schema.properties).forEach((key) => {\n removeAdditionalProperties(schema.properties[key])\n })\n } else if (schema.type === 'array') {\n removeAdditionalProperties(schema.items)\n }\n return schema\n }\n return async (messages: any[], { schema, abortController }: any) => {\n const config = typeof params.config === 'function' ? await params.config() : params.config\n const response = await googleGenAI.models.generateContent({\n model: params.model,\n contents: GoogleCtodService.chatGPTMessageToGoogleChatMessage(messages),\n config: {\n abortSignal: abortController.signal,\n maxOutputTokens: config.maxTokens,\n temperature: config.temperature,\n responseMimeType: 'application/json',\n responseJsonSchema: validateToJsonSchema(schema.output)\n }\n })\n return response.text || ''\n }\n }\n\n createChat() {\n return new GoogleChat(this)\n }\n\n createImagesGeneration() {\n return new GoogleImagesGeneration(this)\n }\n}\n", "import { AnthropicCtodService } from './index.js'\n\ntype AnthropicSdk = AnthropicCtodService['anthropicSdk']\n\nexport type Message = {\n role: string\n content: string\n}\n\nexport type Config = {\n /**\n * @zh \u9078\u64C7\u904B\u884C\u7684\u6A21\u578B\u3002\n * @en What model to use.\n */\n model: string\n maxTokens: number\n temperature: number\n}\n\nexport class AnthropicChatDataGenerator {\n private config: () => Config\n constructor(config: () => Config) {\n this.config = config\n }\n\n /**\n * \u79FB\u9664 system \u8A0A\u606F\n */\n\n private translateMessages(messages: any[]) {\n return {\n system: messages.find(e => e.role === 'system')?.content,\n messages: messages.filter(e => e.role !== 'system')\n }\n }\n\n createChatAndStructureBody(messages: Message[], jsonSchema: any): Parameters<AnthropicSdk['messages']['create']>[0] {\n const config = this.config()\n const translateMessages = this.translateMessages(messages)\n return {\n model: config.model,\n max_tokens: config.maxTokens,\n temperature: config.temperature,\n system: translateMessages.system,\n messages: translateMessages.messages,\n tools: [\n {\n name: 'data',\n description: 'Response Data',\n input_schema: jsonSchema\n }\n ],\n tool_choice: {\n type: 'tool',\n name: 'data'\n }\n }\n }\n\n parseChatAndStructureResult(result: Awaited<ReturnType<AnthropicSdk['messages']['create']>>): string {\n let toolUseContent: any = 'content' in result ? result.content.find(e => e.type === 'tool_use') : null\n let response = toolUseContent?.input || null\n if (response == null) {\n return 'null'\n }\n return JSON.stringify(response)\n }\n\n createTalkBody(messages: Message[]): Parameters<AnthropicSdk['messages']['create']>[0] {\n const config = this.config()\n const newMessages = this.translateMessages(messages)\n return {\n model: config.model,\n max_tokens: config.maxTokens,\n temperature: config.temperature,\n system: newMessages.system,\n messages: newMessages.messages\n }\n }\n\n parseTalkResult(result: Awaited<ReturnType<AnthropicSdk['messages']['create']>>): string {\n let output = ''\n let textContent: any = 'content' in result ? result.content.find(e => e.type === 'text') : null\n if (textContent) {\n output = textContent.text\n }\n return output\n }\n\n createTalkStreamBody(messages: Message[]): Parameters<AnthropicSdk['messages']['create']>[0] {\n const config = this.config()\n const newMessages = this.translateMessages(messages)\n return {\n model: config.model,\n max_tokens: config.maxTokens,\n temperature: config.temperature,\n system: newMessages.system,\n stream: true,\n messages: newMessages.messages\n }\n }\n}\n\nexport class AnthropicChat {\n anthropic: AnthropicCtodService\n dataGenerator = new AnthropicChatDataGenerator(() => this.config)\n config: Config = {\n model: 'claude-3-5-haiku-latest',\n maxTokens: 8192,\n temperature: 0.7\n }\n\n constructor(anthropic: AnthropicCtodService) {\n this.anthropic = anthropic\n }\n\n /**\n * @zh \u6539\u8B8A\u5C0D\u8A71\u7684\u4E00\u4E9B\u8A2D\u5B9A\n * @en Change some settings of the conversation\n */\n\n setConfig(options: Partial<Config>) {\n Object.assign(this.config, options)\n }\n\n /**\n * @zh \u9032\u884C\u5C0D\u8A71\uFF0C\u4E26\u4E14\u4EE5\u7D50\u69CB\u5316\u7684\u65B9\u5F0F\u8F38\u51FA\n * @en Talk to the AI and output in a structured way\n */\n\n async chatAndStructure(messages: Message[], jsonSchema: any, options?: { abortController?: AbortController }) {\n const anthropic = this.anthropic.anthropicSdk\n const body = this.dataGenerator.createChatAndStructureBody(messages, jsonSchema)\n const msg = await anthropic.messages.create(body, {\n signal: options?.abortController?.signal\n })\n return this.dataGenerator.parseChatAndStructureResult(msg)\n }\n\n /**\n * @zh \u9032\u884C\u5C0D\u8A71\n * @en Talk to the AI\n */\n\n async talk(messages: Message[] = []) {\n const anthropic = this.anthropic.anthropicSdk\n const body = this.dataGenerator.createTalkBody(messages)\n const msg = await anthropic.messages.create(body)\n return this.dataGenerator.parseTalkResult(msg)\n }\n\n /**\n * @zh \u9032\u884C\u5C0D\u8A71\uFF0C\u4E26\u4E14\u4EE5\u4E32\u6D41\u7684\u65B9\u5F0F\u8F38\u51FA\n * @en Talk to the AI and output in a streaming way\n */\n\n talkStream(params: {\n messages: Message[]\n onMessage: (_message: string) => void\n onEnd: () => void\n onWarn: (_warn: any) => void\n onError: (_error: any) => void\n }) {\n let stream: Extract<Awaited<ReturnType<typeof anthropic.messages.create>>, { controller: any }> | null = null\n const anthropic = this.anthropic.anthropicSdk\n const { onMessage, onEnd, onError } = params\n const body = this.dataGenerator.createTalkStreamBody(params.messages)\n const performStreamedChat = async () => {\n try {\n let result = await anthropic.messages.create(body)\n if (result != null && 'controller' in result) {\n stream = result\n for await (const messageStream of stream) {\n if (messageStream.type === 'content_block_delta') {\n const deltaText = 'text' in messageStream.delta ? messageStream.delta.text : ''\n onMessage(deltaText)\n }\n }\n }\n onEnd()\n } catch (error) {\n onError(error)\n }\n }\n performStreamedChat()\n return {\n cancel: () => {\n const int = setInterval(() => {\n if (stream && stream.controller) {\n stream.controller.abort()\n clearInterval(int)\n }\n }, 10)\n }\n }\n }\n}\n\nexport type AnthropicChatTalkResponse = Awaited<ReturnType<AnthropicChat['talk']>>\n", "import { validateToJsonSchema } from '../../utils/validate.js'\nimport { Config, AnthropicChat } from './chat.js'\nimport type { Anthropic } from '@anthropic-ai/sdk'\n\ntype GPTContent = {\n type: 'image_url' | 'text'\n text?: string\n image_url?: {\n url: string\n detail?: string\n }\n}\n\ntype GPTMessage = {\n role: string\n content: string | GPTContent[]\n}\n\nexport class AnthropicCtodService {\n anthropicSdk: Anthropic\n\n constructor(anthropicSdk: any) {\n this.anthropicSdk = anthropicSdk\n }\n\n static chatGPTMessageToAnthropicChatMessage(messages: GPTMessage[]): any[] {\n const newMessage = messages.map(e => {\n return {\n role: e.role,\n content: typeof e.content === 'string'\n ? e.content\n : e.content.map((content) => {\n if (content.type === 'image_url') {\n const url = content.image_url?.url || ''\n return {\n type: 'image',\n source: {\n type: 'base64',\n media_type: url.slice(5).split(';')[0],\n data: url.split(',')[1]\n }\n }\n }\n return {\n type: 'text',\n text: content.text\n }\n })\n }\n })\n return newMessage\n }\n\n static createChatRequestWithJsonSchema(params: {\n anthropicSdk: any\n config?: Partial<Config>\n }) {\n const anthropic = new AnthropicCtodService(params.anthropicSdk)\n const chat = anthropic.createChat()\n chat.setConfig(params.config || {})\n return async (messages: any[], { schema, abortController }: any) => {\n const jsonSchema = validateToJsonSchema(schema.output)\n const content = await chat.chatAndStructure(messages, jsonSchema, {\n abortController\n })\n return content\n }\n }\n\n createChat() {\n return new AnthropicChat(this)\n }\n}\n", "import axios from 'axios'\nimport { XChat, Config } from './chat.js'\nimport { XImagesGeneration } from './images-generation.js'\nimport { validateToJsonSchema } from '../../utils/validate.js'\n\nexport class XCtodService {\n _axios = axios.create()\n _apiKey = ''\n\n static createChatRequest(\n apiKey: string | (() => Promise<string>),\n config: Partial<Config> | (() => Promise<Partial<Config>>) = {},\n options?: {\n axios?: any\n }\n ) {\n return async(messages: any[], { onCancel }: any) => {\n const xAi = new XCtodService(typeof apiKey === 'string' ? apiKey : await apiKey())\n const chat = xAi.createChat()\n const abortController = new AbortController()\n if (options && options.axios) {\n xAi.setAxios(options.axios)\n }\n chat.setConfig(typeof config === 'function' ? await config() : config)\n onCancel(() => abortController.abort())\n const { text } = await chat.talk(messages, {\n abortController\n })\n return text\n }\n }\n\n static createChatRequestWithJsonSchema(params: {\n axios?: any\n apiKey: string | (() => Promise<string>)\n config?: Partial<Pick<Config, 'model' | 'temperature'>> | (() => Promise<Partial<Pick<Config, 'model' | 'temperature'>>>)\n }) {\n return async(messages: any[], { schema, abortController }: any) => {\n const xAi = new XCtodService(typeof params.apiKey === 'string' ? params.apiKey : await params.apiKey())\n const chat = xAi.createChat()\n if (params.config) {\n chat.setConfig(typeof params.config === 'function' ? await params.config() : params.config)\n }\n if (params.axios) {\n xAi.setAxios(params.axios)\n }\n const jsonSchema = validateToJsonSchema(schema.output)\n const { text } = await chat.talk(messages, {\n abortController,\n jsonSchema: {\n name: 'data',\n strict: true,\n schema: jsonSchema\n }\n })\n return text\n }\n }\n\n constructor(apiKey = '') {\n this._apiKey = apiKey\n }\n\n /**\n * @zh \u5982\u679C\u4F60\u6709\u9700\u8981\u7279\u5225\u8A2D\u5B9A axios\uFF0C\u8ACB\u4F7F\u7528\u9019\u65B9\u6CD5\u3002\n * @en If you need to set axios, please use this method.\n */\n\n setAxios(axios: any) {\n this._axios = axios\n }\n\n /**\n * @zh \u8A2D\u5B9A api key\u3002\n * @en Set api key.\n */\n\n setConfiguration(apiKey: string) {\n this._apiKey = apiKey\n }\n\n createChat() {\n return new XChat(this)\n }\n\n createImagesGeneration() {\n return new XImagesGeneration(this)\n }\n}\n", "import { json } from 'power-helper'\nimport { XCtodService } from './index.js'\n\nexport type XMessage = {\n role: 'system' | 'user' | 'assistant'\n name?: string\n content: string\n}\n\ntype ApiResponse = {\n id: string\n object: string\n created: number\n choices: Array<{\n index: number\n finish_reason: string\n message: {\n role: 'system' | 'user' | 'assistant'\n name?: string\n content: string\n }\n }>\n usage: {\n prompt_tokens: number\n completion_tokens: number\n total_tokens: number\n }\n}\n\nexport type Config = {\n /**\n * @zh \u4E00\u6B21\u56DE\u61C9\u6578\u91CF\n * @en How many chat completion choices to generate for each input message.\n */\n n: number\n /**\n * @zh \u9078\u64C7\u904B\u884C\u7684\u6A21\u578B'\n * @en The model to use for this chat completion.\n */\n model: string\n /**\n * @zh \u5192\u96AA\u6307\u6578\uFF0C\u6578\u503C\u7531 0 ~ 2 \u4E4B\u9593\uFF0C\u8D8A\u4F4E\u56DE\u61C9\u8D8A\u7A69\u5B9A\u3002\n * @en What sampling temperature to use, between 0 and 2. Higher values like 0.8 will make the output more random, while lower values like 0.2 will make it more focused and deterministic.\n */\n temperature: number\n /**\n * @zh \u662F\u5426\u5F37\u5236\u8981\u56DE\u50B3 JSON \u683C\u5F0F\u7684\u8CC7\u6599\n * @en Whether to force the return of JSON format data\n */\n forceJsonFormat: boolean\n /**\n * @zh \u6BCF\u6B21\u5C0D\u8A71\u6700\u591A\u7522\u751F\u5E7E\u500B tokens\u3002\n * @en How many tokens to complete to.\n */\n maxTokens?: number\n}\n\nexport class XChat {\n xAi: XCtodService\n config: Config = {\n n: 1,\n model: 'grok-3',\n temperature: 1,\n maxTokens: undefined,\n forceJsonFormat: true\n }\n\n constructor(xAi: XCtodService) {\n this.xAi = xAi\n }\n\n /**\n * @zh \u6539\u8B8A\u5C0D\u8A71\u7684\u4E00\u4E9B\u8A2D\u5B9A\n * @en Change some settings of the conversation\n */\n\n setConfig(options: Partial<Config>) {\n Object.assign(this.config, options)\n }\n\n /**\n * @zh \u9032\u884C\u5C0D\u8A71\n * @en Talk to the AI\n */\n\n async talk(messages: XMessage[] = [], options?: {\n /** \u8981 forceJsonFormat \u70BA true \u624D\u6703\u751F\u6548 */\n jsonSchema?: any\n abortController?: AbortController\n }) {\n const newMessages = json.jpjs(messages)\n let response_format: any = undefined\n if (this.config.forceJsonFormat) {\n response_format = {\n type: 'json_object'\n }\n }\n if (this.config.forceJsonFormat && options?.jsonSchema) {\n response_format = {\n type: 'json_schema',\n json_schema: options.jsonSchema\n }\n }\n const result = await this.xAi._axios.post<ApiResponse>('https://api.x.ai/v1/chat/completions', {\n model: this.config.model,\n n: this.config.n,\n messages: newMessages,\n response_format,\n temperature: this.config.temperature\n }, {\n signal: options?.abortController?.signal,\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${this.xAi._apiKey}`\n }\n })\n const choices = result.data.choices || []\n const message = choices[0]?.message || {\n role: 'assistant',\n content: ''\n }\n newMessages.push(message)\n return {\n id: result?.data.id as string,\n text: message.content as string,\n newMessages,\n isDone: choices[0]?.finish_reason === 'stop',\n apiResponse: result.data\n }\n }\n\n talkStream(params: {\n messages: any[]\n onMessage: (_message: string) => void\n onEnd: () => void\n onWarn: (_warn: any) => void\n onError: (_error: any) => void\n }) {\n const controller = new AbortController()\n fetch('https://api.x.ai/v1/chat/completions', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${this.xAi._apiKey}`\n },\n body: JSON.stringify({\n model: this.config.model,\n stream: true,\n messages: params.messages\n }),\n signal: controller.signal\n }).then(async response => {\n if (!response.ok) {\n const errorText = await response.text()\n throw new Error(`Error: ${errorText}`)\n }\n const reader = response.body?.pipeThrough(new TextDecoderStream()).getReader()\n if (!reader) {\n throw new Error('Can not get reader')\n }\n while (true) {\n const { value, done } = await reader.read()\n if (done) {\n break\n }\n const items = value.split('\\n')\n for (let item of items) {\n if (item.length === 0) {\n continue\n }\n if (item.startsWith(':')) {\n continue\n }\n if (item === 'data: [DONE]') {\n params.onEnd()\n break\n }\n try {\n const result = JSON.parse(item.substring(6))\n const content = result.choices[0].delta.content\n params.onMessage(content)\n } catch (error) {\n params.onWarn(error)\n }\n }\n }\n }).catch(error => {\n if (error.name === 'AbortError') {\n params.onEnd()\n } else {\n params.onError(error)\n }\n })\n return {\n cancel: () => controller.abort()\n }\n }\n\n /**\n * @zh \u958B\u555F\u6301\u7E8C\u6027\u5C0D\u8A71\n */\n\n async keepTalk(prompt: string | string[], oldMessages: XMessage[] = []) {\n const result = await this.talk([\n ...oldMessages,\n {\n role: 'user',\n content: Array.isArray(prompt) ? prompt.join('\\n') : prompt\n }\n ])\n return {\n result,\n nextTalk: (prompt: string | string[]) => this.keepTalk(prompt, result.newMessages)\n }\n }\n}\n", "import { XCtodService } from './index.js'\n\ntype ApiResponse = {\n created: string\n data: {\n b64_json: string\n }[]\n}\n\ntype Config = {\n /**\n * @zh \u6A21\u578B\uFF0C\u652F\u63F4 grok-2-image\n * @en Model, support grok-2-image\n */\n model: 'grok-2-image'\n}\n\nexport class XImagesGeneration {\n private xAi: XCtodService\n private config: Config = {\n model: 'grok-2-image'\n }\n\n constructor(xAi: XCtodService) {\n this.xAi = xAi\n }\n\n /**\n * @zh \u6539\u8B8A\u5C0D\u8A71\u7684\u4E00\u4E9B\u8A2D\u5B9A\n * @en Change some settings of the conversation\n */\n\n setConfig(options: Partial<Config>) {\n Object.assign(this.config, options)\n }\n\n /**\n * @zh \u7522\u751F\u5716\u7247\n * @en Generate image\n */\n\n async create(prompt: string) {\n const result = await this.xAi._axios.post<ApiResponse>('https://api.x.ai/v1/images/generations', {\n prompt,\n n: 1,\n model: this.config.model,\n response_format: 'b64_json'\n }, {\n timeout: 1000 * 60 * 5,\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${this.xAi._apiKey}`\n }\n })\n return result.data\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["plugins_exports", "__export", "LimiterPlugin", "LimiterPluginGlobState", "PrintLogPlugin", "RetryPlugin", "RolePlugin", "Event", "ChatBrokerPlugin", "params", "__publicField", "Event", "data", "callback", "retry_default", "ChatBrokerPlugin", "z", "log", "attach", "params", "count", "retry", "messages", "changeMessages", "print_log_default", "ChatBrokerPlugin", "z", "params", "log", "attach", "lastUserMessage", "messages", "parseText", "output", "Event", "flow", "Schedule", "config", "state", "limiter_default", "ChatBrokerPlugin", "attach", "now", "time", "nextId", "uid", "resolve", "id", "off", "role_default", "ChatBrokerPlugin", "z", "attach", "params", "messages", "changeMessages", "PrintLogPlugin", "print_log_default", "RetryPlugin", "retry_default", "LimiterPlugin", "limiter_default", "LimiterPluginGlobState", "RolePlugin", "role_default", "templates_exports", "__export", "requireJsonResponse", "requireJsonResponseWithHandlebars", "requireJsonResponseWithJsonSchema", "Handlebars", "record", "question", "format", "key", "value", "handlebars", "chinese_conv_exports", "__export", "s2t", "t2s", "Converter", "text", "JSON5", "TextParser", "_TextParser", "params", "__publicField", "text", "jsonRegex", "matchedText", "JSON5", "Event", "flow", "Hook", "Log", "z", "toJSONSchema", "validate", "target", "schemaCallback", "z", "validateToJsonSchema", "schema", "toJSONSchema", "ParserError", "error", "parserFails", "__publicField", "Translator", "params", "__publicField", "data", "context", "scheme", "validate", "prompt", "schema", "text", "result", "parserName", "parserFails", "parse", "error", "ParserError", "z", "ChatBroker", "params", "__publicField", "Hook", "Event", "Log", "Translator", "TextParser", "context", "key", "requestId", "data", "id", "flow", "waitCancel", "isCancel", "isSending", "abortController", "listeners", "cancelTrigger", "eventOff", "e", "onCancel", "cb", "request", "schema", "output", "plugins", "metadata", "question", "preMessages", "messages", "ms", "count", "doBreak", "response", "parseText", "retryFlag", "lastUserMessage", "sender", "error", "ParserError", "text", "z", "validateToJsonSchema", "z", "CtoD", "params", "__publicField", "install", "ChatBroker", "context", "id", "plugins", "data", "metadata", "changeMessages", "changeOutputSchema", "schema", "z", "messages", "e", "axios", "OpenAIVision", "openai", "__publicField", "options", "messages", "result", "message", "json", "OpenAIChat", "openai", "__publicField", "options", "input", "result", "messages", "newMessages", "json", "response_format", "choices", "message", "params", "controller", "response", "reader", "value", "done", "items", "item", "content", "error", "prompt", "oldMessages", "OpenAIImagesGeneration", "openai", "__publicField", "options", "prompt", "OpenAICtodService", "_OpenAICtodService", "apiKey", "__publicField", "axios", "config", "options", "messages", "abortController", "openai", "chat", "text", "params", "schema", "onCancel", "jsonSchema", "validateToJsonSchema", "baseUrl", "OpenAIChat", "OpenAIVision", "OpenAIImagesGeneration", "axios", "flow", "Once", "Template", "Requester", "core", "__publicField", "streamAbortController", "streamAbortControllerId", "flow", "e", "params", "signal", "controllerId", "end", "reader", "response", "done", "chunk", "value", "readerDone", "payloads", "payload", "data", "error", "LlamaCppCompletion", "Once", "url", "props", "config", "lastMessage", "requester", "prompt", "Template", "result", "t2s", "message", "s2t", "content", "LlamaCppCtodService", "_LlamaCppCtodService", "__publicField", "axios", "params", "messages", "schema", "onCancel", "ll3cpp", "chat", "config", "formatSchema", "validateToJsonSchema", "t2s", "run", "cancel", "message", "s2t", "LlamaCppCompletion", "json", "GoogleChat", "google", "__publicField", "options", "messages", "newMessages", "json", "text", "params", "state", "stream", "chunk", "chunkText", "error", "GoogleImagesGeneration", "google", "__publicField", "options", "prompt", "e", "GoogleCtodService", "_GoogleCtodService", "googleGenAI", "__publicField", "messages", "contentToParts", "content", "type", "image_url", "text", "url", "mimeType", "message", "params", "removeAdditionalProperties", "schema", "key", "abortController", "config", "validateToJsonSchema", "GoogleChat", "GoogleImagesGeneration", "AnthropicChatDataGenerator", "config", "__publicField", "messages", "e", "jsonSchema", "translateMessages", "result", "response", "newMessages", "output", "textContent", "AnthropicChat", "anthropic", "options", "body", "msg", "params", "stream", "onMessage", "onEnd", "onError", "messageStream", "deltaText", "error", "int", "AnthropicCtodService", "_AnthropicCtodService", "anthropicSdk", "__publicField", "messages", "e", "content", "url", "params", "chat", "schema", "abortController", "jsonSchema", "validateToJsonSchema", "AnthropicChat", "axios", "json", "XChat", "xAi", "__publicField", "options", "messages", "newMessages", "json", "response_format", "result", "choices", "message", "params", "controller", "response", "errorText", "reader", "value", "done", "items", "item", "content", "error", "prompt", "oldMessages", "XImagesGeneration", "xAi", "__publicField", "options", "prompt", "XCtodService", "_XCtodService", "apiKey", "__publicField", "axios", "config", "options", "messages", "onCancel", "xAi", "chat", "abortController", "text", "params", "schema", "jsonSchema", "validateToJsonSchema", "XChat", "XImagesGeneration"]
|
|
7
7
|
}
|
package/examples/google.ts
CHANGED
package/examples/openai.ts
CHANGED
package/examples/plugin.ts
CHANGED
package/lib/broker/chat.ts
CHANGED
|
@@ -2,8 +2,9 @@ import { TextParser } from '../core/parser.js'
|
|
|
2
2
|
import { ChatBrokerPlugin } from '../core/plugin.js'
|
|
3
3
|
import { Event, flow, Hook, Log } from 'power-helper'
|
|
4
4
|
import { Translator, TranslatorParams } from '../core/translator.js'
|
|
5
|
-
import { ValidateCallback, ValidateCallbackOutputs } from '../utils/validate.js'
|
|
5
|
+
import { ValidateCallback, ValidateCallbackOutputs, validateToJsonSchema } from '../utils/validate.js'
|
|
6
6
|
import { ParserError } from '../utils/error.js'
|
|
7
|
+
import { z } from 'zod'
|
|
7
8
|
|
|
8
9
|
export type Message = {
|
|
9
10
|
role: 'system' | 'user' | 'assistant' | (string & Record<string, unknown>)
|
|
@@ -228,7 +229,7 @@ export class ChatBroker<
|
|
|
228
229
|
// event
|
|
229
230
|
//
|
|
230
231
|
|
|
231
|
-
|
|
232
|
+
const listeners = [
|
|
232
233
|
this.event.on('cancel', ({ requestId }) => {
|
|
233
234
|
if (requestId === id) {
|
|
234
235
|
cancelTrigger()
|
|
@@ -238,8 +239,8 @@ export class ChatBroker<
|
|
|
238
239
|
cancelTrigger()
|
|
239
240
|
})
|
|
240
241
|
]
|
|
241
|
-
|
|
242
|
-
|
|
242
|
+
const eventOff = () => listeners.forEach(e => e.off())
|
|
243
|
+
const cancelTrigger = () => {
|
|
243
244
|
if (isCancel === false) {
|
|
244
245
|
if (isSending && waitCancel) {
|
|
245
246
|
waitCancel()
|
|
@@ -249,7 +250,7 @@ export class ChatBroker<
|
|
|
249
250
|
eventOff()
|
|
250
251
|
}
|
|
251
252
|
}
|
|
252
|
-
|
|
253
|
+
const onCancel = (cb: () => void) => {
|
|
253
254
|
waitCancel = () => {
|
|
254
255
|
cb()
|
|
255
256
|
}
|
|
@@ -439,4 +440,60 @@ export class ChatBroker<
|
|
|
439
440
|
const output = await request
|
|
440
441
|
return output
|
|
441
442
|
}
|
|
443
|
+
|
|
444
|
+
/**
|
|
445
|
+
* @zh 取得預先請求的資訊,包含輸出規格與預設訊息,這生命週期只會執行到 start 階段為止,也不會觸發 plugin。
|
|
446
|
+
* @en Get pre-request information, including output specifications and default messages. This life cycle will only execute up to the start stage and will not trigger plugins.
|
|
447
|
+
*/
|
|
448
|
+
|
|
449
|
+
async getPreRequestInfo<T extends Translator<S, O>>(data: T['__schemeType']) {
|
|
450
|
+
this._install()
|
|
451
|
+
let id = flow.createUuid()
|
|
452
|
+
let schema = this.translator.getValidate()
|
|
453
|
+
let plugins = {} as any
|
|
454
|
+
let metadata = new Map()
|
|
455
|
+
let question = await this.translator.compile(data, {
|
|
456
|
+
schema
|
|
457
|
+
})
|
|
458
|
+
let preMessages: Message[] = []
|
|
459
|
+
let messages: Message[] = []
|
|
460
|
+
if (question.prompt) {
|
|
461
|
+
messages.push({
|
|
462
|
+
role: 'user',
|
|
463
|
+
content: question.prompt
|
|
464
|
+
})
|
|
465
|
+
}
|
|
466
|
+
await this.hook.notify('start', {
|
|
467
|
+
id,
|
|
468
|
+
data,
|
|
469
|
+
schema,
|
|
470
|
+
plugins,
|
|
471
|
+
messages,
|
|
472
|
+
metadata,
|
|
473
|
+
setPreMessages: ms => {
|
|
474
|
+
preMessages = ms.map(e => {
|
|
475
|
+
return {
|
|
476
|
+
...e,
|
|
477
|
+
content: Array.isArray(e.content) ? e.content.join('\n') : e.content
|
|
478
|
+
}
|
|
479
|
+
})
|
|
480
|
+
},
|
|
481
|
+
changeMessages: ms => {
|
|
482
|
+
messages = ms
|
|
483
|
+
},
|
|
484
|
+
changeOutputSchema: output => {
|
|
485
|
+
this.translator.changeOutputSchema(output)
|
|
486
|
+
schema = this.translator.getValidate()
|
|
487
|
+
}
|
|
488
|
+
})
|
|
489
|
+
const outputSchema = schema.output(z)
|
|
490
|
+
return {
|
|
491
|
+
outputSchema,
|
|
492
|
+
outputJsonSchema: validateToJsonSchema(() => schema.output(z) as any),
|
|
493
|
+
requestMessages: [
|
|
494
|
+
...preMessages,
|
|
495
|
+
...messages
|
|
496
|
+
]
|
|
497
|
+
}
|
|
498
|
+
}
|
|
442
499
|
}
|
|
@@ -43,11 +43,6 @@ export type Config = {
|
|
|
43
43
|
* @en What sampling temperature to use, between 0 and 2. Higher values like 0.8 will make the output more random, while lower values like 0.2 will make it more focused and deterministic.
|
|
44
44
|
*/
|
|
45
45
|
temperature: number
|
|
46
|
-
/**
|
|
47
|
-
* @zh 是否強制要回傳 JSON 格式的資料
|
|
48
|
-
* @en Whether to force the return of JSON format data
|
|
49
|
-
*/
|
|
50
|
-
forceJsonFormat: boolean
|
|
51
46
|
/**
|
|
52
47
|
* @zh 每次對話最多產生幾個 tokens。
|
|
53
48
|
* @en How many tokens to complete to.
|
|
@@ -61,8 +56,7 @@ export class OpenAIChat {
|
|
|
61
56
|
n: 1,
|
|
62
57
|
model: 'gpt-4o',
|
|
63
58
|
temperature: 1,
|
|
64
|
-
maxTokens: undefined
|
|
65
|
-
forceJsonFormat: true
|
|
59
|
+
maxTokens: undefined
|
|
66
60
|
}
|
|
67
61
|
|
|
68
62
|
constructor(openai: OpenAICtodService) {
|
|
@@ -104,25 +98,12 @@ export class OpenAIChat {
|
|
|
104
98
|
*/
|
|
105
99
|
|
|
106
100
|
async talk(messages: ChatGPTMessage[] = [], options?: {
|
|
107
|
-
/** 要 forceJsonFormat 為 true 才會生效 */
|
|
108
101
|
jsonSchema?: any
|
|
109
102
|
abortController?: AbortController
|
|
110
103
|
}) {
|
|
111
104
|
const newMessages = json.jpjs(messages)
|
|
112
|
-
const isSupportJson = [
|
|
113
|
-
'gpt-4-turbo-preview',
|
|
114
|
-
'gpt-4-turbo',
|
|
115
|
-
'gpt-4o',
|
|
116
|
-
'gpt-4o-mini',
|
|
117
|
-
'gpt-3.5-turbo-1106'
|
|
118
|
-
].includes(this.config.model)
|
|
119
105
|
let response_format: any = undefined
|
|
120
|
-
if (
|
|
121
|
-
response_format = {
|
|
122
|
-
type: 'json_object'
|
|
123
|
-
}
|
|
124
|
-
}
|
|
125
|
-
if (isSupportJson && this.config.forceJsonFormat && options?.jsonSchema) {
|
|
106
|
+
if (options?.jsonSchema) {
|
|
126
107
|
response_format = {
|
|
127
108
|
type: 'json_schema',
|
|
128
109
|
json_schema: options.jsonSchema
|
|
@@ -42,7 +42,7 @@ export type Config = {
|
|
|
42
42
|
* @zh 選擇運行的模型。
|
|
43
43
|
* @en How many chat completion choices to generate for each input message.
|
|
44
44
|
*/
|
|
45
|
-
model:
|
|
45
|
+
model: string
|
|
46
46
|
/**
|
|
47
47
|
* @zh 冒險指數,數值由 0 ~ 2 之間。
|
|
48
48
|
* @en What sampling temperature to use, between 0 and 2. Higher values like 0.8 will make the output more random, while lower values like 0.2 will make it more focused and deterministic.
|
|
@@ -58,9 +58,9 @@ export type Config = {
|
|
|
58
58
|
export class OpenAIVision {
|
|
59
59
|
openai: OpenAICtodService
|
|
60
60
|
config: Config = {
|
|
61
|
-
model: 'gpt-
|
|
61
|
+
model: 'gpt-5',
|
|
62
62
|
maxTokens: undefined,
|
|
63
|
-
temperature:
|
|
63
|
+
temperature: 0.7
|
|
64
64
|
}
|
|
65
65
|
|
|
66
66
|
constructor(openai: OpenAICtodService) {
|
package/package.json
CHANGED
|
@@ -2,6 +2,7 @@ import { ChatBrokerPlugin } from '../core/plugin.js';
|
|
|
2
2
|
import { Event, Hook, Log } from 'power-helper';
|
|
3
3
|
import { Translator, TranslatorParams } from '../core/translator.js';
|
|
4
4
|
import { ValidateCallback, ValidateCallbackOutputs } from '../utils/validate.js';
|
|
5
|
+
import { z } from 'zod';
|
|
5
6
|
export type Message = {
|
|
6
7
|
role: 'system' | 'user' | 'assistant' | (string & Record<string, unknown>);
|
|
7
8
|
name?: string;
|
|
@@ -148,4 +149,15 @@ export declare class ChatBroker<S extends ValidateCallback<any>, O extends Valid
|
|
|
148
149
|
* @en Send request to chatbot.
|
|
149
150
|
*/
|
|
150
151
|
request<T extends Translator<S, O>>(data: T['__schemeType']): Promise<T['__outputType']>;
|
|
152
|
+
/**
|
|
153
|
+
* @zh 取得預先請求的資訊,包含輸出規格與預設訊息,這生命週期只會執行到 start 階段為止,也不會觸發 plugin。
|
|
154
|
+
* @en Get pre-request information, including output specifications and default messages. This life cycle will only execute up to the start stage and will not trigger plugins.
|
|
155
|
+
*/
|
|
156
|
+
getPreRequestInfo<T extends Translator<S, O>>(data: T['__schemeType']): Promise<{
|
|
157
|
+
outputSchema: {
|
|
158
|
+
[x: string]: any;
|
|
159
|
+
};
|
|
160
|
+
outputJsonSchema: z.core.JSONSchema.JSONSchema;
|
|
161
|
+
requestMessages: Message[];
|
|
162
|
+
}>;
|
|
151
163
|
}
|
|
@@ -39,11 +39,6 @@ export type Config = {
|
|
|
39
39
|
* @en What sampling temperature to use, between 0 and 2. Higher values like 0.8 will make the output more random, while lower values like 0.2 will make it more focused and deterministic.
|
|
40
40
|
*/
|
|
41
41
|
temperature: number;
|
|
42
|
-
/**
|
|
43
|
-
* @zh 是否強制要回傳 JSON 格式的資料
|
|
44
|
-
* @en Whether to force the return of JSON format data
|
|
45
|
-
*/
|
|
46
|
-
forceJsonFormat: boolean;
|
|
47
42
|
/**
|
|
48
43
|
* @zh 每次對話最多產生幾個 tokens。
|
|
49
44
|
* @en How many tokens to complete to.
|
|
@@ -72,7 +67,6 @@ export declare class OpenAIChat {
|
|
|
72
67
|
* @en Talk to the AI
|
|
73
68
|
*/
|
|
74
69
|
talk(messages?: ChatGPTMessage[], options?: {
|
|
75
|
-
/** 要 forceJsonFormat 為 true 才會生效 */
|
|
76
70
|
jsonSchema?: any;
|
|
77
71
|
abortController?: AbortController;
|
|
78
72
|
}): Promise<{
|
|
@@ -38,7 +38,7 @@ export type Config = {
|
|
|
38
38
|
* @zh 選擇運行的模型。
|
|
39
39
|
* @en How many chat completion choices to generate for each input message.
|
|
40
40
|
*/
|
|
41
|
-
model:
|
|
41
|
+
model: string;
|
|
42
42
|
/**
|
|
43
43
|
* @zh 冒險指數,數值由 0 ~ 2 之間。
|
|
44
44
|
* @en What sampling temperature to use, between 0 and 2. Higher values like 0.8 will make the output more random, while lower values like 0.2 will make it more focused and deterministic.
|