ctod 0.7.2 → 0.8.0

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.md CHANGED
@@ -201,7 +201,7 @@ const ctod = new CtoD({
201
201
 
202
202
  ## Examples
203
203
 
204
- [基礎用法 - 藥物查詢功能](./examples/basic.ts)
204
+ [基礎用法 - 藥物查詢功能](./examples/openai.ts)
205
205
 
206
206
  [進階用法 - 請 AI COSPLAY](./examples/plugin.ts)
207
207
 
package/dist/index.js CHANGED
@@ -1 +1,40 @@
1
- !function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports.ctod=t():e.ctod=t()}(this||("undefined"!=typeof window?window:global),(()=>(()=>{"use strict";var e={177:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ChatBroker=void 0;const n=a(306),r=a(572),o=a(235),s=a(165);t.ChatBroker=class{__hookType;log;hook=new r.Hook;params;plugins={};installed=!1;translator;event=new r.Event;constructor(e){this.log=new r.Log(e.name??"no name"),this.params=e,this.translator=new o.Translator({...e,parsers:[n.TextParser.JsonMessage()]})}_install(){if(!1===this.installed){this.installed=!0;const 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="function"==typeof this.params.plugins?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=r.flow.createUuid(),a=null,n=!1,o=!1,i=[this.event.on("cancel",(({requestId:e})=>{e===t&&c()})),this.event.on("cancelAll",(()=>{c()}))],l=()=>i.forEach((e=>e.off())),c=()=>{!1===n&&(o&&a&&a(),n=!0,l())},u=e=>{a=e},p=async()=>{let i=this.translator.getValidate(),l=null,c={},p=new Map,d=await this.translator.compile(e,{schema:i}),h=[],f=[];d.prompt&&f.push({role:"user",content:d.prompt});for(let e in this.plugins)c[e]={send:a=>this.plugins[e].send({id:t,data:a})};return await this.hook.notify("start",{id:t,data:e,schema:i,plugins:c,messages:f,metadata:p,setPreMessages:e=>{h=e.map((e=>({...e,content:Array.isArray(e.content)?e.content.join("\n"):e.content})))},changeMessages:e=>{f=e},changeOutputSchema:e=>{this.translator.changeOutputSchema(e),i=this.translator.getValidate()}}),f=[...h,...f],await r.flow.asyncWhile((async({count:r,doBreak:c})=>{if(r>=99)return c();let d="",h="",m=!1,g=f.filter((e=>"user"===e.role)).slice(-1)[0]?.content||"";try{await this.hook.notify("talkBefore",{id:t,data:e,messages:f,metadata:p,lastUserMessage:g});const y=this.params.request(f,{id:t,count:r,schema:i,onCancel:u,metadata:p,isRetry:m});if(n)a&&a();else try{o=!0,d=await y,h=d}finally{o=!1}!1===n&&(await this.hook.notify("talkAfter",{id:t,data:e,response:d,messages:f,parseText:h,metadata:p,lastUserMessage:g,parseFail:e=>{throw new s.ParserError(e,[])},changeParseText:e=>{h=e}}),l=(await this.translator.parse(h)).output,await this.hook.notify("succeeded",{id:t,output:l,metadata:p})),await this.hook.notify("done",{id:t,metadata:p}),c()}catch(e){if(!(e instanceof s.ParserError))throw await this.hook.notify("done",{id:t,metadata:p}),e;if(await this.hook.notify("parseFailed",{id:t,error:e.error,count:r,response:d,messages:f,metadata:p,lastUserMessage:g,parserFails:e.parserFails,retry:()=>{m=!0},changeMessages:e=>{f=e}}),!1===m)throw await this.hook.notify("done",{id:t,metadata:p}),e}})),l};return{id:t,request:(async()=>{try{return await p()}finally{l()}})()}}async request(e){const{request:t}=this.requestWithId(e);return await t}}},306:function(e,t,a){var n=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.TextParser=void 0;const r=n(a(865));class o{params;static JsonMessage(){return new o({name:"JsonMessage",handler:async e=>{try{return JSON.parse(e)}catch(t){const a=/{(?:[^{}]|(?:{[^{}]*}))*}/,n=e.match(a)?.[0]||"";return r.default.parse(n)}}})}constructor(e){this.params=e}get name(){return this.params.name}async read(e){return await this.params.handler(e)}}t.TextParser=o},198:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ChatBrokerPlugin=void 0;const n=a(572);t.ChatBrokerPlugin=class{_event=new n.Event;_params;constructor(e){this._params=e}use(e){return{instance:this,params:e,send:e=>{this._event.emit("receive",e)},receive:e=>{this._event.on("receive",e)},__receiveData:null}}}},235:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Translator=void 0;const n=a(357),r=a(165);t.Translator=class{params;constructor(e){this.params=e}get __schemeType(){return null}get __outputType(){return null}async compile(e,t){const a=this.params.input?(0,n.validate)(e,this.params.input):e,r=this.params.question?await this.params.question(a,t):"";return{scheme:a,prompt:Array.isArray(r)?r.join("\n"):r}}getValidate(){return{input:this.params.input,output:this.params.output}}changeOutputSchema(e){this.params.output=e}async parse(e){let t,a="",o=[];for(let n of this.params.parsers)try{t=await n.read(e),a=n.name}catch(e){t=void 0,o.push({name:n.name,error:e})}try{return{output:(0,n.validate)(t,this.params.output),parserName:a,parserFails:o}}catch(e){throw new r.ParserError(e,o)}}}},697:function(e,t,a){var n=this&&this.__createBinding||(Object.create?function(e,t,a,n){void 0===n&&(n=a);var r=Object.getOwnPropertyDescriptor(t,a);r&&!("get"in r?!t.__esModule:r.writable||r.configurable)||(r={enumerable:!0,get:function(){return t[a]}}),Object.defineProperty(e,n,r)}:function(e,t,a,n){void 0===n&&(n=a),e[n]=t[a]}),r=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),o=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var a in e)"default"!==a&&Object.prototype.hasOwnProperty.call(e,a)&&n(t,e,a);return r(t,e),t};Object.defineProperty(t,"__esModule",{value:!0}),t.CtoD=void 0;const s=a(177),i=o(a(622));t.CtoD=class{params;constructor(e){this.params=e}createBrokerBuilder(e){return{create:t=>new s.ChatBroker({output:()=>({}),install:a=>{e?.install?.(a),a.attach("start",(async({id:e,plugins:a,data:n,metadata:r,changeMessages:o,changeOutputSchema:s})=>{const l=await t({id:e,data:n,plugins:a,yup:i,setMessages:e=>{o(e.map((e=>({role:e.role,content:Array.isArray(e.content)?e.content.join("\n"):e.content}))))},metadata:r});s((()=>l))}))},plugins:this.params.plugins?()=>this.params.plugins():void 0,request:this.params.request})}}}},665:function(e,t,a){var n=this&&this.__createBinding||(Object.create?function(e,t,a,n){void 0===n&&(n=a);var r=Object.getOwnPropertyDescriptor(t,a);r&&!("get"in r?!t.__esModule:r.writable||r.configurable)||(r={enumerable:!0,get:function(){return t[a]}}),Object.defineProperty(e,n,r)}:function(e,t,a,n){void 0===n&&(n=a),e[n]=t[a]}),r=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),o=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var a in e)"default"!==a&&Object.prototype.hasOwnProperty.call(e,a)&&n(t,e,a);return r(t,e),t};Object.defineProperty(t,"__esModule",{value:!0}),t.ctod=t.Translator=t.ChatBrokerPlugin=t.ChatBroker=t.TextParser=t.Llama3Cpp=t.OpenAI=t.defineYupSchema=t.validateToJsonSchema=t.CtoD=t.templates=t.plugins=void 0,t.plugins=o(a(374)),t.templates=o(a(854));var s=a(697);Object.defineProperty(t,"CtoD",{enumerable:!0,get:function(){return s.CtoD}});var i=a(357);Object.defineProperty(t,"validateToJsonSchema",{enumerable:!0,get:function(){return i.validateToJsonSchema}}),Object.defineProperty(t,"defineYupSchema",{enumerable:!0,get:function(){return i.defineYupSchema}});var l=a(984);Object.defineProperty(t,"OpenAI",{enumerable:!0,get:function(){return l.OpenAI}});var c=a(887);Object.defineProperty(t,"Llama3Cpp",{enumerable:!0,get:function(){return c.Llama3Cpp}});var u=a(306);Object.defineProperty(t,"TextParser",{enumerable:!0,get:function(){return u.TextParser}});var p=a(177);Object.defineProperty(t,"ChatBroker",{enumerable:!0,get:function(){return p.ChatBroker}});var d=a(198);Object.defineProperty(t,"ChatBrokerPlugin",{enumerable:!0,get:function(){return d.ChatBrokerPlugin}});var h=a(235);Object.defineProperty(t,"Translator",{enumerable:!0,get:function(){return h.Translator}});const f=o(a(374)),m=o(a(854)),g=a(984),y=a(697),_=a(887),v=a(235),b=a(306),w=a(177),C=a(198),O=a(357);t.ctod={CtoD:y.CtoD,OpenAI:g.OpenAI,Llama3Cpp:_.Llama3Cpp,plugins:f,templates:m,ChatBroker:w.ChatBroker,Translator:v.Translator,TextParser:b.TextParser,ChatBrokerPlugin:C.ChatBrokerPlugin,defineYupSchema:O.defineYupSchema,validateToJsonSchema:O.validateToJsonSchema},e.exports=t.ctod,e.exports.ctod=t.ctod,t.default=t.ctod},374:function(e,t,a){var n=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.RolePlugin=t.LimiterPluginGlobState=t.LimiterPlugin=t.RetryPlugin=t.PrintLogPlugin=void 0;const r=n(a(92)),o=n(a(354)),s=n(a(270)),i=n(a(724));t.PrintLogPlugin=o.default,t.RetryPlugin=r.default,t.LimiterPlugin=s.default.plugin,t.LimiterPluginGlobState=s.default,t.RolePlugin=i.default},270:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0});const n=a(198),r=a(572),o={limit:3,interval:6e4},s={event:new r.Event,schedule:null,waitTimes:[],waitQueue:[]};t.default={event:s.event,config:o,closeSchedule:()=>{s.schedule&&(s.schedule.close(),s.schedule=null)},plugin:new n.ChatBrokerPlugin({name:"limiter",params:()=>({}),receiveData:()=>({}),onInstall({attach:e}){null==s.schedule&&(s.schedule=new r.Schedule,s.schedule.add("calc queue",1e3,(async()=>{const e=Date.now();if(s.waitTimes=s.waitTimes.filter((t=>e-t<o.interval)),s.waitTimes.length!==o.limit){let e=s.waitQueue.shift();e&&(s.waitTimes.push(Date.now()),s.event.emit("run",{id:e}))}else s.waitTimes[0]&&s.event.emit("waitTimeChange",{waitTime:Math.floor(60-(e-s.waitTimes[0])/1e3)})})),s.schedule.play()),e("talkBefore",(async()=>{const e=r.flow.createUuid();return s.waitQueue.push(e),new Promise((t=>{s.event.on("run",(({id:a},{off:n})=>{a===e&&(n(),t())}))}))}))}})}},354:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0});const n=a(198);t.default=new n.ChatBrokerPlugin({name:"print-log",params:e=>({detail:e.boolean().default(!1)}),receiveData:()=>({}),onInstall({params:e,log:t,attach:a}){a("talkBefore",(async({lastUserMessage:a,messages:n})=>{t.print("Send:",{color:"green"}),e.detail?t.print("\n"+JSON.stringify(n,null,4)):t.print("\n"+a)})),a("talkAfter",(async({parseText:e})=>{t.print("Receive:",{color:"cyan"}),t.print("\n"+e)})),a("succeeded",(async({output:e})=>{t.print("Output:",{color:"yellow"});try{t.print("\n"+JSON.stringify(e,null,4))}catch(a){t.print("\n"+e)}}))}})},92:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0});const n=a(198);t.default=new n.ChatBrokerPlugin({name:"retry",params:e=>({retry:e.number().required().default(1),printWarn:e.boolean().required().default(!0)}),receiveData:()=>({}),onInstall({log:e,attach:t,params:a}){t("parseFailed",(async({count:t,retry:n,messages:r,changeMessages:o})=>{t<=a.retry&&(a.printWarn&&e.print(`Is Failed, Retry ${t} times.`),o(r),n())}))}})},724:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0});const n=a(198);t.default=new n.ChatBrokerPlugin({name:"role",params:e=>({role:e.string().required()}),receiveData:()=>({}),onInstall({attach:e,params:t}){e("start",(async({messages:e,changeMessages:a})=>{a([{role:"user",content:`你現在是${t.role}。`},{role:"assistant",content:`沒問題,我現在是${t.role},有什麼可以幫你的嗎?`},...e])}))}})},129:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Llama3CppCompletion=void 0;const n=a(572),r=a(4);class o{core;streamAbortControllers=[];constructor(e){this.core=e}createAbortController(){const e=new AbortController,t=n.flow.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){const{signal:t,controllerId:a}=this.createAbortController(),n=()=>{this.removeAbortController(a),e.onEnd()};fetch(`${this.core.config.baseUrl}/${e.path}`,{method:"POST",body:JSON.stringify(e.data),signal:t,headers:{"Content-Type":"application/json",...this.core.config.headers}}).then((async t=>{if(t.body){let a=t.body.getReader(),r=!1,o="";for(;!r;){const{value:t,done:n}=await a.read();if(t){o+=new TextDecoder("utf-8").decode(t);const a=o.split("\n\n");o=a.pop()||"",a.forEach((t=>{if(t.includes("[DONE]")&&(r=!0),t.startsWith("data:"))try{const a=JSON.parse(t.replace("data: ",""));e.onMessage(a)}catch(t){e.onWarn(t)}}))}n&&(r=!0)}n()}else e.onError(new Error("Body not found."))})).catch((t=>{t instanceof Error&&t.message.includes("The user aborted a request")?n():e.onError(t)}))}async fetch(e){const{signal:t,controllerId:a}=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(a)}}cancel(){this.streamAbortControllers.forEach((e=>e.controller.abort())),this.streamAbortControllers=[]}export(){return{cancel:this.cancel.bind(this)}}}t.Llama3CppCompletion=class{core;config={baseUrl:"",headers:{},autoConvertTraditionalChinese:!0};constructor(e){this.core=e}setConfig(e){this.config={...this.config,...e}}completion(e){const t=[];for(let{role:a,content:n}of e.messages)"system"===a&&t.push(`<|start_header_id|>system<|end_header_id|>\n\n${n}\n\n`),"user"===a&&t.push(`<|start_header_id|>user<|end_header_id|>\n\n${n?.replaceAll("\n","\\n")??""}`),"assistant"===a&&t.push("<|start_header_id|>assistant<|end_header_id|>\n\n"+n);const a=e.messages.at(-1)||"",n=new o(this);return{...n.export(),run:async()=>{const o=await n.fetch({path:"completion",data:{...e.options||{},prompt:this.config.autoConvertTraditionalChinese?(0,r.sify)(t.join("\n")):t.join("\n")}}),s=this.config.autoConvertTraditionalChinese?(0,r.tify)(o.data.content):o.data.content;return{message:s,fullMessage:`${a}${s}`}}}}completionStream(e){const t=[];for(let{role:a,content:n}of e.messages)"system"===a&&t.push(`<|start_header_id|>system<|end_header_id|>\n\n${n}\n\n`),"user"===a&&t.push(`<|start_header_id|>user<|end_header_id|>\n\n${n?.replaceAll("\n","\\n")??""}`),"assistant"===a&&t.push("<|start_header_id|>assistant<|end_header_id|>\n\n"+n);const a=new o(this);return a.stream({path:"completion",onEnd:e.onEnd||(()=>null),onMessage:t=>{e.onMessage({message:this.config.autoConvertTraditionalChinese?(0,r.tify)(t.content):t.content})},onWarn:e.onWarn||(()=>null),onError:e.onError||(()=>null),data:{...e.options||{},prompt:this.config.autoConvertTraditionalChinese?(0,r.sify)(t.join("\n")):t.join("\n"),stream:!0}}),a.export()}talk(e){const t=new o(this);return{...t.export(),run:async()=>{const a=(await t.fetch({path:"v1/chat/completions",data:{...e.options||{},response_format:e.response_format,messages:e.messages.map((e=>({role:e.role,content:this.config.autoConvertTraditionalChinese?(0,r.sify)(e.content):e.content})))}})).data.choices[0].message.content||"";return{message:this.config.autoConvertTraditionalChinese?(0,r.tify)(a):a}}}}talkStream(e){const t=new o(this);return t.stream({path:"v1/chat/completions",onEnd:e.onEnd||(()=>null),onMessage:t=>{let a=t.choices[0].delta.content;a&&e.onMessage({message:this.config.autoConvertTraditionalChinese?(0,r.tify)(a):a})},onWarn:e.onWarn||(()=>null),onError:e.onError||(()=>null),data:{...e.options||{},stream:!0,messages:e.messages.map((e=>({role:e.role,content:this.config.autoConvertTraditionalChinese?(0,r.sify)(e.content):e.content})))}}),t.export()}}},887:function(e,t,a){var n=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.Llama3Cpp=void 0;const r=n(a(938)),o=a(4),s=a(357),i=a(129);class l{_axios=r.default.create();static createChatRequest(e){return async(t,{schema:a,onCancel:n})=>{const r=(new l).createCompletion(),i="function"==typeof e.config?await e.config():e.config;r.setConfig(i);let c=(0,s.validateToJsonSchema)(a.output);r.config.autoConvertTraditionalChinese&&(c=JSON.parse((0,o.sify)(JSON.stringify(c))));const{run:u,cancel:p}=r.talk({options:e.talkOptions,messages:t,response_format:{type:"json_object",schema:c}});n(p);const{message:d}=await u();return d}}setAxios(e){this._axios=e}createCompletion(){return new i.Llama3CppCompletion(this)}}t.Llama3Cpp=l},228:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.OpenAIChat=void 0;const n=a(572);t.OpenAIChat=class{openai;config={n:1,model:"gpt-4o",temperature:1,maxTokens:void 0,forceJsonFormat:!0};constructor(e){this.openai=e}setConfig(e){Object.assign(this.config,e)}async moderations(e){const t=await this.openai._axios.post("https://api.openai.com/v1/moderations",{input:e},{headers:{"Content-Type":"application/json",Authorization:`Bearer ${this.openai._apiKey}`}});return{isSafe:!1===t.data.results?.[0]?.flagged,result:t.data}}async talk(e=[],t){const a=n.json.jpjs(e),r=["gpt-4-turbo-preview","gpt-4-turbo","gpt-4o","gpt-4o-mini","gpt-3.5-turbo-1106"].includes(this.config.model);let o;r&&this.config.forceJsonFormat&&(o={type:"json_object"}),r&&this.config.forceJsonFormat&&t?.jsonSchema&&(o={type:"json_schema",json_schema:t.jsonSchema});const s=await this.openai._axios.post("https://api.openai.com/v1/chat/completions",{model:this.config.model,n:this.config.n,messages:a,response_format:o,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 a.push(l),{id:s?.data.id,text:l.content,newMessages:a,isDone:"stop"===i[0]?.finish_reason,apiReseponse:s.data}}talkStream(e){const t=new AbortController;return fetch("https://api.openai.com/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 t=>{const a=t.body?.pipeThrough(new TextDecoderStream).getReader();if(!a)throw new Error("Can not get reader");for(;;){const{value:t,done:n}=await a.read();if(n)break;const r=t.split("\n");for(let t of r)if(0!==t.length&&!t.startsWith(":")){if("data: [DONE]"===t){e.onEnd();break}try{const a=JSON.parse(t.substring(6)).choices[0].delta.content;e.onMessage(a)}catch(t){e.onWarn(t)}}}})).catch((t=>{"AbortError"===t.name?e.onEnd():e.onError(t)})),{cancel:()=>t.abort()}}async keepTalk(e,t=[]){const a=await this.talk([...t,{role:"user",content:Array.isArray(e)?e.join("\n"):e}]);return{result:a,nextTalk:e=>this.keepTalk(e,a.newMessages)}}}},11:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.OpenAIImagesGeneration=void 0,t.OpenAIImagesGeneration=class{openai;config={model:"dall-e-2",size:"1024x1024"};constructor(e){this.openai=e}setConfig(e){Object.assign(this.config,e)}async create(e){return(await this.openai._axios.post("https://api.openai.com/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}}},984:function(e,t,a){var n=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.OpenAI=void 0;const r=n(a(938)),o=a(38),s=a(228),i=a(11),l=a(357);class c{_axios=r.default.create();_apiKey="";static createChatRequest(e,t={},a){return async(n,{onCancel:r})=>{const o=new c("string"==typeof e?e:await e()),s=o.createChat(),i=new AbortController;a&&a.axios&&o.setAxios(a.axios),s.setConfig("function"==typeof t?await t():t),r((()=>i.abort()));const{text:l}=await s.talk(n,{abortController:i});return l}}static createChatRequestWithJsonSchema(e){return async(t,{schema:a,onCancel:n})=>{const r=new c("string"==typeof e.apiKey?e.apiKey:await e.apiKey()),o=r.createChat(),s=new AbortController;e.config&&o.setConfig("function"==typeof e.config?await e.config():e.config),e.axios&&r.setAxios(e.axios),n((()=>s.abort()));const i=(0,l.validateToJsonSchema)(a.output),{text:u}=await o.talk(t,{abortController:s,jsonSchema:{name:"data",strict:!0,schema:i}});return u}}constructor(e=""){this._apiKey=e}setAxios(e){this._axios=e}setConfiguration(e){this._apiKey=e}createChat(){return new s.OpenAIChat(this)}createVision(){return new o.OpenAIVision(this)}createImagesGeneration(){return new i.OpenAIImagesGeneration(this)}}t.OpenAI=c},38:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.OpenAIVision=void 0,t.OpenAIVision=class{openai;config={model:"gpt-4-vision-preview",maxTokens:void 0,temperature:1};constructor(e){this.openai=e}setConfig(e){Object.assign(this.config,e)}async view(e){const t=await this.openai._axios.post("https://api.openai.com/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}`}}),a=t.data.choices||[],n=a[0]?.message||{role:"assistant",content:""};return{id:t?.data.id,text:n.content,apiReseponse:t.data}}}},854:function(e,t,a){var n=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.requireJsonResponseWithJsonSchema=t.requireJsonResponseWithHandlebars=t.requireJsonResponse=void 0;const r=n(a(156)),o=a(572);t.requireJsonResponse=(e,t)=>[...Array.isArray(e)?e:[e],"Please respond using the following JSON format and minify the JSON without including any explanation: ","{",Object.entries(t).map((([e,t])=>[`/* ${t.desc} */`,`"${e}": ${JSON.stringify(t.example)}`].join("\n"))).join(",\n"),"}"].join("\n"),t.requireJsonResponseWithHandlebars=(e,a,n)=>{const s=r.default.create();return s.registerHelper("DATA",(function(e){return JSON.stringify(e)})),s.registerHelper("ENV",(function(e){return this.__envs&&e?this.__envs[e]:""})),s.registerHelper("INPUT",(function(){return JSON.stringify(o.record.omit(this,["__envs"]))})),s.registerHelper("JOIN",(function(e){return Array.isArray(e)?e.join():JSON.stringify(e)})),s.compile((0,t.requireJsonResponse)(a,n))(e)},t.requireJsonResponseWithJsonSchema=(e,t)=>[...Array.isArray(e)?e:[e],"Please provide JSON data according to the following JSON Schema format:",JSON.stringify(t)].join("\n")},165:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ParserError=void 0,t.ParserError=class{isParserError=!0;parserFails=[];error;constructor(e,t){this.error=e,this.parserFails=t}}},357:function(e,t,a){var n=this&&this.__createBinding||(Object.create?function(e,t,a,n){void 0===n&&(n=a);var r=Object.getOwnPropertyDescriptor(t,a);r&&!("get"in r?!t.__esModule:r.writable||r.configurable)||(r={enumerable:!0,get:function(){return t[a]}}),Object.defineProperty(e,n,r)}:function(e,t,a,n){void 0===n&&(n=a),e[n]=t[a]}),r=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),o=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var a in e)"default"!==a&&Object.prototype.hasOwnProperty.call(e,a)&&n(t,e,a);return r(t,e),t};Object.defineProperty(t,"__esModule",{value:!0}),t.validateToJsonSchema=t.defineYupSchema=t.validate=t.definedValidateSchema=void 0;const s=o(a(622)),i=a(250);t.definedValidateSchema=function(e){return e},t.validate=function(e,t){return s.object(t(s)).required().validateSync(e||{})},t.defineYupSchema=e=>e(s),t.validateToJsonSchema=e=>{const t=e=>{if(e.default&&delete e.default,e.properties)for(let a in e.properties)e.properties[a].default&&delete e.properties[a].default,t(e.properties[a]);e.items&&t(e.items)},a=e=>{if("object"===e.type){e.additionalProperties=!1;for(const t in e.properties)a(e.properties[t])}else"array"===e.type&&a(e.items)},n=(0,i.convertSchema)(s.object(e(s)));return t(n),a(n),n}},250:e=>{e.exports=require("@sodaru/yup-to-json-schema")},938:e=>{e.exports=require("axios")},4:e=>{e.exports=require("chinese-conv")},156:e=>{e.exports=require("handlebars")},865:e=>{e.exports=require("json5")},572:e=>{e.exports=require("power-helper")},622:e=>{e.exports=require("yup")}},t={};return function a(n){var r=t[n];if(void 0!==r)return r.exports;var o=t[n]={exports:{}};return e[n].call(o.exports,o,o.exports,a),o.exports}(665)})()));
1
+ var Y=Object.defineProperty;var se=(a,e,t)=>e in a?Y(a,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):a[e]=t;var Q=(a,e)=>{for(var t in e)Y(a,t,{get:e[t],enumerable:!0})};var o=(a,e,t)=>se(a,typeof e!="symbol"?e+"":e,t);var te={};Q(te,{LimiterPlugin:()=>me,LimiterPluginGlobState:()=>de,PrintLogPlugin:()=>pe,RetryPlugin:()=>ue,RolePlugin:()=>ge});import{Event as oe}from"power-helper";var h=class{constructor(e){o(this,"_event",new oe);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 X=new h({name:"retry",params:a=>({retry:a.number().required().default(1),printWarn:a.boolean().required().default(!0)}),receiveData:()=>({}),onInstall({log:a,attach:e,params:t}){e("parseFailed",async({count:r,retry:n,messages:s,changeMessages:i})=>{r<=t.retry&&(t.printWarn&&a.print(`Is Failed, Retry ${r} times.`),i(s),n())})}});var Z=new h({name:"print-log",params:a=>({detail:a.boolean().default(!1)}),receiveData:()=>({}),onInstall({params:a,log:e,attach:t}){t("talkBefore",async({lastUserMessage:r,messages:n})=>{e.print("Send:",{color:"green"}),a.detail?e.print(`
2
+ `+JSON.stringify(n,null,4)):e.print(`
3
+ `+r)}),t("talkAfter",async({parseText:r})=>{e.print("Receive:",{color:"cyan"}),e.print(`
4
+ `+r)}),t("succeeded",async({output:r})=>{e.print("Output:",{color:"yellow"});try{e.print(`
5
+ `+JSON.stringify(r,null,4))}catch{e.print(`
6
+ `+r)}})}});import{Event as ie,flow as le,Schedule as ce}from"power-helper";var F={limit:3,interval:6e4},u={event:new ie,schedule:null,waitTimes:[],waitQueue:[]},H={event:u.event,config:F,closeSchedule:()=>{u.schedule&&(u.schedule.close(),u.schedule=null)},plugin:new h({name:"limiter",params:()=>({}),receiveData:()=>({}),onInstall({attach:a}){u.schedule==null&&(u.schedule=new ce,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=le.createUuid();return u.waitQueue.push(e),new Promise(t=>{u.event.on("run",({id:r},{off:n})=>{r===e&&(n(),t())})})})}})};var ee=new h({name:"role",params:a=>({role:a.string().required()}),receiveData:()=>({}),onInstall({attach:a,params:e}){a("start",async({messages:t,changeMessages:r})=>{r([{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 pe=Z,ue=X,me=H.plugin,de=H,ge=ee;var ne={};Q(ne,{requireJsonResponse:()=>re,requireJsonResponseWithHandlebars:()=>ye,requireJsonResponseWithJsonSchema:()=>Ce});import he from"handlebars";import{record as fe}from"power-helper";var re=(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,r])=>[`/* ${r.desc} */`,`"${t}": ${JSON.stringify(r.example)}`].join(`
7
+ `)).join(`,
8
+ `),"}"].join(`
9
+ `),ye=(a,e,t)=>{let r=he.create();return r.registerHelper("DATA",function(n){return JSON.stringify(n)}),r.registerHelper("ENV",function(n){return this.__envs&&n?this.__envs[n]:""}),r.registerHelper("INPUT",function(){return JSON.stringify(fe.omit(this,["__envs"]))}),r.registerHelper("JOIN",function(n){return Array.isArray(n)?n.join():JSON.stringify(n)}),r.compile(re(e,t))(a)},Ce=(a,e)=>[...Array.isArray(a)?a:[a],"Please provide JSON data according to the following JSON Schema format:",JSON.stringify(e)].join(`
10
+ `);import xe from"json5";var S=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 r=/{(?:[^{}]|(?:{[^{}]*}))*}/,n=e.match(r)?.[0]||"";return xe.parse(n)}}})}get name(){return this.params.name}async read(e){return await this.params.handler(e)}};import{Event as Pe,flow as ae,Hook as Te,Log as ve}from"power-helper";import*as w from"yup";import{convertSchema as ke}from"@sodaru/yup-to-json-schema";function $(a,e){return w.object(e(w)).required().validateSync(a||{})}var be=a=>a(w),b=a=>{let e=n=>{if(n.default&&delete n.default,n.properties)for(let s in n.properties)n.properties[s].default&&delete n.properties[s].default,e(n.properties[s]);n.items&&e(n.items)},t=n=>{if(n.type==="object"){n.additionalProperties=!1;for(let s in n.properties)t(n.properties[s])}else n.type==="array"&&t(n.items)},r=ke(w.object(a(w)));return e(r),t(r),r};var P=class{constructor(e,t){o(this,"isParserError",!0);o(this,"parserFails",[]);o(this,"error");this.error=e,this.parserFails=t}};var A=class{constructor(e){o(this,"params");this.params=e}get __schemeType(){return null}get __outputType(){return null}async compile(e,t){let r=this.params.input?$(e,this.params.input):e,n=this.params.question?await this.params.question(r,t):"";return{scheme:r,prompt:Array.isArray(n)?n.join(`
11
+ `):n}}getValidate(){return{input:this.params.input,output:this.params.output}}changeOutputSchema(e){this.params.output=e}async parse(e){let t,r="",n=[];for(let s of this.params.parsers)try{t=await s.read(e),r=s.name}catch(i){t=void 0,n.push({name:s.name,error:i})}try{return{output:$(t,this.params.output),parserName:r,parserFails:n}}catch(s){throw new P(s,n)}}};var R=class{constructor(e){o(this,"__hookType");o(this,"log");o(this,"hook",new Te);o(this,"params");o(this,"plugins",{});o(this,"installed",!1);o(this,"translator");o(this,"event",new Pe);this.log=new ve(e.name??"no name"),this.params=e,this.translator=new A({...e,parsers:[S.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=ae.createUuid(),r=null,n=!1,s=!1,i=[this.event.on("cancel",({requestId:p})=>{p===t&&l()}),this.event.on("cancelAll",()=>{l()})],c=()=>i.forEach(p=>p.off()),l=()=>{n===!1&&(s&&r&&r(),n=!0,c())},m=p=>{r=p},f=async()=>{let p=this.translator.getValidate(),k=null,v={},y=new Map,U=await this.translator.compile(e,{schema:p}),z=[],g=[];U.prompt&&g.push({role:"user",content:U.prompt});for(let d in this.plugins)v[d]={send:C=>this.plugins[d].send({id:t,data:C})};return await this.hook.notify("start",{id:t,data:e,schema:p,plugins:v,messages:g,metadata:y,setPreMessages:d=>{z=d.map(C=>({...C,content:Array.isArray(C.content)?C.content.join(`
12
+ `):C.content}))},changeMessages:d=>{g=d},changeOutputSchema:d=>{this.translator.changeOutputSchema(d),p=this.translator.getValidate()}}),g=[...z,...g],await ae.asyncWhile(async({count:d,doBreak:C})=>{if(d>=99)return C();let M="",V="",N=!1,K=g.filter(x=>x.role==="user").slice(-1)[0]?.content||"";try{await this.hook.notify("talkBefore",{id:t,data:e,messages:g,metadata:y,lastUserMessage:K});let x=this.params.request(g,{id:t,count:d,schema:p,onCancel:m,metadata:y,isRetry:N});if(n)r&&r();else try{s=!0,M=await x,V=M}finally{s=!1}n===!1&&(await this.hook.notify("talkAfter",{id:t,data:e,response:M,messages:g,parseText:V,metadata:y,lastUserMessage:K,parseFail:_=>{throw new P(_,[])},changeParseText:_=>{V=_}}),k=(await this.translator.parse(V)).output,await this.hook.notify("succeeded",{id:t,output:k,metadata:y})),await this.hook.notify("done",{id:t,metadata:y}),C()}catch(x){if(x instanceof P){if(await this.hook.notify("parseFailed",{id:t,error:x.error,count:d,response:M,messages:g,metadata:y,lastUserMessage:K,parserFails:x.parserFails,retry:()=>{N=!0},changeMessages:_=>{g=_}}),N===!1)throw await this.hook.notify("done",{id:t,metadata:y}),x}else throw await this.hook.notify("done",{id:t,metadata:y}),x}}),k};return{id:t,request:(async()=>{try{return await f()}finally{c()}})()}}async request(e){let{request:t}=this.requestWithId(e);return await t}};import*as we from"yup";var W=class{constructor(e){o(this,"params");this.params=e}createBrokerBuilder(e){return{create:t=>new R({output:()=>({}),install:r=>{e?.install?.(r),r.attach("start",async({id:n,plugins:s,data:i,metadata:c,changeMessages:l,changeOutputSchema:m})=>{let f=await t({id:n,data:i,plugins:s,yup:we,setMessages:T=>{l(T.map(p=>({role:p.role,content:Array.isArray(p.content)?p.content.join(`
13
+ `):p.content})))},metadata:c});m(()=>f)})},plugins:this.params.plugins?()=>this.params.plugins():void 0,request:this.params.request})}}};import _e from"axios";var I=class{constructor(e){o(this,"openai");o(this,"config",{model:"gpt-4-vision-preview",maxTokens:void 0,temperature:1});this.openai=e}setConfig(e){Object.assign(this.config,e)}async view(e){let t=await this.openai._axios.post("https://api.openai.com/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}`}}),n=(t.data.choices||[])[0]?.message||{role:"assistant",content:""};return{id:t?.data.id,text:n.content,apiReseponse:t.data}}};import{json as Oe}from"power-helper";var j=class{constructor(e){o(this,"openai");o(this,"config",{n:1,model:"gpt-4o",temperature:1,maxTokens:void 0,forceJsonFormat:!0});this.openai=e}setConfig(e){Object.assign(this.config,e)}async moderations(e){let t=await this.openai._axios.post("https://api.openai.com/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 r=Oe.jpjs(e),n=["gpt-4-turbo-preview","gpt-4-turbo","gpt-4o","gpt-4o-mini","gpt-3.5-turbo-1106"].includes(this.config.model),s;n&&this.config.forceJsonFormat&&(s={type:"json_object"}),n&&this.config.forceJsonFormat&&t?.jsonSchema&&(s={type:"json_schema",json_schema:t.jsonSchema});let i=await this.openai._axios.post("https://api.openai.com/v1/chat/completions",{model:this.config.model,n:this.config.n,messages:r,response_format:s,temperature:this.config.temperature},{signal:t?.abortController?.signal,headers:{"Content-Type":"application/json",Authorization:`Bearer ${this.openai._apiKey}`}}),c=i.data.choices||[],l=c[0]?.message||{role:"assistant",content:""};return r.push(l),{id:i?.data.id,text:l.content,newMessages:r,isDone:c[0]?.finish_reason==="stop",apiReseponse:i.data}}talkStream(e){let t=new AbortController;return fetch("https://api.openai.com/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 r=>{let n=r.body?.pipeThrough(new TextDecoderStream).getReader();if(!n)throw new Error("Can not get reader");for(;;){let{value:s,done:i}=await n.read();if(i)break;let c=s.split(`
14
+ `);for(let l of c)if(l.length!==0&&!l.startsWith(":")){if(l==="data: [DONE]"){e.onEnd();break}try{let f=JSON.parse(l.substring(6)).choices[0].delta.content;e.onMessage(f)}catch(m){e.onWarn(m)}}}}).catch(r=>{r.name==="AbortError"?e.onEnd():e.onError(r)}),{cancel:()=>t.abort()}}async keepTalk(e,t=[]){let r=await this.talk([...t,{role:"user",content:Array.isArray(e)?e.join(`
15
+ `):e}]);return{result:r,nextTalk:n=>this.keepTalk(n,r.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("https://api.openai.com/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 D=class a{constructor(e=""){o(this,"_axios",_e.create());o(this,"_apiKey","");this._apiKey=e}static createChatRequest(e,t={},r){return async(n,{onCancel:s})=>{let i=new a(typeof e=="string"?e:await e()),c=i.createChat(),l=new AbortController;r&&r.axios&&i.setAxios(r.axios),c.setConfig(typeof t=="function"?await t():t),s(()=>l.abort());let{text:m}=await c.talk(n,{abortController:l});return m}}static createChatRequestWithJsonSchema(e){return async(t,{schema:r,onCancel:n})=>{let s=new a(typeof e.apiKey=="string"?e.apiKey:await e.apiKey()),i=s.createChat(),c=new AbortController;e.config&&i.setConfig(typeof e.config=="function"?await e.config():e.config),e.axios&&s.setAxios(e.axios),n(()=>c.abort());let l=b(r.output),{text:m}=await i.talk(t,{abortController:c,jsonSchema:{name:"data",strict:!0,schema:l}});return m}}setAxios(e){this._axios=e}setConfiguration(e){this._apiKey=e}createChat(){return new j(this)}createVision(){return new I(this)}createImagesGeneration(){return new J(this)}};import Ae from"axios";import{sify as Re}from"chinese-conv/dist";import{flow as Se}from"power-helper";import{tify as B,sify as E}from"chinese-conv/dist";var O=class{constructor(e){o(this,"core");o(this,"streamAbortControllers",[]);this.core=e}createAbortController(){let e=new AbortController,t=Se.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:r}=this.createAbortController(),n=()=>{this.removeAbortController(r),e.onEnd()},s=async i=>{if(i.body){let c=i.body.getReader(),l=!1,m="";for(;!l;){let{value:f,done:T}=await c.read();if(f){m+=new TextDecoder("utf-8").decode(f);let p=m.split(`
16
+
17
+ `);m=p.pop()||"",p.forEach(k=>{if(k.includes("[DONE]")&&(l=!0),k.startsWith("data:"))try{let v=JSON.parse(k.replace("data: ",""));e.onMessage(v)}catch(v){e.onWarn(v)}})}T&&(l=!0)}n()}else e.onError(new Error("Body not found."))};fetch(`${this.core.config.baseUrl}/${e.path}`,{method:"POST",body:JSON.stringify(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")?n():e.onError(i)})}async fetch(e){let{signal:t,controllerId:r}=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(r)}}cancel(){this.streamAbortControllers.forEach(e=>e.controller.abort()),this.streamAbortControllers=[]}export(){return{cancel:this.cancel.bind(this)}}},q=class{constructor(e){o(this,"core");o(this,"config",{baseUrl:"",headers:{},autoConvertTraditionalChinese:!0});this.core=e}setConfig(e){this.config={...this.config,...e}}completion(e){let t=[];for(let{role:s,content:i}of e.messages)s==="system"&&t.push(`<|start_header_id|>system<|end_header_id|>
18
+
19
+ ${i}
20
+
21
+ `),s==="user"&&t.push(`<|start_header_id|>user<|end_header_id|>
22
+
23
+ ${i?.replaceAll(`
24
+ `,"\\n")??""}`),s==="assistant"&&t.push(`<|start_header_id|>assistant<|end_header_id|>
25
+
26
+ `+i);let r=e.messages.at(-1)||"",n=new O(this);return{...n.export(),run:async()=>{let s=await n.fetch({path:"completion",data:{...e.options||{},prompt:this.config.autoConvertTraditionalChinese?E(t.join(`
27
+ `)):t.join(`
28
+ `)}}),i=this.config.autoConvertTraditionalChinese?B(s.data.content):s.data.content;return{message:i,fullMessage:`${r}${i}`}}}}completionStream(e){let t=[];for(let{role:n,content:s}of e.messages)n==="system"&&t.push(`<|start_header_id|>system<|end_header_id|>
29
+
30
+ ${s}
31
+
32
+ `),n==="user"&&t.push(`<|start_header_id|>user<|end_header_id|>
33
+
34
+ ${s?.replaceAll(`
35
+ `,"\\n")??""}`),n==="assistant"&&t.push(`<|start_header_id|>assistant<|end_header_id|>
36
+
37
+ `+s);let r=new O(this);return r.stream({path:"completion",onEnd:e.onEnd||(()=>null),onMessage:n=>{e.onMessage({message:this.config.autoConvertTraditionalChinese?B(n.content):n.content})},onWarn:e.onWarn||(()=>null),onError:e.onError||(()=>null),data:{...e.options||{},prompt:this.config.autoConvertTraditionalChinese?E(t.join(`
38
+ `)):t.join(`
39
+ `),stream:!0}}),r.export()}talk(e){let t=new O(this);return{...t.export(),run:async()=>{let n=(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?E(s.content):s.content}))}})).data.choices[0].message.content||"";return{message:this.config.autoConvertTraditionalChinese?B(n):n}}}}talkStream(e){let t=new O(this);return t.stream({path:"v1/chat/completions",onEnd:e.onEnd||(()=>null),onMessage:r=>{let n=r.choices[0].delta.content;n&&e.onMessage({message:this.config.autoConvertTraditionalChinese?B(n):n})},onWarn:e.onWarn||(()=>null),onError:e.onError||(()=>null),data:{...e.options||{},stream:!0,messages:e.messages.map(r=>({role:r.role,content:this.config.autoConvertTraditionalChinese?E(r.content):r.content}))}}),t.export()}};var L=class a{constructor(){o(this,"_axios",Ae.create())}static createChatRequest(e){return async(t,{schema:r,onCancel:n})=>{let i=new a().createCompletion(),c=typeof e.config=="function"?await e.config():e.config;i.setConfig(c);let l=b(r.output);i.config.autoConvertTraditionalChinese&&(l=JSON.parse(Re(JSON.stringify(l))));let{run:m,cancel:f}=i.talk({options:e.talkOptions,messages:t,response_format:{type:"json_object",schema:l}});n(f);let{message:T}=await m();return T}}setAxios(e){this._axios=e}createCompletion(){return new q(this)}};var G=class{static createChatRequest(e){let t=r=>(r.type==="object"?(delete r.additionalProperties,Object.keys(r.properties).forEach(n=>{t(r.properties[n])})):r.type==="array"&&t(r.items),r);return async(r,{schema:n})=>{let s=t(b(n.output));return(await e.googleGenerativeAI.getGenerativeModel({model:e.model,generationConfig:{responseMimeType:"application/json",responseSchema:s}}).generateContent({contents:r.map(l=>l.role==="user"||l.role==="system"?{role:"user",parts:[{text:l.content}]}:{role:"model",parts:[{text:l.content}]})})).response.text()}}};export{R as ChatBroker,h as ChatBrokerPlugin,W as CtoD,G as Google,L as Llama3Cpp,D as OpenAI,S as TextParser,A as Translator,be as defineYupSchema,te as plugins,ne as templates,b as validateToJsonSchema};
40
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 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/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/llama3.cpp/index.ts", "../lib/service/llama3.cpp/completion.ts", "../lib/service/google/index.ts"],
4
+ "sourcesContent": ["import Retry from './retry'\nimport PrintLog from './print-log'\nimport Limiter from './limiter'\nimport Role from './role'\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'\nimport { ChatBrokerHooks } from '../broker/chat'\nimport { Log, Hook, Event } from 'power-helper'\nimport { ValidateCallback, ValidateCallbackOutputs } from '../utils/validate'\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'\n\nexport default new ChatBrokerPlugin({\n name: 'retry',\n params: yup => {\n return {\n retry: yup.number().required().default(1),\n printWarn: yup.boolean().required().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'\n\nexport default new ChatBrokerPlugin({\n name: 'print-log',\n params: yup => {\n return {\n detail: yup.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'\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'\n\nexport default new ChatBrokerPlugin({\n name: 'role',\n params: yup => {\n return {\n role: yup.string().required()\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 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'\nimport { ChatBrokerPlugin } from '../core/plugin'\nimport { Event, flow, Hook, Log } from 'power-helper'\nimport { Translator, TranslatorParams } from '../core/translator'\nimport { ValidateCallback, ValidateCallbackOutputs } from '../utils/validate'\nimport { ParserError } from '../utils/error'\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 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\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 isCancel = true\n eventOff()\n }\n }\n let onCancel = (cb: () => void) => {\n waitCancel = cb\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 isRetry: retryFlag\n })\n if (isCancel) {\n if (waitCancel) {\n waitCancel()\n }\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 * as Yup from 'yup'\nimport { convertSchema } from '@sodaru/yup-to-json-schema'\nimport { Schema } from 'yup'\n\nexport type ValidateCallback<T extends Record<string, Schema>> = (_yup: typeof Yup) => {\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 { __outputType: any } ? R[K]['__outputType'] : 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 Yup.object(schemaCallback(Yup)).required().validateSync(target || {}) as {\n [K in keyof R]: R[K] extends { __outputType: any } ? R[K]['__outputType'] : R[K]\n }\n}\n\nexport const defineYupSchema = <T extends Record<string, Schema>>(cb: ValidateCallback<T>): T => {\n return cb(Yup)\n}\n\nexport const validateToJsonSchema = <T extends ValidateCallback<any>>(cb: T) => {\n const removeAllDefault = (schema: any) => {\n if (schema.default) {\n delete schema.default\n }\n if (schema.properties) {\n for (let key in schema.properties) {\n if (schema.properties[key].default) {\n delete schema.properties[key].default\n }\n removeAllDefault(schema.properties[key])\n }\n }\n if (schema.items) {\n removeAllDefault(schema.items)\n }\n }\n const addAllAdditionalProperties = (jsonSchema: any) => {\n if (jsonSchema.type === 'object') {\n jsonSchema.additionalProperties = false\n for (const key in jsonSchema.properties) {\n addAllAdditionalProperties(jsonSchema.properties[key])\n }\n } else if (jsonSchema.type === 'array') {\n addAllAdditionalProperties(jsonSchema.items)\n }\n }\n const jsonSchema = convertSchema(Yup.object(cb(Yup)))\n removeAllDefault(jsonSchema)\n addAllAdditionalProperties(jsonSchema)\n return jsonSchema\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'\nimport { validate, ValidateCallback, ValidateCallbackOutputs } from '../utils/validate'\nimport { ParserError } from '../utils/error'\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'\nimport { ChatBrokerPlugin } from './core/plugin'\nimport { Schema } from 'yup'\nimport * as Yup from 'yup'\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, Schema>>(install: (context: {\n id: string\n yup: typeof Yup\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 yup: Yup,\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'\nimport { OpenAIChat, Config } from './chat'\nimport { OpenAIImagesGeneration } from './images-generation'\nimport { validateToJsonSchema } from '../../utils/validate'\n\nexport class OpenAI {\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 openai = new OpenAI(typeof apiKey === 'string' ? apiKey : await apiKey())\n const chat = openai.createChat()\n const abortController = new AbortController()\n if (options && options.axios) {\n openai.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, onCancel }: any) => {\n const openai = new OpenAI(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 \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 { OpenAI } from './index'\nimport { PromiseResponseType } from '../../types'\n\ntype ImageContent = {\n type: 'image_url' | 'text'\n text?: string\n image_url?: {\n url: string\n detail?: string\n }\n}\n\ntype 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: OpenAI\n config: Config = {\n model: 'gpt-4-vision-preview',\n maxTokens: undefined,\n temperature: 1\n }\n\n constructor(openai: OpenAI) {\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>('https://api.openai.com/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 apiReseponse: result.data\n }\n }\n}\n\nexport type OpenAIChatVisionResponse = PromiseResponseType<OpenAIVision['view']>\n", "import { json } from 'power-helper'\nimport { OpenAI } from './index'\nimport { PromiseResponseType } from '../../types'\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\uFF0C16k\u610F\u5473\u8457\u80FD\u8655\u7406\u9577\u5EA6\u70BA 16,384 \u7684\u6587\u672C\uFF0C32k\u610F\u5473\u8457\u80FD\u8655\u7406\u9577\u5EA6\u70BA 32768 \u7684\u6587\u672C\u3002\n * @en How many chat completion choices to generate for each input message.\n */\n model: 'gpt-4' | 'gpt-3.5-turbo' | 'gpt-4-turbo' | 'gpt-4o' | 'gpt-4o-mini' | 'o1-preview' | 'o1' | 'o1-mini'\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: OpenAI\n config: Config = {\n n: 1,\n model: 'gpt-4o',\n temperature: 1,\n maxTokens: undefined,\n forceJsonFormat: true\n }\n\n constructor(openai: OpenAI) {\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>('https://api.openai.com/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>('https://api.openai.com/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 apiReseponse: 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.openai.com/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 = PromiseResponseType<OpenAIChat['talk']>\n", "import { OpenAI } from './index'\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: OpenAI\n private config: Config = {\n model: 'dall-e-2',\n size: '1024x1024'\n }\n\n constructor(openai: OpenAI) {\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>('https://api.openai.com/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 { sify } from 'chinese-conv/dist'\nimport { validateToJsonSchema } from '../../utils/validate'\nimport { Llama3CppCompletion, Config } from './completion'\n\nexport class Llama3Cpp {\n _axios = axios.create()\n\n static createChatRequest(params: {\n config: Partial<Config> | (() => Promise<Partial<Config>>)\n talkOptions?: any\n }) {\n return async(messages: any[], { schema, onCancel }: any) => {\n const ll3cpp = new Llama3Cpp()\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 (chat.config.autoConvertTraditionalChinese) {\n formatSchema = JSON.parse(sify(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 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 Llama3CppCompletion(this)\n }\n}\n", "import { Llama3Cpp } from './index'\nimport { flow } from 'power-helper'\nimport { tify, sify } from 'chinese-conv/dist'\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: (data: { message: string }) => void\n onEnd?: () => void\n onWarn?: (error: any) => void\n onError?: (error: any) => void\n}\n\nclass Requester {\n private core: Llama3CppCompletion\n private streamAbortControllers: {\n id: string\n controller: AbortController\n }[] = []\n\n constructor(core: Llama3CppCompletion) {\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: 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(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 Llama3CppCompletion {\n core: Llama3Cpp\n config: Config = {\n baseUrl: '',\n headers: {},\n autoConvertTraditionalChinese: true\n }\n\n constructor(core: Llama3Cpp) {\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 prompts: string[] = []\n for (let { role, content } of params.messages) {\n if (role === 'system') {\n prompts.push(`<|start_header_id|>system<|end_header_id|>\\n\\n${content}\\n\\n`)\n }\n if (role === 'user') {\n prompts.push(`<|start_header_id|>user<|end_header_id|>\\n\\n${content?.replaceAll('\\n', '\\\\n') ?? ''}`)\n }\n if (role === 'assistant') {\n prompts.push('<|start_header_id|>assistant<|end_header_id|>\\n\\n' + content)\n }\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 result = await requester.fetch({\n path: 'completion',\n data: {\n ...(params.options || {}),\n prompt: this.config.autoConvertTraditionalChinese ? sify(prompts.join('\\n')) : prompts.join('\\n')\n }\n })\n const message = this.config.autoConvertTraditionalChinese ? tify(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 prompts: string[] = []\n for (let { role, content } of params.messages) {\n if (role === 'system') {\n prompts.push(`<|start_header_id|>system<|end_header_id|>\\n\\n${content}\\n\\n`)\n }\n if (role === 'user') {\n prompts.push(`<|start_header_id|>user<|end_header_id|>\\n\\n${content?.replaceAll('\\n', '\\\\n') ?? ''}`)\n }\n if (role === 'assistant') {\n prompts.push('<|start_header_id|>assistant<|end_header_id|>\\n\\n' + content)\n }\n }\n const requester = new Requester(this)\n requester.stream({\n path: 'completion',\n onEnd: params.onEnd || (() => null),\n onMessage: e => {\n params.onMessage({\n message: this.config.autoConvertTraditionalChinese ? tify(e.content) : e.content\n })\n },\n onWarn: params.onWarn || (() => null),\n onError: params.onError || (() => null),\n data: {\n ...(params.options || {}),\n prompt: this.config.autoConvertTraditionalChinese ? sify(prompts.join('\\n')) : prompts.join('\\n'),\n stream: true\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 ? sify(e.content) : e.content\n }\n })\n }\n })\n const content = result.data.choices[0].message.content || ''\n return {\n message: this.config.autoConvertTraditionalChinese ? tify(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 params.onMessage({\n message: this.config.autoConvertTraditionalChinese ? tify(content) : content\n })\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 ? sify(e.content) : e.content\n }\n })\n }\n })\n return requester.export()\n }\n}\n", "import { validateToJsonSchema } from '../../utils/validate'\nimport type { GoogleGenerativeAI } from '@google/generative-ai'\n\nexport class Google {\n static createChatRequest(params: {\n googleGenerativeAI: GoogleGenerativeAI\n model: string\n }) {\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 }: any) => {\n const responseSchema = removeAdditionalProperties(validateToJsonSchema(schema.output))\n const model = params.googleGenerativeAI.getGenerativeModel({\n model: params.model,\n generationConfig: {\n responseMimeType: 'application/json',\n responseSchema\n }\n })\n const result = await model.generateContent({\n contents: messages.map((message) => {\n if (message.role === 'user' || message.role === 'system') {\n return {\n role: 'user',\n parts: [\n {\n text: message.content\n }\n ]\n }\n } else {\n return {\n role: 'model',\n parts: [\n {\n text: message.content\n }\n ]\n }\n }\n })\n })\n return result.response.text()\n }\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", "yup", "log", "attach", "params", "count", "retry", "messages", "changeMessages", "print_log_default", "ChatBrokerPlugin", "yup", "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", "yup", "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", "JSON5", "TextParser", "_TextParser", "params", "__publicField", "text", "jsonRegex", "matchedText", "JSON5", "Event", "flow", "Hook", "Log", "Yup", "convertSchema", "validate", "target", "schemaCallback", "Yup", "defineYupSchema", "cb", "validateToJsonSchema", "removeAllDefault", "schema", "key", "addAllAdditionalProperties", "jsonSchema", "convertSchema", "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", "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", "Yup", "CtoD", "params", "__publicField", "install", "ChatBroker", "context", "id", "plugins", "data", "metadata", "changeMessages", "changeOutputSchema", "schema", "Yup", "messages", "e", "axios", "OpenAIVision", "openai", "__publicField", "options", "messages", "result", "message", "json", "OpenAIChat", "openai", "__publicField", "options", "input", "result", "messages", "newMessages", "json", "isSupportJson", "response_format", "choices", "message", "params", "controller", "response", "reader", "value", "done", "items", "item", "content", "error", "prompt", "oldMessages", "OpenAIImagesGeneration", "openai", "__publicField", "options", "prompt", "OpenAI", "_OpenAI", "apiKey", "__publicField", "axios", "config", "options", "messages", "onCancel", "openai", "chat", "abortController", "text", "params", "schema", "jsonSchema", "validateToJsonSchema", "OpenAIChat", "OpenAIVision", "OpenAIImagesGeneration", "axios", "sify", "flow", "tify", "sify", "Requester", "core", "__publicField", "streamAbortController", "streamAbortControllerId", "flow", "e", "params", "signal", "controllerId", "end", "reader", "response", "done", "chunk", "value", "readerDone", "payloads", "payload", "data", "error", "Llama3CppCompletion", "config", "prompts", "role", "content", "lastMessage", "requester", "result", "sify", "message", "tify", "Llama3Cpp", "_Llama3Cpp", "__publicField", "axios", "params", "messages", "schema", "onCancel", "chat", "config", "formatSchema", "validateToJsonSchema", "sify", "run", "cancel", "message", "Llama3CppCompletion", "Google", "params", "removeAdditionalProperties", "schema", "key", "messages", "responseSchema", "validateToJsonSchema", "message"]
7
+ }
package/esbuild.mjs ADDED
@@ -0,0 +1,21 @@
1
+ import env from 'esbuild-plugin-env'
2
+ import eslint from 'esbuild-plugin-eslint'
3
+ import { nodeExternalsPlugin } from 'esbuild-node-externals'
4
+ import { build } from 'esbuild'
5
+
6
+ build({
7
+ entryPoints: ['./lib/index.ts'],
8
+ bundle: true,
9
+ format: 'esm',
10
+ outfile: './dist/index.js',
11
+ sourcemap: true,
12
+ minify: true,
13
+ target: 'es2020',
14
+ plugins: [
15
+ env(),
16
+ nodeExternalsPlugin(),
17
+ eslint({
18
+ fix: true,
19
+ }),
20
+ ],
21
+ })
@@ -0,0 +1,29 @@
1
+ import stylistic from '@stylistic/eslint-plugin'
2
+ import tseslint from 'typescript-eslint'
3
+
4
+ export default [
5
+ stylistic.configs['recommended-flat'],
6
+ {
7
+ plugins: {
8
+ '@stylistic': stylistic,
9
+ '@typescript-eslint': tseslint.plugin,
10
+ },
11
+ languageOptions: {
12
+ parser: tseslint.parser,
13
+ parserOptions: {
14
+ project: 'tsconfig.json',
15
+ },
16
+ },
17
+ files: ['lib/**/*.ts'],
18
+ rules: {
19
+ '@/no-unused-vars': 'off',
20
+ '@stylistic/arrow-parens': 'off',
21
+ '@stylistic/brace-style': 'off',
22
+ '@stylistic/space-before-function-paren': 'off',
23
+ '@stylistic/comma-dangle': 'off',
24
+ '@stylistic/indent': ['error', 4],
25
+ '@stylistic/quotes': ['error', 'single'],
26
+ '@typescript-eslint/no-explicit-any': 'off',
27
+ },
28
+ },
29
+ ]
@@ -0,0 +1,94 @@
1
+ import { GoogleGenerativeAI } from '@google/generative-ai'
2
+ import { CtoD, Google, plugins } from '../lib/index'
3
+
4
+ /**
5
+ * @test npx esno ./examples/google.ts
6
+ * 要使用 google generative ai 必須手動安裝 '@google/generative-ai' 套件
7
+ */
8
+
9
+ const ctod = new CtoD({
10
+ plugins: () => {
11
+ return {
12
+ retry: plugins.RetryPlugin.use({
13
+ retry: 3,
14
+ printWarn: true
15
+ })
16
+ }
17
+ },
18
+ request: Google.createChatRequest({
19
+ googleGenerativeAI: new GoogleGenerativeAI(''),
20
+ model: 'gemini-1.5-flash'
21
+ })
22
+ })
23
+
24
+ const brokerBuilder = ctod.createBrokerBuilder<{
25
+ indexes: string[]
26
+ question: string
27
+ }>({
28
+ install: ({ attach }) => {
29
+ attach('start', async({ setPreMessages }) => {
30
+ setPreMessages([
31
+ {
32
+ role: 'system',
33
+ content: '你現在是一位擅長分類索引的藥師'
34
+ }
35
+ ])
36
+ })
37
+ }
38
+ })
39
+
40
+ const broker = brokerBuilder.create(async({ yup, data, setMessages }) => {
41
+ const { indexes, question } = data
42
+ setMessages([
43
+ {
44
+ role: 'user',
45
+ content: [
46
+ '我有以下索引',
47
+ `${JSON.stringify(indexes)}`,
48
+ `請幫我解析"${question}"可能是哪個索引`,
49
+ '且相關性由高到低排序並給予分數,分數由 0 ~ 1'
50
+ ]
51
+ }
52
+ ])
53
+ const item = yup.object({
54
+ name: yup.string().required().meta({
55
+ jsonSchema: {
56
+ description: '索引名稱'
57
+ }
58
+ }),
59
+ score: yup.number().required().meta({
60
+ jsonSchema: {
61
+ description: '評比分數'
62
+ }
63
+ })
64
+ }).required()
65
+ return {
66
+ indexes: yup.array(item).required().meta({
67
+ jsonSchema: {
68
+ description: '由高到低排序的索引'
69
+ }
70
+ })
71
+ }
72
+ })
73
+
74
+ broker.request({
75
+ indexes: ['胃痛', '腰痛', '頭痛', '喉嚨痛', '四肢疼痛'],
76
+ question: '喝咖啡,吃甜食,胃食道逆流'
77
+ }).then(e => {
78
+ console.log('輸出結果:', e.indexes)
79
+ /*
80
+ [
81
+ {
82
+ name: '胃痛',
83
+ score: 1
84
+ },
85
+ {
86
+ name: '喉嚨痛',
87
+ score: 0.7
88
+ },
89
+ ...
90
+ ]
91
+ */
92
+ }).catch(error => {
93
+ console.error('Error:', error)
94
+ })
@@ -1,5 +1,3 @@
1
- // eslint-disable-next-line @typescript-eslint/triple-slash-reference
2
- /// <reference path="../lib/shims.d.ts" />
3
1
  import { CtoD, Llama3Cpp } from '../lib/index'
4
2
 
5
3
  /**
@@ -2,7 +2,7 @@ import fs from 'fs'
2
2
  import { CtoD, OpenAI, plugins } from '../lib/index'
3
3
 
4
4
  /**
5
- * @test npx esno ./examples/basic.ts
5
+ * @test npx esno ./examples/openai.ts
6
6
  */
7
7
 
8
8
  const apiKey = fs.readFileSync('./.api-key', 'utf-8').trim()
@@ -1,6 +1,3 @@
1
- // eslint-disable-next-line @typescript-eslint/triple-slash-reference
2
- /// <reference path="../lib/shims.d.ts" />
3
-
4
1
  import fs from 'fs'
5
2
  import { flow } from 'power-helper'
6
3
  import { prompt } from 'inquirer'
@@ -3,7 +3,7 @@ import JSON5 from 'json5'
3
3
  type TextParserParams = {
4
4
  /**
5
5
  * @zh 解讀器名字。
6
- * @en The name of the parser.
6
+ * @en The name of the parser.
7
7
  */
8
8
  name: string
9
9
  /**
@@ -43,7 +43,7 @@ export class TextParser {
43
43
 
44
44
  /**
45
45
  * @zh 解讀器名字。
46
- * @en The name of the parser.
46
+ * @en The name of the parser.
47
47
  */
48
48
 
49
49
  get name() {
@@ -13,7 +13,7 @@ export type TranslatorParams<
13
13
  input?: S
14
14
  /**
15
15
  * @zh 輸出的資料格式。
16
- * @en The output data format.
16
+ * @en The output data format.
17
17
  */
18
18
  output: O
19
19
  /**
@@ -46,6 +46,7 @@ export class Translator<
46
46
  get __schemeType(): ValidateCallbackOutputs<S> {
47
47
  return null as any
48
48
  }
49
+
49
50
  get __outputType(): ValidateCallbackOutputs<O> {
50
51
  return null as any
51
52
  }
package/lib/ctod.ts CHANGED
@@ -39,7 +39,7 @@ export class CtoD<
39
39
  P,
40
40
  PS,
41
41
  ChatBrokerHooks<() => I, () => O, P, PS>
42
- >({
42
+ >({
43
43
  output: () => ({} as any),
44
44
  install: (context) => {
45
45
  params?.install?.(context)
@@ -62,7 +62,7 @@ export class CtoD<
62
62
  changeOutputSchema(() => schema)
63
63
  })
64
64
  },
65
- plugins: this.params.plugins ? (() => this.params.plugins!()) : undefined,
65
+ plugins: this.params.plugins ? () => this.params.plugins!() : undefined,
66
66
  request: this.params.request
67
67
  })
68
68
  }
package/lib/index.ts CHANGED
@@ -1,41 +1,14 @@
1
1
  export * as plugins from './plugins'
2
2
  export * as templates from './templates'
3
3
  export { CtoD } from './ctod'
4
- export { validateToJsonSchema, defineYupSchema, ValidateCallback } from './utils/validate'
4
+ export { validateToJsonSchema, defineYupSchema } from './utils/validate'
5
5
  export { OpenAI } from './service/openai'
6
6
  export { Llama3Cpp } from './service/llama3.cpp'
7
7
  export { TextParser } from './core/parser'
8
- export { ChatGPTMessage } from './service/openai/chat'
9
8
  export { ChatBroker } from './broker/chat'
10
9
  export { ChatBrokerPlugin } from './core/plugin'
11
- export { Translator, TranslatorParams } from './core/translator'
12
-
13
- import * as plugins from './plugins'
14
- import * as templates from './templates'
15
- import { OpenAI } from './service/openai'
16
- import { CtoD } from './ctod'
17
- import { Llama3Cpp } from './service/llama3.cpp'
18
- import { Translator } from './core/translator'
19
- import { TextParser } from './core/parser'
20
- import { ChatBroker } from './broker/chat'
21
- import { ChatBrokerPlugin } from './core/plugin'
22
- import { validateToJsonSchema, defineYupSchema } from './utils/validate'
23
-
24
- export const ctod = {
25
- CtoD,
26
- OpenAI,
27
- Llama3Cpp,
28
- plugins,
29
- templates,
30
- ChatBroker,
31
- Translator,
32
- TextParser,
33
- ChatBrokerPlugin,
34
- defineYupSchema,
35
- validateToJsonSchema
36
- }
37
-
38
- module.exports = ctod
39
- module.exports.ctod = ctod
40
-
41
- export default ctod
10
+ export { Translator } from './core/translator'
11
+ export { Google } from './service/google'
12
+ export type { ValidateCallback } from './utils/validate'
13
+ export type { TranslatorParams } from './core/translator'
14
+ export type { ChatGPTMessage } from './service/openai/chat'
@@ -35,4 +35,4 @@ export const LimiterPluginGlobState = Limiter
35
35
  * @en Set role play.
36
36
  */
37
37
 
38
- export const RolePlugin = Role
38
+ export const RolePlugin = Role
@@ -0,0 +1,55 @@
1
+ import { validateToJsonSchema } from '../../utils/validate'
2
+ import type { GoogleGenerativeAI } from '@google/generative-ai'
3
+
4
+ export class Google {
5
+ static createChatRequest(params: {
6
+ googleGenerativeAI: GoogleGenerativeAI
7
+ model: string
8
+ }) {
9
+ const removeAdditionalProperties = (schema: any) => {
10
+ if (schema.type === 'object') {
11
+ delete schema.additionalProperties
12
+ Object.keys(schema.properties).forEach((key) => {
13
+ removeAdditionalProperties(schema.properties[key])
14
+ })
15
+ } else if (schema.type === 'array') {
16
+ removeAdditionalProperties(schema.items)
17
+ }
18
+ return schema
19
+ }
20
+ return async (messages: any[], { schema }: any) => {
21
+ const responseSchema = removeAdditionalProperties(validateToJsonSchema(schema.output))
22
+ const model = params.googleGenerativeAI.getGenerativeModel({
23
+ model: params.model,
24
+ generationConfig: {
25
+ responseMimeType: 'application/json',
26
+ responseSchema
27
+ }
28
+ })
29
+ const result = await model.generateContent({
30
+ contents: messages.map((message) => {
31
+ if (message.role === 'user' || message.role === 'system') {
32
+ return {
33
+ role: 'user',
34
+ parts: [
35
+ {
36
+ text: message.content
37
+ }
38
+ ]
39
+ }
40
+ } else {
41
+ return {
42
+ role: 'model',
43
+ parts: [
44
+ {
45
+ text: message.content
46
+ }
47
+ ]
48
+ }
49
+ }
50
+ })
51
+ })
52
+ return result.response.text()
53
+ }
54
+ }
55
+ }
@@ -1,6 +1,6 @@
1
1
  import { Llama3Cpp } from './index'
2
2
  import { flow } from 'power-helper'
3
- import { tify, sify } from 'chinese-conv'
3
+ import { tify, sify } from 'chinese-conv/dist'
4
4
 
5
5
  type Message = {
6
6
  role: string
@@ -248,7 +248,7 @@ export class Llama3CppCompletion {
248
248
  options?: Options
249
249
  messages: Message[]
250
250
  response_format?: {
251
- type: 'json_object',
251
+ type: 'json_object'
252
252
  schema: any
253
253
  }
254
254
  }) {
@@ -1,5 +1,5 @@
1
1
  import axios, { AxiosInstance } from 'axios'
2
- import { sify } from 'chinese-conv'
2
+ import { sify } from 'chinese-conv/dist'
3
3
  import { validateToJsonSchema } from '../../utils/validate'
4
4
  import { Llama3CppCompletion, Config } from './completion'
5
5
 
@@ -110,7 +110,7 @@ export class OpenAIChat {
110
110
  abortController?: AbortController
111
111
  }) {
112
112
  const newMessages = json.jpjs(messages)
113
- const isSupportJson = [
113
+ const isSupportJson = [
114
114
  'gpt-4-turbo-preview',
115
115
  'gpt-4-turbo',
116
116
  'gpt-4o',
@@ -159,17 +159,17 @@ export class OpenAIChat {
159
159
 
160
160
  talkStream(params: {
161
161
  messages: any[]
162
- onMessage: (message: string) => void
162
+ onMessage: (_message: string) => void
163
163
  onEnd: () => void
164
- onWarn: (warn: any) => void
165
- onError: (error: any) => void
164
+ onWarn: (_warn: any) => void
165
+ onError: (_error: any) => void
166
166
  }) {
167
167
  const controller = new AbortController()
168
168
  fetch('https://api.openai.com/v1/chat/completions', {
169
169
  method: 'POST',
170
170
  headers: {
171
171
  'Content-Type': 'application/json',
172
- Authorization: `Bearer ${this.openai._apiKey}`
172
+ 'Authorization': `Bearer ${this.openai._apiKey}`
173
173
  },
174
174
  body: JSON.stringify({
175
175
  model: this.config.model,
@@ -178,12 +178,11 @@ export class OpenAIChat {
178
178
  }),
179
179
  signal: controller.signal
180
180
  }).then(async response => {
181
- // eslint-disable-next-line no-undef
182
181
  const reader = response.body?.pipeThrough(new TextDecoderStream()).getReader()
183
182
  if (!reader) {
184
183
  throw new Error('Can not get reader')
185
184
  }
186
- // eslint-disable-next-line no-constant-condition
185
+
187
186
  while (true) {
188
187
  const { value, done } = await reader.read()
189
188
  if (done) {
@@ -13,7 +13,7 @@ export class OpenAI {
13
13
  config: Partial<Config> | (() => Promise<Partial<Config>>) = {},
14
14
  options?: {
15
15
  axios?: any
16
- }
16
+ }
17
17
  ) {
18
18
  return async(messages: any[], { onCancel }: any) => {
19
19
  const openai = new OpenAI(typeof apiKey === 'string' ? apiKey : await apiKey())
@@ -31,9 +31,9 @@ export class OpenAI {
31
31
  }
32
32
  }
33
33
 
34
- static createChatRequestWithJsonSchema(params:{
35
- axios?: any,
36
- apiKey: string | (() => Promise<string>),
34
+ static createChatRequestWithJsonSchema(params: {
35
+ axios?: any
36
+ apiKey: string | (() => Promise<string>)
37
37
  config?: Partial<Pick<Config, 'model' | 'temperature'>> | (() => Promise<Partial<Pick<Config, 'model' | 'temperature'>>>)
38
38
  }) {
39
39
  return async(messages: any[], { schema, onCancel }: any) => {
@@ -60,7 +60,6 @@ export class OpenAI {
60
60
  }
61
61
  }
62
62
 
63
-
64
63
  constructor(apiKey = '') {
65
64
  this._apiKey = apiKey
66
65
  }
package/lib/types.ts CHANGED
@@ -1,4 +1,4 @@
1
1
  export type PromiseResponseType<
2
- T extends (...args: any) => Promise<any>,
2
+ T extends (..._args: any) => Promise<any>,
3
3
  R = Parameters<ReturnType<T>['then']>[0]
4
- > = R extends (value: infer P) => any ? P : never
4
+ > = R extends (_value: infer P) => any ? P : never
@@ -10,7 +10,7 @@ export type ValidateCallbackOutputs<
10
10
  T extends ValidateCallback<any>,
11
11
  R = ReturnType<T>
12
12
  > = {
13
- [K in keyof R]: R[K] extends { '__outputType': any } ? R[K]['__outputType'] : R[K]
13
+ [K in keyof R]: R[K] extends { __outputType: any } ? R[K]['__outputType'] : R[K]
14
14
  }
15
15
 
16
16
  export function definedValidateSchema<T extends ValidateCallback<any>>(cb: T): T {
@@ -22,7 +22,7 @@ export function validate<
22
22
  R = ReturnType<T>
23
23
  >(target: any, schemaCallback: T) {
24
24
  return Yup.object(schemaCallback(Yup)).required().validateSync(target || {}) as {
25
- [K in keyof R]: R[K] extends { '__outputType': any } ? R[K]['__outputType'] : R[K]
25
+ [K in keyof R]: R[K] extends { __outputType: any } ? R[K]['__outputType'] : R[K]
26
26
  }
27
27
  }
28
28
 
package/package.json CHANGED
@@ -1,11 +1,11 @@
1
1
  {
2
2
  "name": "ctod",
3
- "version": "0.7.2",
3
+ "version": "0.8.0",
4
4
  "description": "CtoD Is Chat To Data Utils.",
5
5
  "main": "./dist/index.js",
6
+ "type": "module",
6
7
  "scripts": {
7
- "build": "cross-env webpack --progress",
8
- "coverage": "nyc --reporter=lcov npm test"
8
+ "build": "tsc --declaration --emitDeclarationOnly && node ./esbuild.mjs"
9
9
  },
10
10
  "types": "./types/lib",
11
11
  "repository": {
@@ -28,20 +28,21 @@
28
28
  "devDependencies": {
29
29
  "@babel/core": "^7.4.5",
30
30
  "@babel/preset-env": "^7.4.5",
31
+ "@google/generative-ai": "^0.21.0",
31
32
  "@types/chai": "^4.2.22",
32
33
  "@types/inquirer": "8.2.5",
33
34
  "@types/jsdom": "^16.2.13",
34
35
  "@types/mocha": "^9.1.1",
35
36
  "@types/node": "^22.1.0",
36
- "@types/webpack-node-externals": "^3.0.0",
37
- "@typescript-eslint/eslint-plugin": "^5.39.0",
38
- "@typescript-eslint/parser": "^5.39.0",
39
37
  "babel-loader": "^8.2.5",
40
38
  "chai": "^4.3.4",
41
39
  "cheerio": "^1.0.0-rc.12",
42
40
  "cross-env": "^7.0.3",
43
- "eslint": "^8.25.0",
44
- "eslint-webpack-plugin": "^3.2.0",
41
+ "esbuild": "^0.24.2",
42
+ "esbuild-node-externals": "^1.16.0",
43
+ "esbuild-plugin-env": "^1.1.1",
44
+ "esbuild-plugin-eslint": "^0.3.12",
45
+ "eslint": "9.14.0",
45
46
  "esno": "^4.8.0",
46
47
  "inquirer": "8.2.5",
47
48
  "jsdom": "^18.1.1",
@@ -49,17 +50,16 @@
49
50
  "nyc": "^15.1.0",
50
51
  "ts-loader": "^9.3.1",
51
52
  "typescript": "^4.7.4",
52
- "webpack": "^5.74.0",
53
- "webpack-cli": "^4.10.0",
54
- "webpack-node-externals": "^3.0.0"
53
+ "typescript-eslint": "^8.18.1",
54
+ "@stylistic/eslint-plugin": "^2.12.1"
55
55
  },
56
56
  "dependencies": {
57
57
  "@sodaru/yup-to-json-schema": "^2.0.1",
58
58
  "axios": "^1.4.0",
59
- "chinese-conv": "^1.1.0",
59
+ "chinese-conv": "^3.2.2",
60
60
  "handlebars": "^4.7.7",
61
61
  "json5": "^2.2.3",
62
- "power-helper": "^0.7.9",
62
+ "power-helper": "^0.8.0",
63
63
  "yup": "^1.4.0"
64
64
  }
65
65
  }
@@ -0,0 +1 @@
1
+ export {};
@@ -1,2 +1 @@
1
- /// <reference types="lib/shims" />
2
1
  export {};
@@ -0,0 +1 @@
1
+ export {};
@@ -1,2 +1 @@
1
- /// <reference types="lib/shims" />
2
1
  export {};
@@ -1,34 +1,14 @@
1
1
  export * as plugins from './plugins';
2
2
  export * as templates from './templates';
3
3
  export { CtoD } from './ctod';
4
- export { validateToJsonSchema, defineYupSchema, ValidateCallback } from './utils/validate';
4
+ export { validateToJsonSchema, defineYupSchema } from './utils/validate';
5
5
  export { OpenAI } from './service/openai';
6
6
  export { Llama3Cpp } from './service/llama3.cpp';
7
7
  export { TextParser } from './core/parser';
8
- export { ChatGPTMessage } from './service/openai/chat';
9
8
  export { ChatBroker } from './broker/chat';
10
9
  export { ChatBrokerPlugin } from './core/plugin';
11
- export { Translator, TranslatorParams } from './core/translator';
12
- import * as plugins from './plugins';
13
- import * as templates from './templates';
14
- import { OpenAI } from './service/openai';
15
- import { CtoD } from './ctod';
16
- import { Llama3Cpp } from './service/llama3.cpp';
17
- import { Translator } from './core/translator';
18
- import { TextParser } from './core/parser';
19
- import { ChatBroker } from './broker/chat';
20
- import { ChatBrokerPlugin } from './core/plugin';
21
- export declare const ctod: {
22
- CtoD: typeof CtoD;
23
- OpenAI: typeof OpenAI;
24
- Llama3Cpp: typeof Llama3Cpp;
25
- plugins: typeof plugins;
26
- templates: typeof templates;
27
- ChatBroker: typeof ChatBroker;
28
- Translator: typeof Translator;
29
- TextParser: typeof TextParser;
30
- ChatBrokerPlugin: typeof ChatBrokerPlugin;
31
- defineYupSchema: <T extends Record<string, import("yup").Schema<any, any, any, "">>>(cb: import("./utils/validate").ValidateCallback<T>) => T;
32
- validateToJsonSchema: <T_1 extends import("./utils/validate").ValidateCallback<any>>(cb: T_1) => import("json-schema").JSONSchema7;
33
- };
34
- export default ctod;
10
+ export { Translator } from './core/translator';
11
+ export { Google } from './service/google';
12
+ export type { ValidateCallback } from './utils/validate';
13
+ export type { TranslatorParams } from './core/translator';
14
+ export type { ChatGPTMessage } from './service/openai/chat';
@@ -0,0 +1,7 @@
1
+ import type { GoogleGenerativeAI } from '@google/generative-ai';
2
+ export declare class Google {
3
+ static createChatRequest(params: {
4
+ googleGenerativeAI: GoogleGenerativeAI;
5
+ model: string;
6
+ }): (messages: any[], { schema }: any) => Promise<string>;
7
+ }
@@ -85,10 +85,10 @@ export declare class OpenAIChat {
85
85
  }>;
86
86
  talkStream(params: {
87
87
  messages: any[];
88
- onMessage: (message: string) => void;
88
+ onMessage: (_message: string) => void;
89
89
  onEnd: () => void;
90
- onWarn: (warn: any) => void;
91
- onError: (error: any) => void;
90
+ onWarn: (_warn: any) => void;
91
+ onError: (_error: any) => void;
92
92
  }): {
93
93
  cancel: () => void;
94
94
  };
@@ -1 +1 @@
1
- export type PromiseResponseType<T extends (...args: any) => Promise<any>, R = Parameters<ReturnType<T>['then']>[0]> = R extends (value: infer P) => any ? P : never;
1
+ export type PromiseResponseType<T extends (..._args: any) => Promise<any>, R = Parameters<ReturnType<T>['then']>[0]> = R extends (_value: infer P) => any ? P : never;
@@ -5,7 +5,7 @@ export type ValidateCallback<T extends Record<string, Schema>> = (_yup: typeof Y
5
5
  };
6
6
  export type ValidateCallbackOutputs<T extends ValidateCallback<any>, R = ReturnType<T>> = {
7
7
  [K in keyof R]: R[K] extends {
8
- '__outputType': any;
8
+ __outputType: any;
9
9
  } ? R[K]['__outputType'] : R[K];
10
10
  };
11
11
  export declare function definedValidateSchema<T extends ValidateCallback<any>>(cb: T): T;
package/.eslintrc.js DELETED
@@ -1,30 +0,0 @@
1
- module.exports = {
2
- root: true,
3
- env: {
4
- node: true,
5
- mocha: true,
6
- browser: true,
7
- 'shared-node-browser': true
8
- },
9
- plugins: ['@typescript-eslint'],
10
- extends: [
11
- 'plugin:@typescript-eslint/recommended',
12
- 'eslint:recommended'
13
- ],
14
- rules: {
15
- quotes: ['error', 'single'],
16
- indent: ['error', 4],
17
- camelcase: 'off',
18
- 'no-unused-vars': 'off',
19
- '@typescript-eslint/ban-ts-comment': 'off',
20
- '@typescript-eslint/no-unused-vars': ['error', { argsIgnorePattern: '^_' }],
21
- 'no-console': process.env.NODE_ENV === 'production' ? 'warn' : 'off',
22
- 'no-debugger': process.env.NODE_ENV === 'production' ? 'warn' : 'off',
23
- '@typescript-eslint/explicit-module-boundary-types': 'off',
24
- '@typescript-eslint/no-explicit-any': 'off',
25
- 'prefer-const': 'off',
26
- '@typescript-eslint/no-non-null-assertion': 'off',
27
- 'space-before-function-paren': 'off',
28
- 'no-use-before-define': 'off'
29
- }
30
- }
package/lib/shims.d.ts DELETED
@@ -1,4 +0,0 @@
1
- declare module 'chinese-conv' {
2
- export function tify(text: string): string
3
- export function sify(text: string): string
4
- }
package/webpack.config.ts DELETED
@@ -1,45 +0,0 @@
1
- import ESLintPlugin from 'eslint-webpack-plugin'
2
- import path from 'path'
3
- import nodeExternals from 'webpack-node-externals'
4
-
5
- export default {
6
- mode: 'production',
7
- entry: './lib/index.ts',
8
- output: {
9
- library: 'ctod',
10
- libraryTarget: 'umd',
11
- path: path.resolve(__dirname, './dist'),
12
- publicPath: '/dist/',
13
- filename: 'index.js',
14
- globalObject: 'this || (typeof window !== \'undefined\' ? window : global)'
15
- },
16
- optimization: {
17
- removeAvailableModules: false,
18
- removeEmptyChunks: false,
19
- splitChunks: false
20
- },
21
- resolve: {
22
- extensions: ['.ts']
23
- },
24
- externalsPresets: {
25
- node: true
26
- },
27
- externals: [
28
- nodeExternals()
29
- ],
30
- plugins: [
31
- new ESLintPlugin({
32
- files: 'lib/**/*.ts',
33
- fix: true
34
- })
35
- ],
36
- module: {
37
- rules: [
38
- {
39
- test: /\.ts$/,
40
- use: 'ts-loader',
41
- exclude: /node_modules/
42
- }
43
- ]
44
- }
45
- }