ctod 0.8.3 → 0.8.4
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
CHANGED
|
@@ -14,5 +14,5 @@ var Z=Object.defineProperty;var ce=(s,e,t)=>e in s?Z(s,e,{enumerable:!0,configur
|
|
|
14
14
|
`);for(let c of l)if(c.length!==0&&!c.startsWith(":")){if(c==="data: [DONE]"){e.onEnd();break}try{let u=JSON.parse(c.substring(6)).choices[0].delta.content;e.onMessage(u)}catch(p){e.onWarn(p)}}}}).catch(n=>{n.name==="AbortError"?e.onEnd():e.onError(n)}),{cancel:()=>t.abort()}}async keepTalk(e,t=[]){let n=await this.talk([...t,{role:"user",content:Array.isArray(e)?e.join(`
|
|
15
15
|
`):e}]);return{result:n,nextTalk:r=>this.keepTalk(r,n.newMessages)}}};var E=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 L=class s{constructor(e=""){o(this,"_axios",Re.create());o(this,"_apiKey","");this._apiKey=e}static createChatRequest(e,t={},n){return async(r,{onCancel:a})=>{let i=new s(typeof e=="string"?e:await e()),l=i.createChat(),c=new AbortController;n&&n.axios&&i.setAxios(n.axios),l.setConfig(typeof t=="function"?await t():t),a(()=>c.abort());let{text:p}=await l.talk(r,{abortController:c});return p}}static createChatRequestWithJsonSchema(e){return async(t,{schema:n,onCancel:r})=>{let a=new s(typeof e.apiKey=="string"?e.apiKey:await e.apiKey()),i=a.createChat(),l=new AbortController;e.config&&i.setConfig(typeof e.config=="function"?await e.config():e.config),e.axios&&a.setAxios(e.axios),r(()=>l.abort());let c=k(n.output),{text:p}=await i.talk(t,{abortController:l,jsonSchema:{name:"data",strict:!0,schema:c}});return p}}setAxios(e){this._axios=e}setConfiguration(e){this._apiKey=e}createChat(){return new j(this)}createVision(){return new V(this)}createImagesGeneration(){return new E(this)}};import je from"axios";import{sify as Ee}from"chinese-conv/dist";import{flow as Ie,Once as Ve}from"power-helper";import{tify as J,sify as G}from"chinese-conv/dist";import{Template as le}from"@huggingface/jinja";var w=class{constructor(e){o(this,"core");o(this,"streamAbortControllers",[]);this.core=e}createAbortController(){let e=new AbortController,t=Ie.createUuid();return this.streamAbortControllers.push({id:t,controller:e}),{signal:e.signal,controllerId:t}}removeAbortController(e){this.streamAbortControllers=this.streamAbortControllers.filter(t=>t.id!==e)}async stream(e){let{signal:t,controllerId:n}=this.createAbortController(),r=()=>{this.removeAbortController(n),e.onEnd()},a=async i=>{if(i.body){let l=i.body.getReader(),c=!1,p="";for(;!c;){let{value:u,done:v}=await l.read();if(u){p+=new TextDecoder("utf-8").decode(u);let g=p.split(`
|
|
16
16
|
|
|
17
|
-
`);p=g.pop()||"",g.forEach(T=>{if(T.includes("[DONE]")&&(c=!0),T.startsWith("data:"))try{let b=JSON.parse(T.replace("data: ",""));e.onMessage(b)}catch(b){e.onWarn(b)}})}v&&(c=!0)}r()}else e.onError(new Error("Body not found."))};fetch(`${this.core.config.baseUrl}/${e.path}`,{method:"POST",body:JSON.stringify(typeof e.data=="function"?await e.data():e.data),signal:t,headers:{"Content-Type":"application/json",...this.core.config.headers}}).then(a).catch(i=>{i instanceof Error&&i.message.includes("The user aborted a request")?r():e.onError(i)})}async fetch(e){let{signal:t,controllerId:n}=this.createAbortController();try{return{data:(await this.core.core._axios.post(`${this.core.config.baseUrl}/${e.path}`,e.data,{signal:t,headers:{"Content-Type":"application/json",...this.core.config.headers}})).data}}finally{this.removeAbortController(n)}}cancel(){this.streamAbortControllers.forEach(e=>e.controller.abort()),this.streamAbortControllers=[]}export(){return{cancel:this.cancel.bind(this)}}},B=class{constructor(e){o(this,"getProp",new Ve({handler:async()=>{let e=`${this.config.baseUrl}/props`,{data:t}=await this.core._axios.get(e,{});return t}}));o(this,"core");o(this,"config",{baseUrl:"",headers:{},autoConvertTraditionalChinese:!0});this.core=e}setConfig(e){this.config={...this.config,...e}}completion(e){let t=e.messages.at(-1)||"",n=new w(this);return{...n.export(),run:async()=>{let r=await this.getProp.run(),i=new le(r.chat_template).render({bos_token:r.bos_token,messages:e.messages}).slice(0,r.eos_token.length*-1-1),l=await n.fetch({path:"completion",data:{...e.options||{},prompt:this.config.autoConvertTraditionalChinese?G(i):i}}),c=this.config.autoConvertTraditionalChinese?J(l.data.content):l.data.content;return{message:c,fullMessage:`${t}${c}`}}}}completionStream(e){let t=new w(this);return t.stream({path:"completion",onEnd:e.onEnd||(()=>null),onMessage:n=>{
|
|
17
|
+
`);p=g.pop()||"",g.forEach(T=>{if(T.includes("[DONE]")&&(c=!0),T.startsWith("data:"))try{let b=JSON.parse(T.replace("data: ",""));e.onMessage(b)}catch(b){e.onWarn(b)}})}v&&(c=!0)}r()}else e.onError(new Error("Body not found."))};fetch(`${this.core.config.baseUrl}/${e.path}`,{method:"POST",body:JSON.stringify(typeof e.data=="function"?await e.data():e.data),signal:t,headers:{"Content-Type":"application/json",...this.core.config.headers}}).then(a).catch(i=>{i instanceof Error&&i.message.includes("The user aborted a request")?r():e.onError(i)})}async fetch(e){let{signal:t,controllerId:n}=this.createAbortController();try{return{data:(await this.core.core._axios.post(`${this.core.config.baseUrl}/${e.path}`,e.data,{signal:t,headers:{"Content-Type":"application/json",...this.core.config.headers}})).data}}finally{this.removeAbortController(n)}}cancel(){this.streamAbortControllers.forEach(e=>e.controller.abort()),this.streamAbortControllers=[]}export(){return{cancel:this.cancel.bind(this)}}},B=class{constructor(e){o(this,"getProp",new Ve({handler:async()=>{let e=`${this.config.baseUrl}/props`,{data:t}=await this.core._axios.get(e,{});return t}}));o(this,"core");o(this,"config",{baseUrl:"",headers:{},autoConvertTraditionalChinese:!0});this.core=e}setConfig(e){this.config={...this.config,...e}}completion(e){let t=e.messages.at(-1)||"",n=new w(this);return{...n.export(),run:async()=>{let r=await this.getProp.run(),i=new le(r.chat_template).render({bos_token:r.bos_token,messages:e.messages}).slice(0,r.eos_token.length*-1-1),l=await n.fetch({path:"completion",data:{...e.options||{},prompt:this.config.autoConvertTraditionalChinese?G(i):i}}),c=this.config.autoConvertTraditionalChinese?J(l.data.content):l.data.content;return{message:c,fullMessage:`${t}${c}`}}}}completionStream(e){let t=new w(this);return t.stream({path:"completion",onEnd:e.onEnd||(()=>null),onMessage:n=>{let r=this.config.autoConvertTraditionalChinese?J(n.content):n.content;e.onMessage(r)},onWarn:e.onWarn||(()=>null),onError:e.onError||(()=>null),data:async()=>{let n=await this.getProp.run(),a=new le(n.chat_template).render({bos_token:n.bos_token,messages:e.messages}).slice(0,n.eos_token.length*-1-1);return{...e.options||{},prompt:this.config.autoConvertTraditionalChinese?G(a):a,stream:!0}}}),t.export()}talk(e){let t=new w(this);return{...t.export(),run:async()=>{let r=(await t.fetch({path:"v1/chat/completions",data:{...e.options||{},response_format:e.response_format,messages:e.messages.map(a=>({role:a.role,content:this.config.autoConvertTraditionalChinese?G(a.content):a.content}))}})).data.choices[0].message.content||"";return{message:this.config.autoConvertTraditionalChinese?J(r):r}}}}talkStream(e){let t=new w(this);return t.stream({path:"v1/chat/completions",onEnd:e.onEnd||(()=>null),onMessage:n=>{let r=n.choices[0].delta.content;if(r){let a=this.config.autoConvertTraditionalChinese?J(r):r;e.onMessage(a)}},onWarn:e.onWarn||(()=>null),onError:e.onError||(()=>null),data:{...e.options||{},stream:!0,messages:e.messages.map(n=>({role:n.role,content:this.config.autoConvertTraditionalChinese?G(n.content):n.content}))}}),t.export()}};var U=class s{constructor(){o(this,"_axios",je.create())}static createChatRequestWithJsonSchema(e){return async(t,{schema:n,onCancel:r})=>{let i=new s().createCompletion(),l=typeof e.config=="function"?await e.config():e.config;i.setConfig(l);let c=k(n.output);i.config.autoConvertTraditionalChinese&&(c=JSON.parse(Ee(JSON.stringify(c))));let{run:p,cancel:u}=i.talk({options:e.talkOptions,messages:t,response_format:{type:"json_object",schema:c}});r(u);let{message:v}=await p();return v}}setAxios(e){this._axios=e}createCompletion(){return new B(this)}};import{json as Je}from"power-helper";var q=class{constructor(e){o(this,"google");o(this,"config",{model:"gemini-1.5-flash"});this.google=e}setConfig(e){Object.assign(this.config,e)}async talk(e=[]){let t=Je.jpjs(e),a=(await this.google.generativeAI.getGenerativeModel({model:this.config.model}).generateContent({contents:t})).response.text();return{text:a,newMessages:[...t,{role:"model",parts:[{text:a}]}]}}talkStream(e){let t=this.google.generativeAI.getGenerativeModel({model:this.config.model}),n={contents:e.messages};t.generateContentStream(n).then(async({stream:r})=>{for await(let a of r){let i=a.text();e.onMessage(i)}e.onEnd()}).catch(r=>{e.onError(r)})}};var z=class s{constructor(e){o(this,"generativeAI");this.generativeAI=e}static chatGPTMessageToGoogleChatMessage(e){let t=n=>typeof n=="string"?[{text:n}]:Array.isArray(n)?n.map(({type:r,image_url:a,text:i})=>{if(r==="image_url"){let l=a?.url||"",c=l.includes("data:image/png")?"image/png":"image/jpeg";return{inlineData:{data:l.split("base64,")[1]||"",mimeType:c}}}else return{text:i||""}}):[];return e.map(n=>n.role==="user"||n.role==="system"?{role:"user",parts:t(n.content)}:{role:"model",parts:t(n.content)})}static createChatRequestWithJsonSchema(e){let t=n=>(n.type==="object"?(delete n.additionalProperties,Object.keys(n.properties).forEach(r=>{t(n.properties[r])})):n.type==="array"&&t(n.items),n);return async(n,{schema:r})=>{let a=t(k(r.output));return(await e.googleGenerativeAI.getGenerativeModel({model:e.model,generationConfig:{responseMimeType:"application/json",responseSchema:a}}).generateContent({contents:s.chatGPTMessageToGoogleChatMessage(n)})).response.text()}}createChat(){return new q(this)}};var N=class{constructor(e){o(this,"anthropic");o(this,"config",{model:"claude-3-5-haiku-latest",maxTokens:8192});this.anthropic=e}setConfig(e){Object.assign(this.config,e)}translateMessages(e){return{system:e.find(t=>t.role==="system")?.content[0].text,messages:e.filter(t=>t.role!=="system")}}async chatAndStructure(e,t){let n=this.anthropic.anthropicSdk,r=this.translateMessages(e),l=(await n.messages.create({model:this.config.model,max_tokens:this.config.maxTokens,system:r.system,messages:r.messages,tools:[{name:"data",description:"Response Data",input_schema:t}],tool_choice:{type:"tool",name:"data"}})).content.find(c=>c.type==="tool_use")?.input||null;return l==null?"null":JSON.stringify(l)}async talk(e=[]){let t=this.anthropic.anthropicSdk,n=this.translateMessages(e),r=await t.messages.create({model:this.config.model,max_tokens:this.config.maxTokens,system:n.system,messages:n.messages}),a="",i=r.content.find(l=>l.type==="text");return i&&(a=i.text),a}talkStream(e){let t=this.anthropic.anthropicSdk,{onMessage:n,onEnd:r,onError:a}=e,{messages:i,system:l}=this.translateMessages(e.messages);return(async()=>{try{let p=await t.messages.create({model:this.config.model,max_tokens:this.config.maxTokens,system:l,stream:!0,messages:i});for await(let u of p)if(u.type==="content_block_delta"){let v="text"in u.delta?u.delta.text:"";n(v)}r()}catch(p){a(p)}})(),{cancel:()=>null}}};var Y=class s{constructor(e){o(this,"anthropicSdk");this.anthropicSdk=e}static createChatRequestWithJsonSchema(e){let n=new s(e.anthropicSdk).createChat();return n.setConfig(e.config||{}),async(r,{schema:a})=>{let i=k(a.output);return await n.chatAndStructure(r,i)}}createChat(){return new N(this)}};export{Y as AnthropicCtodService,M as ChatBroker,h as ChatBrokerPlugin,$ as CtoD,h as CtoDPlugin,z as GoogleCtodService,U as Llama3CppCtodService,L as OpenAICtodService,_ as TextParser,A as Translator,Se as defineYupSchema,se as plugins,oe as templates,k as validateToJsonSchema};
|
|
18
18
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../lib/plugins/index.ts", "../lib/core/plugin.ts", "../lib/plugins/retry.ts", "../lib/plugins/print-log.ts", "../lib/plugins/limiter.ts", "../lib/plugins/role.ts", "../lib/templates.ts", "../lib/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/chat.ts", "../lib/service/google/index.ts", "../lib/service/anthropic/chat.ts", "../lib/service/anthropic/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 OpenAICtodService {\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 OpenAICtodService(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 OpenAICtodService(typeof params.apiKey === 'string' ? params.apiKey : await params.apiKey())\n const chat = openai.createChat()\n const abortController = new AbortController()\n if (params.config) {\n chat.setConfig(typeof params.config === 'function' ? await params.config() : params.config)\n }\n if (params.axios) {\n openai.setAxios(params.axios)\n }\n onCancel(() => abortController.abort())\n const jsonSchema = validateToJsonSchema(schema.output)\n const { text } = await chat.talk(messages, {\n abortController,\n jsonSchema: {\n name: 'data',\n strict: true,\n schema: jsonSchema\n }\n })\n return text\n }\n }\n\n constructor(apiKey = '') {\n this._apiKey = apiKey\n }\n\n /**\n * @zh \u5982\u679C\u4F60\u6709\u9700\u8981\u7279\u5225\u8A2D\u5B9A axios\uFF0C\u8ACB\u4F7F\u7528\u9019\u65B9\u6CD5\u3002\n * @en If you need to set axios, please use this method.\n */\n\n setAxios(axios: any) {\n this._axios = axios\n }\n\n /**\n * @zh \u8A2D\u5B9A api key\u3002\n * @en Set api key.\n */\n\n setConfiguration(apiKey: string) {\n this._apiKey = apiKey\n }\n\n createChat() {\n return new OpenAIChat(this)\n }\n\n createVision() {\n return new OpenAIVision(this)\n }\n\n createImagesGeneration() {\n return new OpenAIImagesGeneration(this)\n }\n}\n", "import { OpenAICtodService } from './index'\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\nexport type VisionMessage = {\n role: 'system' | 'user' | 'assistant'\n name?: string\n content: string | ImageContent[]\n}\n\ntype ApiResponse = {\n id: string\n object: string\n created: number\n model: string\n usage: {\n prompt_tokens: number\n completion_tokens: number\n total_tokens: number\n }\n choices: Array<{\n message: {\n role: string\n content: string\n }\n finish_details: {\n type: string\n }\n index: number\n }>\n}\n\nexport type Config = {\n /**\n * @zh \u9078\u64C7\u904B\u884C\u7684\u6A21\u578B\u3002\n * @en How many chat completion choices to generate for each input message.\n */\n model: 'gpt-4-vision-preview'\n /**\n * @zh \u5192\u96AA\u6307\u6578\uFF0C\u6578\u503C\u7531 0 ~ 2 \u4E4B\u9593\u3002\n * @en What sampling temperature to use, between 0 and 2. Higher values like 0.8 will make the output more random, while lower values like 0.2 will make it more focused and deterministic.\n */\n temperature: number\n /**\n * @zh \u6BCF\u6B21\u5C0D\u8A71\u6700\u591A\u7522\u751F\u5E7E\u500B tokens\u3002\n * @en How many tokens to complete to.\n */\n maxTokens?: number\n}\n\nexport class OpenAIVision {\n openai: OpenAICtodService\n config: Config = {\n model: 'gpt-4-vision-preview',\n maxTokens: undefined,\n temperature: 1\n }\n\n constructor(openai: OpenAICtodService) {\n this.openai = openai\n }\n\n /**\n * @zh \u6539\u8B8A\u5C0D\u8A71\u7684\u4E00\u4E9B\u8A2D\u5B9A\n * @en Change some settings of the conversation\n */\n\n setConfig(options: Partial<Config>) {\n Object.assign(this.config, options)\n }\n\n /**\n * @zh \u8FA8\u8B58\u5716\u7247\n * @en Recognize images\n */\n\n async view(messages: VisionMessage[]) {\n const result = await this.openai._axios.post<ApiResponse>('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 apiResponse: result.data\n }\n }\n}\n\nexport type OpenAIChatVisionResponse = PromiseResponseType<OpenAIVision['view']>\n", "import { json } from 'power-helper'\nimport { OpenAICtodService } 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'\n * @en The model to use for this chat completion.\n */\n model: string\n /**\n * @zh \u5192\u96AA\u6307\u6578\uFF0C\u6578\u503C\u7531 0 ~ 2 \u4E4B\u9593\uFF0C\u8D8A\u4F4E\u56DE\u61C9\u8D8A\u7A69\u5B9A\u3002\n * @en What sampling temperature to use, between 0 and 2. Higher values like 0.8 will make the output more random, while lower values like 0.2 will make it more focused and deterministic.\n */\n temperature: number\n /**\n * @zh \u662F\u5426\u5F37\u5236\u8981\u56DE\u50B3 JSON \u683C\u5F0F\u7684\u8CC7\u6599\n * @en Whether to force the return of JSON format data\n */\n forceJsonFormat: boolean\n /**\n * @zh \u6BCF\u6B21\u5C0D\u8A71\u6700\u591A\u7522\u751F\u5E7E\u500B tokens\u3002\n * @en How many tokens to complete to.\n */\n maxTokens?: number\n}\n\nexport class OpenAIChat {\n openai: OpenAICtodService\n config: Config = {\n n: 1,\n model: 'gpt-4o',\n temperature: 1,\n maxTokens: undefined,\n forceJsonFormat: true\n }\n\n constructor(openai: OpenAICtodService) {\n this.openai = openai\n }\n\n /**\n * @zh \u6539\u8B8A\u5C0D\u8A71\u7684\u4E00\u4E9B\u8A2D\u5B9A\n * @en Change some settings of the conversation\n */\n\n setConfig(options: Partial<Config>) {\n Object.assign(this.config, options)\n }\n\n /**\n * @zh \u6AA2\u8996\u5167\u5BB9\u662F\u5426\u7B26\u5408 OpenAI \u7684\u5BE9\u67E5\n * @en View content for OpenAI moderation\n */\n\n async moderations(input: string) {\n const result = await this.openai._axios.post<any>('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 apiResponse: result.data\n }\n }\n\n talkStream(params: {\n messages: any[]\n onMessage: (_message: string) => void\n onEnd: () => void\n onWarn: (_warn: any) => void\n onError: (_error: any) => void\n }) {\n const controller = new AbortController()\n fetch('https://api.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 { OpenAICtodService } 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: OpenAICtodService\n private config: Config = {\n model: 'dall-e-2',\n size: '1024x1024'\n }\n\n constructor(openai: OpenAICtodService) {\n this.openai = openai\n }\n\n /**\n * @zh \u6539\u8B8A\u5C0D\u8A71\u7684\u4E00\u4E9B\u8A2D\u5B9A\n * @en Change some settings of the conversation\n */\n\n setConfig(options: Partial<Config>) {\n Object.assign(this.config, options)\n }\n\n /**\n * @zh \u7522\u751F\u5716\u7247\n * @en Generate image\n */\n\n async create(prompt: string) {\n const result = await this.openai._axios.post<ApiResponse>('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 Llama3CppCtodService {\n _axios = axios.create()\n\n static createChatRequestWithJsonSchema(params: {\n config: Partial<Config> | (() => Promise<Partial<Config>>)\n talkOptions?: any\n }) {\n return async(messages: any[], { schema, onCancel }: any) => {\n const ll3cpp = new Llama3CppCtodService()\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 { Llama3CppCtodService } from './index'\nimport { flow, Once } from 'power-helper'\nimport { tify, sify } from 'chinese-conv/dist'\nimport { Template } from '@huggingface/jinja'\n\ntype Message = {\n role: string\n content: string\n}\n\ntype Options = any\n\nexport type Config = {\n baseUrl: string\n headers: Record<string, string>\n autoConvertTraditionalChinese: boolean\n}\n\ntype Stream = {\n onMessage: (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: Record<string, any> | (() => Promise<any>)\n onMessage: (data: any) => void\n onEnd: () => void\n onWarn: (error: any) => void\n onError: (error: any) => void\n }) {\n const { signal, controllerId } = this.createAbortController()\n const end = () => {\n this.removeAbortController(controllerId)\n params.onEnd()\n }\n const reader = async(response: Response) => {\n if (response.body) {\n let reader = response.body.getReader()\n let done = false\n let chunk = ''\n while (!done) {\n const { value, done: readerDone } = await reader.read()\n if (value) {\n chunk += new TextDecoder('utf-8').decode(value)\n const payloads = chunk.split('\\n\\n')\n chunk = payloads.pop() || ''\n payloads.forEach(payload => {\n if (payload.includes('[DONE]')) {\n done = true\n }\n if (payload.startsWith('data:')) {\n try {\n const data = JSON.parse(payload.replace('data: ', ''))\n params.onMessage(data)\n } catch (error) {\n params.onWarn(error)\n }\n }\n })\n }\n if (readerDone) {\n done = true\n }\n }\n end()\n } else {\n params.onError(new Error('Body not found.'))\n }\n }\n fetch(`${this.core.config.baseUrl}/${params.path}`, {\n method: 'POST',\n body: JSON.stringify(typeof params.data === 'function' ? (await params.data()) : params.data),\n signal,\n headers: {\n 'Content-Type': 'application/json',\n ...this.core.config.headers\n }\n })\n .then(reader)\n .catch(error => {\n if (error instanceof Error && error.message.includes('The user aborted a request')) {\n end()\n } else {\n params.onError(error)\n }\n })\n }\n\n async fetch(params: {\n path: string\n data: any\n }) {\n const { signal, controllerId } = this.createAbortController()\n try {\n const result = await this.core.core._axios.post(`${this.core.config.baseUrl}/${params.path}`, params.data, {\n signal,\n headers: {\n 'Content-Type': 'application/json',\n ...this.core.config.headers\n }\n })\n return {\n data: result.data\n }\n } finally {\n this.removeAbortController(controllerId)\n }\n }\n\n cancel() {\n this.streamAbortControllers.forEach(e => e.controller.abort())\n this.streamAbortControllers = []\n }\n\n export() {\n return {\n cancel: this.cancel.bind(this)\n }\n }\n}\n\nexport class Llama3CppCompletion {\n private getProp = new Once({\n handler: async() => {\n const url = `${this.config.baseUrl}/props`\n const { data: props } = await this.core._axios.get<{\n chat_template: string\n bos_token: string\n eos_token: string\n }>(url, {})\n return props\n }\n })\n\n core: Llama3CppCtodService\n config: Config = {\n baseUrl: '',\n headers: {},\n autoConvertTraditionalChinese: true\n }\n\n constructor(core: Llama3CppCtodService) {\n this.core = core\n }\n\n setConfig(config: Partial<Config>) {\n this.config = {\n ...this.config,\n ...config\n }\n }\n\n completion(params: {\n options?: Options\n messages: Message[]\n }) {\n const lastMessage = params.messages.at(-1) || ''\n const requester = new Requester(this)\n return {\n ...requester.export(),\n run: async(): Promise<{\n message: string\n fullMessage: string\n }> => {\n const props = await this.getProp.run()\n const template = new Template(props.chat_template)\n const prompt = template.render({\n bos_token: props.bos_token,\n messages: params.messages\n }).slice(0, props.eos_token.length * -1 - 1)\n const result = await requester.fetch({\n path: 'completion',\n data: {\n ...(params.options || {}),\n prompt: this.config.autoConvertTraditionalChinese ? sify(prompt) : prompt\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 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: async() => {\n const props = await this.getProp.run()\n const template = new Template(props.chat_template)\n const prompt = template.render({\n bos_token: props.bos_token,\n messages: params.messages\n }).slice(0, props.eos_token.length * -1 - 1)\n return {\n ...(params.options || {}),\n prompt: this.config.autoConvertTraditionalChinese ? sify(prompt) : prompt,\n stream: true\n }\n }\n })\n return requester.export()\n }\n\n talk(params: {\n options?: Options\n messages: Message[]\n response_format?: {\n type: 'json_object'\n schema: any\n }\n }) {\n const requester = new Requester(this)\n return {\n ...requester.export(),\n run: async(): Promise<{\n message: string\n }> => {\n const result = await requester.fetch({\n path: 'v1/chat/completions',\n data: {\n ...(params.options || {}),\n response_format: params.response_format,\n messages: params.messages.map(e => {\n return {\n role: e.role,\n content: this.config.autoConvertTraditionalChinese ? 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 { json } from 'power-helper'\nimport { GoogleCtodService } from './index'\nimport { PromiseResponseType } from '../../types'\n\n/**\n * if data:\n * data: base64 string,\n * mimeType: image/jpeg,\n */\n\ntype Part = {\n text: string\n} | {\n inlineData: {\n data: string\n mimeType: string\n }\n}\n\nexport type GoogleMessage = {\n role: 'model' | 'user'\n parts: Part[]\n}\n\nexport type Config = {\n /**\n * @zh \u9078\u64C7\u904B\u884C\u7684\u6A21\u578B\u3002\n * @en What model to use.\n */\n model: string\n}\n\nexport class GoogleChat {\n google: GoogleCtodService\n config: Config = {\n model: 'gemini-1.5-flash'\n }\n\n constructor(google: GoogleCtodService) {\n this.google = google\n }\n\n /**\n * @zh \u6539\u8B8A\u5C0D\u8A71\u7684\u4E00\u4E9B\u8A2D\u5B9A\n * @en Change some settings of the conversation\n */\n\n setConfig(options: Partial<Config>) {\n Object.assign(this.config, options)\n }\n\n /**\n * @zh \u9032\u884C\u5C0D\u8A71\n * @en Talk to the AI\n */\n\n async talk(messages: GoogleMessage[] = []) {\n const newMessages = json.jpjs(messages)\n const model = this.google.generativeAI.getGenerativeModel({\n model: this.config.model\n })\n const result = await model.generateContent({\n contents: newMessages\n })\n const text = result.response.text()\n return {\n text,\n newMessages: [\n ...newMessages,\n {\n role: 'model',\n parts: [\n {\n text\n }\n ]\n }\n ]\n }\n }\n\n /**\n * @zh \u9032\u884C\u5C0D\u8A71\uFF0C\u4E26\u4E14\u4EE5\u4E32\u6D41\u7684\u65B9\u5F0F\u8F38\u51FA\n * @en Talk to the AI and output in a streaming way\n */\n\n talkStream(params: {\n messages: GoogleMessage[]\n onMessage: (_message: string) => void\n onEnd: () => void\n onWarn: (_warn: any) => void\n onError: (_error: any) => void\n }) {\n const model = this.google.generativeAI.getGenerativeModel({\n model: this.config.model\n })\n const context = {\n contents: params.messages\n }\n model\n .generateContentStream(context)\n .then(async({ stream }) => {\n for await (const chunk of stream) {\n const chunkText = chunk.text()\n params.onMessage(chunkText)\n }\n params.onEnd()\n })\n .catch((error) => {\n params.onError(error)\n })\n }\n}\n\nexport type GoogleChatTalkResponse = PromiseResponseType<GoogleChat['talk']>\n", "import { validateToJsonSchema } from '../../utils/validate'\nimport { GoogleMessage, GoogleChat } from './chat'\nimport type { GoogleGenerativeAI } from '@google/generative-ai'\n\ntype GPTContent = {\n type: 'image_url' | 'text'\n text?: string\n image_url?: {\n url: string\n detail?: string\n }\n}\n\ntype GPTMessage = {\n role: 'system' | 'user' | 'assistant'\n content: string | GPTContent[]\n}\n\nexport class GoogleCtodService {\n generativeAI: GoogleGenerativeAI\n\n constructor(generativeAI: GoogleGenerativeAI) {\n this.generativeAI = generativeAI\n }\n\n static chatGPTMessageToGoogleChatMessage(messages: GPTMessage[]): GoogleMessage[] {\n const contentToParts = (content: string | GPTMessage['content']): GoogleMessage['parts'] => {\n if (typeof content === 'string') {\n return [\n {\n text: content\n }\n ]\n } else if (Array.isArray(content)) {\n return content.map(({ type, image_url, text }): GoogleMessage['parts'][number] => {\n if (type === 'image_url') {\n // base64\n const url = image_url?.url || ''\n const mimeType = url.includes('data:image/png') ? 'image/png' : 'image/jpeg'\n return {\n inlineData: {\n data: url.split('base64,')[1] || '',\n mimeType\n }\n }\n } else {\n return {\n text: text || ''\n }\n }\n })\n }\n return []\n }\n return messages.map((message) => {\n if (message.role === 'user' || message.role === 'system') {\n return {\n role: 'user',\n parts: contentToParts(message.content)\n }\n } else {\n return {\n role: 'model',\n parts: contentToParts(message.content)\n }\n }\n })\n }\n\n static createChatRequestWithJsonSchema(params: {\n 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: GoogleCtodService.chatGPTMessageToGoogleChatMessage(messages)\n })\n return result.response.text()\n }\n }\n\n createChat() {\n return new GoogleChat(this)\n }\n}\n", "import { AnthropicCtodService } from './index'\nimport { PromiseResponseType } from '../../types'\n\nexport type Message = {\n role: string\n content: string\n}\n\nexport type Config = {\n /**\n * @zh \u9078\u64C7\u904B\u884C\u7684\u6A21\u578B\u3002\n * @en What model to use.\n */\n model: string\n maxTokens: number\n}\n\nexport class AnthropicChat {\n anthropic: AnthropicCtodService\n config: Config = {\n model: 'claude-3-5-haiku-latest',\n maxTokens: 8192\n }\n\n constructor(anthropic: AnthropicCtodService) {\n this.anthropic = anthropic\n }\n\n /**\n * @zh \u6539\u8B8A\u5C0D\u8A71\u7684\u4E00\u4E9B\u8A2D\u5B9A\n * @en Change some settings of the conversation\n */\n\n setConfig(options: Partial<Config>) {\n Object.assign(this.config, options)\n }\n\n /**\n * \u79FB\u9664 system \u8A0A\u606F\n */\n\n private translateMessages(messages: any[]) {\n return {\n system: messages.find(e => e.role === 'system')?.content[0].text,\n messages: messages.filter(e => e.role !== 'system')\n }\n }\n\n /**\n * @zh \u9032\u884C\u5C0D\u8A71\uFF0C\u4E26\u4E14\u4EE5\u7D50\u69CB\u5316\u7684\u65B9\u5F0F\u8F38\u51FA\n * @en Talk to the AI and output in a structured way\n */\n\n async chatAndStructure(messages: Message[], jsonSchema: any) {\n const anthropic = this.anthropic.anthropicSdk\n const translateMessages = this.translateMessages(messages)\n const msg = await anthropic.messages.create({\n model: this.config.model,\n max_tokens: this.config.maxTokens,\n system: translateMessages.system,\n messages: translateMessages.messages,\n tools: [\n {\n name: 'data',\n description: 'Response Data',\n input_schema: jsonSchema\n }\n ],\n tool_choice: {\n type: 'tool',\n name: 'data'\n }\n })\n let toolUseContent: any = msg.content.find(e => e.type === 'tool_use')\n let response = toolUseContent?.input || null\n if (response == null) {\n return 'null'\n }\n return JSON.stringify(response)\n }\n\n /**\n * @zh \u9032\u884C\u5C0D\u8A71\n * @en Talk to the AI\n */\n\n async talk(messages: Message[] = []) {\n const anthropic = this.anthropic.anthropicSdk\n const newMessages = this.translateMessages(messages)\n const msg = await anthropic.messages.create({\n model: this.config.model,\n max_tokens: this.config.maxTokens,\n system: newMessages.system,\n messages: newMessages.messages\n })\n let output = ''\n let textContent: any = msg.content.find(e => e.type === 'text')\n if (textContent) {\n output = textContent.text\n }\n return output\n }\n\n /**\n * @zh \u9032\u884C\u5C0D\u8A71\uFF0C\u4E26\u4E14\u4EE5\u4E32\u6D41\u7684\u65B9\u5F0F\u8F38\u51FA\n * @en Talk to the AI and output in a streaming way\n */\n\n talkStream(params: {\n messages: Message[]\n onMessage: (_message: string) => void\n onEnd: () => void\n onWarn: (_warn: any) => void\n onError: (_error: any) => void\n }) {\n const anthropic = this.anthropic.anthropicSdk\n const { onMessage, onEnd, onError } = params\n const { messages, system } = this.translateMessages(params.messages)\n const performStreamedChat = async () => {\n try {\n const stream = await anthropic.messages.create({\n model: this.config.model,\n max_tokens: this.config.maxTokens,\n system: system,\n stream: true,\n messages\n })\n for await (const messageStream of stream) {\n if (messageStream.type === 'content_block_delta') {\n const deltaText = 'text' in messageStream.delta ? messageStream.delta.text : ''\n onMessage(deltaText)\n }\n }\n onEnd()\n } catch (error) {\n onError(error)\n }\n }\n performStreamedChat()\n return {\n cancel: () => null\n }\n }\n}\n\nexport type AnthropicChatTalkResponse = PromiseResponseType<AnthropicChat['talk']>\n", "import { validateToJsonSchema } from '../../utils/validate'\nimport { Config, AnthropicChat } from './chat'\nimport type { Anthropic } from '@anthropic-ai/sdk'\n\nexport class AnthropicCtodService {\n anthropicSdk: Anthropic\n\n constructor(anthropicSdk: Anthropic) {\n this.anthropicSdk = anthropicSdk\n }\n\n static createChatRequestWithJsonSchema(params: {\n anthropicSdk: Anthropic\n config?: Partial<Config>\n }) {\n const anthropic = new AnthropicCtodService(params.anthropicSdk)\n const chat = anthropic.createChat()\n chat.setConfig(params.config || {})\n return async (messages: any[], { schema }: any) => {\n const jsonSchema = validateToJsonSchema(schema.output)\n const content = await chat.chatAndStructure(messages, jsonSchema)\n return content\n }\n }\n\n createChat() {\n return new AnthropicChat(this)\n }\n}\n"],
|
|
5
|
-
"mappings": "qOAAA,IAAAA,GAAA,GAAAC,GAAAD,GAAA,mBAAAE,GAAA,2BAAAC,GAAA,mBAAAC,GAAA,gBAAAC,GAAA,eAAAC,KCEA,OAAoB,SAAAC,OAAa,eAwB1B,IAAMC,EAAN,KAGL,CAGE,YAAYC,EAAkC,CAF9CC,EAAA,cAAS,IAAIC,IACbD,EAAA,gBAEI,KAAK,QAAUD,CACnB,CAEA,IAAIA,EAAoC,CACpC,MAAO,CACH,SAAU,KACV,OAAAA,EACA,KAAOG,GAAqC,CAAE,KAAK,OAAO,KAAK,UAAWA,CAAI,CAAE,EAChF,QAAUC,GAAkB,CAAE,KAAK,OAAO,GAAG,UAAWA,CAAQ,CAAE,EAClE,cAAe,IACnB,CACJ,CACJ,EC3CA,IAAOC,GAAQ,IAAIC,EAAiB,CAChC,KAAM,QACN,OAAQC,IACG,CACH,MAAOA,EAAI,OAAO,EAAE,SAAS,EAAE,QAAQ,CAAC,EACxC,UAAWA,EAAI,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAI,CACpD,GAEJ,YAAa,KACF,CAAC,GAEZ,UAAU,CAAE,IAAAC,EAAK,OAAAC,EAAQ,OAAAC,CAAO,EAAG,CAC/BD,EAAO,cAAe,MAAM,CAAE,MAAAE,EAAO,MAAAC,EAAO,SAAAC,EAAU,eAAAC,CAAe,IAAM,CACnEH,GAASD,EAAO,QACZA,EAAO,WACPF,EAAI,MAAM,oBAAoBG,CAAK,SAAS,EAEhDG,EAAeD,CAAQ,EACvBD,EAAM,EAEd,CAAC,CACL,CACJ,CAAC,ECtBD,IAAOG,GAAQ,IAAIC,EAAiB,CAChC,KAAM,YACN,OAAQC,IACG,CACH,OAAQA,EAAI,QAAQ,EAAE,QAAQ,EAAK,CACvC,GAEJ,YAAa,KACF,CAAC,GAEZ,UAAU,CAAE,OAAAC,EAAQ,IAAAC,EAAK,OAAAC,CAAO,EAAG,CAC/BA,EAAO,aAAc,MAAM,CAAE,gBAAAC,EAAiB,SAAAC,CAAS,IAAM,CACzDH,EAAI,MAAM,QAAS,CAAE,MAAO,OAAQ,CAAC,EACjCD,EAAO,OACPC,EAAI,MAAM;AAAA,EAAO,KAAK,UAAUG,EAAU,KAAM,CAAC,CAAC,EAElDH,EAAI,MAAM;AAAA,EAAOE,CAAe,CAExC,CAAC,EACDD,EAAO,YAAa,MAAM,CAAE,UAAAG,CAAU,IAAM,CACxCJ,EAAI,MAAM,WAAY,CAAE,MAAO,MAAO,CAAC,EACvCA,EAAI,MAAM;AAAA,EAAOI,CAAS,CAC9B,CAAC,EACDH,EAAO,YAAa,MAAM,CAAE,OAAAI,CAAO,IAAM,CACrCL,EAAI,MAAM,UAAW,CAAE,MAAO,QAAS,CAAC,EACxC,GAAI,CACAA,EAAI,MAAM;AAAA,EAAO,KAAK,UAAUK,EAAQ,KAAM,CAAC,CAAC,CACpD,MAAgB,CACZL,EAAI,MAAM;AAAA,EAAOK,CAAM,CAC3B,CACJ,CAAC,CACL,CACJ,CAAC,ECjCD,OAAS,SAAAC,GAAO,QAAAC,GAAM,YAAAC,OAAgB,eAWtC,IAAMC,EAAS,CACX,MAAO,EACP,SAAU,GACd,EAEMC,EAAQ,CACV,MAAO,IAAIJ,GACX,SAAU,KACV,UAAW,CAAC,EACZ,UAAW,CAAC,CAChB,EAEOK,EAAQ,CAMX,MAAOD,EAAM,MAOb,OAAAD,EAOA,cAAe,IAAM,CACbC,EAAM,WACNA,EAAM,SAAS,MAAM,EACrBA,EAAM,SAAW,KAEzB,EAOA,OAAQ,IAAIE,EAAiB,CACzB,KAAM,UACN,OAAQ,KACG,CAAC,GAEZ,YAAa,KACF,CAAC,GAEZ,UAAU,CAAE,OAAAC,CAAO,EAAG,CACdH,EAAM,UAAY,OAClBA,EAAM,SAAW,IAAIF,GACrBE,EAAM,SAAS,IAAI,aAAc,IAAM,SAAW,CAC9C,IAAMI,EAAM,KAAK,IAAI,EAIrB,GAHAJ,EAAM,UAAYA,EAAM,UAAU,OAAOK,GAC9BD,EAAMC,EAAON,EAAO,QAC9B,EACGC,EAAM,UAAU,SAAWD,EAAO,MAAO,CACzC,IAAIO,EAASN,EAAM,UAAU,MAAM,EAC/BM,IACAN,EAAM,UAAU,KAAK,KAAK,IAAI,CAAC,EAC/BA,EAAM,MAAM,KAAK,MAAO,CACpB,GAAIM,CACR,CAAC,EAET,MAAWN,EAAM,UAAU,CAAC,GACxBA,EAAM,MAAM,KAAK,iBAAkB,CAC/B,SAAU,KAAK,MAAM,IAAMI,EAAMJ,EAAM,UAAU,CAAC,GAAK,GAAI,CAC/D,CAAC,CAET,CAAC,EACDA,EAAM,SAAS,KAAK,GAExBG,EAAO,aAAc,SAAW,CAC5B,IAAMI,EAAMV,GAAK,WAAW,EAC5B,OAAAG,EAAM,UAAU,KAAKO,CAAG,EACjB,IAAI,QAAQC,GAAW,CAC1BR,EAAM,MAAM,GAAG,MAAO,CAAC,CAAE,GAAAS,CAAG,EAAG,CAAE,IAAAC,CAAI,IAAM,CACnCD,IAAOF,IACPG,EAAI,EACJF,EAAQ,EAEhB,CAAC,CACL,CAAC,CACL,CAAC,CACL,CACJ,CAAC,CACL,ECpGA,IAAOG,GAAQ,IAAIC,EAAiB,CAChC,KAAM,OACN,OAAQC,IACG,CACH,KAAMA,EAAI,OAAO,EAAE,SAAS,CAChC,GAEJ,YAAa,KACF,CAAC,GAEZ,UAAU,CAAE,OAAAC,EAAQ,OAAAC,CAAO,EAAG,CAC1BD,EAAO,QAAS,MAAM,CAAE,SAAAE,EAAU,eAAAC,CAAe,IAAM,CACnDA,EAAe,CACX,CACI,KAAM,OACN,QAAS,2BAAOF,EAAO,IAAI,QAC/B,EACA,CACI,KAAM,YACN,QAAS,mDAAWA,EAAO,IAAI,oEACnC,EACA,GAAGC,CACP,CAAC,CACL,CAAC,CACL,CACJ,CAAC,ELjBM,IAAME,GAAiBC,GAOjBC,GAAcC,GAOdC,GAAgBC,EAAQ,OAMxBC,GAAyBD,EAOzBE,GAAaC,GMrC1B,IAAAC,GAAA,GAAAC,GAAAD,GAAA,yBAAAE,GAAA,sCAAAC,GAAA,sCAAAC,KAAA,OAAOC,OAAgB,aACvB,OAAS,UAAAC,OAAc,eAYhB,IAAMJ,GAAsB,CAACK,EAA6BC,IACtD,CACH,GAAI,MAAM,QAAQD,CAAQ,EAAIA,EAAW,CAACA,CAAQ,EAClD,yGACA,IACA,OAAO,QAAQC,CAAM,EAAE,IAAI,CAAC,CAACC,EAAKC,CAAK,IAC5B,CACH,MAAMA,EAAM,IAAI,MAChB,IAAID,CAAG,MAAM,KAAK,UAAUC,EAAM,OAAO,CAAC,EAC9C,EAAE,KAAK;AAAA,CAAI,CACd,EAAE,KAAK;AAAA,CAAK,EACb,GACJ,EAAE,KAAK;AAAA,CAAI,EAQFP,GAAoC,CAC7CO,EACAH,EACAC,IACC,CACD,IAAMG,EAAaN,GAAW,OAAO,EAErC,OAAAM,EAAW,eAAe,OAAQ,SAAoBD,EAAO,CACzD,OAAO,KAAK,UAAUA,CAAK,CAC/B,CAAC,EAEDC,EAAW,eAAe,MAAO,SAAoBD,EAAO,CACxD,OAAO,KAAK,QAAUA,EAAQ,KAAK,OAAOA,CAAK,EAAI,EACvD,CAAC,EAEDC,EAAW,eAAe,QAAS,UAAoB,CACnD,OAAO,KAAK,UAAUL,GAAO,KAAK,KAAM,CAAC,QAAQ,CAAC,CAAC,CACvD,CAAC,EAEDK,EAAW,eAAe,OAAQ,SAAoBD,EAAO,CACzD,OAAO,MAAM,QAAQA,CAAK,EAAIA,EAAM,KAAK,EAAI,KAAK,UAAUA,CAAK,CACrE,CAAC,EAEMC,EAAW,QAAQT,GAAoBK,EAAUC,CAAM,CAAC,EAAEE,CAAK,CAC1E,EAOaN,GAAoC,CAACG,EAA6BC,IACpE,CACH,GAAI,MAAM,QAAQD,CAAQ,EAAIA,EAAW,CAACA,CAAQ,EAClD,0EACA,KAAK,UAAUC,CAAM,CACzB,EAAE,KAAK;AAAA,CAAI,ECrEf,OAAOI,OAAW,QAeX,IAAMC,EAAN,MAAMC,CAAW,CAwBpB,YAAYC,EAA0B,CAvBtCC,EAAA,KAAQ,UAwBJ,KAAK,OAASD,CAClB,CAlBA,OAAO,aAAc,CACjB,OAAO,IAAID,EAAW,CAClB,KAAM,cACN,QAAS,MAAOG,GAAS,CACrB,GAAI,CAEA,OADe,KAAK,MAAMA,CAAI,CAElC,MAAgB,CACZ,IAAMC,EAAY,4BACZC,EAAcF,EAAK,MAAMC,CAAS,IAAI,CAAC,GAAK,GAClD,OAAOE,GAAM,MAAMD,CAAW,CAClC,CACJ,CACJ,CAAC,CACL,CAWA,IAAI,MAAO,CACP,OAAO,KAAK,OAAO,IACvB,CAOA,MAAM,KAAKF,EAAc,CAErB,OADe,MAAM,KAAK,OAAO,QAAQA,CAAI,CAEjD,CACJ,EC3DA,OAAS,SAAAI,GAAO,QAAAC,GAAM,QAAAC,GAAM,OAAAC,OAAW,eCFvC,UAAYC,MAAS,MACrB,OAAS,iBAAAC,OAAqB,6BAkBvB,SAASC,EAGdC,EAAaC,EAAmB,CAC9B,OAAW,SAAOA,EAAeC,CAAG,CAAC,EAAE,SAAS,EAAE,aAAaF,GAAU,CAAC,CAAC,CAG/E,CAEO,IAAMG,GAAqDC,GACvDA,EAAGF,CAAG,EAGJG,EAAyDD,GAAU,CAC5E,IAAME,EAAoBC,GAAgB,CAItC,GAHIA,EAAO,SACP,OAAOA,EAAO,QAEdA,EAAO,WACP,QAASC,KAAOD,EAAO,WACfA,EAAO,WAAWC,CAAG,EAAE,SACvB,OAAOD,EAAO,WAAWC,CAAG,EAAE,QAElCF,EAAiBC,EAAO,WAAWC,CAAG,CAAC,EAG3CD,EAAO,OACPD,EAAiBC,EAAO,KAAK,CAErC,EACME,EAA8BC,GAAoB,CACpD,GAAIA,EAAW,OAAS,SAAU,CAC9BA,EAAW,qBAAuB,GAClC,QAAWF,KAAOE,EAAW,WACzBD,EAA2BC,EAAW,WAAWF,CAAG,CAAC,CAE7D,MAAWE,EAAW,OAAS,SAC3BD,EAA2BC,EAAW,KAAK,CAEnD,EACMA,EAAaC,GAAkB,SAAOP,EAAGF,CAAG,CAAC,CAAC,EACpD,OAAAI,EAAiBI,CAAU,EAC3BD,EAA2BC,CAAU,EAC9BA,CACX,EC1DO,IAAME,EAAN,KAAkB,CAIrB,YAAYC,EAAYC,EAA2B,CAHnDC,EAAA,qBAAgB,IAChBA,EAAA,mBAA4B,CAAC,GAC7BA,EAAA,cAEI,KAAK,MAAQF,EACb,KAAK,YAAcC,CACvB,CACJ,ECsBO,IAAME,EAAN,KAGL,CAGE,YAAYC,EAAgC,CAF5CC,EAAA,KAAQ,UAGJ,KAAK,OAASD,CAClB,CAEA,IAAI,cAA2C,CAC3C,OAAO,IACX,CAEA,IAAI,cAA2C,CAC3C,OAAO,IACX,CAOA,MAAM,QAAQE,EAAkCC,EAK7C,CACC,IAAMC,EAAS,KAAK,OAAO,MAAQC,EAASH,EAAM,KAAK,OAAO,KAAK,EAAIA,EACjEI,EAAS,KAAK,OAAO,SAAW,MAAM,KAAK,OAAO,SAASF,EAAQD,CAAO,EAAI,GACpF,MAAO,CACH,OAAAC,EACA,OAAQ,MAAM,QAAQE,CAAM,EAAIA,EAAO,KAAK;AAAA,CAAI,EAAIA,CACxD,CACJ,CAEA,aAAc,CACV,MAAO,CACH,MAAO,KAAK,OAAO,MACnB,OAAQ,KAAK,OAAO,MACxB,CACJ,CAEA,mBAAmBC,EAAW,CAC1B,KAAK,OAAO,OAASA,CACzB,CAOA,MAAM,MAAMC,EAAc,CACtB,IAAIC,EACAC,EAAa,GACbC,EAA8C,CAAC,EACnD,QAASC,KAAS,KAAK,OAAO,QAC1B,GAAI,CACAH,EAAS,MAAMG,EAAM,KAAKJ,CAAI,EAC9BE,EAAaE,EAAM,IACvB,OAASC,EAAO,CACZJ,EAAS,OACTE,EAAY,KAAK,CACb,KAAMC,EAAM,KACZ,MAAAC,CACJ,CAAC,CACL,CAEJ,GAAI,CAEA,MAAO,CACH,OAFSR,EAASI,EAAQ,KAAK,OAAO,MAAM,EAG5C,WAAAC,EACA,YAAAC,CACJ,CACJ,OAASE,EAAO,CACZ,MAAM,IAAIC,EAAYD,EAAOF,CAAW,CAC5C,CACJ,CACJ,EHiCO,IAAMI,EAAN,KAML,CAeE,YAAYC,EAAgC,CAd5CC,EAAA,KAAU,cACVA,EAAA,KAAU,OACVA,EAAA,KAAU,OAAO,IAAIC,IACrBD,EAAA,KAAU,UACVA,EAAA,KAAU,UAAU,CAAC,GACrBA,EAAA,KAAU,YAAY,IACtBA,EAAA,KAAU,cACVA,EAAA,KAAU,QAAQ,IAAIE,IAQlB,KAAK,IAAM,IAAIC,GAAIJ,EAAO,MAAQ,SAAS,EAC3C,KAAK,OAASA,EACd,KAAK,WAAa,IAAIK,EAAW,CAC7B,GAAGL,EACH,QAAS,CACLM,EAAW,YAAY,CAC3B,CACJ,CAAC,CACL,CAEU,UAAgB,CACtB,GAAI,KAAK,YAAc,GAAO,CAC1B,KAAK,UAAY,GACjB,IAAMC,EAAU,CACZ,IAAK,KAAK,IACV,OAAQ,KAAK,KAAK,OAAO,KAAK,KAAK,IAAI,EACvC,YAAa,KAAK,KAAK,YAAY,KAAK,KAAK,IAAI,EACjD,WAAY,KAAK,UACrB,EACA,GAAI,KAAK,OAAO,QAAS,CACrB,KAAK,QAAU,OAAO,KAAK,OAAO,SAAY,WAAa,KAAK,OAAO,QAAQ,EAAI,KAAK,OAAO,QAC/F,QAASC,KAAO,KAAK,QACjB,KAAK,QAAQA,CAAG,EAAE,SAAS,QAAQ,UAAU,CACzC,GAAGD,EACH,OAAQ,KAAK,QAAQC,CAAG,EAAE,OAC1B,QAAS,KAAK,QAAQA,CAAG,EAAE,OAC/B,CAAC,CAET,CACA,KAAK,OAAO,UAAUD,CAAO,CACjC,CACJ,CAEA,MAAM,OAAOE,EAAoB,CACzBA,EACA,KAAK,MAAM,KAAK,SAAU,CACtB,UAAAA,CACJ,CAAC,EAED,KAAK,MAAM,KAAK,YAAa,CAAC,CAAC,CAEvC,CAEA,cAA0CC,EAGxC,CACE,KAAK,SAAS,EACd,IAAIC,EAAKC,GAAK,WAAW,EACrBC,EAAa,KACbC,EAAW,GACXC,EAAY,GAOZC,EAAY,CACZ,KAAK,MAAM,GAAG,SAAU,CAAC,CAAE,UAAAP,CAAU,IAAM,CACnCA,IAAcE,GACdM,EAAc,CAEtB,CAAC,EACD,KAAK,MAAM,GAAG,YAAa,IAAM,CAC7BA,EAAc,CAClB,CAAC,CACL,EACIC,EAAW,IAAMF,EAAU,QAAQG,GAAKA,EAAE,IAAI,CAAC,EAC/CF,EAAgB,IAAM,CAClBH,IAAa,KACTC,GAAaF,GACbA,EAAW,EAEfC,EAAW,GACXI,EAAS,EAEjB,EACIE,EAAYC,GAAmB,CAC/BR,EAAaQ,CACjB,EAOIC,EAAU,SAAW,CACrB,IAAIC,EAAS,KAAK,WAAW,YAAY,EACrCC,EAAc,KACdC,EAAU,CAAC,EACXC,EAAW,IAAI,IACfC,EAAW,MAAM,KAAK,WAAW,QAAQjB,EAAM,CAC/C,OAAAa,CACJ,CAAC,EACGK,EAAyB,CAAC,EAC1BC,EAAsB,CAAC,EACvBF,EAAS,QACTE,EAAS,KAAK,CACV,KAAM,OACN,QAASF,EAAS,MACtB,CAAC,EAEL,QAASnB,KAAO,KAAK,QACjBiB,EAAQjB,CAAG,EAAI,CACX,KAAOE,GAAc,KAAK,QAAQF,CAAG,EAAE,KAAK,CACxC,GAAAG,EACA,KAAAD,CACJ,CAAC,CACL,EAEJ,aAAM,KAAK,KAAK,OAAO,QAAS,CAC5B,GAAAC,EACA,KAAAD,EACA,OAAAa,EACA,QAAAE,EACA,SAAAI,EACA,SAAAH,EACA,eAAgBI,GAAM,CAClBF,EAAcE,EAAG,IAAIX,IACV,CACH,GAAGA,EACH,QAAS,MAAM,QAAQA,EAAE,OAAO,EAAIA,EAAE,QAAQ,KAAK;AAAA,CAAI,EAAIA,EAAE,OACjE,EACH,CACL,EACA,eAAgBW,GAAM,CAClBD,EAAWC,CACf,EACA,mBAAoBN,GAAU,CAC1B,KAAK,WAAW,mBAAmBA,CAAM,EACzCD,EAAS,KAAK,WAAW,YAAY,CACzC,CACJ,CAAC,EACDM,EAAW,CACP,GAAGD,EACH,GAAGC,CACP,EACA,MAAMjB,GAAK,WAAW,MAAO,CAAE,MAAAmB,EAAO,QAAAC,CAAQ,IAAM,CAChD,GAAID,GAAS,GACT,OAAOC,EAAQ,EAEnB,IAAIC,EAAW,GACXC,EAAY,GACZC,EAAY,GACZC,EAAkBP,EAAS,OAAOV,GAAKA,EAAE,OAAS,MAAM,EAAE,MAAM,EAAE,EAAE,CAAC,GAAG,SAAW,GACvF,GAAI,CACA,MAAM,KAAK,KAAK,OAAO,aAAc,CACjC,GAAAR,EACA,KAAAD,EACA,SAAAmB,EACA,SAAAH,EACA,gBAAAU,CACJ,CAAC,EACD,IAAMC,EAAS,KAAK,OAAO,QAAQR,EAAU,CACzC,GAAAlB,EACA,MAAAoB,EACA,OAAAR,EACA,SAAAH,EACA,SAAAM,EACA,QAASS,CACb,CAAC,EACD,GAAIrB,EACID,GACAA,EAAW,MAGf,IAAI,CACAE,EAAY,GACZkB,EAAW,MAAMI,EACjBH,EAAYD,CAChB,QAAE,CACElB,EAAY,EAChB,CAEAD,IAAa,KACb,MAAM,KAAK,KAAK,OAAO,YAAa,CAChC,GAAAH,EACA,KAAAD,EACA,SAAAuB,EACA,SAAAJ,EACA,UAAAK,EACA,SAAAR,EACA,gBAAAU,EACA,UAAYE,GAAU,CAClB,MAAM,IAAIC,EAAYD,EAAO,CAAC,CAAC,CACnC,EACA,gBAAiBE,GAAQ,CACrBN,EAAYM,CAChB,CACJ,CAAC,EACDhB,GAAU,MAAM,KAAK,WAAW,MAAMU,CAAS,GAAG,OAClD,MAAM,KAAK,KAAK,OAAO,YAAa,CAChC,GAAAvB,EACA,OAAAa,EACA,SAAAE,CACJ,CAAC,GAEL,MAAM,KAAK,KAAK,OAAO,OAAQ,CAC3B,GAAAf,EACA,SAAAe,CACJ,CAAC,EACDM,EAAQ,CACZ,OAASM,EAAY,CAEjB,GAAIA,aAAiBC,GAiBjB,GAhBA,MAAM,KAAK,KAAK,OAAO,cAAe,CAClC,GAAA5B,EACA,MAAO2B,EAAM,MACb,MAAAP,EACA,SAAAE,EACA,SAAAJ,EACA,SAAAH,EACA,gBAAAU,EACA,YAAaE,EAAM,YACnB,MAAO,IAAM,CACTH,EAAY,EAChB,EACA,eAAgBL,GAAM,CAClBD,EAAWC,CACf,CACJ,CAAC,EACGK,IAAc,GACd,YAAM,KAAK,KAAK,OAAO,OAAQ,CAC3B,GAAAxB,EACA,SAAAe,CACJ,CAAC,EACKY,MAGV,aAAM,KAAK,KAAK,OAAO,OAAQ,CAC3B,GAAA3B,EACA,SAAAe,CACJ,CAAC,EACKY,CAEd,CACJ,CAAC,EACMd,CACX,EASA,MAAO,CACH,GAAAb,EACA,SAVS,SAAW,CACpB,GAAI,CAEA,OADe,MAAMW,EAAQ,CAEjC,QAAE,CACEJ,EAAS,CACb,CACJ,GAGkB,CAClB,CACJ,CAOA,MAAM,QAAoCR,EAAqD,CAC3F,GAAM,CAAE,QAAAY,CAAQ,EAAI,KAAK,cAAcZ,CAAI,EAE3C,OADe,MAAMY,CAEzB,CACJ,EI/aA,UAAYmB,OAAS,MAId,IAAMC,EAAN,KAGL,CAEE,YAAYC,EAGT,CAJHC,EAAA,eAKI,KAAK,OAASD,CAClB,CAEA,oBAAmDA,EAEhD,CACC,MAAO,CACH,OAA2CE,GAYhC,IAAIC,EAMT,CACU,OAAQ,KAAO,CAAC,GAChB,QAAUC,GAAY,CAClBJ,GAAQ,UAAUI,CAAO,EACzBA,EAAQ,OAAO,QAAS,MAAM,CAAE,GAAAC,EAAI,QAAAC,EAAS,KAAAC,EAAM,SAAAC,EAAU,eAAAC,EAAgB,mBAAAC,CAAmB,IAAM,CAClG,IAAMC,EAAS,MAAMT,EAAQ,CACzB,GAAAG,EACA,KAAME,EACN,QAAAD,EACA,IAAKM,GACL,YAAcC,GAAa,CACvBJ,EAAeI,EAAS,IAAIC,IACjB,CACH,KAAMA,EAAE,KACR,QAAS,MAAM,QAAQA,EAAE,OAAO,EAAIA,EAAE,QAAQ,KAAK;AAAA,CAAI,EAAIA,EAAE,OACjE,EACH,CAAC,CACN,EACA,SAAAN,CACJ,CAAC,EACDE,EAAmB,IAAMC,CAAM,CACnC,CAAC,CACL,EACA,QAAS,KAAK,OAAO,QAAU,IAAM,KAAK,OAAO,QAAS,EAAI,OAC9D,QAAS,KAAK,OAAO,OACzB,CAAC,CAEjB,CACJ,CACJ,ECtEA,OAAOI,OAAW,QC0DX,IAAMC,EAAN,KAAmB,CAQtB,YAAYC,EAA2B,CAPvCC,EAAA,eACAA,EAAA,cAAiB,CACb,MAAO,uBACP,UAAW,OACX,YAAa,CACjB,GAGI,KAAK,OAASD,CAClB,CAOA,UAAUE,EAA0B,CAChC,OAAO,OAAO,KAAK,OAAQA,CAAO,CACtC,CAOA,MAAM,KAAKC,EAA2B,CAClC,IAAMC,EAAS,MAAM,KAAK,OAAO,OAAO,KAAkB,6CAA8C,CACpG,MAAO,KAAK,OAAO,MACnB,EAAG,EACH,SAAAD,EACA,WAAY,KAAK,OAAO,UACxB,YAAa,KAAK,OAAO,WAC7B,EAAG,CACC,QAAS,CACL,eAAgB,mBAChB,cAAiB,UAAU,KAAK,OAAO,OAAO,EAClD,CACJ,CAAC,EAEKE,GADUD,EAAO,KAAK,SAAW,CAAC,GAChB,CAAC,GAAG,SAAW,CACnC,KAAM,YACN,QAAS,EACb,EACA,MAAO,CACH,GAAIA,GAAQ,KAAK,GACjB,KAAMC,EAAQ,QACd,YAAaD,EAAO,IACxB,CACJ,CACJ,EC5GA,OAAS,QAAAE,OAAY,eA0Dd,IAAMC,EAAN,KAAiB,CAUpB,YAAYC,EAA2B,CATvCC,EAAA,eACAA,EAAA,cAAiB,CACb,EAAG,EACH,MAAO,SACP,YAAa,EACb,UAAW,OACX,gBAAiB,EACrB,GAGI,KAAK,OAASD,CAClB,CAOA,UAAUE,EAA0B,CAChC,OAAO,OAAO,KAAK,OAAQA,CAAO,CACtC,CAOA,MAAM,YAAYC,EAAe,CAC7B,IAAMC,EAAS,MAAM,KAAK,OAAO,OAAO,KAAU,wCAAyC,CACvF,MAAOD,CACX,EAAG,CACC,QAAS,CACL,eAAgB,mBAChB,cAAiB,UAAU,KAAK,OAAO,OAAO,EAClD,CACJ,CAAC,EACD,MAAO,CACH,OAAQC,EAAO,KAAK,UAAU,CAAC,GAAG,UAAY,GAC9C,OAAQA,EAAO,IACnB,CACJ,CAOA,MAAM,KAAKC,EAA6B,CAAC,EAAGH,EAIzC,CACC,IAAMI,EAAcC,GAAK,KAAKF,CAAQ,EAChCG,EAAgB,CAClB,sBACA,cACA,SACA,cACA,oBACJ,EAAE,SAAS,KAAK,OAAO,KAAK,EACxBC,EACAD,GAAiB,KAAK,OAAO,kBAC7BC,EAAkB,CACd,KAAM,aACV,GAEAD,GAAiB,KAAK,OAAO,iBAAmBN,GAAS,aACzDO,EAAkB,CACd,KAAM,cACN,YAAaP,EAAQ,UACzB,GAEJ,IAAME,EAAS,MAAM,KAAK,OAAO,OAAO,KAAkB,6CAA8C,CACpG,MAAO,KAAK,OAAO,MACnB,EAAG,KAAK,OAAO,EACf,SAAUE,EACV,gBAAAG,EACA,YAAa,KAAK,OAAO,WAC7B,EAAG,CACC,OAAQP,GAAS,iBAAiB,OAClC,QAAS,CACL,eAAgB,mBAChB,cAAiB,UAAU,KAAK,OAAO,OAAO,EAClD,CACJ,CAAC,EACKQ,EAAUN,EAAO,KAAK,SAAW,CAAC,EAClCO,EAAUD,EAAQ,CAAC,GAAG,SAAW,CACnC,KAAM,YACN,QAAS,EACb,EACA,OAAAJ,EAAY,KAAKK,CAAO,EACjB,CACH,GAAIP,GAAQ,KAAK,GACjB,KAAMO,EAAQ,QACd,YAAAL,EACA,OAAQI,EAAQ,CAAC,GAAG,gBAAkB,OACtC,YAAaN,EAAO,IACxB,CACJ,CAEA,WAAWQ,EAMR,CACC,IAAMC,EAAa,IAAI,gBACvB,aAAM,6CAA8C,CAChD,OAAQ,OACR,QAAS,CACL,eAAgB,mBAChB,cAAiB,UAAU,KAAK,OAAO,OAAO,EAClD,EACA,KAAM,KAAK,UAAU,CACjB,MAAO,KAAK,OAAO,MACnB,OAAQ,GACR,SAAUD,EAAO,QACrB,CAAC,EACD,OAAQC,EAAW,MACvB,CAAC,EAAE,KAAK,MAAMC,GAAY,CACtB,IAAMC,EAASD,EAAS,MAAM,YAAY,IAAI,iBAAmB,EAAE,UAAU,EAC7E,GAAI,CAACC,EACD,MAAM,IAAI,MAAM,oBAAoB,EAGxC,OAAa,CACT,GAAM,CAAE,MAAAC,EAAO,KAAAC,CAAK,EAAI,MAAMF,EAAO,KAAK,EAC1C,GAAIE,EACA,MAEJ,IAAMC,EAAQF,EAAM,MAAM;AAAA,CAAI,EAC9B,QAASG,KAAQD,EACb,GAAIC,EAAK,SAAW,GAGhB,CAAAA,EAAK,WAAW,GAAG,EAGvB,IAAIA,IAAS,eAAgB,CACzBP,EAAO,MAAM,EACb,KACJ,CACA,GAAI,CAEA,IAAMQ,EADS,KAAK,MAAMD,EAAK,UAAU,CAAC,CAAC,EACpB,QAAQ,CAAC,EAAE,MAAM,QACxCP,EAAO,UAAUQ,CAAO,CAC5B,OAASC,EAAO,CACZT,EAAO,OAAOS,CAAK,CACvB,EAER,CACJ,CAAC,EAAE,MAAMA,GAAS,CACVA,EAAM,OAAS,aACfT,EAAO,MAAM,EAEbA,EAAO,QAAQS,CAAK,CAE5B,CAAC,EACM,CACH,OAAQ,IAAMR,EAAW,MAAM,CACnC,CACJ,CAMA,MAAM,SAASS,EAA2BC,EAAgC,CAAC,EAAG,CAC1E,IAAMnB,EAAS,MAAM,KAAK,KAAK,CAC3B,GAAGmB,EACH,CACI,KAAM,OACN,QAAS,MAAM,QAAQD,CAAM,EAAIA,EAAO,KAAK;AAAA,CAAI,EAAIA,CACzD,CACJ,CAAC,EACD,MAAO,CACH,OAAAlB,EACA,SAAWkB,GAA8B,KAAK,SAASA,EAAQlB,EAAO,WAAW,CACrF,CACJ,CACJ,EC1NO,IAAMoB,EAAN,KAA6B,CAOhC,YAAYC,EAA2B,CANvCC,EAAA,KAAQ,UACRA,EAAA,KAAQ,SAAiB,CACrB,MAAO,WACP,KAAM,WACV,GAGI,KAAK,OAASD,CAClB,CAOA,UAAUE,EAA0B,CAChC,OAAO,OAAO,KAAK,OAAQA,CAAO,CACtC,CAOA,MAAM,OAAOC,EAAgB,CAczB,OAbe,MAAM,KAAK,OAAO,OAAO,KAAkB,+CAAgD,CACtG,OAAAA,EACA,EAAG,EACH,KAAM,KAAK,OAAO,KAClB,MAAO,KAAK,OAAO,MACnB,gBAAiB,UACrB,EAAG,CACC,QAAS,IACT,QAAS,CACL,eAAgB,mBAChB,cAAiB,UAAU,KAAK,OAAO,OAAO,EAClD,CACJ,CAAC,GACa,IAClB,CACJ,EHzDO,IAAMC,EAAN,MAAMC,CAAkB,CAwD3B,YAAYC,EAAS,GAAI,CAvDzBC,EAAA,cAASC,GAAM,OAAO,GACtBD,EAAA,eAAU,IAuDN,KAAK,QAAUD,CACnB,CAtDA,OAAO,kBACHA,EACAG,EAA6D,CAAC,EAC9DC,EAGF,CACE,MAAO,OAAMC,EAAiB,CAAE,SAAAC,CAAS,IAAW,CAChD,IAAMC,EAAS,IAAIR,EAAkB,OAAOC,GAAW,SAAWA,EAAS,MAAMA,EAAO,CAAC,EACnFQ,EAAOD,EAAO,WAAW,EACzBE,EAAkB,IAAI,gBACxBL,GAAWA,EAAQ,OACnBG,EAAO,SAASH,EAAQ,KAAK,EAEjCI,EAAK,UAAU,OAAOL,GAAW,WAAa,MAAMA,EAAO,EAAIA,CAAM,EACrEG,EAAS,IAAMG,EAAgB,MAAM,CAAC,EACtC,GAAM,CAAE,KAAAC,CAAK,EAAI,MAAMF,EAAK,KAAKH,EAAU,CACvC,gBAAAI,CACJ,CAAC,EACD,OAAOC,CACX,CACJ,CAEA,OAAO,gCAAgCC,EAIpC,CACC,MAAO,OAAMN,EAAiB,CAAE,OAAAO,EAAQ,SAAAN,CAAS,IAAW,CACxD,IAAMC,EAAS,IAAIR,EAAkB,OAAOY,EAAO,QAAW,SAAWA,EAAO,OAAS,MAAMA,EAAO,OAAO,CAAC,EACxGH,EAAOD,EAAO,WAAW,EACzBE,EAAkB,IAAI,gBACxBE,EAAO,QACPH,EAAK,UAAU,OAAOG,EAAO,QAAW,WAAa,MAAMA,EAAO,OAAO,EAAIA,EAAO,MAAM,EAE1FA,EAAO,OACPJ,EAAO,SAASI,EAAO,KAAK,EAEhCL,EAAS,IAAMG,EAAgB,MAAM,CAAC,EACtC,IAAMI,EAAaC,EAAqBF,EAAO,MAAM,EAC/C,CAAE,KAAAF,CAAK,EAAI,MAAMF,EAAK,KAAKH,EAAU,CACvC,gBAAAI,EACA,WAAY,CACR,KAAM,OACN,OAAQ,GACR,OAAQI,CACZ,CACJ,CAAC,EACD,OAAOH,CACX,CACJ,CAWA,SAASR,EAAY,CACjB,KAAK,OAASA,CAClB,CAOA,iBAAiBF,EAAgB,CAC7B,KAAK,QAAUA,CACnB,CAEA,YAAa,CACT,OAAO,IAAIe,EAAW,IAAI,CAC9B,CAEA,cAAe,CACX,OAAO,IAAIC,EAAa,IAAI,CAChC,CAEA,wBAAyB,CACrB,OAAO,IAAIC,EAAuB,IAAI,CAC1C,CACJ,EI/FA,OAAOC,OAA8B,QACrC,OAAS,QAAAC,OAAY,oBCArB,OAAS,QAAAC,GAAM,QAAAC,OAAY,eAC3B,OAAS,QAAAC,EAAM,QAAAC,MAAY,oBAC3B,OAAS,YAAAC,OAAgB,qBAsBzB,IAAMC,EAAN,KAAgB,CAOZ,YAAYC,EAA2B,CANvCC,EAAA,KAAQ,QACRA,EAAA,KAAQ,yBAGF,CAAC,GAGH,KAAK,KAAOD,CAChB,CAEQ,uBAAwB,CAC5B,IAAME,EAAwB,IAAI,gBAC5BC,EAA0BC,GAAK,WAAW,EAChD,YAAK,uBAAuB,KAAK,CAC7B,GAAID,EACJ,WAAYD,CAChB,CAAC,EACM,CACH,OAAQA,EAAsB,OAC9B,aAAcC,CAClB,CACJ,CAEQ,sBAAsBA,EAAiC,CAC3D,KAAK,uBAAyB,KAAK,uBAAuB,OAAOE,GAAKA,EAAE,KAAOF,CAAuB,CAC1G,CAEA,MAAM,OAAOG,EAOV,CACC,GAAM,CAAE,OAAAC,EAAQ,aAAAC,CAAa,EAAI,KAAK,sBAAsB,EACtDC,EAAM,IAAM,CACd,KAAK,sBAAsBD,CAAY,EACvCF,EAAO,MAAM,CACjB,EACMI,EAAS,MAAMC,GAAuB,CACxC,GAAIA,EAAS,KAAM,CACf,IAAID,EAASC,EAAS,KAAK,UAAU,EACjCC,EAAO,GACPC,EAAQ,GACZ,KAAO,CAACD,GAAM,CACV,GAAM,CAAE,MAAAE,EAAO,KAAMC,CAAW,EAAI,MAAML,EAAO,KAAK,EACtD,GAAII,EAAO,CACPD,GAAS,IAAI,YAAY,OAAO,EAAE,OAAOC,CAAK,EAC9C,IAAME,EAAWH,EAAM,MAAM;AAAA;AAAA,CAAM,EACnCA,EAAQG,EAAS,IAAI,GAAK,GAC1BA,EAAS,QAAQC,GAAW,CAIxB,GAHIA,EAAQ,SAAS,QAAQ,IACzBL,EAAO,IAEPK,EAAQ,WAAW,OAAO,EAC1B,GAAI,CACA,IAAMC,EAAO,KAAK,MAAMD,EAAQ,QAAQ,SAAU,EAAE,CAAC,EACrDX,EAAO,UAAUY,CAAI,CACzB,OAASC,EAAO,CACZb,EAAO,OAAOa,CAAK,CACvB,CAER,CAAC,CACL,CACIJ,IACAH,EAAO,GAEf,CACAH,EAAI,CACR,MACIH,EAAO,QAAQ,IAAI,MAAM,iBAAiB,CAAC,CAEnD,EACA,MAAM,GAAG,KAAK,KAAK,OAAO,OAAO,IAAIA,EAAO,IAAI,GAAI,CAChD,OAAQ,OACR,KAAM,KAAK,UAAU,OAAOA,EAAO,MAAS,WAAc,MAAMA,EAAO,KAAK,EAAKA,EAAO,IAAI,EAC5F,OAAAC,EACA,QAAS,CACL,eAAgB,mBAChB,GAAG,KAAK,KAAK,OAAO,OACxB,CACJ,CAAC,EACI,KAAKG,CAAM,EACX,MAAMS,GAAS,CACRA,aAAiB,OAASA,EAAM,QAAQ,SAAS,4BAA4B,EAC7EV,EAAI,EAEJH,EAAO,QAAQa,CAAK,CAE5B,CAAC,CACT,CAEA,MAAM,MAAMb,EAGT,CACC,GAAM,CAAE,OAAAC,EAAQ,aAAAC,CAAa,EAAI,KAAK,sBAAsB,EAC5D,GAAI,CAQA,MAAO,CACH,MARW,MAAM,KAAK,KAAK,KAAK,OAAO,KAAK,GAAG,KAAK,KAAK,OAAO,OAAO,IAAIF,EAAO,IAAI,GAAIA,EAAO,KAAM,CACvG,OAAAC,EACA,QAAS,CACL,eAAgB,mBAChB,GAAG,KAAK,KAAK,OAAO,OACxB,CACJ,CAAC,GAEgB,IACjB,CACJ,QAAE,CACE,KAAK,sBAAsBC,CAAY,CAC3C,CACJ,CAEA,QAAS,CACL,KAAK,uBAAuB,QAAQ,GAAK,EAAE,WAAW,MAAM,CAAC,EAC7D,KAAK,uBAAyB,CAAC,CACnC,CAEA,QAAS,CACL,MAAO,CACH,OAAQ,KAAK,OAAO,KAAK,IAAI,CACjC,CACJ,CACJ,EAEaY,EAAN,KAA0B,CAoB7B,YAAYpB,EAA4B,CAnBxCC,EAAA,KAAQ,UAAU,IAAIoB,GAAK,CACvB,QAAS,SAAW,CAChB,IAAMC,EAAM,GAAG,KAAK,OAAO,OAAO,SAC5B,CAAE,KAAMC,CAAM,EAAI,MAAM,KAAK,KAAK,OAAO,IAI5CD,EAAK,CAAC,CAAC,EACV,OAAOC,CACX,CACJ,CAAC,GAEDtB,EAAA,aACAA,EAAA,cAAiB,CACb,QAAS,GACT,QAAS,CAAC,EACV,8BAA+B,EACnC,GAGI,KAAK,KAAOD,CAChB,CAEA,UAAUwB,EAAyB,CAC/B,KAAK,OAAS,CACV,GAAG,KAAK,OACR,GAAGA,CACP,CACJ,CAEA,WAAWlB,EAGR,CACC,IAAMmB,EAAcnB,EAAO,SAAS,GAAG,EAAE,GAAK,GACxCoB,EAAY,IAAI3B,EAAU,IAAI,EACpC,MAAO,CACH,GAAG2B,EAAU,OAAO,EACpB,IAAK,SAGC,CACF,IAAMH,EAAQ,MAAM,KAAK,QAAQ,IAAI,EAE/BI,EADW,IAAIC,GAASL,EAAM,aAAa,EACzB,OAAO,CAC3B,UAAWA,EAAM,UACjB,SAAUjB,EAAO,QACrB,CAAC,EAAE,MAAM,EAAGiB,EAAM,UAAU,OAAS,GAAK,CAAC,EACrCM,EAAS,MAAMH,EAAU,MAAM,CACjC,KAAM,aACN,KAAM,CACF,GAAIpB,EAAO,SAAW,CAAC,EACvB,OAAQ,KAAK,OAAO,8BAAgCwB,EAAKH,CAAM,EAAIA,CACvE,CACJ,CAAC,EACKI,EAAU,KAAK,OAAO,8BAAgCC,EAAKH,EAAO,KAAK,OAAO,EAAIA,EAAO,KAAK,QACpG,MAAO,CACH,QAAAE,EACA,YAAa,GAAGN,CAAW,GAAGM,CAAO,EACzC,CACJ,CACJ,CACJ,CAEA,iBAAiBzB,EAGd,CACC,IAAMoB,EAAY,IAAI3B,EAAU,IAAI,EACpC,OAAA2B,EAAU,OAAO,CACb,KAAM,aACN,MAAOpB,EAAO,QAAU,IAAM,MAC9B,UAAWD,GAAK,CACZC,EAAO,UAAU,CACb,QAAS,KAAK,OAAO,8BAAgC0B,EAAK3B,EAAE,OAAO,EAAIA,EAAE,OAC7E,CAAC,CACL,EACA,OAAQC,EAAO,SAAW,IAAM,MAChC,QAASA,EAAO,UAAY,IAAM,MAClC,KAAM,SAAW,CACb,IAAMiB,EAAQ,MAAM,KAAK,QAAQ,IAAI,EAE/BI,EADW,IAAIC,GAASL,EAAM,aAAa,EACzB,OAAO,CAC3B,UAAWA,EAAM,UACjB,SAAUjB,EAAO,QACrB,CAAC,EAAE,MAAM,EAAGiB,EAAM,UAAU,OAAS,GAAK,CAAC,EAC3C,MAAO,CACH,GAAIjB,EAAO,SAAW,CAAC,EACvB,OAAQ,KAAK,OAAO,8BAAgCwB,EAAKH,CAAM,EAAIA,EACnE,OAAQ,EACZ,CACJ,CACJ,CAAC,EACMD,EAAU,OAAO,CAC5B,CAEA,KAAKpB,EAOF,CACC,IAAMoB,EAAY,IAAI3B,EAAU,IAAI,EACpC,MAAO,CACH,GAAG2B,EAAU,OAAO,EACpB,IAAK,SAEC,CAcF,IAAMO,GAbS,MAAMP,EAAU,MAAM,CACjC,KAAM,sBACN,KAAM,CACF,GAAIpB,EAAO,SAAW,CAAC,EACvB,gBAAiBA,EAAO,gBACxB,SAAUA,EAAO,SAAS,IAAID,IACnB,CACH,KAAMA,EAAE,KACR,QAAS,KAAK,OAAO,8BAAgCyB,EAAKzB,EAAE,OAAO,EAAIA,EAAE,OAC7E,EACH,CACL,CACJ,CAAC,GACsB,KAAK,QAAQ,CAAC,EAAE,QAAQ,SAAW,GAC1D,MAAO,CACH,QAAS,KAAK,OAAO,8BAAgC2B,EAAKC,CAAO,EAAIA,CACzE,CACJ,CACJ,CACJ,CAEA,WAAW3B,EAGR,CACC,IAAMoB,EAAY,IAAI3B,EAAU,IAAI,EACpC,OAAA2B,EAAU,OAAO,CACb,KAAM,sBACN,MAAOpB,EAAO,QAAU,IAAM,MAC9B,UAAWD,GAAK,CACZ,IAAI4B,EAAU5B,EAAE,QAAQ,CAAC,EAAE,MAAM,QAC7B4B,GACA3B,EAAO,UAAU,CACb,QAAS,KAAK,OAAO,8BAAgC0B,EAAKC,CAAO,EAAIA,CACzE,CAAC,CAET,EACA,OAAQ3B,EAAO,SAAW,IAAM,MAChC,QAASA,EAAO,UAAY,IAAM,MAClC,KAAM,CACF,GAAIA,EAAO,SAAW,CAAC,EACvB,OAAQ,GACR,SAAUA,EAAO,SAAS,IAAID,IACnB,CACH,KAAMA,EAAE,KACR,QAAS,KAAK,OAAO,8BAAgCyB,EAAKzB,EAAE,OAAO,EAAIA,EAAE,OAC7E,EACH,CACL,CACJ,CAAC,EACMqB,EAAU,OAAO,CAC5B,CACJ,EDtTO,IAAMQ,EAAN,MAAMC,CAAqB,CAA3B,cACHC,EAAA,cAASC,GAAM,OAAO,GAEtB,OAAO,gCAAgCC,EAGpC,CACC,MAAO,OAAMC,EAAiB,CAAE,OAAAC,EAAQ,SAAAC,CAAS,IAAW,CAExD,IAAMC,EADS,IAAIP,EAAqB,EACpB,iBAAiB,EAC/BQ,EAAS,OAAOL,EAAO,QAAW,WAAa,MAAMA,EAAO,OAAO,EAAIA,EAAO,OACpFI,EAAK,UAAUC,CAAM,EACrB,IAAIC,EAAeC,EAAqBL,EAAO,MAAM,EACjDE,EAAK,OAAO,gCACZE,EAAe,KAAK,MAAME,GAAK,KAAK,UAAUF,CAAY,CAAC,CAAC,GAEhE,GAAM,CAAE,IAAAG,EAAK,OAAAC,CAAO,EAAIN,EAAK,KAAK,CAC9B,QAASJ,EAAO,YAChB,SAAUC,EACV,gBAAiB,CACb,KAAM,cACN,OAAQK,CACZ,CACJ,CAAC,EACDH,EAASO,CAAM,EACf,GAAM,CAAE,QAAAC,CAAQ,EAAI,MAAMF,EAAI,EAC9B,OAAOE,CACX,CACJ,CAOA,SAASZ,EAAsB,CAC3B,KAAK,OAASA,CAClB,CAOA,kBAAmB,CACf,OAAO,IAAIa,EAAoB,IAAI,CACvC,CACJ,EEpDA,OAAS,QAAAC,OAAY,eAgCd,IAAMC,EAAN,KAAiB,CAMpB,YAAYC,EAA2B,CALvCC,EAAA,eACAA,EAAA,cAAiB,CACb,MAAO,kBACX,GAGI,KAAK,OAASD,CAClB,CAOA,UAAUE,EAA0B,CAChC,OAAO,OAAO,KAAK,OAAQA,CAAO,CACtC,CAOA,MAAM,KAAKC,EAA4B,CAAC,EAAG,CACvC,IAAMC,EAAcC,GAAK,KAAKF,CAAQ,EAOhCG,GAHS,MAHD,KAAK,OAAO,aAAa,mBAAmB,CACtD,MAAO,KAAK,OAAO,KACvB,CAAC,EAC0B,gBAAgB,CACvC,SAAUF,CACd,CAAC,GACmB,SAAS,KAAK,EAClC,MAAO,CACH,KAAAE,EACA,YAAa,CACT,GAAGF,EACH,CACI,KAAM,QACN,MAAO,CACH,CACI,KAAAE,CACJ,CACJ,CACJ,CACJ,CACJ,CACJ,CAOA,WAAWC,EAMR,CACC,IAAMC,EAAQ,KAAK,OAAO,aAAa,mBAAmB,CACtD,MAAO,KAAK,OAAO,KACvB,CAAC,EACKC,EAAU,CACZ,SAAUF,EAAO,QACrB,EACAC,EACK,sBAAsBC,CAAO,EAC7B,KAAK,MAAM,CAAE,OAAAC,CAAO,IAAM,CACvB,cAAiBC,KAASD,EAAQ,CAC9B,IAAME,EAAYD,EAAM,KAAK,EAC7BJ,EAAO,UAAUK,CAAS,CAC9B,CACAL,EAAO,MAAM,CACjB,CAAC,EACA,MAAOM,GAAU,CACdN,EAAO,QAAQM,CAAK,CACxB,CAAC,CACT,CACJ,EC9FO,IAAMC,EAAN,MAAMC,CAAkB,CAG3B,YAAYC,EAAkC,CAF9CC,EAAA,qBAGI,KAAK,aAAeD,CACxB,CAEA,OAAO,kCAAkCE,EAAyC,CAC9E,IAAMC,EAAkBC,GAChB,OAAOA,GAAY,SACZ,CACH,CACI,KAAMA,CACV,CACJ,EACO,MAAM,QAAQA,CAAO,EACrBA,EAAQ,IAAI,CAAC,CAAE,KAAAC,EAAM,UAAAC,EAAW,KAAAC,CAAK,IAAsC,CAC9E,GAAIF,IAAS,YAAa,CAEtB,IAAMG,EAAMF,GAAW,KAAO,GACxBG,EAAWD,EAAI,SAAS,gBAAgB,EAAI,YAAc,aAChE,MAAO,CACH,WAAY,CACR,KAAMA,EAAI,MAAM,SAAS,EAAE,CAAC,GAAK,GACjC,SAAAC,CACJ,CACJ,CACJ,KACI,OAAO,CACH,KAAMF,GAAQ,EAClB,CAER,CAAC,EAEE,CAAC,EAEZ,OAAOL,EAAS,IAAKQ,GACbA,EAAQ,OAAS,QAAUA,EAAQ,OAAS,SACrC,CACH,KAAM,OACN,MAAOP,EAAeO,EAAQ,OAAO,CACzC,EAEO,CACH,KAAM,QACN,MAAOP,EAAeO,EAAQ,OAAO,CACzC,CAEP,CACL,CAEA,OAAO,gCAAgCC,EAGpC,CACC,IAAMC,EAA8BC,IAC5BA,EAAO,OAAS,UAChB,OAAOA,EAAO,qBACd,OAAO,KAAKA,EAAO,UAAU,EAAE,QAASC,GAAQ,CAC5CF,EAA2BC,EAAO,WAAWC,CAAG,CAAC,CACrD,CAAC,GACMD,EAAO,OAAS,SACvBD,EAA2BC,EAAO,KAAK,EAEpCA,GAEX,MAAO,OAAOX,EAAiB,CAAE,OAAAW,CAAO,IAAW,CAC/C,IAAME,EAAiBH,EAA2BI,EAAqBH,EAAO,MAAM,CAAC,EAWrF,OAHe,MAPDF,EAAO,mBAAmB,mBAAmB,CACvD,MAAOA,EAAO,MACd,iBAAkB,CACd,iBAAkB,mBAClB,eAAAI,CACJ,CACJ,CAAC,EAC0B,gBAAgB,CACvC,SAAUhB,EAAkB,kCAAkCG,CAAQ,CAC1E,CAAC,GACa,SAAS,KAAK,CAChC,CACJ,CAEA,YAAa,CACT,OAAO,IAAIe,EAAW,IAAI,CAC9B,CACJ,ECtFO,IAAMC,EAAN,KAAoB,CAOvB,YAAYC,EAAiC,CAN7CC,EAAA,kBACAA,EAAA,cAAiB,CACb,MAAO,0BACP,UAAW,IACf,GAGI,KAAK,UAAYD,CACrB,CAOA,UAAUE,EAA0B,CAChC,OAAO,OAAO,KAAK,OAAQA,CAAO,CACtC,CAMQ,kBAAkBC,EAAiB,CACvC,MAAO,CACH,OAAQA,EAAS,KAAKC,GAAKA,EAAE,OAAS,QAAQ,GAAG,QAAQ,CAAC,EAAE,KAC5D,SAAUD,EAAS,OAAOC,GAAKA,EAAE,OAAS,QAAQ,CACtD,CACJ,CAOA,MAAM,iBAAiBD,EAAqBE,EAAiB,CACzD,IAAML,EAAY,KAAK,UAAU,aAC3BM,EAAoB,KAAK,kBAAkBH,CAAQ,EAmBrDI,GAlBQ,MAAMP,EAAU,SAAS,OAAO,CACxC,MAAO,KAAK,OAAO,MACnB,WAAY,KAAK,OAAO,UACxB,OAAQM,EAAkB,OAC1B,SAAUA,EAAkB,SAC5B,MAAO,CACH,CACI,KAAM,OACN,YAAa,gBACb,aAAcD,CAClB,CACJ,EACA,YAAa,CACT,KAAM,OACN,KAAM,MACV,CACJ,CAAC,GAC6B,QAAQ,KAAKD,GAAKA,EAAE,OAAS,UAAU,GACtC,OAAS,KACxC,OAAIG,GAAY,KACL,OAEJ,KAAK,UAAUA,CAAQ,CAClC,CAOA,MAAM,KAAKJ,EAAsB,CAAC,EAAG,CACjC,IAAMH,EAAY,KAAK,UAAU,aAC3BQ,EAAc,KAAK,kBAAkBL,CAAQ,EAC7CM,EAAM,MAAMT,EAAU,SAAS,OAAO,CACxC,MAAO,KAAK,OAAO,MACnB,WAAY,KAAK,OAAO,UACxB,OAAQQ,EAAY,OACpB,SAAUA,EAAY,QAC1B,CAAC,EACGE,EAAS,GACTC,EAAmBF,EAAI,QAAQ,KAAKL,GAAKA,EAAE,OAAS,MAAM,EAC9D,OAAIO,IACAD,EAASC,EAAY,MAElBD,CACX,CAOA,WAAWE,EAMR,CACC,IAAMZ,EAAY,KAAK,UAAU,aAC3B,CAAE,UAAAa,EAAW,MAAAC,EAAO,QAAAC,CAAQ,EAAIH,EAChC,CAAE,SAAAT,EAAU,OAAAa,CAAO,EAAI,KAAK,kBAAkBJ,EAAO,QAAQ,EAqBnE,OApB4B,SAAY,CACpC,GAAI,CACA,IAAMK,EAAS,MAAMjB,EAAU,SAAS,OAAO,CAC3C,MAAO,KAAK,OAAO,MACnB,WAAY,KAAK,OAAO,UACxB,OAAQgB,EACR,OAAQ,GACR,SAAAb,CACJ,CAAC,EACD,cAAiBe,KAAiBD,EAC9B,GAAIC,EAAc,OAAS,sBAAuB,CAC9C,IAAMC,EAAY,SAAUD,EAAc,MAAQA,EAAc,MAAM,KAAO,GAC7EL,EAAUM,CAAS,CACvB,CAEJL,EAAM,CACV,OAASM,EAAO,CACZL,EAAQK,CAAK,CACjB,CACJ,GACoB,EACb,CACH,OAAQ,IAAM,IAClB,CACJ,CACJ,EC3IO,IAAMC,EAAN,MAAMC,CAAqB,CAG9B,YAAYC,EAAyB,CAFrCC,EAAA,qBAGI,KAAK,aAAeD,CACxB,CAEA,OAAO,gCAAgCE,EAGpC,CAEC,IAAMC,EADY,IAAIJ,EAAqBG,EAAO,YAAY,EACvC,WAAW,EAClC,OAAAC,EAAK,UAAUD,EAAO,QAAU,CAAC,CAAC,EAC3B,MAAOE,EAAiB,CAAE,OAAAC,CAAO,IAAW,CAC/C,IAAMC,EAAaC,EAAqBF,EAAO,MAAM,EAErD,OADgB,MAAMF,EAAK,iBAAiBC,EAAUE,CAAU,CAEpE,CACJ,CAEA,YAAa,CACT,OAAO,IAAIE,EAAc,IAAI,CACjC,CACJ",
|
|
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 OpenAICtodService {\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 OpenAICtodService(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 OpenAICtodService(typeof params.apiKey === 'string' ? params.apiKey : await params.apiKey())\n const chat = openai.createChat()\n const abortController = new AbortController()\n if (params.config) {\n chat.setConfig(typeof params.config === 'function' ? await params.config() : params.config)\n }\n if (params.axios) {\n openai.setAxios(params.axios)\n }\n onCancel(() => abortController.abort())\n const jsonSchema = validateToJsonSchema(schema.output)\n const { text } = await chat.talk(messages, {\n abortController,\n jsonSchema: {\n name: 'data',\n strict: true,\n schema: jsonSchema\n }\n })\n return text\n }\n }\n\n constructor(apiKey = '') {\n this._apiKey = apiKey\n }\n\n /**\n * @zh \u5982\u679C\u4F60\u6709\u9700\u8981\u7279\u5225\u8A2D\u5B9A axios\uFF0C\u8ACB\u4F7F\u7528\u9019\u65B9\u6CD5\u3002\n * @en If you need to set axios, please use this method.\n */\n\n setAxios(axios: any) {\n this._axios = axios\n }\n\n /**\n * @zh \u8A2D\u5B9A api key\u3002\n * @en Set api key.\n */\n\n setConfiguration(apiKey: string) {\n this._apiKey = apiKey\n }\n\n createChat() {\n return new OpenAIChat(this)\n }\n\n createVision() {\n return new OpenAIVision(this)\n }\n\n createImagesGeneration() {\n return new OpenAIImagesGeneration(this)\n }\n}\n", "import { OpenAICtodService } from './index'\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\nexport type VisionMessage = {\n role: 'system' | 'user' | 'assistant'\n name?: string\n content: string | ImageContent[]\n}\n\ntype ApiResponse = {\n id: string\n object: string\n created: number\n model: string\n usage: {\n prompt_tokens: number\n completion_tokens: number\n total_tokens: number\n }\n choices: Array<{\n message: {\n role: string\n content: string\n }\n finish_details: {\n type: string\n }\n index: number\n }>\n}\n\nexport type Config = {\n /**\n * @zh \u9078\u64C7\u904B\u884C\u7684\u6A21\u578B\u3002\n * @en How many chat completion choices to generate for each input message.\n */\n model: 'gpt-4-vision-preview'\n /**\n * @zh \u5192\u96AA\u6307\u6578\uFF0C\u6578\u503C\u7531 0 ~ 2 \u4E4B\u9593\u3002\n * @en What sampling temperature to use, between 0 and 2. Higher values like 0.8 will make the output more random, while lower values like 0.2 will make it more focused and deterministic.\n */\n temperature: number\n /**\n * @zh \u6BCF\u6B21\u5C0D\u8A71\u6700\u591A\u7522\u751F\u5E7E\u500B tokens\u3002\n * @en How many tokens to complete to.\n */\n maxTokens?: number\n}\n\nexport class OpenAIVision {\n openai: OpenAICtodService\n config: Config = {\n model: 'gpt-4-vision-preview',\n maxTokens: undefined,\n temperature: 1\n }\n\n constructor(openai: OpenAICtodService) {\n this.openai = openai\n }\n\n /**\n * @zh \u6539\u8B8A\u5C0D\u8A71\u7684\u4E00\u4E9B\u8A2D\u5B9A\n * @en Change some settings of the conversation\n */\n\n setConfig(options: Partial<Config>) {\n Object.assign(this.config, options)\n }\n\n /**\n * @zh \u8FA8\u8B58\u5716\u7247\n * @en Recognize images\n */\n\n async view(messages: VisionMessage[]) {\n const result = await this.openai._axios.post<ApiResponse>('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 apiResponse: result.data\n }\n }\n}\n\nexport type OpenAIChatVisionResponse = PromiseResponseType<OpenAIVision['view']>\n", "import { json } from 'power-helper'\nimport { OpenAICtodService } 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'\n * @en The model to use for this chat completion.\n */\n model: string\n /**\n * @zh \u5192\u96AA\u6307\u6578\uFF0C\u6578\u503C\u7531 0 ~ 2 \u4E4B\u9593\uFF0C\u8D8A\u4F4E\u56DE\u61C9\u8D8A\u7A69\u5B9A\u3002\n * @en What sampling temperature to use, between 0 and 2. Higher values like 0.8 will make the output more random, while lower values like 0.2 will make it more focused and deterministic.\n */\n temperature: number\n /**\n * @zh \u662F\u5426\u5F37\u5236\u8981\u56DE\u50B3 JSON \u683C\u5F0F\u7684\u8CC7\u6599\n * @en Whether to force the return of JSON format data\n */\n forceJsonFormat: boolean\n /**\n * @zh \u6BCF\u6B21\u5C0D\u8A71\u6700\u591A\u7522\u751F\u5E7E\u500B tokens\u3002\n * @en How many tokens to complete to.\n */\n maxTokens?: number\n}\n\nexport class OpenAIChat {\n openai: OpenAICtodService\n config: Config = {\n n: 1,\n model: 'gpt-4o',\n temperature: 1,\n maxTokens: undefined,\n forceJsonFormat: true\n }\n\n constructor(openai: OpenAICtodService) {\n this.openai = openai\n }\n\n /**\n * @zh \u6539\u8B8A\u5C0D\u8A71\u7684\u4E00\u4E9B\u8A2D\u5B9A\n * @en Change some settings of the conversation\n */\n\n setConfig(options: Partial<Config>) {\n Object.assign(this.config, options)\n }\n\n /**\n * @zh \u6AA2\u8996\u5167\u5BB9\u662F\u5426\u7B26\u5408 OpenAI \u7684\u5BE9\u67E5\n * @en View content for OpenAI moderation\n */\n\n async moderations(input: string) {\n const result = await this.openai._axios.post<any>('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 apiResponse: result.data\n }\n }\n\n talkStream(params: {\n messages: any[]\n onMessage: (_message: string) => void\n onEnd: () => void\n onWarn: (_warn: any) => void\n onError: (_error: any) => void\n }) {\n const controller = new AbortController()\n fetch('https://api.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 { OpenAICtodService } 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: OpenAICtodService\n private config: Config = {\n model: 'dall-e-2',\n size: '1024x1024'\n }\n\n constructor(openai: OpenAICtodService) {\n this.openai = openai\n }\n\n /**\n * @zh \u6539\u8B8A\u5C0D\u8A71\u7684\u4E00\u4E9B\u8A2D\u5B9A\n * @en Change some settings of the conversation\n */\n\n setConfig(options: Partial<Config>) {\n Object.assign(this.config, options)\n }\n\n /**\n * @zh \u7522\u751F\u5716\u7247\n * @en Generate image\n */\n\n async create(prompt: string) {\n const result = await this.openai._axios.post<ApiResponse>('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 Llama3CppCtodService {\n _axios = axios.create()\n\n static createChatRequestWithJsonSchema(params: {\n config: Partial<Config> | (() => Promise<Partial<Config>>)\n talkOptions?: any\n }) {\n return async(messages: any[], { schema, onCancel }: any) => {\n const ll3cpp = new Llama3CppCtodService()\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 { Llama3CppCtodService } from './index'\nimport { flow, Once } from 'power-helper'\nimport { tify, sify } from 'chinese-conv/dist'\nimport { Template } from '@huggingface/jinja'\n\ntype Message = {\n role: string\n content: string\n}\n\ntype Options = any\n\nexport type Config = {\n baseUrl: string\n headers: Record<string, string>\n autoConvertTraditionalChinese: boolean\n}\n\ntype Stream = {\n onMessage: (message: string) => void\n onEnd?: () => void\n onWarn?: (error: any) => void\n onError?: (error: any) => void\n}\n\nclass Requester {\n private core: 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: Record<string, any> | (() => Promise<any>)\n onMessage: (data: any) => void\n onEnd: () => void\n onWarn: (error: any) => void\n onError: (error: any) => void\n }) {\n const { signal, controllerId } = this.createAbortController()\n const end = () => {\n this.removeAbortController(controllerId)\n params.onEnd()\n }\n const reader = async(response: Response) => {\n if (response.body) {\n let reader = response.body.getReader()\n let done = false\n let chunk = ''\n while (!done) {\n const { value, done: readerDone } = await reader.read()\n if (value) {\n chunk += new TextDecoder('utf-8').decode(value)\n const payloads = chunk.split('\\n\\n')\n chunk = payloads.pop() || ''\n payloads.forEach(payload => {\n if (payload.includes('[DONE]')) {\n done = true\n }\n if (payload.startsWith('data:')) {\n try {\n const data = JSON.parse(payload.replace('data: ', ''))\n params.onMessage(data)\n } catch (error) {\n params.onWarn(error)\n }\n }\n })\n }\n if (readerDone) {\n done = true\n }\n }\n end()\n } else {\n params.onError(new Error('Body not found.'))\n }\n }\n fetch(`${this.core.config.baseUrl}/${params.path}`, {\n method: 'POST',\n body: JSON.stringify(typeof params.data === 'function' ? (await params.data()) : params.data),\n signal,\n headers: {\n 'Content-Type': 'application/json',\n ...this.core.config.headers\n }\n })\n .then(reader)\n .catch(error => {\n if (error instanceof Error && error.message.includes('The user aborted a request')) {\n end()\n } else {\n params.onError(error)\n }\n })\n }\n\n async fetch(params: {\n path: string\n data: any\n }) {\n const { signal, controllerId } = this.createAbortController()\n try {\n const result = await this.core.core._axios.post(`${this.core.config.baseUrl}/${params.path}`, params.data, {\n signal,\n headers: {\n 'Content-Type': 'application/json',\n ...this.core.config.headers\n }\n })\n return {\n data: result.data\n }\n } finally {\n this.removeAbortController(controllerId)\n }\n }\n\n cancel() {\n this.streamAbortControllers.forEach(e => e.controller.abort())\n this.streamAbortControllers = []\n }\n\n export() {\n return {\n cancel: this.cancel.bind(this)\n }\n }\n}\n\nexport class Llama3CppCompletion {\n private getProp = new Once({\n handler: async() => {\n const url = `${this.config.baseUrl}/props`\n const { data: props } = await this.core._axios.get<{\n chat_template: string\n bos_token: string\n eos_token: string\n }>(url, {})\n return props\n }\n })\n\n core: Llama3CppCtodService\n config: Config = {\n baseUrl: '',\n headers: {},\n autoConvertTraditionalChinese: true\n }\n\n constructor(core: Llama3CppCtodService) {\n this.core = core\n }\n\n setConfig(config: Partial<Config>) {\n this.config = {\n ...this.config,\n ...config\n }\n }\n\n completion(params: {\n options?: Options\n messages: Message[]\n }) {\n const lastMessage = params.messages.at(-1) || ''\n const requester = new Requester(this)\n return {\n ...requester.export(),\n run: async(): Promise<{\n message: string\n fullMessage: string\n }> => {\n const props = await this.getProp.run()\n const template = new Template(props.chat_template)\n const prompt = template.render({\n bos_token: props.bos_token,\n messages: params.messages\n }).slice(0, props.eos_token.length * -1 - 1)\n const result = await requester.fetch({\n path: 'completion',\n data: {\n ...(params.options || {}),\n prompt: this.config.autoConvertTraditionalChinese ? sify(prompt) : prompt\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 requester = new Requester(this)\n requester.stream({\n path: 'completion',\n onEnd: params.onEnd || (() => null),\n onMessage: e => {\n const message = this.config.autoConvertTraditionalChinese ? tify(e.content) : e.content\n params.onMessage(message)\n },\n onWarn: params.onWarn || (() => null),\n onError: params.onError || (() => null),\n data: async() => {\n const props = await this.getProp.run()\n const template = new Template(props.chat_template)\n const prompt = template.render({\n bos_token: props.bos_token,\n messages: params.messages\n }).slice(0, props.eos_token.length * -1 - 1)\n return {\n ...(params.options || {}),\n prompt: this.config.autoConvertTraditionalChinese ? sify(prompt) : prompt,\n stream: true\n }\n }\n })\n return requester.export()\n }\n\n talk(params: {\n options?: Options\n messages: Message[]\n response_format?: {\n type: 'json_object'\n schema: any\n }\n }) {\n const requester = new Requester(this)\n return {\n ...requester.export(),\n run: async(): Promise<{\n message: string\n }> => {\n const result = await requester.fetch({\n path: 'v1/chat/completions',\n data: {\n ...(params.options || {}),\n response_format: params.response_format,\n messages: params.messages.map(e => {\n return {\n role: e.role,\n content: this.config.autoConvertTraditionalChinese ? 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 const message = this.config.autoConvertTraditionalChinese ? tify(content) : content\n params.onMessage(message)\n }\n },\n onWarn: params.onWarn || (() => null),\n onError: params.onError || (() => null),\n data: {\n ...(params.options || {}),\n stream: true,\n messages: params.messages.map(e => {\n return {\n role: e.role,\n content: this.config.autoConvertTraditionalChinese ? sify(e.content) : e.content\n }\n })\n }\n })\n return requester.export()\n }\n}\n", "import { json } from 'power-helper'\nimport { GoogleCtodService } from './index'\nimport { PromiseResponseType } from '../../types'\n\n/**\n * if data:\n * data: base64 string,\n * mimeType: image/jpeg,\n */\n\ntype Part = {\n text: string\n} | {\n inlineData: {\n data: string\n mimeType: string\n }\n}\n\nexport type GoogleMessage = {\n role: 'model' | 'user'\n parts: Part[]\n}\n\nexport type Config = {\n /**\n * @zh \u9078\u64C7\u904B\u884C\u7684\u6A21\u578B\u3002\n * @en What model to use.\n */\n model: string\n}\n\nexport class GoogleChat {\n google: GoogleCtodService\n config: Config = {\n model: 'gemini-1.5-flash'\n }\n\n constructor(google: GoogleCtodService) {\n this.google = google\n }\n\n /**\n * @zh \u6539\u8B8A\u5C0D\u8A71\u7684\u4E00\u4E9B\u8A2D\u5B9A\n * @en Change some settings of the conversation\n */\n\n setConfig(options: Partial<Config>) {\n Object.assign(this.config, options)\n }\n\n /**\n * @zh \u9032\u884C\u5C0D\u8A71\n * @en Talk to the AI\n */\n\n async talk(messages: GoogleMessage[] = []) {\n const newMessages = json.jpjs(messages)\n const model = this.google.generativeAI.getGenerativeModel({\n model: this.config.model\n })\n const result = await model.generateContent({\n contents: newMessages\n })\n const text = result.response.text()\n return {\n text,\n newMessages: [\n ...newMessages,\n {\n role: 'model',\n parts: [\n {\n text\n }\n ]\n }\n ]\n }\n }\n\n /**\n * @zh \u9032\u884C\u5C0D\u8A71\uFF0C\u4E26\u4E14\u4EE5\u4E32\u6D41\u7684\u65B9\u5F0F\u8F38\u51FA\n * @en Talk to the AI and output in a streaming way\n */\n\n talkStream(params: {\n messages: GoogleMessage[]\n onMessage: (_message: string) => void\n onEnd: () => void\n onWarn: (_warn: any) => void\n onError: (_error: any) => void\n }) {\n const model = this.google.generativeAI.getGenerativeModel({\n model: this.config.model\n })\n const context = {\n contents: params.messages\n }\n model\n .generateContentStream(context)\n .then(async({ stream }) => {\n for await (const chunk of stream) {\n const chunkText = chunk.text()\n params.onMessage(chunkText)\n }\n params.onEnd()\n })\n .catch((error) => {\n params.onError(error)\n })\n }\n}\n\nexport type GoogleChatTalkResponse = PromiseResponseType<GoogleChat['talk']>\n", "import { validateToJsonSchema } from '../../utils/validate'\nimport { GoogleMessage, GoogleChat } from './chat'\nimport type { GoogleGenerativeAI } from '@google/generative-ai'\n\ntype GPTContent = {\n type: 'image_url' | 'text'\n text?: string\n image_url?: {\n url: string\n detail?: string\n }\n}\n\ntype GPTMessage = {\n role: 'system' | 'user' | 'assistant'\n content: string | GPTContent[]\n}\n\nexport class GoogleCtodService {\n generativeAI: GoogleGenerativeAI\n\n constructor(generativeAI: GoogleGenerativeAI) {\n this.generativeAI = generativeAI\n }\n\n static chatGPTMessageToGoogleChatMessage(messages: GPTMessage[]): GoogleMessage[] {\n const contentToParts = (content: string | GPTMessage['content']): GoogleMessage['parts'] => {\n if (typeof content === 'string') {\n return [\n {\n text: content\n }\n ]\n } else if (Array.isArray(content)) {\n return content.map(({ type, image_url, text }): GoogleMessage['parts'][number] => {\n if (type === 'image_url') {\n // base64\n const url = image_url?.url || ''\n const mimeType = url.includes('data:image/png') ? 'image/png' : 'image/jpeg'\n return {\n inlineData: {\n data: url.split('base64,')[1] || '',\n mimeType\n }\n }\n } else {\n return {\n text: text || ''\n }\n }\n })\n }\n return []\n }\n return messages.map((message) => {\n if (message.role === 'user' || message.role === 'system') {\n return {\n role: 'user',\n parts: contentToParts(message.content)\n }\n } else {\n return {\n role: 'model',\n parts: contentToParts(message.content)\n }\n }\n })\n }\n\n static createChatRequestWithJsonSchema(params: {\n 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: GoogleCtodService.chatGPTMessageToGoogleChatMessage(messages)\n })\n return result.response.text()\n }\n }\n\n createChat() {\n return new GoogleChat(this)\n }\n}\n", "import { AnthropicCtodService } from './index'\nimport { PromiseResponseType } from '../../types'\n\nexport type Message = {\n role: string\n content: string\n}\n\nexport type Config = {\n /**\n * @zh \u9078\u64C7\u904B\u884C\u7684\u6A21\u578B\u3002\n * @en What model to use.\n */\n model: string\n maxTokens: number\n}\n\nexport class AnthropicChat {\n anthropic: AnthropicCtodService\n config: Config = {\n model: 'claude-3-5-haiku-latest',\n maxTokens: 8192\n }\n\n constructor(anthropic: AnthropicCtodService) {\n this.anthropic = anthropic\n }\n\n /**\n * @zh \u6539\u8B8A\u5C0D\u8A71\u7684\u4E00\u4E9B\u8A2D\u5B9A\n * @en Change some settings of the conversation\n */\n\n setConfig(options: Partial<Config>) {\n Object.assign(this.config, options)\n }\n\n /**\n * \u79FB\u9664 system \u8A0A\u606F\n */\n\n private translateMessages(messages: any[]) {\n return {\n system: messages.find(e => e.role === 'system')?.content[0].text,\n messages: messages.filter(e => e.role !== 'system')\n }\n }\n\n /**\n * @zh \u9032\u884C\u5C0D\u8A71\uFF0C\u4E26\u4E14\u4EE5\u7D50\u69CB\u5316\u7684\u65B9\u5F0F\u8F38\u51FA\n * @en Talk to the AI and output in a structured way\n */\n\n async chatAndStructure(messages: Message[], jsonSchema: any) {\n const anthropic = this.anthropic.anthropicSdk\n const translateMessages = this.translateMessages(messages)\n const msg = await anthropic.messages.create({\n model: this.config.model,\n max_tokens: this.config.maxTokens,\n system: translateMessages.system,\n messages: translateMessages.messages,\n tools: [\n {\n name: 'data',\n description: 'Response Data',\n input_schema: jsonSchema\n }\n ],\n tool_choice: {\n type: 'tool',\n name: 'data'\n }\n })\n let toolUseContent: any = msg.content.find(e => e.type === 'tool_use')\n let response = toolUseContent?.input || null\n if (response == null) {\n return 'null'\n }\n return JSON.stringify(response)\n }\n\n /**\n * @zh \u9032\u884C\u5C0D\u8A71\n * @en Talk to the AI\n */\n\n async talk(messages: Message[] = []) {\n const anthropic = this.anthropic.anthropicSdk\n const newMessages = this.translateMessages(messages)\n const msg = await anthropic.messages.create({\n model: this.config.model,\n max_tokens: this.config.maxTokens,\n system: newMessages.system,\n messages: newMessages.messages\n })\n let output = ''\n let textContent: any = msg.content.find(e => e.type === 'text')\n if (textContent) {\n output = textContent.text\n }\n return output\n }\n\n /**\n * @zh \u9032\u884C\u5C0D\u8A71\uFF0C\u4E26\u4E14\u4EE5\u4E32\u6D41\u7684\u65B9\u5F0F\u8F38\u51FA\n * @en Talk to the AI and output in a streaming way\n */\n\n talkStream(params: {\n messages: Message[]\n onMessage: (_message: string) => void\n onEnd: () => void\n onWarn: (_warn: any) => void\n onError: (_error: any) => void\n }) {\n const anthropic = this.anthropic.anthropicSdk\n const { onMessage, onEnd, onError } = params\n const { messages, system } = this.translateMessages(params.messages)\n const performStreamedChat = async () => {\n try {\n const stream = await anthropic.messages.create({\n model: this.config.model,\n max_tokens: this.config.maxTokens,\n system: system,\n stream: true,\n messages\n })\n for await (const messageStream of stream) {\n if (messageStream.type === 'content_block_delta') {\n const deltaText = 'text' in messageStream.delta ? messageStream.delta.text : ''\n onMessage(deltaText)\n }\n }\n onEnd()\n } catch (error) {\n onError(error)\n }\n }\n performStreamedChat()\n return {\n cancel: () => null\n }\n }\n}\n\nexport type AnthropicChatTalkResponse = PromiseResponseType<AnthropicChat['talk']>\n", "import { validateToJsonSchema } from '../../utils/validate'\nimport { Config, AnthropicChat } from './chat'\nimport type { Anthropic } from '@anthropic-ai/sdk'\n\nexport class AnthropicCtodService {\n anthropicSdk: Anthropic\n\n constructor(anthropicSdk: Anthropic) {\n this.anthropicSdk = anthropicSdk\n }\n\n static createChatRequestWithJsonSchema(params: {\n anthropicSdk: Anthropic\n config?: Partial<Config>\n }) {\n const anthropic = new AnthropicCtodService(params.anthropicSdk)\n const chat = anthropic.createChat()\n chat.setConfig(params.config || {})\n return async (messages: any[], { schema }: any) => {\n const jsonSchema = validateToJsonSchema(schema.output)\n const content = await chat.chatAndStructure(messages, jsonSchema)\n return content\n }\n }\n\n createChat() {\n return new AnthropicChat(this)\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
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", "OpenAICtodService", "_OpenAICtodService", "apiKey", "__publicField", "axios", "config", "options", "messages", "onCancel", "openai", "chat", "abortController", "text", "params", "schema", "jsonSchema", "validateToJsonSchema", "OpenAIChat", "OpenAIVision", "OpenAIImagesGeneration", "axios", "sify", "flow", "Once", "tify", "sify", "Template", "Requester", "core", "__publicField", "streamAbortController", "streamAbortControllerId", "flow", "e", "params", "signal", "controllerId", "end", "reader", "response", "done", "chunk", "value", "readerDone", "payloads", "payload", "data", "error", "Llama3CppCompletion", "Once", "url", "props", "config", "lastMessage", "requester", "prompt", "Template", "result", "sify", "message", "tify", "content", "Llama3CppCtodService", "_Llama3CppCtodService", "__publicField", "axios", "params", "messages", "schema", "onCancel", "chat", "config", "formatSchema", "validateToJsonSchema", "sify", "run", "cancel", "message", "Llama3CppCompletion", "json", "GoogleChat", "google", "__publicField", "options", "messages", "newMessages", "json", "text", "params", "model", "context", "stream", "chunk", "chunkText", "error", "GoogleCtodService", "_GoogleCtodService", "generativeAI", "__publicField", "messages", "contentToParts", "content", "type", "image_url", "text", "url", "mimeType", "message", "params", "removeAdditionalProperties", "schema", "key", "responseSchema", "validateToJsonSchema", "GoogleChat", "AnthropicChat", "anthropic", "__publicField", "options", "messages", "e", "jsonSchema", "translateMessages", "response", "newMessages", "msg", "output", "textContent", "params", "onMessage", "onEnd", "onError", "system", "stream", "messageStream", "deltaText", "error", "AnthropicCtodService", "_AnthropicCtodService", "anthropicSdk", "__publicField", "params", "chat", "messages", "schema", "jsonSchema", "validateToJsonSchema", "AnthropicChat"]
|
|
7
7
|
}
|
|
@@ -17,7 +17,7 @@ export type Config = {
|
|
|
17
17
|
}
|
|
18
18
|
|
|
19
19
|
type Stream = {
|
|
20
|
-
onMessage: (
|
|
20
|
+
onMessage: (message: string) => void
|
|
21
21
|
onEnd?: () => void
|
|
22
22
|
onWarn?: (error: any) => void
|
|
23
23
|
onError?: (error: any) => void
|
|
@@ -224,9 +224,8 @@ export class Llama3CppCompletion {
|
|
|
224
224
|
path: 'completion',
|
|
225
225
|
onEnd: params.onEnd || (() => null),
|
|
226
226
|
onMessage: e => {
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
})
|
|
227
|
+
const message = this.config.autoConvertTraditionalChinese ? tify(e.content) : e.content
|
|
228
|
+
params.onMessage(message)
|
|
230
229
|
},
|
|
231
230
|
onWarn: params.onWarn || (() => null),
|
|
232
231
|
onError: params.onError || (() => null),
|
|
@@ -293,9 +292,8 @@ export class Llama3CppCompletion {
|
|
|
293
292
|
onMessage: e => {
|
|
294
293
|
let content = e.choices[0].delta.content
|
|
295
294
|
if (content) {
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
})
|
|
295
|
+
const message = this.config.autoConvertTraditionalChinese ? tify(content) : content
|
|
296
|
+
params.onMessage(message)
|
|
299
297
|
}
|
|
300
298
|
},
|
|
301
299
|
onWarn: params.onWarn || (() => null),
|
package/package.json
CHANGED
|
@@ -10,9 +10,7 @@ export type Config = {
|
|
|
10
10
|
autoConvertTraditionalChinese: boolean;
|
|
11
11
|
};
|
|
12
12
|
type Stream = {
|
|
13
|
-
onMessage: (
|
|
14
|
-
message: string;
|
|
15
|
-
}) => void;
|
|
13
|
+
onMessage: (message: string) => void;
|
|
16
14
|
onEnd?: () => void;
|
|
17
15
|
onWarn?: (error: any) => void;
|
|
18
16
|
onError?: (error: any) => void;
|