ctod 0.7.0 → 0.7.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +1 -1
- package/examples/basic.ts +9 -1
- package/lib/ctod.ts +1 -1
- package/package.json +1 -1
- package/logo.ai +2 -1141
- package/logo.png +0 -0
package/dist/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
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?.(),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
|
+
!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)})()));
|
package/examples/basic.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import fs from 'fs'
|
|
2
|
-
import { CtoD, OpenAI } from '../lib/index'
|
|
2
|
+
import { CtoD, OpenAI, plugins } from '../lib/index'
|
|
3
3
|
|
|
4
4
|
/**
|
|
5
5
|
* @test npx esno ./examples/basic.ts
|
|
@@ -8,6 +8,14 @@ import { CtoD, OpenAI } from '../lib/index'
|
|
|
8
8
|
const apiKey = fs.readFileSync('./.api-key', 'utf-8').trim()
|
|
9
9
|
|
|
10
10
|
const ctod = new CtoD({
|
|
11
|
+
plugins: () => {
|
|
12
|
+
return {
|
|
13
|
+
retry: plugins.RetryPlugin.use({
|
|
14
|
+
retry: 3,
|
|
15
|
+
printWarn: true
|
|
16
|
+
})
|
|
17
|
+
}
|
|
18
|
+
},
|
|
11
19
|
request: OpenAI.createChatRequestWithJsonSchema({
|
|
12
20
|
apiKey,
|
|
13
21
|
config: {
|
package/lib/ctod.ts
CHANGED