ctod 1.0.1 → 1.0.3
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 +14 -12
- package/dist/index.js.map +3 -3
- package/examples/anthropic.ts +1 -1
- package/examples/aws-bedrock.ts +1 -0
- 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/anthropic/chat.ts +72 -11
- 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/anthropic/chat.d.ts +21 -1
- 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,22 @@
|
|
|
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:()=>Pe,LimiterPluginGlobState:()=>ve,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 ce=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 le=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},u={event:new ke,schedule:null,waitTimes:[],waitQueue:[]},H={event:u.event,config:F,closeSchedule:()=>{u.schedule&&(u.schedule.close(),u.schedule=null)},plugin:new y({name:"limiter",params:()=>({}),receiveData:()=>({}),onInstall({attach:a}){u.schedule==null&&(u.schedule=new Te,u.schedule.add("calc queue",1e3,async()=>{let e=Date.now();if(u.waitTimes=u.waitTimes.filter(t=>e-t<F.interval),u.waitTimes.length!==F.limit){let t=u.waitQueue.shift();t&&(u.waitTimes.push(Date.now()),u.event.emit("run",{id:t}))}else u.waitTimes[0]&&u.event.emit("waitTimeChange",{waitTime:Math.floor(60-(e-u.waitTimes[0])/1e3)})}),u.schedule.play()),a("talkBefore",async()=>{let e=be.createUuid();return u.waitQueue.push(e),new Promise(t=>{u.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=le,we=ce,Pe=H.plugin,ve=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 de={};
|
|
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
|
|
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 de={};D(de,{s2t:()=>w,t2s:()=>S});import{Converter as he}from"opencc-js";var S=a=>he({from:"tw",to:"cn"})(a),w=a=>he({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 Ge,flow as Z,Hook as Ee,Log as Be}from"power-helper";import{z as L,toJSONSchema as Ie}from"zod";function X(a,e){return L.object(e(L)).parse(a||{})}function d(a){let e=Ie(L.object(a()));return delete e.$schema,e}var v=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 v(s,r)}}};import{z as fe}from"zod";var R=class{constructor(e){o(this,"__hookType");o(this,"log");o(this,"hook",new Ee);o(this,"params");o(this,"plugins",{});o(this,"installed",!1);o(this,"translator");o(this,"event",new Ge);this.log=new Be(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:h})=>{h===t&&g()}),this.event.on("cancelAll",()=>{g()})],c=()=>l.forEach(h=>h.off()),g=()=>{r===!1&&(s&&n&&n(),i.abort(),r=!0,c())},p=h=>{n=()=>{h()}},m=async()=>{let h=this.translator.getValidate(),P=null,se={},x=new Map,ae=await this.translator.compile(e,{schema:h}),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:h,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),h=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:h,onCancel:p,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 v(_,[])},changeParseText:_=>{I=_}}),P=(await this.translator.parse(I)).output,await this.hook.notify("succeeded",{id:t,output:P,metadata:x})),await this.hook.notify("done",{id:t,metadata:x}),k()}catch(b){if(b instanceof v){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}}),P};return{id:t,request:(async()=>{try{return await m()}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:p=>{l=p.map(m=>({...m,content:Array.isArray(m.content)?m.content.join(`
|
|
13
|
+
`):m.content}))},changeMessages:p=>{c=p},changeOutputSchema:p=>{this.translator.changeOutputSchema(p),n=this.translator.getValidate()}}),{outputSchema:n.output(fe),outputJsonSchema:d(()=>n.output(fe)),requestMessages:[...l,...c]}}};import*as Je 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:g})=>{let p=await t({id:r,data:i,plugins:s,zod:Je,setMessages:m=>{c(m.map(T=>({role:T.role,content:Array.isArray(T.content)?T.content.join(`
|
|
14
|
+
`):T.content})))},metadata:l});g(()=>p)})},plugins:this.params.plugins?()=>this.params.plugins():void 0,request:this.params.request})}}};import qe from"axios";var G=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 Ve}from"power-helper";var E=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=Ve.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 p=JSON.parse(c.substring(6)).choices[0].delta.content;e.onMessage(p)}catch(g){e.onWarn(g)}}}}).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 B=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=d(n.output),{text:g}=await i.talk(t,{abortController:l,jsonSchema:{name:"data",strict:!0,schema:c}});return g}}setAxios(e){this._axios=e}setBaseUrl(e){this._baseUrl=e}setConfiguration(e){this._apiKey=e}createChat(){return new E(this)}createVision(){return new G(this)}createImagesGeneration(){return new B(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,g="";for(;!c;){let{value:p,done:m}=await l.read();if(p){g+=new TextDecoder("utf-8").decode(p);let T=g.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
|
-
`)
|
|
18
|
+
`);g=T.pop()||"",T.forEach(h=>{if(h.includes("[DONE]")&&(c=!0),h.startsWith("data:"))try{let P=JSON.parse(h.replace("data: ",""));e.onMessage(P)}catch(P){e.onWarn(P)}})}m&&(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)}}},J=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=d(n.output);e.axios&&s.setAxios(e.axios),i.config.autoConvertTraditionalChinese&&(c=JSON.parse(S(JSON.stringify(c))));let{run:g,cancel:p}=i.talk({options:e.talkOptions,messages:t,response_format:{type:"json_object",schema:c}});r(p);let{message:m}=await g();return i.config.autoConvertTraditionalChinese?w(m):m}}setAxios(e){this._axios=e}createCompletion(){return new J(this)}};import{json as ze}from"power-helper";var V=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:d(s.output)}})).text||""}}createChat(){return new V(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")}}getThinkingParams(){let e=this.config(),t=Math.floor(e.maxTokens*.25);return e.thinking===!1?void 0:{budget_tokens:t<=1024?1024:t>32e3?32e3:t,type:"enabled"}}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.thinking?1:t.temperature,system:n.system,messages:n.messages,thinking:this.getThinkingParams()}}parseTalkResult(e){let t=[];if("content"in e)for(let n of e.content)n.type==="text"&&t.push(n.text);return t.join(`
|
|
19
|
+
`)}parseTalkThingsResult(e){let t=[];if("content"in e)for(let n of e.content)n.type==="thinking"&&t.push(n.thinking);return t}createTalkStreamBody(e){let t=this.config(),n=this.translateMessages(e);return{model:t.model,max_tokens:t.maxTokens,temperature:t.thinking?1:t.temperature,system:n.system,stream:!0,thinking:this.getThinkingParams(),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",thinking:!1,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 chatAndStructureWithDetails(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{data:this.dataGenerator.parseChatAndStructureResult(i),thinking:this.dataGenerator.parseTalkThingsResult(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)}async talkAndDetails(e=[]){let t=this.anthropic.anthropicSdk,n=this.dataGenerator.createTalkBody(e),r=await t.messages.create(n);return{text:this.dataGenerator.parseTalkResult(r),thinking:this.dataGenerator.parseTalkThingsResult(r)}}talkStream(e){let t=null,n=this.anthropic.anthropicSdk,{onThinking:r,onMessage:s,onEnd:i,onError:l}=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)m.type==="content_block_delta"&&(m.delta.type==="thinking_delta"&&r&&r(m.delta.thinking),m.delta.type==="text_delta"&&s(m.delta.text))}i()}catch(p){l(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=d(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(`
|
|
20
|
+
`);for(let c of l)if(c.length!==0&&!c.startsWith(":")){if(c==="data: [DONE]"){e.onEnd();break}try{let p=JSON.parse(c.substring(6)).choices[0].delta.content;e.onMessage(p)}catch(g){e.onWarn(g)}}}}).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(`
|
|
21
|
+
`):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:g}=await l.talk(r,{abortController:c});return g}}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=d(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,de as chineseConverter,ge as plugins,ue as templates,d as validateToJsonSchema};
|
|
20
22
|
//# sourceMappingURL=index.js.map
|