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 +1 -1
- package/dist/index.js +40 -1
- package/dist/index.js.map +7 -0
- package/esbuild.mjs +21 -0
- package/eslint.config.mjs +29 -0
- package/examples/google.ts +94 -0
- package/examples/llama.cpp.ts +0 -2
- package/examples/{basic.ts → openai.ts} +1 -1
- package/examples/plugin.ts +0 -3
- package/lib/core/parser.ts +2 -2
- package/lib/core/translator.ts +2 -1
- package/lib/ctod.ts +2 -2
- package/lib/index.ts +6 -33
- package/lib/plugins/index.ts +1 -1
- package/lib/service/google/index.ts +55 -0
- package/lib/service/llama3.cpp/completion.ts +2 -2
- package/lib/service/llama3.cpp/index.ts +1 -1
- package/lib/service/openai/chat.ts +6 -7
- package/lib/service/openai/index.ts +4 -5
- package/lib/types.ts +2 -2
- package/lib/utils/validate.ts +2 -2
- package/package.json +13 -13
- package/types/examples/google.d.ts +1 -0
- package/types/examples/llama.cpp.d.ts +0 -1
- package/types/examples/openai.d.ts +1 -0
- package/types/examples/plugin.d.ts +0 -1
- package/types/lib/index.d.ts +6 -26
- package/types/lib/service/google/index.d.ts +7 -0
- package/types/lib/service/openai/chat.d.ts +3 -3
- package/types/lib/types.d.ts +1 -1
- package/types/lib/utils/validate.d.ts +1 -1
- package/.eslintrc.js +0 -30
- package/lib/shims.d.ts +0 -4
- package/webpack.config.ts +0 -45
package/README.md
CHANGED
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
|
+
})
|
package/examples/llama.cpp.ts
CHANGED
package/examples/plugin.ts
CHANGED
package/lib/core/parser.ts
CHANGED
|
@@ -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() {
|
package/lib/core/translator.ts
CHANGED
|
@@ -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 ? (
|
|
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
|
|
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
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
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'
|
package/lib/plugins/index.ts
CHANGED
|
@@ -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
|
}) {
|
|
@@ -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: (
|
|
162
|
+
onMessage: (_message: string) => void
|
|
163
163
|
onEnd: () => void
|
|
164
|
-
onWarn: (
|
|
165
|
-
onError: (
|
|
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
|
-
|
|
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
package/lib/utils/validate.ts
CHANGED
|
@@ -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 {
|
|
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 {
|
|
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.
|
|
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": "
|
|
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
|
-
"
|
|
44
|
-
"
|
|
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
|
-
"
|
|
53
|
-
"
|
|
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": "^
|
|
59
|
+
"chinese-conv": "^3.2.2",
|
|
60
60
|
"handlebars": "^4.7.7",
|
|
61
61
|
"json5": "^2.2.3",
|
|
62
|
-
"power-helper": "^0.
|
|
62
|
+
"power-helper": "^0.8.0",
|
|
63
63
|
"yup": "^1.4.0"
|
|
64
64
|
}
|
|
65
65
|
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
package/types/lib/index.d.ts
CHANGED
|
@@ -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
|
|
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
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
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';
|
|
@@ -85,10 +85,10 @@ export declare class OpenAIChat {
|
|
|
85
85
|
}>;
|
|
86
86
|
talkStream(params: {
|
|
87
87
|
messages: any[];
|
|
88
|
-
onMessage: (
|
|
88
|
+
onMessage: (_message: string) => void;
|
|
89
89
|
onEnd: () => void;
|
|
90
|
-
onWarn: (
|
|
91
|
-
onError: (
|
|
90
|
+
onWarn: (_warn: any) => void;
|
|
91
|
+
onError: (_error: any) => void;
|
|
92
92
|
}): {
|
|
93
93
|
cancel: () => void;
|
|
94
94
|
};
|
package/types/lib/types.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export type PromiseResponseType<T extends (...
|
|
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
|
-
|
|
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
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
|
-
}
|