@onereach/step-create-chat-completion 0.0.7-rc.35 → 0.0.7-rc.37
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.d.ts +1 -1
- package/dist/index.mjs +1 -1
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/dist/index.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import Step from '@onereach/flow-sdk/step
|
|
1
|
+
import Step from '@onereach/flow-sdk/step';
|
|
2
2
|
import { z } from 'zod/v4-mini';
|
|
3
3
|
import { CONFIG, IThreadId, RESULT, LOCAL, IThread, IEvent, IStepId, IActionEvent, ACTION, STATE } from '@onereach/flow-sdk/types/index.js';
|
|
4
4
|
import { ChatCompletionMessageFunctionToolCall, ChatCompletionToolMessageParam, ChatCompletion, ChatCompletionChunk, ChatCompletionMessageParam } from 'openai/resources.js';
|
package/dist/index.mjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
var Be=Object.defineProperty;var l=(n,e)=>Be(n,"name",{value:e,configurable:!0});import{install as wt}from"source-map-support";import Ke from"@onereach/flow-sdk/step.js";function te(n,e){function t(r,i,o,a){let c=n(r,i,o,a);if(typeof c=="function"){let f=a.value,w=c;if(f?.name!=null)try{Object.defineProperty(w,"name",{value:f.name})}catch{}return a.value=w,a}return c??a}return l(t,"runApply"),l(function(i,o,a){if(i!==null&&typeof i=="object"&&(typeof o=="string"||typeof o=="symbol")&&a!==null&&typeof a=="object")return t(e,i,o,a);{let c=i??e;return(f,w,m)=>t(c,f,w,m)}},"decoratorOrFactory")}l(te,"createMethodDecoratorWithOptionalArguments");import be from"@onereach/flow-sdk/errors/timeout.js";import{z as we}from"zod/v4-mini";import Te from"@onereach/flow-sdk/errors/base.js";var p={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 Te{static{l(this,"CreateChatCompletionStepError")}},ne=class extends Te{static{l(this,"AbortRequestError")}};var $e=[h,be];function b(n,e={}){let{preserveErrors:t=$e,unknownMessage:r="Unknown error",unknownCode:i=p.UNKNOWN}=e;if(t?.some(o=>n instanceof o))return n;if(n instanceof we.core.$ZodError)return new h(we.prettifyError(n),n,{code:p.VALIDATION});if(typeof n=="string")return new h(n,{code:p.UNKNOWN});if(n instanceof Error){if(n.message.includes("Request timed out"))return new be("Timeout",n,{code:p.TIMEOUT});let o=n?.response?.data?.error?.message;return o!=null?new h(o,n,{code:p.SERVER_ERROR}):new h(r,n,{code:i})}return new h(r,{code:i,data:n})}l(b,"errorFilter");var Ge={},U=te((n,e,t,r)=>{let i=r.value;if(!(!i||typeof i!="function"))return function(...o){try{let a=i.apply(this,o);return a instanceof Promise?a.catch(c=>{let f=t.toString();throw this.log.DEBUG?.(`Error in method '${f}'`,c),b(c)}):a}catch(a){let c=t.toString();throw this.log.DEBUG?.(`Error in method '${c}'`,a),b(a)}}},Ge);import{z as s}from"zod/v4-mini";import{en as qe}from"zod/v4/locales/index.cjs";s.config(qe());var y=s.string().check(s.trim(),s.refine(n=>!["undefined","null"].includes(n),{error:"Unexpected undefined or null merge-field value"})),_e=s.discriminatedUnion("role",[s.object({role:s.literal("system"),content:y}),s.object({role:s.literal("user"),content:y,name:s.optional(y.check(s.minLength(1),s.maxLength(64)))}),s.object({role:s.literal("assistant"),content:s.nullable(y),tool_calls:s.optional(s.array(s.object({id:y.check(s.minLength(1)),type:s.literal("function"),function:s.object({name:y.check(s.minLength(1)),arguments:y.check(s.minLength(1))})})))}),s.object({role:s.literal("tool"),content:y,name:s.optional(y.check(s.minLength(1),s.maxLength(64))),tool_call_id:y.check(s.minLength(1))})]),ze=s.object({type:s.literal("object"),properties:s.record(s.string().check(s.minLength(1),s.maxLength(64)),s.object({type:s.enum(["string","number","boolean","array","object"]),description:s.optional(s.string().check(s.maxLength(1e3))),items:s.optional(s.object({type:s.enum(["string","number","boolean","object"]),description:s.optional(s.string().check(s.maxLength(1e3)))}))}))}),Re=s.object({provider:y.check(s.minLength(1)),model:y.check(s.minLength(1)),accountKey:F(y),typeOfStep:s.enum(["chat","completion"]),systemMessage:s.optional(y),userMessage:s.optional(y),switchAssistantsMessage:s._default(s.boolean(),!1),assistantsFirstMessage:s.optional(y),temperature:F(s.coerce.number().check(s.gte(0),s.lte(2))),topP:F(s.coerce.number().check(s.gte(0),s.lte(1))),maxTokens:F(s.coerce.number().check(s.int(),s.gte(1))),presencePenalty:F(s.coerce.number().check(s.gte(-2),s.lte(2))),frequencyPenalty:F(s.coerce.number().check(s.gte(-2),s.lte(2))),n:F(s.coerce.number().check(s.int(),s.gte(1),s.lte(128))),stop:s.optional(s.array(s.object({token:s.string().check(s.minLength(1),s.maxLength(64))})).check(s.maxLength(4))),streamResponse:s._default(s.boolean(),!1),streamSettings:s.optional(s.object({maxBufferLength:s.coerce.number().check(s.overwrite(n=>n===0?50:n),s.int(),s.gte(1),s.lte(32768)),debounceDuration:s.coerce.number().check(s.int(),s.gte(0),s.lte(1e4))})),customHistory:s._default(s.boolean(),!1),historyLength:F(s.coerce.number().check(s.int(),s.gte(1),s.lte(100))),historyMode:s.optional(s.enum(["mergefield","codeHistory"])),historyMergefield:s.optional(s.array(_e)),historyCode:s.optional(s.array(_e)),functionsList:s.array(s.object({name:y.check(s.minLength(1),s.maxLength(64)),description:s.optional(y.check(s.maxLength(1e3))),parameters:s.optional(s.pipe(ze,s.transform(n=>(n.required=Object.keys(n.properties),n.additionalProperties=!1,n)))),strict:s.boolean()})),processError:s.boolean(),processTimeout:s.boolean(),timeoutDuration:y.check(s.trim(),s.minLength(1))}).check(s.refine(n=>!n.streamResponse||n.provider==="openai",{error:"Streaming is only supported for OpenAI provider"}),s.refine(n=>!n.streamResponse||n.streamSettings!==void 0,{error:'Missing "Stream settings" for response streaming mode'}),s.refine(n=>n.typeOfStep!=="chat"||n.customHistory||!n.switchAssistantsMessage||n.assistantsFirstMessage!==void 0,{error:`Missing "Assistant's first message" value`}),s.refine(n=>n.customHistory||n.userMessage!==void 0,{error:'Missing "User message" value'}),s.refine(n=>n.typeOfStep!=="chat"||!n.customHistory||n.historyMode!==void 0,{error:'Missing "History mode" value'}),s.refine(n=>n.typeOfStep!=="chat"||!n.customHistory||n.historyMode!=="mergefield"||n.historyMergefield!==void 0,{error:'Missing "History" data via merge-field'}),s.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'}),s.refine(n=>n.typeOfStep!=="chat"||!n.customHistory||n.historyMode!=="codeHistory"||n.historyCode!==void 0,{error:'Missing "History" data as code'}),s.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 F(n){return s.pipe(s.union([s.undefined(),s.literal(""),n]),s.transform(e=>e===""?void 0:e))}l(F,"optionalStringValue");function We(n,e,t,r){var i=arguments.length,o=i<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,a;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")o=Reflect.decorate(n,e,t,r);else for(var c=n.length-1;c>=0;c--)(a=n[c])&&(o=(i<3?a(o):i>3?a(e,t,o):a(e,t))||o);return i>3&&o&&Object.defineProperty(e,t,o),o}l(We,"_ts_decorate");function ce(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)}l(ce,"_ts_metadata");var C=class extends Ke{static{l(this,"BaseStep")}async resolveDataIn(){let e=await super.resolveDataIn();return this.log.DEBUG?.("data in before validation",e),Re.parse(e)}};We([U,ce("design:type",Function),ce("design:paramtypes",[]),ce("design:returntype",Promise)],C.prototype,"resolveDataIn",null);var I="llm_cmp";import{ACTION as Ve}from"@onereach/flow-sdk/types/index.js";var Je={allowHandleError:!1,useErrorFilter:!0},u=te((n,e,t,r)=>{let i=r.value;if(!(!i||typeof i!="function"))return function(...o){try{let a=i.apply(this,o);return a instanceof Promise?a.catch(c=>ve.call(this,n,c,t)):a}catch(a){return ve.call(this,n,a,t)}}},Je);function ve(n,e,t){let r=t.toString();this.log.DEBUG?.(`Error in method '${r}'`,e);let i=n.useErrorFilter?b(e):e;if(i instanceof Error)if(n.allowHandleError){this.thread.enqueue({name:Ve.error,error:i});return}else{this.end(i);return}throw i}l(ve,"errorHandler");function J(n,e,t,r){var i=arguments.length,o=i<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,a;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")o=Reflect.decorate(n,e,t,r);else for(var c=n.length-1;c>=0;c--)(a=n[c])&&(o=(i<3?a(o):i>3?a(e,t,o):a(e,t))||o);return i>3&&o&&Object.defineProperty(e,t,o),o}l(J,"_ts_decorate");function _(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)}l(_,"_ts_metadata");var g=class n extends C{static{l(this,"HistoryContext")}static class="hst_ctrl";static async start(e){let t=this.getThreadId(e.step.id);e.process.getThread(t)==null&&await e.process.runThread({id:t,background:!0,state:{step:e.step.id,class:this.class,messages:[]}})}static async prepareHistory(e){await e.process.enqueueAndRun({thread:this.getThreadId(e.step.id),name:q.prepareHistory})}static async appendToHistory(e,t){await e.process.enqueueAndRun({thread:this.getThreadId(e.step.id),name:q.appendToHistory,params:{message:t}})}static async adjustOnCancel(e){await e.process.enqueueAndRun({thread:this.getThreadId(e.step.id),name:q.adjustOnCancel})}static getHistory(e){return e.process.getSafeThread(this.getThreadId(e.step.id)).state.messages}static getThreadId(e){return`${I}_${this.class}_${e}`}runStep(){this.triggers.local(q.prepareHistory,this.onPrepareHistory).local(q.appendToHistory,this.onAppendToHistory).local(q.adjustOnCancel,this.onAdjustOnCancel).otherwise(this.initialize)}initialize(){this.log.DEBUG?.(`Initializing ${n.name} thread`)}onAdjustOnCancel(){let e;for(;(e=this.state.messages.at(-1))&&!(["system","user"].includes(e.role)||e.role==="assistant"&&e.tool_calls==null);){let t=this.state.messages.pop();this.log.DEBUG?.("Removed message from history",t)}}onPrepareHistory(){this.log.DEBUG?.("Preparing history");let{customHistory:e,historyLength:t,systemMessage:r,typeOfStep:i,userMessage:o,historyMode:a,historyMergefield:c,historyCode:f,assistantsFirstMessage:w}=this.data;if(i==="completion"){this.state.messages=[{role:"user",content:o}];return}if(e){this.state.messages=a==="mergefield"?c:f;return}let m=this.state.messages;if(m.length===0&&w!=null&&w.length>0&&m.push({role:"assistant",content:w}),m.at(-1)?.role!=="tool"&&m.push({role:"user",content:o}),!m.some(P=>P.role==="tool")&&t!=null&&t>0&&(m=m.slice(-1*t)),r!=null&&r.length>0){let P={role:"system",content:r};m[0]?.role==="system"?m[0]=P:m.unshift(P)}this.state.messages=m}onAppendToHistory(e){this.log.DEBUG?.("Appending message to history",e.params);let{message:t}=e.params,r=Array.isArray(t)?t:[t];this.state.messages.push(...r)}};J([u,_("design:type",Function),_("design:paramtypes",[]),_("design:returntype",void 0)],g.prototype,"runStep",null);J([u,_("design:type",Function),_("design:paramtypes",[]),_("design:returntype",void 0)],g.prototype,"initialize",null);J([u,_("design:type",Function),_("design:paramtypes",[]),_("design:returntype",void 0)],g.prototype,"onAdjustOnCancel",null);J([u,_("design:type",Function),_("design:paramtypes",[]),_("design:returntype",void 0)],g.prototype,"onPrepareHistory",null);J([u,_("design:type",Function),_("design:paramtypes",[typeof HistoryContextEventAppendToHistory>"u"?Object:HistoryContextEventAppendToHistory]),_("design:returntype",void 0)],g.prototype,"onAppendToHistory",null);var q={appendToHistory:"hst_append",prepareHistory:"hst_prepare",adjustOnCancel:"hst_cncl"};import{setImmediate as at}from"timers/promises";import{clear as lt,Memoize as ct}from"typescript-memoize";import{ACTION as xe}from"@onereach/flow-sdk/types/index.js";async function k(n,{id:e,state:t,local:r,...i},{force:o}={}){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,state:t,local:{...r,parent:n.thread.id,active:!0}});if(!o&&!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:xe.goto,state:{...t,active:!0}})}l(k,"runChildThread");function Se(n,e){let t=n.process.getThread(e);return!!(t!=null&&t.local.active&&!t.ended)}l(Se,"isThreadBusy");function Qe(n,e=n.id){let t=[];for(let r in n.process.threads){let i=n.process.threads[r];i?.local.parent===e&&t.push(i)}return t}l(Qe,"listChildThreads");async function Q(n,e,{result:t,stopChildThreads:r}={}){let i=n.process.getThread(e);n.log.DEBUG?.(`stopThread: thread with id '${e}'`),i&&(r&&await de(i,t),i.local.active&&(i.local.active=!1,!i.ended&&await i.enqueueAndRun({name:xe.ending,result:t})))}l(Q,"stopThread");async function de(n,e,t={}){let i=Qe(n).map(async c=>await Q(n,c.id,{stopChildThreads:!0,result:e})),o=await Promise.allSettled(i);if(t.throw??!0){let c=o.find(f=>f.status==="rejected");if(c)throw c.reason}return o}l(de,"endChildThreads");function Ze(n,e,t,r){var i=arguments.length,o=i<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,a;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")o=Reflect.decorate(n,e,t,r);else for(var c=n.length-1;c>=0;c--)(a=n[c])&&(o=(i<3?a(o):i>3?a(e,t,o):a(e,t))||o);return i>3&&o&&Object.defineProperty(e,t,o),o}l(Ze,"_ts_decorate");function pe(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)}l(pe,"_ts_metadata");var L=class extends C{static{l(this,"ToolsContextWorker")}static class="tl_wrk";static async start(e,t){let r=JSON.parse(t.function?.arguments);await k(e,{id:this.getThreadId(t),state:{step:e.step.id,class:this.class},local:{toolCall:t,parsedArguments:r,parent:e.id,active:!0}})}static getThreadId(e){return`${I}_${this.class}_${e.id}`}runStep(){let{toolCall:e,parsedArguments:t}=this.local;this.log.DEBUG?.("Initializing tool worker thread",e),this.exitStep(this.getExitName(),{function:{name:e.function.name,arguments:t}})}getExitName(){return"function"}};Ze([U,pe("design:type",Function),pe("design:paramtypes",[]),pe("design:returntype",void 0)],L.prototype,"runStep",null);import{ACTION as Xe}from"@onereach/flow-sdk/types/index.js";function Z(n,e,t,r){var i=arguments.length,o=i<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,a;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")o=Reflect.decorate(n,e,t,r);else for(var c=n.length-1;c>=0;c--)(a=n[c])&&(o=(i<3?a(o):i>3?a(e,t,o):a(e,t))||o);return i>3&&o&&Object.defineProperty(e,t,o),o}l(Z,"_ts_decorate");function R(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)}l(R,"_ts_metadata");var E=class n extends C{static{l(this,"ToolsContext")}static class="tl_ctrl";static async start(e){let t=this.getThreadId(e.step.id);await k(e,{id:t,state:{step:e.step.id,class:this.class,tasks:{},expectMoreTasks:!0},background:!0})}static async callTool(e,t){await e.process.enqueueAndRun({thread:this.getThreadId(e.step.id),name:oe.callTool,params:{toolCall:t}})}static async lastToolCallReceived(e){await e.process.enqueueAndRun({thread:this.getThreadId(e.step.id),name:oe.lastToolCallReceived})}static getThreadId(e){return`${I}_${this.class}_${e}`}runStep(){this.triggers.local(oe.callTool,this.onCallTool).local(oe.lastToolCallReceived,this.onLastToolCallReceived).otherwise(this.initialize)}initialize(){this.log.DEBUG?.(`Initializing ${n.name} thread`)}onCallTool(e){let{toolCall:t}=e.params;if(t.type!=="function")throw new h("Only function tools are supported at the moment",{code:p.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.tryEndToolsContextThread()}onWorkerThreadEnd(e){this.log.DEBUG?.("Tool caller worker thread has ended",e);let{result:t}=e.params.thread;if(t==null)throw new h(`${L.name} thread ended unexpectedly`,{code:p.STEP_LOGIC_ISSUE});if(t instanceof Error)throw b(t,{unknownMessage:`${L.name} thread ended with an error`,unknownCode:p.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.tryEndToolsContextThread())}startToolWorkerThread(e){this.triggers.hook({name:Xe.end,thread:L.getThreadId(e)},this.onWorkerThreadEnd),L.start(this.thread,e)}setToolCallResult(e,t){let r=this.state.tasks[e];if(r==null)throw new h(`Unknown tool call with id '${e}'`,{code:p.STEP_LOGIC_ISSUE});r.status="completed",r.result=t}tryEndToolsContextThread(){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)}))}};Z([u,R("design:type",Function),R("design:paramtypes",[]),R("design:returntype",void 0)],E.prototype,"runStep",null);Z([u,R("design:type",Function),R("design:paramtypes",[]),R("design:returntype",void 0)],E.prototype,"initialize",null);Z([u,R("design:type",Function),R("design:paramtypes",[typeof IEvent>"u"?Object:IEvent]),R("design:returntype",void 0)],E.prototype,"onCallTool",null);Z([u,R("design:type",Function),R("design:paramtypes",[]),R("design:returntype",void 0)],E.prototype,"onLastToolCallReceived",null);Z([u,R("design:type",Function),R("design:paramtypes",[typeof IActionEvent>"u"?Object:IActionEvent]),R("design:returntype",void 0)],E.prototype,"onWorkerThreadEnd",null);var oe={callTool:"tl_run_call",lastToolCallReceived:"tl_rsp_end"};import{ACTION as Le}from"@onereach/flow-sdk/types/index.js";import{clear as it,Memoize as Ae}from"typescript-memoize";function Ie({thread:n,...e}){let t=ue({thread:n,...e}),r=n.process;if(r.cache[t]!=null)throw new Error(`AbortController for key '${t}' already exists`);return r.cache[t]=new AbortController}l(Ie,"createAbortController");function Oe({thread:n,...e}){let t=ue({thread:n,...e});return n.process.cache[t]}l(Oe,"getAbortController");function z({thread:n,...e}){let t=ue({thread:n,...e});delete n.process.cache[t]}l(z,"deleteAbortController");function ue({thread:n,prefix:e,stepId:t=n.currentStepId}){return`${e?`${e}:`:""}abrt_ctrl:${t}`}l(ue,"getAbortControllerKey");import tt from"openai";import nt from"timestring";import{z as se}from"zod/v4-mini";import{Memoize as ot}from"typescript-memoize";import Ye from"@onereach/flow-sdk/services/basic.js";var re=class extends Ye{static{l(this,"ThreadServiceWithData")}data;constructor(e,t){super(e),this.data=t}};function et(n,e,t,r){var i=arguments.length,o=i<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,a;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")o=Reflect.decorate(n,e,t,r);else for(var c=n.length-1;c>=0;c--)(a=n[c])&&(o=(i<3?a(o):i>3?a(e,t,o):a(e,t))||o);return i>3&&o&&Object.defineProperty(e,t,o),o}l(et,"_ts_decorate");function ke(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)}l(ke,"_ts_metadata");var B=class extends re{static{l(this,"OpenAIRequestService")}async makeOpenAiRequest(e,t){let{model:r,temperature:i,topP:o,maxTokens:a,frequencyPenalty:c,presencePenalty:f,n:w,streamResponse:m}=this.data,G={messages:structuredClone(e),model:r,temperature:i,top_p:o,max_tokens:a,frequency_penalty:c,presence_penalty:f,stop:this.stopSequences,n:w,stream:m,tools:this.tools};this.log.DEBUG?.("LLM request",G);try{let P=await this.openAiClient.chat.completions.create(G,{signal:t});return m||this.log.DEBUG?.("LLM response",P),P}catch(P){throw P instanceof Error?new h("Chat completion request failed",P,{code:p.SERVER_ERROR,data:G}):P}}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,r={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",r),new tt(r)}get stopSequences(){return(this.data.stop??[]).map(t=>t.token).filter(t=>t.length>0)}get timeoutMs(){let e=nt(this.data.timeoutDuration,"ms");return se.number().check(se.int(),se.gte(1e3),se.lte(6e5)).parse(e)}};et([ot(),ke("design:type",Number),ke("design:paramtypes",[])],B.prototype,"timeoutMs",null);import{setImmediate as rt}from"timers/promises";import st from"@onereach/flow-sdk/services/basic.js";var W=class extends st{static{l(this,"AbstractResponseHandler")}async handleContentByParentThread(e){await rt(),await this.thread.process.enqueueAndRun({thread:this.thread.local.parent,name:he.handleContent,params:{content:e}})}};var ie=class extends W{static{l(this,"StreamResponseHandler")}async handle(e){this.log.DEBUG?.("Start processing stream of chunks from LLM");for await(let t of e)await this.handleContentByParentThread(t);z({thread:this.thread})}};var ae=class extends W{static{l(this,"SimpleResponseHandler")}async handle(e){this.log.DEBUG?.("Start processing response from LLM"),await this.handleContentByParentThread(e),z({thread:this.thread})}};function je({thread:n,isStreaming:e}){return e?new ie(n):new ae(n)}l(je,"responseHandlerFactory");function fe(n,e,t,r){var i=arguments.length,o=i<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,a;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")o=Reflect.decorate(n,e,t,r);else for(var c=n.length-1;c>=0;c--)(a=n[c])&&(o=(i<3?a(o):i>3?a(e,t,o):a(e,t))||o);return i>3&&o&&Object.defineProperty(e,t,o),o}l(fe,"_ts_decorate");function $(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)}l($,"_ts_metadata");var Pe=["requestInit"],v=class extends C{static{l(this,"RequestContext")}static class="rqst_ctx";static async start(e){return await k(e,{id:this.getThreadId(e.step.id),state:{step:e.step.id,class:this.class},background:!0})}static getThreadId(e){return`${I}_${this.class}_${e}`}async runStep(){it(Pe);let e=Ie({thread:this.thread});try{let t=await this.openAiService.makeOpenAiRequest(this.history,e.signal);await this.responseHandler.handle(t),this.complete()}catch(t){if(e?.signal.aborted)return this.cancel();throw t}finally{z({thread:this.thread})}}cancel(){this.end({status:"cancel"})}complete(){this.end({status:"ok"})}get history(){return g.getHistory(this.thread)}get openAiService(){return new B(this.thread,this.data)}get responseHandler(){let e=this.data.streamResponse;return je({thread:this.thread,isStreaming:e})}};fe([u,$("design:type",Function),$("design:paramtypes",[]),$("design:returntype",Promise)],v.prototype,"runStep",null);fe([Ae(),$("design:type",typeof B>"u"?Object:B),$("design:paramtypes",[])],v.prototype,"openAiService",null);fe([Ae({tags:Pe}),$("design:type",typeof AbstractResponseHandler>"u"?Object:AbstractResponseHandler),$("design:paramtypes",[])],v.prototype,"responseHandler",null);function X(n,e,t,r){var i=arguments.length,o=i<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,a;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")o=Reflect.decorate(n,e,t,r);else for(var c=n.length-1;c>=0;c--)(a=n[c])&&(o=(i<3?a(o):i>3?a(e,t,o):a(e,t))||o);return i>3&&o&&Object.defineProperty(e,t,o),o}l(X,"_ts_decorate");function x(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)}l(x,"_ts_metadata");var Me=["toolsInit"],M=class extends C{static{l(this,"AbstractContentContext")}static get class(){throw new Error('Define "class" static field')}static getInitialState(){throw new Error('Define "getInitialState" static method')}runStep(){lt(Me),this.triggers.local(he.handleContent,this.onHandleContent).hook({name:Le.end,thread:v.getThreadId(this.thread.step.id)},this.onRequestContextEnd).otherwise(this.initialize)}initialize(){this.log.DEBUG?.(`Initializing ${this.constructor.name} thread`),v.start(this.thread)}async onRequestContextEnd(e){let{result:t}=e.params.thread;if(this.log.DEBUG?.(`${v.name} thread ended with result`,t),t==null)throw new h(`${v.name} thread ended unexpectedly`,{code:p.STEP_LOGIC_ISSUE});if(t instanceof Error)throw b(t,{unknownMessage:`${v.name} thread ended with an error`,unknownCode:p.STEP_LOGIC_ISSUE});if(t.status==="cancel")return this.cancel();if(t.status!=="ok")throw new h(`Unexpected end of the ${v.name} thread`,{code:p.STEP_LOGIC_ISSUE,data:e.params.result});this.state.requestComplete=!0,await this.onAllContentReceived(),this.state.toolsReady!=null&&(await at(),await E.lastToolCallReceived(this.thread)),await this.tryToComplete()}async onToolsContextEnd(e){let{result:t}=e.params.thread;if(this.log.DEBUG?.(`${E.name} thread ended`,t),t==null)throw new h(`${E.name} thread ended unexpectedly`,{code:p.STEP_LOGIC_ISSUE});if(t instanceof Error)throw b(t,{unknownMessage:`${E.name} thread ended with an error`,unknownCode:p.STEP_LOGIC_ISSUE});if(t.status==="cancel")return;let{status:r,messages:i}=t;if(r!=="ok"||!Array.isArray(i))throw new h(`Unexpected end of the ${E.name} thread`,{code:p.STEP_LOGIC_ISSUE,data:e.params.result});this.state.toolsResults=i,this.state.toolsReady=!0,await this.tryToComplete()}async callFunction(e){this.state.toolsReady=!1,await this.initToolsContextThread(),await E.callTool(this.thread,e)}handleMultipleChoices(){let{chatCompletion:e}=this.state,t=e?.choices??[];t?.length>1&&this.log.WARN?.("Multiple choices received from LLM, but only the first one will be processed",{choices:t.length})}async initToolsContextThread(){this.triggers.hook({name:Le.end,thread:E.getThreadId(this.thread.step.id)},this.onToolsContextEnd),await E.start(this.thread)}cancel(){this.end({status:"cancel"})}complete(){let{chatCompletion:e}=this.state;if(e==null)throw new h("Missing chat completion content to return value",{code:p.STEP_LOGIC_ISSUE});this.end({status:"ok",chatCompletion:e,toolsResults:this.state.toolsResults??[]})}};X([u,x("design:type",Function),x("design:paramtypes",[]),x("design:returntype",Object)],M.prototype,"runStep",null);X([u,x("design:type",Function),x("design:paramtypes",[]),x("design:returntype",void 0)],M.prototype,"initialize",null);X([u,x("design:type",Function),x("design:paramtypes",[typeof IActionEvent>"u"?Object:IActionEvent]),x("design:returntype",Promise)],M.prototype,"onRequestContextEnd",null);X([u,x("design:type",Function),x("design:paramtypes",[typeof IActionEvent>"u"?Object:IActionEvent]),x("design:returntype",Promise)],M.prototype,"onToolsContextEnd",null);X([ct({tags:Me}),x("design:type",Function),x("design:paramtypes",[]),x("design:returntype",Promise)],M.prototype,"initToolsContextThread",null);var he={handleContent:"hnd_cnt"};function Ue(n,e,t,r){var i=arguments.length,o=i<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,a;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")o=Reflect.decorate(n,e,t,r);else for(var c=n.length-1;c>=0;c--)(a=n[c])&&(o=(i<3?a(o):i>3?a(e,t,o):a(e,t))||o);return i>3&&o&&Object.defineProperty(e,t,o),o}l(Ue,"_ts_decorate");function K(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)}l(K,"_ts_metadata");var D=class extends M{static{l(this,"SimpleContentContext")}static class="cnt_cxt_smp";static getInitialState(){return{requestComplete:!1}}async onHandleContent(e){let{content:t}=e.params;this.state.chatCompletion=t;let r=t.choices[0]?.message.tool_calls;if(r!=null)for(let i of r)await this.callFunction(i)}onAllContentReceived(){this.handleMultipleChoices()}tryToComplete(){let{requestComplete:e,toolsReady:t}=this.state;!e||t===!1||this.complete()}};Ue([u,K("design:type",Function),K("design:paramtypes",[typeof SimpleContentContextHandleContentEvent>"u"?Object:SimpleContentContextHandleContentEvent]),K("design:returntype",Promise)],D.prototype,"onHandleContent",null);Ue([u,K("design:type",Function),K("design:paramtypes",[]),K("design:returntype",void 0)],D.prototype,"onAllContentReceived",null);import{clear as ut,Memoize as Ne}from"typescript-memoize";function dt(n,e,t,r){var i=arguments.length,o=i<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,a;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")o=Reflect.decorate(n,e,t,r);else for(var c=n.length-1;c>=0;c--)(a=n[c])&&(o=(i<3?a(o):i>3?a(e,t,o):a(e,t))||o);return i>3&&o&&Object.defineProperty(e,t,o),o}l(dt,"_ts_decorate");function me(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)}l(me,"_ts_metadata");var j=class extends C{static{l(this,"StreamContentContextWorker")}static class="str_wrk";static async start(e,t){await k(e,{id:this.getThreadId(e.step.id),state:{step:e.step.id,class:this.class,event:t}})}static isBusy(e){return Se(e,this.getThreadId(e.step.id))}static getThreadId(e){return`${I}_${this.class}_${e}`}runStep(){if(!("event"in this.state)||this.state.event==null)throw new h("Stream worker thread state must contain an event to process",{code:p.STEP_LOGIC_ISSUE});let e=this.state.event;this.log.DEBUG?.("Executing stream worker thread",e),this.exitStep(pt.chunk,{chunk:e})}};dt([U,me("design:type",Function),me("design:paramtypes",[]),me("design:returntype",void 0)],j.prototype,"runStep",null);var pt={chunk:"chunk"};import{z as d}from"zod/v4-mini";var De=d.object({name:d.string(),params:d.object({content:d.object({id:d.string(),object:d.literal("chat.completion.chunk"),created:d.number(),model:d.string(),service_tier:d.optional(d.union([d.literal("default"),d.literal("auto"),d.literal("flex"),d.literal("scale"),d.literal("priority"),d.null()])),system_fingerprint:d.optional(d.string()),choices:d.array(d.object({index:d.number(),delta:d.object({role:d.optional(d.enum(["developer","system","user","assistant","tool"])),content:d.nullish(d.string()),refusal:d.nullish(d.string()),tool_calls:d.optional(d.array(d.object({index:d.number().check(d.int(),d.gte(0)),id:d.optional(d.string()),type:d.optional(d.literal("function")),function:d.object({name:d.optional(d.string()),arguments:d.optional(d.string())})})))}),logprobs:d.optional(d.any()),finish_reason:d.union([d.literal("stop"),d.literal("length"),d.literal("tool_calls"),d.literal("content_filter"),d.null()])})),logprobs:d.nullish(d.object({content:d.nullable(d.array(d.looseObject({}))),refusal:d.nullable(d.array(d.looseObject({})))})),usage:d.nullish(d.object({prompt_tokens:d.number(),completion_tokens:d.number(),total_tokens:d.number(),completion_tokens_details:d.optional(d.object({accepted_prediction_tokens:d.optional(d.number()),audio_tokens:d.optional(d.number()),reasoning_tokens:d.optional(d.number()),rejected_prediction_tokens:d.optional(d.number())})),prompt_tokens_details:d.optional(d.object({audio_tokens:d.optional(d.number()),cached_tokens:d.optional(d.number())}))}))})})});var le=class{static{l(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,...r}=e;Object.assign(this._result,r),this._result.object!=null&&(this._result.object="chat.completion")}e.usage&&(this._result.usage=e.usage);for(let t of e.choices){let r=this._result.choices?.[t.index];if(!r){let{delta:i,...o}=t;r=o,this._result.choices??=[],this._result.choices[t.index]=r}if(t.finish_reason!=null&&(r.finish_reason=t.finish_reason),t.logprobs!=null&&(r.logprobs=t.logprobs),t.delta?.content!==void 0){let{content:i,...o}=t.delta;r.message??=o,i===null?r.message.content??=null:(r.message.content??="",r.message.content+=i)}if(t.delta?.tool_calls!=null){let{tool_calls:i,...o}=t.delta;r.message??=o,r.message.tool_calls??=[];for(let a of t.delta.tool_calls){let c=a.index;if(r.message.tool_calls[c]==null)r.message.tool_calls[c]=structuredClone(a);else{let f=r.message.tool_calls[c];if(!("function"in f)||f.function==null)continue;f.function.arguments+=a.function?.arguments??""}t.index===0&&this.tryParseToolCall(r.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 ht}from"@onereach/flow-sdk/types/index.js";function V(n,e,t,r){var i=arguments.length,o=i<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,a;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")o=Reflect.decorate(n,e,t,r);else for(var c=n.length-1;c>=0;c--)(a=n[c])&&(o=(i<3?a(o):i>3?a(e,t,o):a(e,t))||o);return i>3&&o&&Object.defineProperty(e,t,o),o}l(V,"_ts_decorate");function T(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)}l(T,"_ts_metadata");var ge=["streamInit"],O=class n extends M{static{l(this,"StreamContentContext")}static class="cnt_cxt_str";static getInitialState(){return{class:n.class,requestComplete:!1,workerComplete:!1,partialChatCompletion:{},events:[],lastChunkReceived:!1,index:-1}}async runStep(){await super.runStep(),ut(ge),this.triggers.hook({name:ht.end,thread:j.getThreadId(this.thread.step.id)},this.onWorkerThreadEnd)}onWorkerThreadEnd(e){let{result:t}=e.params.thread;if(this.log.DEBUG?.(`${j.name} thread finished processing chunk`,t),t instanceof Error)throw b(t,{unknownMessage:`${j.name} thread ended with an error`});t?.status!=="cancel"&&this.tryRunWorker()}onHandleContent(e){let r=De.parse(e).params.content;new le(this.state.partialChatCompletion,this.onToolCall.bind(this)).reduceChunk(r);for(let o of r.choices){if(this.log.DEBUG?.("LLM stream response chunk",o),o.index>0)continue;let a=o.delta?.content;a!=null&&a.length>0&&(this.addContentToQueue(a),this.scheduleNextContentEvent())}}onAllContentReceived(){this.log.DEBUG?.("All LLM response chunks were received. No more response chunks expected"),this.state.chatCompletion=this.state.partialChatCompletion,this.handleMultipleChoices(),this.state.events.push({lastChunkReceived:!0}),this.state.lastChunkReceived=!0,this.tryRunWorker()}onToolCall(e){this.log.DEBUG?.("Tool call received",e),this.callFunction(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 r=`${t.content}${e}`;t.content=r.slice(0,this.maxChunkContentLength),this.log.DEBUG?.("Compacting response chunk into last queue event",t),e=r.slice(this.maxChunkContentLength)}}for(;e;){this.state.index+=1;let r={content:e.slice(0,this.maxChunkContentLength),index:this.state.index,ts:Date.now()};this.log.DEBUG?.("Add new event into the queue",r),this.state.events.push(r),e=e.slice(this.maxChunkContentLength)}}tryRunWorker(){if(j.isBusy(this.thread)){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 ${n.name} thread. All response content chunks were processed and no new chunks are coming`),this.state.workerComplete=!0,this.tryToComplete();return}this.log.DEBUG?.("Notify stream worker thread about response chunk to process",e),j.start(this.thread,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}tryToComplete(){let{chatCompletion:e,toolsReady:t,requestComplete:r,workerComplete:i}=this.state;if(!i||!r||t===!1||e==null)return;if(e.choices?.[0]?.message==null)throw new h("Missing completion message in chat completion result",{code:p.STEP_LOGIC_ISSUE});this.complete()}get maxChunkContentLength(){return this.data.streamSettings?.maxBufferLength??100}get debounceDuration(){return this.data.streamSettings?.debounceDuration??200}};V([u,T("design:type",Function),T("design:paramtypes",[]),T("design:returntype",Promise)],O.prototype,"runStep",null);V([u,T("design:type",Function),T("design:paramtypes",[typeof IActionEvent>"u"?Object:IActionEvent]),T("design:returntype",void 0)],O.prototype,"onWorkerThreadEnd",null);V([u,T("design:type",Function),T("design:paramtypes",[typeof StreamContentContextHandleContentEvent>"u"?Object:StreamContentContextHandleContentEvent]),T("design:returntype",void 0)],O.prototype,"onHandleContent",null);V([u,T("design:type",Function),T("design:paramtypes",[]),T("design:returntype",void 0)],O.prototype,"onAllContentReceived",null);V([Ne({tags:ge}),T("design:type",Number),T("design:paramtypes",[])],O.prototype,"maxChunkContentLength",null);V([Ne({tags:ge}),T("design:type",Number),T("design:paramtypes",[])],O.prototype,"debounceDuration",null);import{createRequire as ft}from"module";import{readFile as mt}from"fs/promises";var gt=ft(import.meta.url);async function Fe(n){if(typeof n!="string"||!/^\d+\.\d+\.\d+$/.test(n))throw new Error(`Invalid minimum version format: ${n}`);let e=gt.resolve("@onereach/flow-sdk/package.json");if(!e)throw new Error("Could not find package.json for @onereach/flow-sdk");let t=await mt(e,"utf8"),{version:r}=JSON.parse(t),{groups:i}=/^(?<major>\d+)\.(?<minor>\d+)\.(?<patch>\d+)/.exec(r)||{};if(!i)throw new Error(`Invalid Flow SDK version format: ${r}`);let o=Number.parseInt(i.major??"0",10),a=Number.parseInt(i.minor??"0",10),c=Number.parseInt(i.patch??"0",10);if(o==null||a==null||c==null||Number.isNaN(o)||Number.isNaN(a)||Number.isNaN(c))throw new Error(`Invalid version format: ${r}`);let[f,w,m]=n.split(".").map(G=>Number.parseInt(G,10));if(f==null||w==null||m==null||Number.isNaN(f)||Number.isNaN(w)||Number.isNaN(m))throw new Error(`Invalid minimum version format: ${n}`);if(o<f||o===f&&a<w||o===f&&a===w&&c<m)throw new Error(`Flow SDK version '${r}' is lower than required minimum version '${n}' for the step`)}l(Fe,"validateFlowSdkVersion");import{ACTION as He}from"@onereach/flow-sdk/types/index.js";import{Memoize as Ct}from"typescript-memoize";function yt(n,e,t,r){var i=arguments.length,o=i<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,a;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")o=Reflect.decorate(n,e,t,r);else for(var c=n.length-1;c>=0;c--)(a=n[c])&&(o=(i<3?a(o):i>3?a(e,t,o):a(e,t))||o);return i>3&&o&&Object.defineProperty(e,t,o),o}l(yt,"_ts_decorate");function ye(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)}l(ye,"_ts_metadata");var Y=class n{static{l(this,"ContentContextUtilities")}static factory(e){let t=e?O:D;return new n(t)}Constructor;constructor(e){this.Constructor=e}async start(e){let t=this.Constructor.getInitialState();await k(e,{id:this.getThreadId(e.step.id),state:{...t,requestComplete:!1,step:e.step.id,class:this.Constructor.class},background:!0})}async cancel(e){await Q(e,this.getThreadId(e.step.id),{result:{status:"cancel"},stopChildThreads:!0})}getThreadId(e){return`${I}_${this.Constructor.class}_${e}`}};yt([Ct(),ye("design:type",Function),ye("design:paramtypes",[Boolean]),ye("design:returntype",Object)],Y,"factory",null);function ee(n,e,t,r){var i=arguments.length,o=i<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,a;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")o=Reflect.decorate(n,e,t,r);else for(var c=n.length-1;c>=0;c--)(a=n[c])&&(o=(i<3?a(o):i>3?a(e,t,o):a(e,t))||o);return i>3&&o&&Object.defineProperty(e,t,o),o}l(ee,"_ts_decorate");function S(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)}l(S,"_ts_metadata");var Et="8.0.69",H=class extends C{static{l(this,"CreateChatCompletionStep")}runStep(){this.triggers.hook({name:He.end,thread:this.contentContext.getThreadId(this.thread.step.id)},this.onContentContextEnd),this.triggers.hook({name:He.end,thread:g.getThreadId(this.thread.step.id)},this.onHistoryContextEnd),this.triggers.local(Ce.cancel,this.onCancel),this.triggers.otherwise(this.initialize)}async initialize(){await Fe(Et),this.validateMergeFieldType(),this.resetState(),this.state.cancelled=!1,await Promise.all([g.start(this.thread),A.start(this.thread)]),await g.prepareHistory(this.thread),await this.contentContext.start(this.thread)}async onContentContextEnd(e){try{let{result:t}=e.params.thread;if(this.log.DEBUG?.("ContentContext thread ended with result",t),t==null)throw new h("ContentContext thread ended unexpectedly",{code:p.STEP_LOGIC_ISSUE});if(t instanceof Error)throw b(t,{unknownMessage:"ContentContext thread ended with an error",unknownCode:p.STEP_LOGIC_ISSUE});if(t.status==="cancel"){await this.resetStep();return}let{status:r,chatCompletion:i,toolsResults:o}=t;if(r!=="ok"||i==null||o==null)throw new h("Unexpected end of the ContentContext thread",{code:p.STEP_LOGIC_ISSUE,data:e.params.result});this.log.DEBUG?.("Create Chat Completion result",i),this.state.contentReady=!0,this.state.chatCompletion=i,this.state.toolsResults=o,await this.tryToExitStep()}catch(t){throw await this.resetStep().catch(()=>{}),t}}async onHistoryContextEnd(e){try{let{result:t}=e.params.thread;if(this.log.DEBUG?.(`${g.name} thread ended with result`,t),t instanceof Error)throw b(t,{unknownMessage:`${g.name} thread ended with an error`,unknownCode:p.STEP_LOGIC_ISSUE})}catch(t){throw await A.stop(this.thread).catch(()=>{}),t}}async tryToExitStep(){let{cancelled:e,contentReady:t,chatCompletion:r,toolsResults:i}=this.state;if(e){this.resetState();return}if(!t)return;if(r==null)throw new h("Missing chat completion result, but request is marked as processed",{code:p.STEP_LOGIC_ISSUE});let o=r.choices?.[0]?.message;if(o==null)throw new h("Missing completion message in chat completion result",{code:p.STEP_LOGIC_ISSUE});await Promise.all([g.appendToHistory(this.thread,[o,...i]),A.stop(this.thread)]);let a=r.choices[0]?.finish_reason;if(a==="length")throw new h("Reached limit of tokens for LLM completion response",{code:p.LLM_FINISH_LENGTH});if(a==="tool_calls"){this.thread.jumpTo(this.currentStepId);return}this.log.DEBUG?.("Exiting step with collected data",r),this.exitStep("next",r)}async onCancel(){await this.resetStep()}async resetStep(){this.resetState(),this.state.cancelled=!0;let t=(await Promise.allSettled([de(this.thread,{status:"cancel"}),g.adjustOnCancel(this.thread)])).find(r=>r.status==="rejected");if(t)throw t.reason}resetState(){this.state.contentReady=!1,this.state.chatCompletion=void 0,this.state.toolsResults=[]}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:p.VALIDATION})}get contentContext(){let e=this.data.streamResponse;return Y.factory(e)}};ee([U,S("design:type",Function),S("design:paramtypes",[]),S("design:returntype",void 0)],H.prototype,"runStep",null);ee([U,S("design:type",Function),S("design:paramtypes",[]),S("design:returntype",Promise)],H.prototype,"initialize",null);ee([u({allowHandleError:!0}),S("design:type",Function),S("design:paramtypes",[typeof IActionEvent>"u"?Object:IActionEvent]),S("design:returntype",Promise)],H.prototype,"onContentContextEnd",null);ee([u({allowHandleError:!0}),S("design:type",Function),S("design:paramtypes",[typeof IActionEvent>"u"?Object:IActionEvent]),S("design:returntype",Promise)],H.prototype,"onHistoryContextEnd",null);ee([U,S("design:type",Function),S("design:paramtypes",[]),S("design:returntype",Promise)],H.prototype,"onCancel",null);var Ce={cancel:"st_cancel"};function Ee(n,e,t,r){var i=arguments.length,o=i<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,a;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")o=Reflect.decorate(n,e,t,r);else for(var c=n.length-1;c>=0;c--)(a=n[c])&&(o=(i<3?a(o):i>3?a(e,t,o):a(e,t))||o);return i>3&&o&&Object.defineProperty(e,t,o),o}l(Ee,"_ts_decorate");function N(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)}l(N,"_ts_metadata");var A=class n extends C{static{l(this,"CancelContext")}static class="cncl_ctrl";static async start(e){await k(e,{id:this.getThreadId(e.step.id),state:{step:e.step.id,class:this.class},background:!0},{force:!0})}static async stop(e){await Q(e,this.getThreadId(e.step.id))}static getThreadId(e){return`${I}_${this.class}_${e}`}runStep(){this.triggers.local({name:Tt.cancel},this.onCancel).otherwise(this.initialize)}initialize(){this.log.DEBUG?.(`Initializing ${n.name} thread`)}onCancel(){this.log.DEBUG?.("Canceling LLM request");let e=this.local.parent;if(!this.process.getThread(e))return this.end();let r=Oe({thread:this.thread});r?r.abort(new ne("Request cancelled")):this.process.enqueueAndRun({name:Ce.cancel,thread:e})}};Ee([u,N("design:type",Function),N("design:paramtypes",[]),N("design:returntype",void 0)],A.prototype,"runStep",null);Ee([u,N("design:type",Function),N("design:paramtypes",[]),N("design:returntype",void 0)],A.prototype,"initialize",null);Ee([u,N("design:type",Function),N("design:paramtypes",[]),N("design:returntype",void 0)],A.prototype,"onCancel",null);var Tt={cancel:"cnl_cancel"};wt();var Ir={[g.class]:g,[v.class]:v,[E.class]:E,[L.class]:L,[D.class]:D,[O.class]:O,[j.class]:j,[A.class]:A};export{Ir as states,H as step};
|
|
1
|
+
var Be=Object.defineProperty;var l=(n,e)=>Be(n,"name",{value:e,configurable:!0});import{install as wt}from"source-map-support";import Ke from"@onereach/flow-sdk/step";function te(n,e){function t(r,i,o,a){let c=n(r,i,o,a);if(typeof c=="function"){let f=a.value,w=c;if(f?.name!=null)try{Object.defineProperty(w,"name",{value:f.name})}catch{}return a.value=w,a}return c??a}return l(t,"runApply"),l(function(i,o,a){if(i!==null&&typeof i=="object"&&(typeof o=="string"||typeof o=="symbol")&&a!==null&&typeof a=="object")return t(e,i,o,a);{let c=i??e;return(f,w,m)=>t(c,f,w,m)}},"decoratorOrFactory")}l(te,"createMethodDecoratorWithOptionalArguments");import be from"@onereach/flow-sdk/errors/timeout.js";import{z as we}from"zod/v4-mini";import Te from"@onereach/flow-sdk/errors/base.js";var p={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 Te{static{l(this,"CreateChatCompletionStepError")}},ne=class extends Te{static{l(this,"AbortRequestError")}};var $e=[h,be];function b(n,e={}){let{preserveErrors:t=$e,unknownMessage:r="Unknown error",unknownCode:i=p.UNKNOWN}=e;if(t?.some(o=>n instanceof o))return n;if(n instanceof we.core.$ZodError)return new h(we.prettifyError(n),n,{code:p.VALIDATION});if(typeof n=="string")return new h(n,{code:p.UNKNOWN});if(n instanceof Error){if(n.message.includes("Request timed out"))return new be("Timeout",n,{code:p.TIMEOUT});let o=n?.response?.data?.error?.message;return o!=null?new h(o,n,{code:p.SERVER_ERROR}):new h(r,n,{code:i})}return new h(r,{code:i,data:n})}l(b,"errorFilter");var Ge={},U=te((n,e,t,r)=>{let i=r.value;if(!(!i||typeof i!="function"))return function(...o){try{let a=i.apply(this,o);return a instanceof Promise?a.catch(c=>{let f=t.toString();throw this.log.DEBUG?.(`Error in method '${f}'`,c),b(c)}):a}catch(a){let c=t.toString();throw this.log.DEBUG?.(`Error in method '${c}'`,a),b(a)}}},Ge);import{z as s}from"zod/v4-mini";import{en as qe}from"zod/v4/locales";s.config(qe());var y=s.string().check(s.trim(),s.refine(n=>!["undefined","null"].includes(n),{error:"Unexpected undefined or null merge-field value"})),_e=s.discriminatedUnion("role",[s.object({role:s.literal("system"),content:y}),s.object({role:s.literal("user"),content:y,name:s.optional(y.check(s.minLength(1),s.maxLength(64)))}),s.object({role:s.literal("assistant"),content:s.nullable(y),tool_calls:s.optional(s.array(s.object({id:y.check(s.minLength(1)),type:s.literal("function"),function:s.object({name:y.check(s.minLength(1)),arguments:y.check(s.minLength(1))})})))}),s.object({role:s.literal("tool"),content:y,name:s.optional(y.check(s.minLength(1),s.maxLength(64))),tool_call_id:y.check(s.minLength(1))})]),ze=s.object({type:s.literal("object"),properties:s.record(s.string().check(s.minLength(1),s.maxLength(64)),s.object({type:s.enum(["string","number","boolean","array","object"]),description:s.optional(s.string().check(s.maxLength(1e3))),items:s.optional(s.object({type:s.enum(["string","number","boolean","object"]),description:s.optional(s.string().check(s.maxLength(1e3)))}))}))}),Re=s.object({provider:y.check(s.minLength(1)),model:y.check(s.minLength(1)),accountKey:F(y),typeOfStep:s.enum(["chat","completion"]),systemMessage:s.optional(y),userMessage:s.optional(y),switchAssistantsMessage:s._default(s.boolean(),!1),assistantsFirstMessage:s.optional(y),temperature:F(s.coerce.number().check(s.gte(0),s.lte(2))),topP:F(s.coerce.number().check(s.gte(0),s.lte(1))),maxTokens:F(s.coerce.number().check(s.int(),s.gte(1))),presencePenalty:F(s.coerce.number().check(s.gte(-2),s.lte(2))),frequencyPenalty:F(s.coerce.number().check(s.gte(-2),s.lte(2))),n:F(s.coerce.number().check(s.int(),s.gte(1),s.lte(128))),stop:s.optional(s.array(s.object({token:s.string().check(s.minLength(1),s.maxLength(64))})).check(s.maxLength(4))),streamResponse:s._default(s.boolean(),!1),streamSettings:s.optional(s.object({maxBufferLength:s.coerce.number().check(s.overwrite(n=>n===0?50:n),s.int(),s.gte(1),s.lte(32768)),debounceDuration:s.coerce.number().check(s.int(),s.gte(0),s.lte(1e4))})),customHistory:s._default(s.boolean(),!1),historyLength:F(s.coerce.number().check(s.int(),s.gte(1),s.lte(100))),historyMode:s.optional(s.enum(["mergefield","codeHistory"])),historyMergefield:s.optional(s.array(_e)),historyCode:s.optional(s.array(_e)),functionsList:s.array(s.object({name:y.check(s.minLength(1),s.maxLength(64)),description:s.optional(y.check(s.maxLength(1e3))),parameters:s.optional(s.pipe(ze,s.transform(n=>(n.required=Object.keys(n.properties),n.additionalProperties=!1,n)))),strict:s.boolean()})),processError:s.boolean(),processTimeout:s.boolean(),timeoutDuration:y.check(s.trim(),s.minLength(1))}).check(s.refine(n=>!n.streamResponse||n.provider==="openai",{error:"Streaming is only supported for OpenAI provider"}),s.refine(n=>!n.streamResponse||n.streamSettings!==void 0,{error:'Missing "Stream settings" for response streaming mode'}),s.refine(n=>n.typeOfStep!=="chat"||n.customHistory||!n.switchAssistantsMessage||n.assistantsFirstMessage!==void 0,{error:`Missing "Assistant's first message" value`}),s.refine(n=>n.customHistory||n.userMessage!==void 0,{error:'Missing "User message" value'}),s.refine(n=>n.typeOfStep!=="chat"||!n.customHistory||n.historyMode!==void 0,{error:'Missing "History mode" value'}),s.refine(n=>n.typeOfStep!=="chat"||!n.customHistory||n.historyMode!=="mergefield"||n.historyMergefield!==void 0,{error:'Missing "History" data via merge-field'}),s.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'}),s.refine(n=>n.typeOfStep!=="chat"||!n.customHistory||n.historyMode!=="codeHistory"||n.historyCode!==void 0,{error:'Missing "History" data as code'}),s.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 F(n){return s.pipe(s.union([s.undefined(),s.literal(""),n]),s.transform(e=>e===""?void 0:e))}l(F,"optionalStringValue");function We(n,e,t,r){var i=arguments.length,o=i<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,a;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")o=Reflect.decorate(n,e,t,r);else for(var c=n.length-1;c>=0;c--)(a=n[c])&&(o=(i<3?a(o):i>3?a(e,t,o):a(e,t))||o);return i>3&&o&&Object.defineProperty(e,t,o),o}l(We,"_ts_decorate");function ce(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)}l(ce,"_ts_metadata");var C=class extends Ke{static{l(this,"BaseStep")}async resolveDataIn(){let e=await super.resolveDataIn();return this.log.DEBUG?.("data in before validation",e),Re.parse(e)}};We([U,ce("design:type",Function),ce("design:paramtypes",[]),ce("design:returntype",Promise)],C.prototype,"resolveDataIn",null);var I="llm_cmp";import{ACTION as Ve}from"@onereach/flow-sdk/types/index.js";var Je={allowHandleError:!1,useErrorFilter:!0},u=te((n,e,t,r)=>{let i=r.value;if(!(!i||typeof i!="function"))return function(...o){try{let a=i.apply(this,o);return a instanceof Promise?a.catch(c=>ve.call(this,n,c,t)):a}catch(a){return ve.call(this,n,a,t)}}},Je);function ve(n,e,t){let r=t.toString();this.log.DEBUG?.(`Error in method '${r}'`,e);let i=n.useErrorFilter?b(e):e;if(i instanceof Error)if(n.allowHandleError){this.thread.enqueue({name:Ve.error,error:i});return}else{this.end(i);return}throw i}l(ve,"errorHandler");function J(n,e,t,r){var i=arguments.length,o=i<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,a;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")o=Reflect.decorate(n,e,t,r);else for(var c=n.length-1;c>=0;c--)(a=n[c])&&(o=(i<3?a(o):i>3?a(e,t,o):a(e,t))||o);return i>3&&o&&Object.defineProperty(e,t,o),o}l(J,"_ts_decorate");function _(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)}l(_,"_ts_metadata");var g=class n extends C{static{l(this,"HistoryContext")}static class="hst_ctrl";static async start(e){let t=this.getThreadId(e.step.id);e.process.getThread(t)==null&&await e.process.runThread({id:t,background:!0,state:{step:e.step.id,class:this.class,messages:[]}})}static async prepareHistory(e){await e.process.enqueueAndRun({thread:this.getThreadId(e.step.id),name:q.prepareHistory})}static async appendToHistory(e,t){await e.process.enqueueAndRun({thread:this.getThreadId(e.step.id),name:q.appendToHistory,params:{message:t}})}static async adjustOnCancel(e){await e.process.enqueueAndRun({thread:this.getThreadId(e.step.id),name:q.adjustOnCancel})}static getHistory(e){return e.process.getSafeThread(this.getThreadId(e.step.id)).state.messages}static getThreadId(e){return`${I}_${this.class}_${e}`}runStep(){this.triggers.local(q.prepareHistory,this.onPrepareHistory).local(q.appendToHistory,this.onAppendToHistory).local(q.adjustOnCancel,this.onAdjustOnCancel).otherwise(this.initialize)}initialize(){this.log.DEBUG?.(`Initializing ${n.name} thread`)}onAdjustOnCancel(){let e;for(;(e=this.state.messages.at(-1))&&!(["system","user"].includes(e.role)||e.role==="assistant"&&e.tool_calls==null);){let t=this.state.messages.pop();this.log.DEBUG?.("Removed message from history",t)}}onPrepareHistory(){this.log.DEBUG?.("Preparing history");let{customHistory:e,historyLength:t,systemMessage:r,typeOfStep:i,userMessage:o,historyMode:a,historyMergefield:c,historyCode:f,assistantsFirstMessage:w}=this.data;if(i==="completion"){this.state.messages=[{role:"user",content:o}];return}if(e){this.state.messages=a==="mergefield"?c:f;return}let m=this.state.messages;if(m.length===0&&w!=null&&w.length>0&&m.push({role:"assistant",content:w}),m.at(-1)?.role!=="tool"&&m.push({role:"user",content:o}),!m.some(P=>P.role==="tool")&&t!=null&&t>0&&(m=m.slice(-1*t)),r!=null&&r.length>0){let P={role:"system",content:r};m[0]?.role==="system"?m[0]=P:m.unshift(P)}this.state.messages=m}onAppendToHistory(e){this.log.DEBUG?.("Appending message to history",e.params);let{message:t}=e.params,r=Array.isArray(t)?t:[t];this.state.messages.push(...r)}};J([u,_("design:type",Function),_("design:paramtypes",[]),_("design:returntype",void 0)],g.prototype,"runStep",null);J([u,_("design:type",Function),_("design:paramtypes",[]),_("design:returntype",void 0)],g.prototype,"initialize",null);J([u,_("design:type",Function),_("design:paramtypes",[]),_("design:returntype",void 0)],g.prototype,"onAdjustOnCancel",null);J([u,_("design:type",Function),_("design:paramtypes",[]),_("design:returntype",void 0)],g.prototype,"onPrepareHistory",null);J([u,_("design:type",Function),_("design:paramtypes",[typeof HistoryContextEventAppendToHistory>"u"?Object:HistoryContextEventAppendToHistory]),_("design:returntype",void 0)],g.prototype,"onAppendToHistory",null);var q={appendToHistory:"hst_append",prepareHistory:"hst_prepare",adjustOnCancel:"hst_cncl"};import{setImmediate as at}from"timers/promises";import{clear as lt,Memoize as ct}from"typescript-memoize";import{ACTION as xe}from"@onereach/flow-sdk/types/index.js";async function k(n,{id:e,state:t,local:r,...i},{force:o}={}){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,state:t,local:{...r,parent:n.thread.id,active:!0}});if(!o&&!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:xe.goto,state:{...t,active:!0}})}l(k,"runChildThread");function Se(n,e){let t=n.process.getThread(e);return!!(t!=null&&t.local.active&&!t.ended)}l(Se,"isThreadBusy");function Qe(n,e=n.id){let t=[];for(let r in n.process.threads){let i=n.process.threads[r];i?.local.parent===e&&t.push(i)}return t}l(Qe,"listChildThreads");async function Q(n,e,{result:t,stopChildThreads:r}={}){let i=n.process.getThread(e);n.log.DEBUG?.(`stopThread: thread with id '${e}'`),i&&(r&&await de(i,t),i.local.active&&(i.local.active=!1,!i.ended&&await i.enqueueAndRun({name:xe.ending,result:t})))}l(Q,"stopThread");async function de(n,e,t={}){let i=Qe(n).map(async c=>await Q(n,c.id,{stopChildThreads:!0,result:e})),o=await Promise.allSettled(i);if(t.throw??!0){let c=o.find(f=>f.status==="rejected");if(c)throw c.reason}return o}l(de,"endChildThreads");function Ze(n,e,t,r){var i=arguments.length,o=i<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,a;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")o=Reflect.decorate(n,e,t,r);else for(var c=n.length-1;c>=0;c--)(a=n[c])&&(o=(i<3?a(o):i>3?a(e,t,o):a(e,t))||o);return i>3&&o&&Object.defineProperty(e,t,o),o}l(Ze,"_ts_decorate");function pe(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)}l(pe,"_ts_metadata");var L=class extends C{static{l(this,"ToolsContextWorker")}static class="tl_wrk";static async start(e,t){let r=JSON.parse(t.function?.arguments);await k(e,{id:this.getThreadId(t),state:{step:e.step.id,class:this.class},local:{toolCall:t,parsedArguments:r,parent:e.id,active:!0}})}static getThreadId(e){return`${I}_${this.class}_${e.id}`}runStep(){let{toolCall:e,parsedArguments:t}=this.local;this.log.DEBUG?.("Initializing tool worker thread",e),this.exitStep(this.getExitName(),{function:{name:e.function.name,arguments:t}})}getExitName(){return"function"}};Ze([U,pe("design:type",Function),pe("design:paramtypes",[]),pe("design:returntype",void 0)],L.prototype,"runStep",null);import{ACTION as Xe}from"@onereach/flow-sdk/types/index.js";function Z(n,e,t,r){var i=arguments.length,o=i<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,a;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")o=Reflect.decorate(n,e,t,r);else for(var c=n.length-1;c>=0;c--)(a=n[c])&&(o=(i<3?a(o):i>3?a(e,t,o):a(e,t))||o);return i>3&&o&&Object.defineProperty(e,t,o),o}l(Z,"_ts_decorate");function R(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)}l(R,"_ts_metadata");var E=class n extends C{static{l(this,"ToolsContext")}static class="tl_ctrl";static async start(e){let t=this.getThreadId(e.step.id);await k(e,{id:t,state:{step:e.step.id,class:this.class,tasks:{},expectMoreTasks:!0},background:!0})}static async callTool(e,t){await e.process.enqueueAndRun({thread:this.getThreadId(e.step.id),name:oe.callTool,params:{toolCall:t}})}static async lastToolCallReceived(e){await e.process.enqueueAndRun({thread:this.getThreadId(e.step.id),name:oe.lastToolCallReceived})}static getThreadId(e){return`${I}_${this.class}_${e}`}runStep(){this.triggers.local(oe.callTool,this.onCallTool).local(oe.lastToolCallReceived,this.onLastToolCallReceived).otherwise(this.initialize)}initialize(){this.log.DEBUG?.(`Initializing ${n.name} thread`)}onCallTool(e){let{toolCall:t}=e.params;if(t.type!=="function")throw new h("Only function tools are supported at the moment",{code:p.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.tryEndToolsContextThread()}onWorkerThreadEnd(e){this.log.DEBUG?.("Tool caller worker thread has ended",e);let{result:t}=e.params.thread;if(t==null)throw new h(`${L.name} thread ended unexpectedly`,{code:p.STEP_LOGIC_ISSUE});if(t instanceof Error)throw b(t,{unknownMessage:`${L.name} thread ended with an error`,unknownCode:p.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.tryEndToolsContextThread())}startToolWorkerThread(e){this.triggers.hook({name:Xe.end,thread:L.getThreadId(e)},this.onWorkerThreadEnd),L.start(this.thread,e)}setToolCallResult(e,t){let r=this.state.tasks[e];if(r==null)throw new h(`Unknown tool call with id '${e}'`,{code:p.STEP_LOGIC_ISSUE});r.status="completed",r.result=t}tryEndToolsContextThread(){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)}))}};Z([u,R("design:type",Function),R("design:paramtypes",[]),R("design:returntype",void 0)],E.prototype,"runStep",null);Z([u,R("design:type",Function),R("design:paramtypes",[]),R("design:returntype",void 0)],E.prototype,"initialize",null);Z([u,R("design:type",Function),R("design:paramtypes",[typeof IEvent>"u"?Object:IEvent]),R("design:returntype",void 0)],E.prototype,"onCallTool",null);Z([u,R("design:type",Function),R("design:paramtypes",[]),R("design:returntype",void 0)],E.prototype,"onLastToolCallReceived",null);Z([u,R("design:type",Function),R("design:paramtypes",[typeof IActionEvent>"u"?Object:IActionEvent]),R("design:returntype",void 0)],E.prototype,"onWorkerThreadEnd",null);var oe={callTool:"tl_run_call",lastToolCallReceived:"tl_rsp_end"};import{ACTION as Le}from"@onereach/flow-sdk/types/index.js";import{clear as it,Memoize as Ae}from"typescript-memoize";function Ie({thread:n,...e}){let t=ue({thread:n,...e}),r=n.process;if(r.cache[t]!=null)throw new Error(`AbortController for key '${t}' already exists`);return r.cache[t]=new AbortController}l(Ie,"createAbortController");function Oe({thread:n,...e}){let t=ue({thread:n,...e});return n.process.cache[t]}l(Oe,"getAbortController");function z({thread:n,...e}){let t=ue({thread:n,...e});delete n.process.cache[t]}l(z,"deleteAbortController");function ue({thread:n,prefix:e,stepId:t=n.currentStepId}){return`${e?`${e}:`:""}abrt_ctrl:${t}`}l(ue,"getAbortControllerKey");import tt from"openai";import nt from"timestring";import{z as se}from"zod/v4-mini";import{Memoize as ot}from"typescript-memoize";import Ye from"@onereach/flow-sdk/services/basic.js";var re=class extends Ye{static{l(this,"ThreadServiceWithData")}data;constructor(e,t){super(e),this.data=t}};function et(n,e,t,r){var i=arguments.length,o=i<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,a;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")o=Reflect.decorate(n,e,t,r);else for(var c=n.length-1;c>=0;c--)(a=n[c])&&(o=(i<3?a(o):i>3?a(e,t,o):a(e,t))||o);return i>3&&o&&Object.defineProperty(e,t,o),o}l(et,"_ts_decorate");function ke(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)}l(ke,"_ts_metadata");var B=class extends re{static{l(this,"OpenAIRequestService")}async makeOpenAiRequest(e,t){let{model:r,temperature:i,topP:o,maxTokens:a,frequencyPenalty:c,presencePenalty:f,n:w,streamResponse:m}=this.data,G={messages:structuredClone(e),model:r,temperature:i,top_p:o,max_tokens:a,frequency_penalty:c,presence_penalty:f,stop:this.stopSequences,n:w,stream:m,tools:this.tools};this.log.DEBUG?.("LLM request",G);try{let P=await this.openAiClient.chat.completions.create(G,{signal:t});return m||this.log.DEBUG?.("LLM response",P),P}catch(P){throw P instanceof Error?new h("Chat completion request failed",P,{code:p.SERVER_ERROR,data:G}):P}}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,r={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",r),new tt(r)}get stopSequences(){return(this.data.stop??[]).map(t=>t.token).filter(t=>t.length>0)}get timeoutMs(){let e=nt(this.data.timeoutDuration,"ms");return se.number().check(se.int(),se.gte(1e3),se.lte(6e5)).parse(e)}};et([ot(),ke("design:type",Number),ke("design:paramtypes",[])],B.prototype,"timeoutMs",null);import{setImmediate as rt}from"timers/promises";import st from"@onereach/flow-sdk/services/basic.js";var W=class extends st{static{l(this,"AbstractResponseHandler")}async handleContentByParentThread(e){await rt(),await this.thread.process.enqueueAndRun({thread:this.thread.local.parent,name:he.handleContent,params:{content:e}})}};var ie=class extends W{static{l(this,"StreamResponseHandler")}async handle(e){this.log.DEBUG?.("Start processing stream of chunks from LLM");for await(let t of e)await this.handleContentByParentThread(t);z({thread:this.thread})}};var ae=class extends W{static{l(this,"SimpleResponseHandler")}async handle(e){this.log.DEBUG?.("Start processing response from LLM"),await this.handleContentByParentThread(e),z({thread:this.thread})}};function je({thread:n,isStreaming:e}){return e?new ie(n):new ae(n)}l(je,"responseHandlerFactory");function fe(n,e,t,r){var i=arguments.length,o=i<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,a;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")o=Reflect.decorate(n,e,t,r);else for(var c=n.length-1;c>=0;c--)(a=n[c])&&(o=(i<3?a(o):i>3?a(e,t,o):a(e,t))||o);return i>3&&o&&Object.defineProperty(e,t,o),o}l(fe,"_ts_decorate");function $(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)}l($,"_ts_metadata");var Pe=["requestInit"],v=class extends C{static{l(this,"RequestContext")}static class="rqst_ctx";static async start(e){return await k(e,{id:this.getThreadId(e.step.id),state:{step:e.step.id,class:this.class},background:!0})}static getThreadId(e){return`${I}_${this.class}_${e}`}async runStep(){it(Pe);let e=Ie({thread:this.thread});try{let t=await this.openAiService.makeOpenAiRequest(this.history,e.signal);await this.responseHandler.handle(t),this.complete()}catch(t){if(e?.signal.aborted)return this.cancel();throw t}finally{z({thread:this.thread})}}cancel(){this.end({status:"cancel"})}complete(){this.end({status:"ok"})}get history(){return g.getHistory(this.thread)}get openAiService(){return new B(this.thread,this.data)}get responseHandler(){let e=this.data.streamResponse;return je({thread:this.thread,isStreaming:e})}};fe([u,$("design:type",Function),$("design:paramtypes",[]),$("design:returntype",Promise)],v.prototype,"runStep",null);fe([Ae(),$("design:type",typeof B>"u"?Object:B),$("design:paramtypes",[])],v.prototype,"openAiService",null);fe([Ae({tags:Pe}),$("design:type",typeof AbstractResponseHandler>"u"?Object:AbstractResponseHandler),$("design:paramtypes",[])],v.prototype,"responseHandler",null);function X(n,e,t,r){var i=arguments.length,o=i<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,a;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")o=Reflect.decorate(n,e,t,r);else for(var c=n.length-1;c>=0;c--)(a=n[c])&&(o=(i<3?a(o):i>3?a(e,t,o):a(e,t))||o);return i>3&&o&&Object.defineProperty(e,t,o),o}l(X,"_ts_decorate");function x(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)}l(x,"_ts_metadata");var Me=["toolsInit"],M=class extends C{static{l(this,"AbstractContentContext")}static get class(){throw new Error('Define "class" static field')}static getInitialState(){throw new Error('Define "getInitialState" static method')}runStep(){lt(Me),this.triggers.local(he.handleContent,this.onHandleContent).hook({name:Le.end,thread:v.getThreadId(this.thread.step.id)},this.onRequestContextEnd).otherwise(this.initialize)}initialize(){this.log.DEBUG?.(`Initializing ${this.constructor.name} thread`),v.start(this.thread)}async onRequestContextEnd(e){let{result:t}=e.params.thread;if(this.log.DEBUG?.(`${v.name} thread ended with result`,t),t==null)throw new h(`${v.name} thread ended unexpectedly`,{code:p.STEP_LOGIC_ISSUE});if(t instanceof Error)throw b(t,{unknownMessage:`${v.name} thread ended with an error`,unknownCode:p.STEP_LOGIC_ISSUE});if(t.status==="cancel")return this.cancel();if(t.status!=="ok")throw new h(`Unexpected end of the ${v.name} thread`,{code:p.STEP_LOGIC_ISSUE,data:e.params.result});this.state.requestComplete=!0,await this.onAllContentReceived(),this.state.toolsReady!=null&&(await at(),await E.lastToolCallReceived(this.thread)),await this.tryToComplete()}async onToolsContextEnd(e){let{result:t}=e.params.thread;if(this.log.DEBUG?.(`${E.name} thread ended`,t),t==null)throw new h(`${E.name} thread ended unexpectedly`,{code:p.STEP_LOGIC_ISSUE});if(t instanceof Error)throw b(t,{unknownMessage:`${E.name} thread ended with an error`,unknownCode:p.STEP_LOGIC_ISSUE});if(t.status==="cancel")return;let{status:r,messages:i}=t;if(r!=="ok"||!Array.isArray(i))throw new h(`Unexpected end of the ${E.name} thread`,{code:p.STEP_LOGIC_ISSUE,data:e.params.result});this.state.toolsResults=i,this.state.toolsReady=!0,await this.tryToComplete()}async callFunction(e){this.state.toolsReady=!1,await this.initToolsContextThread(),await E.callTool(this.thread,e)}handleMultipleChoices(){let{chatCompletion:e}=this.state,t=e?.choices??[];t?.length>1&&this.log.WARN?.("Multiple choices received from LLM, but only the first one will be processed",{choices:t.length})}async initToolsContextThread(){this.triggers.hook({name:Le.end,thread:E.getThreadId(this.thread.step.id)},this.onToolsContextEnd),await E.start(this.thread)}cancel(){this.end({status:"cancel"})}complete(){let{chatCompletion:e}=this.state;if(e==null)throw new h("Missing chat completion content to return value",{code:p.STEP_LOGIC_ISSUE});this.end({status:"ok",chatCompletion:e,toolsResults:this.state.toolsResults??[]})}};X([u,x("design:type",Function),x("design:paramtypes",[]),x("design:returntype",Object)],M.prototype,"runStep",null);X([u,x("design:type",Function),x("design:paramtypes",[]),x("design:returntype",void 0)],M.prototype,"initialize",null);X([u,x("design:type",Function),x("design:paramtypes",[typeof IActionEvent>"u"?Object:IActionEvent]),x("design:returntype",Promise)],M.prototype,"onRequestContextEnd",null);X([u,x("design:type",Function),x("design:paramtypes",[typeof IActionEvent>"u"?Object:IActionEvent]),x("design:returntype",Promise)],M.prototype,"onToolsContextEnd",null);X([ct({tags:Me}),x("design:type",Function),x("design:paramtypes",[]),x("design:returntype",Promise)],M.prototype,"initToolsContextThread",null);var he={handleContent:"hnd_cnt"};function Ue(n,e,t,r){var i=arguments.length,o=i<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,a;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")o=Reflect.decorate(n,e,t,r);else for(var c=n.length-1;c>=0;c--)(a=n[c])&&(o=(i<3?a(o):i>3?a(e,t,o):a(e,t))||o);return i>3&&o&&Object.defineProperty(e,t,o),o}l(Ue,"_ts_decorate");function K(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)}l(K,"_ts_metadata");var D=class extends M{static{l(this,"SimpleContentContext")}static class="cnt_cxt_smp";static getInitialState(){return{requestComplete:!1}}async onHandleContent(e){let{content:t}=e.params;this.state.chatCompletion=t;let r=t.choices[0]?.message.tool_calls;if(r!=null)for(let i of r)await this.callFunction(i)}onAllContentReceived(){this.handleMultipleChoices()}tryToComplete(){let{requestComplete:e,toolsReady:t}=this.state;!e||t===!1||this.complete()}};Ue([u,K("design:type",Function),K("design:paramtypes",[typeof SimpleContentContextHandleContentEvent>"u"?Object:SimpleContentContextHandleContentEvent]),K("design:returntype",Promise)],D.prototype,"onHandleContent",null);Ue([u,K("design:type",Function),K("design:paramtypes",[]),K("design:returntype",void 0)],D.prototype,"onAllContentReceived",null);import{clear as ut,Memoize as Ne}from"typescript-memoize";function dt(n,e,t,r){var i=arguments.length,o=i<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,a;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")o=Reflect.decorate(n,e,t,r);else for(var c=n.length-1;c>=0;c--)(a=n[c])&&(o=(i<3?a(o):i>3?a(e,t,o):a(e,t))||o);return i>3&&o&&Object.defineProperty(e,t,o),o}l(dt,"_ts_decorate");function me(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)}l(me,"_ts_metadata");var j=class extends C{static{l(this,"StreamContentContextWorker")}static class="str_wrk";static async start(e,t){await k(e,{id:this.getThreadId(e.step.id),state:{step:e.step.id,class:this.class,event:t}})}static isBusy(e){return Se(e,this.getThreadId(e.step.id))}static getThreadId(e){return`${I}_${this.class}_${e}`}runStep(){if(!("event"in this.state)||this.state.event==null)throw new h("Stream worker thread state must contain an event to process",{code:p.STEP_LOGIC_ISSUE});let e=this.state.event;this.log.DEBUG?.("Executing stream worker thread",e),this.exitStep(pt.chunk,{chunk:e})}};dt([U,me("design:type",Function),me("design:paramtypes",[]),me("design:returntype",void 0)],j.prototype,"runStep",null);var pt={chunk:"chunk"};import{z as d}from"zod/v4-mini";var De=d.object({name:d.string(),params:d.object({content:d.object({id:d.string(),object:d.literal("chat.completion.chunk"),created:d.number(),model:d.string(),service_tier:d.optional(d.union([d.literal("default"),d.literal("auto"),d.literal("flex"),d.literal("scale"),d.literal("priority"),d.null()])),system_fingerprint:d.optional(d.string()),choices:d.array(d.object({index:d.number(),delta:d.object({role:d.optional(d.enum(["developer","system","user","assistant","tool"])),content:d.nullish(d.string()),refusal:d.nullish(d.string()),tool_calls:d.optional(d.array(d.object({index:d.number().check(d.int(),d.gte(0)),id:d.optional(d.string()),type:d.optional(d.literal("function")),function:d.object({name:d.optional(d.string()),arguments:d.optional(d.string())})})))}),logprobs:d.optional(d.any()),finish_reason:d.union([d.literal("stop"),d.literal("length"),d.literal("tool_calls"),d.literal("content_filter"),d.null()])})),logprobs:d.nullish(d.object({content:d.nullable(d.array(d.looseObject({}))),refusal:d.nullable(d.array(d.looseObject({})))})),usage:d.nullish(d.object({prompt_tokens:d.number(),completion_tokens:d.number(),total_tokens:d.number(),completion_tokens_details:d.optional(d.object({accepted_prediction_tokens:d.optional(d.number()),audio_tokens:d.optional(d.number()),reasoning_tokens:d.optional(d.number()),rejected_prediction_tokens:d.optional(d.number())})),prompt_tokens_details:d.optional(d.object({audio_tokens:d.optional(d.number()),cached_tokens:d.optional(d.number())}))}))})})});var le=class{static{l(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,...r}=e;Object.assign(this._result,r),this._result.object!=null&&(this._result.object="chat.completion")}e.usage&&(this._result.usage=e.usage);for(let t of e.choices){let r=this._result.choices?.[t.index];if(!r){let{delta:i,...o}=t;r=o,this._result.choices??=[],this._result.choices[t.index]=r}if(t.finish_reason!=null&&(r.finish_reason=t.finish_reason),t.logprobs!=null&&(r.logprobs=t.logprobs),t.delta?.content!==void 0){let{content:i,...o}=t.delta;r.message??=o,i===null?r.message.content??=null:(r.message.content??="",r.message.content+=i)}if(t.delta?.tool_calls!=null){let{tool_calls:i,...o}=t.delta;r.message??=o,r.message.tool_calls??=[];for(let a of t.delta.tool_calls){let c=a.index;if(r.message.tool_calls[c]==null)r.message.tool_calls[c]=structuredClone(a);else{let f=r.message.tool_calls[c];if(!("function"in f)||f.function==null)continue;f.function.arguments+=a.function?.arguments??""}t.index===0&&this.tryParseToolCall(r.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 ht}from"@onereach/flow-sdk/types/index.js";function V(n,e,t,r){var i=arguments.length,o=i<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,a;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")o=Reflect.decorate(n,e,t,r);else for(var c=n.length-1;c>=0;c--)(a=n[c])&&(o=(i<3?a(o):i>3?a(e,t,o):a(e,t))||o);return i>3&&o&&Object.defineProperty(e,t,o),o}l(V,"_ts_decorate");function T(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)}l(T,"_ts_metadata");var ge=["streamInit"],O=class n extends M{static{l(this,"StreamContentContext")}static class="cnt_cxt_str";static getInitialState(){return{class:n.class,requestComplete:!1,workerComplete:!1,partialChatCompletion:{},events:[],lastChunkReceived:!1,index:-1}}async runStep(){await super.runStep(),ut(ge),this.triggers.hook({name:ht.end,thread:j.getThreadId(this.thread.step.id)},this.onWorkerThreadEnd)}onWorkerThreadEnd(e){let{result:t}=e.params.thread;if(this.log.DEBUG?.(`${j.name} thread finished processing chunk`,t),t instanceof Error)throw b(t,{unknownMessage:`${j.name} thread ended with an error`});t?.status!=="cancel"&&this.tryRunWorker()}onHandleContent(e){let r=De.parse(e).params.content;new le(this.state.partialChatCompletion,this.onToolCall.bind(this)).reduceChunk(r);for(let o of r.choices){if(this.log.DEBUG?.("LLM stream response chunk",o),o.index>0)continue;let a=o.delta?.content;a!=null&&a.length>0&&(this.addContentToQueue(a),this.scheduleNextContentEvent())}}onAllContentReceived(){this.log.DEBUG?.("All LLM response chunks were received. No more response chunks expected"),this.state.chatCompletion=this.state.partialChatCompletion,this.handleMultipleChoices(),this.state.events.push({lastChunkReceived:!0}),this.state.lastChunkReceived=!0,this.tryRunWorker()}onToolCall(e){this.log.DEBUG?.("Tool call received",e),this.callFunction(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 r=`${t.content}${e}`;t.content=r.slice(0,this.maxChunkContentLength),this.log.DEBUG?.("Compacting response chunk into last queue event",t),e=r.slice(this.maxChunkContentLength)}}for(;e;){this.state.index+=1;let r={content:e.slice(0,this.maxChunkContentLength),index:this.state.index,ts:Date.now()};this.log.DEBUG?.("Add new event into the queue",r),this.state.events.push(r),e=e.slice(this.maxChunkContentLength)}}tryRunWorker(){if(j.isBusy(this.thread)){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 ${n.name} thread. All response content chunks were processed and no new chunks are coming`),this.state.workerComplete=!0,this.tryToComplete();return}this.log.DEBUG?.("Notify stream worker thread about response chunk to process",e),j.start(this.thread,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}tryToComplete(){let{chatCompletion:e,toolsReady:t,requestComplete:r,workerComplete:i}=this.state;if(!i||!r||t===!1||e==null)return;if(e.choices?.[0]?.message==null)throw new h("Missing completion message in chat completion result",{code:p.STEP_LOGIC_ISSUE});this.complete()}get maxChunkContentLength(){return this.data.streamSettings?.maxBufferLength??100}get debounceDuration(){return this.data.streamSettings?.debounceDuration??200}};V([u,T("design:type",Function),T("design:paramtypes",[]),T("design:returntype",Promise)],O.prototype,"runStep",null);V([u,T("design:type",Function),T("design:paramtypes",[typeof IActionEvent>"u"?Object:IActionEvent]),T("design:returntype",void 0)],O.prototype,"onWorkerThreadEnd",null);V([u,T("design:type",Function),T("design:paramtypes",[typeof StreamContentContextHandleContentEvent>"u"?Object:StreamContentContextHandleContentEvent]),T("design:returntype",void 0)],O.prototype,"onHandleContent",null);V([u,T("design:type",Function),T("design:paramtypes",[]),T("design:returntype",void 0)],O.prototype,"onAllContentReceived",null);V([Ne({tags:ge}),T("design:type",Number),T("design:paramtypes",[])],O.prototype,"maxChunkContentLength",null);V([Ne({tags:ge}),T("design:type",Number),T("design:paramtypes",[])],O.prototype,"debounceDuration",null);import{createRequire as ft}from"module";import{readFile as mt}from"fs/promises";var gt=ft(import.meta.url);async function Fe(n){if(typeof n!="string"||!/^\d+\.\d+\.\d+$/.test(n))throw new Error(`Invalid minimum version format: ${n}`);let e=gt.resolve("@onereach/flow-sdk/package.json");if(!e)throw new Error("Could not find package.json for @onereach/flow-sdk");let t=await mt(e,"utf8"),{version:r}=JSON.parse(t),{groups:i}=/^(?<major>\d+)\.(?<minor>\d+)\.(?<patch>\d+)/.exec(r)||{};if(!i)throw new Error(`Invalid Flow SDK version format: ${r}`);let o=Number.parseInt(i.major??"0",10),a=Number.parseInt(i.minor??"0",10),c=Number.parseInt(i.patch??"0",10);if(o==null||a==null||c==null||Number.isNaN(o)||Number.isNaN(a)||Number.isNaN(c))throw new Error(`Invalid version format: ${r}`);let[f,w,m]=n.split(".").map(G=>Number.parseInt(G,10));if(f==null||w==null||m==null||Number.isNaN(f)||Number.isNaN(w)||Number.isNaN(m))throw new Error(`Invalid minimum version format: ${n}`);if(o<f||o===f&&a<w||o===f&&a===w&&c<m)throw new Error(`Flow SDK version '${r}' is lower than required minimum version '${n}' for the step`)}l(Fe,"validateFlowSdkVersion");import{ACTION as He}from"@onereach/flow-sdk/types/index.js";import{Memoize as Ct}from"typescript-memoize";function yt(n,e,t,r){var i=arguments.length,o=i<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,a;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")o=Reflect.decorate(n,e,t,r);else for(var c=n.length-1;c>=0;c--)(a=n[c])&&(o=(i<3?a(o):i>3?a(e,t,o):a(e,t))||o);return i>3&&o&&Object.defineProperty(e,t,o),o}l(yt,"_ts_decorate");function ye(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)}l(ye,"_ts_metadata");var Y=class n{static{l(this,"ContentContextUtilities")}static factory(e){let t=e?O:D;return new n(t)}Constructor;constructor(e){this.Constructor=e}async start(e){let t=this.Constructor.getInitialState();await k(e,{id:this.getThreadId(e.step.id),state:{...t,requestComplete:!1,step:e.step.id,class:this.Constructor.class},background:!0})}async cancel(e){await Q(e,this.getThreadId(e.step.id),{result:{status:"cancel"},stopChildThreads:!0})}getThreadId(e){return`${I}_${this.Constructor.class}_${e}`}};yt([Ct(),ye("design:type",Function),ye("design:paramtypes",[Boolean]),ye("design:returntype",Object)],Y,"factory",null);function ee(n,e,t,r){var i=arguments.length,o=i<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,a;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")o=Reflect.decorate(n,e,t,r);else for(var c=n.length-1;c>=0;c--)(a=n[c])&&(o=(i<3?a(o):i>3?a(e,t,o):a(e,t))||o);return i>3&&o&&Object.defineProperty(e,t,o),o}l(ee,"_ts_decorate");function S(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)}l(S,"_ts_metadata");var Et="8.0.69",H=class extends C{static{l(this,"CreateChatCompletionStep")}runStep(){this.triggers.hook({name:He.end,thread:this.contentContext.getThreadId(this.thread.step.id)},this.onContentContextEnd),this.triggers.hook({name:He.end,thread:g.getThreadId(this.thread.step.id)},this.onHistoryContextEnd),this.triggers.local(Ce.cancel,this.onCancel),this.triggers.otherwise(this.initialize)}async initialize(){await Fe(Et),this.validateMergeFieldType(),this.resetState(),this.state.cancelled=!1,await Promise.all([g.start(this.thread),A.start(this.thread)]),await g.prepareHistory(this.thread),await this.contentContext.start(this.thread)}async onContentContextEnd(e){try{let{result:t}=e.params.thread;if(this.log.DEBUG?.("ContentContext thread ended with result",t),t==null)throw new h("ContentContext thread ended unexpectedly",{code:p.STEP_LOGIC_ISSUE});if(t instanceof Error)throw b(t,{unknownMessage:"ContentContext thread ended with an error",unknownCode:p.STEP_LOGIC_ISSUE});if(t.status==="cancel"){await this.resetStep();return}let{status:r,chatCompletion:i,toolsResults:o}=t;if(r!=="ok"||i==null||o==null)throw new h("Unexpected end of the ContentContext thread",{code:p.STEP_LOGIC_ISSUE,data:e.params.result});this.log.DEBUG?.("Create Chat Completion result",i),this.state.contentReady=!0,this.state.chatCompletion=i,this.state.toolsResults=o,await this.tryToExitStep()}catch(t){throw await this.resetStep().catch(()=>{}),t}}async onHistoryContextEnd(e){try{let{result:t}=e.params.thread;if(this.log.DEBUG?.(`${g.name} thread ended with result`,t),t instanceof Error)throw b(t,{unknownMessage:`${g.name} thread ended with an error`,unknownCode:p.STEP_LOGIC_ISSUE})}catch(t){throw await A.stop(this.thread).catch(()=>{}),t}}async tryToExitStep(){let{cancelled:e,contentReady:t,chatCompletion:r,toolsResults:i}=this.state;if(e){this.resetState();return}if(!t)return;if(r==null)throw new h("Missing chat completion result, but request is marked as processed",{code:p.STEP_LOGIC_ISSUE});let o=r.choices?.[0]?.message;if(o==null)throw new h("Missing completion message in chat completion result",{code:p.STEP_LOGIC_ISSUE});await Promise.all([g.appendToHistory(this.thread,[o,...i]),A.stop(this.thread)]);let a=r.choices[0]?.finish_reason;if(a==="length")throw new h("Reached limit of tokens for LLM completion response",{code:p.LLM_FINISH_LENGTH});if(a==="tool_calls"){this.thread.jumpTo(this.currentStepId);return}this.log.DEBUG?.("Exiting step with collected data",r),this.exitStep("next",r)}async onCancel(){await this.resetStep()}async resetStep(){this.resetState(),this.state.cancelled=!0;let t=(await Promise.allSettled([de(this.thread,{status:"cancel"}),g.adjustOnCancel(this.thread)])).find(r=>r.status==="rejected");if(t)throw t.reason}resetState(){this.state.contentReady=!1,this.state.chatCompletion=void 0,this.state.toolsResults=[]}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:p.VALIDATION})}get contentContext(){let e=this.data.streamResponse;return Y.factory(e)}};ee([U,S("design:type",Function),S("design:paramtypes",[]),S("design:returntype",void 0)],H.prototype,"runStep",null);ee([U,S("design:type",Function),S("design:paramtypes",[]),S("design:returntype",Promise)],H.prototype,"initialize",null);ee([u({allowHandleError:!0}),S("design:type",Function),S("design:paramtypes",[typeof IActionEvent>"u"?Object:IActionEvent]),S("design:returntype",Promise)],H.prototype,"onContentContextEnd",null);ee([u({allowHandleError:!0}),S("design:type",Function),S("design:paramtypes",[typeof IActionEvent>"u"?Object:IActionEvent]),S("design:returntype",Promise)],H.prototype,"onHistoryContextEnd",null);ee([U,S("design:type",Function),S("design:paramtypes",[]),S("design:returntype",Promise)],H.prototype,"onCancel",null);var Ce={cancel:"st_cancel"};function Ee(n,e,t,r){var i=arguments.length,o=i<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,a;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")o=Reflect.decorate(n,e,t,r);else for(var c=n.length-1;c>=0;c--)(a=n[c])&&(o=(i<3?a(o):i>3?a(e,t,o):a(e,t))||o);return i>3&&o&&Object.defineProperty(e,t,o),o}l(Ee,"_ts_decorate");function N(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)}l(N,"_ts_metadata");var A=class n extends C{static{l(this,"CancelContext")}static class="cncl_ctrl";static async start(e){await k(e,{id:this.getThreadId(e.step.id),state:{step:e.step.id,class:this.class},background:!0},{force:!0})}static async stop(e){await Q(e,this.getThreadId(e.step.id))}static getThreadId(e){return`${I}_${this.class}_${e}`}runStep(){this.triggers.local({name:Tt.cancel},this.onCancel).otherwise(this.initialize)}initialize(){this.log.DEBUG?.(`Initializing ${n.name} thread`)}onCancel(){this.log.DEBUG?.("Canceling LLM request");let e=this.local.parent;if(!this.process.getThread(e))return this.end();let r=Oe({thread:this.thread});r?r.abort(new ne("Request cancelled")):this.process.enqueueAndRun({name:Ce.cancel,thread:e})}};Ee([u,N("design:type",Function),N("design:paramtypes",[]),N("design:returntype",void 0)],A.prototype,"runStep",null);Ee([u,N("design:type",Function),N("design:paramtypes",[]),N("design:returntype",void 0)],A.prototype,"initialize",null);Ee([u,N("design:type",Function),N("design:paramtypes",[]),N("design:returntype",void 0)],A.prototype,"onCancel",null);var Tt={cancel:"cnl_cancel"};wt();var Ir={[g.class]:g,[v.class]:v,[E.class]:E,[L.class]:L,[D.class]:D,[O.class]:O,[j.class]:j,[A.class]:A};export{Ir as states,H as step};
|
|
2
2
|
//# sourceMappingURL=index.mjs.map
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/threads/base.ts","../src/utils/create-method-decorator.ts","../src/errors/error-filter.ts","../src/errors/step-error.ts","../src/decorators/error-filter.ts","../src/schemas/data-in.ts","../src/decorators/background-thread-error-filter.ts","../src/threads/history/history-context.ts","../src/threads/content/abstract-content-context.ts","../src/utils/thread-utilities.ts","../src/threads/tools/tools-context-worker.ts","../src/threads/tools/tools-context.ts","../src/threads/request/request-context.ts","../src/utils/process-abort-controller.ts","../src/threads/request/services/openai-request.ts","../src/services/thread-service-with-data.ts","../src/threads/request/response-handlers/abstract.ts","../src/threads/request/response-handlers/stream.ts","../src/threads/request/response-handlers/simple.ts","../src/threads/request/factories/response-handler.ts","../src/threads/content/simple/simple-content-context.ts","../src/threads/content/stream/stream-content-context.ts","../src/threads/content/stream/stream-content-context-worker.ts","../src/threads/content/stream/schemas/stream-chunk.ts","../src/threads/content/stream/services/stream-reducer.ts","../src/utils/validate-flow-sdk-version.ts","../src/step.ts","../src/threads/content/content-context-utilities.ts","../src/threads/cancel/cancel-context.ts"],"sourcesContent":["import { install } from 'source-map-support';\n\nimport { HistoryContext } from './threads/history/history-context.ts';\nimport { SimpleContentContext } from './threads/content/simple/simple-content-context.ts';\nimport { StreamContentContext } from './threads/content/stream/stream-content-context.ts';\nimport { StreamContentContextWorker } from './threads/content/stream/stream-content-context-worker.ts';\nimport { ToolsContext } from './threads/tools/tools-context.ts';\nimport { ToolsContextWorker } from './threads/tools/tools-context-worker.ts';\nimport { CancelContext } from './threads/cancel/cancel-context.ts';\nimport { RequestContext } from './threads/request/request-context.ts';\n\n// enable source map support for better error stack traces\ninstall();\n\nexport const states = {\n [HistoryContext.class]: HistoryContext,\n [RequestContext.class]: RequestContext,\n [ToolsContext.class]: ToolsContext,\n [ToolsContextWorker.class]: ToolsContextWorker,\n [SimpleContentContext.class]: SimpleContentContext,\n [StreamContentContext.class]: StreamContentContext,\n [StreamContentContextWorker.class]: StreamContentContextWorker,\n [CancelContext.class]: CancelContext,\n};\n\nexport { CreateChatCompletionStep as step } from './step.ts';\n","import Step from '@onereach/flow-sdk/step.js';\nimport { ErrorFilter } from '../decorators/error-filter.ts';\nimport { DataIn, dataInSchema } from '../schemas/data-in.ts';\nimport type { CONFIG } from '@onereach/flow-sdk/types/index.js';\n\n// TODO: convert it into class decorator\nexport class BaseStep<T extends BaseConfig> extends Step<T> {\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\nexport const baseClassIdPrefix = 'llm_cmp';\n\n// -------------- types ----------------\n\nexport interface BaseConfig extends CONFIG {\n dataIn: DataIn;\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): MethodDecoratorWithOptionalArguments<A, T> {\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\nexport type MethodDecoratorWithOptionalArguments<A, T extends AnyFunction = AnyFunction> =\n // Plain method decorator (three arguments)\n ((\n target: object,\n propertyKey: string | symbol,\n descriptor: TypedPropertyDescriptor<T>,\n ) => TypedPropertyDescriptor<T> | void) &\n // Decorator factory (optional options argument)\n ((options?: A) => MethodDecorator);\n","import TimeoutError from '@onereach/flow-sdk/errors/timeout.js';\nimport { z } from 'zod/v4-mini';\n\nimport { CreateChatCompletionStepError, ErrorCode } from './step-error.ts';\n\nconst defaultPreserveErrors = [CreateChatCompletionStepError, TimeoutError] as const;\nexport function errorFilter<P extends readonly AnyErrorClass[] = typeof defaultPreserveErrors>(\n error: unknown,\n options: ErrorFilterOptions<P> = {},\n): InstancesOf<P> | CreateChatCompletionStepError | TimeoutError {\n const {\n preserveErrors = defaultPreserveErrors,\n unknownMessage = 'Unknown error',\n unknownCode = ErrorCode.UNKNOWN,\n } = options;\n\n // if error is CreateChatCompletionStepError or TimeoutError, return it directly\n if (preserveErrors?.some((ErrorClass) => error instanceof ErrorClass)) {\n return error as InstancesOf<P>;\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 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 // 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 return new CreateChatCompletionStepError(unknownMessage, error, {\n code: unknownCode,\n });\n }\n\n // catch all for unknown errors\n return new CreateChatCompletionStepError(unknownMessage, {\n code: unknownCode,\n data: error,\n });\n}\n\nexport type ErrorFilterOptions<P extends readonly AnyErrorClass[]> = {\n /** Array of error classes that should not be wrapped */\n preserveErrors?: P;\n /** Error message to use when message is unknown */\n unknownMessage?: string;\n /** Error code to use when message is unknown */\n unknownCode?: keyof typeof ErrorCode;\n};\n\n/** Any Error class */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type AnyErrorClass<E extends Error = Error> = new (...arguments_: any[]) => E;\n\n/** Turn a tuple/array of constructors into a union of their instance types. */\nexport type InstancesOf<Ctors extends readonly AnyErrorClass[]> =\n Ctors[number] extends AnyErrorClass<infer I> ? I : never;\n","import BaseError from '@onereach/flow-sdk/errors/base.js';\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 } from '../utils/create-method-decorator.ts';\nimport { errorFilter } from '../errors/error-filter.ts';\nimport type Step from '@onereach/flow-sdk/step.js';\n\nconst defaultOptions = {};\n\n/**\n * Will wrap method with `errorFilter` for every error.\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: unknown) => {\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","import { z } from 'zod/v4-mini';\nimport { en } from 'zod/v4/locales/index.cjs';\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 { ACTION } from '@onereach/flow-sdk/types/index.js';\nimport { createMethodDecoratorWithOptionalArguments } from '../utils/create-method-decorator.ts';\nimport { errorFilter } from '../errors/error-filter.ts';\nimport type Step from '@onereach/flow-sdk/step.js';\n\nconst defaultOptions: BackgroundThreadErrorFilterOptions = { allowHandleError: false, 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.allowHandleError - Default `false`. 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 BackgroundThreadErrorFilter = 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(\n this: Step,\n options: BackgroundThreadErrorFilterOptions,\n error: unknown,\n propertyKey: string | symbol,\n): 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 BackgroundThreadErrorFilterOptions = {\n allowHandleError?: boolean;\n useErrorFilter?: boolean;\n};\n","/* eslint-disable @typescript-eslint/unbound-method */\n\nimport { baseClassIdPrefix, BaseConfig, BaseStep } from '../base.ts';\nimport { BackgroundThreadErrorFilter } from '../../decorators/background-thread-error-filter.ts';\n\nimport type { CONFIG, IThreadId, IEvent, IThread, IStepId } from '@onereach/flow-sdk/types/index.js';\nimport type { ChatCompletionMessageParam } from 'openai/resources.js';\nimport type { ChatCompletionConfig } from '../../step.ts';\n\nexport class HistoryContext extends BaseStep<HistoryContextConfig> {\n public static readonly class = 'hst_ctrl';\n\n public static async start(thread: IThread<ChatCompletionConfig>): Promise<void> {\n const historyThreadId = this.getThreadId(thread.step.id);\n const historyThread = thread.process.getThread<HistoryContextConfig>(historyThreadId);\n\n if (historyThread != undefined) return; // thread already exists\n\n // create tools context thread\n await thread.process.runThread<HistoryContextConfig>({\n id: historyThreadId,\n background: true,\n state: {\n step: thread.step.id,\n class: this.class,\n\n messages: [],\n },\n });\n }\n\n public static async prepareHistory<T extends ChatCompletionConfig>(thread: IThread<T>): Promise<void> {\n await thread.process.enqueueAndRun<EventName['prepareHistory']>({\n thread: this.getThreadId(thread.step.id),\n name: events.prepareHistory,\n });\n }\n\n public static async appendToHistory<T extends ChatCompletionConfig>(\n thread: IThread<T>,\n message: ChatCompletionMessageParam | ChatCompletionMessageParam[],\n ): Promise<void> {\n await thread.process.enqueueAndRun<EventName['appendToHistory'], HistoryContextAppendParameters>({\n thread: this.getThreadId(thread.step.id),\n name: events.appendToHistory,\n params: { message },\n });\n }\n\n public static async adjustOnCancel<T extends ChatCompletionConfig>(thread: IThread<T>): Promise<void> {\n await thread.process.enqueueAndRun<EventName['adjustOnCancel']>({\n thread: this.getThreadId(thread.step.id),\n name: events.adjustOnCancel,\n });\n }\n\n public static getHistory<T extends CONFIG>(thread: IThread<T>): ChatCompletionMessageParam[] {\n return thread.process.getSafeThread<HistoryContextConfig>(this.getThreadId(thread.step.id)).state.messages;\n }\n\n public static getThreadId(stepId: IStepId): IThreadId {\n return `${baseClassIdPrefix}_${this.class}_${stepId}`;\n }\n\n // ---------------------------------------\n\n @BackgroundThreadErrorFilter\n public runStep(): void {\n this.triggers\n .local(events.prepareHistory, this.onPrepareHistory)\n .local(events.appendToHistory, this.onAppendToHistory)\n .local(events.adjustOnCancel, this.onAdjustOnCancel)\n .otherwise(this.initialize);\n }\n\n @BackgroundThreadErrorFilter\n public initialize(): void {\n this.log.DEBUG?.(`Initializing ${HistoryContext.name} thread`);\n }\n\n @BackgroundThreadErrorFilter\n public onAdjustOnCancel(): void {\n let message;\n while ((message = this.state.messages.at(-1))) {\n if (['system', 'user'].includes(message.role)) break;\n if (message.role === 'assistant' && message.tool_calls == undefined) break;\n\n const removedMessage = this.state.messages.pop();\n this.log.DEBUG?.('Removed message from history', removedMessage);\n }\n }\n\n @BackgroundThreadErrorFilter\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 @BackgroundThreadErrorFilter\n public onAppendToHistory(event: HistoryContextEventAppendToHistory): 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 adjustOnCancel: 'hst_cncl',\n} as const;\nexport type EventName = typeof events;\n\nexport type HistoryContextAppendParameters = {\n message: ChatCompletionMessageParam | ChatCompletionMessageParam[];\n};\nexport type HistoryContextEventAppendToHistory = IEvent<HistoryContextAppendParameters, EventName['appendToHistory']>;\nexport type HistoryContextEventPrepareHistory = IEvent<unknown, EventName['prepareHistory']>;\nexport type HistoryContextEventAdjustOnCancel = IEvent<unknown, EventName['adjustOnCancel']>;\nexport type HistoryContextEvent =\n | HistoryContextEventAppendToHistory\n | HistoryContextEventPrepareHistory\n | HistoryContextEventAdjustOnCancel;\n\nexport type HistoryContextState = {\n class: typeof HistoryContext.class;\n\n /** messages to send to OpenAI API */\n messages: ChatCompletionMessageParam[];\n};\n\nexport interface HistoryContextConfig extends BaseConfig {\n state: HistoryContextState;\n events: HistoryContextEvent;\n}\n","/* eslint-disable @typescript-eslint/unbound-method */\n\nimport { setImmediate } from 'node:timers/promises';\nimport { clear, Memoize } from 'typescript-memoize';\nimport { BaseStep } from '../base.ts';\nimport { ToolsContext } from '../tools/tools-context.ts';\nimport { ACTION } from '@onereach/flow-sdk/types/index.js';\nimport { BackgroundThreadErrorFilter } from '../../decorators/background-thread-error-filter.ts';\nimport { CreateChatCompletionStepError, ErrorCode } from '../../errors/step-error.ts';\nimport { errorFilter } from '../../errors/error-filter.ts';\nimport { RequestContext } from '../request/request-context.ts';\n\nimport type { IActionEvent, IEvent, RESULT, STATE } from '@onereach/flow-sdk/types/index.js';\nimport type {\n ChatCompletion,\n ChatCompletionChunk,\n ChatCompletionMessageFunctionToolCall,\n ChatCompletionToolMessageParam,\n} from 'openai/resources.js';\nimport type { ToolsContextConfig } from '../tools/tools-context.ts';\nimport type { BaseChildResultCancel, BaseChildConfig } from '../base-child.ts';\nimport type { RequestContextConfig } from '../request/request-context.ts';\n\nconst memoizeTag = ['toolsInit'];\n\nexport abstract class AbstractContentContext<T extends ContentContextConfig> extends BaseStep<T> {\n public static get class(): string {\n throw new Error('Define \"class\" static field');\n }\n\n public static getInitialState<T extends ContentContextConfig>(): STATE<T> {\n throw new Error('Define \"getInitialState\" static method');\n }\n\n // ----------------------------------------------\n\n @BackgroundThreadErrorFilter\n public runStep(): void | Promise<void> {\n // reset init of tools thread on a fresh start\n clear(memoizeTag);\n\n // TODO: add hook for end of ToolsContext thread\n this.triggers\n .local(contentContextEvents.handleContent, this.onHandleContent)\n .hook<RequestContextConfig, ACTION.end>(\n { name: ACTION.end, thread: RequestContext.getThreadId(this.thread.step.id) },\n this.onRequestContextEnd,\n )\n .otherwise(this.initialize);\n }\n\n @BackgroundThreadErrorFilter\n public initialize() {\n this.log.DEBUG?.(`Initializing ${this.constructor.name} thread`);\n\n void RequestContext.start(this.thread);\n }\n\n public abstract onHandleContent(event: ContentContextHandleContentEvent): void | Promise<void>;\n protected abstract onAllContentReceived(): void | Promise<void>;\n protected abstract tryToComplete(): void | Promise<void>;\n\n @BackgroundThreadErrorFilter\n public async onRequestContextEnd(event: IActionEvent<RequestContextConfig, ACTION.end>): Promise<void> {\n const { result } = event.params.thread;\n this.log.DEBUG?.(`${RequestContext.name} thread ended with result`, result);\n\n if (result == undefined) {\n throw new CreateChatCompletionStepError(`${RequestContext.name} thread ended unexpectedly`, {\n code: ErrorCode.STEP_LOGIC_ISSUE,\n });\n }\n\n if (result instanceof Error) {\n const resultError = errorFilter(result, {\n unknownMessage: `${RequestContext.name} thread ended with an error`,\n unknownCode: ErrorCode.STEP_LOGIC_ISSUE,\n });\n throw resultError;\n }\n\n // TODO: figure out better way to check for correct structure of the event (zod?)\n\n // do nothing on cancel\n if (result.status === 'cancel') return this.cancel();\n\n if (result.status !== 'ok') {\n throw new CreateChatCompletionStepError(`Unexpected end of the ${RequestContext.name} thread`, {\n code: ErrorCode.STEP_LOGIC_ISSUE,\n data: event.params.result,\n });\n }\n\n this.state.requestComplete = true;\n await this.onAllContentReceived();\n\n if (this.state.toolsReady != undefined) {\n await setImmediate();\n // notify ToolsContext no more tool calls will be made\n await ToolsContext.lastToolCallReceived(this.thread);\n }\n\n await this.tryToComplete();\n }\n\n @BackgroundThreadErrorFilter\n public async onToolsContextEnd(event: IActionEvent<ToolsContextConfig, ACTION.end>): Promise<void> {\n const { result } = event.params.thread;\n\n this.log.DEBUG?.(`${ToolsContext.name} thread ended`, result);\n\n if (result == undefined) {\n throw new CreateChatCompletionStepError(`${ToolsContext.name} thread ended unexpectedly`, {\n code: ErrorCode.STEP_LOGIC_ISSUE,\n });\n }\n\n if (result instanceof Error) {\n const resultError = errorFilter(result, {\n unknownMessage: `${ToolsContext.name} thread ended with an error`,\n unknownCode: ErrorCode.STEP_LOGIC_ISSUE,\n });\n throw resultError;\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 ${ToolsContext.name} 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.tryToComplete();\n }\n\n protected async callFunction(toolCall: ChatCompletionMessageFunctionToolCall) {\n // wait for ToolController needed\n this.state.toolsReady = false;\n await this.initToolsContextThread();\n await ToolsContext.callTool(this.thread, toolCall);\n }\n\n protected handleMultipleChoices(): void {\n const { chatCompletion } = this.state;\n\n const choices = chatCompletion?.choices ?? [];\n if (choices?.length > 1) {\n this.log.WARN?.('Multiple choices received from LLM, but only the first one will be processed', {\n choices: choices.length,\n });\n }\n }\n\n @Memoize({ tags: memoizeTag })\n protected async initToolsContextThread() {\n // wait for the end of ToolsContext thread\n this.triggers.hook<ToolsContextConfig, ACTION.end>(\n { name: ACTION.end, thread: ToolsContext.getThreadId(this.thread.step.id) },\n this.onToolsContextEnd,\n );\n\n await ToolsContext.start(this.thread);\n }\n\n protected cancel(): void {\n this.end({ status: 'cancel' } satisfies ContentContextResult as BaseChildResultCancel);\n }\n\n protected complete() {\n const { chatCompletion } = this.state;\n\n // TODO: add validation for ChatCompletion structure\n if (chatCompletion == undefined) {\n throw new CreateChatCompletionStepError('Missing chat completion content to return value', {\n code: ErrorCode.STEP_LOGIC_ISSUE,\n });\n }\n\n this.end({\n status: 'ok',\n chatCompletion,\n toolsResults: this.state.toolsResults ?? [],\n } satisfies ContentContextResult as ContentContextOkResult);\n }\n}\n\n// --------------------- types ---------------------------\n\nexport const contentContextEvents = {\n handleContent: 'hnd_cnt',\n} as const;\nexport type ContentContentEventName = typeof contentContextEvents;\n\nexport type ContentContextHandleContentEvent = IEvent<\n { content: ChatCompletionChunk | ChatCompletion },\n ContentContentEventName['handleContent']\n>;\n\nexport type ContentContextEvent = ContentContextHandleContentEvent;\n\nexport type ContentContextState = {\n requestComplete: boolean;\n chatCompletion?: ChatCompletion;\n /**\n * Are tool calls ready?\n * - `undefined` - no tools to wait for\n * - `false` - tools are processing\n * - `true` - tools finished processing\n */\n toolsReady?: boolean;\n toolsResults?: ChatCompletionToolMessageParam[];\n};\n\nexport type ContentContextOkResult = {\n status: 'ok';\n chatCompletion: ChatCompletion;\n toolsResults: ChatCompletionToolMessageParam[];\n};\nexport type ContentContextResult = ContentContextOkResult | RESULT<BaseChildConfig>;\n\nexport interface ContentContextConfig extends BaseChildConfig<ContentContextResult> {\n state: ContentContextState;\n result: ContentContextResult;\n events: ContentContextEvent;\n}\n","import Step from '@onereach/flow-sdk/step.js';\nimport { ACTION } from '@onereach/flow-sdk/types/index.js';\nimport type { CONFIG, IThread, IThreadId, IThreadOptions, RESULT } from '@onereach/flow-sdk/types/index.js';\n\n/**\n * Runs a new thread or reuses an existing one (if it ended).\n * @param thread 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 runChildThread<ThreadConfig extends CONFIG & ManagedThreadConfig, StepConfig extends CONFIG>(\n thread: Step<StepConfig> | IThread<StepConfig>, // TODO: remove Step type after migration\n { id, state, local, ...options }: IThreadOptions<ThreadConfig>,\n { force }: { force?: boolean } = {},\n): Promise<RESULT<ThreadConfig>> {\n const threadToRun = thread.process.getThread<ThreadConfig>(id);\n thread.log.DEBUG?.(`runThread: thread with id '${id}'`, options);\n\n if (threadToRun == undefined) {\n // create thread\n return await thread.thread.runThread<ThreadConfig>({\n ...options,\n id,\n state,\n local: {\n ...local,\n parent: thread.thread.id,\n active: true,\n },\n });\n } else {\n if (!force && !threadToRun.ended && threadToRun.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 threadToRun.local.active = true;\n return await threadToRun.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 thread: Step<StepConfig> | IThread<StepConfig>, // TODO: remove Step after migration\n threadId: IThreadId,\n): boolean {\n const threadToCheck = thread.process.getThread<ThreadConfig>(threadId);\n return Boolean(threadToCheck != undefined && threadToCheck.local.active && !threadToCheck.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 thread: Step<StepConfig> | IThread<StepConfig>, // TODO: remove Step after migration\n id: IThreadId,\n { result, stopChildThreads }: { result?: RESULT<ThreadConfig>; stopChildThreads?: boolean } = {},\n): Promise<void> {\n const threadToStop = thread.process.getThread<ThreadConfig>(id);\n thread.log.DEBUG?.(`stopThread: thread with id '${id}'`);\n\n if (!threadToStop) return;\n\n if (stopChildThreads) await endChildThreads(threadToStop, result);\n\n if (!threadToStop.local.active) return;\n\n threadToStop.local.active = false;\n if (threadToStop.ended) return;\n\n await threadToStop.enqueueAndRun({ name: ACTION.ending, result });\n}\n\nexport async function endChildThreads<ThreadConfig extends CONFIG, StepConfig extends CONFIG>(\n thread: IThread<StepConfig>,\n result?: RESULT<ThreadConfig>,\n options: { throw?: boolean } = {},\n): Promise<PromiseSettledResult<void>[]> {\n const childThreads = listChildThreads(thread);\n const stopTasks = childThreads.map(\n async (child) => await stopThread(thread, child.id, { stopChildThreads: true, result }),\n );\n const stopResults = await Promise.allSettled(stopTasks);\n\n const throwError = options.throw ?? true;\n if (throwError) {\n const failedTask = stopResults.find((task) => task.status === 'rejected');\n if (failedTask) throw failedTask.reason;\n }\n\n return stopResults;\n}\n\nexport type ManagedThreadLocal = {\n active: boolean;\n parent: IThreadId;\n};\n\nexport type ManagedThreadConfig = {\n local: ManagedThreadLocal;\n};\n","import { baseClassIdPrefix, BaseStep } from '../base.ts';\nimport { ErrorFilter } from '../../decorators/error-filter.ts';\nimport { runChildThread } from '../../utils/thread-utilities.ts';\n\nimport type { IThread, IThreadId, LOCAL, RESULT } from '@onereach/flow-sdk/types/index.js';\nimport type { ChatCompletionMessageFunctionToolCall } from 'openai/resources.js';\nimport type { ToolsContextConfig } from './tools-context.ts';\nimport type { BaseChildConfig } from '../base-child.ts';\n\nexport class ToolsContextWorker extends BaseStep<ToolsContextWorkerConfig> {\n public static readonly class = 'tl_wrk';\n\n public static async start(\n thread: IThread<ToolsContextConfig>,\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 ParsedArguments;\n\n await runChildThread<ToolsContextWorkerConfig, ToolsContextConfig>(thread, {\n id: this.getThreadId(toolCall),\n state: {\n step: thread.step.id,\n class: this.class,\n },\n local: {\n toolCall,\n parsedArguments,\n\n // TODO: figure out how to remove these params without breaking typing\n parent: thread.id,\n active: true,\n },\n });\n }\n\n public static getThreadId(toolCall: ChatCompletionMessageFunctionToolCall): IThreadId {\n return `${baseClassIdPrefix}_${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;\n\n this.log.DEBUG?.('Initializing tool worker thread', toolCall);\n this.exitStep(this.getExitName(/*toolCall*/), {\n function: {\n name: toolCall.function.name,\n arguments: parsedArguments, // use parsed arguments\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 = Record<string, unknown>;\nexport type ToolsContextWorkerMergeField = {\n function: {\n name: string;\n arguments: ParsedArguments;\n };\n};\n\nexport type ToolsContextWorkerOut = ToolsContextWorkerMergeField;\n\nexport type ToolsContextWorkerState = {\n class: typeof ToolsContextWorker.class;\n};\n\nexport type ToolsContextWorkerLocal = {\n toolCall: ChatCompletionMessageFunctionToolCall;\n parsedArguments: ParsedArguments;\n} & LOCAL<BaseChildConfig>;\n\nexport type ThreadWorkerResultOk = {\n status: 'ok';\n\n /** id of the tool call that was processed */\n toolCallId: string;\n\n /** result of the tool call */\n data: unknown;\n};\nexport type ThreadWorkerResult = ThreadWorkerResultOk | RESULT<BaseChildConfig>;\n\nexport interface ToolsContextWorkerConfig extends BaseChildConfig<ThreadWorkerResult, ToolsContextWorkerLocal> {\n dataOut: ToolsContextWorkerOut;\n state: ToolsContextWorkerState;\n}\n","/* eslint-disable @typescript-eslint/unbound-method */\n\nimport { baseClassIdPrefix, BaseStep } from '../base.ts';\nimport { BackgroundThreadErrorFilter } from '../../decorators/background-thread-error-filter.ts';\nimport { CreateChatCompletionStepError, ErrorCode } from '../../errors/step-error.ts';\nimport { ToolsContextWorker, ToolsContextWorkerConfig } from './tools-context-worker.ts';\nimport { runChildThread } from '../../utils/thread-utilities.ts';\nimport { ACTION } from '@onereach/flow-sdk/types/index.js';\nimport { errorFilter } from '../../errors/error-filter.ts';\n\nimport type { IActionEvent, IEvent, IStepId, IThread, IThreadId, RESULT } from '@onereach/flow-sdk/types/index.js';\nimport type { ChatCompletionMessageFunctionToolCall, ChatCompletionToolMessageParam } from 'openai/resources.js';\nimport type { ContentContextConfig } from '../content/abstract-content-context.ts';\nimport type { BaseChildConfig } from '../base-child.ts';\n\nexport class ToolsContext extends BaseStep<ToolsContextConfig> {\n public static readonly class = 'tl_ctrl';\n\n public static async start<T extends ContentContextConfig>(thread: IThread<T>): Promise<void> {\n const threadId = this.getThreadId(thread.step.id);\n await runChildThread<ToolsContextConfig, T>(thread, {\n id: threadId,\n state: {\n step: thread.step.id,\n class: this.class,\n\n /** tool calls from LLM response */\n tasks: {},\n\n /** flag to indicate if there are more tasks to process */\n expectMoreTasks: true,\n },\n background: true,\n });\n }\n\n public static async callTool<T extends ContentContextConfig>(\n thread: IThread<T>,\n toolCall: ChatCompletionMessageFunctionToolCall,\n ): Promise<void> {\n await thread.process.enqueueAndRun<EventName['callTool'], CallToolParameters>({\n thread: this.getThreadId(thread.step.id),\n name: EventName.callTool,\n params: { toolCall },\n });\n }\n\n /**\n * Notify tools context thread that no more tool calls are expected\n */\n public static async lastToolCallReceived<T extends ContentContextConfig>(thread: IThread<T>): Promise<void> {\n await thread.process.enqueueAndRun<EventName['lastToolCallReceived']>({\n thread: this.getThreadId(thread.step.id),\n name: EventName.lastToolCallReceived,\n });\n }\n\n public static getThreadId(stepId: IStepId): IThreadId {\n return `${baseClassIdPrefix}_${this.class}_${stepId}`;\n }\n\n // ---------------------------------------\n\n @BackgroundThreadErrorFilter\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 @BackgroundThreadErrorFilter\n public initialize(): void {\n this.log.DEBUG?.(`Initializing ${ToolsContext.name} thread`);\n }\n\n @BackgroundThreadErrorFilter\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 @BackgroundThreadErrorFilter\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.tryEndToolsContextThread();\n }\n\n @BackgroundThreadErrorFilter\n public onWorkerThreadEnd(event: IActionEvent<ToolsContextWorkerConfig, ACTION.end>): void {\n this.log.DEBUG?.('Tool caller worker thread has ended', event);\n\n const { result } = event.params.thread;\n\n if (result == undefined) {\n throw new CreateChatCompletionStepError(`${ToolsContextWorker.name} thread ended unexpectedly`, {\n code: ErrorCode.STEP_LOGIC_ISSUE,\n });\n }\n\n if (result instanceof Error) {\n const resultError = errorFilter(result, {\n unknownMessage: `${ToolsContextWorker.name} thread ended with an error`,\n unknownCode: ErrorCode.STEP_LOGIC_ISSUE,\n });\n throw resultError;\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.tryEndToolsContextThread();\n }\n\n /**\n * Starts the tool worker thread to process the tool call.\n */\n protected startToolWorkerThread(toolCall: ChatCompletionMessageFunctionToolCall): void {\n this.triggers.hook<ToolsContextWorkerConfig, ACTION.end>(\n { name: ACTION.end, thread: ToolsContextWorker.getThreadId(toolCall) },\n this.onWorkerThreadEnd,\n );\n\n void ToolsContextWorker.start(this.thread, toolCall);\n }\n\n protected setToolCallResult(toolCallId: string, result: unknown): 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 tryEndToolsContextThread(): 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\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 = {\n status: 'pending' | 'completed' | 'failed';\n call: ChatCompletionMessageFunctionToolCall;\n\n /** result of the tool call, if completed */\n result?: unknown;\n};\nexport type TasksMap = Record<ChatCompletionMessageFunctionToolCall['id'], ToolCallTask>;\n\nexport type ToolsContextResultOk = {\n status: 'ok';\n messages: ChatCompletionToolMessageParam[]; // messages to be sent to the LLM\n};\nexport type ToolsContextResult = ToolsContextResultOk | RESULT<BaseChildConfig>;\n\nexport type CallToolParameters = {\n toolCall: ChatCompletionMessageFunctionToolCall;\n};\n\nexport type ToolsContextEvent =\n | IEvent<CallToolParameters, EventName['callTool']>\n | IEvent<unknown, EventName['lastToolCallReceived']>;\n\nexport type ToolsContextState = {\n class: typeof ToolsContext.class;\n\n /** tool calls from LLM response */\n tasks: TasksMap;\n\n /** flag to indicate if there are more tasks to process */\n expectMoreTasks: boolean;\n};\n\nexport interface ToolsContextConfig extends BaseChildConfig<ToolsContextResult> {\n state: ToolsContextState;\n events: ToolsContextEvent;\n}\n","import { clear, Memoize } from 'typescript-memoize';\nimport { baseClassIdPrefix, BaseStep } from '../base.ts';\nimport { runChildThread } from '../../utils/thread-utilities.ts';\nimport { createAbortController, deleteAbortController } from '../../utils/process-abort-controller.ts';\nimport { OpenAIRequestService } from './services/openai-request.ts';\nimport { HistoryContext } from '../history/history-context.ts';\nimport { responseHandlerFactory } from './factories/response-handler.ts';\nimport { BackgroundThreadErrorFilter } from '../../decorators/background-thread-error-filter.ts';\n\nimport type { IStepId, IThread, IThreadId, RESULT } from '@onereach/flow-sdk/types/index.js';\nimport type { ChatCompletionMessageParam } from 'openai/resources.js';\nimport type { AbstractResponseHandler } from './response-handlers/abstract.ts';\nimport type { BaseChildConfig } from '../base-child.ts';\nimport type { ContentContextConfig } from '../content/abstract-content-context.ts';\n\nconst memoizeTag = ['requestInit'];\n\nexport class RequestContext extends BaseStep<RequestContextConfig> {\n public static readonly class = 'rqst_ctx';\n\n public static async start<T extends ContentContextConfig>(thread: IThread<T>): Promise<RequestContextResult> {\n return await runChildThread<RequestContextConfig, T>(thread, {\n id: this.getThreadId(thread.step.id),\n state: {\n step: thread.step.id,\n class: this.class,\n },\n background: true,\n });\n }\n\n public static getThreadId(stepId: IStepId): IThreadId {\n return `${baseClassIdPrefix}_${this.class}_${stepId}`;\n }\n\n // ---------------------------------------\n\n @BackgroundThreadErrorFilter\n public async runStep(): Promise<void> {\n clear(memoizeTag);\n const abortController = createAbortController({ thread: this.thread });\n try {\n const response = await this.openAiService.makeOpenAiRequest(this.history, abortController.signal);\n await this.responseHandler.handle(response);\n this.complete();\n } catch (error) {\n if (abortController?.signal.aborted) return this.cancel();\n throw error;\n } finally {\n deleteAbortController({ thread: this.thread });\n }\n }\n\n private cancel() {\n this.end({ status: 'cancel' });\n }\n\n private complete() {\n this.end({ status: 'ok' });\n }\n\n private get history(): ChatCompletionMessageParam[] {\n return HistoryContext.getHistory(this.thread);\n }\n\n @Memoize()\n private get openAiService(): OpenAIRequestService {\n return new OpenAIRequestService(this.thread, this.data);\n }\n\n @Memoize({ tags: memoizeTag })\n private get responseHandler(): AbstractResponseHandler {\n const isStreaming = this.data.streamResponse;\n return responseHandlerFactory({\n thread: this.thread,\n isStreaming,\n });\n }\n}\n\n// ----------------- TYPES -----------------\n\nexport type RequestContextState = {\n class: typeof RequestContext.class;\n};\n\nexport type RequestContextResultOk = { status: 'ok' };\nexport type RequestContextResult = RequestContextResultOk | RESULT<BaseChildConfig>;\n\nexport interface RequestContextConfig extends BaseChildConfig<RequestContextResult> {\n state: RequestContextState;\n result: RequestContextResult;\n}\n","import type { CONFIG, IThread } from '@onereach/flow-sdk/types/index.js';\n\n/**\n * Create an AbortController in process cache.\n * It will be available during flow execution, but will disappear in the end of execution\n *\n * @throws If controller already exists will throw an error.\n */\nexport function createAbortController<T extends CONFIG>({\n thread,\n ...options\n}: AbortControllerParameters<T>): AbortController {\n const cacheKey = getAbortControllerKey({ thread, ...options });\n const process = thread.process;\n\n if (process.cache[cacheKey] != undefined) throw new Error(`AbortController for key '${cacheKey}' already exists`);\n\n return (process.cache[cacheKey] = new AbortController());\n}\n\n/**\n * Get instance of AbortController from process cache\n */\nexport function getAbortController<T extends CONFIG>({\n thread,\n ...options\n}: AbortControllerParameters<T>): AbortController | undefined {\n const cacheKey = getAbortControllerKey({ thread, ...options });\n return thread.process.cache[cacheKey] as AbortController | undefined;\n}\n\n/**\n * Remove instance of AbortController from the cache\n *\n * If it does not exists, will not throw an error\n */\nexport function deleteAbortController<T extends CONFIG>({ thread, ...options }: AbortControllerParameters<T>): void {\n const cacheKey = getAbortControllerKey({ thread, ...options });\n delete thread.process.cache[cacheKey];\n}\n\nexport function getAbortControllerKey<T extends CONFIG>({\n thread,\n prefix,\n stepId = thread.currentStepId,\n}: AbortControllerParameters<T>): string {\n const normalizedPrefix = prefix ? `${prefix}:` : '';\n return `${normalizedPrefix}abrt_ctrl:${stepId}`;\n}\n\nexport type AbortControllerParameters<T extends CONFIG> = {\n /** thread to access flow process */\n thread: IThread<T>;\n\n /** Optional step id to use for unique name. If not present will use `thread.currentStepId` */\n stepId?: string;\n\n /** Optional prefix in name if you need to create several controllers */\n prefix?: string;\n};\n","import OpenAI from 'openai';\nimport timestring from 'timestring';\nimport { z } from 'zod/v4-mini';\nimport { Memoize } from 'typescript-memoize';\n\nimport type { Stream } from 'openai/core/streaming.js';\nimport type {\n ChatCompletion,\n ChatCompletionChunk,\n ChatCompletionMessageParam,\n ChatCompletionTool,\n} from 'openai/resources.js';\nimport { CreateChatCompletionStepError, ErrorCode } from '../../../errors/step-error.ts';\nimport { ThreadServiceWithData } from '../../../services/thread-service-with-data.ts';\nimport { RequestContextConfig } from '../request-context.ts';\n\nexport class OpenAIRequestService extends ThreadServiceWithData<RequestContextConfig> {\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 === false) 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 BasicThreadService from '@onereach/flow-sdk/services/basic.js';\nimport type { CONFIG, IN, IThread } from '@onereach/flow-sdk/types/index.js';\n\nexport class ThreadServiceWithData<\n TConfig extends CONFIG,\n TData extends IN<CONFIG> = IN<TConfig>,\n> extends BasicThreadService<TConfig> {\n protected readonly data: TData;\n\n constructor(thread: IThread<TConfig>, data: TData) {\n super(thread);\n this.data = data;\n }\n}\n","import { setImmediate } from 'node:timers/promises';\nimport BasicThreadService from '@onereach/flow-sdk/services/basic.js';\nimport { contentContextEvents } from '../../content/abstract-content-context.ts';\nimport type { Stream } from 'openai/core/streaming.js';\nimport type { ChatCompletion, ChatCompletionChunk } from 'openai/resources/index.js';\nimport type { RequestContextConfig } from '../request-context.ts';\n\nexport abstract class AbstractResponseHandler extends BasicThreadService<RequestContextConfig> {\n public abstract handle(response: ChatCompletion | Stream<ChatCompletionChunk>): Promise<void>;\n\n protected async handleContentByParentThread(content: ChatCompletion | ChatCompletionChunk): Promise<void> {\n await setImmediate();\n await this.thread.process.enqueueAndRun({\n thread: this.thread.local.parent,\n name: contentContextEvents.handleContent,\n params: { content },\n });\n }\n}\n","import { AbstractResponseHandler } from './abstract.ts';\nimport { deleteAbortController } from '../../../utils/process-abort-controller.ts';\n\nimport type { ChatCompletionChunk } from 'openai/resources.js';\nimport type { Stream } from 'openai/core/streaming.js';\n\nexport class StreamResponseHandler extends AbstractResponseHandler {\n public async handle(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 this.handleContentByParentThread(chunk);\n }\n\n deleteAbortController({ thread: this.thread });\n }\n}\n","import { AbstractResponseHandler } from './abstract.ts';\nimport { deleteAbortController } from '../../../utils/process-abort-controller.ts';\n\nimport type { ChatCompletion } from 'openai/resources.js';\n\nexport class SimpleResponseHandler extends AbstractResponseHandler {\n public async handle(response: ChatCompletion): Promise<void> {\n this.log.DEBUG?.('Start processing response from LLM');\n await this.handleContentByParentThread(response);\n deleteAbortController({ thread: this.thread });\n }\n}\n","import { StreamResponseHandler } from '../response-handlers/stream.ts';\nimport { SimpleResponseHandler } from '../response-handlers/simple.ts';\n\nimport type { IThread } from '@onereach/flow-sdk/types/index.js';\nimport type { RequestContextConfig } from '../request-context.ts';\nimport type { AbstractResponseHandler } from '../response-handlers/abstract.ts';\n\nexport function responseHandlerFactory({\n thread,\n isStreaming,\n}: ResponseHandlerFactoryParameters): AbstractResponseHandler {\n if (isStreaming) return new StreamResponseHandler(thread);\n return new SimpleResponseHandler(thread);\n}\n\nexport type ResponseHandlerFactoryParameters = {\n thread: IThread<RequestContextConfig>;\n isStreaming: boolean;\n};\n","import { AbstractContentContext } from '../abstract-content-context.ts';\nimport { BackgroundThreadErrorFilter } from '../../../decorators/background-thread-error-filter.ts';\n\nimport type { IEvent, STATE } from '@onereach/flow-sdk/types/index.js';\nimport type { ChatCompletion, ChatCompletionMessageFunctionToolCall } from 'openai/resources.js';\nimport type { ContentContentEventName, ContentContextConfig } from '../abstract-content-context.ts';\n\nexport class SimpleContentContext extends AbstractContentContext<SimpleContentContextConfig> {\n public static readonly class = 'cnt_cxt_smp';\n\n public static getInitialState(): STATE<SimpleContentContextConfig> {\n return {\n requestComplete: false,\n };\n }\n\n // ----------------------------------------------\n\n @BackgroundThreadErrorFilter\n public async onHandleContent(event: SimpleContentContextHandleContentEvent) {\n const { content } = event.params;\n\n this.state.chatCompletion = content;\n\n // Process tool calls if any\n const toolCalls = content.choices[0]?.message.tool_calls;\n if (toolCalls != undefined) {\n for (const toolCall of toolCalls) {\n // TODO: throw an error if tool call is not a function\n await this.callFunction(toolCall as ChatCompletionMessageFunctionToolCall);\n }\n }\n }\n\n @BackgroundThreadErrorFilter\n public onAllContentReceived() {\n this.handleMultipleChoices();\n }\n\n protected tryToComplete() {\n const { requestComplete, toolsReady } = this.state;\n\n // need to wait for request and tools to finish processing\n if (!requestComplete || toolsReady === false) return;\n\n this.complete();\n }\n}\n\n// -------------------- types ---------------------\n\nexport type SimpleContentContextHandleContentEvent = IEvent<\n { content: ChatCompletion },\n ContentContentEventName['handleContent']\n>;\nexport type SimpleContentContextEvent = SimpleContentContextHandleContentEvent;\n\nexport interface SimpleContentContextConfig extends ContentContextConfig {\n events: SimpleContentContextEvent;\n}\n","/* eslint-disable @typescript-eslint/unbound-method */\n\nimport { clear, Memoize } from 'typescript-memoize';\nimport { AbstractContentContext } from '../abstract-content-context.ts';\nimport { StreamContentContextWorker, StreamContentContextWorkerConfig } from './stream-content-context-worker.ts';\nimport { BackgroundThreadErrorFilter } from '../../../decorators/background-thread-error-filter.ts';\nimport { CreateChatCompletionStepError, ErrorCode } from '../../../errors/step-error.ts';\nimport { streamChunkEventSchema } from './schemas/stream-chunk.ts';\nimport { StreamReducerService } from './services/stream-reducer.ts';\nimport { ACTION } from '@onereach/flow-sdk/types/index.js';\nimport { errorFilter } from '../../../errors/error-filter.ts';\n\nimport type { IEvent, IActionEvent, STATE } from '@onereach/flow-sdk/types/index.js';\nimport type { ChatCompletion, ChatCompletionChunk, ChatCompletionMessageFunctionToolCall } from 'openai/resources.js';\nimport type {\n ContentContentEventName,\n ContentContextConfig,\n ContentContextState,\n} from '../abstract-content-context.ts';\n\nconst memoizeTag = ['streamInit'];\n\nexport class StreamContentContext extends AbstractContentContext<StreamContentContextConfig> {\n public static readonly class = 'cnt_cxt_str';\n\n public static getInitialState(): STATE<StreamContentContextConfig> {\n return {\n class: StreamContentContext.class,\n requestComplete: false,\n workerComplete: false,\n\n partialChatCompletion: {},\n events: [],\n lastChunkReceived: false,\n index: -1,\n };\n }\n\n // ---------------------------------------\n\n @BackgroundThreadErrorFilter\n public async runStep(): Promise<void> {\n await super.runStep();\n\n clear(memoizeTag);\n\n this.triggers.hook<StreamContentContextWorkerConfig, ACTION.end>(\n { name: ACTION.end, thread: StreamContentContextWorker.getThreadId(this.thread.step.id) },\n this.onWorkerThreadEnd,\n );\n }\n\n /**\n * Handler of the worker thread end event.\n */\n @BackgroundThreadErrorFilter\n public onWorkerThreadEnd(event: IActionEvent<StreamContentContextWorkerConfig, ACTION.end>): void {\n const { result } = event.params.thread;\n\n this.log.DEBUG?.(`${StreamContentContextWorker.name} thread finished processing chunk`, result);\n\n if (result instanceof Error) {\n const resultError = errorFilter(result, {\n unknownMessage: `${StreamContentContextWorker.name} thread ended with an error`,\n });\n throw resultError;\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 @BackgroundThreadErrorFilter\n public onHandleContent(event: StreamContentContextHandleContentEvent): void {\n const parsedEvent = streamChunkEventSchema.parse(event);\n const chunk = parsedEvent.params.content satisfies ChatCompletionChunk;\n\n const streamReducer = new StreamReducerService(this.state.partialChatCompletion, 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 // skip streaming additional choices (if n > 1)\n if (chunkChoice.index > 0) continue;\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 }\n\n /**\n * Handles the notification that all response chunks were received from the OpenAI API.\n */\n @BackgroundThreadErrorFilter\n protected onAllContentReceived(): void {\n this.log.DEBUG?.('All LLM response chunks were received. No more response chunks expected');\n\n // TODO: maybe validate that completionResult is correct?\n this.state.chatCompletion = this.state.partialChatCompletion as ChatCompletion;\n\n this.handleMultipleChoices();\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 content context thread state\n this.state.lastChunkReceived = true;\n\n // force processing of the top chunk in the content queue\n this.tryRunWorker();\n }\n\n private onToolCall(toolCall: ChatCompletionMessageFunctionToolCall): void {\n this.log.DEBUG?.('Tool call received', toolCall);\n void this.callFunction(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 private tryRunWorker(): void {\n // skip if worker thread is busy\n if (StreamContentContextWorker.isBusy(this.thread)) {\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 ContentContext thread with aggregated response\n this.log.DEBUG?.(\n `Stopping ${StreamContentContext.name} thread. All response content chunks were processed and no new chunks are coming`,\n );\n\n this.state.workerComplete = true;\n\n this.tryToComplete();\n return;\n }\n\n this.log.DEBUG?.('Notify stream worker thread about response chunk to process', event);\n\n void StreamContentContextWorker.start(this.thread, 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 protected tryToComplete(): void {\n const { chatCompletion, toolsReady, requestComplete, workerComplete } = this.state;\n if (!workerComplete || !requestComplete || toolsReady === false || chatCompletion == undefined) return;\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 this.complete();\n }\n\n @Memoize({ tags: memoizeTag })\n protected get maxChunkContentLength(): number {\n return this.data.streamSettings?.maxBufferLength ?? 100;\n }\n\n @Memoize({ tags: memoizeTag })\n protected get debounceDuration(): number {\n return this.data.streamSettings?.debounceDuration ?? 200;\n }\n}\n\n// -------------------- types ---------------------\n\nexport type StreamContentContextHandleContentEvent = IEvent<\n { content: ChatCompletionChunk },\n ContentContentEventName['handleContent']\n>;\nexport type StreamContentContextEvent = StreamContentContextHandleContentEvent;\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;\nexport type StreamContentContextState = Omit<ContentContextState, 'class'> & {\n class: typeof StreamContentContext.class;\n\n /** aggregated result of the LLM response */\n partialChatCompletion: Partial<ChatCompletion>;\n\n /** queue of response chunks */\n events: ContentEvent[];\n\n /** last index for a chunk to be processed by worker */\n index: number;\n\n /** marker for end of response stream */\n lastChunkReceived: boolean;\n\n /** When `true` means worker finished the processing the queue */\n workerComplete: boolean;\n};\n\nexport interface StreamContentContextConfig extends ContentContextConfig {\n events: StreamContentContextEvent;\n state: StreamContentContextState;\n}\n","import { baseClassIdPrefix, BaseStep } from '../../base.ts';\nimport { ErrorFilter } from '../../../decorators/error-filter.ts';\nimport { CreateChatCompletionStepError, ErrorCode } from '../../../errors/step-error.ts';\nimport { isThreadBusy, runChildThread } from '../../../utils/thread-utilities.ts';\n\nimport type { IStepId, IThread, IThreadId, RESULT } from '@onereach/flow-sdk/types/index.js';\nimport type { StreamContentContextConfig } from './stream-content-context.ts';\nimport type { BaseChildConfig } from '../../base-child.ts';\n\nexport class StreamContentContextWorker extends BaseStep<StreamContentContextWorkerConfig> {\n public static readonly class = 'str_wrk';\n\n public static async start(thread: IThread<StreamContentContextConfig>, event: ContentChunk): Promise<void> {\n await runChildThread<StreamContentContextWorkerConfig, StreamContentContextConfig>(thread, {\n id: this.getThreadId(thread.step.id),\n state: {\n step: thread.step.id,\n class: this.class,\n\n event,\n },\n });\n }\n\n public static isBusy(thread: IThread<StreamContentContextConfig>): boolean {\n return isThreadBusy<StreamContentContextConfig, StreamContentContextWorkerConfig>(\n thread,\n this.getThreadId(thread.step.id),\n );\n }\n\n public static getThreadId(stepId: IStepId): IThreadId {\n return `${baseClassIdPrefix}_${this.class}_${stepId}`;\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 StreamContentContextWorkerOut = {\n chunk: ContentChunk;\n};\n\nexport type StreamContentContextWorkerState = {\n class: typeof StreamContentContextWorker.class;\n\n event: ContentChunk;\n};\n\nexport type StreamContentContextWorkerResult = undefined | RESULT<BaseChildConfig>;\n\nexport interface StreamContentContextWorkerConfig extends BaseChildConfig<StreamContentContextWorkerResult> {\n dataOut: StreamContentContextWorkerOut;\n state: StreamContentContextWorkerState;\n}\n","import { z } from 'zod/v4-mini';\nimport { ChatCompletionChunk } from 'openai/resources.mjs';\n\nexport const streamChunkEventSchema = z.object({\n name: z.string(),\n params: z.object({\n content: 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});\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.js';\nimport { ParsedArguments } from '../../../tools/tools-context-worker.ts';\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 if (content === null) {\n // eslint-disable-next-line unicorn/no-null\n existing.message.content ??= null;\n } else {\n existing.message.content ??= '';\n existing.message.content += content;\n }\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","import { createRequire } from 'node:module';\nimport { readFile } from 'node:fs/promises';\n\nconst require = createRequire(import.meta.url);\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","/* eslint-disable @typescript-eslint/unbound-method */\n\nimport { BaseConfig, BaseStep } from './threads/base.ts';\nimport { HistoryContext, HistoryContextConfig } from './threads/history/history-context.ts';\nimport { ErrorFilter } from './decorators/error-filter.ts';\nimport { BackgroundThreadErrorFilter } from './decorators/background-thread-error-filter.ts';\nimport { CreateChatCompletionStepError, ErrorCode } from './errors/step-error.ts';\nimport { validateFlowSdkVersion } from './utils/validate-flow-sdk-version.ts';\nimport { ACTION } from '@onereach/flow-sdk/types/index.js';\nimport { CancelContext } from './threads/cancel/cancel-context.ts';\nimport { ContentContextUtilities } from './threads/content/content-context-utilities.ts';\nimport { endChildThreads } from './utils/thread-utilities.ts';\nimport { errorFilter } from './errors/error-filter.ts';\n\nimport type { ChatCompletion, ChatCompletionToolMessageParam } from 'openai/resources.js';\nimport type { IActionEvent, IEvent } from '@onereach/flow-sdk/types/index.js';\nimport type { ContentContextConfig } from './threads/content/abstract-content-context.ts';\n\nconst MINIMAL_FLOW_SDK_VERSION = '8.0.69';\n\nexport class CreateChatCompletionStep extends BaseStep<ChatCompletionConfig> {\n @ErrorFilter\n public runStep(): void {\n this.triggers.hook<ContentContextConfig, ACTION.end>(\n { name: ACTION.end, thread: this.contentContext.getThreadId(this.thread.step.id) },\n this.onContentContextEnd,\n );\n this.triggers.hook<HistoryContextConfig, ACTION.end>(\n { name: ACTION.end, thread: HistoryContext.getThreadId(this.thread.step.id) },\n this.onHistoryContextEnd,\n );\n this.triggers.local(events.cancel, this.onCancel);\n this.triggers.otherwise(this.initialize);\n }\n\n @ErrorFilter\n public async initialize(): Promise<void> {\n await validateFlowSdkVersion(MINIMAL_FLOW_SDK_VERSION);\n this.validateMergeFieldType();\n\n this.resetState();\n this.state.cancelled = false;\n\n await Promise.all([HistoryContext.start(this.thread), CancelContext.start(this.thread)]);\n\n // prepare messages history for the request\n await HistoryContext.prepareHistory(this.thread);\n\n // starting ContentContext thread will initiate the request to LLM\n await this.contentContext.start(this.thread);\n }\n\n @BackgroundThreadErrorFilter({ allowHandleError: true })\n public async onContentContextEnd(event: IActionEvent<ContentContextConfig, ACTION.end>): Promise<void> {\n try {\n const { result } = event.params.thread;\n this.log.DEBUG?.('ContentContext thread ended with result', result);\n\n if (result == undefined) {\n throw new CreateChatCompletionStepError('ContentContext thread ended unexpectedly', {\n code: ErrorCode.STEP_LOGIC_ISSUE,\n });\n }\n\n if (result instanceof Error) {\n const resultError = errorFilter(result, {\n unknownMessage: 'ContentContext thread ended with an error',\n unknownCode: ErrorCode.STEP_LOGIC_ISSUE,\n });\n throw resultError;\n }\n\n if (result.status === 'cancel') {\n await this.resetStep();\n return;\n }\n\n // TODO: figure out better way to check for correct structure of the event (zod?)\n const { status, chatCompletion, toolsResults } = result;\n\n if (status !== 'ok' || chatCompletion == undefined || toolsResults == undefined) {\n throw new CreateChatCompletionStepError('Unexpected end of the ContentContext thread', {\n code: ErrorCode.STEP_LOGIC_ISSUE,\n data: event.params.result,\n });\n }\n\n this.log.DEBUG?.('Create Chat Completion result', chatCompletion);\n\n this.state.contentReady = true;\n this.state.chatCompletion = chatCompletion;\n this.state.toolsResults = toolsResults;\n\n await this.tryToExitStep();\n } catch (error) {\n await this.resetStep().catch(() => {});\n throw error;\n }\n }\n\n @BackgroundThreadErrorFilter({ allowHandleError: true })\n public async onHistoryContextEnd(event: IActionEvent<HistoryContextConfig, ACTION.end>): Promise<void> {\n try {\n const { result } = event.params.thread;\n this.log.DEBUG?.(`${HistoryContext.name} thread ended with result`, result);\n\n if (result instanceof Error) {\n const resultError = errorFilter(result, {\n unknownMessage: `${HistoryContext.name} thread ended with an error`,\n unknownCode: ErrorCode.STEP_LOGIC_ISSUE,\n });\n throw resultError;\n }\n } catch (error) {\n await CancelContext.stop(this.thread).catch(() => {});\n throw error;\n }\n }\n\n private async tryToExitStep(): Promise<void> {\n const { cancelled, contentReady, chatCompletion, toolsResults } = this.state;\n\n if (cancelled) {\n // TODO: cleanup history with tool responses from it if \"second\" response was cancelled\n this.resetState();\n return;\n }\n\n if (!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 await Promise.all([\n // add completion message and possible tool results to history\n HistoryContext.appendToHistory(this.thread, [completionMessage, ...toolsResults]),\n // at this point there's nothing to cancel, so CancelContext thread is not needed anymore\n CancelContext.stop(this.thread),\n ]);\n\n const finishReason = chatCompletion.choices[0]?.finish_reason;\n if (finishReason === '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 } else if (finishReason === 'tool_calls') {\n // reset the step and run request again\n this.thread.jumpTo(this.currentStepId);\n return;\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);\n }\n\n @ErrorFilter\n public async onCancel(): Promise<void> {\n await this.resetStep();\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 CancelContext thread;\n * - End ContentController (with child thread);\n *\n * @throws if there any issues with stopping threads\n */\n private async resetStep(): Promise<void> {\n this.resetState();\n this.state.cancelled = true;\n\n const resetResults = await Promise.allSettled([\n endChildThreads(this.thread, { status: 'cancel' }),\n HistoryContext.adjustOnCancel(this.thread),\n ]);\n const failedTask = resetResults.find((task) => task.status === 'rejected');\n if (failedTask) throw failedTask.reason;\n }\n\n private resetState(): void {\n this.state.contentReady = false;\n this.state.chatCompletion = undefined;\n this.state.toolsResults = [];\n }\n\n private 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 private get contentContext(): ContentContextUtilities {\n const isStreaming = this.data.streamResponse;\n return ContentContextUtilities.factory(isStreaming);\n }\n}\n\n// ----------------- TYPES -----------------\n\nexport const events = {\n cancel: 'st_cancel',\n} as const;\nexport type EventName = typeof events;\n\nexport type ChatCompletionOut = ChatCompletion;\n\nexport type ChatCompletionState = {\n cancelled: boolean;\n contentReady: boolean;\n chatCompletion?: ChatCompletion;\n toolsResults: ChatCompletionToolMessageParam[];\n};\n\nexport type ChatCompletionCancelEvent = IEvent<unknown, EventName['cancel']>;\n\nexport type ChatCompletionEvents = ChatCompletionCancelEvent;\n\nexport interface ChatCompletionConfig extends BaseConfig {\n dataOut: ChatCompletionOut;\n state: ChatCompletionState;\n events: ChatCompletionEvents;\n}\n","import { Memoize } from 'typescript-memoize';\nimport { runChildThread, stopThread } from '../../utils/thread-utilities.ts';\nimport { SimpleContentContext } from './simple/simple-content-context.ts';\nimport { StreamContentContext } from './stream/stream-content-context.ts';\nimport { baseClassIdPrefix } from '../base.ts';\nimport type { IStepId, IThread, IThreadId } from '@onereach/flow-sdk/types/index.js';\nimport type { ContentContextConfig } from './abstract-content-context.ts';\nimport type { ChatCompletionConfig } from '../../step.ts';\n\nexport class ContentContextUtilities {\n @Memoize()\n static factory(isStreaming: boolean): ContentContextUtilities {\n const Constructor: ContentContextConstructor = isStreaming ? StreamContentContext : SimpleContentContext;\n return new ContentContextUtilities(Constructor);\n }\n\n private Constructor: ContentContextConstructor;\n\n private constructor(Constructor: ContentContextConstructor) {\n this.Constructor = Constructor;\n }\n\n public async start(thread: IThread<ChatCompletionConfig>): Promise<void> {\n const initialState = this.Constructor.getInitialState();\n await runChildThread<ContentContextConfig, ChatCompletionConfig>(thread, {\n id: this.getThreadId(thread.step.id),\n state: {\n ...initialState,\n requestComplete: false,\n step: thread.step.id,\n class: this.Constructor.class,\n },\n background: true,\n });\n }\n\n public async cancel(thread: IThread<ChatCompletionConfig>): Promise<void> {\n await stopThread<ContentContextConfig, ChatCompletionConfig>(thread, this.getThreadId(thread.step.id), {\n result: { status: 'cancel' },\n stopChildThreads: true,\n });\n }\n\n public getThreadId(stepId: IStepId): IThreadId {\n return `${baseClassIdPrefix}_${this.Constructor.class}_${stepId}`;\n }\n}\n\nexport type ContentContextConstructor = typeof SimpleContentContext | typeof StreamContentContext;\n","/* eslint-disable @typescript-eslint/unbound-method */\n\nimport { baseClassIdPrefix, BaseStep } from '../base.ts';\nimport { BackgroundThreadErrorFilter } from '../../decorators/background-thread-error-filter.ts';\nimport { runChildThread, stopThread } from '../../utils/thread-utilities.ts';\nimport { events as stepEvents } from '../../step.ts';\nimport { getAbortController } from '../../utils/process-abort-controller.ts';\nimport { AbortRequestError } from '../../errors/step-error.ts';\n\nimport type { BaseChildConfig } from '../base-child.ts';\nimport type { IThreadId, IEvent, IThread, IStepId } from '@onereach/flow-sdk/types/index.js';\nimport type { ChatCompletionConfig } from '../../step.ts';\n\nexport class CancelContext extends BaseStep<CancelContextConfig> {\n public static readonly class = 'cncl_ctrl';\n\n public static async start(thread: IThread<ChatCompletionConfig>): Promise<void> {\n await runChildThread<CancelContextConfig, ChatCompletionConfig>(\n thread,\n {\n id: this.getThreadId(thread.step.id),\n state: {\n step: thread.step.id,\n class: this.class,\n },\n background: true,\n },\n { force: true },\n );\n }\n\n public static async stop(thread: IThread<ChatCompletionConfig>): Promise<void> {\n await stopThread(thread, this.getThreadId(thread.step.id));\n }\n\n public static getThreadId(stepId: IStepId): IThreadId {\n return `${baseClassIdPrefix}_${this.class}_${stepId}`;\n }\n\n // ---------------------------------------\n\n @BackgroundThreadErrorFilter\n public runStep(): void {\n this.triggers.local({ name: events.cancel }, this.onCancel).otherwise(this.initialize);\n }\n\n @BackgroundThreadErrorFilter\n initialize(): void {\n this.log.DEBUG?.(`Initializing ${CancelContext.name} thread`);\n }\n\n @BackgroundThreadErrorFilter\n public onCancel(): void {\n this.log.DEBUG?.('Canceling LLM request');\n const parentThreadId = this.local.parent;\n const parentThread = this.process.getThread<ChatCompletionConfig>(parentThreadId);\n\n if (!parentThread) return this.end();\n\n const abortController = getAbortController({ thread: this.thread });\n if (abortController) {\n // LLM request is active\n abortController.abort(new AbortRequestError('Request cancelled'));\n } else {\n // LLM request already ended\n void this.process.enqueueAndRun({ name: stepEvents.cancel, thread: parentThreadId });\n }\n }\n}\n\n// ----------------- TYPES -----------------\n\nexport const events = {\n cancel: 'cnl_cancel',\n} as const;\nexport type EventName = typeof events;\n\nexport type CancelContextEvents = IEvent<unknown, EventName['cancel']>;\n\nexport type CancelContextState = {\n class: typeof CancelContext.class;\n};\n\nexport interface CancelContextConfig extends BaseChildConfig {\n state: CancelContextState;\n events: CancelContextEvents;\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","defaultPreserveErrors","CreateChatCompletionStepError","TimeoutError","errorFilter","error","options","preserveErrors","unknownMessage","unknownCode","ErrorCode","UNKNOWN","some","ErrorClass","z","core","$ZodError","prettifyError","code","VALIDATION","Error","message","includes","TIMEOUT","responseErrorMessage","response","data","undefined","SERVER_ERROR","defaultOptions","ErrorFilter","createMethodDecoratorWithOptionalArguments","_options","_target","propertyKey","descriptor","originalMethod","value","arguments_","result","apply","Promise","catch","error","methodName","toString","log","DEBUG","errorFilter","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","BaseStep","Step","resolveDataIn","dataIn","log","DEBUG","dataInSchema","parse","baseClassIdPrefix","ACTION","defaultOptions","allowHandleError","useErrorFilter","BackgroundThreadErrorFilter","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","_ts_decorate","decorators","target","key","desc","__name","HistoryContext","BaseStep","class","start","thread","historyThreadId","getThreadId","step","id","process","getThread","undefined","runThread","background","state","messages","prepareHistory","enqueueAndRun","name","events","appendToHistory","message","params","adjustOnCancel","getHistory","getSafeThread","stepId","baseClassIdPrefix","runStep","triggers","local","onPrepareHistory","onAppendToHistory","onAdjustOnCancel","otherwise","initialize","log","DEBUG","at","includes","role","tool_calls","removedMessage","pop","customHistory","historyLength","systemMessage","typeOfStep","userMessage","historyMode","historyMergefield","historyCode","assistantsFirstMessage","data","content","length","push","some","slice","systemMessageRecord","unshift","event","Array","isArray","setImmediate","clear","Memoize","ACTION","runChildThread","thread","id","state","local","options","force","threadToRun","process","getThread","log","DEBUG","undefined","runThread","parent","active","ended","Error","enqueueAndRun","name","ACTION","goto","isThreadBusy","threadId","threadToCheck","Boolean","listChildThreads","parentThreadId","childThreads","threads","item","push","stopThread","result","stopChildThreads","threadToStop","endChildThreads","ending","stopTasks","map","child","stopResults","Promise","allSettled","throw","failedTask","find","task","status","reason","ToolsContextWorker","BaseStep","class","start","thread","toolCall","parsedArguments","JSON","parse","function","arguments","runChildThread","id","getThreadId","state","step","local","parent","active","baseClassIdPrefix","runStep","log","DEBUG","exitStep","getExitName","name","ACTION","_ts_decorate","decorators","target","key","desc","__name","ToolsContext","BaseStep","class","start","thread","threadId","getThreadId","step","id","runChildThread","state","tasks","expectMoreTasks","background","callTool","toolCall","process","enqueueAndRun","name","EventName","params","lastToolCallReceived","stepId","baseClassIdPrefix","runStep","triggers","local","onCallTool","onLastToolCallReceived","otherwise","initialize","log","DEBUG","event","type","CreateChatCompletionStepError","code","ErrorCode","UNSUPPORTED","call","status","startToolWorkerThread","tryEndToolsContextThread","onWorkerThreadEnd","result","undefined","ToolsContextWorker","STEP_LOGIC_ISSUE","Error","errorFilter","unknownMessage","unknownCode","toolCallId","data","setToolCallResult","hook","ACTION","end","Object","values","some","task","messages","map","role","tool_call_id","content","JSON","stringify","ACTION","clear","Memoize","createAbortController","thread","options","cacheKey","getAbortControllerKey","process","cache","undefined","Error","AbortController","getAbortController","deleteAbortController","prefix","stepId","currentStepId","normalizedPrefix","OpenAI","timestring","z","Memoize","BasicThreadService","ThreadServiceWithData","BasicThreadService","data","thread","OpenAIRequestService","ThreadServiceWithData","makeOpenAiRequest","messages","signal","model","temperature","topP","maxTokens","frequencyPenalty","presencePenalty","n","streamResponse","data","request","structuredClone","top_p","max_tokens","frequency_penalty","presence_penalty","stop","stopSequences","stream","tools","log","DEBUG","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","setImmediate","BasicThreadService","AbstractResponseHandler","BasicThreadService","handleContentByParentThread","content","setImmediate","thread","process","enqueueAndRun","local","parent","name","contentContextEvents","handleContent","params","StreamResponseHandler","AbstractResponseHandler","handle","response","log","DEBUG","chunk","handleContentByParentThread","deleteAbortController","thread","SimpleResponseHandler","AbstractResponseHandler","handle","response","log","DEBUG","handleContentByParentThread","deleteAbortController","thread","responseHandlerFactory","thread","isStreaming","StreamResponseHandler","SimpleResponseHandler","memoizeTag","RequestContext","BaseStep","class","start","thread","runChildThread","id","getThreadId","step","state","background","stepId","baseClassIdPrefix","runStep","clear","abortController","createAbortController","response","openAiService","makeOpenAiRequest","history","signal","responseHandler","handle","complete","error","aborted","cancel","deleteAbortController","end","status","HistoryContext","getHistory","OpenAIRequestService","data","isStreaming","streamResponse","responseHandlerFactory","tags","_ts_decorate","decorators","target","key","desc","__name","memoizeTag","AbstractContentContext","BaseStep","class","Error","getInitialState","runStep","clear","triggers","local","contentContextEvents","handleContent","onHandleContent","hook","name","ACTION","end","thread","RequestContext","getThreadId","step","id","onRequestContextEnd","otherwise","initialize","log","DEBUG","start","event","result","params","undefined","CreateChatCompletionStepError","code","ErrorCode","STEP_LOGIC_ISSUE","errorFilter","unknownMessage","unknownCode","status","cancel","data","state","requestComplete","onAllContentReceived","toolsReady","setImmediate","ToolsContext","lastToolCallReceived","tryToComplete","onToolsContextEnd","messages","Array","isArray","toolsResults","callFunction","toolCall","initToolsContextThread","callTool","handleMultipleChoices","chatCompletion","choices","length","WARN","complete","tags","SimpleContentContext","AbstractContentContext","class","getInitialState","requestComplete","onHandleContent","event","content","params","state","chatCompletion","toolCalls","choices","message","tool_calls","undefined","toolCall","callFunction","onAllContentReceived","handleMultipleChoices","tryToComplete","toolsReady","complete","clear","Memoize","StreamContentContextWorker","BaseStep","class","start","thread","event","runChildThread","id","getThreadId","step","state","isBusy","isThreadBusy","stepId","baseClassIdPrefix","runStep","undefined","CreateChatCompletionStepError","code","ErrorCode","STEP_LOGIC_ISSUE","chunk","log","DEBUG","exitStep","streamWorkerExits","z","streamChunkEventSchema","object","name","string","params","content","id","literal","created","number","model","service_tier","optional","union","null","system_fingerprint","choices","array","index","delta","role","enum","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","memoizeTag","StreamContentContext","AbstractContentContext","class","getInitialState","requestComplete","workerComplete","partialChatCompletion","events","lastChunkReceived","index","runStep","clear","triggers","hook","name","ACTION","end","thread","StreamContentContextWorker","getThreadId","step","id","onWorkerThreadEnd","event","result","params","log","DEBUG","Error","errorFilter","unknownMessage","status","tryRunWorker","onHandleContent","chunk","streamChunkEventSchema","parse","content","StreamReducerService","state","onToolCall","bind","reduceChunk","chunkChoice","choices","delta","undefined","length","addContentToQueue","scheduleNextContentEvent","onAllContentReceived","chatCompletion","handleMultipleChoices","push","toolCall","callFunction","firstEvent","isEventReady","lastEvent","at","WARN","maxChunkContentLength","mergedChunk","slice","ts","Date","now","isBusy","getEventToProcess","tryToComplete","start","eventDelay","debounceDuration","shift","toolsReady","message","CreateChatCompletionStepError","code","ErrorCode","STEP_LOGIC_ISSUE","complete","data","streamSettings","maxBufferLength","tags","createRequire","readFile","require","createRequire","url","validateFlowSdkVersion","minVersion","test","Error","packageJsonPath","resolve","packageJsonContent","readFile","version","JSON","parse","groups","exec","major","Number","parseInt","minor","patch","undefined","isNaN","minMajor","minMinor","minPatch","split","map","x","ACTION","Memoize","ContentContextUtilities","factory","isStreaming","Constructor","StreamContentContext","SimpleContentContext","start","thread","initialState","getInitialState","runChildThread","id","getThreadId","step","state","requestComplete","class","background","cancel","stopThread","result","status","stopChildThreads","stepId","baseClassIdPrefix","_ts_decorate","decorators","target","key","desc","__name","MINIMAL_FLOW_SDK_VERSION","CreateChatCompletionStep","BaseStep","runStep","triggers","hook","name","ACTION","end","thread","contentContext","getThreadId","step","id","onContentContextEnd","HistoryContext","onHistoryContextEnd","local","events","cancel","onCancel","otherwise","initialize","validateFlowSdkVersion","validateMergeFieldType","resetState","state","cancelled","Promise","all","start","CancelContext","prepareHistory","event","result","params","log","DEBUG","undefined","CreateChatCompletionStepError","code","ErrorCode","STEP_LOGIC_ISSUE","Error","errorFilter","unknownMessage","unknownCode","status","resetStep","chatCompletion","toolsResults","data","contentReady","tryToExitStep","error","catch","stop","completionMessage","choices","message","appendToHistory","finishReason","finish_reason","LLM_FINISH_LENGTH","jumpTo","currentStepId","exitStep","failedTask","allSettled","endChildThreads","adjustOnCancel","find","task","reason","functionsList","Array","isArray","length","dataOut","getMergeField","type","VALIDATION","isStreaming","streamResponse","ContentContextUtilities","factory","allowHandleError","_ts_decorate","decorators","target","key","desc","__name","CancelContext","BaseStep","class","start","thread","runChildThread","id","getThreadId","step","state","background","force","stop","stopThread","stepId","baseClassIdPrefix","runStep","triggers","local","name","events","cancel","onCancel","otherwise","initialize","log","DEBUG","parentThreadId","parent","process","getThread","end","abortController","getAbortController","abort","AbortRequestError","enqueueAndRun","stepEvents","install","states","HistoryContext","class","RequestContext","ToolsContext","ToolsContextWorker","SimpleContentContext","StreamContentContext","StreamContentContextWorker","CancelContext"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/threads/base.ts","../src/utils/create-method-decorator.ts","../src/errors/error-filter.ts","../src/errors/step-error.ts","../src/decorators/error-filter.ts","../src/schemas/data-in.ts","../src/decorators/background-thread-error-filter.ts","../src/threads/history/history-context.ts","../src/threads/content/abstract-content-context.ts","../src/utils/thread-utilities.ts","../src/threads/tools/tools-context-worker.ts","../src/threads/tools/tools-context.ts","../src/threads/request/request-context.ts","../src/utils/process-abort-controller.ts","../src/threads/request/services/openai-request.ts","../src/services/thread-service-with-data.ts","../src/threads/request/response-handlers/abstract.ts","../src/threads/request/response-handlers/stream.ts","../src/threads/request/response-handlers/simple.ts","../src/threads/request/factories/response-handler.ts","../src/threads/content/simple/simple-content-context.ts","../src/threads/content/stream/stream-content-context.ts","../src/threads/content/stream/stream-content-context-worker.ts","../src/threads/content/stream/schemas/stream-chunk.ts","../src/threads/content/stream/services/stream-reducer.ts","../src/utils/validate-flow-sdk-version.ts","../src/step.ts","../src/threads/content/content-context-utilities.ts","../src/threads/cancel/cancel-context.ts"],"sourcesContent":["import { install } from 'source-map-support';\n\nimport { HistoryContext } from './threads/history/history-context.ts';\nimport { SimpleContentContext } from './threads/content/simple/simple-content-context.ts';\nimport { StreamContentContext } from './threads/content/stream/stream-content-context.ts';\nimport { StreamContentContextWorker } from './threads/content/stream/stream-content-context-worker.ts';\nimport { ToolsContext } from './threads/tools/tools-context.ts';\nimport { ToolsContextWorker } from './threads/tools/tools-context-worker.ts';\nimport { CancelContext } from './threads/cancel/cancel-context.ts';\nimport { RequestContext } from './threads/request/request-context.ts';\n\n// enable source map support for better error stack traces\ninstall();\n\nexport const states = {\n [HistoryContext.class]: HistoryContext,\n [RequestContext.class]: RequestContext,\n [ToolsContext.class]: ToolsContext,\n [ToolsContextWorker.class]: ToolsContextWorker,\n [SimpleContentContext.class]: SimpleContentContext,\n [StreamContentContext.class]: StreamContentContext,\n [StreamContentContextWorker.class]: StreamContentContextWorker,\n [CancelContext.class]: CancelContext,\n};\n\nexport { CreateChatCompletionStep as step } from './step.ts';\n","import Step from '@onereach/flow-sdk/step';\nimport { ErrorFilter } from '../decorators/error-filter.ts';\nimport { DataIn, dataInSchema } from '../schemas/data-in.ts';\nimport type { CONFIG } from '@onereach/flow-sdk/types/index.js';\n\n// TODO: convert it into class decorator\nexport class BaseStep<T extends BaseConfig> extends Step<T> {\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\nexport const baseClassIdPrefix = 'llm_cmp';\n\n// -------------- types ----------------\n\nexport interface BaseConfig extends CONFIG {\n dataIn: DataIn;\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): MethodDecoratorWithOptionalArguments<A, T> {\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\nexport type MethodDecoratorWithOptionalArguments<A, T extends AnyFunction = AnyFunction> =\n // Plain method decorator (three arguments)\n ((\n target: object,\n propertyKey: string | symbol,\n descriptor: TypedPropertyDescriptor<T>,\n ) => TypedPropertyDescriptor<T> | void) &\n // Decorator factory (optional options argument)\n ((options?: A) => MethodDecorator);\n","import TimeoutError from '@onereach/flow-sdk/errors/timeout.js';\nimport { z } from 'zod/v4-mini';\n\nimport { CreateChatCompletionStepError, ErrorCode } from './step-error.ts';\n\nconst defaultPreserveErrors = [CreateChatCompletionStepError, TimeoutError] as const;\nexport function errorFilter<P extends readonly AnyErrorClass[] = typeof defaultPreserveErrors>(\n error: unknown,\n options: ErrorFilterOptions<P> = {},\n): InstancesOf<P> | CreateChatCompletionStepError | TimeoutError {\n const {\n preserveErrors = defaultPreserveErrors,\n unknownMessage = 'Unknown error',\n unknownCode = ErrorCode.UNKNOWN,\n } = options;\n\n // if error is CreateChatCompletionStepError or TimeoutError, return it directly\n if (preserveErrors?.some((ErrorClass) => error instanceof ErrorClass)) {\n return error as InstancesOf<P>;\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 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 // 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 return new CreateChatCompletionStepError(unknownMessage, error, {\n code: unknownCode,\n });\n }\n\n // catch all for unknown errors\n return new CreateChatCompletionStepError(unknownMessage, {\n code: unknownCode,\n data: error,\n });\n}\n\nexport type ErrorFilterOptions<P extends readonly AnyErrorClass[]> = {\n /** Array of error classes that should not be wrapped */\n preserveErrors?: P;\n /** Error message to use when message is unknown */\n unknownMessage?: string;\n /** Error code to use when message is unknown */\n unknownCode?: keyof typeof ErrorCode;\n};\n\n/** Any Error class */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type AnyErrorClass<E extends Error = Error> = new (...arguments_: any[]) => E;\n\n/** Turn a tuple/array of constructors into a union of their instance types. */\nexport type InstancesOf<Ctors extends readonly AnyErrorClass[]> =\n Ctors[number] extends AnyErrorClass<infer I> ? I : never;\n","import BaseError from '@onereach/flow-sdk/errors/base.js';\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 } from '../utils/create-method-decorator.ts';\nimport { errorFilter } from '../errors/error-filter.ts';\nimport type Step from '@onereach/flow-sdk/step';\n\nconst defaultOptions = {};\n\n/**\n * Will wrap method with `errorFilter` for every error.\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: unknown) => {\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","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 { ACTION } from '@onereach/flow-sdk/types/index.js';\nimport { createMethodDecoratorWithOptionalArguments } from '../utils/create-method-decorator.ts';\nimport { errorFilter } from '../errors/error-filter.ts';\nimport type Step from '@onereach/flow-sdk/step';\n\nconst defaultOptions: BackgroundThreadErrorFilterOptions = { allowHandleError: false, 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.allowHandleError - Default `false`. 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 BackgroundThreadErrorFilter = 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(\n this: Step,\n options: BackgroundThreadErrorFilterOptions,\n error: unknown,\n propertyKey: string | symbol,\n): 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 BackgroundThreadErrorFilterOptions = {\n allowHandleError?: boolean;\n useErrorFilter?: boolean;\n};\n","/* eslint-disable @typescript-eslint/unbound-method */\n\nimport { baseClassIdPrefix, BaseConfig, BaseStep } from '../base.ts';\nimport { BackgroundThreadErrorFilter } from '../../decorators/background-thread-error-filter.ts';\n\nimport type { CONFIG, IThreadId, IEvent, IThread, IStepId } from '@onereach/flow-sdk/types/index.js';\nimport type { ChatCompletionMessageParam } from 'openai/resources.js';\nimport type { ChatCompletionConfig } from '../../step.ts';\n\nexport class HistoryContext extends BaseStep<HistoryContextConfig> {\n public static readonly class = 'hst_ctrl';\n\n public static async start(thread: IThread<ChatCompletionConfig>): Promise<void> {\n const historyThreadId = this.getThreadId(thread.step.id);\n const historyThread = thread.process.getThread<HistoryContextConfig>(historyThreadId);\n\n if (historyThread != undefined) return; // thread already exists\n\n // create tools context thread\n await thread.process.runThread<HistoryContextConfig>({\n id: historyThreadId,\n background: true,\n state: {\n step: thread.step.id,\n class: this.class,\n\n messages: [],\n },\n });\n }\n\n public static async prepareHistory<T extends ChatCompletionConfig>(thread: IThread<T>): Promise<void> {\n await thread.process.enqueueAndRun<EventName['prepareHistory']>({\n thread: this.getThreadId(thread.step.id),\n name: events.prepareHistory,\n });\n }\n\n public static async appendToHistory<T extends ChatCompletionConfig>(\n thread: IThread<T>,\n message: ChatCompletionMessageParam | ChatCompletionMessageParam[],\n ): Promise<void> {\n await thread.process.enqueueAndRun<EventName['appendToHistory'], HistoryContextAppendParameters>({\n thread: this.getThreadId(thread.step.id),\n name: events.appendToHistory,\n params: { message },\n });\n }\n\n public static async adjustOnCancel<T extends ChatCompletionConfig>(thread: IThread<T>): Promise<void> {\n await thread.process.enqueueAndRun<EventName['adjustOnCancel']>({\n thread: this.getThreadId(thread.step.id),\n name: events.adjustOnCancel,\n });\n }\n\n public static getHistory<T extends CONFIG>(thread: IThread<T>): ChatCompletionMessageParam[] {\n return thread.process.getSafeThread<HistoryContextConfig>(this.getThreadId(thread.step.id)).state.messages;\n }\n\n public static getThreadId(stepId: IStepId): IThreadId {\n return `${baseClassIdPrefix}_${this.class}_${stepId}`;\n }\n\n // ---------------------------------------\n\n @BackgroundThreadErrorFilter\n public runStep(): void {\n this.triggers\n .local(events.prepareHistory, this.onPrepareHistory)\n .local(events.appendToHistory, this.onAppendToHistory)\n .local(events.adjustOnCancel, this.onAdjustOnCancel)\n .otherwise(this.initialize);\n }\n\n @BackgroundThreadErrorFilter\n public initialize(): void {\n this.log.DEBUG?.(`Initializing ${HistoryContext.name} thread`);\n }\n\n @BackgroundThreadErrorFilter\n public onAdjustOnCancel(): void {\n let message;\n while ((message = this.state.messages.at(-1))) {\n if (['system', 'user'].includes(message.role)) break;\n if (message.role === 'assistant' && message.tool_calls == undefined) break;\n\n const removedMessage = this.state.messages.pop();\n this.log.DEBUG?.('Removed message from history', removedMessage);\n }\n }\n\n @BackgroundThreadErrorFilter\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 @BackgroundThreadErrorFilter\n public onAppendToHistory(event: HistoryContextEventAppendToHistory): 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 adjustOnCancel: 'hst_cncl',\n} as const;\nexport type EventName = typeof events;\n\nexport type HistoryContextAppendParameters = {\n message: ChatCompletionMessageParam | ChatCompletionMessageParam[];\n};\nexport type HistoryContextEventAppendToHistory = IEvent<HistoryContextAppendParameters, EventName['appendToHistory']>;\nexport type HistoryContextEventPrepareHistory = IEvent<unknown, EventName['prepareHistory']>;\nexport type HistoryContextEventAdjustOnCancel = IEvent<unknown, EventName['adjustOnCancel']>;\nexport type HistoryContextEvent =\n | HistoryContextEventAppendToHistory\n | HistoryContextEventPrepareHistory\n | HistoryContextEventAdjustOnCancel;\n\nexport type HistoryContextState = {\n class: typeof HistoryContext.class;\n\n /** messages to send to OpenAI API */\n messages: ChatCompletionMessageParam[];\n};\n\nexport interface HistoryContextConfig extends BaseConfig {\n state: HistoryContextState;\n events: HistoryContextEvent;\n}\n","/* eslint-disable @typescript-eslint/unbound-method */\n\nimport { setImmediate } from 'node:timers/promises';\nimport { clear, Memoize } from 'typescript-memoize';\nimport { BaseStep } from '../base.ts';\nimport { ToolsContext } from '../tools/tools-context.ts';\nimport { ACTION } from '@onereach/flow-sdk/types/index.js';\nimport { BackgroundThreadErrorFilter } from '../../decorators/background-thread-error-filter.ts';\nimport { CreateChatCompletionStepError, ErrorCode } from '../../errors/step-error.ts';\nimport { errorFilter } from '../../errors/error-filter.ts';\nimport { RequestContext } from '../request/request-context.ts';\n\nimport type { IActionEvent, IEvent, RESULT, STATE } from '@onereach/flow-sdk/types/index.js';\nimport type {\n ChatCompletion,\n ChatCompletionChunk,\n ChatCompletionMessageFunctionToolCall,\n ChatCompletionToolMessageParam,\n} from 'openai/resources.js';\nimport type { ToolsContextConfig } from '../tools/tools-context.ts';\nimport type { BaseChildResultCancel, BaseChildConfig } from '../base-child.ts';\nimport type { RequestContextConfig } from '../request/request-context.ts';\n\nconst memoizeTag = ['toolsInit'];\n\nexport abstract class AbstractContentContext<T extends ContentContextConfig> extends BaseStep<T> {\n public static get class(): string {\n throw new Error('Define \"class\" static field');\n }\n\n public static getInitialState<T extends ContentContextConfig>(): STATE<T> {\n throw new Error('Define \"getInitialState\" static method');\n }\n\n // ----------------------------------------------\n\n @BackgroundThreadErrorFilter\n public runStep(): void | Promise<void> {\n // reset init of tools thread on a fresh start\n clear(memoizeTag);\n\n // TODO: add hook for end of ToolsContext thread\n this.triggers\n .local(contentContextEvents.handleContent, this.onHandleContent)\n .hook<RequestContextConfig, ACTION.end>(\n { name: ACTION.end, thread: RequestContext.getThreadId(this.thread.step.id) },\n this.onRequestContextEnd,\n )\n .otherwise(this.initialize);\n }\n\n @BackgroundThreadErrorFilter\n public initialize() {\n this.log.DEBUG?.(`Initializing ${this.constructor.name} thread`);\n\n void RequestContext.start(this.thread);\n }\n\n public abstract onHandleContent(event: ContentContextHandleContentEvent): void | Promise<void>;\n protected abstract onAllContentReceived(): void | Promise<void>;\n protected abstract tryToComplete(): void | Promise<void>;\n\n @BackgroundThreadErrorFilter\n public async onRequestContextEnd(event: IActionEvent<RequestContextConfig, ACTION.end>): Promise<void> {\n const { result } = event.params.thread;\n this.log.DEBUG?.(`${RequestContext.name} thread ended with result`, result);\n\n if (result == undefined) {\n throw new CreateChatCompletionStepError(`${RequestContext.name} thread ended unexpectedly`, {\n code: ErrorCode.STEP_LOGIC_ISSUE,\n });\n }\n\n if (result instanceof Error) {\n const resultError = errorFilter(result, {\n unknownMessage: `${RequestContext.name} thread ended with an error`,\n unknownCode: ErrorCode.STEP_LOGIC_ISSUE,\n });\n throw resultError;\n }\n\n // TODO: figure out better way to check for correct structure of the event (zod?)\n\n // do nothing on cancel\n if (result.status === 'cancel') return this.cancel();\n\n if (result.status !== 'ok') {\n throw new CreateChatCompletionStepError(`Unexpected end of the ${RequestContext.name} thread`, {\n code: ErrorCode.STEP_LOGIC_ISSUE,\n data: event.params.result,\n });\n }\n\n this.state.requestComplete = true;\n await this.onAllContentReceived();\n\n if (this.state.toolsReady != undefined) {\n await setImmediate();\n // notify ToolsContext no more tool calls will be made\n await ToolsContext.lastToolCallReceived(this.thread);\n }\n\n await this.tryToComplete();\n }\n\n @BackgroundThreadErrorFilter\n public async onToolsContextEnd(event: IActionEvent<ToolsContextConfig, ACTION.end>): Promise<void> {\n const { result } = event.params.thread;\n\n this.log.DEBUG?.(`${ToolsContext.name} thread ended`, result);\n\n if (result == undefined) {\n throw new CreateChatCompletionStepError(`${ToolsContext.name} thread ended unexpectedly`, {\n code: ErrorCode.STEP_LOGIC_ISSUE,\n });\n }\n\n if (result instanceof Error) {\n const resultError = errorFilter(result, {\n unknownMessage: `${ToolsContext.name} thread ended with an error`,\n unknownCode: ErrorCode.STEP_LOGIC_ISSUE,\n });\n throw resultError;\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 ${ToolsContext.name} 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.tryToComplete();\n }\n\n protected async callFunction(toolCall: ChatCompletionMessageFunctionToolCall) {\n // wait for ToolController needed\n this.state.toolsReady = false;\n await this.initToolsContextThread();\n await ToolsContext.callTool(this.thread, toolCall);\n }\n\n protected handleMultipleChoices(): void {\n const { chatCompletion } = this.state;\n\n const choices = chatCompletion?.choices ?? [];\n if (choices?.length > 1) {\n this.log.WARN?.('Multiple choices received from LLM, but only the first one will be processed', {\n choices: choices.length,\n });\n }\n }\n\n @Memoize({ tags: memoizeTag })\n protected async initToolsContextThread() {\n // wait for the end of ToolsContext thread\n this.triggers.hook<ToolsContextConfig, ACTION.end>(\n { name: ACTION.end, thread: ToolsContext.getThreadId(this.thread.step.id) },\n this.onToolsContextEnd,\n );\n\n await ToolsContext.start(this.thread);\n }\n\n protected cancel(): void {\n this.end({ status: 'cancel' } satisfies ContentContextResult as BaseChildResultCancel);\n }\n\n protected complete() {\n const { chatCompletion } = this.state;\n\n // TODO: add validation for ChatCompletion structure\n if (chatCompletion == undefined) {\n throw new CreateChatCompletionStepError('Missing chat completion content to return value', {\n code: ErrorCode.STEP_LOGIC_ISSUE,\n });\n }\n\n this.end({\n status: 'ok',\n chatCompletion,\n toolsResults: this.state.toolsResults ?? [],\n } satisfies ContentContextResult as ContentContextOkResult);\n }\n}\n\n// --------------------- types ---------------------------\n\nexport const contentContextEvents = {\n handleContent: 'hnd_cnt',\n} as const;\nexport type ContentContentEventName = typeof contentContextEvents;\n\nexport type ContentContextHandleContentEvent = IEvent<\n { content: ChatCompletionChunk | ChatCompletion },\n ContentContentEventName['handleContent']\n>;\n\nexport type ContentContextEvent = ContentContextHandleContentEvent;\n\nexport type ContentContextState = {\n requestComplete: boolean;\n chatCompletion?: ChatCompletion;\n /**\n * Are tool calls ready?\n * - `undefined` - no tools to wait for\n * - `false` - tools are processing\n * - `true` - tools finished processing\n */\n toolsReady?: boolean;\n toolsResults?: ChatCompletionToolMessageParam[];\n};\n\nexport type ContentContextOkResult = {\n status: 'ok';\n chatCompletion: ChatCompletion;\n toolsResults: ChatCompletionToolMessageParam[];\n};\nexport type ContentContextResult = ContentContextOkResult | RESULT<BaseChildConfig>;\n\nexport interface ContentContextConfig extends BaseChildConfig<ContentContextResult> {\n state: ContentContextState;\n result: ContentContextResult;\n events: ContentContextEvent;\n}\n","import { ACTION } from '@onereach/flow-sdk/types/index.js';\nimport type { CONFIG, IThread, IThreadId, IThreadOptions, RESULT } from '@onereach/flow-sdk/types/index.js';\nimport type Step from '@onereach/flow-sdk/step';\n\n/**\n * Runs a new thread or reuses an existing one (if it ended).\n * @param thread 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 runChildThread<ThreadConfig extends CONFIG & ManagedThreadConfig, StepConfig extends CONFIG>(\n thread: Step<StepConfig> | IThread<StepConfig>, // TODO: remove Step type after migration\n { id, state, local, ...options }: IThreadOptions<ThreadConfig>,\n { force }: { force?: boolean } = {},\n): Promise<RESULT<ThreadConfig>> {\n const threadToRun = thread.process.getThread<ThreadConfig>(id);\n thread.log.DEBUG?.(`runThread: thread with id '${id}'`, options);\n\n if (threadToRun == undefined) {\n // create thread\n return await thread.thread.runThread<ThreadConfig>({\n ...options,\n id,\n state,\n local: {\n ...local,\n parent: thread.thread.id,\n active: true,\n },\n });\n } else {\n if (!force && !threadToRun.ended && threadToRun.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 threadToRun.local.active = true;\n return await threadToRun.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 thread: Step<StepConfig> | IThread<StepConfig>, // TODO: remove Step after migration\n threadId: IThreadId,\n): boolean {\n const threadToCheck = thread.process.getThread<ThreadConfig>(threadId);\n return Boolean(threadToCheck != undefined && threadToCheck.local.active && !threadToCheck.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 thread: Step<StepConfig> | IThread<StepConfig>, // TODO: remove Step after migration\n id: IThreadId,\n { result, stopChildThreads }: { result?: RESULT<ThreadConfig>; stopChildThreads?: boolean } = {},\n): Promise<void> {\n const threadToStop = thread.process.getThread<ThreadConfig>(id);\n thread.log.DEBUG?.(`stopThread: thread with id '${id}'`);\n\n if (!threadToStop) return;\n\n if (stopChildThreads) await endChildThreads(threadToStop, result);\n\n if (!threadToStop.local.active) return;\n\n threadToStop.local.active = false;\n if (threadToStop.ended) return;\n\n await threadToStop.enqueueAndRun({ name: ACTION.ending, result });\n}\n\nexport async function endChildThreads<ThreadConfig extends CONFIG, StepConfig extends CONFIG>(\n thread: IThread<StepConfig>,\n result?: RESULT<ThreadConfig>,\n options: { throw?: boolean } = {},\n): Promise<PromiseSettledResult<void>[]> {\n const childThreads = listChildThreads(thread);\n const stopTasks = childThreads.map(\n async (child) => await stopThread(thread, child.id, { stopChildThreads: true, result }),\n );\n const stopResults = await Promise.allSettled(stopTasks);\n\n const throwError = options.throw ?? true;\n if (throwError) {\n const failedTask = stopResults.find((task) => task.status === 'rejected');\n if (failedTask) throw failedTask.reason;\n }\n\n return stopResults;\n}\n\nexport type ManagedThreadLocal = {\n active: boolean;\n parent: IThreadId;\n};\n\nexport type ManagedThreadConfig = {\n local: ManagedThreadLocal;\n};\n","import { baseClassIdPrefix, BaseStep } from '../base.ts';\nimport { ErrorFilter } from '../../decorators/error-filter.ts';\nimport { runChildThread } from '../../utils/thread-utilities.ts';\n\nimport type { IThread, IThreadId, LOCAL, RESULT } from '@onereach/flow-sdk/types/index.js';\nimport type { ChatCompletionMessageFunctionToolCall } from 'openai/resources.js';\nimport type { ToolsContextConfig } from './tools-context.ts';\nimport type { BaseChildConfig } from '../base-child.ts';\n\nexport class ToolsContextWorker extends BaseStep<ToolsContextWorkerConfig> {\n public static readonly class = 'tl_wrk';\n\n public static async start(\n thread: IThread<ToolsContextConfig>,\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 ParsedArguments;\n\n await runChildThread<ToolsContextWorkerConfig, ToolsContextConfig>(thread, {\n id: this.getThreadId(toolCall),\n state: {\n step: thread.step.id,\n class: this.class,\n },\n local: {\n toolCall,\n parsedArguments,\n\n // TODO: figure out how to remove these params without breaking typing\n parent: thread.id,\n active: true,\n },\n });\n }\n\n public static getThreadId(toolCall: ChatCompletionMessageFunctionToolCall): IThreadId {\n return `${baseClassIdPrefix}_${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;\n\n this.log.DEBUG?.('Initializing tool worker thread', toolCall);\n this.exitStep(this.getExitName(/*toolCall*/), {\n function: {\n name: toolCall.function.name,\n arguments: parsedArguments, // use parsed arguments\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 = Record<string, unknown>;\nexport type ToolsContextWorkerMergeField = {\n function: {\n name: string;\n arguments: ParsedArguments;\n };\n};\n\nexport type ToolsContextWorkerOut = ToolsContextWorkerMergeField;\n\nexport type ToolsContextWorkerState = {\n class: typeof ToolsContextWorker.class;\n};\n\nexport type ToolsContextWorkerLocal = {\n toolCall: ChatCompletionMessageFunctionToolCall;\n parsedArguments: ParsedArguments;\n} & LOCAL<BaseChildConfig>;\n\nexport type ThreadWorkerResultOk = {\n status: 'ok';\n\n /** id of the tool call that was processed */\n toolCallId: string;\n\n /** result of the tool call */\n data: unknown;\n};\nexport type ThreadWorkerResult = ThreadWorkerResultOk | RESULT<BaseChildConfig>;\n\nexport interface ToolsContextWorkerConfig extends BaseChildConfig<ThreadWorkerResult, ToolsContextWorkerLocal> {\n dataOut: ToolsContextWorkerOut;\n state: ToolsContextWorkerState;\n}\n","/* eslint-disable @typescript-eslint/unbound-method */\n\nimport { baseClassIdPrefix, BaseStep } from '../base.ts';\nimport { BackgroundThreadErrorFilter } from '../../decorators/background-thread-error-filter.ts';\nimport { CreateChatCompletionStepError, ErrorCode } from '../../errors/step-error.ts';\nimport { ToolsContextWorker, ToolsContextWorkerConfig } from './tools-context-worker.ts';\nimport { runChildThread } from '../../utils/thread-utilities.ts';\nimport { ACTION } from '@onereach/flow-sdk/types/index.js';\nimport { errorFilter } from '../../errors/error-filter.ts';\n\nimport type { IActionEvent, IEvent, IStepId, IThread, IThreadId, RESULT } from '@onereach/flow-sdk/types/index.js';\nimport type { ChatCompletionMessageFunctionToolCall, ChatCompletionToolMessageParam } from 'openai/resources.js';\nimport type { ContentContextConfig } from '../content/abstract-content-context.ts';\nimport type { BaseChildConfig } from '../base-child.ts';\n\nexport class ToolsContext extends BaseStep<ToolsContextConfig> {\n public static readonly class = 'tl_ctrl';\n\n public static async start<T extends ContentContextConfig>(thread: IThread<T>): Promise<void> {\n const threadId = this.getThreadId(thread.step.id);\n await runChildThread<ToolsContextConfig, T>(thread, {\n id: threadId,\n state: {\n step: thread.step.id,\n class: this.class,\n\n /** tool calls from LLM response */\n tasks: {},\n\n /** flag to indicate if there are more tasks to process */\n expectMoreTasks: true,\n },\n background: true,\n });\n }\n\n public static async callTool<T extends ContentContextConfig>(\n thread: IThread<T>,\n toolCall: ChatCompletionMessageFunctionToolCall,\n ): Promise<void> {\n await thread.process.enqueueAndRun<EventName['callTool'], CallToolParameters>({\n thread: this.getThreadId(thread.step.id),\n name: EventName.callTool,\n params: { toolCall },\n });\n }\n\n /**\n * Notify tools context thread that no more tool calls are expected\n */\n public static async lastToolCallReceived<T extends ContentContextConfig>(thread: IThread<T>): Promise<void> {\n await thread.process.enqueueAndRun<EventName['lastToolCallReceived']>({\n thread: this.getThreadId(thread.step.id),\n name: EventName.lastToolCallReceived,\n });\n }\n\n public static getThreadId(stepId: IStepId): IThreadId {\n return `${baseClassIdPrefix}_${this.class}_${stepId}`;\n }\n\n // ---------------------------------------\n\n @BackgroundThreadErrorFilter\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 @BackgroundThreadErrorFilter\n public initialize(): void {\n this.log.DEBUG?.(`Initializing ${ToolsContext.name} thread`);\n }\n\n @BackgroundThreadErrorFilter\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 @BackgroundThreadErrorFilter\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.tryEndToolsContextThread();\n }\n\n @BackgroundThreadErrorFilter\n public onWorkerThreadEnd(event: IActionEvent<ToolsContextWorkerConfig, ACTION.end>): void {\n this.log.DEBUG?.('Tool caller worker thread has ended', event);\n\n const { result } = event.params.thread;\n\n if (result == undefined) {\n throw new CreateChatCompletionStepError(`${ToolsContextWorker.name} thread ended unexpectedly`, {\n code: ErrorCode.STEP_LOGIC_ISSUE,\n });\n }\n\n if (result instanceof Error) {\n const resultError = errorFilter(result, {\n unknownMessage: `${ToolsContextWorker.name} thread ended with an error`,\n unknownCode: ErrorCode.STEP_LOGIC_ISSUE,\n });\n throw resultError;\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.tryEndToolsContextThread();\n }\n\n /**\n * Starts the tool worker thread to process the tool call.\n */\n protected startToolWorkerThread(toolCall: ChatCompletionMessageFunctionToolCall): void {\n this.triggers.hook<ToolsContextWorkerConfig, ACTION.end>(\n { name: ACTION.end, thread: ToolsContextWorker.getThreadId(toolCall) },\n this.onWorkerThreadEnd,\n );\n\n void ToolsContextWorker.start(this.thread, toolCall);\n }\n\n protected setToolCallResult(toolCallId: string, result: unknown): 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 tryEndToolsContextThread(): 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\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 = {\n status: 'pending' | 'completed' | 'failed';\n call: ChatCompletionMessageFunctionToolCall;\n\n /** result of the tool call, if completed */\n result?: unknown;\n};\nexport type TasksMap = Record<ChatCompletionMessageFunctionToolCall['id'], ToolCallTask>;\n\nexport type ToolsContextResultOk = {\n status: 'ok';\n messages: ChatCompletionToolMessageParam[]; // messages to be sent to the LLM\n};\nexport type ToolsContextResult = ToolsContextResultOk | RESULT<BaseChildConfig>;\n\nexport type CallToolParameters = {\n toolCall: ChatCompletionMessageFunctionToolCall;\n};\n\nexport type ToolsContextEvent =\n | IEvent<CallToolParameters, EventName['callTool']>\n | IEvent<unknown, EventName['lastToolCallReceived']>;\n\nexport type ToolsContextState = {\n class: typeof ToolsContext.class;\n\n /** tool calls from LLM response */\n tasks: TasksMap;\n\n /** flag to indicate if there are more tasks to process */\n expectMoreTasks: boolean;\n};\n\nexport interface ToolsContextConfig extends BaseChildConfig<ToolsContextResult> {\n state: ToolsContextState;\n events: ToolsContextEvent;\n}\n","import { clear, Memoize } from 'typescript-memoize';\nimport { baseClassIdPrefix, BaseStep } from '../base.ts';\nimport { runChildThread } from '../../utils/thread-utilities.ts';\nimport { createAbortController, deleteAbortController } from '../../utils/process-abort-controller.ts';\nimport { OpenAIRequestService } from './services/openai-request.ts';\nimport { HistoryContext } from '../history/history-context.ts';\nimport { responseHandlerFactory } from './factories/response-handler.ts';\nimport { BackgroundThreadErrorFilter } from '../../decorators/background-thread-error-filter.ts';\n\nimport type { IStepId, IThread, IThreadId, RESULT } from '@onereach/flow-sdk/types/index.js';\nimport type { ChatCompletionMessageParam } from 'openai/resources.js';\nimport type { AbstractResponseHandler } from './response-handlers/abstract.ts';\nimport type { BaseChildConfig } from '../base-child.ts';\nimport type { ContentContextConfig } from '../content/abstract-content-context.ts';\n\nconst memoizeTag = ['requestInit'];\n\nexport class RequestContext extends BaseStep<RequestContextConfig> {\n public static readonly class = 'rqst_ctx';\n\n public static async start<T extends ContentContextConfig>(thread: IThread<T>): Promise<RequestContextResult> {\n return await runChildThread<RequestContextConfig, T>(thread, {\n id: this.getThreadId(thread.step.id),\n state: {\n step: thread.step.id,\n class: this.class,\n },\n background: true,\n });\n }\n\n public static getThreadId(stepId: IStepId): IThreadId {\n return `${baseClassIdPrefix}_${this.class}_${stepId}`;\n }\n\n // ---------------------------------------\n\n @BackgroundThreadErrorFilter\n public async runStep(): Promise<void> {\n clear(memoizeTag);\n const abortController = createAbortController({ thread: this.thread });\n try {\n const response = await this.openAiService.makeOpenAiRequest(this.history, abortController.signal);\n await this.responseHandler.handle(response);\n this.complete();\n } catch (error) {\n if (abortController?.signal.aborted) return this.cancel();\n throw error;\n } finally {\n deleteAbortController({ thread: this.thread });\n }\n }\n\n private cancel() {\n this.end({ status: 'cancel' });\n }\n\n private complete() {\n this.end({ status: 'ok' });\n }\n\n private get history(): ChatCompletionMessageParam[] {\n return HistoryContext.getHistory(this.thread);\n }\n\n @Memoize()\n private get openAiService(): OpenAIRequestService {\n return new OpenAIRequestService(this.thread, this.data);\n }\n\n @Memoize({ tags: memoizeTag })\n private get responseHandler(): AbstractResponseHandler {\n const isStreaming = this.data.streamResponse;\n return responseHandlerFactory({\n thread: this.thread,\n isStreaming,\n });\n }\n}\n\n// ----------------- TYPES -----------------\n\nexport type RequestContextState = {\n class: typeof RequestContext.class;\n};\n\nexport type RequestContextResultOk = { status: 'ok' };\nexport type RequestContextResult = RequestContextResultOk | RESULT<BaseChildConfig>;\n\nexport interface RequestContextConfig extends BaseChildConfig<RequestContextResult> {\n state: RequestContextState;\n result: RequestContextResult;\n}\n","import type { CONFIG, IThread } from '@onereach/flow-sdk/types/index.js';\n\n/**\n * Create an AbortController in process cache.\n * It will be available during flow execution, but will disappear in the end of execution\n *\n * @throws If controller already exists will throw an error.\n */\nexport function createAbortController<T extends CONFIG>({\n thread,\n ...options\n}: AbortControllerParameters<T>): AbortController {\n const cacheKey = getAbortControllerKey({ thread, ...options });\n const process = thread.process;\n\n if (process.cache[cacheKey] != undefined) throw new Error(`AbortController for key '${cacheKey}' already exists`);\n\n return (process.cache[cacheKey] = new AbortController());\n}\n\n/**\n * Get instance of AbortController from process cache\n */\nexport function getAbortController<T extends CONFIG>({\n thread,\n ...options\n}: AbortControllerParameters<T>): AbortController | undefined {\n const cacheKey = getAbortControllerKey({ thread, ...options });\n return thread.process.cache[cacheKey] as AbortController | undefined;\n}\n\n/**\n * Remove instance of AbortController from the cache\n *\n * If it does not exists, will not throw an error\n */\nexport function deleteAbortController<T extends CONFIG>({ thread, ...options }: AbortControllerParameters<T>): void {\n const cacheKey = getAbortControllerKey({ thread, ...options });\n delete thread.process.cache[cacheKey];\n}\n\nexport function getAbortControllerKey<T extends CONFIG>({\n thread,\n prefix,\n stepId = thread.currentStepId,\n}: AbortControllerParameters<T>): string {\n const normalizedPrefix = prefix ? `${prefix}:` : '';\n return `${normalizedPrefix}abrt_ctrl:${stepId}`;\n}\n\nexport type AbortControllerParameters<T extends CONFIG> = {\n /** thread to access flow process */\n thread: IThread<T>;\n\n /** Optional step id to use for unique name. If not present will use `thread.currentStepId` */\n stepId?: string;\n\n /** Optional prefix in name if you need to create several controllers */\n prefix?: string;\n};\n","import OpenAI from 'openai';\nimport timestring from 'timestring';\nimport { z } from 'zod/v4-mini';\nimport { Memoize } from 'typescript-memoize';\n\nimport type { Stream } from 'openai/core/streaming.js';\nimport type {\n ChatCompletion,\n ChatCompletionChunk,\n ChatCompletionMessageParam,\n ChatCompletionTool,\n} from 'openai/resources.js';\nimport { CreateChatCompletionStepError, ErrorCode } from '../../../errors/step-error.ts';\nimport { ThreadServiceWithData } from '../../../services/thread-service-with-data.ts';\nimport { RequestContextConfig } from '../request-context.ts';\n\nexport class OpenAIRequestService extends ThreadServiceWithData<RequestContextConfig> {\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 === false) 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 BasicThreadService from '@onereach/flow-sdk/services/basic.js';\nimport type { CONFIG, IN, IThread } from '@onereach/flow-sdk/types/index.js';\n\nexport class ThreadServiceWithData<\n TConfig extends CONFIG,\n TData extends IN<CONFIG> = IN<TConfig>,\n> extends BasicThreadService<TConfig> {\n protected readonly data: TData;\n\n constructor(thread: IThread<TConfig>, data: TData) {\n super(thread);\n this.data = data;\n }\n}\n","import { setImmediate } from 'node:timers/promises';\nimport BasicThreadService from '@onereach/flow-sdk/services/basic.js';\nimport { contentContextEvents } from '../../content/abstract-content-context.ts';\nimport type { Stream } from 'openai/core/streaming.js';\nimport type { ChatCompletion, ChatCompletionChunk } from 'openai/resources/index.js';\nimport type { RequestContextConfig } from '../request-context.ts';\n\nexport abstract class AbstractResponseHandler extends BasicThreadService<RequestContextConfig> {\n public abstract handle(response: ChatCompletion | Stream<ChatCompletionChunk>): Promise<void>;\n\n protected async handleContentByParentThread(content: ChatCompletion | ChatCompletionChunk): Promise<void> {\n await setImmediate();\n await this.thread.process.enqueueAndRun({\n thread: this.thread.local.parent,\n name: contentContextEvents.handleContent,\n params: { content },\n });\n }\n}\n","import { AbstractResponseHandler } from './abstract.ts';\nimport { deleteAbortController } from '../../../utils/process-abort-controller.ts';\n\nimport type { ChatCompletionChunk } from 'openai/resources.js';\nimport type { Stream } from 'openai/core/streaming.js';\n\nexport class StreamResponseHandler extends AbstractResponseHandler {\n public async handle(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 this.handleContentByParentThread(chunk);\n }\n\n deleteAbortController({ thread: this.thread });\n }\n}\n","import { AbstractResponseHandler } from './abstract.ts';\nimport { deleteAbortController } from '../../../utils/process-abort-controller.ts';\n\nimport type { ChatCompletion } from 'openai/resources.js';\n\nexport class SimpleResponseHandler extends AbstractResponseHandler {\n public async handle(response: ChatCompletion): Promise<void> {\n this.log.DEBUG?.('Start processing response from LLM');\n await this.handleContentByParentThread(response);\n deleteAbortController({ thread: this.thread });\n }\n}\n","import { StreamResponseHandler } from '../response-handlers/stream.ts';\nimport { SimpleResponseHandler } from '../response-handlers/simple.ts';\n\nimport type { IThread } from '@onereach/flow-sdk/types/index.js';\nimport type { RequestContextConfig } from '../request-context.ts';\nimport type { AbstractResponseHandler } from '../response-handlers/abstract.ts';\n\nexport function responseHandlerFactory({\n thread,\n isStreaming,\n}: ResponseHandlerFactoryParameters): AbstractResponseHandler {\n if (isStreaming) return new StreamResponseHandler(thread);\n return new SimpleResponseHandler(thread);\n}\n\nexport type ResponseHandlerFactoryParameters = {\n thread: IThread<RequestContextConfig>;\n isStreaming: boolean;\n};\n","import { AbstractContentContext } from '../abstract-content-context.ts';\nimport { BackgroundThreadErrorFilter } from '../../../decorators/background-thread-error-filter.ts';\n\nimport type { IEvent, STATE } from '@onereach/flow-sdk/types/index.js';\nimport type { ChatCompletion, ChatCompletionMessageFunctionToolCall } from 'openai/resources.js';\nimport type { ContentContentEventName, ContentContextConfig } from '../abstract-content-context.ts';\n\nexport class SimpleContentContext extends AbstractContentContext<SimpleContentContextConfig> {\n public static readonly class = 'cnt_cxt_smp';\n\n public static getInitialState(): STATE<SimpleContentContextConfig> {\n return {\n requestComplete: false,\n };\n }\n\n // ----------------------------------------------\n\n @BackgroundThreadErrorFilter\n public async onHandleContent(event: SimpleContentContextHandleContentEvent) {\n const { content } = event.params;\n\n this.state.chatCompletion = content;\n\n // Process tool calls if any\n const toolCalls = content.choices[0]?.message.tool_calls;\n if (toolCalls != undefined) {\n for (const toolCall of toolCalls) {\n // TODO: throw an error if tool call is not a function\n await this.callFunction(toolCall as ChatCompletionMessageFunctionToolCall);\n }\n }\n }\n\n @BackgroundThreadErrorFilter\n public onAllContentReceived() {\n this.handleMultipleChoices();\n }\n\n protected tryToComplete() {\n const { requestComplete, toolsReady } = this.state;\n\n // need to wait for request and tools to finish processing\n if (!requestComplete || toolsReady === false) return;\n\n this.complete();\n }\n}\n\n// -------------------- types ---------------------\n\nexport type SimpleContentContextHandleContentEvent = IEvent<\n { content: ChatCompletion },\n ContentContentEventName['handleContent']\n>;\nexport type SimpleContentContextEvent = SimpleContentContextHandleContentEvent;\n\nexport interface SimpleContentContextConfig extends ContentContextConfig {\n events: SimpleContentContextEvent;\n}\n","/* eslint-disable @typescript-eslint/unbound-method */\n\nimport { clear, Memoize } from 'typescript-memoize';\nimport { AbstractContentContext } from '../abstract-content-context.ts';\nimport { StreamContentContextWorker, StreamContentContextWorkerConfig } from './stream-content-context-worker.ts';\nimport { BackgroundThreadErrorFilter } from '../../../decorators/background-thread-error-filter.ts';\nimport { CreateChatCompletionStepError, ErrorCode } from '../../../errors/step-error.ts';\nimport { streamChunkEventSchema } from './schemas/stream-chunk.ts';\nimport { StreamReducerService } from './services/stream-reducer.ts';\nimport { ACTION } from '@onereach/flow-sdk/types/index.js';\nimport { errorFilter } from '../../../errors/error-filter.ts';\n\nimport type { IEvent, IActionEvent, STATE } from '@onereach/flow-sdk/types/index.js';\nimport type { ChatCompletion, ChatCompletionChunk, ChatCompletionMessageFunctionToolCall } from 'openai/resources.js';\nimport type {\n ContentContentEventName,\n ContentContextConfig,\n ContentContextState,\n} from '../abstract-content-context.ts';\n\nconst memoizeTag = ['streamInit'];\n\nexport class StreamContentContext extends AbstractContentContext<StreamContentContextConfig> {\n public static readonly class = 'cnt_cxt_str';\n\n public static getInitialState(): STATE<StreamContentContextConfig> {\n return {\n class: StreamContentContext.class,\n requestComplete: false,\n workerComplete: false,\n\n partialChatCompletion: {},\n events: [],\n lastChunkReceived: false,\n index: -1,\n };\n }\n\n // ---------------------------------------\n\n @BackgroundThreadErrorFilter\n public async runStep(): Promise<void> {\n await super.runStep();\n\n clear(memoizeTag);\n\n this.triggers.hook<StreamContentContextWorkerConfig, ACTION.end>(\n { name: ACTION.end, thread: StreamContentContextWorker.getThreadId(this.thread.step.id) },\n this.onWorkerThreadEnd,\n );\n }\n\n /**\n * Handler of the worker thread end event.\n */\n @BackgroundThreadErrorFilter\n public onWorkerThreadEnd(event: IActionEvent<StreamContentContextWorkerConfig, ACTION.end>): void {\n const { result } = event.params.thread;\n\n this.log.DEBUG?.(`${StreamContentContextWorker.name} thread finished processing chunk`, result);\n\n if (result instanceof Error) {\n const resultError = errorFilter(result, {\n unknownMessage: `${StreamContentContextWorker.name} thread ended with an error`,\n });\n throw resultError;\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 @BackgroundThreadErrorFilter\n public onHandleContent(event: StreamContentContextHandleContentEvent): void {\n const parsedEvent = streamChunkEventSchema.parse(event);\n const chunk = parsedEvent.params.content satisfies ChatCompletionChunk;\n\n const streamReducer = new StreamReducerService(this.state.partialChatCompletion, 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 // skip streaming additional choices (if n > 1)\n if (chunkChoice.index > 0) continue;\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 }\n\n /**\n * Handles the notification that all response chunks were received from the OpenAI API.\n */\n @BackgroundThreadErrorFilter\n protected onAllContentReceived(): void {\n this.log.DEBUG?.('All LLM response chunks were received. No more response chunks expected');\n\n // TODO: maybe validate that completionResult is correct?\n this.state.chatCompletion = this.state.partialChatCompletion as ChatCompletion;\n\n this.handleMultipleChoices();\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 content context thread state\n this.state.lastChunkReceived = true;\n\n // force processing of the top chunk in the content queue\n this.tryRunWorker();\n }\n\n private onToolCall(toolCall: ChatCompletionMessageFunctionToolCall): void {\n this.log.DEBUG?.('Tool call received', toolCall);\n void this.callFunction(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 private tryRunWorker(): void {\n // skip if worker thread is busy\n if (StreamContentContextWorker.isBusy(this.thread)) {\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 ContentContext thread with aggregated response\n this.log.DEBUG?.(\n `Stopping ${StreamContentContext.name} thread. All response content chunks were processed and no new chunks are coming`,\n );\n\n this.state.workerComplete = true;\n\n this.tryToComplete();\n return;\n }\n\n this.log.DEBUG?.('Notify stream worker thread about response chunk to process', event);\n\n void StreamContentContextWorker.start(this.thread, 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 protected tryToComplete(): void {\n const { chatCompletion, toolsReady, requestComplete, workerComplete } = this.state;\n if (!workerComplete || !requestComplete || toolsReady === false || chatCompletion == undefined) return;\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 this.complete();\n }\n\n @Memoize({ tags: memoizeTag })\n protected get maxChunkContentLength(): number {\n return this.data.streamSettings?.maxBufferLength ?? 100;\n }\n\n @Memoize({ tags: memoizeTag })\n protected get debounceDuration(): number {\n return this.data.streamSettings?.debounceDuration ?? 200;\n }\n}\n\n// -------------------- types ---------------------\n\nexport type StreamContentContextHandleContentEvent = IEvent<\n { content: ChatCompletionChunk },\n ContentContentEventName['handleContent']\n>;\nexport type StreamContentContextEvent = StreamContentContextHandleContentEvent;\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;\nexport type StreamContentContextState = Omit<ContentContextState, 'class'> & {\n class: typeof StreamContentContext.class;\n\n /** aggregated result of the LLM response */\n partialChatCompletion: Partial<ChatCompletion>;\n\n /** queue of response chunks */\n events: ContentEvent[];\n\n /** last index for a chunk to be processed by worker */\n index: number;\n\n /** marker for end of response stream */\n lastChunkReceived: boolean;\n\n /** When `true` means worker finished the processing the queue */\n workerComplete: boolean;\n};\n\nexport interface StreamContentContextConfig extends ContentContextConfig {\n events: StreamContentContextEvent;\n state: StreamContentContextState;\n}\n","import { baseClassIdPrefix, BaseStep } from '../../base.ts';\nimport { ErrorFilter } from '../../../decorators/error-filter.ts';\nimport { CreateChatCompletionStepError, ErrorCode } from '../../../errors/step-error.ts';\nimport { isThreadBusy, runChildThread } from '../../../utils/thread-utilities.ts';\n\nimport type { IStepId, IThread, IThreadId, RESULT } from '@onereach/flow-sdk/types/index.js';\nimport type { StreamContentContextConfig } from './stream-content-context.ts';\nimport type { BaseChildConfig } from '../../base-child.ts';\n\nexport class StreamContentContextWorker extends BaseStep<StreamContentContextWorkerConfig> {\n public static readonly class = 'str_wrk';\n\n public static async start(thread: IThread<StreamContentContextConfig>, event: ContentChunk): Promise<void> {\n await runChildThread<StreamContentContextWorkerConfig, StreamContentContextConfig>(thread, {\n id: this.getThreadId(thread.step.id),\n state: {\n step: thread.step.id,\n class: this.class,\n\n event,\n },\n });\n }\n\n public static isBusy(thread: IThread<StreamContentContextConfig>): boolean {\n return isThreadBusy<StreamContentContextConfig, StreamContentContextWorkerConfig>(\n thread,\n this.getThreadId(thread.step.id),\n );\n }\n\n public static getThreadId(stepId: IStepId): IThreadId {\n return `${baseClassIdPrefix}_${this.class}_${stepId}`;\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 StreamContentContextWorkerOut = {\n chunk: ContentChunk;\n};\n\nexport type StreamContentContextWorkerState = {\n class: typeof StreamContentContextWorker.class;\n\n event: ContentChunk;\n};\n\nexport type StreamContentContextWorkerResult = undefined | RESULT<BaseChildConfig>;\n\nexport interface StreamContentContextWorkerConfig extends BaseChildConfig<StreamContentContextWorkerResult> {\n dataOut: StreamContentContextWorkerOut;\n state: StreamContentContextWorkerState;\n}\n","import { z } from 'zod/v4-mini';\nimport { ChatCompletionChunk } from 'openai/resources.mjs';\n\nexport const streamChunkEventSchema = z.object({\n name: z.string(),\n params: z.object({\n content: 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});\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.js';\nimport { ParsedArguments } from '../../../tools/tools-context-worker.ts';\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 if (content === null) {\n // eslint-disable-next-line unicorn/no-null\n existing.message.content ??= null;\n } else {\n existing.message.content ??= '';\n existing.message.content += content;\n }\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","import { createRequire } from 'node:module';\nimport { readFile } from 'node:fs/promises';\n\nconst require = createRequire(import.meta.url);\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","/* eslint-disable @typescript-eslint/unbound-method */\n\nimport { BaseConfig, BaseStep } from './threads/base.ts';\nimport { HistoryContext, HistoryContextConfig } from './threads/history/history-context.ts';\nimport { ErrorFilter } from './decorators/error-filter.ts';\nimport { BackgroundThreadErrorFilter } from './decorators/background-thread-error-filter.ts';\nimport { CreateChatCompletionStepError, ErrorCode } from './errors/step-error.ts';\nimport { validateFlowSdkVersion } from './utils/validate-flow-sdk-version.ts';\nimport { ACTION } from '@onereach/flow-sdk/types/index.js';\nimport { CancelContext } from './threads/cancel/cancel-context.ts';\nimport { ContentContextUtilities } from './threads/content/content-context-utilities.ts';\nimport { endChildThreads } from './utils/thread-utilities.ts';\nimport { errorFilter } from './errors/error-filter.ts';\n\nimport type { ChatCompletion, ChatCompletionToolMessageParam } from 'openai/resources.js';\nimport type { IActionEvent, IEvent } from '@onereach/flow-sdk/types/index.js';\nimport type { ContentContextConfig } from './threads/content/abstract-content-context.ts';\n\nconst MINIMAL_FLOW_SDK_VERSION = '8.0.69';\n\nexport class CreateChatCompletionStep extends BaseStep<ChatCompletionConfig> {\n @ErrorFilter\n public runStep(): void {\n this.triggers.hook<ContentContextConfig, ACTION.end>(\n { name: ACTION.end, thread: this.contentContext.getThreadId(this.thread.step.id) },\n this.onContentContextEnd,\n );\n this.triggers.hook<HistoryContextConfig, ACTION.end>(\n { name: ACTION.end, thread: HistoryContext.getThreadId(this.thread.step.id) },\n this.onHistoryContextEnd,\n );\n this.triggers.local(events.cancel, this.onCancel);\n this.triggers.otherwise(this.initialize);\n }\n\n @ErrorFilter\n public async initialize(): Promise<void> {\n await validateFlowSdkVersion(MINIMAL_FLOW_SDK_VERSION);\n this.validateMergeFieldType();\n\n this.resetState();\n this.state.cancelled = false;\n\n await Promise.all([HistoryContext.start(this.thread), CancelContext.start(this.thread)]);\n\n // prepare messages history for the request\n await HistoryContext.prepareHistory(this.thread);\n\n // starting ContentContext thread will initiate the request to LLM\n await this.contentContext.start(this.thread);\n }\n\n @BackgroundThreadErrorFilter({ allowHandleError: true })\n public async onContentContextEnd(event: IActionEvent<ContentContextConfig, ACTION.end>): Promise<void> {\n try {\n const { result } = event.params.thread;\n this.log.DEBUG?.('ContentContext thread ended with result', result);\n\n if (result == undefined) {\n throw new CreateChatCompletionStepError('ContentContext thread ended unexpectedly', {\n code: ErrorCode.STEP_LOGIC_ISSUE,\n });\n }\n\n if (result instanceof Error) {\n const resultError = errorFilter(result, {\n unknownMessage: 'ContentContext thread ended with an error',\n unknownCode: ErrorCode.STEP_LOGIC_ISSUE,\n });\n throw resultError;\n }\n\n if (result.status === 'cancel') {\n await this.resetStep();\n return;\n }\n\n // TODO: figure out better way to check for correct structure of the event (zod?)\n const { status, chatCompletion, toolsResults } = result;\n\n if (status !== 'ok' || chatCompletion == undefined || toolsResults == undefined) {\n throw new CreateChatCompletionStepError('Unexpected end of the ContentContext thread', {\n code: ErrorCode.STEP_LOGIC_ISSUE,\n data: event.params.result,\n });\n }\n\n this.log.DEBUG?.('Create Chat Completion result', chatCompletion);\n\n this.state.contentReady = true;\n this.state.chatCompletion = chatCompletion;\n this.state.toolsResults = toolsResults;\n\n await this.tryToExitStep();\n } catch (error) {\n await this.resetStep().catch(() => {});\n throw error;\n }\n }\n\n @BackgroundThreadErrorFilter({ allowHandleError: true })\n public async onHistoryContextEnd(event: IActionEvent<HistoryContextConfig, ACTION.end>): Promise<void> {\n try {\n const { result } = event.params.thread;\n this.log.DEBUG?.(`${HistoryContext.name} thread ended with result`, result);\n\n if (result instanceof Error) {\n const resultError = errorFilter(result, {\n unknownMessage: `${HistoryContext.name} thread ended with an error`,\n unknownCode: ErrorCode.STEP_LOGIC_ISSUE,\n });\n throw resultError;\n }\n } catch (error) {\n await CancelContext.stop(this.thread).catch(() => {});\n throw error;\n }\n }\n\n private async tryToExitStep(): Promise<void> {\n const { cancelled, contentReady, chatCompletion, toolsResults } = this.state;\n\n if (cancelled) {\n // TODO: cleanup history with tool responses from it if \"second\" response was cancelled\n this.resetState();\n return;\n }\n\n if (!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 await Promise.all([\n // add completion message and possible tool results to history\n HistoryContext.appendToHistory(this.thread, [completionMessage, ...toolsResults]),\n // at this point there's nothing to cancel, so CancelContext thread is not needed anymore\n CancelContext.stop(this.thread),\n ]);\n\n const finishReason = chatCompletion.choices[0]?.finish_reason;\n if (finishReason === '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 } else if (finishReason === 'tool_calls') {\n // reset the step and run request again\n this.thread.jumpTo(this.currentStepId);\n return;\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);\n }\n\n @ErrorFilter\n public async onCancel(): Promise<void> {\n await this.resetStep();\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 CancelContext thread;\n * - End ContentController (with child thread);\n *\n * @throws if there any issues with stopping threads\n */\n private async resetStep(): Promise<void> {\n this.resetState();\n this.state.cancelled = true;\n\n const resetResults = await Promise.allSettled([\n endChildThreads(this.thread, { status: 'cancel' }),\n HistoryContext.adjustOnCancel(this.thread),\n ]);\n const failedTask = resetResults.find((task) => task.status === 'rejected');\n if (failedTask) throw failedTask.reason;\n }\n\n private resetState(): void {\n this.state.contentReady = false;\n this.state.chatCompletion = undefined;\n this.state.toolsResults = [];\n }\n\n private 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 private get contentContext(): ContentContextUtilities {\n const isStreaming = this.data.streamResponse;\n return ContentContextUtilities.factory(isStreaming);\n }\n}\n\n// ----------------- TYPES -----------------\n\nexport const events = {\n cancel: 'st_cancel',\n} as const;\nexport type EventName = typeof events;\n\nexport type ChatCompletionOut = ChatCompletion;\n\nexport type ChatCompletionState = {\n cancelled: boolean;\n contentReady: boolean;\n chatCompletion?: ChatCompletion;\n toolsResults: ChatCompletionToolMessageParam[];\n};\n\nexport type ChatCompletionCancelEvent = IEvent<unknown, EventName['cancel']>;\n\nexport type ChatCompletionEvents = ChatCompletionCancelEvent;\n\nexport interface ChatCompletionConfig extends BaseConfig {\n dataOut: ChatCompletionOut;\n state: ChatCompletionState;\n events: ChatCompletionEvents;\n}\n","import { Memoize } from 'typescript-memoize';\nimport { runChildThread, stopThread } from '../../utils/thread-utilities.ts';\nimport { SimpleContentContext } from './simple/simple-content-context.ts';\nimport { StreamContentContext } from './stream/stream-content-context.ts';\nimport { baseClassIdPrefix } from '../base.ts';\nimport type { IStepId, IThread, IThreadId } from '@onereach/flow-sdk/types/index.js';\nimport type { ContentContextConfig } from './abstract-content-context.ts';\nimport type { ChatCompletionConfig } from '../../step.ts';\n\nexport class ContentContextUtilities {\n @Memoize()\n static factory(isStreaming: boolean): ContentContextUtilities {\n const Constructor: ContentContextConstructor = isStreaming ? StreamContentContext : SimpleContentContext;\n return new ContentContextUtilities(Constructor);\n }\n\n private Constructor: ContentContextConstructor;\n\n private constructor(Constructor: ContentContextConstructor) {\n this.Constructor = Constructor;\n }\n\n public async start(thread: IThread<ChatCompletionConfig>): Promise<void> {\n const initialState = this.Constructor.getInitialState();\n await runChildThread<ContentContextConfig, ChatCompletionConfig>(thread, {\n id: this.getThreadId(thread.step.id),\n state: {\n ...initialState,\n requestComplete: false,\n step: thread.step.id,\n class: this.Constructor.class,\n },\n background: true,\n });\n }\n\n public async cancel(thread: IThread<ChatCompletionConfig>): Promise<void> {\n await stopThread<ContentContextConfig, ChatCompletionConfig>(thread, this.getThreadId(thread.step.id), {\n result: { status: 'cancel' },\n stopChildThreads: true,\n });\n }\n\n public getThreadId(stepId: IStepId): IThreadId {\n return `${baseClassIdPrefix}_${this.Constructor.class}_${stepId}`;\n }\n}\n\nexport type ContentContextConstructor = typeof SimpleContentContext | typeof StreamContentContext;\n","/* eslint-disable @typescript-eslint/unbound-method */\n\nimport { baseClassIdPrefix, BaseStep } from '../base.ts';\nimport { BackgroundThreadErrorFilter } from '../../decorators/background-thread-error-filter.ts';\nimport { runChildThread, stopThread } from '../../utils/thread-utilities.ts';\nimport { events as stepEvents } from '../../step.ts';\nimport { getAbortController } from '../../utils/process-abort-controller.ts';\nimport { AbortRequestError } from '../../errors/step-error.ts';\n\nimport type { BaseChildConfig } from '../base-child.ts';\nimport type { IThreadId, IEvent, IThread, IStepId } from '@onereach/flow-sdk/types/index.js';\nimport type { ChatCompletionConfig } from '../../step.ts';\n\nexport class CancelContext extends BaseStep<CancelContextConfig> {\n public static readonly class = 'cncl_ctrl';\n\n public static async start(thread: IThread<ChatCompletionConfig>): Promise<void> {\n await runChildThread<CancelContextConfig, ChatCompletionConfig>(\n thread,\n {\n id: this.getThreadId(thread.step.id),\n state: {\n step: thread.step.id,\n class: this.class,\n },\n background: true,\n },\n { force: true },\n );\n }\n\n public static async stop(thread: IThread<ChatCompletionConfig>): Promise<void> {\n await stopThread(thread, this.getThreadId(thread.step.id));\n }\n\n public static getThreadId(stepId: IStepId): IThreadId {\n return `${baseClassIdPrefix}_${this.class}_${stepId}`;\n }\n\n // ---------------------------------------\n\n @BackgroundThreadErrorFilter\n public runStep(): void {\n this.triggers.local({ name: events.cancel }, this.onCancel).otherwise(this.initialize);\n }\n\n @BackgroundThreadErrorFilter\n initialize(): void {\n this.log.DEBUG?.(`Initializing ${CancelContext.name} thread`);\n }\n\n @BackgroundThreadErrorFilter\n public onCancel(): void {\n this.log.DEBUG?.('Canceling LLM request');\n const parentThreadId = this.local.parent;\n const parentThread = this.process.getThread<ChatCompletionConfig>(parentThreadId);\n\n if (!parentThread) return this.end();\n\n const abortController = getAbortController({ thread: this.thread });\n if (abortController) {\n // LLM request is active\n abortController.abort(new AbortRequestError('Request cancelled'));\n } else {\n // LLM request already ended\n void this.process.enqueueAndRun({ name: stepEvents.cancel, thread: parentThreadId });\n }\n }\n}\n\n// ----------------- TYPES -----------------\n\nexport const events = {\n cancel: 'cnl_cancel',\n} as const;\nexport type EventName = typeof events;\n\nexport type CancelContextEvents = IEvent<unknown, EventName['cancel']>;\n\nexport type CancelContextState = {\n class: typeof CancelContext.class;\n};\n\nexport interface CancelContextConfig extends BaseChildConfig {\n state: CancelContextState;\n events: CancelContextEvents;\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","defaultPreserveErrors","CreateChatCompletionStepError","TimeoutError","errorFilter","error","options","preserveErrors","unknownMessage","unknownCode","ErrorCode","UNKNOWN","some","ErrorClass","z","core","$ZodError","prettifyError","code","VALIDATION","Error","message","includes","TIMEOUT","responseErrorMessage","response","data","undefined","SERVER_ERROR","defaultOptions","ErrorFilter","createMethodDecoratorWithOptionalArguments","_options","_target","propertyKey","descriptor","originalMethod","value","arguments_","result","apply","Promise","catch","error","methodName","toString","log","DEBUG","errorFilter","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","BaseStep","Step","resolveDataIn","dataIn","log","DEBUG","dataInSchema","parse","baseClassIdPrefix","ACTION","defaultOptions","allowHandleError","useErrorFilter","BackgroundThreadErrorFilter","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","_ts_decorate","decorators","target","key","desc","__name","HistoryContext","BaseStep","class","start","thread","historyThreadId","getThreadId","step","id","process","getThread","undefined","runThread","background","state","messages","prepareHistory","enqueueAndRun","name","events","appendToHistory","message","params","adjustOnCancel","getHistory","getSafeThread","stepId","baseClassIdPrefix","runStep","triggers","local","onPrepareHistory","onAppendToHistory","onAdjustOnCancel","otherwise","initialize","log","DEBUG","at","includes","role","tool_calls","removedMessage","pop","customHistory","historyLength","systemMessage","typeOfStep","userMessage","historyMode","historyMergefield","historyCode","assistantsFirstMessage","data","content","length","push","some","slice","systemMessageRecord","unshift","event","Array","isArray","setImmediate","clear","Memoize","ACTION","runChildThread","thread","id","state","local","options","force","threadToRun","process","getThread","log","DEBUG","undefined","runThread","parent","active","ended","Error","enqueueAndRun","name","ACTION","goto","isThreadBusy","threadId","threadToCheck","Boolean","listChildThreads","parentThreadId","childThreads","threads","item","push","stopThread","result","stopChildThreads","threadToStop","endChildThreads","ending","stopTasks","map","child","stopResults","Promise","allSettled","throw","failedTask","find","task","status","reason","ToolsContextWorker","BaseStep","class","start","thread","toolCall","parsedArguments","JSON","parse","function","arguments","runChildThread","id","getThreadId","state","step","local","parent","active","baseClassIdPrefix","runStep","log","DEBUG","exitStep","getExitName","name","ACTION","_ts_decorate","decorators","target","key","desc","__name","ToolsContext","BaseStep","class","start","thread","threadId","getThreadId","step","id","runChildThread","state","tasks","expectMoreTasks","background","callTool","toolCall","process","enqueueAndRun","name","EventName","params","lastToolCallReceived","stepId","baseClassIdPrefix","runStep","triggers","local","onCallTool","onLastToolCallReceived","otherwise","initialize","log","DEBUG","event","type","CreateChatCompletionStepError","code","ErrorCode","UNSUPPORTED","call","status","startToolWorkerThread","tryEndToolsContextThread","onWorkerThreadEnd","result","undefined","ToolsContextWorker","STEP_LOGIC_ISSUE","Error","errorFilter","unknownMessage","unknownCode","toolCallId","data","setToolCallResult","hook","ACTION","end","Object","values","some","task","messages","map","role","tool_call_id","content","JSON","stringify","ACTION","clear","Memoize","createAbortController","thread","options","cacheKey","getAbortControllerKey","process","cache","undefined","Error","AbortController","getAbortController","deleteAbortController","prefix","stepId","currentStepId","normalizedPrefix","OpenAI","timestring","z","Memoize","BasicThreadService","ThreadServiceWithData","BasicThreadService","data","thread","OpenAIRequestService","ThreadServiceWithData","makeOpenAiRequest","messages","signal","model","temperature","topP","maxTokens","frequencyPenalty","presencePenalty","n","streamResponse","data","request","structuredClone","top_p","max_tokens","frequency_penalty","presence_penalty","stop","stopSequences","stream","tools","log","DEBUG","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","setImmediate","BasicThreadService","AbstractResponseHandler","BasicThreadService","handleContentByParentThread","content","setImmediate","thread","process","enqueueAndRun","local","parent","name","contentContextEvents","handleContent","params","StreamResponseHandler","AbstractResponseHandler","handle","response","log","DEBUG","chunk","handleContentByParentThread","deleteAbortController","thread","SimpleResponseHandler","AbstractResponseHandler","handle","response","log","DEBUG","handleContentByParentThread","deleteAbortController","thread","responseHandlerFactory","thread","isStreaming","StreamResponseHandler","SimpleResponseHandler","memoizeTag","RequestContext","BaseStep","class","start","thread","runChildThread","id","getThreadId","step","state","background","stepId","baseClassIdPrefix","runStep","clear","abortController","createAbortController","response","openAiService","makeOpenAiRequest","history","signal","responseHandler","handle","complete","error","aborted","cancel","deleteAbortController","end","status","HistoryContext","getHistory","OpenAIRequestService","data","isStreaming","streamResponse","responseHandlerFactory","tags","_ts_decorate","decorators","target","key","desc","__name","memoizeTag","AbstractContentContext","BaseStep","class","Error","getInitialState","runStep","clear","triggers","local","contentContextEvents","handleContent","onHandleContent","hook","name","ACTION","end","thread","RequestContext","getThreadId","step","id","onRequestContextEnd","otherwise","initialize","log","DEBUG","start","event","result","params","undefined","CreateChatCompletionStepError","code","ErrorCode","STEP_LOGIC_ISSUE","errorFilter","unknownMessage","unknownCode","status","cancel","data","state","requestComplete","onAllContentReceived","toolsReady","setImmediate","ToolsContext","lastToolCallReceived","tryToComplete","onToolsContextEnd","messages","Array","isArray","toolsResults","callFunction","toolCall","initToolsContextThread","callTool","handleMultipleChoices","chatCompletion","choices","length","WARN","complete","tags","SimpleContentContext","AbstractContentContext","class","getInitialState","requestComplete","onHandleContent","event","content","params","state","chatCompletion","toolCalls","choices","message","tool_calls","undefined","toolCall","callFunction","onAllContentReceived","handleMultipleChoices","tryToComplete","toolsReady","complete","clear","Memoize","StreamContentContextWorker","BaseStep","class","start","thread","event","runChildThread","id","getThreadId","step","state","isBusy","isThreadBusy","stepId","baseClassIdPrefix","runStep","undefined","CreateChatCompletionStepError","code","ErrorCode","STEP_LOGIC_ISSUE","chunk","log","DEBUG","exitStep","streamWorkerExits","z","streamChunkEventSchema","object","name","string","params","content","id","literal","created","number","model","service_tier","optional","union","null","system_fingerprint","choices","array","index","delta","role","enum","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","memoizeTag","StreamContentContext","AbstractContentContext","class","getInitialState","requestComplete","workerComplete","partialChatCompletion","events","lastChunkReceived","index","runStep","clear","triggers","hook","name","ACTION","end","thread","StreamContentContextWorker","getThreadId","step","id","onWorkerThreadEnd","event","result","params","log","DEBUG","Error","errorFilter","unknownMessage","status","tryRunWorker","onHandleContent","chunk","streamChunkEventSchema","parse","content","StreamReducerService","state","onToolCall","bind","reduceChunk","chunkChoice","choices","delta","undefined","length","addContentToQueue","scheduleNextContentEvent","onAllContentReceived","chatCompletion","handleMultipleChoices","push","toolCall","callFunction","firstEvent","isEventReady","lastEvent","at","WARN","maxChunkContentLength","mergedChunk","slice","ts","Date","now","isBusy","getEventToProcess","tryToComplete","start","eventDelay","debounceDuration","shift","toolsReady","message","CreateChatCompletionStepError","code","ErrorCode","STEP_LOGIC_ISSUE","complete","data","streamSettings","maxBufferLength","tags","createRequire","readFile","require","createRequire","url","validateFlowSdkVersion","minVersion","test","Error","packageJsonPath","resolve","packageJsonContent","readFile","version","JSON","parse","groups","exec","major","Number","parseInt","minor","patch","undefined","isNaN","minMajor","minMinor","minPatch","split","map","x","ACTION","Memoize","ContentContextUtilities","factory","isStreaming","Constructor","StreamContentContext","SimpleContentContext","start","thread","initialState","getInitialState","runChildThread","id","getThreadId","step","state","requestComplete","class","background","cancel","stopThread","result","status","stopChildThreads","stepId","baseClassIdPrefix","_ts_decorate","decorators","target","key","desc","__name","MINIMAL_FLOW_SDK_VERSION","CreateChatCompletionStep","BaseStep","runStep","triggers","hook","name","ACTION","end","thread","contentContext","getThreadId","step","id","onContentContextEnd","HistoryContext","onHistoryContextEnd","local","events","cancel","onCancel","otherwise","initialize","validateFlowSdkVersion","validateMergeFieldType","resetState","state","cancelled","Promise","all","start","CancelContext","prepareHistory","event","result","params","log","DEBUG","undefined","CreateChatCompletionStepError","code","ErrorCode","STEP_LOGIC_ISSUE","Error","errorFilter","unknownMessage","unknownCode","status","resetStep","chatCompletion","toolsResults","data","contentReady","tryToExitStep","error","catch","stop","completionMessage","choices","message","appendToHistory","finishReason","finish_reason","LLM_FINISH_LENGTH","jumpTo","currentStepId","exitStep","failedTask","allSettled","endChildThreads","adjustOnCancel","find","task","reason","functionsList","Array","isArray","length","dataOut","getMergeField","type","VALIDATION","isStreaming","streamResponse","ContentContextUtilities","factory","allowHandleError","_ts_decorate","decorators","target","key","desc","__name","CancelContext","BaseStep","class","start","thread","runChildThread","id","getThreadId","step","state","background","force","stop","stopThread","stepId","baseClassIdPrefix","runStep","triggers","local","name","events","cancel","onCancel","otherwise","initialize","log","DEBUG","parentThreadId","parent","process","getThread","end","abortController","getAbortController","abort","AbortRequestError","enqueueAndRun","stepEvents","install","states","HistoryContext","class","RequestContext","ToolsContext","ToolsContextWorker","SimpleContentContext","StreamContentContext","StreamContentContextWorker","CancelContext"]}
|