@onereach/step-create-chat-completion 0.0.7-rc.30 → 0.0.7-rc.31

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.mjs ADDED
@@ -0,0 +1,2 @@
1
+ var he=Object.defineProperty;var d=(n,e)=>he(n,"name",{value:e,configurable:!0}),Z=(n=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(n,{get:(e,t)=>(typeof require<"u"?require:e)[t]}):n)(function(n){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+n+'" is not supported')});import{install as Fe}from"source-map-support";import pe from"@onereach/flow-sdk/step.js";function H(n,e){function t(o,i,s,a){let c=n(o,i,s,a);if(typeof c=="function"){let f=a.value,_=c;if(f?.name!=null)try{Object.defineProperty(_,"name",{value:f.name})}catch{}return a.value=_,a}return c??a}return d(t,"runApply"),d(function(i,s,a){if(i!==null&&typeof i=="object"&&(typeof s=="string"||typeof s=="symbol")&&a!==null&&typeof a=="object")return t(e,i,s,a);{let c=i??e;return(f,_,m)=>t(c,f,_,m)}},"decoratorOrFactory")}d(H,"createMethodDecoratorWithOptionalArguments");import Y from"@onereach/flow-sdk/errors/timeout";import{z as ee}from"zod/v4-mini";import X from"@onereach/flow-sdk/errors/base";var u={UNKNOWN:"UNKNOWN",STEP_LOGIC_ISSUE:"STEP_LOGIC_ISSUE",AUTH:"AUTH",TIMEOUT:"TIMEOUT",VALIDATION:"VALIDATION",INVALID_REQUEST:"INVALID_REQUEST",RATE_LIMITED:"RATE_LIMITED",LLM_FINISH_LENGTH:"LLM_FINISH_LENGTH",SERVER_ERROR:"SERVER_ERROR",UNSUPPORTED:"UNSUPPORTED"},h=class extends X{static{d(this,"CreateChatCompletionStepError")}},B=class extends X{static{d(this,"AbortRequestError")}};function P(n){if(n instanceof h||n instanceof Y)return n;if(n instanceof ee.core.$ZodError)return new h(ee.prettifyError(n),n,{code:u.VALIDATION});if(n instanceof Error){if(n.message.includes("Request timed out"))return new Y("Timeout",n,{code:u.TIMEOUT});let e=n?.response?.data?.error?.message;if(e!=null)return new h(e,n,{code:u.SERVER_ERROR})}return typeof n=="string"?new h(n,{code:u.UNKNOWN}):n instanceof Error?new h("Unknown error",n,{code:u.UNKNOWN}):new h("Unknown error",{code:u.UNKNOWN,data:n})}d(P,"errorFilter");var ue={},p=H((n,e,t,o)=>{let i=o.value;if(!(!i||typeof i!="function"))return function(...s){try{let a=i.apply(this,s);return a instanceof Promise?a.catch(c=>{let f=t.toString();throw this.log.DEBUG?.(`Error in method '${f}'`,c),P(c)}):a}catch(a){let c=t.toString();throw this.log.DEBUG?.(`Error in method '${c}'`,a),P(a)}}},ue);function V(n,e,t,o){var i=arguments.length,s=i<3?e:o===null?o=Object.getOwnPropertyDescriptor(e,t):o,a;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")s=Reflect.decorate(n,e,t,o);else for(var c=n.length-1;c>=0;c--)(a=n[c])&&(s=(i<3?a(s):i>3?a(e,t,s):a(e,t))||s);return i>3&&s&&Object.defineProperty(e,t,s),s}d(V,"_ts_decorate");function I(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)}d(I,"_ts_metadata");var v=class extends pe{static{d(this,"HistoryController")}static class="hst_ctrl";static async start(e){let t=this.getThreadId(e);e.process.getThread(t)==null&&await e.thread.runThread({id:t,background:!0,state:{step:e.id,class:this.class,messages:[]}})}static async prepareHistory(e){await e.process.enqueueAndRun({thread:this.getThreadId(e),name:W.prepareHistory})}static async appendToHistory(e,t){await e.process.enqueueAndRun({thread:this.getThreadId(e),name:W.appendToHistory,params:{message:t}})}static getHistory(e){return e.process.getSafeThread(this.getThreadId(e)).state.messages}static getThreadId(e){return`llm_cmp_${this.class}_${e.id}`}runStep(){this.triggers.local(W.prepareHistory,this.onPrepareHistory).local(W.appendToHistory,this.onAppendToHistory).otherwise(()=>{this.log.DEBUG?.("Initializing history controller thread")})}onPrepareHistory(){this.log.DEBUG?.("Preparing history");let{customHistory:e,historyLength:t,systemMessage:o,typeOfStep:i,userMessage:s,historyMode:a,historyMergefield:c,historyCode:f,assistantsFirstMessage:_}=this.data;if(i==="completion"){this.state.messages=[{role:"user",content:s}];return}if(e){this.state.messages=a==="mergefield"?c:f;return}let m=this.state.messages;if(m.length===0&&_!=null&&_.length>0&&m.push({role:"assistant",content:_}),m.at(-1)?.role!=="tool"&&m.push({role:"user",content:s}),!m.some(S=>S.role==="tool")&&t!=null&&t>0&&(m=m.slice(-1*t)),o!=null&&o.length>0){let S={role:"system",content:o};m[0]?.role==="system"?m[0]=S:m.unshift(S)}this.state.messages=m}onAppendToHistory(e){this.log.DEBUG?.("Appending message to history",e.params);let{message:t}=e.params,o=Array.isArray(t)?t:[t];this.state.messages.push(...o)}};V([p,I("design:type",Function),I("design:paramtypes",[]),I("design:returntype",void 0)],v.prototype,"runStep",null);V([p,I("design:type",Function),I("design:paramtypes",[]),I("design:returntype",void 0)],v.prototype,"onPrepareHistory",null);V([p,I("design:type",Function),I("design:paramtypes",[typeof IEvent>"u"?Object:IEvent]),I("design:returntype",void 0)],v.prototype,"onAppendToHistory",null);var W={appendToHistory:"hst_append",prepareHistory:"hst_prepare"};import Se from"@onereach/flow-sdk/step.js";import ge from"@onereach/flow-sdk/step";import{ACTION as te}from"@onereach/flow-sdk/types";async function R(n,{id:e,state:t,local:o,...i},{force:s}={}){let a=n.process.getThread(e);if(n.log.DEBUG?.(`runThread: thread with id '${e}'`,i),a==null)return await n.thread.runThread({...i,id:e,background:!0,state:t,local:{...o,parent:n.thread.id,active:!0}});if(!s&&!a.ended&&a.local.active)throw new Error(`Thread with id '${e}' has not ended yet, cannot start it again`);if(t==null)throw new Error(`Thread with id '${e}' must have a state to run`);return a.local.active=!0,await a.enqueueAndRun({name:te.goto,state:{...t,active:!0}})}d(R,"runThread");function ne(n,e){let t=n.process.getThread(e);return!!(t!=null&&t.local.active&&!t.ended)}d(ne,"isThreadBusy");function fe(n,e=n.id){let t=[];for(let o in n.process.threads){let i=n.process.threads[o];i?.local.parent===e&&t.push(i)}return t}d(fe,"listChildThreads");async function j(n,e,{result:t,stopChildThreads:o}={}){let i=n.process.getThread(e);if(n.log.DEBUG?.(`stopThread: thread with id '${e}'`),!!i){if(o){let a=fe(i).map(async c=>await j(n,c.id,{stopChildThreads:o,result:t}));await Promise.allSettled(a)}i.local.active&&(i.local.active=!1,!i.ended&&await i.enqueueAndRun({name:te.ending,result:t}))}}d(j,"stopThread");function me(n,e,t,o){var i=arguments.length,s=i<3?e:o===null?o=Object.getOwnPropertyDescriptor(e,t):o,a;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")s=Reflect.decorate(n,e,t,o);else for(var c=n.length-1;c>=0;c--)(a=n[c])&&(s=(i<3?a(s):i>3?a(e,t,s):a(e,t))||s);return i>3&&s&&Object.defineProperty(e,t,s),s}d(me,"_ts_decorate");function J(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)}d(J,"_ts_metadata");var b=class extends ge{static{d(this,"StreamWorker")}static class="str_wrk";static async start(e,t){await R(e,{id:this.getThreadId(e),state:{step:e.id,class:this.class,event:t}})}static isBusy(e){return ne(e,this.getThreadId(e))}static getThreadId(e){return`llm_cmp_${this.class}_${e.id}`}runStep(){if(!("event"in this.state)||this.state.event==null)throw new h("Stream worker thread state must contain an event to process",{code:u.STEP_LOGIC_ISSUE});let e=this.state.event;this.log.DEBUG?.("Executing stream worker thread",e),this.exitStep(ye.chunk,{chunk:e})}};me([p,J("design:type",Function),J("design:paramtypes",[]),J("design:returntype",void 0)],b.prototype,"runStep",null);var ye={chunk:"chunk"};import{ACTION as Ee}from"@onereach/flow-sdk/types";var Te={allowHandleError:!0,useErrorFilter:!0},A=H((n,e,t,o)=>{let i=o.value;if(!(!i||typeof i!="function"))return function(...s){try{let a=i.apply(this,s);return a instanceof Promise?a.catch(c=>re.call(this,n,c,t)):a}catch(a){return re.call(this,n,a,t)}}},Te);function re(n,e,t){let o=t.toString();this.log.DEBUG?.(`Error in method '${o}'`,e);let i=n.useErrorFilter?P(e):e;if(i instanceof Error)if(n.allowHandleError){this.thread.enqueue({name:Ee.error,error:i});return}else{this.end(i);return}throw i}d(re,"errorHandler");import Ce from"@onereach/flow-sdk/step";import we from"@onereach/flow-sdk/step";function _e(n,e,t,o){var i=arguments.length,s=i<3?e:o===null?o=Object.getOwnPropertyDescriptor(e,t):o,a;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")s=Reflect.decorate(n,e,t,o);else for(var c=n.length-1;c>=0;c--)(a=n[c])&&(s=(i<3?a(s):i>3?a(e,t,s):a(e,t))||s);return i>3&&s&&Object.defineProperty(e,t,s),s}d(_e,"_ts_decorate");function Q(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)}d(Q,"_ts_metadata");var O=class extends we{static{d(this,"ToolsWorker")}static class="tl_wrk";static async start(e,t){let o=JSON.parse(t.function?.arguments);await R(e,{id:this.getThreadId(t),state:{step:e.id,class:this.class},local:{toolCall:t,parsedArguments:o}})}static getThreadId(e){return`llm_cmp_${this.class}_${e.id}`}runStep(){let{toolCall:e,parsedArguments:t}=this.local;this.log.DEBUG?.("Initializing tool worker thread",e),this.exitStep(this.getExitName(),{toolCall:{id:e.id,type:e.type,function:{name:e.function.name,arguments:t}}})}getExitName(){return"function"}};_e([p,Q("design:type",Function),Q("design:paramtypes",[]),Q("design:returntype",void 0)],O.prototype,"runStep",null);import{ACTION as ve}from"@onereach/flow-sdk/types";function F(n,e,t,o){var i=arguments.length,s=i<3?e:o===null?o=Object.getOwnPropertyDescriptor(e,t):o,a;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")s=Reflect.decorate(n,e,t,o);else for(var c=n.length-1;c>=0;c--)(a=n[c])&&(s=(i<3?a(s):i>3?a(e,t,s):a(e,t))||s);return i>3&&s&&Object.defineProperty(e,t,s),s}d(F,"_ts_decorate");function w(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)}d(w,"_ts_metadata");var y=class extends Ce{static{d(this,"ToolsController")}static class="tl_ctrl";static async start(e){let t=this.getThreadId(e);await R(e,{id:t,state:{step:e.id,class:this.class,tasks:{},expectMoreTasks:!0}})}static async callTool(e,t){await e.process.enqueueAndRun({thread:this.getThreadId(e),name:q.callTool,params:{toolCall:t}})}static async lastToolCallReceived(e){await e.process.enqueueAndRun({thread:this.getThreadId(e),name:q.lastToolCallReceived})}static async cancel(e){await j(e,this.getThreadId(e),{result:{status:"cancel"},stopChildThreads:!0})}static getThreadId(e){return`llm_cmp_${this.class}_${e.id}`}runStep(){this.triggers.local(q.callTool,this.onCallTool).local(q.lastToolCallReceived,this.onLastToolCallReceived).otherwise(this.initialize)}initialize(){this.log.DEBUG?.("Initializing tools controller thread"),this.validateMergeFieldType()}onCallTool(e){let{toolCall:t}=e.params;if(t.type!=="function")throw new h("Only function tools are supported at the moment",{code:u.UNSUPPORTED});this.state.tasks[t.id]={call:t,status:"pending"},this.startToolWorkerThread(t)}onLastToolCallReceived(){this.log.DEBUG?.("No more tool calls expected",this.state.tasks),this.state.expectMoreTasks=!1,this.tryEndToolsControllerThread()}startToolWorkerThread(e){this.triggers.hook({name:ve.end,thread:O.getThreadId(e)},this.onWorkerThreadEnd),O.start(this,e)}onWorkerThreadEnd(e){this.log.DEBUG?.("Tool caller worker thread has ended",e);let{result:t}=e.params;if(t==null)throw new h("Tool worker ended unexpectedly",{code:u.STEP_LOGIC_ISSUE});if(t instanceof Error)throw new h("Tool worker thread ended with error",t,{code:u.STEP_LOGIC_ISSUE});t.status!=="cancel"&&(this.log.DEBUG?.("Tool worker thread completed successfully",{toolCallId:t.toolCallId,result:t.data}),this.setToolCallResult(t.toolCallId,t.data),this.tryEndToolsControllerThread())}setToolCallResult(e,t){let o=this.state.tasks[e];if(o==null)throw new h(`Unknown tool call with id '${e}'`,{code:u.STEP_LOGIC_ISSUE});o.status="completed",o.result=t}tryEndToolsControllerThread(){this.state.expectMoreTasks||Object.values(this.state.tasks).some(t=>t.status==="pending")||(this.log.DEBUG?.("All tool calls completed or failed",this.state.tasks),this.end({status:"ok",messages:this.messages}))}get messages(){return Object.values(this.state.tasks).map(e=>({role:"tool",tool_call_id:e.call.id,content:JSON.stringify(e.result)}))}validateMergeFieldType(){let{functionsList:e}=this.data;if(!(!Array.isArray(e)||e.length===0)&&(this.dataOut==null||this.getMergeField(this.dataOut).type!=="thread"))throw new h('Merge-field type has to be "Thread" if you are using functions',{code:u.VALIDATION})}};F([p,w("design:type",Function),w("design:paramtypes",[]),w("design:returntype",void 0)],y.prototype,"runStep",null);F([p,w("design:type",Function),w("design:paramtypes",[]),w("design:returntype",void 0)],y.prototype,"initialize",null);F([p,w("design:type",Function),w("design:paramtypes",[typeof IEvent>"u"?Object:IEvent]),w("design:returntype",void 0)],y.prototype,"onCallTool",null);F([p,w("design:type",Function),w("design:paramtypes",[]),w("design:returntype",void 0)],y.prototype,"onLastToolCallReceived",null);F([A({allowHandleError:!1}),w("design:type",Function),w("design:paramtypes",[typeof IActionEvent>"u"?Object:IActionEvent]),w("design:returntype",void 0)],y.prototype,"onWorkerThreadEnd",null);var q={callTool:"tl_run_call",lastToolCallReceived:"tl_rsp_end"};import{z as l}from"zod/v4-mini";var oe=l.object({name:l.string(),params:l.object({chunk:l.object({id:l.string(),object:l.literal("chat.completion.chunk"),created:l.number(),model:l.string(),service_tier:l.optional(l.union([l.literal("default"),l.literal("auto"),l.literal("flex"),l.literal("scale"),l.literal("priority"),l.null()])),system_fingerprint:l.optional(l.string()),choices:l.array(l.object({index:l.number(),delta:l.object({role:l.optional(l.enum(["developer","system","user","assistant","tool"])),content:l.nullish(l.string()),refusal:l.nullish(l.string()),tool_calls:l.optional(l.array(l.object({index:l.number().check(l.int(),l.gte(0)),id:l.optional(l.string()),type:l.optional(l.literal("function")),function:l.object({name:l.optional(l.string()),arguments:l.optional(l.string())})})))}),logprobs:l.optional(l.any()),finish_reason:l.union([l.literal("stop"),l.literal("length"),l.literal("tool_calls"),l.literal("content_filter"),l.null()])})),logprobs:l.nullish(l.object({content:l.nullable(l.array(l.looseObject({}))),refusal:l.nullable(l.array(l.looseObject({})))})),usage:l.nullish(l.object({prompt_tokens:l.number(),completion_tokens:l.number(),total_tokens:l.number(),completion_tokens_details:l.optional(l.object({accepted_prediction_tokens:l.optional(l.number()),audio_tokens:l.optional(l.number()),reasoning_tokens:l.optional(l.number()),rejected_prediction_tokens:l.optional(l.number())})),prompt_tokens_details:l.optional(l.object({audio_tokens:l.optional(l.number()),cached_tokens:l.optional(l.number())}))}))})})});var $=class{static{d(this,"StreamReducerService")}_result;_onToolCall;constructor(e,t){this._result=e,this._onToolCall=t}reduceChunk(e){if(Object.keys(this._result).length===0){let{choices:t,...o}=e;Object.assign(this._result,o),this._result.object!=null&&(this._result.object="chat.completion")}e.usage&&(this._result.usage=e.usage);for(let t of e.choices){let o=this._result.choices?.[t.index];if(!o){let{delta:i,...s}=t;o=s,this._result.choices??=[],this._result.choices[t.index]=o}if(t.finish_reason!=null&&(o.finish_reason=t.finish_reason),t.logprobs!=null&&(o.logprobs=t.logprobs),t.delta?.content!=null){let{content:i,...s}=t.delta;o.message??=s,o.message.content??="",o.message.content+=i}if(t.delta?.tool_calls!=null){let{tool_calls:i,...s}=t.delta;o.message??=s,o.message.tool_calls??=[];for(let a of t.delta.tool_calls){let c=a.index;if(o.message.tool_calls[c]==null)o.message.tool_calls[c]=structuredClone(a);else{let f=o.message.tool_calls[c];if(!("function"in f)||f.function==null)continue;f.function.arguments+=a.function?.arguments??""}t.index===0&&this.tryParseToolCall(o.message.tool_calls[c])}}}}tryParseToolCall(e){try{if(!("function"in e)||e.function==null)return;let t=JSON.parse(e.function.arguments);this._onToolCall(e,t)}catch{}}};import{ACTION as Re}from"@onereach/flow-sdk/types/index.js";function G(n,e,t,o){var i=arguments.length,s=i<3?e:o===null?o=Object.getOwnPropertyDescriptor(e,t):o,a;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")s=Reflect.decorate(n,e,t,o);else for(var c=n.length-1;c>=0;c--)(a=n[c])&&(s=(i<3?a(s):i>3?a(e,t,s):a(e,t))||s);return i>3&&s&&Object.defineProperty(e,t,s),s}d(G,"_ts_decorate");function C(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)}d(C,"_ts_metadata");var T=class extends Se{static{d(this,"StreamController")}static class="str_ctrl";static async start(e){await R(e,{id:this.getThreadId(e),state:{step:e.id,class:this.class,completionResult:{},events:[],lastChunkReceived:!1,index:-1,skipIndexWarning:!1}})}static async handleChunk(e,t){await e.process.enqueueAndRun({thread:this.getThreadId(e),name:z.handleChunk,params:{chunk:t}})}static async lastChunkReceived(e){await e.process.enqueueAndRun({thread:this.getThreadId(e),name:z.lastStreamChunkReceived})}static async cancel(e){await j(e,this.getThreadId(e),{result:{status:"cancel"},stopChildThreads:!0})}static getThreadId(e){return`llm_cmp_${this.class}_${e.id}`}runStep(){this.triggers.hook({name:Re.end,thread:b.getThreadId(this)},this.onWorkerThreadEnd).local(z.handleChunk,this.onStreamChunk).local(z.lastStreamChunkReceived,this.onLastStreamChunkReceived).otherwise(()=>{this.log.DEBUG?.("Initializing stream controller thread")})}onWorkerThreadEnd(e){let{result:t}=e.params;if(this.log.DEBUG?.("Stream worker thread finished processing chunk",t),t instanceof Error)throw new h("Stream worker thread ended with an error",t,{code:u.UNKNOWN});t?.status!=="cancel"&&this.tryRunWorker()}onStreamChunk(e){let o=oe.parse(e).params.chunk;new $(this.state.completionResult,this.onToolCall.bind(this)).reduceChunk(o);for(let s of o.choices){if(this.log.DEBUG?.("LLM stream response chunk",s),s.index>0){this.handleMultipleChoices(s);continue}let a=s.delta?.content;a!=null&&a.length>0&&(this.addContentToQueue(a),this.scheduleNextContentEvent()),this.handleLengthFinishReason(s)}}handleMultipleChoices(e){this.state.skipIndexWarning||(this.log.WARN?.("Multiple choices received from LLM, but only the first one will be processed",{choiceIndex:e.index}),this.state.skipIndexWarning=!0)}handleLengthFinishReason(e){if(e.finish_reason==="length")throw new h("Reached limit of tokens for LLM completion response",{code:u.LLM_FINISH_LENGTH})}onToolCall(e){this.log.DEBUG?.("Tool call received",e),y.callTool(this,e)}scheduleNextContentEvent(){let e=this.state.events[0];e==null||!this.isEventReady(e)||"lastChunkReceived"in e||this.tryRunWorker()}addContentToQueue(e){let t=this.state.events.at(-1);if(t!=null){if("lastChunkReceived"in t){this.log.WARN?.("A new chunk received after the `lastChunkReceived` event. Ignoring it.");return}if(t.content.length<this.maxChunkContentLength){let o=`${t.content}${e}`;t.content=o.slice(0,this.maxChunkContentLength),this.log.DEBUG?.("Compacting response chunk into last queue event",t),e=o.slice(this.maxChunkContentLength)}}for(;e;){this.state.index+=1;let o={content:e.slice(0,this.maxChunkContentLength),index:this.state.index,ts:Date.now()};this.log.DEBUG?.("Add new event into the queue",o),this.state.events.push(o),e=e.slice(this.maxChunkContentLength)}}tryRunWorker(){if(b.isBusy(this)){this.log.DEBUG?.("Skip event processing. Worker thread is busy");return}let e=this.getEventToProcess();if(e!=null){if("lastChunkReceived"in e){this.log.DEBUG?.("Stopping controller thread. All response content chunks were processed and no new chunks are coming"),this.end({status:"ok",completion:this.state.completionResult});return}this.log.DEBUG?.("Notify stream worker thread about response chunk to process",e),b.start(this,e)}}isEventReady(e){if(e==null)return!1;if("lastChunkReceived"in e)return!0;if(e.content==null)return!1;let t=Date.now()-e.ts;return this.state.lastChunkReceived||t>=this.debounceDuration||e.content.length>=this.maxChunkContentLength}getEventToProcess(){let e=this.state.events[0];if(e!=null&&this.isEventReady(e))return"lastChunkReceived"in e||this.state.events.shift(),e}async onLastStreamChunkReceived(){this.log.DEBUG?.("All LLM response chunks were received. No more response chunks expected"),this.state.events.push({lastChunkReceived:!0}),this.state.lastChunkReceived=!0,this.tryRunWorker(),await y.lastToolCallReceived(this)}get maxChunkContentLength(){return this.data.streamSettings?.maxBufferLength??100}get debounceDuration(){return this.data.streamSettings?.debounceDuration??200}};G([p,C("design:type",Function),C("design:paramtypes",[]),C("design:returntype",void 0)],T.prototype,"runStep",null);G([A({allowHandleError:!1}),C("design:type",Function),C("design:paramtypes",[typeof IActionEvent>"u"?Object:IActionEvent]),C("design:returntype",void 0)],T.prototype,"onWorkerThreadEnd",null);G([p,C("design:type",Function),C("design:paramtypes",[typeof IEvent>"u"?Object:IEvent]),C("design:returntype",void 0)],T.prototype,"onStreamChunk",null);G([p,C("design:type",Function),C("design:paramtypes",[]),C("design:returntype",void 0)],T.prototype,"tryRunWorker",null);G([p,C("design:type",Function),C("design:paramtypes",[]),C("design:returntype",Promise)],T.prototype,"onLastStreamChunkReceived",null);var z={handleChunk:"add_chunk",lastStreamChunkReceived:"llm_rsp_end"};import be from"@onereach/flow-sdk/step";function se(n,e,t,o){var i=arguments.length,s=i<3?e:o===null?o=Object.getOwnPropertyDescriptor(e,t):o,a;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")s=Reflect.decorate(n,e,t,o);else for(var c=n.length-1;c>=0;c--)(a=n[c])&&(s=(i<3?a(s):i>3?a(e,t,s):a(e,t))||s);return i>3&&s&&Object.defineProperty(e,t,s),s}d(se,"_ts_decorate");function D(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)}d(D,"_ts_metadata");var x=class n extends be{static{d(this,"CancelController")}static class="cncl_ctrl";static async start(e){await R(e,{id:this.getThreadId(e),state:{step:e.id,class:this.class}},{force:!0})}static async stop(e){await j(e,this.getThreadId(e))}static getThreadId(e){return`llm_cmp_${this.class}_${e.id}`}runStep(){this.triggers.hook({name:this.cancelEventName,thread:"*"},this.onCancel).otherwise(()=>{this.log.DEBUG?.("Initializing cancel controller thread")})}onCancel(){this.log.DEBUG?.("Canceling LLM request");let e=this.local.parent,t=this.process.getThread(e);if(!t)return this.end();t.getSafeStepInstance(this.currentStepId).onCancel()}get cancelEventName(){return`${n.class}/${this.currentStepId}`}};se([p,D("design:type",Function),D("design:paramtypes",[]),D("design:returntype",void 0)],x.prototype,"runStep",null);se([p,D("design:type",Function),D("design:paramtypes",[]),D("design:returntype",void 0)],x.prototype,"onCancel",null);import Me from"@onereach/flow-sdk/step";import{z as r}from"zod/v4-mini";import{en as ke}from"zod/v4/locales";r.config(ke());var E=r.string().check(r.trim(),r.refine(n=>!["undefined","null"].includes(n),{error:"Unexpected undefined or null merge-field value"})),ie=r.discriminatedUnion("role",[r.object({role:r.literal("system"),content:E}),r.object({role:r.literal("user"),content:E,name:r.optional(E.check(r.minLength(1),r.maxLength(64)))}),r.object({role:r.literal("assistant"),content:r.nullable(E),tool_calls:r.optional(r.array(r.object({id:E.check(r.minLength(1)),type:r.literal("function"),function:r.object({name:E.check(r.minLength(1)),arguments:E.check(r.minLength(1))})})))}),r.object({role:r.literal("tool"),content:E,name:r.optional(E.check(r.minLength(1),r.maxLength(64))),tool_call_id:E.check(r.minLength(1))})]),Ie=r.object({type:r.literal("object"),properties:r.record(r.string().check(r.minLength(1),r.maxLength(64)),r.object({type:r.enum(["string","number","boolean","array","object"]),description:r.optional(r.string().check(r.maxLength(1e3))),items:r.optional(r.object({type:r.enum(["string","number","boolean","object"]),description:r.optional(r.string().check(r.maxLength(1e3)))}))}))}),ae=r.object({provider:E.check(r.minLength(1)),model:E.check(r.minLength(1)),accountKey:L(E),typeOfStep:r.enum(["chat","completion"]),systemMessage:r.optional(E),userMessage:r.optional(E),switchAssistantsMessage:r._default(r.boolean(),!1),assistantsFirstMessage:r.optional(E),temperature:L(r.coerce.number().check(r.gte(0),r.lte(2))),topP:L(r.coerce.number().check(r.gte(0),r.lte(1))),maxTokens:L(r.coerce.number().check(r.int(),r.gte(1))),presencePenalty:L(r.coerce.number().check(r.gte(-2),r.lte(2))),frequencyPenalty:L(r.coerce.number().check(r.gte(-2),r.lte(2))),n:L(r.coerce.number().check(r.int(),r.gte(1),r.lte(128))),stop:r.optional(r.array(r.object({token:r.string().check(r.minLength(1),r.maxLength(64))})).check(r.maxLength(4))),streamResponse:r._default(r.boolean(),!1),streamSettings:r.optional(r.object({maxBufferLength:r.coerce.number().check(r.overwrite(n=>n===0?50:n),r.int(),r.gte(1),r.lte(32768)),debounceDuration:r.coerce.number().check(r.int(),r.gte(0),r.lte(1e4))})),customHistory:r._default(r.boolean(),!1),historyLength:L(r.coerce.number().check(r.int(),r.gte(1),r.lte(100))),historyMode:r.optional(r.enum(["mergefield","codeHistory"])),historyMergefield:r.optional(r.array(ie)),historyCode:r.optional(r.array(ie)),functionsList:r.array(r.object({name:E.check(r.minLength(1),r.maxLength(64)),description:r.optional(E.check(r.maxLength(1e3))),parameters:r.optional(r.pipe(Ie,r.transform(n=>(n.required=Object.keys(n.properties),n.additionalProperties=!1,n)))),strict:r.boolean()})),processError:r.boolean(),processTimeout:r.boolean(),timeoutDuration:E.check(r.trim(),r.minLength(1))}).check(r.refine(n=>!n.streamResponse||n.provider==="openai",{error:"Streaming is only supported for OpenAI provider"}),r.refine(n=>!n.streamResponse||n.streamSettings!==void 0,{error:'Missing "Stream settings" for response streaming mode'}),r.refine(n=>n.typeOfStep!=="chat"||n.customHistory||!n.switchAssistantsMessage||n.assistantsFirstMessage!==void 0,{error:`Missing "Assistant's first message" value`}),r.refine(n=>n.customHistory||n.userMessage!==void 0,{error:'Missing "User message" value'}),r.refine(n=>n.typeOfStep!=="chat"||!n.customHistory||n.historyMode!==void 0,{error:'Missing "History mode" value'}),r.refine(n=>n.typeOfStep!=="chat"||!n.customHistory||n.historyMode!=="mergefield"||n.historyMergefield!==void 0,{error:'Missing "History" data via merge-field'}),r.refine(n=>n.typeOfStep!=="chat"||!n.customHistory||n.historyMode!=="mergefield"||n.historyMergefield?.find?.(e=>e.role==="user"),{error:'Missing at least one message with role "user" message in "History" data via merge-field'}),r.refine(n=>n.typeOfStep!=="chat"||!n.customHistory||n.historyMode!=="codeHistory"||n.historyCode!==void 0,{error:'Missing "History" data as code'}),r.refine(n=>n.typeOfStep!=="chat"||!n.customHistory||n.historyMode!=="codeHistory"||n.historyCode?.find?.(e=>e.role==="user"),{error:'Missing at least one message with role "user" message in "History" data via code'}));function L(n){return r.pipe(r.union([r.undefined(),r.literal(""),n]),r.transform(e=>e===""?void 0:e))}d(L,"optionalStringValue");import xe from"openai";import Le from"timestring";import{z as K}from"zod/v4-mini";import{Memoize as je}from"typescript-memoize";import Ae from"@onereach/flow-sdk/services/basic";function Oe(n,e,t,o){var i=arguments.length,s=i<3?e:o===null?o=Object.getOwnPropertyDescriptor(e,t):o,a;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")s=Reflect.decorate(n,e,t,o);else for(var c=n.length-1;c>=0;c--)(a=n[c])&&(s=(i<3?a(s):i>3?a(e,t,s):a(e,t))||s);return i>3&&s&&Object.defineProperty(e,t,s),s}d(Oe,"_ts_decorate");function le(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)}d(le,"_ts_metadata");var N=class extends Ae{static{d(this,"OpenAIRequestService")}data;constructor(e,t){super(e),this.data=t,this.log.DEBUG?.("OpenAIRequestService initialized")}async makeOpenAiRequest(e,t){let{model:o,temperature:i,topP:s,maxTokens:a,frequencyPenalty:c,presencePenalty:f,n:_,streamResponse:m}=this.data,U={messages:structuredClone(e),model:o,temperature:i,top_p:s,max_tokens:a,frequency_penalty:c,presence_penalty:f,stop:this.stopSequences,n:_,stream:m,tools:this.tools};this.log.DEBUG?.("LLM request",U);try{let S=await this.openAiClient.chat.completions.create(U,{signal:t});return m||this.log.DEBUG?.("LLM response",S),S}catch(S){throw S instanceof Error?new h("Chat completion request failed",S,{code:u.SERVER_ERROR,data:U}):S}}get tools(){let{functionsList:e}=this.data;if(!(!Array.isArray(e)||e.length===0))return e.map(t=>({type:"function",function:{name:t.name,description:t.description,parameters:!t.parameters||Object.keys(t.parameters).length===0?void 0:t.parameters,strict:t.strict}}))}get openAiClient(){let{provider:e,accountKey:t}=this.data,o={baseURL:`${this.config.env.OPENAI_API_URL}/${e}`,apiKey:"",defaultHeaders:{Authorization:this.config.authorization,"x-or-session-id":this.session.get(["reporting","sessionId"]),...t?{"x-or-account-token-name":t}:void 0},timeout:this.timeoutMs};return this.log.DEBUG?.("OpenAI client options",o),new xe(o)}get stopSequences(){return(this.data.stop??[]).map(t=>t.token).filter(t=>t.length>0)}get timeoutMs(){let e=Le(this.data.timeoutDuration,"ms");return K.number().check(K.int(),K.gte(1e3),K.lte(6e5)).parse(e)}};Oe([je(),le("design:type",Number),le("design:paramtypes",[])],N.prototype,"timeoutMs",null);import{Memoize as Ue}from"typescript-memoize";import{readFile as Ne}from"fs/promises";async function ce(n){if(typeof n!="string"||!/^\d+\.\d+\.\d+$/.test(n))throw new Error(`Invalid minimum version format: ${n}`);let e=Z.resolve("@onereach/flow-sdk/package.json");if(!e)throw new Error("Could not find package.json for @onereach/flow-sdk");let t=await Ne(e,"utf8"),{version:o}=JSON.parse(t),{groups:i}=/^(?<major>\d+)\.(?<minor>\d+)\.(?<patch>\d+)/.exec(o)||{};if(!i)throw new Error(`Invalid Flow SDK version format: ${o}`);let s=Number.parseInt(i.major??"0",10),a=Number.parseInt(i.minor??"0",10),c=Number.parseInt(i.patch??"0",10);if(s==null||a==null||c==null||Number.isNaN(s)||Number.isNaN(a)||Number.isNaN(c))throw new Error(`Invalid version format: ${o}`);let[f,_,m]=n.split(".").map(U=>Number.parseInt(U,10));if(f==null||_==null||m==null||Number.isNaN(f)||Number.isNaN(_)||Number.isNaN(m))throw new Error(`Invalid minimum version format: ${n}`);if(s<f||s===f&&a<_||s===f&&a===_&&c<m)throw new Error(`Flow SDK version '${o}' is lower than required minimum version '${n}' for the step`)}d(ce,"validateFlowSdkVersion");import{ACTION as de}from"@onereach/flow-sdk/types";import{APIUserAbortError as De}from"openai/error";function M(n,e,t,o){var i=arguments.length,s=i<3?e:o===null?o=Object.getOwnPropertyDescriptor(e,t):o,a;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")s=Reflect.decorate(n,e,t,o);else for(var c=n.length-1;c>=0;c--)(a=n[c])&&(s=(i<3?a(s):i>3?a(e,t,s):a(e,t))||s);return i>3&&s&&Object.defineProperty(e,t,s),s}d(M,"_ts_decorate");function g(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)}d(g,"_ts_metadata");var Pe="8.0.32",k=class extends Me{static{d(this,"CreateChatCompletionStep")}abortController;async resolveDataIn(){let e=await super.resolveDataIn();return this.log.DEBUG?.("data in before validation",e),ae.parse(e)}runStep(){let{streamResponse:e}=this.data;e&&this.triggers.hook({name:de.end,thread:T.getThreadId(this)},this.onStreamControllerThreadEnd),this.triggers.hook({name:de.end,thread:y.getThreadId(this)},this.onToolsControllerEnd),this.triggers.otherwise(this.initRequest)}async initRequest(){await ce(Pe),this.resetState();let{streamResponse:e}=this.data;await Promise.all([y.start(this),e?T.start(this):void 0,v.start(this),x.start(this)]),await v.prepareHistory(this);try{this.state.state="active-request",this.abortController=new AbortController;let t=await this.openAiService.makeOpenAiRequest(this.history,this.abortController.signal);await(e?this.handleStreamResponse(t):this.handleResponse(t))}catch(t){if(t instanceof De){await this.resetStep();return}throw t}finally{this.abortController&&(this.abortController=void 0)}}async handleResponse(e){this.log.DEBUG?.("Start processing response from LLM"),this.state.chatCompletion=e,this.state.contentReady=!0,this.state.state="processing",this.abortController=void 0,e.choices.length>1&&this.log.WARN?.("Multiple choices received from LLM, but only the first one will be processed",{choicesNumber:e.choices.length});let o=e.choices[0]?.message.tool_calls??[];for(let i of o)await y.callTool(this,i);await y.lastToolCallReceived(this)}async handleStreamResponse(e){this.log.DEBUG?.("Start processing stream of chunks from LLM");for await(let t of e)await T.handleChunk(this,t);this.state.state="processing",this.abortController=void 0,await T.lastChunkReceived(this)}async onToolsControllerEnd(e){let{result:t}=e.params;if(this.log.DEBUG?.("Tools controller ended with messages",t),t instanceof Error)throw new h("Tools controller thread ended with an error",t,{code:u.STEP_LOGIC_ISSUE});if(t?.status==="cancel")return;let{status:o,messages:i}=t??{};if(o!=="ok"||!Array.isArray(i))throw new h("Unexpected end of the tools controller thread",{code:u.STEP_LOGIC_ISSUE,data:e.params.result});this.state.toolsResults=i,this.state.toolsReady=!0,await this.tryToExitStep()}async onStreamControllerThreadEnd(e){let{result:t}=e.params;if(this.log.DEBUG?.("Stream controller ended with result",t),t instanceof Error)throw new h("Stream controller thread ended with an error",t,{code:u.STEP_LOGIC_ISSUE});if(t?.status==="cancel")return;let{status:o,completion:i}=t??{};if(o!=="ok"||i==null)throw new h("Unexpected end of the stream controller thread",{code:u.STEP_LOGIC_ISSUE,data:e.params.result});this.log.DEBUG?.("Create Chat Completion result",i),this.state.contentReady=!0,this.state.chatCompletion=i,await this.tryToExitStep()}async tryToExitStep(){let{toolsReady:e,contentReady:t,chatCompletion:o,toolsResults:i}=this.state;if(!e||!t)return;if(o==null)throw new h("Missing chat completion result, but request is marked as processed",{code:u.STEP_LOGIC_ISSUE});let s=o.choices?.[0]?.message;if(s==null)throw new h("Missing completion message in chat completion result",{code:u.STEP_LOGIC_ISSUE});if(await v.appendToHistory(this,[s,...i]),o?.choices?.[0]?.finish_reason==="tool_calls"){this.state.state="ready",this.thread.jumpTo(this.currentStepId);return}if(o==null)throw new h("Missing chat completion result, but request is marked as processed",{code:u.STEP_LOGIC_ISSUE});this.log.DEBUG?.("Exiting step with collected data",o),this.exitStep("next",{...o,_history:this.history})}async onCancel(){let e=this.abortController;e?e.abort(new B("Request cancelled")):await this.resetStep()}async resetStep(){let{streamResponse:e}=this.data;this.resetState();let t=[y.cancel(this)];e&&t.push(T.cancel(this));let i=(await Promise.allSettled(t)).find(s=>s.status==="rejected");if(i)throw i.reason instanceof Error?i.reason:new Error(String(i.reason))}resetState(){this.state.state="ready",this.state.contentReady=!1,this.state.toolsReady=!1,this.state.chatCompletion=void 0,this.state.toolsResults=[],this.abortController=void 0}get history(){return v.getHistory(this)}get openAiService(){return new N(this.thread,this.data)}};M([p,g("design:type",Function),g("design:paramtypes",[]),g("design:returntype",Promise)],k.prototype,"resolveDataIn",null);M([p,g("design:type",Function),g("design:paramtypes",[]),g("design:returntype",void 0)],k.prototype,"runStep",null);M([p,g("design:type",Function),g("design:paramtypes",[]),g("design:returntype",Promise)],k.prototype,"initRequest",null);M([A,g("design:type",Function),g("design:paramtypes",[typeof IActionEvent>"u"?Object:IActionEvent]),g("design:returntype",Promise)],k.prototype,"onToolsControllerEnd",null);M([A,g("design:type",Function),g("design:paramtypes",[typeof IActionEvent>"u"?Object:IActionEvent]),g("design:returntype",Promise)],k.prototype,"onStreamControllerThreadEnd",null);M([p,g("design:type",Function),g("design:paramtypes",[]),g("design:returntype",Promise)],k.prototype,"onCancel",null);M([Ue(),g("design:type",typeof N>"u"?Object:N),g("design:paramtypes",[])],k.prototype,"openAiService",null);Fe();var Pn={[v.class]:v,[y.class]:y,[O.class]:O,[T.class]:T,[b.class]:b,[x.class]:x};export{Pn as states,k as step};
2
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/index.ts","../src/layers/history/controller.ts","../src/utils/create-method-decorator.ts","../src/errors/error-filter.ts","../src/errors/step-error.ts","../src/decorators/error-filter.ts","../src/layers/stream-handler/controller.ts","../src/layers/stream-handler/worker.ts","../src/utils/thread-utilities.ts","../src/decorators/hook-error-filter.ts","../src/layers/tools-caller/controller.ts","../src/layers/tools-caller/worker.ts","../src/layers/stream-handler/schemas/stream-chunk.ts","../src/layers/stream-handler/services/stream-reducer.ts","../src/layers/cancel/controller.ts","../src/step.ts","../src/schemas/data-in.ts","../src/services/openai-request.ts","../src/utils/validate-flow-sdk-version.ts"],"sourcesContent":["import { install } from 'source-map-support';\n\nimport { HistoryController } from './layers/history/controller.ts';\nimport { StreamController } from './layers/stream-handler/controller.ts';\nimport { StreamWorker } from './layers/stream-handler/worker.ts';\nimport { ToolsController } from './layers/tools-caller/controller.ts';\nimport { ToolsWorker } from './layers/tools-caller/worker.ts';\nimport { CancelController } from './layers/cancel/controller.ts';\n\n// enable source map support for better error stack traces\ninstall();\n\nexport const states = {\n [HistoryController.class]: HistoryController,\n [ToolsController.class]: ToolsController,\n [ToolsWorker.class]: ToolsWorker,\n [StreamController.class]: StreamController,\n [StreamWorker.class]: StreamWorker,\n [CancelController.class]: CancelController,\n};\n\nexport { CreateChatCompletionStep as step } from './step.ts';\n","/* eslint-disable @typescript-eslint/unbound-method */\n\nimport Step from '@onereach/flow-sdk/step.js';\nimport { ErrorFilter } from '../../decorators/error-filter.ts';\n\nimport type { CONFIG, IThreadId, IEvent } from '@onereach/flow-sdk/types/index.js';\nimport type { ChatCompletionMessageParam } from 'openai/resources';\nimport type { DataIn } from '../../schemas/data-in.ts';\nimport type { ChatCompletionConfig } from '../../step.ts';\n\nexport class HistoryController extends Step<HistoryControllerConfig> {\n public static readonly class = 'hst_ctrl';\n\n public static async start(step: Step<ChatCompletionConfig>): Promise<void> {\n const threadId = this.getThreadId(step);\n const thread = step.process.getThread<HistoryControllerConfig>(threadId);\n\n if (thread != undefined) return; // thread already exists\n\n // create tools controller thread\n await step.thread.runThread<HistoryControllerConfig>({\n id: threadId,\n background: true,\n state: {\n step: step.id,\n class: this.class,\n\n messages: [], // messages to send to OpenAI API\n },\n });\n }\n\n public static async prepareHistory<T extends CONFIG>(step: Step<T>): Promise<void> {\n await step.process.enqueueAndRun<EventName['prepareHistory']>({\n thread: this.getThreadId(step),\n name: events.prepareHistory,\n });\n }\n\n public static async appendToHistory<T extends CONFIG>(\n step: Step<T>,\n message: ChatCompletionMessageParam | ChatCompletionMessageParam[],\n ): Promise<void> {\n await step.process.enqueueAndRun<EventName['appendToHistory'], HistoryControllerAppendParameters>({\n thread: this.getThreadId(step),\n name: events.appendToHistory,\n params: { message },\n });\n }\n\n public static getHistory<T extends CONFIG>(step: Step<T>): ChatCompletionMessageParam[] {\n return step.process.getSafeThread<HistoryControllerConfig>(this.getThreadId(step)).state.messages;\n }\n\n public static getThreadId<T extends CONFIG>(step: Step<T>): IThreadId {\n return `llm_cmp_${this.class}_${step.id}`;\n }\n\n // ---------------------------------------\n\n @ErrorFilter\n public runStep(): void {\n this.triggers\n .local(events.prepareHistory, this.onPrepareHistory)\n .local(events.appendToHistory, this.onAppendToHistory)\n .otherwise(() => {\n this.log.DEBUG?.('Initializing history controller thread');\n });\n }\n\n @ErrorFilter\n public onPrepareHistory(): void {\n this.log.DEBUG?.('Preparing history');\n\n const {\n customHistory,\n historyLength,\n systemMessage,\n typeOfStep,\n userMessage,\n historyMode,\n historyMergefield,\n historyCode,\n assistantsFirstMessage,\n } = this.data;\n\n // 1. text completion mode\n if (typeOfStep === 'completion') {\n this.state.messages = [\n {\n role: 'user',\n content: userMessage!, // never would be undefined due to validation against schema\n },\n ];\n return;\n }\n\n // 2. chat mode (custom history)\n if (customHistory) {\n this.state.messages = historyMode === 'mergefield' ? historyMergefield! : historyCode!;\n return;\n }\n\n // 3. chat mode (step managed history)\n let messages = this.state.messages;\n\n // is a fresh conversation?\n if (messages.length === 0 && assistantsFirstMessage != undefined && assistantsFirstMessage.length > 0) {\n messages.push({\n role: 'assistant',\n content: assistantsFirstMessage,\n });\n }\n\n // if last message is a tool response, assume user message is already in history\n if (messages.at(-1)?.role !== 'tool') {\n messages.push({\n role: 'user',\n content: userMessage!, // never would be undefined due to validation against schema\n // TODO: add support for optional user name\n // name: userName,\n });\n }\n\n // trim history length\n const hasToolCalls = messages.some((message) => message.role === 'tool');\n if (!hasToolCalls && historyLength != undefined && historyLength > 0) {\n messages = messages.slice(-1 * historyLength);\n }\n\n // add system message as first message if it exists\n if (systemMessage != undefined && systemMessage.length > 0) {\n const systemMessageRecord = {\n role: 'system' as const,\n content: systemMessage,\n };\n\n if (messages[0]?.role === 'system') {\n messages[0] = systemMessageRecord; // replace existing system message\n } else {\n messages.unshift(systemMessageRecord); // add system message as first message\n }\n }\n\n // store history\n this.state.messages = messages;\n }\n\n @ErrorFilter\n public onAppendToHistory(event: IEvent<HistoryControllerAppendParameters, EventName['appendToHistory']>): void {\n this.log.DEBUG?.('Appending message to history', event.params);\n\n const { message } = event.params;\n const messages = Array.isArray(message) ? message : [message];\n this.state.messages.push(...messages);\n }\n}\n\n// ----------------- TYPES -----------------\n\nexport const events = {\n appendToHistory: 'hst_append',\n prepareHistory: 'hst_prepare',\n} as const;\nexport type EventName = typeof events;\n\nexport type HistoryControllerAppendParameters = {\n message: ChatCompletionMessageParam | ChatCompletionMessageParam[];\n};\n\nexport type HistoryControllerEvents =\n | IEvent<HistoryControllerAppendParameters, EventName['appendToHistory']>\n | IEvent<never, EventName['prepareHistory']>;\n\nexport type HistoryControllerState = {\n class: typeof HistoryController.class;\n\n messages: ChatCompletionMessageParam[]; // messages to send to OpenAI API\n};\n\nexport interface HistoryControllerConfig extends CONFIG {\n dataIn: DataIn;\n state: HistoryControllerState;\n events: HistoryControllerEvents;\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\n\n/**\n * Creates a method decorator that can be used with or without options.\n * @param apply - Function that applies the decorator logic with given options.\n * @param defaultOptions - Default options to use if none are provided.\n */\nexport function createMethodDecoratorWithOptionalArguments<A, T extends AnyFunction = AnyFunction>(\n apply: (\n options: A,\n target: object,\n propertyKey: string | symbol,\n descriptor: TypedPropertyDescriptor<T>,\n ) => T | TypedPropertyDescriptor<T> | void,\n defaultOptions: A,\n): {\n (\n target: object,\n propertyKey: string | symbol,\n descriptor: TypedPropertyDescriptor<T>,\n ): TypedPropertyDescriptor<T> | void;\n (\n options?: A,\n ): (\n target: object,\n propertyKey: string | symbol,\n descriptor: TypedPropertyDescriptor<T>,\n ) => TypedPropertyDescriptor<T> | void;\n} {\n function runApply(\n options: A,\n target: object,\n propertyKey: string | symbol,\n descriptor: TypedPropertyDescriptor<T>,\n ): TypedPropertyDescriptor<T> | void {\n const maybe = apply(options, target, propertyKey, descriptor);\n\n // If the decorator factory returned a wrapped function, assign it to the descriptor here\n if (typeof maybe === 'function') {\n const originalMethod = descriptor.value;\n const wrappedMethod = maybe as typeof originalMethod;\n\n if (originalMethod?.name != undefined) {\n try {\n Object.defineProperty(wrappedMethod, 'name', { value: originalMethod.name });\n } catch {\n // ignore if name is non-configurable\n }\n }\n\n descriptor.value = wrappedMethod;\n return descriptor;\n }\n\n // If a descriptor was returned or decorator mutated descriptor in-place, use that\n return maybe ?? descriptor;\n }\n\n return function decoratorOrFactory(\n argument0?: object | A,\n argument1?: string | symbol,\n argument2?: TypedPropertyDescriptor<T>,\n ): any {\n if (\n argument0 !== null &&\n typeof argument0 === 'object' &&\n (typeof argument1 === 'string' || typeof argument1 === 'symbol') &&\n argument2 !== null &&\n typeof argument2 === 'object'\n ) {\n // Called as plain decorator: @Decorator\n return runApply(defaultOptions, argument0, argument1, argument2);\n } else {\n // Called as decorator factory: @Decorator(options)\n const options = (argument0 as A) ?? defaultOptions;\n return (target: object, propertyKey: string | symbol, descriptor: TypedPropertyDescriptor<T>) => {\n return runApply(options, target, propertyKey, descriptor);\n };\n }\n };\n}\n\nexport type AnyFunction = (...arguments_: any[]) => any;\n","import TimeoutError from '@onereach/flow-sdk/errors/timeout';\nimport { z } from 'zod/v4-mini';\n\nimport { CreateChatCompletionStepError, ErrorCode } from './step-error';\n\nexport function errorFilter(error: unknown): CreateChatCompletionStepError | TimeoutError {\n // if error is CreateChatCompletionStepError or TimeoutError, return it directly\n if (error instanceof CreateChatCompletionStepError || error instanceof TimeoutError) {\n return error;\n }\n\n // validation errors\n if (error instanceof z.core.$ZodError) {\n return new CreateChatCompletionStepError(z.prettifyError(error), error, {\n code: ErrorCode.VALIDATION,\n });\n }\n\n if (error instanceof Error) {\n // timeout errors\n if (error.message.includes('Request timed out')) {\n return new TimeoutError('Timeout', error, { code: ErrorCode.TIMEOUT });\n }\n\n // TODO: fix interpreting of this kind of errors\n // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access\n const responseErrorMessage: string | undefined = (error as unknown as any)?.response?.data?.error?.message;\n if (responseErrorMessage != undefined) {\n return new CreateChatCompletionStepError(responseErrorMessage, error, {\n code: ErrorCode.SERVER_ERROR,\n });\n }\n }\n\n // if error is a string assume it's an error message\n if (typeof error === 'string') {\n return new CreateChatCompletionStepError(error, {\n code: ErrorCode.UNKNOWN,\n });\n }\n\n if (error instanceof Error) {\n return new CreateChatCompletionStepError('Unknown error', error, {\n code: ErrorCode.UNKNOWN,\n });\n }\n\n // catch all for unknown errors\n return new CreateChatCompletionStepError('Unknown error', {\n code: ErrorCode.UNKNOWN,\n data: error,\n });\n}\n","import BaseError from '@onereach/flow-sdk/errors/base';\n\nexport const ErrorCode = {\n UNKNOWN: 'UNKNOWN',\n STEP_LOGIC_ISSUE: 'STEP_LOGIC_ISSUE',\n AUTH: 'AUTH',\n TIMEOUT: 'TIMEOUT',\n VALIDATION: 'VALIDATION',\n INVALID_REQUEST: 'INVALID_REQUEST',\n RATE_LIMITED: 'RATE_LIMITED',\n LLM_FINISH_LENGTH: 'LLM_FINISH_LENGTH',\n SERVER_ERROR: 'SERVER_ERROR',\n UNSUPPORTED: 'UNSUPPORTED',\n} as const;\n\nexport class CreateChatCompletionStepError extends BaseError<{\n code: keyof typeof ErrorCode;\n data?: unknown;\n}> {}\n\nexport class AbortRequestError extends BaseError {}\n","import { createMethodDecoratorWithOptionalArguments as createMethodDecoratorWithOptionalArguments } from '../utils/create-method-decorator';\nimport { errorFilter } from '../errors/error-filter';\nimport Step from '@onereach/flow-sdk/step';\n\nconst defaultOptions = {};\n\nexport const ErrorFilter = createMethodDecoratorWithOptionalArguments((_options, _target, propertyKey, descriptor) => {\n const originalMethod = descriptor.value;\n\n if (!originalMethod || typeof originalMethod !== 'function') return;\n\n return function (this: Step, ...arguments_: Parameters<typeof originalMethod>): ReturnType<typeof originalMethod> {\n try {\n const result: unknown = originalMethod.apply(this, arguments_);\n\n if (result instanceof Promise) {\n return result.catch((error) => {\n const methodName = propertyKey.toString();\n this.log.DEBUG?.(`Error in method '${methodName}'`, error);\n throw errorFilter(error);\n }) as ReturnType<typeof originalMethod>;\n }\n\n return result;\n } catch (error) {\n const methodName = propertyKey.toString();\n this.log.DEBUG?.(`Error in method '${methodName}'`, error);\n throw errorFilter(error);\n }\n };\n}, defaultOptions);\n","/* eslint-disable @typescript-eslint/unbound-method */\n\nimport Step from '@onereach/flow-sdk/step.js';\nimport { StreamWorker, StreamWorkerConfig } from './worker.ts';\nimport { ErrorFilter } from '../../decorators/error-filter.ts';\nimport { HookErrorFilter } from '../../decorators/hook-error-filter.ts';\nimport { ToolsController } from '../tools-caller/controller.ts';\nimport { CreateChatCompletionStepError, ErrorCode } from '../../errors/step-error.ts';\nimport { streamChunkEventSchema } from './schemas/stream-chunk.ts';\nimport { StreamReducerService } from './services/stream-reducer.ts';\nimport { runThread, stopThread } from '../../utils/thread-utilities.ts';\nimport { ACTION } from '@onereach/flow-sdk/types/index.js';\n\nimport type { CONFIG, IThreadId, IEvent, IActionEvent } from '@onereach/flow-sdk/types/index.js';\nimport type { ChatCompletion, ChatCompletionChunk, ChatCompletionMessageFunctionToolCall } from 'openai/resources';\nimport type { DataIn } from '../../schemas/data-in.ts';\nimport type { ChatCompletionConfig } from '../../step.ts';\n\nexport class StreamController extends Step<StreamControllerConfig> {\n public static readonly class = 'str_ctrl';\n\n public static async start(step: Step<ChatCompletionConfig>): Promise<void> {\n await runThread<StreamControllerConfig, ChatCompletionConfig>(step, {\n id: this.getThreadId(step),\n state: {\n step: step.id,\n class: this.class,\n\n completionResult: {}, // aggregated result of the LLM response\n\n events: [], // queue of response chunks\n lastChunkReceived: false,\n index: -1, // last index for a chunk\n skipIndexWarning: false, // skip warning about multiple choices\n },\n });\n }\n\n public static async handleChunk(step: Step<ChatCompletionConfig>, chunk: ChatCompletionChunk): Promise<void> {\n await step.process.enqueueAndRun({\n thread: this.getThreadId(step),\n name: EventName.handleChunk,\n params: { chunk },\n });\n }\n\n public static async lastChunkReceived(step: Step<ChatCompletionConfig>): Promise<void> {\n await step.process.enqueueAndRun({\n thread: this.getThreadId(step),\n name: EventName.lastStreamChunkReceived,\n });\n }\n\n public static async cancel(step: Step<ChatCompletionConfig>): Promise<void> {\n await stopThread<StreamControllerConfig, ChatCompletionConfig>(step, this.getThreadId(step), {\n result: { status: 'cancel' },\n stopChildThreads: true,\n });\n }\n\n public static getThreadId<T extends CONFIG>(step: Step<T>): IThreadId {\n return `llm_cmp_${this.class}_${step.id}`;\n }\n\n // ---------------------------------------\n\n @ErrorFilter\n public runStep(): void {\n this.triggers\n .hook<StreamWorkerConfig, ACTION.end>(\n { name: ACTION.end, thread: StreamWorker.getThreadId(this) },\n this.onWorkerThreadEnd,\n )\n .local(EventName.handleChunk, this.onStreamChunk)\n .local(EventName.lastStreamChunkReceived, this.onLastStreamChunkReceived)\n .otherwise(() => {\n this.log.DEBUG?.('Initializing stream controller thread');\n });\n }\n\n /**\n * Handler of the worker thread end event.\n */\n @HookErrorFilter({ allowHandleError: false })\n public onWorkerThreadEnd(event: IActionEvent<StreamWorkerConfig, ACTION.end>): void {\n const { result } = event.params;\n\n // TODO: check if end was due to error or normal end in event.params\n this.log.DEBUG?.('Stream worker thread finished processing chunk', result);\n\n if (result instanceof Error) {\n throw new CreateChatCompletionStepError('Stream worker thread ended with an error', result, {\n code: ErrorCode.UNKNOWN,\n });\n }\n\n if (result?.status === 'cancel') return;\n\n // check if there are more tool calls or content chunks to process\n this.tryRunWorker();\n }\n\n /**\n * Handles a single chunk of the streaming response from the OpenAI API.\n */\n @ErrorFilter\n public onStreamChunk(event: IEvent<StreamChunkParameters, EventName['handleChunk']>): void {\n const parsedEvent = streamChunkEventSchema.parse(event);\n const chunk = parsedEvent.params.chunk satisfies ChatCompletionChunk;\n\n const streamReducer = new StreamReducerService(this.state.completionResult, this.onToolCall.bind(this));\n streamReducer.reduceChunk(chunk);\n\n for (const chunkChoice of chunk.choices) {\n this.log.DEBUG?.('LLM stream response chunk', chunkChoice);\n\n if (chunkChoice.index > 0) {\n // skip streaming additional choices (if n > 1)\n this.handleMultipleChoices(chunkChoice);\n continue;\n }\n\n // aggregate content\n const content = chunkChoice.delta?.content;\n if (content != undefined && content.length > 0) {\n this.addContentToQueue(content);\n this.scheduleNextContentEvent();\n }\n\n this.handleLengthFinishReason(chunkChoice);\n }\n }\n\n protected handleMultipleChoices(choice: ChatCompletionChunk.Choice): void {\n if (this.state.skipIndexWarning) return;\n\n this.log.WARN?.('Multiple choices received from LLM, but only the first one will be processed', {\n choiceIndex: choice.index,\n });\n this.state.skipIndexWarning = true;\n }\n\n protected handleLengthFinishReason(choice: ChatCompletionChunk.Choice): void {\n // TODO: move logic of handling 'length' out of stream mixin\n if (choice.finish_reason === 'length') {\n // TODO: allow to proceed with partial data?\n throw new CreateChatCompletionStepError('Reached limit of tokens for LLM completion response', {\n code: ErrorCode.LLM_FINISH_LENGTH,\n });\n }\n }\n\n protected onToolCall(toolCall: ChatCompletionMessageFunctionToolCall): void {\n this.log.DEBUG?.('Tool call received', toolCall);\n void ToolsController.callTool(this, toolCall);\n }\n\n /**\n * Tries to flush the queue of response chunks to the controller thread.\n * If the first event in the queue is not full, it waits for a debounce duration before flushing.\n * If the first event is full, it flushes it immediately.\n */\n private scheduleNextContentEvent(): void {\n const firstEvent = this.state.events[0];\n\n if (firstEvent == undefined || !this.isEventReady(firstEvent) || 'lastChunkReceived' in firstEvent) return;\n\n this.tryRunWorker();\n }\n\n /**\n * Compacts the content into the controller thread's events queue.\n * If the content is too long, it splits it into multiple events.\n * If the last event is not full, it extends it with the new content.\n */\n private addContentToQueue(content: string): void {\n // extend content chunk in the last event to max event size\n const lastEvent: ContentEvent | undefined = this.state.events.at(-1);\n\n if (lastEvent != undefined) {\n if ('lastChunkReceived' in lastEvent) {\n this.log.WARN?.('A new chunk received after the `lastChunkReceived` event. Ignoring it.');\n return;\n }\n\n if (lastEvent.content.length < this.maxChunkContentLength) {\n const mergedChunk = `${lastEvent.content}${content}`;\n // TODO: might be an issue with streaming to TTS\n lastEvent.content = mergedChunk.slice(0, this.maxChunkContentLength);\n this.log.DEBUG?.('Compacting response chunk into last queue event', lastEvent);\n\n content = mergedChunk.slice(this.maxChunkContentLength);\n }\n }\n\n // split chunk into max socket size events\n while (content) {\n this.state.index += 1;\n\n const event: ContentChunkEvent = {\n // TODO: might be an issue with streaming to TTS\n content: content.slice(0, this.maxChunkContentLength),\n index: this.state.index,\n ts: Date.now(),\n };\n this.log.DEBUG?.('Add new event into the queue', event);\n this.state.events.push(event);\n\n content = content.slice(this.maxChunkContentLength);\n }\n }\n\n /**\n * Processes the next event in the controller thread's queue.\n * If the worker thread is busy, it skips processing.\n * If the event is the termination marker, it notifies the end of the controller thread.\n * If the event is ready for processing, it starts the worker thread to handle it.\n */\n @ErrorFilter\n public tryRunWorker(): void {\n // skip if worker thread is busy\n if (StreamWorker.isBusy(this)) {\n this.log.DEBUG?.('Skip event processing. Worker thread is busy');\n return;\n }\n\n const event: ContentEvent | undefined = this.getEventToProcess();\n\n if (event == undefined) return;\n\n if ('lastChunkReceived' in event) {\n // if last chunk received, stop stream controller thread with aggregated response\n this.log.DEBUG?.(\n 'Stopping controller thread. All response content chunks were processed and no new chunks are coming',\n );\n this.end({\n status: 'ok',\n completion: this.state.completionResult as ChatCompletion, // TODO: maybe validate that completionResult is correct?\n });\n return;\n }\n\n this.log.DEBUG?.('Notify stream worker thread about response chunk to process', event);\n\n void StreamWorker.start(this, event);\n }\n\n private isEventReady(event: ContentEvent): boolean {\n if (event == undefined) return false;\n if ('lastChunkReceived' in event) return true;\n if (event.content == undefined) return false; // TODO: is it even possible? add test for this use-case\n\n const eventDelay = Date.now() - event.ts;\n return (\n this.state.lastChunkReceived ||\n eventDelay >= this.debounceDuration ||\n event.content.length >= this.maxChunkContentLength\n );\n }\n\n private getEventToProcess(): ContentEvent | undefined {\n const firstEvent = this.state.events[0];\n\n if (firstEvent == undefined) return undefined;\n if (!this.isEventReady(firstEvent)) return undefined;\n if ('lastChunkReceived' in firstEvent) return firstEvent;\n\n this.state.events.shift();\n return firstEvent;\n }\n\n /**\n * Handles the notification that all response chunks were received from the OpenAI API.\n */\n @ErrorFilter\n public async onLastStreamChunkReceived(): Promise<void> {\n this.log.DEBUG?.('All LLM response chunks were received. No more response chunks expected');\n\n // add fake event as marker for end of stream\n this.state.events.push({ lastChunkReceived: true });\n\n // mark last chunk was received in stream controller thread state\n this.state.lastChunkReceived = true;\n\n // force processing of the top chunk in the content queue\n this.tryRunWorker();\n\n // notify tools controller thread that no more tool calls are expected\n // set immediate to make sure last tool call callback is called\n await ToolsController.lastToolCallReceived(this);\n }\n\n protected get maxChunkContentLength(): number {\n return this.data.streamSettings?.maxBufferLength ?? 100;\n }\n\n protected get debounceDuration(): number {\n return this.data.streamSettings?.debounceDuration ?? 200;\n }\n}\n\nexport const EventName = {\n handleChunk: 'add_chunk',\n lastStreamChunkReceived: 'llm_rsp_end',\n} as const;\nexport type EventName = typeof EventName;\n\nexport type ContentChunkEvent = {\n content: string;\n index: number;\n ts: number;\n};\nexport type ContentEndEvent = {\n // marker for end of content stream\n lastChunkReceived: true;\n};\nexport type ContentEvent = ContentChunkEvent | ContentEndEvent;\n\nexport type StreamChunkParameters = { chunk: ChatCompletionChunk };\n\nexport type StreamControllerEvents =\n | IEvent<StreamChunkParameters, EventName['handleChunk']>\n | IEvent<never, EventName['lastStreamChunkReceived']>;\n\nexport type StreamControllerState = {\n class: typeof StreamController.class;\n\n completionResult: Partial<ChatCompletion>;\n events: ContentEvent[];\n index: number;\n lastChunkReceived: boolean; // marker for end of response stream\n debounceId?: NodeJS.Timeout;\n skipIndexWarning: boolean;\n};\nexport type StreamControllerResultOk = {\n status: 'ok';\n completion: ChatCompletion;\n};\nexport type StreamControllerResultCancel = {\n status: 'cancel';\n messages?: undefined;\n};\nexport type StreamControllerResult = StreamControllerResultOk | StreamControllerResultCancel;\n\nexport type StreamControllerLocal = {\n parent: IThreadId;\n active: boolean;\n};\n\nexport interface StreamControllerConfig extends CONFIG {\n dataIn: DataIn;\n state: StreamControllerState;\n local: StreamControllerLocal;\n result: StreamControllerResult;\n events: StreamControllerEvents;\n}\n","import Step from '@onereach/flow-sdk/step';\nimport { ErrorFilter } from '../../decorators/error-filter';\nimport { CreateChatCompletionStepError, ErrorCode } from '../../errors/step-error';\nimport { isThreadBusy, runThread } from '../../utils/thread-utilities';\n\nimport type { CONFIG, IThreadId } from '@onereach/flow-sdk/types';\nimport type { DataIn } from '../../schemas/data-in';\nimport type { StreamControllerConfig } from './controller';\n\nexport class StreamWorker extends Step<StreamWorkerConfig> {\n public static readonly class = 'str_wrk';\n\n public static async start(step: Step<StreamControllerConfig>, event: ContentChunk): Promise<void> {\n await runThread<StreamWorkerConfig, StreamControllerConfig>(step, {\n id: this.getThreadId(step),\n state: {\n step: step.id,\n class: this.class,\n\n event,\n },\n });\n }\n\n public static isBusy(step: Step<StreamControllerConfig>): boolean {\n return isThreadBusy<StreamControllerConfig, StreamWorkerConfig>(step, this.getThreadId(step));\n }\n\n public static getThreadId<T extends CONFIG>(step: Step<T>): IThreadId {\n return `llm_cmp_${this.class}_${step.id}`;\n }\n\n // ----------------------------------------------\n\n @ErrorFilter\n public runStep(): void {\n if ('event' in this.state === false || this.state.event == undefined) {\n throw new CreateChatCompletionStepError('Stream worker thread state must contain an event to process', {\n code: ErrorCode.STEP_LOGIC_ISSUE,\n });\n }\n\n const chunk = this.state.event;\n this.log.DEBUG?.('Executing stream worker thread', chunk);\n this.exitStep(streamWorkerExits.chunk, { chunk });\n }\n}\n\nexport const streamWorkerExits = {\n chunk: 'chunk',\n} as const;\n\nexport type ContentChunk = {\n content: string;\n index: number;\n ts: number;\n};\n\nexport type StreamWorkerOut = {\n chunk: ContentChunk;\n};\n\nexport type StreamWorkerState = {\n class: typeof StreamWorker.class;\n\n event: ContentChunk;\n};\n\nexport type StreamWorkerResult = { status: 'cancel' } | undefined;\n\nexport type StreamWorkerLocal = {\n parent: IThreadId;\n active: boolean;\n};\n\nexport interface StreamWorkerConfig extends CONFIG {\n dataIn: DataIn;\n dataOut: StreamWorkerOut;\n state: StreamWorkerState;\n local: StreamWorkerLocal;\n result: StreamWorkerResult;\n}\n","import Step from '@onereach/flow-sdk/step';\nimport { ACTION } from '@onereach/flow-sdk/types';\nimport type { CONFIG, IThread, IThreadId, IThreadOptions, RESULT } from '@onereach/flow-sdk/types';\n\n/**\n * Runs a new thread or reuses an existing one (if it ended).\n * @param step The step to run the thread for.\n * @throws Error if the thread is not ended or if the state is not provided.\n */\nexport async function runThread<ThreadConfig extends CONFIG & ManagedThreadConfig, StepConfig extends CONFIG>(\n step: Step<StepConfig>,\n { id, state, local, ...options }: IThreadOptions<ThreadConfig>,\n { force }: { force?: boolean } = {},\n): Promise<ReturnType<IThread<ThreadConfig>['runThread']>> {\n const thread = step.process.getThread<ThreadConfig>(id);\n step.log.DEBUG?.(`runThread: thread with id '${id}'`, options);\n\n if (thread == undefined) {\n // create thread\n return await step.thread.runThread<ThreadConfig>({\n ...options,\n id,\n background: true,\n state,\n local: {\n ...local,\n parent: step.thread.id,\n active: true,\n },\n });\n } else {\n if (!force && !thread.ended && thread.local.active)\n throw new Error(`Thread with id '${id}' has not ended yet, cannot start it again`);\n if (state == undefined) throw new Error(`Thread with id '${id}' must have a state to run`);\n\n // reuse existing thread\n thread.local.active = true;\n return await thread.enqueueAndRun({\n name: ACTION.goto,\n state: {\n ...state,\n active: true,\n },\n });\n }\n}\n\nexport function isThreadBusy<StepConfig extends CONFIG, ThreadConfig extends CONFIG & ManagedThreadConfig>(\n step: Step<StepConfig>,\n threadId: IThreadId,\n): boolean {\n const thread = step.process.getThread<ThreadConfig>(threadId);\n return Boolean(thread != undefined && thread.local.active && !thread.ended);\n}\n\nexport function listChildThreads<StepConfig extends CONFIG, ChildThreadConfig extends CONFIG & ManagedThreadConfig>(\n thread: IThread<StepConfig>,\n parentThreadId: IThreadId = thread.id,\n): IThread<ChildThreadConfig>[] {\n const childThreads = [];\n for (const threadId in thread.process.threads) {\n const item = thread.process.threads[threadId]! as unknown as IThread<ChildThreadConfig>;\n if (item?.local.parent === parentThreadId) childThreads.push(item);\n }\n return childThreads;\n}\n\nexport async function stopThread<ThreadConfig extends CONFIG & ManagedThreadConfig, StepConfig extends CONFIG>(\n step: Step<StepConfig>,\n id: IThreadId,\n { result, stopChildThreads }: { result?: RESULT<ThreadConfig>; stopChildThreads?: boolean } = {},\n): Promise<void> {\n const thread = step.process.getThread<ThreadConfig>(id);\n step.log.DEBUG?.(`stopThread: thread with id '${id}'`);\n\n if (!thread) return;\n\n if (stopChildThreads) {\n const childThreads = listChildThreads(thread);\n const stopTasks = childThreads.map(async (child) => await stopThread(step, child.id, { stopChildThreads, result }));\n await Promise.allSettled(stopTasks);\n }\n\n if (!thread.local.active) return;\n\n thread.local.active = false;\n if (thread.ended) return;\n\n await thread.enqueueAndRun({ name: ACTION.ending, result });\n}\n\nexport type ManagedThreadConfig = {\n local: {\n active: boolean;\n parent: IThreadId;\n };\n};\n","import Step from '@onereach/flow-sdk/step';\nimport { ACTION } from '@onereach/flow-sdk/types';\nimport { createMethodDecoratorWithOptionalArguments as createMethodDecoratorWithOptionalArguments } from '../utils/create-method-decorator';\nimport { errorFilter } from '../errors/error-filter';\n\nconst defaultOptions: HookErrorFilterOptions = { allowHandleError: true, useErrorFilter: true };\n\n/**\n * Since errors in hooks are fatal and can't be processed this decorator allows to wrap hook handler\n * and manage errors by ending a thread with the error (preventing sending error to `error` exit)\n * @param options\n * @param options.allowHandleError - Default `true`. If `false` in case of error will end thread with error as result, if `true` will allow to handle error via 'error' exit\n * @param options.useErrorFilter - Default `true`. If `true` every error wild be processed with `errorFilter` utility function\n */\nexport const HookErrorFilter = createMethodDecoratorWithOptionalArguments(\n (options, _target, propertyKey, descriptor) => {\n const originalMethod = descriptor.value;\n if (!originalMethod || typeof originalMethod !== 'function') return;\n\n return function (this: Step, ...arguments_: Parameters<typeof originalMethod>): ReturnType<typeof originalMethod> {\n try {\n const result: unknown = originalMethod.apply(this, arguments_);\n\n if (result instanceof Promise) {\n return result.catch((error) => errorHandler.call(this, options, error, propertyKey));\n }\n\n return result;\n } catch (error) {\n return errorHandler.call(this, options, error, propertyKey) as ReturnType<typeof originalMethod>;\n }\n } as typeof originalMethod;\n },\n defaultOptions,\n);\n\nfunction errorHandler(this: Step, options: HookErrorFilterOptions, error: unknown, propertyKey: string | symbol): void {\n const methodName = propertyKey.toString();\n this.log.DEBUG?.(`Error in method '${methodName}'`, error);\n const filteredError = options.useErrorFilter ? errorFilter(error) : error;\n\n if (filteredError instanceof Error) {\n if (options.allowHandleError) {\n // Send it to the 'error' exit and stop here\n this.thread.enqueue({ name: ACTION.error, error: filteredError });\n return;\n } else {\n // End the thread with the error and stop here\n this.end(filteredError);\n return;\n }\n }\n\n // Only throw if it's not an Error instance and you truly want to bubble it\n throw filteredError;\n}\n\nexport type HookErrorFilterOptions = {\n allowHandleError?: boolean;\n useErrorFilter?: boolean;\n};\n","/* eslint-disable @typescript-eslint/unbound-method */\n\nimport Step from '@onereach/flow-sdk/step';\nimport { ErrorFilter } from '../../decorators/error-filter';\nimport { HookErrorFilter } from '../../decorators/hook-error-filter';\nimport { CreateChatCompletionStepError, ErrorCode } from '../../errors/step-error';\nimport { ParsedArguments, ToolsWorker, ToolsWorkerConfig } from './worker';\nimport { runThread, stopThread } from '../../utils/thread-utilities';\nimport { ACTION } from '@onereach/flow-sdk/types';\n\nimport type { CONFIG, IActionEvent, IEvent, IThreadId } from '@onereach/flow-sdk/types';\nimport type { ChatCompletionMessageFunctionToolCall, ChatCompletionToolMessageParam } from 'openai/resources';\nimport type { DataIn } from '../../schemas/data-in';\nimport type { ChatCompletionConfig } from '../../step';\nimport type { StreamControllerConfig } from '../stream-handler/controller';\n\nexport class ToolsController<TArguments extends ParsedArguments, TResult> extends Step<ToolsControllerConfig<TResult>> {\n public static readonly class = 'tl_ctrl';\n\n public static async start<TResult>(step: Step<ChatCompletionConfig>): Promise<void> {\n const threadId = this.getThreadId(step);\n await runThread<ToolsControllerConfig<TResult>, ChatCompletionConfig>(step, {\n id: threadId,\n state: {\n step: step.id,\n class: this.class,\n\n tasks: {}, // tool calls from LLM response\n expectMoreTasks: true, // flag to indicate if there are more tasks to process\n },\n });\n }\n\n public static async callTool<T extends ChatCompletionConfig | StreamControllerConfig>(\n step: Step<T>,\n toolCall: ChatCompletionMessageFunctionToolCall,\n ): Promise<void> {\n await step.process.enqueueAndRun<EventName['callTool'], CallToolParameters>({\n thread: this.getThreadId(step),\n name: EventName.callTool,\n params: { toolCall },\n });\n }\n\n public static async lastToolCallReceived<T extends ChatCompletionConfig | StreamControllerConfig>(\n step: Step<T>,\n ): Promise<void> {\n // notify tools controller thread that no more tool calls are expected\n // without await to prevent blocking the stream controller thread\n await step.process.enqueueAndRun<EventName['lastToolCallReceived']>({\n thread: this.getThreadId(step),\n name: EventName.lastToolCallReceived,\n });\n }\n\n public static async cancel<TResult>(step: Step<ChatCompletionConfig>): Promise<void> {\n await stopThread<ToolsControllerConfig<TResult>, ChatCompletionConfig>(step, this.getThreadId(step), {\n result: { status: 'cancel' },\n stopChildThreads: true,\n });\n }\n\n public static getThreadId<T extends CONFIG>(step: Step<T>): IThreadId {\n return `llm_cmp_${this.class}_${step.id}`;\n }\n\n // ---------------------------------------\n\n @ErrorFilter\n public runStep(): void {\n this.triggers\n .local(EventName.callTool, this.onCallTool)\n .local(EventName.lastToolCallReceived, this.onLastToolCallReceived)\n .otherwise(this.initialize);\n }\n\n @ErrorFilter\n public initialize(): void {\n this.log.DEBUG?.('Initializing tools controller thread');\n this.validateMergeFieldType();\n }\n\n @ErrorFilter\n public onCallTool(event: IEvent<CallToolParameters, EventName['callTool']>): void {\n const { toolCall } = event.params;\n\n // TODO: support other tool types\n if (toolCall.type !== 'function') {\n throw new CreateChatCompletionStepError('Only function tools are supported at the moment', {\n code: ErrorCode.UNSUPPORTED,\n });\n }\n\n this.state.tasks[toolCall.id] = {\n call: toolCall,\n status: 'pending',\n };\n\n this.startToolWorkerThread(toolCall);\n }\n\n @ErrorFilter\n public onLastToolCallReceived(): void {\n this.log.DEBUG?.('No more tool calls expected', this.state.tasks);\n this.state.expectMoreTasks = false; // set flag to indicate no more tasks expected\n this.tryEndToolsControllerThread();\n }\n\n /**\n * Starts the tool worker thread to process the tool call.\n */\n protected startToolWorkerThread(toolCall: ChatCompletionMessageFunctionToolCall): void {\n // TODO: handle error from tool worker thread\n // subscribe to tool worker thread end event\n this.triggers.hook<ToolsWorkerConfig<TArguments, TResult>, ACTION.end>(\n { name: ACTION.end, thread: ToolsWorker.getThreadId(toolCall) },\n this.onWorkerThreadEnd,\n );\n\n void ToolsWorker.start<TArguments, TResult>(this, toolCall);\n }\n\n @HookErrorFilter({ allowHandleError: false })\n public onWorkerThreadEnd(event: IActionEvent<ToolsWorkerConfig<TArguments, TResult>, ACTION.end>): void {\n this.log.DEBUG?.('Tool caller worker thread has ended', event);\n\n const { result } = event.params;\n\n if (result == undefined) {\n throw new CreateChatCompletionStepError('Tool worker ended unexpectedly', {\n code: ErrorCode.STEP_LOGIC_ISSUE,\n });\n } else if (result instanceof Error) {\n throw new CreateChatCompletionStepError('Tool worker thread ended with error', result, {\n code: ErrorCode.STEP_LOGIC_ISSUE,\n });\n }\n\n // if thread was cancelled do nothing\n if (result.status === 'cancel') return;\n\n // TODO: validate structure of the result (zod?)\n this.log.DEBUG?.(`Tool worker thread completed successfully`, {\n toolCallId: result.toolCallId,\n result: result.data,\n });\n this.setToolCallResult(result.toolCallId, result.data);\n\n this.tryEndToolsControllerThread();\n }\n\n protected setToolCallResult(toolCallId: string, result: TResult): void {\n const toolCall = this.state.tasks[toolCallId];\n\n if (toolCall == undefined) {\n throw new CreateChatCompletionStepError(`Unknown tool call with id '${toolCallId}'`, {\n code: ErrorCode.STEP_LOGIC_ISSUE,\n });\n }\n\n toolCall.status = 'completed';\n toolCall.result = result;\n }\n\n protected tryEndToolsControllerThread(): void {\n if (this.state.expectMoreTasks) return;\n\n // TODO: handle errored out tool calls\n\n // check if all tool calls are completed\n const hasActiveTasks = Object.values(this.state.tasks).some((task) => task.status === 'pending');\n if (hasActiveTasks) return;\n\n this.log.DEBUG?.('All tool calls completed or failed', this.state.tasks);\n this.end({\n status: 'ok',\n messages: this.messages,\n });\n }\n\n protected get messages(): ChatCompletionToolMessageParam[] {\n return Object.values(this.state.tasks).map((task) => ({\n role: 'tool',\n tool_call_id: task.call.id,\n content: JSON.stringify(task.result),\n }));\n }\n\n protected validateMergeFieldType(): void {\n const { functionsList } = this.data;\n if (!Array.isArray(functionsList) || functionsList.length === 0) return; // no functions used\n\n if (this.dataOut == undefined || this.getMergeField(this.dataOut).type !== 'thread') {\n throw new CreateChatCompletionStepError('Merge-field type has to be \"Thread\" if you are using functions', {\n code: ErrorCode.VALIDATION,\n });\n }\n }\n}\n\n// ----------------- TYPES -----------------\n\nexport const EventName = {\n callTool: 'tl_run_call',\n lastToolCallReceived: 'tl_rsp_end',\n} as const;\nexport type EventName = typeof EventName;\n\nexport type ToolCallTask<TResult> = {\n status: 'pending' | 'completed' | 'failed';\n call: ChatCompletionMessageFunctionToolCall;\n result?: TResult; // result of the tool call, if completed\n};\nexport type TasksMap<TResult> = Record<ChatCompletionMessageFunctionToolCall['id'], ToolCallTask<TResult>>;\n\nexport type ToolsControllerResultOk = {\n status: 'ok';\n messages: ChatCompletionToolMessageParam[]; // messages to be sent to the LLM\n};\nexport type ToolsControllerResultCancel = {\n status: 'cancel';\n messages?: undefined;\n};\nexport type ToolsControllerResult = ToolsControllerResultOk | ToolsControllerResultCancel;\n\nexport type CallToolParameters = {\n toolCall: ChatCompletionMessageFunctionToolCall;\n};\n\nexport type ToolsControllerEvents =\n | IEvent<CallToolParameters, EventName['callTool']>\n | IEvent<never, EventName['lastToolCallReceived']>;\n\nexport type ToolsControllerState<TResult> = {\n class: typeof ToolsController.class;\n\n tasks: TasksMap<TResult>; // tool calls from LLM response,\n expectMoreTasks: boolean; // flag to indicate if there are more tasks to process\n};\n\nexport type ToolsControllerLocal = {\n parent: IThreadId;\n active: boolean;\n};\n\nexport interface ToolsControllerConfig<TResult> extends CONFIG {\n dataIn: DataIn;\n state: ToolsControllerState<TResult>;\n local: ToolsControllerLocal;\n result: ToolsControllerResult;\n events: ToolsControllerEvents;\n}\n","import Step from '@onereach/flow-sdk/step';\nimport { ErrorFilter } from '../../decorators/error-filter';\nimport { runThread } from '../../utils/thread-utilities';\n\nimport type { CONFIG, IThreadId } from '@onereach/flow-sdk/types';\nimport type { ChatCompletionMessageFunctionToolCall } from 'openai/resources';\nimport type { DataIn } from '../../schemas/data-in';\nimport type { ToolsControllerConfig } from './controller';\n\nexport class ToolsWorker<TArguments extends ParsedArguments, TResult> extends Step<\n ToolsWorkerConfig<TArguments, TResult>\n> {\n public static readonly class = 'tl_wrk';\n\n public static async start<TArguments_ extends ParsedArguments, TResult>(\n step: Step<ToolsControllerConfig<TResult>>,\n toolCall: ChatCompletionMessageFunctionToolCall,\n ): Promise<void> {\n // parse tool call arguments if they are in string format\n const parsedArguments = JSON.parse(toolCall.function?.arguments) as TArguments_;\n\n await runThread<ToolsWorkerConfig<TArguments_, TResult>, ToolsControllerConfig<TResult>>(step, {\n id: this.getThreadId(toolCall),\n state: {\n step: step.id,\n class: this.class,\n },\n local: {\n toolCall,\n parsedArguments,\n },\n });\n }\n\n public static getThreadId(toolCall: ChatCompletionMessageFunctionToolCall): IThreadId {\n return `llm_cmp_${this.class}_${toolCall.id}`;\n }\n\n // -----------------------------------------------------------------------------------\n\n /**\n * Initializes the tool worker thread to handle processing of repackaged content chunks.\n */\n @ErrorFilter\n public runStep(): void {\n const { toolCall, parsedArguments } = this.local as ToolsWorkerLocal<TArguments>; // TODO: remove type cast\n\n this.log.DEBUG?.('Initializing tool worker thread', toolCall);\n this.exitStep(this.getExitName(/*toolCall*/), {\n toolCall: {\n id: toolCall.id,\n type: toolCall.type,\n function: {\n name: toolCall.function.name,\n arguments: parsedArguments, // use parsed arguments\n },\n },\n });\n }\n\n protected getExitName(/*toolCall: ChatCompletionMessageFunctionToolCall*/): string {\n // TODO: add support for exits based on individual functions\n return 'function';\n }\n}\n\n// ----------------- TYPES -----------------\n\nexport type ParsedArguments<TArguments extends Record<string, unknown> = Record<string, unknown>> = TArguments;\nexport type ToolCallWithParsedArguments<TArguments extends ParsedArguments> = {\n id: string;\n type: 'function';\n function: {\n name: string;\n arguments: TArguments;\n };\n};\nexport type ToolsWorkerMergeField<TArguments extends ParsedArguments> = {\n toolCall: ToolCallWithParsedArguments<TArguments>;\n};\n\nexport type ToolsWorkerOut<TArguments extends ParsedArguments> = ToolsWorkerMergeField<TArguments>;\n\nexport type ToolsWorkerState = {\n class: typeof ToolsWorker.class;\n};\n\nexport type ToolsWorkerLocal<TArguments extends ParsedArguments> = {\n parent: IThreadId;\n active: boolean;\n\n toolCall: ChatCompletionMessageFunctionToolCall;\n parsedArguments: TArguments;\n};\n\nexport type ThreadWorkerResultOk<TResult> = {\n status: 'ok';\n toolCallId: string; // ID of the tool call that was processed\n data: TResult; // result of the tool call\n};\nexport type ThreadWorkerResultCancel = {\n status: 'cancel';\n};\nexport type ThreadWorkerResult<TResult> = ThreadWorkerResultOk<TResult> | ThreadWorkerResultCancel;\n\nexport interface ToolsWorkerConfig<TArguments extends ParsedArguments, TResult> extends CONFIG {\n dataIn: DataIn;\n dataOut: ToolsWorkerOut<TArguments>;\n state: ToolsWorkerState;\n result: ThreadWorkerResult<TResult>;\n local: ToolsWorkerLocal<TArguments>;\n}\n","import { z } from 'zod/v4-mini';\nimport { StreamChunkParameters as StreamChunkParameters } from '../controller';\nimport { ChatCompletionChunk } from 'openai/resources';\nimport { IEvent } from '@onereach/flow-sdk/types';\n\nexport const streamChunkEventSchema = z.object({\n name: z.string(),\n params: z.object({\n chunk: z.object({\n id: z.string(),\n object: z.literal('chat.completion.chunk'),\n created: z.number(),\n model: z.string(),\n service_tier: z.optional(\n z.union([\n z.literal('default'),\n z.literal('auto'),\n z.literal('flex'),\n z.literal('scale'),\n z.literal('priority'),\n z.null(),\n ]),\n ),\n system_fingerprint: z.optional(z.string()),\n choices: z.array(\n z.object({\n index: z.number(),\n delta: z.object({\n role: z.optional(z.enum(['developer', 'system', 'user', 'assistant', 'tool'])),\n content: z.nullish(z.string()),\n refusal: z.nullish(z.string()),\n tool_calls: z.optional(\n z.array(\n z.object({\n index: z.number().check(z.int(), z.gte(0)),\n id: z.optional(z.string()),\n type: z.optional(z.literal('function')),\n function: z.object({\n name: z.optional(z.string()),\n arguments: z.optional(z.string()),\n }),\n }) satisfies z.core.$ZodType<ChatCompletionChunk.Choice.Delta.ToolCall>,\n ),\n ),\n }),\n logprobs: z.optional(z.any()), // logprobs may be null or omitted\n finish_reason: z.union([\n z.literal('stop'),\n z.literal('length'),\n z.literal('tool_calls'),\n z.literal('content_filter'),\n z.null(),\n ]),\n }),\n ),\n\n logprobs: z.nullish(\n z.object({\n content: z.nullable(z.array(z.looseObject({}))),\n refusal: z.nullable(z.array(z.looseObject({}))),\n }),\n ),\n\n usage: z.nullish(\n z.object({\n prompt_tokens: z.number(),\n completion_tokens: z.number(),\n total_tokens: z.number(),\n completion_tokens_details: z.optional(\n z.object({\n accepted_prediction_tokens: z.optional(z.number()),\n audio_tokens: z.optional(z.number()),\n reasoning_tokens: z.optional(z.number()),\n rejected_prediction_tokens: z.optional(z.number()),\n }),\n ),\n prompt_tokens_details: z.optional(\n z.object({\n audio_tokens: z.optional(z.number()),\n cached_tokens: z.optional(z.number()),\n }),\n ),\n }),\n ),\n }) satisfies z.core.$ZodType<ChatCompletionChunk>,\n }),\n}) satisfies z.core.$ZodType<IEvent<StreamChunkParameters>>;\n\nexport type StreamChunkEvent = z.infer<typeof streamChunkEventSchema>;\n","import type {\n ChatCompletion,\n ChatCompletionChunk,\n ChatCompletionMessage,\n ChatCompletionMessageFunctionToolCall,\n ChatCompletionMessageToolCall,\n} from 'openai/resources';\nimport { ParsedArguments } from '../../tools-caller/worker';\n\nexport class StreamReducerService<TArguments = ParsedArguments> {\n protected _result: Partial<ChatCompletion>;\n protected readonly _onToolCall: OnToolCallCallback<TArguments>;\n\n constructor(memo: Partial<ChatCompletion>, onToolCall: OnToolCallCallback<TArguments>) {\n this._result = memo;\n this._onToolCall = onToolCall;\n }\n\n public reduceChunk(chunk: ChatCompletionChunk): void {\n if (Object.keys(this._result).length === 0) {\n const { choices, ...rest } = chunk; // eslint-disable-line @typescript-eslint/no-unused-vars\n Object.assign(this._result, rest);\n\n if (this._result.object != undefined) {\n this._result.object = 'chat.completion';\n }\n }\n\n if (chunk.usage) {\n this._result.usage = chunk.usage;\n // return\n }\n\n for (const choice of chunk.choices) {\n let existing = this._result.choices?.[choice.index];\n\n if (!existing) {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { delta, ...rest } = choice;\n existing = rest as ChatCompletion.Choice;\n this._result.choices ??= [];\n this._result.choices[choice.index] = existing;\n }\n\n if (choice.finish_reason != undefined) {\n existing.finish_reason = choice.finish_reason;\n }\n\n if (choice.logprobs != undefined) {\n existing.logprobs = choice.logprobs;\n }\n\n if (choice.delta?.content != undefined) {\n const { content, ...delta } = choice.delta;\n existing.message ??= delta as ChatCompletionMessage;\n existing.message.content ??= '';\n existing.message.content += content;\n }\n\n if (choice.delta?.tool_calls != undefined) {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { tool_calls, ...delta } = choice.delta;\n existing.message ??= delta as ChatCompletionMessage;\n existing.message.tool_calls ??= [];\n\n for (const deltaToolCall of choice.delta.tool_calls) {\n const index = deltaToolCall.index;\n if (existing.message.tool_calls[index] == undefined) {\n existing.message.tool_calls[index] = structuredClone(\n deltaToolCall,\n ) as ChatCompletionMessageFunctionToolCall;\n } else {\n const toolCall = existing.message.tool_calls[index];\n if (!('function' in toolCall) || toolCall.function == undefined) continue;\n\n toolCall.function.arguments += deltaToolCall.function?.arguments ?? '';\n }\n\n // set immediate to not block the event loop\n if (choice.index === 0) {\n this.tryParseToolCall(existing.message.tool_calls[index]);\n }\n }\n }\n }\n }\n\n protected tryParseToolCall(toolCall: ChatCompletionMessageToolCall): void {\n try {\n if (!('function' in toolCall) || toolCall.function == undefined) return;\n const parsedArguments = JSON.parse(toolCall.function.arguments) as TArguments;\n this._onToolCall(toolCall, parsedArguments);\n } catch {\n // if failed to parse, just ignore it assume it's not fully loaded yet\n }\n }\n}\n\nexport type OnToolCallCallback<TArguments = ParsedArguments> = (\n toolCall: ChatCompletionMessageFunctionToolCall,\n parsedArguments: TArguments,\n) => void;\n","/* eslint-disable @typescript-eslint/unbound-method */\n\nimport Step from '@onereach/flow-sdk/step';\nimport { ErrorFilter } from '../../decorators/error-filter';\nimport { runThread, stopThread } from '../../utils/thread-utilities';\n\nimport type { CONFIG, IThreadId, IEvent } from '@onereach/flow-sdk/types';\nimport type { DataIn } from '../../schemas/data-in';\nimport type { ChatCompletionConfig } from '../../step';\n\nexport class CancelController extends Step<CancelControllerConfig> {\n public static readonly class = 'cncl_ctrl';\n\n public static async start(step: Step<ChatCompletionConfig>): Promise<void> {\n await runThread<CancelControllerConfig, ChatCompletionConfig>(\n step,\n {\n id: this.getThreadId(step),\n state: {\n step: step.id,\n class: this.class,\n },\n },\n { force: true },\n );\n }\n\n public static async stop(step: Step<ChatCompletionConfig>): Promise<void> {\n await stopThread(step, this.getThreadId(step));\n }\n\n public static getThreadId<T extends CONFIG>(step: Step<T>): IThreadId {\n return `llm_cmp_${this.class}_${step.id}`;\n }\n\n // ---------------------------------------\n\n @ErrorFilter\n public runStep(): void {\n // TODO: remove casting to `any`\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-explicit-any\n this.triggers.hook({ name: this.cancelEventName as any, thread: '*' }, this.onCancel).otherwise(() => {\n this.log.DEBUG?.('Initializing cancel controller thread');\n });\n }\n\n @ErrorFilter\n public onCancel(): void {\n this.log.DEBUG?.('Canceling LLM request');\n // TODO: fix this local usage\n // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-member-access\n const parentThreadId = (this.local as any).parent as string;\n const parentThread = this.process.getThread<ChatCompletionConfig>(parentThreadId);\n\n if (!parentThread) return this.end();\n\n // TODO: fix this access to step class\n const parentThreadStep = parentThread.getSafeStepInstance(this.currentStepId);\n // eslint-disable-next-line @typescript-eslint/no-unsafe-call, @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-member-access\n (parentThreadStep as any).onCancel();\n }\n\n public get cancelEventName(): string {\n return `${CancelController.class}/${this.currentStepId}`;\n }\n}\n\n// ----------------- TYPES -----------------\n\nexport type CancelControllerEvents = IEvent<never, string>;\n\nexport type CancelControllerState = {\n class: typeof CancelController.class;\n};\n\nexport type CancelControllerLocal = {\n parent: IThreadId;\n active: boolean;\n};\n\nexport interface CancelControllerConfig extends CONFIG {\n dataIn: DataIn;\n state: CancelControllerState;\n events: CancelControllerEvents;\n local: CancelControllerLocal;\n}\n","/* eslint-disable @typescript-eslint/unbound-method */\n\nimport Step from '@onereach/flow-sdk/step';\nimport { HistoryController } from './layers/history/controller';\nimport { StreamController, StreamControllerConfig } from './layers/stream-handler/controller';\nimport { ToolsController, ToolsControllerConfig } from './layers/tools-caller/controller';\nimport { ErrorFilter } from './decorators/error-filter';\nimport { HookErrorFilter } from './decorators/hook-error-filter';\nimport { AbortRequestError, CreateChatCompletionStepError, ErrorCode } from './errors/step-error';\nimport { type DataIn, dataInSchema } from './schemas/data-in';\nimport { OpenAIRequestService } from './services/openai-request';\nimport { Memoize } from 'typescript-memoize';\nimport { validateFlowSdkVersion } from './utils/validate-flow-sdk-version';\nimport { ACTION } from '@onereach/flow-sdk/types';\nimport { APIUserAbortError } from 'openai/error';\n\nimport type {\n ChatCompletion,\n ChatCompletionChunk,\n ChatCompletionMessageFunctionToolCall,\n ChatCompletionMessageParam,\n ChatCompletionToolMessageParam,\n} from 'openai/resources';\nimport type { CONFIG, IActionEvent } from '@onereach/flow-sdk/types';\nimport type { Stream } from 'openai/core/streaming.js';\nimport { CancelController } from './layers/cancel/controller';\n\nconst MINIMAL_FLOW_SDK_VERSION = '8.0.32';\n\nexport class CreateChatCompletionStep<TResult> extends Step<ChatCompletionConfig> {\n private abortController?: AbortController;\n\n @ErrorFilter\n public async resolveDataIn() {\n const dataIn = await super.resolveDataIn();\n\n // validate dataIn against schema\n this.log.DEBUG?.('data in before validation', dataIn);\n return dataInSchema.parse(dataIn);\n }\n\n @ErrorFilter\n public runStep(): void {\n const { streamResponse } = this.data;\n\n if (streamResponse) {\n this.triggers.hook<StreamControllerConfig, ACTION.end>(\n { name: ACTION.end, thread: StreamController.getThreadId(this) },\n this.onStreamControllerThreadEnd,\n );\n }\n this.triggers.hook<ToolsControllerConfig<TResult>, ACTION.end>(\n { name: ACTION.end, thread: ToolsController.getThreadId(this) },\n this.onToolsControllerEnd,\n );\n this.triggers.otherwise(this.initRequest);\n }\n\n @ErrorFilter\n public async initRequest(): Promise<void> {\n await validateFlowSdkVersion(MINIMAL_FLOW_SDK_VERSION);\n\n this.resetState();\n\n const { streamResponse } = this.data;\n\n await Promise.all([\n ToolsController.start(this),\n streamResponse ? StreamController.start(this) : undefined,\n HistoryController.start(this),\n CancelController.start(this),\n ]);\n\n // prepare messages history for the request\n await HistoryController.prepareHistory(this);\n\n try {\n this.state.state = 'active-request';\n this.abortController = new AbortController();\n const response = await this.openAiService.makeOpenAiRequest(this.history, this.abortController.signal);\n await (streamResponse\n ? this.handleStreamResponse(response as Stream<ChatCompletionChunk>)\n : this.handleResponse(response as ChatCompletion));\n } catch (error) {\n if (error instanceof APIUserAbortError) {\n await this.resetStep();\n return;\n }\n\n throw error;\n } finally {\n // remove no error\n if (this.abortController) this.abortController = undefined;\n }\n }\n\n private async handleResponse(response: ChatCompletion): Promise<void> {\n this.log.DEBUG?.('Start processing response from LLM');\n\n // set result to state\n this.state.chatCompletion = response;\n this.state.contentReady = true;\n this.state.state = 'processing';\n\n this.abortController = undefined;\n\n // TODO: handle multiple choices\n if (response.choices.length > 1) {\n this.log.WARN?.('Multiple choices received from LLM, but only the first one will be processed', {\n choicesNumber: response.choices.length,\n });\n }\n\n const choice = response.choices[0];\n\n // Process tool calls if any\n const toolCalls = choice?.message.tool_calls ?? [];\n for (const toolCall of toolCalls) {\n await ToolsController.callTool(this, toolCall as ChatCompletionMessageFunctionToolCall);\n }\n\n // notify ToolsController no more tool calls will be made\n await ToolsController.lastToolCallReceived(this);\n }\n\n private async handleStreamResponse(response: Stream<ChatCompletionChunk>): Promise<void> {\n this.log.DEBUG?.('Start processing stream of chunks from LLM');\n\n for await (const chunk of response) {\n // send each chunk to the controller thread for processing\n await StreamController.handleChunk(this, chunk);\n }\n\n this.state.state = 'processing';\n this.abortController = undefined;\n\n // send last chunk to the controller thread to mark the end of the stream\n await StreamController.lastChunkReceived(this);\n }\n\n @HookErrorFilter\n public async onToolsControllerEnd(event: IActionEvent<ToolsControllerConfig<TResult>, ACTION.end>): Promise<void> {\n const { result } = event.params;\n\n this.log.DEBUG?.('Tools controller ended with messages', result);\n\n if (result instanceof Error) {\n throw new CreateChatCompletionStepError('Tools controller thread ended with an error', result, {\n code: ErrorCode.STEP_LOGIC_ISSUE,\n });\n }\n\n // TODO: validate result with zod schema\n\n // do nothing on cancel\n if (result?.status === 'cancel') return;\n\n const { status, messages } = result ?? {};\n\n if (status !== 'ok' || !Array.isArray(messages)) {\n throw new CreateChatCompletionStepError('Unexpected end of the tools controller thread', {\n code: ErrorCode.STEP_LOGIC_ISSUE,\n data: event.params.result,\n });\n }\n\n this.state.toolsResults = messages;\n this.state.toolsReady = true;\n\n await this.tryToExitStep();\n }\n\n @HookErrorFilter\n public async onStreamControllerThreadEnd(event: IActionEvent<StreamControllerConfig, ACTION.end>): Promise<void> {\n const { result } = event.params;\n this.log.DEBUG?.('Stream controller ended with result', result);\n\n if (result instanceof Error) {\n throw new CreateChatCompletionStepError('Stream controller thread ended with an error', result, {\n code: ErrorCode.STEP_LOGIC_ISSUE,\n });\n }\n\n // do nothing on cancel\n if (result?.status === 'cancel') return;\n\n // TODO: figure out better way to check for correct structure of the event (zod?)\n const { status, completion } = result ?? {};\n\n if (status !== 'ok' || completion == undefined) {\n throw new CreateChatCompletionStepError('Unexpected end of the stream controller thread', {\n code: ErrorCode.STEP_LOGIC_ISSUE,\n data: event.params.result,\n });\n }\n\n this.log.DEBUG?.('Create Chat Completion result', completion);\n\n this.state.contentReady = true;\n this.state.chatCompletion = completion;\n\n await this.tryToExitStep();\n }\n\n private async tryToExitStep(): Promise<void> {\n const { toolsReady, contentReady, chatCompletion, toolsResults } = this.state;\n if (!toolsReady || !contentReady) return;\n\n if (chatCompletion == undefined) {\n throw new CreateChatCompletionStepError('Missing chat completion result, but request is marked as processed', {\n code: ErrorCode.STEP_LOGIC_ISSUE,\n });\n }\n\n const completionMessage = chatCompletion.choices?.[0]?.message;\n if (completionMessage == undefined) {\n throw new CreateChatCompletionStepError('Missing completion message in chat completion result', {\n code: ErrorCode.STEP_LOGIC_ISSUE,\n });\n }\n\n // add completion message and possible tool results to history\n await HistoryController.appendToHistory(this, [completionMessage, ...toolsResults]);\n\n if (chatCompletion?.choices?.[0]?.finish_reason === 'tool_calls') {\n // reset the step and run request again\n this.state.state = 'ready';\n this.thread.jumpTo(this.currentStepId);\n return;\n }\n\n if (chatCompletion == undefined) {\n throw new CreateChatCompletionStepError('Missing chat completion result, but request is marked as processed', {\n code: ErrorCode.STEP_LOGIC_ISSUE,\n });\n }\n\n // both tools and content are ready, we can exit the step\n this.log.DEBUG?.('Exiting step with collected data', chatCompletion);\n this.exitStep('next', { ...chatCompletion, _history: this.history });\n }\n\n @ErrorFilter\n public async onCancel(): Promise<void> {\n const abortController = this.abortController;\n if (abortController) {\n abortController.abort(new AbortRequestError('Request cancelled'));\n } else {\n await this.resetStep();\n }\n }\n\n /**\n * Reset the step so it can handle new request\n *\n * - Reset state of initial thread (e.g. main) to original state;\n * - End ToolsController thread (with its child threads);\n * - End StreamController (with child thread);\n */\n private async resetStep(): Promise<void> {\n const { streamResponse } = this.data;\n\n this.resetState();\n\n const threadCancelTasks = [ToolsController.cancel<TResult>(this)];\n if (streamResponse) threadCancelTasks.push(StreamController.cancel(this));\n const result = await Promise.allSettled(threadCancelTasks);\n\n const failedTask = result.find((task) => task.status === 'rejected');\n if (failedTask) {\n throw failedTask.reason instanceof Error ? failedTask.reason : new Error(String(failedTask.reason));\n }\n }\n\n private resetState(): void {\n this.state.state = 'ready';\n this.state.contentReady = false;\n this.state.toolsReady = false;\n this.state.chatCompletion = undefined;\n this.state.toolsResults = [];\n\n this.abortController = undefined;\n }\n\n private get history(): ChatCompletionMessageParam[] {\n return HistoryController.getHistory(this);\n }\n\n @Memoize()\n private get openAiService(): OpenAIRequestService<ChatCompletionConfig> {\n return new OpenAIRequestService(this.thread, this.data);\n }\n}\n\nexport const events = {\n resetState: 'rst', // TODO: should it be unique with step id if multiple active steps are working in different threads?\n};\nexport type EventName = typeof events;\n\nexport type ChatCompletionOut = ChatCompletion & {\n _history: ChatCompletionMessageParam[];\n};\n\nexport type ChatCompletionState = {\n state: 'ready' | 'active-request' | 'processing';\n toolsReady: boolean;\n contentReady: boolean;\n chatCompletion?: ChatCompletion;\n toolsResults: ChatCompletionToolMessageParam[];\n};\n\nexport interface ChatCompletionConfig extends CONFIG {\n dataIn: DataIn;\n dataOut: ChatCompletionOut;\n state: ChatCompletionState;\n}\n","import { z } from 'zod/v4-mini';\nimport { en } from 'zod/v4/locales';\n\nz.config(en());\n\n// string that prevents\nconst stringNoUndefinedSchema = z.string().check(\n z.trim(),\n z.refine((value) => !['undefined', 'null'].includes(value), {\n error: 'Unexpected undefined or null merge-field value',\n }),\n);\n\nconst messageSchema = z.discriminatedUnion('role', [\n z.object({\n role: z.literal('system'),\n content: stringNoUndefinedSchema,\n }),\n z.object({\n role: z.literal('user'),\n content: stringNoUndefinedSchema,\n name: z.optional(stringNoUndefinedSchema.check(z.minLength(1), z.maxLength(64))),\n }),\n z.object({\n role: z.literal('assistant'),\n content: z.nullable(stringNoUndefinedSchema),\n\n // TODO: add support for annotations and refusal\n // params to support in the future\n // refusal: z.nullable(z.string().check(z.trim(), z.minLength(1))),\n // annotations: z.optional(z.array(z.any())), // TODO: replace z.any() with more details\n tool_calls: z.optional(\n z.array(\n z.object({\n id: stringNoUndefinedSchema.check(z.minLength(1)),\n type: z.literal('function'),\n function: z.object({\n name: stringNoUndefinedSchema.check(z.minLength(1)),\n arguments: stringNoUndefinedSchema.check(z.minLength(1)),\n }),\n }),\n ),\n ),\n }),\n z.object({\n role: z.literal('tool'),\n content: stringNoUndefinedSchema,\n name: z.optional(stringNoUndefinedSchema.check(z.minLength(1), z.maxLength(64))),\n tool_call_id: stringNoUndefinedSchema.check(z.minLength(1)),\n }),\n]);\nexport type Message = z.infer<typeof messageSchema>;\n\nconst functionParametersBaseSchema = z.object({\n type: z.literal('object'),\n properties: z.record(\n z.string().check(z.minLength(1), z.maxLength(64)),\n z.object({\n type: z.enum(['string', 'number', 'boolean', 'array', 'object']),\n description: z.optional(z.string().check(z.maxLength(1000))),\n items: z.optional(\n z.object({\n type: z.enum(['string', 'number', 'boolean', 'object']),\n description: z.optional(z.string().check(z.maxLength(1000))),\n }),\n ),\n }),\n ),\n // next two params would be injected with z.transform()\n // required: z.optional(z.array(z.string().check(z.minLength(1), z.maxLength(64)))),\n // additionalProperties: z._default(z.literal(false), false),\n});\nexport const dataInSchema = z\n .object({\n provider: stringNoUndefinedSchema.check(z.minLength(1)),\n model: stringNoUndefinedSchema.check(z.minLength(1)),\n accountKey: optionalStringValue(stringNoUndefinedSchema),\n\n typeOfStep: z.enum(['chat', 'completion']),\n\n systemMessage: z.optional(stringNoUndefinedSchema),\n userMessage: z.optional(stringNoUndefinedSchema),\n switchAssistantsMessage: z._default(z.boolean(), false), // Add assistant's first message\n assistantsFirstMessage: z.optional(stringNoUndefinedSchema),\n\n // llm generation\n temperature: optionalStringValue(z.coerce.number().check(z.gte(0), z.lte(2))),\n topP: optionalStringValue(z.coerce.number().check(z.gte(0), z.lte(1))),\n maxTokens: optionalStringValue(z.coerce.number().check(z.int(), z.gte(1))),\n presencePenalty: optionalStringValue(z.coerce.number().check(z.gte(-2), z.lte(2))),\n frequencyPenalty: optionalStringValue(z.coerce.number().check(z.gte(-2), z.lte(2))),\n n: optionalStringValue(z.coerce.number().check(z.int(), z.gte(1), z.lte(128))),\n stop: z.optional(\n z\n .array(\n z.object({\n token: z.string().check(z.minLength(1), z.maxLength(64)),\n }),\n )\n .check(z.maxLength(4)),\n ),\n\n // streaming\n streamResponse: z._default(z.boolean(), false),\n streamSettings: z.optional(\n z.object({\n maxBufferLength: z.coerce.number().check(\n z.overwrite((value) => (value === 0 ? 50 : value)), // default value is 50\n z.int(),\n z.gte(1),\n z.lte(32_768),\n ),\n debounceDuration: z.coerce.number().check(z.int(), z.gte(0), z.lte(10_000)), // in milliseconds\n }),\n ),\n\n // history\n customHistory: z._default(z.boolean(), false), // only for 'chat' mode\n historyLength: optionalStringValue(z.coerce.number().check(z.int(), z.gte(1), z.lte(100))),\n historyMode: z.optional(z.enum(['mergefield', 'codeHistory'])),\n historyMergefield: z.optional(z.array(messageSchema)),\n historyCode: z.optional(z.array(messageSchema)),\n\n // function calls\n functionsList: z.array(\n z.object({\n name: stringNoUndefinedSchema.check(z.minLength(1), z.maxLength(64)),\n description: z.optional(stringNoUndefinedSchema.check(z.maxLength(1000))),\n parameters: z.optional(\n z.pipe(\n functionParametersBaseSchema,\n z.transform<\n z.infer<typeof functionParametersBaseSchema> & { additionalProperties: false; required: string[] }\n >((object) => {\n object.required = Object.keys(object.properties);\n object.additionalProperties = false;\n return object;\n }),\n ),\n ),\n strict: z.boolean(),\n }),\n ),\n\n processError: z.boolean(),\n processTimeout: z.boolean(),\n timeoutDuration: stringNoUndefinedSchema.check(z.trim(), z.minLength(1)),\n })\n .check(\n z.refine((data) => !data.streamResponse || data.provider === 'openai', {\n error: 'Streaming is only supported for OpenAI provider',\n }),\n z.refine((data) => !data.streamResponse || data.streamSettings !== undefined, {\n error: 'Missing \"Stream settings\" for response streaming mode',\n }),\n z.refine(\n (data) =>\n data.typeOfStep !== 'chat' ||\n data.customHistory ||\n !data.switchAssistantsMessage ||\n data.assistantsFirstMessage !== undefined,\n { error: 'Missing \"Assistant\\'s first message\" value' },\n ),\n z.refine((data) => data.customHistory || data.userMessage !== undefined, {\n error: 'Missing \"User message\" value',\n }),\n z.refine((data) => data.typeOfStep !== 'chat' || !data.customHistory || data.historyMode !== undefined, {\n error: 'Missing \"History mode\" value',\n }),\n z.refine(\n (data) =>\n data.typeOfStep !== 'chat' ||\n !data.customHistory ||\n data.historyMode !== 'mergefield' ||\n data.historyMergefield !== undefined,\n { error: 'Missing \"History\" data via merge-field' },\n ),\n z.refine(\n (data) =>\n data.typeOfStep !== 'chat' ||\n !data.customHistory ||\n data.historyMode !== 'mergefield' ||\n data.historyMergefield?.find?.((message) => message.role === 'user'),\n {\n error: 'Missing at least one message with role \"user\" message in \"History\" data via merge-field',\n },\n ),\n z.refine(\n (data) =>\n data.typeOfStep !== 'chat' ||\n !data.customHistory ||\n data.historyMode !== 'codeHistory' ||\n data.historyCode !== undefined,\n { error: 'Missing \"History\" data as code' },\n ),\n z.refine(\n (data) =>\n data.typeOfStep !== 'chat' ||\n !data.customHistory ||\n data.historyMode !== 'codeHistory' ||\n data.historyCode?.find?.((message) => message.role === 'user'),\n {\n error: 'Missing at least one message with role \"user\" message in \"History\" data via code',\n },\n ),\n );\n\nexport type DataIn = z.infer<typeof dataInSchema>;\n\n/**\n * Convert empty string to undefined before running schema validation\n * @param schema schema to validate against\n * @param defaultValue optional default value\n */\nfunction optionalStringValue<T extends z.core.SomeType>(schema: T) {\n return z.pipe(\n z.union([z.undefined(), z.literal(''), schema]),\n z.transform((value) => (value === '' ? undefined : value)),\n );\n}\n","import OpenAI from 'openai';\nimport timestring from 'timestring';\nimport { z } from 'zod/v4-mini';\nimport { Memoize } from 'typescript-memoize';\nimport BasicThreadService from '@onereach/flow-sdk/services/basic';\n\nimport type { Stream } from 'openai/core/streaming.js';\nimport type {\n ChatCompletion,\n ChatCompletionChunk,\n ChatCompletionMessageParam,\n ChatCompletionTool,\n} from 'openai/resources';\nimport type { DataIn } from '../schemas/data-in';\nimport type { CONFIG, IThread } from '@onereach/flow-sdk/types';\nimport { CreateChatCompletionStepError, ErrorCode } from '../errors/step-error';\n\nexport class OpenAIRequestService<TConfig extends CONFIG> extends BasicThreadService<TConfig> {\n private readonly data: DataIn;\n\n constructor(thread: IThread<TConfig>, data: DataIn) {\n super(thread);\n this.data = data;\n this.log.DEBUG?.('OpenAIRequestService initialized');\n }\n\n /**\n * Makes a request to the OpenAI API to create a chat completion.\n */\n public async makeOpenAiRequest(\n messages: ChatCompletionMessageParam[],\n signal?: AbortSignal,\n ): Promise<ChatCompletion | Stream<ChatCompletionChunk>> {\n const { model, temperature, topP, maxTokens, frequencyPenalty, presencePenalty, n, streamResponse } = this.data;\n\n const request = {\n messages: structuredClone(messages), // clone to avoid mutation\n model,\n temperature,\n top_p: topP,\n max_tokens: maxTokens,\n frequency_penalty: frequencyPenalty,\n presence_penalty: presencePenalty,\n stop: this.stopSequences,\n n,\n stream: streamResponse,\n tools: this.tools,\n };\n this.log.DEBUG?.('LLM request', request);\n\n try {\n const response = await this.openAiClient.chat.completions.create(request, { signal });\n\n if (!streamResponse) this.log.DEBUG?.('LLM response', response);\n\n return response;\n } catch (error) {\n if (!(error instanceof Error)) throw error;\n\n throw new CreateChatCompletionStepError('Chat completion request failed', error, {\n code: ErrorCode.SERVER_ERROR,\n data: request,\n });\n }\n }\n\n private get tools(): ChatCompletionTool[] | undefined {\n const { functionsList } = this.data;\n\n if (!Array.isArray(functionsList) || functionsList.length === 0) return undefined;\n\n return functionsList.map((tool) => ({\n type: 'function' as const,\n function: {\n name: tool.name,\n description: tool.description,\n parameters: !tool.parameters || Object.keys(tool.parameters).length === 0 ? undefined : tool.parameters,\n strict: tool.strict,\n },\n }));\n }\n\n /**\n * Returns the OpenAI client instance configured with the step's data.\n */\n private get openAiClient(): OpenAI {\n const { provider, accountKey } = this.data;\n\n const clientOptions = {\n baseURL: `${this.config.env.OPENAI_API_URL}/${provider}`,\n apiKey: '',\n defaultHeaders: {\n Authorization: this.config.authorization,\n 'x-or-session-id': this.session.get<string>(['reporting', 'sessionId']),\n ...(accountKey ? { 'x-or-account-token-name': accountKey } : undefined),\n },\n timeout: this.timeoutMs,\n };\n this.log.DEBUG?.('OpenAI client options', clientOptions);\n\n return new OpenAI(clientOptions);\n }\n\n private get stopSequences(): string[] {\n const list = this.data.stop ?? [];\n return list.map((item) => item.token).filter((token) => token.length > 0);\n }\n\n /**\n * Returns the timeout duration in milliseconds.\n */\n @Memoize()\n private get timeoutMs(): number {\n const value = timestring(this.data.timeoutDuration, 'ms');\n\n // 1 second to 10 minutes\n return z.number().check(z.int(), z.gte(1000), z.lte(600_000)).parse(value);\n }\n}\n","import { readFile } from 'node:fs/promises';\n\nexport async function validateFlowSdkVersion(minVersion: string): Promise<void> {\n if (typeof minVersion !== 'string' || !/^\\d+\\.\\d+\\.\\d+$/.test(minVersion)) {\n throw new Error(`Invalid minimum version format: ${minVersion}`);\n }\n\n const packageJsonPath = require.resolve('@onereach/flow-sdk/package.json');\n if (!packageJsonPath) {\n throw new Error(`Could not find package.json for @onereach/flow-sdk`);\n }\n // Read the package.json file to get the version\n const packageJsonContent = await readFile(packageJsonPath, 'utf8');\n\n const { version } = JSON.parse(packageJsonContent) as { version: string };\n const { groups } = /^(?<major>\\d+)\\.(?<minor>\\d+)\\.(?<patch>\\d+)/.exec(version) || {};\n\n if (!groups) throw new Error(`Invalid Flow SDK version format: ${version}`);\n\n const major = Number.parseInt(groups.major ?? '0', 10);\n const minor = Number.parseInt(groups.minor ?? '0', 10);\n const patch = Number.parseInt(groups.patch ?? '0', 10);\n\n if (\n major == undefined ||\n minor == undefined ||\n patch == undefined ||\n Number.isNaN(major) ||\n Number.isNaN(minor) ||\n Number.isNaN(patch)\n ) {\n throw new Error(`Invalid version format: ${version}`);\n }\n\n const [minMajor, minMinor, minPatch] = minVersion.split('.').map((x) => Number.parseInt(x, 10));\n\n if (\n minMajor == undefined ||\n minMinor == undefined ||\n minPatch == undefined ||\n Number.isNaN(minMajor) ||\n Number.isNaN(minMinor) ||\n Number.isNaN(minPatch)\n ) {\n throw new Error(`Invalid minimum version format: ${minVersion}`);\n }\n\n if (\n major < minMajor ||\n (major === minMajor && minor < minMinor) ||\n (major === minMajor && minor === minMinor && patch < minPatch)\n ) {\n throw new Error(\n `Flow SDK version '${version}' is lower than required minimum version '${minVersion}' for the step`,\n );\n }\n}\n"],"mappings":"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","names":["install","Step","createMethodDecoratorWithOptionalArguments","apply","defaultOptions","runApply","options","target","propertyKey","descriptor","maybe","originalMethod","value","wrappedMethod","name","undefined","Object","defineProperty","__name","argument0","argument1","argument2","TimeoutError","z","BaseError","ErrorCode","UNKNOWN","STEP_LOGIC_ISSUE","AUTH","TIMEOUT","VALIDATION","INVALID_REQUEST","RATE_LIMITED","LLM_FINISH_LENGTH","SERVER_ERROR","UNSUPPORTED","CreateChatCompletionStepError","BaseError","AbortRequestError","errorFilter","error","CreateChatCompletionStepError","TimeoutError","z","core","$ZodError","prettifyError","code","ErrorCode","VALIDATION","Error","message","includes","TIMEOUT","responseErrorMessage","response","data","undefined","SERVER_ERROR","UNKNOWN","defaultOptions","ErrorFilter","createMethodDecoratorWithOptionalArguments","_options","_target","propertyKey","descriptor","originalMethod","value","arguments_","result","apply","Promise","catch","error","methodName","toString","log","DEBUG","errorFilter","_ts_decorate","decorators","target","key","desc","__name","HistoryController","Step","class","start","step","threadId","getThreadId","process","getThread","undefined","thread","runThread","id","background","state","messages","prepareHistory","enqueueAndRun","name","events","appendToHistory","message","params","getHistory","getSafeThread","runStep","triggers","local","onPrepareHistory","onAppendToHistory","otherwise","log","DEBUG","customHistory","historyLength","systemMessage","typeOfStep","userMessage","historyMode","historyMergefield","historyCode","assistantsFirstMessage","data","role","content","length","push","at","some","slice","systemMessageRecord","unshift","event","Array","isArray","Step","Step","ACTION","runThread","step","id","state","local","options","force","thread","process","getThread","log","DEBUG","undefined","background","parent","active","ended","Error","enqueueAndRun","name","ACTION","goto","isThreadBusy","threadId","Boolean","listChildThreads","parentThreadId","childThreads","threads","item","push","stopThread","result","stopChildThreads","stopTasks","map","child","Promise","allSettled","ending","StreamWorker","Step","class","start","step","event","runThread","id","getThreadId","state","isBusy","isThreadBusy","runStep","undefined","CreateChatCompletionStepError","code","ErrorCode","STEP_LOGIC_ISSUE","chunk","log","DEBUG","exitStep","streamWorkerExits","ACTION","defaultOptions","allowHandleError","useErrorFilter","HookErrorFilter","createMethodDecoratorWithOptionalArguments","options","_target","propertyKey","descriptor","originalMethod","value","arguments_","result","apply","Promise","catch","error","errorHandler","call","methodName","toString","log","DEBUG","filteredError","errorFilter","Error","thread","enqueue","name","ACTION","end","Step","Step","ToolsWorker","Step","class","start","step","toolCall","parsedArguments","JSON","parse","function","arguments","runThread","id","getThreadId","state","local","runStep","log","DEBUG","exitStep","getExitName","type","name","ACTION","_ts_decorate","decorators","target","key","desc","__name","ToolsController","Step","class","start","step","threadId","getThreadId","runThread","id","state","tasks","expectMoreTasks","callTool","toolCall","process","enqueueAndRun","thread","name","EventName","params","lastToolCallReceived","cancel","stopThread","result","status","stopChildThreads","runStep","triggers","local","onCallTool","onLastToolCallReceived","otherwise","initialize","log","DEBUG","validateMergeFieldType","event","type","CreateChatCompletionStepError","code","ErrorCode","UNSUPPORTED","call","startToolWorkerThread","tryEndToolsControllerThread","hook","ACTION","end","ToolsWorker","onWorkerThreadEnd","undefined","STEP_LOGIC_ISSUE","Error","toolCallId","data","setToolCallResult","Object","values","some","task","messages","map","role","tool_call_id","content","JSON","stringify","functionsList","Array","isArray","length","dataOut","getMergeField","VALIDATION","allowHandleError","z","streamChunkEventSchema","object","name","string","params","chunk","id","literal","created","number","model","service_tier","optional","union","null","system_fingerprint","choices","array","index","delta","role","enum","content","nullish","refusal","tool_calls","check","int","gte","type","function","arguments","logprobs","any","finish_reason","nullable","looseObject","usage","prompt_tokens","completion_tokens","total_tokens","completion_tokens_details","accepted_prediction_tokens","audio_tokens","reasoning_tokens","rejected_prediction_tokens","prompt_tokens_details","cached_tokens","StreamReducerService","_result","_onToolCall","memo","onToolCall","reduceChunk","chunk","Object","keys","length","choices","rest","assign","object","undefined","usage","choice","existing","index","delta","finish_reason","logprobs","content","message","tool_calls","deltaToolCall","structuredClone","toolCall","function","arguments","tryParseToolCall","parsedArguments","JSON","parse","ACTION","_ts_decorate","decorators","target","key","desc","__name","StreamController","Step","class","start","step","runThread","id","getThreadId","state","completionResult","events","lastChunkReceived","index","skipIndexWarning","handleChunk","chunk","process","enqueueAndRun","thread","name","EventName","params","lastStreamChunkReceived","cancel","stopThread","result","status","stopChildThreads","runStep","triggers","hook","ACTION","end","StreamWorker","onWorkerThreadEnd","local","onStreamChunk","onLastStreamChunkReceived","otherwise","log","DEBUG","event","Error","CreateChatCompletionStepError","code","ErrorCode","UNKNOWN","tryRunWorker","streamChunkEventSchema","parse","StreamReducerService","onToolCall","bind","reduceChunk","chunkChoice","choices","handleMultipleChoices","content","delta","undefined","length","addContentToQueue","scheduleNextContentEvent","handleLengthFinishReason","choice","WARN","choiceIndex","finish_reason","LLM_FINISH_LENGTH","toolCall","ToolsController","callTool","firstEvent","isEventReady","lastEvent","at","maxChunkContentLength","mergedChunk","slice","ts","Date","now","push","isBusy","getEventToProcess","completion","eventDelay","debounceDuration","shift","lastToolCallReceived","data","streamSettings","maxBufferLength","allowHandleError","Step","_ts_decorate","decorators","target","key","desc","__name","CancelController","Step","class","start","step","runThread","id","getThreadId","state","force","stop","stopThread","runStep","triggers","hook","name","cancelEventName","thread","onCancel","otherwise","log","DEBUG","parentThreadId","local","parent","parentThread","process","getThread","end","getSafeStepInstance","currentStepId","Step","z","en","z","config","en","stringNoUndefinedSchema","string","check","trim","refine","value","includes","error","messageSchema","discriminatedUnion","object","role","literal","content","name","optional","minLength","maxLength","nullable","tool_calls","array","id","type","function","arguments","tool_call_id","functionParametersBaseSchema","properties","record","enum","description","items","dataInSchema","provider","model","accountKey","optionalStringValue","typeOfStep","systemMessage","userMessage","switchAssistantsMessage","_default","boolean","assistantsFirstMessage","temperature","coerce","number","gte","lte","topP","maxTokens","int","presencePenalty","frequencyPenalty","n","stop","token","streamResponse","streamSettings","maxBufferLength","overwrite","debounceDuration","customHistory","historyLength","historyMode","historyMergefield","historyCode","functionsList","parameters","pipe","transform","required","Object","keys","additionalProperties","strict","processError","processTimeout","timeoutDuration","data","undefined","find","message","schema","union","OpenAI","timestring","z","Memoize","BasicThreadService","OpenAIRequestService","BasicThreadService","data","thread","log","DEBUG","makeOpenAiRequest","messages","signal","model","temperature","topP","maxTokens","frequencyPenalty","presencePenalty","n","streamResponse","request","structuredClone","top_p","max_tokens","frequency_penalty","presence_penalty","stop","stopSequences","stream","tools","response","openAiClient","chat","completions","create","error","Error","CreateChatCompletionStepError","code","ErrorCode","SERVER_ERROR","functionsList","Array","isArray","length","map","tool","type","function","name","description","parameters","Object","keys","undefined","strict","provider","accountKey","clientOptions","baseURL","config","env","OPENAI_API_URL","apiKey","defaultHeaders","Authorization","authorization","session","get","timeout","timeoutMs","OpenAI","item","token","filter","value","timestring","timeoutDuration","z","number","check","int","gte","lte","parse","Memoize","readFile","validateFlowSdkVersion","minVersion","test","Error","packageJsonPath","require","resolve","packageJsonContent","readFile","version","JSON","parse","groups","exec","major","Number","parseInt","minor","patch","undefined","isNaN","minMajor","minMinor","minPatch","split","map","x","ACTION","APIUserAbortError","_ts_decorate","decorators","target","key","desc","__name","MINIMAL_FLOW_SDK_VERSION","CreateChatCompletionStep","Step","abortController","resolveDataIn","dataIn","log","DEBUG","dataInSchema","parse","runStep","streamResponse","data","triggers","hook","name","ACTION","end","thread","StreamController","getThreadId","onStreamControllerThreadEnd","ToolsController","onToolsControllerEnd","otherwise","initRequest","validateFlowSdkVersion","resetState","Promise","all","start","undefined","HistoryController","CancelController","prepareHistory","state","AbortController","response","openAiService","makeOpenAiRequest","history","signal","handleStreamResponse","handleResponse","error","APIUserAbortError","resetStep","chatCompletion","contentReady","choices","length","WARN","choicesNumber","toolCalls","message","tool_calls","toolCall","callTool","lastToolCallReceived","chunk","handleChunk","lastChunkReceived","event","result","params","Error","CreateChatCompletionStepError","code","ErrorCode","STEP_LOGIC_ISSUE","status","messages","Array","isArray","toolsResults","toolsReady","tryToExitStep","completion","completionMessage","appendToHistory","finish_reason","jumpTo","currentStepId","exitStep","_history","onCancel","abort","AbortRequestError","threadCancelTasks","cancel","push","failedTask","allSettled","find","task","reason","String","getHistory","OpenAIRequestService","install","states","HistoryController","class","ToolsController","ToolsWorker","StreamController","StreamWorker","CancelController"]}
package/package.json CHANGED
@@ -1,18 +1,17 @@
1
1
  {
2
2
  "name": "@onereach/step-create-chat-completion",
3
- "version": "0.0.7-rc.30",
3
+ "version": "0.0.7-rc.31",
4
4
  "description": "Logic for creating LLM chat completion step",
5
5
  "keywords": [],
6
6
  "license": "MIT",
7
7
  "author": "Antony Peklo <antony.peklo@onereach.com>",
8
- "type": "commonjs",
8
+ "type": "module",
9
9
  "exports": {
10
10
  ".": {
11
11
  "types": "./dist/index.d.ts",
12
- "require": "./dist/index.js"
12
+ "import": "./dist/index.mjs"
13
13
  }
14
14
  },
15
- "main": "dist/index.js",
16
15
  "types": "dist/index.d.ts",
17
16
  "files": [
18
17
  "dist",