ctod 1.0.7 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +11 -6
- package/README_ZH.md +10 -5
- package/dist/index.js +22 -18
- package/dist/index.js.map +4 -4
- package/examples/anthropic.ts +20 -6
- package/examples/aws-bedrock.ts +11 -6
- package/examples/google.ts +11 -6
- package/examples/openai.ts +11 -6
- package/examples/x.ts +11 -6
- package/lib/broker/chat.ts +12 -2
- package/lib/ctod.ts +8 -3
- package/lib/index.ts +2 -0
- package/lib/service/anthropic/chat.ts +72 -6
- package/lib/service/anthropic/index.ts +16 -6
- package/lib/service/google/chat.ts +14 -3
- package/lib/service/google/index.ts +31 -12
- package/lib/service/llama-cpp/completion.ts +33 -5
- package/lib/service/llama-cpp/index.ts +3 -3
- package/lib/service/openai/chat.ts +47 -5
- package/lib/service/x/chat.ts +47 -5
- package/lib/utils/paragraph.ts +10 -0
- package/package.json +1 -1
- package/types/lib/broker/chat.d.ts +9 -2
- package/types/lib/ctod.d.ts +4 -2
- package/types/lib/index.d.ts +2 -0
- package/types/lib/service/anthropic/chat.d.ts +7 -2
- package/types/lib/service/google/chat.d.ts +8 -1
- package/types/lib/service/google/index.d.ts +2 -2
- package/types/lib/service/llama-cpp/completion.d.ts +5 -1
- package/types/lib/service/openai/chat.d.ts +20 -2
- package/types/lib/service/x/chat.d.ts +20 -2
- package/types/lib/utils/paragraph.d.ts +5 -0
package/README.md
CHANGED
|
@@ -47,7 +47,7 @@ yarn add ctod
|
|
|
47
47
|
This example demonstrates how to pass a medication index and customer requirements to a chatbot and return the most suitable results. Developers can use the index results to search the database for the most appropriate medication for consumers:
|
|
48
48
|
|
|
49
49
|
```ts
|
|
50
|
-
import { CtoD, OpenAICtodService } from 'ctod'
|
|
50
|
+
import { CtoD, OpenAICtodService, paragraph } from 'ctod'
|
|
51
51
|
|
|
52
52
|
const ctod = new CtoD({
|
|
53
53
|
request: OpenAICtodService.createChatRequestWithJsonSchema({
|
|
@@ -79,11 +79,16 @@ const broker = brokerBuilder.create(async({ zod, data, setMessages }) => {
|
|
|
79
79
|
setMessages([
|
|
80
80
|
{
|
|
81
81
|
role: 'user',
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
82
|
+
contents: [
|
|
83
|
+
{
|
|
84
|
+
type: 'text',
|
|
85
|
+
content: paragraph([
|
|
86
|
+
'I have the following indexes',
|
|
87
|
+
`${JSON.stringify(indexes)}`,
|
|
88
|
+
`Please help me analyze which index "${question}" might belong to`,
|
|
89
|
+
'And sort by relevance from high to low with a score ranging from 0 to 1'
|
|
90
|
+
])
|
|
91
|
+
}
|
|
87
92
|
]
|
|
88
93
|
}
|
|
89
94
|
])
|
package/README_ZH.md
CHANGED
|
@@ -79,11 +79,16 @@ const broker = brokerBuilder.create(async({ zod, data, setMessages }) => {
|
|
|
79
79
|
setMessages([
|
|
80
80
|
{
|
|
81
81
|
role: 'user',
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
82
|
+
contents: [
|
|
83
|
+
{
|
|
84
|
+
type: 'text',
|
|
85
|
+
content: paragraph([
|
|
86
|
+
'我有以下索引',
|
|
87
|
+
`${JSON.stringify(indexes)}`,
|
|
88
|
+
`請幫我解析"${question}"可能是哪個索引`,
|
|
89
|
+
'且相關性由高到低排序並給予分數,分數由 0 ~ 1'
|
|
90
|
+
])
|
|
91
|
+
}
|
|
87
92
|
]
|
|
88
93
|
}
|
|
89
94
|
])
|
package/dist/index.js
CHANGED
|
@@ -1,22 +1,26 @@
|
|
|
1
|
-
var
|
|
2
|
-
`+JSON.stringify(r,null,4)):
|
|
3
|
-
`+n)}),
|
|
4
|
-
`+n)}),
|
|
5
|
-
`+JSON.stringify(n,null,4))}catch{
|
|
6
|
-
`+n)}})}});import{Event as
|
|
1
|
+
var lt=Object.defineProperty;var xt=(o,t,e)=>t in o?lt(o,t,{enumerable:!0,configurable:!0,writable:!0,value:e}):o[t]=e;var D=(o,t)=>{for(var e in t)lt(o,e,{get:t[e],enumerable:!0})};var i=(o,t,e)=>xt(o,typeof t!="symbol"?t+"":t,e);var ut={};D(ut,{LimiterPlugin:()=>Pt,LimiterPluginGlobState:()=>vt,PrintLogPlugin:()=>St,RetryPlugin:()=>At,RolePlugin:()=>wt});import{Event as kt}from"power-helper";var x=class{constructor(t){i(this,"_event",new kt);i(this,"_params");this._params=t}use(t){return{instance:this,params:t,send:e=>{this._event.emit("receive",e)},receive:e=>{this._event.on("receive",e)},__receiveData:null}}};var ct=new x({name:"retry",params:o=>({retry:o.number().default(1),printWarn:o.boolean().default(!0)}),receiveData:()=>({}),onInstall({log:o,attach:t,params:e}){t("parseFailed",async({count:n,retry:r,messages:s,changeMessages:a})=>{n<=e.retry&&(e.printWarn&&o.print(`Is Failed, Retry ${n} times.`),a(s),r())})}});var pt=new x({name:"print-log",params:o=>({detail:o.boolean().default(!1)}),receiveData:()=>({}),onInstall({params:o,log:t,attach:e}){e("talkBefore",async({lastUserMessage:n,messages:r})=>{t.print("Send:",{color:"green"}),o.detail?t.print(`
|
|
2
|
+
`+JSON.stringify(r,null,4)):t.print(`
|
|
3
|
+
`+n)}),e("talkAfter",async({parseText:n})=>{t.print("Receive:",{color:"cyan"}),t.print(`
|
|
4
|
+
`+n)}),e("succeeded",async({output:n})=>{t.print("Output:",{color:"yellow"});try{t.print(`
|
|
5
|
+
`+JSON.stringify(n,null,4))}catch{t.print(`
|
|
6
|
+
`+n)}})}});import{Event as bt,flow as _t,Schedule as Tt}from"power-helper";var F={limit:3,interval:6e4},y={event:new bt,schedule:null,waitTimes:[],waitQueue:[]},L={event:y.event,config:F,closeSchedule:()=>{y.schedule&&(y.schedule.close(),y.schedule=null)},plugin:new x({name:"limiter",params:()=>({}),receiveData:()=>({}),onInstall({attach:o}){y.schedule==null&&(y.schedule=new Tt,y.schedule.add("calc queue",1e3,async()=>{let t=Date.now();if(y.waitTimes=y.waitTimes.filter(e=>t-e<F.interval),y.waitTimes.length!==F.limit){let e=y.waitQueue.shift();e&&(y.waitTimes.push(Date.now()),y.event.emit("run",{id:e}))}else y.waitTimes[0]&&y.event.emit("waitTimeChange",{waitTime:Math.floor(60-(t-y.waitTimes[0])/1e3)})}),y.schedule.play()),o("talkBefore",async()=>{let t=_t.createUuid();return y.waitQueue.push(t),new Promise(e=>{y.event.on("run",({id:n},{off:r})=>{n===t&&(r(),e())})})})}})};var gt=new x({name:"role",params:o=>({role:o.string()}),receiveData:()=>({}),onInstall({attach:o,params:t}){o("start",async({messages:e,changeMessages:n})=>{n([{role:"user",content:`\u4F60\u73FE\u5728\u662F${t.role}\u3002`},{role:"assistant",content:`\u6C92\u554F\u984C\uFF0C\u6211\u73FE\u5728\u662F${t.role}\uFF0C\u6709\u4EC0\u9EBC\u53EF\u4EE5\u5E6B\u4F60\u7684\u55CE\uFF1F`},...e])})}});var St=pt,At=ct,Pt=L.plugin,vt=L,wt=gt;var dt={};D(dt,{requireJsonResponse:()=>mt,requireJsonResponseWithHandlebars:()=>Rt,requireJsonResponseWithJsonSchema:()=>jt});import Mt from"handlebars";import{record as Ot}from"power-helper";var mt=(o,t)=>[...Array.isArray(o)?o:[o],"Please respond using the following JSON format and minify the JSON without including any explanation: ","{",Object.entries(t).map(([e,n])=>[`/* ${n.desc} */`,`"${e}": ${JSON.stringify(n.example)}`].join(`
|
|
7
7
|
`)).join(`,
|
|
8
8
|
`),"}"].join(`
|
|
9
|
-
`),
|
|
10
|
-
`);var
|
|
11
|
-
`):r}}getValidate(){return{input:this.params.input,output:this.params.output}}changeOutputSchema(
|
|
12
|
-
`):
|
|
13
|
-
`):
|
|
14
|
-
`):
|
|
15
|
-
`)
|
|
16
|
-
`)
|
|
9
|
+
`),Rt=(o,t,e)=>{let n=Mt.create();return n.registerHelper("DATA",function(r){return JSON.stringify(r)}),n.registerHelper("ENV",function(r){return this.__envs&&r?this.__envs[r]:""}),n.registerHelper("INPUT",function(){return JSON.stringify(Ot.omit(this,["__envs"]))}),n.registerHelper("JOIN",function(r){return Array.isArray(r)?r.join():JSON.stringify(r)}),n.compile(mt(t,e))(o)},jt=(o,t)=>[...Array.isArray(o)?o:[o],"Please provide JSON data according to the following JSON Schema format:",JSON.stringify(t)].join(`
|
|
10
|
+
`);var yt={};D(yt,{s2t:()=>A,t2s:()=>S});import{Converter as ht}from"opencc-js";var S=o=>ht({from:"tw",to:"cn"})(o),A=o=>ht({from:"cn",to:"tw"})(o);import It from"json5";var O=class o{constructor(t){i(this,"params");this.params=t}static JsonMessage(){return new o({name:"JsonMessage",handler:async t=>{try{return JSON.parse(t)}catch{let n=/{(?:[^{}]|(?:{[^{}]*}))*}/,r=t.match(n)?.[0]||"";return It.parse(r)}}})}get name(){return this.params.name}async read(t){return await this.params.handler(t)}};import{Event as Et,flow as Q,Hook as Bt,Log as Vt}from"power-helper";import{z as X,toJSONSchema as Gt}from"zod";function Z(o,t){return X.object(t(X)).parse(o||{})}function f(o){let t=Gt(X.object(o()));return delete t.$schema,t}var P=class{constructor(t,e){i(this,"isParserError",!0);i(this,"parserFails",[]);i(this,"error");this.error=t,this.parserFails=e}};var R=class{constructor(t){i(this,"params");this.params=t}get __schemeType(){return null}get __outputType(){return null}async compile(t,e){let n=this.params.input?Z(t,this.params.input):t,r=this.params.question?await this.params.question(n,e):"";return{scheme:n,prompt:Array.isArray(r)?r.join(`
|
|
11
|
+
`):r}}getValidate(){return{input:this.params.input,output:this.params.output}}changeOutputSchema(t){this.params.output=t}async parse(t){let e,n="",r=[];for(let s of this.params.parsers)try{e=await s.read(t),n=s.name}catch(a){e=void 0,r.push({name:s.name,error:a})}try{return{output:Z(e,this.params.output),parserName:n,parserFails:r}}catch(s){throw new P(s,r)}}};import{z as ft}from"zod";var j=class{constructor(t){i(this,"__hookType");i(this,"log");i(this,"hook",new Bt);i(this,"params");i(this,"plugins",{});i(this,"installed",!1);i(this,"translator");i(this,"event",new Et);this.log=new Vt(t.name??"no name"),this.params=t,this.translator=new R({...t,parsers:[O.JsonMessage()]})}_install(){if(this.installed===!1){this.installed=!0;let t={log:this.log,attach:this.hook.attach.bind(this.hook),attachAfter:this.hook.attachAfter.bind(this.hook),translator:this.translator};if(this.params.plugins){this.plugins=typeof this.params.plugins=="function"?this.params.plugins():this.params.plugins;for(let e in this.plugins)this.plugins[e].instance._params.onInstall({...t,params:this.plugins[e].params,receive:this.plugins[e].receive})}this.params.install?.(t)}}async cancel(t){t?this.event.emit("cancel",{requestId:t}):this.event.emit("cancelAll",{})}requestWithId(t){this._install();let e=Q.createUuid(),n=null,r=!1,s=!1,a=new AbortController,c=[this.event.on("cancel",({requestId:d})=>{d===e&&p()}),this.event.on("cancelAll",()=>{p()})],l=()=>c.forEach(d=>d.off()),p=()=>{r===!1&&(s&&n&&n(),a.abort(),r=!0,l())},m=d=>{n=()=>{d()}},u=async()=>{let d=this.translator.getValidate(),h=null,at={},b=new Map,ot=await this.translator.compile(t,{schema:d}),it=[],k=[];ot.prompt&&k.push({role:"user",content:ot.prompt});for(let C in this.plugins)at[C]={send:_=>this.plugins[C].send({id:e,data:_})};return await this.hook.notify("start",{id:e,data:t,schema:d,plugins:at,messages:k,metadata:b,setPreMessages:C=>{it=C.map(_=>({..._,content:Array.isArray(_.content)?_.content.join(`
|
|
12
|
+
`):_.content}))},changeMessages:C=>{k=C},changeOutputSchema:C=>{this.translator.changeOutputSchema(C),d=this.translator.getValidate()}}),k=[...it,...k],await Q.asyncWhile(async({count:C,doBreak:_})=>{if(C>=99)return _();let E="",B="",z=!1,H=k.filter(T=>T.role==="user").slice(-1)[0]?.content||"";try{await this.hook.notify("talkBefore",{id:e,data:t,messages:k,metadata:b,lastUserMessage:H});let T=this.params.request(k,{id:e,count:C,schema:d,onCancel:m,metadata:b,abortController:a,isRetry:z});if(r)n&&n(),a.abort();else try{s=!0,E=await T,B=E}finally{s=!1}r===!1&&(await this.hook.notify("talkAfter",{id:e,data:t,response:E,messages:k,parseText:B,metadata:b,lastUserMessage:H,parseFail:M=>{throw new P(M,[])},changeParseText:M=>{B=M}}),h=(await this.translator.parse(B)).output,await this.hook.notify("succeeded",{id:e,output:h,metadata:b})),await this.hook.notify("done",{id:e,metadata:b}),_()}catch(T){if(T instanceof P){if(await this.hook.notify("parseFailed",{id:e,error:T.error,count:C,response:E,messages:k,metadata:b,lastUserMessage:H,parserFails:T.parserFails,retry:()=>{z=!0},changeMessages:M=>{k=M}}),z===!1)throw await this.hook.notify("done",{id:e,metadata:b}),T}else throw await this.hook.notify("done",{id:e,metadata:b}),T}}),h};return{id:e,request:(async()=>{try{return await u()}finally{l()}})()}}async request(t){let{request:e}=this.requestWithId(t);return await e}async getPreRequestInfo(t){this._install();let e=Q.createUuid(),n=this.translator.getValidate(),r={},s=new Map,a=await this.translator.compile(t,{schema:n}),c=[],l=[];return a.prompt&&l.push({role:"user",content:a.prompt}),await this.hook.notify("start",{id:e,data:t,schema:n,plugins:r,messages:l,metadata:s,setPreMessages:m=>{c=m.map(u=>({...u,content:Array.isArray(u.content)?u.content.join(`
|
|
13
|
+
`):u.content}))},changeMessages:m=>{l=m},changeOutputSchema:m=>{this.translator.changeOutputSchema(m),n=this.translator.getValidate()}}),{outputSchema:n.output(ft),outputJsonSchema:f(()=>n.output(ft)),requestMessages:[...c,...l]}}};import*as Jt from"zod";var Y=class{constructor(t){i(this,"params");this.params=t}createBrokerBuilder(t){return{create:e=>new j({output:()=>({}),install:n=>{t?.install?.(n),n.attach("start",async({id:r,plugins:s,data:a,metadata:c,changeMessages:l,changeOutputSchema:p})=>{let m=await e({id:r,data:a,plugins:s,zod:Jt,setMessages:u=>{l(u.map(g=>({role:g.role,content:Array.isArray(g.content)?g.content.join(`
|
|
14
|
+
`):g.content,contents:g.contents})))},metadata:c});p(()=>m)})},plugins:this.params.plugins?()=>this.params.plugins():void 0,request:this.params.request})}}};var I=o=>{let t=[],e="",n=0,r=!1,s=!1,a=!1;for(let c=0;c<o.length;c++){let l=o[c];if(s){s=!1,a&&(e+=l);continue}if(l==="\\"){s=!0,a&&(e+=l);continue}if(l==='"'){r=!r,a&&(e+=l);continue}if(r)a&&(e+=l);else if(l==="{")n===0?(a=!0,e="{"):e+=l,n++;else if(l==="}"){if(n--,e+=l,n===0&&a){let p=e.trim();if(p)try{t.push(JSON.parse(p))}catch{}e="",a=!1}}else a&&(e+=l)}return{items:t,lastChunk:a?e.trim():""}};var qt=o=>typeof o=="string"?o:o.join(`
|
|
15
|
+
`);import Kt from"axios";var V=class{constructor(t){i(this,"openai");i(this,"config",{model:"gpt-5",maxTokens:void 0,temperature:.7});this.openai=t}setConfig(t){Object.assign(this.config,t)}async view(t){let e=await this.openai._axios.post(`${this.openai._baseUrl}/v1/chat/completions`,{model:this.config.model,n:1,messages:t,max_tokens:this.config.maxTokens,temperature:this.config.temperature},{headers:{"Content-Type":"application/json",Authorization:`Bearer ${this.openai._apiKey}`}}),r=(e.data.choices||[])[0]?.message||{role:"assistant",content:""};return{id:e?.data.id,text:r.content,apiResponse:e.data}}};import{json as Nt}from"power-helper";var v=class o{constructor(t){i(this,"openai");i(this,"config",{model:"gpt-5",temperature:1,maxTokens:void 0});this.openai=t}static toApiMessages(t){return t.map(e=>{let n=[];if(e.content&&n.push({type:"input_text",text:e.content}),e.contents){for(let r of e.contents)if(r.type==="text")n.push({type:"input_text",text:r.content});else if(r.type==="image"){let s=r.content||"";n.push({type:"input_image",image_url:s})}}return{role:e.role,name:e.name,content:n}})}setConfig(t){Object.assign(this.config,t)}async moderations(t){let e=await this.openai._axios.post(`${this.openai._baseUrl}/v1/moderations`,{input:t},{headers:{"Content-Type":"application/json",Authorization:`Bearer ${this.openai._apiKey}`}});return{isSafe:e.data.results?.[0]?.flagged===!1,result:e.data}}async talk(t=[],e){let n=Nt.jpjs(t),r;e?.jsonSchema&&(r={type:"json_schema",schema:e.jsonSchema.schema});let s=await this.openai._axios.post(`${this.openai._baseUrl}/v1/responses`,{model:this.config.model,input:o.toApiMessages(n),temperature:this.config.temperature,max_output_tokens:this.config.maxTokens,reasoning:this.config.reasoning,text:r==null?void 0:{format:{...r,name:"response_format"}}},{signal:e?.abortController?.signal,headers:{"Content-Type":"application/json",Authorization:`Bearer ${this.openai._apiKey}`}}),a=s.data.output.find(p=>p.type==="message")?.content?.find(p=>p.type==="output_text"),c=s.data.output.find(p=>p.type==="reasoning")?.summary?.find(p=>p.type==="summary_text"),l={role:"assistant",content:a?.text||""};return n.push(l),{id:s?.data.id,text:l.content,newMessages:n,reasoningText:c?.text,apiResponse:s.data}}talkStream(t){let e=!1,n=!1,r=new AbortController,s=()=>{e||(e=!0,t.onEnd({isManualCancelled:n}))};return fetch(`${this.openai._baseUrl}/v1/responses`,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${this.openai._apiKey}`},body:JSON.stringify({model:this.config.model,stream:!0,input:t.messages,max_output_tokens:this.config.maxTokens,reasoning:this.config.reasoning}),signal:r.signal}).then(async a=>{if(a.ok===!1)throw new Error(`HTTP error! status: ${a.status}`);let c="",l=a.body?.pipeThrough(new TextDecoderStream).getReader();if(!l)throw new Error("Can not get reader");for(;;){let{value:p,done:m}=await l.read();if(m){s();break}let u=p.split(`
|
|
16
|
+
`).map(g=>g.startsWith("data:")?g.slice(5).trim():c&&!g.startsWith("event:")?c+g.trim():"");for(let g of u){if(!g)continue;let d=I(g);for(let h of d.items)h.type==="response.reasoning_summary_text.delta"&&t.onThinking&&t.onThinking(h.delta||""),h.type==="response.output_text.delta"&&t.onMessage(h.delta||""),h.type==="response.completed"&&s();c=d.lastChunk}}}).catch(a=>{a.name==="AbortError"?s():t.onError(a)}),{isManualCancelled:()=>n,cancel:()=>{n=!0,r.abort()}}}async keepTalk(t,e=[]){let n=await this.talk([...e,{role:"user",content:Array.isArray(t)?t.join(`
|
|
17
|
+
`):t}]);return{result:n,nextTalk:r=>this.keepTalk(r,n.newMessages)}}};var J=class{constructor(t){i(this,"openai");i(this,"config",{model:"dall-e-2",size:"1024x1024"});this.openai=t}setConfig(t){Object.assign(this.config,t)}async create(t){return(await this.openai._axios.post(`${this.openai._baseUrl}/v1/images/generations`,{prompt:t,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 tt=class o{constructor(t=""){i(this,"_axios",Kt.create());i(this,"_apiKey","");i(this,"_baseUrl","https://api.openai.com");this._apiKey=t}static createChatRequest(t,e={},n){return async(r,{abortController:s})=>{let a=new o(typeof t=="string"?t:await t()),c=a.createChat();n&&(n.axios&&a.setAxios(n.axios),n.baseUrl&&a.setBaseUrl(n.baseUrl)),c.setConfig(typeof e=="function"?await e():e);let{text:l}=await c.talk(r,{abortController:s});return l}}static createChatRequestWithJsonSchema(t){return async(e,{schema:n,onCancel:r})=>{let s=new o(typeof t.apiKey=="string"?t.apiKey:await t.apiKey()),a=s.createChat(),c=new AbortController;t.config&&a.setConfig(typeof t.config=="function"?await t.config():t.config),t.axios&&s.setAxios(t.axios),r(()=>c.abort());let l=f(n.output),{text:p}=await a.talk(e,{abortController:c,jsonSchema:{name:"data",strict:!0,schema:l}});return p}}setAxios(t){this._axios=t}setBaseUrl(t){this._baseUrl=t}setConfiguration(t){this._apiKey=t}createChat(){return new v(this)}createVision(){return new V(this)}createImagesGeneration(){return new J(this)}};import Wt from"axios";import{flow as Ut,Once as $t}from"power-helper";import{Template as Ct}from"@huggingface/jinja";var w=class{constructor(t){i(this,"isManualCancelled",!1);i(this,"core");i(this,"streamAbortControllers",[]);this.core=t}createAbortController(){let t=new AbortController,e=Ut.createUuid();return this.streamAbortControllers.push({id:e,controller:t}),{signal:t.signal,controllerId:e}}removeAbortController(t){this.streamAbortControllers=this.streamAbortControllers.filter(e=>e.id!==t)}async stream(t){let{signal:e,controllerId:n}=this.createAbortController(),r=()=>{this.removeAbortController(n),t.onEnd()},s=async a=>{if(a.body){let c=a.body.getReader(),l=!1,p="";for(;!l;){let{value:m,done:u}=await c.read();if(m){p+=new TextDecoder("utf-8").decode(m);let g=p.split(`
|
|
17
18
|
|
|
18
|
-
`);g
|
|
19
|
-
`)}
|
|
20
|
-
`)
|
|
21
|
-
`)
|
|
19
|
+
`);p=g.pop()||"",g.forEach(d=>{if(d.includes("[DONE]")&&(l=!0),d.startsWith("data:"))try{let h=JSON.parse(d.replace("data: ",""));t.onMessage(h)}catch(h){t.onWarn(h)}})}u&&(l=!0)}r()}else t.onError(new Error("Body not found."))};fetch(`${this.core.config.baseUrl}/${t.path}`,{method:"POST",body:JSON.stringify(typeof t.data=="function"?await t.data():t.data),signal:e,headers:{"Content-Type":"application/json",...this.core.config.headers}}).then(s).catch(a=>{a instanceof Error&&a.message.includes("The user aborted a request")?r():t.onError(a)})}async fetch(t){let{signal:e,controllerId:n}=this.createAbortController();try{return{data:(await this.core.core._axios.post(`${this.core.config.baseUrl}/${t.path}`,t.data,{signal:e,headers:{"Content-Type":"application/json",...this.core.config.headers}})).data}}finally{this.removeAbortController(n)}}cancel(){this.isManualCancelled=!0,this.streamAbortControllers.forEach(t=>t.controller.abort()),this.streamAbortControllers=[]}export(){return{cancel:this.cancel.bind(this)}}},q=class{constructor(t){i(this,"getProp",new $t({handler:async()=>{let t=`${this.config.baseUrl}/props`,{data:e}=await this.core._axios.get(t,{});return e}}));i(this,"core");i(this,"config",{baseUrl:"",headers:{},autoConvertTraditionalChinese:!0});this.core=t}setConfig(t){this.config={...this.config,...t}}completion(t){let e=t.messages.at(-1)||"",n=new w(this);return{...n.export(),run:async()=>{let r=await this.getProp.run(),a=new Ct(r.chat_template).render({bos_token:r.bos_token,messages:t.messages}).slice(0,r.eos_token.length*-1-1),c=await n.fetch({path:"completion",data:{...t.options||{},prompt:this.config.autoConvertTraditionalChinese?S(a):a}}),l=this.config.autoConvertTraditionalChinese?A(c.data.content):c.data.content;return{message:l,fullMessage:`${e}${l}`}}}}completionStream(t){let e=new w(this);return e.stream({path:"completion",onEnd:()=>{t.onEnd&&t.onEnd({isManualCancelled:e.isManualCancelled})},onMessage:n=>{let r=this.config.autoConvertTraditionalChinese?A(n.content):n.content;t.onMessage(r)},onWarn:t.onWarn||(()=>null),onError:t.onError||(()=>null),data:async()=>{let n=await this.getProp.run(),s=new Ct(n.chat_template).render({bos_token:n.bos_token,messages:t.messages}).slice(0,n.eos_token.length*-1-1);return{...t.options||{},prompt:this.config.autoConvertTraditionalChinese?S(s):s,stream:!0}}}),e.export()}talk(t){let e=new w(this);return{...e.export(),run:async()=>{let r=(await e.fetch({path:"v1/chat/completions",data:{...t.options||{},response_format:t.response_format,messages:t.messages.map(s=>{let a={role:s.role,content:""};return s.content&&(a.content=this.config.autoConvertTraditionalChinese?S(s.content):s.content),s.contents&&(a.content+=s.contents.map(c=>c.type==="text"?c.content:"").join(`
|
|
20
|
+
`)),a})}})).data.choices[0].message.content||"";return{message:this.config.autoConvertTraditionalChinese?A(r):r}}}}talkStream(t){let e=new w(this);return e.stream({path:"v1/chat/completions",onEnd:()=>{t.onEnd&&t.onEnd({isManualCancelled:e.isManualCancelled})},onMessage:n=>{let r=n.choices[0].delta.content;if(r){let s=this.config.autoConvertTraditionalChinese?A(r):r;t.onMessage(s)}},onWarn:t.onWarn||(()=>null),onError:t.onError||(()=>null),data:{...t.options||{},stream:!0,messages:t.messages.map(n=>({role:n.role,content:this.config.autoConvertTraditionalChinese?S(n.content):n.content}))}}),e.export()}};var et=class o{constructor(){i(this,"_axios",Wt.create())}static createChatRequestWithJsonSchema(t){return async(e,{schema:n,onCancel:r})=>{let s=new o,a=s.createCompletion(),c=typeof t.config=="function"?await t.config():t.config;a.setConfig(c);let l=f(n.output);t.axios&&s.setAxios(t.axios),a.config.autoConvertTraditionalChinese&&(l=JSON.parse(S(JSON.stringify(l))));let{run:p,cancel:m}=a.talk({options:t.talkOptions,messages:e,response_format:{type:"json_object",schema:l}});r(m);let{message:u}=await p();return a.config.autoConvertTraditionalChinese?A(u):u}}setAxios(t){this._axios=t}createCompletion(){return new q(this)}};import{json as zt}from"power-helper";var G=class o{constructor(t){i(this,"google");i(this,"config",{model:"gemini-3-flash-preview",maxTokens:1024,temperature:.7,enableGoogleSearch:!1,thinkingConfig:{enabled:!1,level:"THINKING_LEVEL_UNSPECIFIED"}});this.google=t}setConfig(t){Object.assign(this.config,t)}static getThinkingConfig(t){if(t)return t.enabled?{includeThoughts:!0,thinkingLevel:t.level}:void 0}async talk(t){let e=zt.jpjs(t.messages),r=(await this.google.googleGenAI.models.generateContent({model:this.config.model,contents:e,config:{temperature:this.config.temperature,maxOutputTokens:this.config.maxTokens,systemInstruction:t.system||void 0,thinkingConfig:o.getThinkingConfig(this.config.thinkingConfig),tools:this.config.enableGoogleSearch?[{googleSearch:{}}]:[]}})).text;return{text:r,newMessages:[...e,{role:"model",parts:[{text:r}]}]}}talkStream(t){let e={isManualCancelled:!1,controller:new AbortController};return this.google.googleGenAI.models.generateContentStream({model:this.config.model,contents:t.messages,config:{abortSignal:e.controller.signal,temperature:this.config.temperature,maxOutputTokens:this.config.maxTokens,systemInstruction:t.system||void 0,thinkingConfig:o.getThinkingConfig(this.config.thinkingConfig),tools:this.config.enableGoogleSearch?[{googleSearch:{}}]:[]}}).then(async r=>{try{for await(let s of r){let a=s.candidates?.[0].content?.parts||[];for(let c of a)c.text&&(c.thought?t.onThinking?.(c.text):t.onMessage(c.text))}t.onEnd({isManualCancelled:e.isManualCancelled})}catch(s){if(e.controller.signal.aborted)t.onEnd({isManualCancelled:e.isManualCancelled});else throw s}}).catch(r=>{t.onError(r)}),{isManualCancelled:()=>e.isManualCancelled,cancel:()=>{e.isManualCancelled=!0,e.controller.abort()}}}};var N=class{constructor(t){i(this,"google");i(this,"config",{model:"imagen-4.0-generate-001",size:"1K",aspectRatio:"1:1"});this.google=t}setConfig(t){Object.assign(this.config,t)}async create(t){return{images:(await this.google.googleGenAI.models.generateImages({model:this.config.model,prompt:t,config:{numberOfImages:1,aspectRatio:this.config.aspectRatio,imageSize:this.config.size}})).generatedImages?.map(n=>({url:n.image?.imageBytes||"",mimeType:n.image?.mimeType||""}))||[]}}};var nt=class o{constructor(t){i(this,"googleGenAI");this.googleGenAI=t}static chatGPTMessageToGoogleChatMessage(t){let e=s=>typeof s=="string"?[{text:s}]:Array.isArray(s)?s.map(({type:a,image_url:c,text:l})=>{if(a==="image_url"||a==="input_image"){let p=(typeof c=="string"?c:c?.url)||"";if(p.startsWith("http"))return{fileData:{fileUri:p}};{let m=p.includes("data:image/png")?"image/png":"image/jpeg";return{inlineData:{data:p.split("base64,")[1]||"",mimeType:m}}}}else return{text:l||""}}):[],n="",r=t.map(s=>s.role==="system"?(typeof s.content=="string"&&(n=s.content),Array.isArray(s.content)&&(n=s.content.map(a=>(a.type==="text"||a.type==="input_text")&&a.text||"").join(`
|
|
21
|
+
`)),{role:"user",parts:[]}):s.role==="user"?{role:"user",parts:e(s.content)}:{role:"model",parts:e(s.content)});return{system:n,messages:r.filter(s=>s.parts.length>0)}}static createChatRequestWithJsonSchema(t){let e=t.googleGenAI,n=r=>(r.type==="object"?(delete r.additionalProperties,Object.keys(r.properties).forEach(s=>{n(r.properties[s])})):r.type==="array"&&n(r.items),r);return async(r,{schema:s,abortController:a})=>{let c=typeof t.config=="function"?await t.config():t.config,l=o.chatGPTMessageToGoogleChatMessage(v.toApiMessages(r));return(await e.models.generateContent({model:t.model,contents:l.messages,config:{abortSignal:a.signal,maxOutputTokens:c.maxTokens,temperature:c.temperature,systemInstruction:l.system||void 0,responseMimeType:"application/json",responseJsonSchema:f(s.output),thinkingConfig:G.getThinkingConfig(c.thinkingConfig)}})).text||""}}createChat(){return new G(this)}createImagesGeneration(){return new N(this)}};import{flow as Ht}from"power-helper";var K=class{constructor(t){i(this,"config");this.config=t}translateMessages(t){return{system:Ht.run(()=>{let e=t.find(r=>r.role==="system"),n="";if(e&&(e.content&&(n+=e.content),e.contents))for(let r of e.contents)r.type==="text"&&(n+=`
|
|
22
|
+
${r.content}`);return n}),messages:t.filter(e=>e.role!=="system").map(e=>{let n=[];if(e.content&&n.push({type:"text",text:e.content}),e.contents)for(let r of e.contents)r.type==="text"&&n.push({type:"text",text:r.content}),r.type==="image"&&(r.content.startsWith("http")?n.push({type:"image",source:{type:"url",url:r.content}}):n.push({type:"image",source:{type:"base64",media_type:"image/png",data:r.content.split(",")[1]}}));return{role:e.role,content:n}})}}getThinkingParams(){let t=this.config(),e=Math.floor(t.maxTokens*.25);return t.thinking?{budget_tokens:e<=1024?1024:e>32e3?32e3:e,type:"enabled"}:void 0}createChatAndStructureBody(t,e){let n=this.config(),r=this.translateMessages(t);return{model:n.model,max_tokens:n.maxTokens,temperature:n.temperature,system:r.system,messages:r.messages,tools:[{name:"data",description:"Response Data",input_schema:e}],tool_choice:{type:"tool",name:"data"}}}parseChatAndStructureResult(t){let n=("content"in t?t.content.find(r=>r.type==="tool_use"):null)?.input||null;return n==null?"null":JSON.stringify(n)}createTalkBody(t){let e=this.config(),n=this.translateMessages(t);return{model:e.model,max_tokens:e.maxTokens,temperature:e.thinking?1:e.temperature,system:n.system,messages:n.messages,thinking:this.getThinkingParams()}}parseTalkResult(t){let e=[];if("content"in t)for(let n of t.content)n.type==="text"&&e.push(n.text);return e.join(`
|
|
23
|
+
`)}parseTalkThingsResult(t){let e=[];if("content"in t)for(let n of t.content)n.type==="thinking"&&e.push(n.thinking);return e}createTalkStreamBody(t){let e=this.config(),n=this.translateMessages(t);return{model:e.model,max_tokens:e.maxTokens,temperature:e.thinking?1:e.temperature,system:n.system,stream:!0,thinking:this.getThinkingParams(),messages:n.messages}}},U=class{constructor(t){i(this,"anthropic");i(this,"dataGenerator",new K(()=>this.config));i(this,"config",{model:"claude-3-5-haiku-latest",thinking:!1,maxTokens:8192,temperature:.7});this.anthropic=t}setConfig(t){Object.assign(this.config,t)}async chatAndStructure(t,e,n){let r=this.anthropic.anthropicSdk,s=this.dataGenerator.createChatAndStructureBody(t,e),a=await r.messages.create(s,{signal:n?.abortController?.signal});return this.dataGenerator.parseChatAndStructureResult(a)}async chatAndStructureWithDetails(t,e,n){let r=this.anthropic.anthropicSdk,s=this.dataGenerator.createChatAndStructureBody(t,e),a=await r.messages.create(s,{signal:n?.abortController?.signal});return{data:this.dataGenerator.parseChatAndStructureResult(a),thinking:this.dataGenerator.parseTalkThingsResult(a)}}async talk(t=[]){let e=this.anthropic.anthropicSdk,n=this.dataGenerator.createTalkBody(t),r=await e.messages.create(n);return this.dataGenerator.parseTalkResult(r)}async talkAndDetails(t=[]){let e=this.anthropic.anthropicSdk,n=this.dataGenerator.createTalkBody(t),r=await e.messages.create(n);return{text:this.dataGenerator.parseTalkResult(r),thinking:this.dataGenerator.parseTalkThingsResult(r)}}talkStream(t){let e=!1,n=null,{onThinking:r,onMessage:s,onEnd:a,onError:c}=t,l=this.anthropic.anthropicSdk,p=this.dataGenerator.createTalkStreamBody(t.messages);return(async()=>{try{let u=await l.messages.create(p);if(u!=null&&"controller"in u){n=u;for await(let g of n)g.type==="content_block_delta"&&(g.delta.type==="thinking_delta"&&r&&r(g.delta.thinking),g.delta.type==="text_delta"&&s(g.delta.text))}a({isManualCancelled:e})}catch(u){c(u)}})(),{isManualCancelled:()=>e,cancel:()=>{e=!0;let u=setInterval(()=>{n&&n.controller&&(n.controller.abort(),clearInterval(u))},10)}}}};var rt=class o{constructor(t){i(this,"anthropicSdk");this.anthropicSdk=t}static chatGPTMessageToAnthropicChatMessage(t){return t.map(n=>({role:n.role,content:typeof n.content=="string"?n.content:n.content.map(r=>{if(r.type==="image_url"){let s=r.image_url?.url||"";return s.startsWith("http")?{type:"image",source:{type:s,url:s}}:{type:"image",source:{type:"base64",media_type:s.slice(5).split(";")[0],data:s.split(",")[1]}}}return{type:"text",text:r.text}})}))}static createChatRequestWithJsonSchema(t){let n=new o(t.anthropicSdk).createChat();return n.setConfig(t.config||{}),async(r,{schema:s,abortController:a})=>{let c=f(s.output);return await n.chatAndStructure(r,c,{abortController:a})}}createChat(){return new U(this)}};import Ft from"axios";import{json as Dt}from"power-helper";var $=class o{constructor(t){i(this,"xAi");i(this,"config",{model:"grok-4-1-fast-non-reasoning",temperature:1,maxTokens:void 0});this.xAi=t}static toApiMessages(t){return t.map(e=>{let n=[];if(e.content&&n.push({type:"input_text",text:e.content}),e.contents){for(let r of e.contents)if(r.type==="text")n.push({type:"input_text",text:r.content});else if(r.type==="image"){let s=r.content||"";n.push({type:"input_image",image_url:s})}}return{role:e.role,name:e.name,content:n}})}setConfig(t){Object.assign(this.config,t)}async talk(t=[],e){let n=Dt.jpjs(t),r;e?.jsonSchema&&(r={type:"json_schema",schema:e.jsonSchema.schema});let s=await this.xAi._axios.post("https://api.x.ai/v1/responses",{model:this.config.model,input:o.toApiMessages(n),temperature:this.config.temperature,max_output_tokens:this.config.maxTokens,reasoning:this.config.reasoning,text:r==null?void 0:{format:{...r,name:"response_format"}}},{signal:e?.abortController?.signal,headers:{"Content-Type":"application/json",Authorization:`Bearer ${this.xAi._apiKey}`}}),a=s.data.output.find(p=>p.type==="message")?.content?.find(p=>p.type==="output_text"),c=s.data.output.find(p=>p.type==="reasoning")?.summary?.find(p=>p.type==="summary_text"),l={role:"assistant",content:a?.text||""};return n.push(l),{id:s?.data.id,text:l.content,newMessages:n,reasoningText:c?.text,apiResponse:s.data}}talkStream(t){let e=!1,n=!1,r=new AbortController,s=()=>{e||(e=!0,t.onEnd({isManualCancelled:n}))};return fetch("https://api.x.ai/v1/responses",{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${this.xAi._apiKey}`},body:JSON.stringify({model:this.config.model,stream:!0,input:t.messages,max_output_tokens:this.config.maxTokens,reasoning:this.config.reasoning}),signal:r.signal}).then(async a=>{if(a.ok===!1)throw new Error(`HTTP error! status: ${a.status}`);let c="",l=a.body?.pipeThrough(new TextDecoderStream).getReader();if(!l)throw new Error("Can not get reader");for(;;){let{value:p,done:m}=await l.read();if(m){s();break}let u=p.split(`
|
|
24
|
+
`).map(g=>g.startsWith("data:")?g.slice(5).trim():c&&!g.startsWith("event:")?c+g.trim():"");for(let g of u){if(!g)continue;let d=I(g);for(let h of d.items)h.type==="response.reasoning_summary_text.delta"&&t.onThinking&&t.onThinking(h.delta||""),h.type==="response.output_text.delta"&&t.onMessage(h.delta||""),h.type==="response.completed"&&s();c=d.lastChunk}}}).catch(a=>{a.name==="AbortError"?s():t.onError(a)}),{isManualCancelled:()=>n,cancel:()=>{n=!0,r.abort()}}}async keepTalk(t,e=[]){let n=await this.talk([...e,{role:"user",content:Array.isArray(t)?t.join(`
|
|
25
|
+
`):t}]);return{result:n,nextTalk:r=>this.keepTalk(r,n.newMessages)}}};var W=class{constructor(t){i(this,"xAi");i(this,"config",{model:"grok-2-image"});this.xAi=t}setConfig(t){Object.assign(this.config,t)}async create(t){return(await this.xAi._axios.post("https://api.x.ai/v1/images/generations",{prompt:t,n:1,model:this.config.model,response_format:"b64_json"},{timeout:3e5,headers:{"Content-Type":"application/json",Authorization:`Bearer ${this.xAi._apiKey}`}})).data}};var st=class o{constructor(t=""){i(this,"_axios",Ft.create());i(this,"_apiKey","");this._apiKey=t}static createChatRequest(t,e={},n){return async(r,{onCancel:s})=>{let a=new o(typeof t=="string"?t:await t()),c=a.createChat(),l=new AbortController;n&&n.axios&&a.setAxios(n.axios),c.setConfig(typeof e=="function"?await e():e),s(()=>l.abort());let{text:p}=await c.talk(r,{abortController:l});return p}}static createChatRequestWithJsonSchema(t){return async(e,{schema:n,abortController:r})=>{let s=new o(typeof t.apiKey=="string"?t.apiKey:await t.apiKey()),a=s.createChat();t.config&&a.setConfig(typeof t.config=="function"?await t.config():t.config),t.axios&&s.setAxios(t.axios);let c=f(n.output),{text:l}=await a.talk(e,{abortController:r,jsonSchema:{name:"data",strict:!0,schema:c}});return l}}setAxios(t){this._axios=t}setConfiguration(t){this._apiKey=t}createChat(){return new $(this)}createImagesGeneration(){return new W(this)}};export{K as AnthropicChatDataGenerator,rt as AnthropicCtodService,j as ChatBroker,x as ChatBrokerPlugin,Y as CtoD,x as CtoDPlugin,nt as GoogleCtodService,et as LlamaCppCtodService,tt as OpenAICtodService,O as TextParser,R as Translator,st as XCtodService,yt as chineseConverter,qt as paragraph,I as parseJSONStream,ut as plugins,dt as templates,f as validateToJsonSchema};
|
|
22
26
|
//# sourceMappingURL=index.js.map
|