@onereach/step-create-chat-completion 0.0.7-rc.21 → 0.0.7-rc.22
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 +17 -17
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/package.json +6 -6
package/dist/index.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import Step from '@onereach/flow-sdk/step';
|
|
2
2
|
import { CONFIG, IThread, IThreadId, IActionEvent, ACTION, IEvent } from '@onereach/flow-sdk/types';
|
|
3
3
|
import { z } from 'zod/v4-mini';
|
|
4
|
-
import { ChatCompletionChunk,
|
|
4
|
+
import { ChatCompletionChunk, ChatCompletionMessageFunctionToolCall, ChatCompletion, ChatCompletionToolMessageParam, ChatCompletionMessageParam } from 'openai/resources';
|
|
5
5
|
|
|
6
6
|
declare const dataInSchema: z.ZodMiniObject<{
|
|
7
7
|
provider: z.ZodMiniString<string>;
|
|
@@ -125,7 +125,7 @@ declare class StreamWorker extends Step<StreamWorkerConfig> {
|
|
|
125
125
|
static start(step: Step<StreamControllerConfig>, event: ContentChunk): Promise<void>;
|
|
126
126
|
static isBusy(step: Step<StreamControllerConfig>): boolean;
|
|
127
127
|
static getThread(step: Step<StreamControllerConfig>): IThread<StreamWorkerConfig> | undefined;
|
|
128
|
-
static getThreadId(step: Step<
|
|
128
|
+
static getThreadId<T extends CONFIG>(step: Step<T>): IThreadId;
|
|
129
129
|
runStep(): void;
|
|
130
130
|
}
|
|
131
131
|
type ContentChunk = {
|
|
@@ -151,7 +151,7 @@ declare class StreamController extends Step<StreamControllerConfig> {
|
|
|
151
151
|
static start(step: Step<ChatCompletionConfig>): Promise<void>;
|
|
152
152
|
static handleChunk(step: Step<ChatCompletionConfig>, chunk: ChatCompletionChunk): Promise<void>;
|
|
153
153
|
static lastChunkReceived(step: Step<ChatCompletionConfig>): Promise<void>;
|
|
154
|
-
static getThreadId(step: Step): IThreadId;
|
|
154
|
+
static getThreadId<T extends CONFIG>(step: Step<T>): IThreadId;
|
|
155
155
|
runStep(): void;
|
|
156
156
|
/**
|
|
157
157
|
* Handler of the worker thread end event.
|
|
@@ -163,7 +163,7 @@ declare class StreamController extends Step<StreamControllerConfig> {
|
|
|
163
163
|
onStreamChunk(event: IEvent<StreamChunkParams, EventName$2.handleChunk>): void;
|
|
164
164
|
protected handleMultipleChoices(choice: ChatCompletionChunk.Choice): void;
|
|
165
165
|
protected handleLengthFinishReason(choice: ChatCompletionChunk.Choice): void;
|
|
166
|
-
protected onToolCall(toolCall:
|
|
166
|
+
protected onToolCall(toolCall: ChatCompletionMessageFunctionToolCall): void;
|
|
167
167
|
/**
|
|
168
168
|
* Tries to flush the queue of response chunks to the controller thread.
|
|
169
169
|
* If the first event in the queue is not full, it waits for a debounce duration before flushing.
|
|
@@ -231,8 +231,8 @@ interface StreamControllerConfig extends CONFIG {
|
|
|
231
231
|
|
|
232
232
|
declare class ToolsWorker<TArgs extends ParsedArguments, TResult> extends Step<ToolsWorkerConfig<TArgs, TResult>> {
|
|
233
233
|
static readonly class = "tl_wrk";
|
|
234
|
-
static start<TArgs extends ParsedArguments, TResult>(step: Step<ToolsControllerConfig<TResult>>, toolCall:
|
|
235
|
-
static getThreadId(toolCall:
|
|
234
|
+
static start<TArgs extends ParsedArguments, TResult>(step: Step<ToolsControllerConfig<TResult>>, toolCall: ChatCompletionMessageFunctionToolCall): Promise<void>;
|
|
235
|
+
static getThreadId(toolCall: ChatCompletionMessageFunctionToolCall): IThreadId;
|
|
236
236
|
/**
|
|
237
237
|
* Initializes the tool worker thread to handle processing of repackaged content chunks.
|
|
238
238
|
*/
|
|
@@ -256,7 +256,7 @@ type ToolsWorkerState = {
|
|
|
256
256
|
class: typeof ToolsWorker.class;
|
|
257
257
|
};
|
|
258
258
|
type ToolsWorkerLocal<TArgs extends ParsedArguments> = {
|
|
259
|
-
toolCall:
|
|
259
|
+
toolCall: ChatCompletionMessageFunctionToolCall;
|
|
260
260
|
parsedArguments: TArgs;
|
|
261
261
|
};
|
|
262
262
|
type ThreadWorkerResult<TResult> = {
|
|
@@ -274,7 +274,7 @@ interface ToolsWorkerConfig<TArgs extends ParsedArguments, TResult> extends CONF
|
|
|
274
274
|
declare class ToolsController<TArgs extends ParsedArguments, TResult> extends Step<ToolsControllerConfig<TResult>> {
|
|
275
275
|
static readonly class = "tl_ctrl";
|
|
276
276
|
static start<TResult>(step: Step<ChatCompletionConfig>): Promise<void>;
|
|
277
|
-
static callTool<T extends ChatCompletionConfig | StreamControllerConfig>(step: Step<T>, toolCall:
|
|
277
|
+
static callTool<T extends ChatCompletionConfig | StreamControllerConfig>(step: Step<T>, toolCall: ChatCompletionMessageFunctionToolCall): Promise<void>;
|
|
278
278
|
static lastToolCallReceived<T extends ChatCompletionConfig | StreamControllerConfig>(step: Step<T>): Promise<void>;
|
|
279
279
|
static getThreadId<T extends CONFIG>(step: Step<T>): IThreadId;
|
|
280
280
|
runStep(): void;
|
|
@@ -284,8 +284,8 @@ declare class ToolsController<TArgs extends ParsedArguments, TResult> extends St
|
|
|
284
284
|
/**
|
|
285
285
|
* Starts the tool worker thread to process the tool call.
|
|
286
286
|
*/
|
|
287
|
-
protected startToolWorkerThread(toolCall:
|
|
288
|
-
|
|
287
|
+
protected startToolWorkerThread(toolCall: ChatCompletionMessageFunctionToolCall): void;
|
|
288
|
+
onWorkerThreadEnd(event: IActionEvent<ToolsWorkerConfig<TArgs, TResult>, ACTION.end>): void;
|
|
289
289
|
protected setToolCallResult(toolCallId: string, result: TResult): void;
|
|
290
290
|
protected tryEndToolsControllerThread(): void;
|
|
291
291
|
protected get messages(): ChatCompletionToolMessageParam[];
|
|
@@ -297,16 +297,16 @@ declare enum EventName$1 {
|
|
|
297
297
|
}
|
|
298
298
|
type ToolCallTask<TResult> = {
|
|
299
299
|
status: 'pending' | 'completed' | 'failed';
|
|
300
|
-
call:
|
|
300
|
+
call: ChatCompletionMessageFunctionToolCall;
|
|
301
301
|
result?: TResult;
|
|
302
302
|
};
|
|
303
|
-
type TasksMap<TResult> = Record<
|
|
303
|
+
type TasksMap<TResult> = Record<ChatCompletionMessageFunctionToolCall['id'], ToolCallTask<TResult>>;
|
|
304
304
|
type ToolsControllerResult = {
|
|
305
305
|
status: 'ok';
|
|
306
306
|
messages: ChatCompletionToolMessageParam[];
|
|
307
307
|
};
|
|
308
308
|
type CallToolParams = {
|
|
309
|
-
toolCall:
|
|
309
|
+
toolCall: ChatCompletionMessageFunctionToolCall;
|
|
310
310
|
};
|
|
311
311
|
type ToolsControllerEvents = IEvent<CallToolParams, EventName$1.callTool> | IEvent<never, EventName$1.lastToolCallReceived>;
|
|
312
312
|
type ToolsControllerState<TResult> = {
|
|
@@ -447,10 +447,10 @@ interface ChatCompletionConfig extends CONFIG {
|
|
|
447
447
|
declare class HistoryController extends Step<HistoryControllerConfig> {
|
|
448
448
|
static readonly class = "hst_ctrl";
|
|
449
449
|
static start(step: Step<ChatCompletionConfig>): Promise<void>;
|
|
450
|
-
static prepareHistory(step: Step): Promise<void>;
|
|
451
|
-
static appendToHistory(step: Step
|
|
452
|
-
static getHistory(step: Step): ChatCompletionMessageParam[];
|
|
453
|
-
static getThreadId(step: Step): IThreadId;
|
|
450
|
+
static prepareHistory<T extends CONFIG>(step: Step<T>): Promise<void>;
|
|
451
|
+
static appendToHistory<T extends CONFIG>(step: Step<T>, message: ChatCompletionMessageParam | ChatCompletionMessageParam[]): Promise<void>;
|
|
452
|
+
static getHistory<T extends CONFIG>(step: Step<T>): ChatCompletionMessageParam[];
|
|
453
|
+
static getThreadId<T extends CONFIG>(step: Step<T>): IThreadId;
|
|
454
454
|
runStep(): void;
|
|
455
455
|
onPrepareHistory(): void;
|
|
456
456
|
onAppendToHistory(event: IEvent<HistoryControllerAppendParams, EventName.appendToHistory>): void;
|
package/dist/index.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";var ye=Object.create;var U=Object.defineProperty;var _e=Object.getOwnPropertyDescriptor;var Te=Object.getOwnPropertyNames;var Ee=Object.getPrototypeOf,ke=Object.prototype.hasOwnProperty;var h=(n,e)=>U(n,"name",{value:e,configurable:!0});var Re=(n,e)=>{for(var t in e)U(n,t,{get:e[t],enumerable:!0})},V=(n,e,t,s)=>{if(e&&typeof e=="object"||typeof e=="function")for(let a of Te(e))!ke.call(n,a)&&a!==t&&U(n,a,{get:()=>e[a],enumerable:!(s=_e(e,a))||s.enumerable});return n};var R=(n,e,t)=>(t=n!=null?ye(Ee(n)):{},V(e||!n||!n.__esModule?U(t,"default",{value:n,enumerable:!0}):t,n)),we=n=>V(U({},"__esModule",{value:!0}),n);var Oe={};Re(Oe,{states:()=>Le,step:()=>Ce});module.exports=we(Oe);var ge=require("source-map-support");var me=R(require("@onereach/flow-sdk/step"));var J=R(require("@onereach/flow-sdk/step"));var F=R(require("@onereach/flow-sdk/errors/timeout")),H=require("zod/v4-mini");var K=R(require("@onereach/flow-sdk/errors/base"));var u=function(n){return 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}({}),d=class extends K.default{static{h(this,"CreateChatCompletionStepError")}};function B(n){if(n instanceof d||n instanceof F.default)return n;if(n instanceof H.z.core.$ZodError)return new d(H.z.prettifyError(n),n,{code:u.VALIDATION});if(n instanceof Error){if(n.message.includes("Request timed out"))return new F.default("Timeout",n,{code:u.TIMEOUT});if(n.message.includes("API key is required"))return new d("API key is required",n,{code:u.AUTH});let e=n?.response?.data?.error?.message;if(e!=null)return new d(e,n,{code:u.SERVER_ERROR})}return typeof n=="string"?new d(n,{code:u.UNKNOWN}):n instanceof Error?new d("Unknown error",n,{code:u.UNKNOWN}):new d("Unknown error",{code:u.UNKNOWN,data:n})}h(B,"errorFilter");function p(n,e,t){let s=t.value;if(!s||typeof s!="function")return;let a=h(function(...r){try{let l=s.apply(this,r);return l instanceof Promise?l.catch(c=>{let S=e.toString();throw this.log.DEBUG?.(`Error in method '${S}'`,c),B(c)}):l}catch(l){let c=e.toString();throw this.log.DEBUG?.(`Error in method '${c}'`,l),B(l)}},"wrappedMethod");return s?.name!=null&&Object.defineProperty(a,"name",{value:s.name}),t.value=a,t}h(p,"ErrorFilter");function q(n,e,t,s){var a=arguments.length,r=a<3?e:s===null?s=Object.getOwnPropertyDescriptor(e,t):s,l;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")r=Reflect.decorate(n,e,t,s);else for(var c=n.length-1;c>=0;c--)(l=n[c])&&(r=(a<3?l(r):a>3?l(e,t,r):l(e,t))||r);return a>3&&r&&Object.defineProperty(e,t,r),r}h(q,"_ts_decorate");function I(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)}h(I,"_ts_metadata");var k=class extends J.default{static{h(this,"HistoryController")}static class="hst_ctrl";static async start(e){let t=this.getThreadId(e);e.process.getThread(t)==null&&await e.thread.runThread({id:t,background:!0,state:{step:e.id,class:this.class,messages:[]}})}static async prepareHistory(e){await e.process.enqueueAndRun({thread:this.getThreadId(e),name:"hst_prepare"})}static async appendToHistory(e,t){await e.process.enqueueAndRun({thread:this.getThreadId(e),name:"hst_append",params:{message:t}})}static getHistory(e){return e.process.getSafeThread(this.getThreadId(e)).state.messages}static getThreadId(e){return`llm_cmp_${this.class}_${e.id}`}runStep(){this.triggers.local("hst_prepare",this.onPrepareHistory).local("hst_append",this.onAppendToHistory).otherwise(()=>{this.log.DEBUG?.("Initializing history controller thread")})}onPrepareHistory(){this.log.DEBUG?.("Preparing history");let{customHistory:e,historyLength:t,systemMessage:s,typeOfStep:a,userMessage:r,historyMode:l,historyMergefield:c,historyCode:S,assistantsFirstMessage:b}=this.data;if(a==="completion"){this.state.messages=[{role:"user",content:r}];return}if(e){this.state.messages=l==="mergefield"?c:S;return}let y=this.state.messages;if(y.length===0&&b!=null&&b.length>0&&y.push({role:"assistant",content:b}),y.at(-1)?.role!=="tool"&&y.push({role:"user",content:r}),!y.some(N=>N.role==="tool")&&t!=null&&t>0&&(y=y.slice(-1*t)),s!=null&&s.length>0){let N={role:"system",content:s};y[0]?.role==="system"?y[0]=N:y.unshift(N)}this.state.messages=y}onAppendToHistory(e){this.log.DEBUG?.("Appending message to history",e.params);let{message:t}=e.params,s=Array.isArray(t)?t:[t];this.state.messages.push(...s)}};q([p,I("design:type",Function),I("design:paramtypes",[]),I("design:returntype",void 0)],k.prototype,"runStep",null);q([p,I("design:type",Function),I("design:paramtypes",[]),I("design:returntype",void 0)],k.prototype,"onPrepareHistory",null);q([p,I("design:type",Function),I("design:paramtypes",[typeof IEvent>"u"?Object:IEvent]),I("design:returntype",void 0)],k.prototype,"onAppendToHistory",null);var ne=R(require("@onereach/flow-sdk/step"));var Z=R(require("@onereach/flow-sdk/step"));var Q=require("@onereach/flow-sdk/types");async function L(n,{id:e,state:t,...s}){let a=n.process.getThread(e);if(n.log.DEBUG?.(`runThread: thread with id '${e}'`,s),a==null)return await n.thread.runThread({id:e,background:!0,state:t,...s});if(!a.ended)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 await a.enqueueAndRun({name:Q.ACTION.goto,state:t})}h(L,"runThread");function ve(n,e,t,s){var a=arguments.length,r=a<3?e:s===null?s=Object.getOwnPropertyDescriptor(e,t):s,l;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")r=Reflect.decorate(n,e,t,s);else for(var c=n.length-1;c>=0;c--)(l=n[c])&&(r=(a<3?l(r):a>3?l(e,t,r):l(e,t))||r);return a>3&&r&&Object.defineProperty(e,t,r),r}h(ve,"_ts_decorate");function W(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)}h(W,"_ts_metadata");var w=class extends Z.default{static{h(this,"StreamWorker")}static class="str_wrk";static async start(e,t){await L(e,{id:this.getThreadId(e),state:{step:e.id,class:this.class,event:t}})}static isBusy(e){let t=this.getThread(e);return t!=null&&!t.ended}static getThread(e){let t=this.getThreadId(e);return e.process.getThread(t)}static getThreadId(e){return`llm_cmp_${this.class}_${e.id}`}runStep(){if(!("event"in this.state)||this.state.event==null)throw new d("Stream worker thread state must contain an event to process",{code:u.STEP_LOGIC_ISSUE});let e=this.state.event;this.log.DEBUG?.("Executing stream worker thread",e),this.exitStep("chunk",{chunk:e})}};ve([p,W("design:type",Function),W("design:paramtypes",[]),W("design:returntype",void 0)],w.prototype,"runStep",null);var Y=R(require("@onereach/flow-sdk/step"));var X=R(require("@onereach/flow-sdk/step"));function Se(n,e,t,s){var a=arguments.length,r=a<3?e:s===null?s=Object.getOwnPropertyDescriptor(e,t):s,l;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")r=Reflect.decorate(n,e,t,s);else for(var c=n.length-1;c>=0;c--)(l=n[c])&&(r=(a<3?l(r):a>3?l(e,t,r):l(e,t))||r);return a>3&&r&&Object.defineProperty(e,t,r),r}h(Se,"_ts_decorate");function $(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)}h($,"_ts_metadata");var C=class extends X.default{static{h(this,"ToolsWorker")}static class="tl_wrk";static async start(e,t){let s=JSON.parse(t.function?.arguments);await L(e,{id:this.getThreadId(t),state:{step:e.id,class:this.class},local:{toolCall:t,parsedArguments:s}})}static getThreadId(e){return`llm_cmp_${this.class}_${e.id}`}runStep(){let{toolCall:e,parsedArguments:t}=this.local;this.log.DEBUG?.("Initializing tool worker thread",e),this.exitStep(this.getExitName(),{toolCall:{id:e.id,type:e.type,function:{name:e.function.name,arguments:t}}})}getExitName(){return"function"}};Se([p,$("design:type",Function),$("design:paramtypes",[]),$("design:returntype",void 0)],C.prototype,"runStep",null);var ee=require("@onereach/flow-sdk/types");function M(n,e,t,s){var a=arguments.length,r=a<3?e:s===null?s=Object.getOwnPropertyDescriptor(e,t):s,l;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")r=Reflect.decorate(n,e,t,s);else for(var c=n.length-1;c>=0;c--)(l=n[c])&&(r=(a<3?l(r):a>3?l(e,t,r):l(e,t))||r);return a>3&&r&&Object.defineProperty(e,t,r),r}h(M,"_ts_decorate");function _(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)}h(_,"_ts_metadata");var f=class extends Y.default{static{h(this,"ToolsController")}static class="tl_ctrl";static async start(e){let t=this.getThreadId(e);await L(e,{id:t,state:{step:e.id,class:this.class,tasks:{},expectMoreTasks:!0}})}static async callTool(e,t){await e.process.enqueueAndRun({thread:this.getThreadId(e),name:"tl_run_call",params:{toolCall:t}})}static async lastToolCallReceived(e){await e.process.enqueueAndRun({thread:this.getThreadId(e),name:"tl_rsp_end"})}static getThreadId(e){return`llm_cmp_${this.class}_${e.id}`}runStep(){this.triggers.local("tl_run_call",this.onCallTool).local("tl_rsp_end",this.onLastToolCallReceived).otherwise(this.initialize)}initialize(){this.log.DEBUG?.("Initializing tools controller thread"),this.validateMergeFieldType()}onCallTool(e){let{toolCall:t}=e.params;if(t.type!=="function")throw new d("Only function tools are supported at the moment",{code:u.UNSUPPORTED});this.state.tasks[t.id]={call:t,status:"pending"},this.startToolWorkerThread(t)}onLastToolCallReceived(){this.log.DEBUG?.("No more tool calls expected",this.state.tasks),this.state.expectMoreTasks=!1,this.tryEndToolsControllerThread()}startToolWorkerThread(e){this.triggers.hook({name:ee.ACTION.end,thread:C.getThreadId(e)},this.onToolWorkerThreadEnd),C.start(this,e)}onToolWorkerThreadEnd(e){if(this.log.DEBUG?.("Tool caller worker thread has ended",e),!("result"in e.params)||e.params.result==null)throw new d("Tool worker thread ended without result",{code:u.STEP_LOGIC_ISSUE});let{result:t}=e.params;if(t instanceof Error)throw new d("Tool worker thread ended with error",t,{code:u.STEP_LOGIC_ISSUE});this.log.DEBUG?.("Tool worker thread completed successfully",{toolCallId:t.toolCallId,result:t.data}),this.setToolCallResult(t.toolCallId,t.data),this.tryEndToolsControllerThread()}setToolCallResult(e,t){let s=this.state.tasks[e];if(s==null)throw new d(`Unknown tool call with id '${e}'`,{code:u.STEP_LOGIC_ISSUE});s.status="completed",s.result=t}tryEndToolsControllerThread(){this.state.expectMoreTasks||Object.values(this.state.tasks).some(t=>t.status==="pending")||(this.log.DEBUG?.("All tool calls completed or failed",this.state.tasks),this.end({status:"ok",messages:this.messages}))}get messages(){return Object.values(this.state.tasks).map(e=>({role:"tool",tool_call_id:e.call.id,content:JSON.stringify(e.result)}))}validateMergeFieldType(){let{functionsList:e}=this.data;if(!(!Array.isArray(e)||e.length===0)&&(this.dataOut==null||this.getMergeField(this.dataOut).type!=="thread"))throw new d('Merge-field type has to be "Thread" if you are using functions',{code:u.VALIDATION})}};M([p,_("design:type",Function),_("design:paramtypes",[]),_("design:returntype",void 0)],f.prototype,"runStep",null);M([p,_("design:type",Function),_("design:paramtypes",[]),_("design:returntype",void 0)],f.prototype,"initialize",null);M([p,_("design:type",Function),_("design:paramtypes",[typeof IEvent>"u"?Object:IEvent]),_("design:returntype",void 0)],f.prototype,"onCallTool",null);M([p,_("design:type",Function),_("design:paramtypes",[]),_("design:returntype",void 0)],f.prototype,"onLastToolCallReceived",null);M([p,_("design:type",Function),_("design:paramtypes",[typeof IActionEvent>"u"?Object:IActionEvent]),_("design:returntype",void 0)],f.prototype,"onToolWorkerThreadEnd",null);var i=require("zod/v4-mini"),te=i.z.object({name:i.z.string(),params:i.z.object({chunk:i.z.object({id:i.z.string(),object:i.z.literal("chat.completion.chunk"),created:i.z.number(),model:i.z.string(),service_tier:i.z.optional(i.z.union([i.z.literal("default"),i.z.literal("auto"),i.z.literal("flex"),i.z.literal("scale"),i.z.literal("priority"),i.z.null()])),system_fingerprint:i.z.optional(i.z.string()),choices:i.z.array(i.z.object({index:i.z.number(),delta:i.z.object({role:i.z.optional(i.z.enum(["developer","system","user","assistant","tool"])),content:i.z.optional(i.z.string()),refusal:i.z.nullish(i.z.string()),tool_calls:i.z.optional(i.z.array(i.z.object({index:i.z.number().check(i.z.int(),i.z.gte(0)),id:i.z.optional(i.z.string()),type:i.z.optional(i.z.literal("function")),function:i.z.object({name:i.z.optional(i.z.string()),arguments:i.z.optional(i.z.string())})})))}),logprobs:i.z.optional(i.z.any()),finish_reason:i.z.union([i.z.literal("stop"),i.z.literal("length"),i.z.literal("tool_calls"),i.z.literal("content_filter"),i.z.null()])})),logprobs:i.z.nullish(i.z.object({content:i.z.nullable(i.z.array(i.z.looseObject({}))),refusal:i.z.nullable(i.z.array(i.z.looseObject({})))})),usage:i.z.nullish(i.z.object({prompt_tokens:i.z.number(),completion_tokens:i.z.number(),total_tokens:i.z.number(),completion_tokens_details:i.z.optional(i.z.object({accepted_prediction_tokens:i.z.optional(i.z.number()),audio_tokens:i.z.optional(i.z.number()),reasoning_tokens:i.z.optional(i.z.number()),rejected_prediction_tokens:i.z.optional(i.z.number())})),prompt_tokens_details:i.z.optional(i.z.object({audio_tokens:i.z.optional(i.z.number()),cached_tokens:i.z.optional(i.z.number())}))}))})})});var G=class{static{h(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,...s}=e;Object.assign(this._result,s),this._result.object!=null&&(this._result.object="chat.completion")}e.usage&&(this._result.usage=e.usage);for(let t of e.choices){let s=this._result.choices?.[t.index];if(!s){let{delta:a,...r}=t;s=r,this._result.choices??=[],this._result.choices[t.index]=s}if(t.finish_reason!=null&&(s.finish_reason=t.finish_reason),t.logprobs!=null&&(s.logprobs=t.logprobs),t.delta?.content!=null){let{content:a,...r}=t.delta;s.message??=r,s.message.content??="",s.message.content+=a}if(t.delta?.tool_calls!=null){let{tool_calls:a,...r}=t.delta;s.message??=r,s.message.tool_calls??=[];for(let l of t.delta.tool_calls){let c=l.index;s.message.tool_calls[c]==null?s.message.tool_calls[c]=structuredClone(l):s.message.tool_calls[c].function.arguments+=l.function?.arguments??"",t.index===0&&this.tryParseToolCall(s.message.tool_calls[c])}}}}tryParseToolCall(e){try{let t=JSON.parse(e.function.arguments);this._onToolCall(e,t)}catch{}}};var oe=require("@onereach/flow-sdk/types");function D(n,e,t,s){var a=arguments.length,r=a<3?e:s===null?s=Object.getOwnPropertyDescriptor(e,t):s,l;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")r=Reflect.decorate(n,e,t,s);else for(var c=n.length-1;c>=0;c--)(l=n[c])&&(r=(a<3?l(r):a>3?l(e,t,r):l(e,t))||r);return a>3&&r&&Object.defineProperty(e,t,r),r}h(D,"_ts_decorate");function T(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)}h(T,"_ts_metadata");var E=class extends ne.default{static{h(this,"StreamController")}static class="str_ctrl";static async start(e){await L(e,{id:this.getThreadId(e),state:{step:e.id,class:this.class,completionResult:{},events:[],lastChunkReceived:!1,index:-1,skipIndexWarning:!1}})}static async handleChunk(e,t){await e.process.enqueueAndRun({thread:this.getThreadId(e),name:"add_chunk",params:{chunk:t}})}static async lastChunkReceived(e){await e.process.enqueueAndRun({thread:this.getThreadId(e),name:"llm_rsp_end"})}static getThreadId(e){return`llm_cmp_${this.class}_${e.id}`}runStep(){this.triggers.hook({name:oe.ACTION.end,thread:w.getThreadId(this)},this.onWorkerThreadEnd).local("add_chunk",this.onStreamChunk).local("llm_rsp_end",this.onLastStreamChunkReceived).otherwise(()=>{this.log.DEBUG?.("Initializing stream controller thread")})}onWorkerThreadEnd(e){this.log.DEBUG?.("Stream worker thread finished processing chunk",e.params.result),this.tryRunWorker()}onStreamChunk(e){let s=te.parse(e).params.chunk;new G(this.state.completionResult,this.onToolCall.bind(this)).reduceChunk(s);for(let r of s.choices){if(this.log.DEBUG?.("LLM stream response chunk",r),r.index>0){this.handleMultipleChoices(r);continue}let l=r.delta?.content;l!=null&&l.length>0&&(this.addContentToQueue(l),this.scheduleNextContentEvent()),this.handleLengthFinishReason(r)}}handleMultipleChoices(e){this.state.skipIndexWarning||(this.log.WARN?.("Multiple choices received from LLM, but only the first one will be processed",{choiceIndex:e.index}),this.state.skipIndexWarning=!0)}handleLengthFinishReason(e){if(e.finish_reason==="length")throw new d("Reached limit of tokens for LLM completion response",{code:u.LLM_FINISH_LENGTH})}onToolCall(e){this.log.DEBUG?.("Tool call received",e),f.callTool(this,e)}scheduleNextContentEvent(){let e=this.state.events[0];e==null||!this.isEventReady(e)||"lastChunkReceived"in e||this.tryRunWorker()}addContentToQueue(e){let t=this.state.events.at(-1);if(t!=null){if("lastChunkReceived"in t){this.log.WARN?.("A new chunk received after the `lastChunkReceived` event. Ignoring it.");return}if(t.content.length<this.maxChunkContentLength){let s=`${t.content}${e}`;t.content=s.slice(0,this.maxChunkContentLength),this.log.DEBUG?.("Compacting response chunk into last queue event",t),e=s.slice(this.maxChunkContentLength)}}for(;e;){this.state.index+=1;let s={content:e.slice(0,this.maxChunkContentLength),index:this.state.index,ts:Date.now()};this.log.DEBUG?.("Add new event into the queue",s),this.state.events.push(s),e=e.slice(this.maxChunkContentLength)}}tryRunWorker(){if(w.isBusy(this)){this.log.DEBUG?.("Skip event processing. Worker thread is busy");return}let e=this.getEventToProcess();if(e!=null){if("lastChunkReceived"in e){this.log.DEBUG?.("Stopping controller thread. All response content chunks were processed and no new chunks are coming"),this.end({status:"ok",completion:this.state.completionResult});return}this.log.DEBUG?.("Notify stream worker thread about response chunk to process",e),w.start(this,e)}}isEventReady(e){if(e==null)return!1;if("lastChunkReceived"in e)return!0;if(e.content==null)return!1;let t=Date.now()-e.ts;return this.state.lastChunkReceived||t>=this.debounceDuration||e.content.length>=this.maxChunkContentLength}getEventToProcess(){let e=this.state.events[0];if(e!=null&&this.isEventReady(e))return"lastChunkReceived"in e||this.state.events.shift(),e}async onLastStreamChunkReceived(){this.log.DEBUG?.("All LLM response chunks were received. No more response chunks expected"),this.state.events.push({lastChunkReceived:!0}),this.state.lastChunkReceived=!0,this.tryRunWorker(),await f.lastToolCallReceived(this)}get maxChunkContentLength(){return this.data.streamSettings?.maxBufferLength??100}get debounceDuration(){return this.data.streamSettings?.debounceDuration??200}};D([p,T("design:type",Function),T("design:paramtypes",[]),T("design:returntype",void 0)],E.prototype,"runStep",null);D([p,T("design:type",Function),T("design:paramtypes",[typeof IActionEvent>"u"?Object:IActionEvent]),T("design:returntype",void 0)],E.prototype,"onWorkerThreadEnd",null);D([p,T("design:type",Function),T("design:paramtypes",[typeof IEvent>"u"?Object:IEvent]),T("design:returntype",void 0)],E.prototype,"onStreamChunk",null);D([p,T("design:type",Function),T("design:paramtypes",[]),T("design:returntype",void 0)],E.prototype,"tryRunWorker",null);D([p,T("design:type",Function),T("design:paramtypes",[]),T("design:returntype",Promise)],E.prototype,"onLastStreamChunkReceived",null);var o=require("zod/v4-mini"),re=require("zod/v4/locales");o.z.config((0,re.en)());var m=o.z.string().check(o.z.trim(),o.z.refine(n=>!["undefined","null"].includes(n),{error:"Unexpected undefined or null merge-field value"})),se=o.z.discriminatedUnion("role",[o.z.object({role:o.z.literal("system"),content:m}),o.z.object({role:o.z.literal("user"),content:m,name:o.z.optional(m.check(o.z.minLength(1),o.z.maxLength(64)))}),o.z.object({role:o.z.literal("assistant"),content:o.z.nullable(m),tool_calls:o.z.optional(o.z.array(o.z.object({id:m.check(o.z.minLength(1)),type:o.z.literal("function"),function:o.z.object({name:m.check(o.z.minLength(1)),arguments:m.check(o.z.minLength(1))})})))}),o.z.object({role:o.z.literal("tool"),content:m,name:o.z.optional(m.check(o.z.minLength(1),o.z.maxLength(64))),tool_call_id:m.check(o.z.minLength(1))})]),ie=o.z.object({provider:m.check(o.z.minLength(1)),model:m.check(o.z.minLength(1)),tokenName:O(m),tokenNameHeader:o.z._default(m.check(o.z.minLength(1)),"x-or-account-token-name"),sessionIdHeader:o.z._default(m.check(o.z.minLength(1)),"x-or-session-id"),typeOfStep:o.z.enum(["chat","completion"]),systemMessage:o.z.optional(m),userMessage:o.z.optional(m),switchAssistantsMessage:o.z._default(o.z.boolean(),!1),assistantsFirstMessage:o.z.optional(m),temperature:O(o.z.coerce.number().check(o.z.gte(0),o.z.lte(2))),topP:O(o.z.coerce.number().check(o.z.gte(0),o.z.lte(1))),maxTokens:O(o.z.coerce.number().check(o.z.int(),o.z.gte(1))),presencePenalty:O(o.z.coerce.number().check(o.z.gte(-2),o.z.lte(2))),frequencyPenalty:O(o.z.coerce.number().check(o.z.gte(-2),o.z.lte(2))),n:O(o.z.coerce.number().check(o.z.int(),o.z.gte(1),o.z.lte(128))),stop:o.z.optional(o.z.array(o.z.object({token:o.z.string().check(o.z.minLength(1),o.z.maxLength(64))})).check(o.z.maxLength(4))),streamResponse:o.z._default(o.z.boolean(),!1),streamSettings:o.z.optional(o.z.object({maxBufferLength:o.z.coerce.number().check(o.z.overwrite(n=>n===0?50:n),o.z.int(),o.z.gte(1),o.z.lte(32768)),debounceDuration:o.z.coerce.number().check(o.z.int(),o.z.gte(0),o.z.lte(1e4))})),customHistory:o.z._default(o.z.boolean(),!1),historyLength:O(o.z.coerce.number().check(o.z.int(),o.z.gte(1),o.z.lte(100))),historyMode:o.z.optional(o.z.enum(["mergefield","codeHistory"])),historyMergefield:o.z.optional(o.z.array(se)),historyCode:o.z.optional(o.z.array(se)),functionsList:o.z.array(o.z.object({name:m.check(o.z.minLength(1),o.z.maxLength(64)),description:o.z.optional(m.check(o.z.maxLength(1e3))),parameters:o.z.optional(o.z.object({type:o.z.literal("object"),properties:o.z.record(o.z.string().check(o.z.minLength(1),o.z.maxLength(64)),o.z.object({type:o.z.enum(["string","number","boolean","array","object"]),description:o.z.optional(o.z.string().check(o.z.maxLength(1e3))),items:o.z.optional(o.z.object({type:o.z.enum(["string","number","boolean","object"]),description:o.z.optional(o.z.string().check(o.z.maxLength(1e3)))}))})),required:o.z.optional(o.z.array(o.z.string().check(o.z.minLength(1),o.z.maxLength(64)))),additionalProperties:o.z.literal(!1)})),strict:o.z.boolean()})),processError:o.z.boolean(),processTimeout:o.z.boolean(),timeoutDuration:m.check(o.z.trim(),o.z.minLength(1))}).check(o.z.refine(n=>!n.streamResponse||n.provider==="openai",{error:"Streaming is only supported for OpenAI provider"}),o.z.refine(n=>!n.streamResponse||n.streamSettings!==void 0,{error:'Missing "Stream settings" for response streaming mode'}),o.z.refine(n=>n.typeOfStep!=="chat"||n.customHistory||!n.switchAssistantsMessage||n.assistantsFirstMessage!==void 0,{error:`Missing "Assistant's first message" value`}),o.z.refine(n=>n.customHistory||n.userMessage!==void 0,{error:'Missing "User message" value'}),o.z.refine(n=>n.typeOfStep!=="chat"||!n.customHistory||n.historyMode!==void 0,{error:'Missing "History mode" value'}),o.z.refine(n=>n.typeOfStep!=="chat"||!n.customHistory||n.historyMode!=="mergefield"||n.historyMergefield!==void 0,{error:'Missing "History" data via merge-field'}),o.z.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'}),o.z.refine(n=>n.typeOfStep!=="chat"||!n.customHistory||n.historyMode!=="codeHistory"||n.historyCode!==void 0,{error:'Missing "History" data as code'}),o.z.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 O(n){return o.z.pipe(o.z.union([o.z.undefined(),o.z.literal(""),n]),o.z.transform(e=>e===""?void 0:e))}h(O,"optionalStrValue");var le=R(require("openai")),ce=R(require("timestring")),P=require("zod/v4-mini"),he=require("typescript-memoize"),de=R(require("@onereach/flow-sdk/services/basic"));function be(n,e,t,s){var a=arguments.length,r=a<3?e:s===null?s=Object.getOwnPropertyDescriptor(e,t):s,l;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")r=Reflect.decorate(n,e,t,s);else for(var c=n.length-1;c>=0;c--)(l=n[c])&&(r=(a<3?l(r):a>3?l(e,t,r):l(e,t))||r);return a>3&&r&&Object.defineProperty(e,t,r),r}h(be,"_ts_decorate");function ae(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)}h(ae,"_ts_metadata");var x=class extends de.default{static{h(this,"OpenAIRequestService")}data;constructor(e,t){super(e),this.data=t,this.log.DEBUG?.("OpenAIRequestService initialized")}async makeOpenAiRequest(e){let{model:t,temperature:s,topP:a,maxTokens:r,frequencyPenalty:l,presencePenalty:c,n:S,streamResponse:b}=this.data,y={messages:structuredClone(e),model:t,temperature:s,top_p:a,max_tokens:r,frequency_penalty:l,presence_penalty:c,stop:this.stopSequences,n:S,stream:b,tools:this.tools};this.log.DEBUG?.("LLM request",y);let A=await this.openAiClient.chat.completions.create(y);return b||this.log.DEBUG?.("LLM response",A),A}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,tokenName:t,tokenNameHeader:s,sessionIdHeader:a}=this.data,r={baseURL:`${this.config.env.OPENAI_API_URL}/${e}`,apiKey:"",defaultHeaders:{Authorization:this.config.authorization,[a]:this.session.get(["reporting","sessionId"]),...t?{[s]:t}:null},timeout:this.timeoutMs};return this.log.DEBUG?.("OpenAI client options",r),new le.default(r)}get stopSequences(){return(this.data.stop??[]).map(t=>t.token).filter(t=>t.length>0)}get timeoutMs(){let e=(0,ce.default)(this.data.timeoutDuration,"ms");return P.z.number().check(P.z.int(),P.z.gte(1e3),P.z.lte(6e5)).parse(e)}};be([(0,he.Memoize)(),ae("design:type",Number),ae("design:paramtypes",[])],x.prototype,"timeoutMs",null);var fe=require("typescript-memoize");var ue=require("fs/promises");async function pe(n){if(typeof n!="string"||!n.match(/^\d+\.\d+\.\d+$/))throw new Error(`Invalid minimum version format: ${n}`);let e=require.resolve("@onereach/flow-sdk/package.json");if(!e)throw new Error("Could not find package.json for @onereach/flow-sdk");let t=await(0,ue.readFile)(e,"utf-8"),{version:s}=JSON.parse(t),{groups:a}=s.match(/^(?<major>\d+)\.(?<minor>\d+)\.(?<patch>\d+)/)||{};if(!a)throw new Error(`Invalid Flow SDK version format: ${s}`);let r=parseInt(a.major,10),l=parseInt(a.minor,10),c=parseInt(a.patch,10),[S,b,y]=n.split(".").map(A=>parseInt(A,10));if(r<S||r===S&&l<b||r===S&&l===b&&c<y)throw new Error(`Flow SDK version '${s}' is lower than required minimum version '${n}' for the step`)}h(pe,"validateFlowSdkVersion");var z=require("@onereach/flow-sdk/types");function j(n,e,t,s){var a=arguments.length,r=a<3?e:s===null?s=Object.getOwnPropertyDescriptor(e,t):s,l;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")r=Reflect.decorate(n,e,t,s);else for(var c=n.length-1;c>=0;c--)(l=n[c])&&(r=(a<3?l(r):a>3?l(e,t,r):l(e,t))||r);return a>3&&r&&Object.defineProperty(e,t,r),r}h(j,"_ts_decorate");function g(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)}h(g,"_ts_metadata");var Ie="8.0.15",v=class extends me.default{static{h(this,"CreateChatCompletionStep")}async resolveDataIn(){let e=await super.resolveDataIn();return this.log.DEBUG?.("data in before validation",e),ie.parse(e)}runStep(){let{streamResponse:e}=this.data;e&&this.triggers.hook({name:z.ACTION.end,thread:E.getThreadId(this)},this.onStreamControllerThreadEnd),this.triggers.hook({name:z.ACTION.end,thread:f.getThreadId(this)},this.onToolsControllerEnd),this.triggers.otherwise(this.initRequest)}async initRequest(){await pe(Ie),this.state.contentReady=!1,this.state.toolsReady=!1,this.state.chatCompletion=void 0,this.state.toolsResults=[];let{streamResponse:e}=this.data;await Promise.all([f.start(this),e?E.start(this):void 0,k.start(this)]),await k.prepareHistory(this);let t=await this.openAiService.makeOpenAiRequest(this.history);e?await this.handleStreamResponse(t):await this.handleResponse(t)}async handleResponse(e){this.state.chatCompletion=e,this.state.contentReady=!0,e.choices.length>1&&this.log.WARN?.("Multiple choices received from LLM, but only the first one will be processed",{choicesNumber:e.choices.length});let s=e.choices[0]?.message.tool_calls??[];for(let a of s)await f.callTool(this,a);await f.lastToolCallReceived(this)}async handleStreamResponse(e){this.log.DEBUG?.("Start processing stream of chunks from LLM");for await(let t of e)await E.handleChunk(this,t);await E.lastChunkReceived(this)}async onToolsControllerEnd(e){let{result:t}=e.params;if(this.log.DEBUG?.("Tools controller ended with messages",t),t instanceof Error)throw new d("Tools controller thread ended with an error",t,{code:u.STEP_LOGIC_ISSUE});let{status:s,messages:a}=t??{};if(s!=="ok"||!Array.isArray(a))throw new d("Unexpected end of the tools controller thread",{code:u.STEP_LOGIC_ISSUE,data:e.params.result});this.state.toolsResults=a,this.state.toolsReady=!0,await this.tryToExitStep()}async onStreamControllerThreadEnd(e){let{result:t}=e.params;if(this.log.DEBUG?.("Stream controller ended with result",t),t instanceof Error)throw new d("Stream controller thread ended with an error",t,{code:u.STEP_LOGIC_ISSUE});let{status:s,completion:a}=t??{};if(s!=="ok"||a==null)throw new d("Unexpected end of the stream controller thread",{code:u.STEP_LOGIC_ISSUE,data:e.params.result});this.log.DEBUG?.("Create Chat Completion result",a),this.state.contentReady=!0,this.state.chatCompletion=a,await this.tryToExitStep()}async tryToExitStep(){let{toolsReady:e,contentReady:t,chatCompletion:s,toolsResults:a}=this.state;if(!e||!t)return;if(s==null)throw new d("Missing chat completion result, but request is marked as processed",{code:u.STEP_LOGIC_ISSUE});let r=s.choices?.[0]?.message;if(r==null)throw new d("Missing completion message in chat completion result",{code:u.STEP_LOGIC_ISSUE});if(await k.appendToHistory(this,[r,...a]),s?.choices?.[0]?.finish_reason==="tool_calls"){this.thread.jumpTo(this.currentStepId);return}if(s==null)throw new d("Missing chat completion result, but request is marked as processed",{code:u.STEP_LOGIC_ISSUE});this.log.DEBUG?.("Exiting step with collected data",s),this.exitStep("next",{...s,_history:this.history})}get history(){return k.getHistory(this)}get openAiService(){return new x(this.thread,this.data)}};j([p,g("design:type",Function),g("design:paramtypes",[]),g("design:returntype",Promise)],v.prototype,"resolveDataIn",null);j([p,g("design:type",Function),g("design:paramtypes",[]),g("design:returntype",void 0)],v.prototype,"runStep",null);j([p,g("design:type",Function),g("design:paramtypes",[]),g("design:returntype",Promise)],v.prototype,"initRequest",null);j([p,g("design:type",Function),g("design:paramtypes",[typeof IActionEvent>"u"?Object:IActionEvent]),g("design:returntype",Promise)],v.prototype,"onToolsControllerEnd",null);j([p,g("design:type",Function),g("design:paramtypes",[typeof IActionEvent>"u"?Object:IActionEvent]),g("design:returntype",Promise)],v.prototype,"onStreamControllerThreadEnd",null);j([(0,fe.Memoize)(),g("design:type",typeof x>"u"?Object:x),g("design:paramtypes",[])],v.prototype,"openAiService",null);(0,ge.install)();var Ce=v,Le={[k.class]:k,[f.class]:f,[C.class]:C,[E.class]:E,[w.class]:w};0&&(module.exports={states,step});
|
|
1
|
+
"use strict";var ke=Object.create;var U=Object.defineProperty;var we=Object.getOwnPropertyDescriptor;var ve=Object.getOwnPropertyNames;var Re=Object.getPrototypeOf,Se=Object.prototype.hasOwnProperty;var h=(n,e)=>U(n,"name",{value:e,configurable:!0});var be=(n,e)=>{for(var t in e)U(n,t,{get:e[t],enumerable:!0})},J=(n,e,t,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let i of ve(e))!Se.call(n,i)&&i!==t&&U(n,i,{get:()=>e[i],enumerable:!(r=we(e,i))||r.enumerable});return n};var R=(n,e,t)=>(t=n!=null?ke(Re(n)):{},J(e||!n||!n.__esModule?U(t,"default",{value:n,enumerable:!0}):t,n)),Ie=n=>J(U({},"__esModule",{value:!0}),n);var Ne={};be(Ne,{states:()=>Ue,step:()=>Me});module.exports=Ie(Ne);var Te=require("source-map-support");var _e=R(require("@onereach/flow-sdk/step"));var Z=R(require("@onereach/flow-sdk/step"));function G(n,e){function t(r,i,s,l){let c=n(r,i,s,l);if(typeof c=="function"){let f=l.value,E=c;if(f?.name!=null)try{Object.defineProperty(E,"name",{value:f.name})}catch{}return l.value=E,l}return c??l}return h(t,"runApply"),h(function(i,s,l){if(i!==null&&typeof i=="object"&&(typeof s=="string"||typeof s=="symbol")&&l!==null&&typeof l=="object")return t(e,i,s,l);{let c=i??e;return(f,E,g)=>t(c,f,E,g)}},"decoratorOrFactory")}h(G,"createMethodDecoratorWithOptionalArgs");var q=R(require("@onereach/flow-sdk/errors/timeout")),W=require("zod/v4-mini");var Q=R(require("@onereach/flow-sdk/errors/base"));var d=function(n){return 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}({}),u=class extends Q.default{static{h(this,"CreateChatCompletionStepError")}};function N(n){if(n instanceof u||n instanceof q.default)return n;if(n instanceof W.z.core.$ZodError)return new u(W.z.prettifyError(n),n,{code:d.VALIDATION});if(n instanceof Error){if(n.message.includes("Request timed out"))return new q.default("Timeout",n,{code:d.TIMEOUT});if(n.message.includes("API key is required"))return new u("API key is required",n,{code:d.AUTH});let e=n?.response?.data?.error?.message;if(e!=null)return new u(e,n,{code:d.SERVER_ERROR})}return typeof n=="string"?new u(n,{code:d.UNKNOWN}):n instanceof Error?new u("Unknown error",n,{code:d.UNKNOWN}):new u("Unknown error",{code:d.UNKNOWN,data:n})}h(N,"errorFilter");var Ce={},p=G((n,e,t,r)=>{let i=r.value;if(!(!i||typeof i!="function"))return function(...s){try{let l=i.apply(this,s);return l instanceof Promise?l.catch(c=>{let f=t.toString();throw this.log.DEBUG?.(`Error in method '${f}'`,c),N(c)}):l}catch(l){let c=t.toString();throw this.log.DEBUG?.(`Error in method '${c}'`,l),N(l)}}},Ce);function $(n,e,t,r){var i=arguments.length,s=i<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,l;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")s=Reflect.decorate(n,e,t,r);else for(var c=n.length-1;c>=0;c--)(l=n[c])&&(s=(i<3?l(s):i>3?l(e,t,s):l(e,t))||s);return i>3&&s&&Object.defineProperty(e,t,s),s}h($,"_ts_decorate");function I(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)}h(I,"_ts_metadata");var v=class extends Z.default{static{h(this,"HistoryController")}static class="hst_ctrl";static async start(e){let t=this.getThreadId(e);e.process.getThread(t)==null&&await e.thread.runThread({id:t,background:!0,state:{step:e.id,class:this.class,messages:[]}})}static async prepareHistory(e){await e.process.enqueueAndRun({thread:this.getThreadId(e),name:"hst_prepare"})}static async appendToHistory(e,t){await e.process.enqueueAndRun({thread:this.getThreadId(e),name:"hst_append",params:{message:t}})}static getHistory(e){return e.process.getSafeThread(this.getThreadId(e)).state.messages}static getThreadId(e){return`llm_cmp_${this.class}_${e.id}`}runStep(){this.triggers.local("hst_prepare",this.onPrepareHistory).local("hst_append",this.onAppendToHistory).otherwise(()=>{this.log.DEBUG?.("Initializing history controller thread")})}onPrepareHistory(){this.log.DEBUG?.("Preparing history");let{customHistory:e,historyLength:t,systemMessage:r,typeOfStep:i,userMessage:s,historyMode:l,historyMergefield:c,historyCode:f,assistantsFirstMessage:E}=this.data;if(i==="completion"){this.state.messages=[{role:"user",content:s}];return}if(e){this.state.messages=l==="mergefield"?c:f;return}let g=this.state.messages;if(g.length===0&&E!=null&&E.length>0&&g.push({role:"assistant",content:E}),g.at(-1)?.role!=="tool"&&g.push({role:"user",content:s}),!g.some(F=>F.role==="tool")&&t!=null&&t>0&&(g=g.slice(-1*t)),r!=null&&r.length>0){let F={role:"system",content:r};g[0]?.role==="system"?g[0]=F:g.unshift(F)}this.state.messages=g}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)}};$([p,I("design:type",Function),I("design:paramtypes",[]),I("design:returntype",void 0)],v.prototype,"runStep",null);$([p,I("design:type",Function),I("design:paramtypes",[]),I("design:returntype",void 0)],v.prototype,"onPrepareHistory",null);$([p,I("design:type",Function),I("design:paramtypes",[typeof IEvent>"u"?Object:IEvent]),I("design:returntype",void 0)],v.prototype,"onAppendToHistory",null);var ie=R(require("@onereach/flow-sdk/step"));var Y=R(require("@onereach/flow-sdk/step"));var X=require("@onereach/flow-sdk/types");async function O(n,{id:e,state:t,...r}){let i=n.process.getThread(e);if(n.log.DEBUG?.(`runThread: thread with id '${e}'`,r),i==null)return await n.thread.runThread({id:e,background:!0,state:t,...r});if(!i.ended)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 await i.enqueueAndRun({name:X.ACTION.goto,state:t})}h(O,"runThread");function Oe(n,e,t,r){var i=arguments.length,s=i<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,l;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")s=Reflect.decorate(n,e,t,r);else for(var c=n.length-1;c>=0;c--)(l=n[c])&&(s=(i<3?l(s):i>3?l(e,t,s):l(e,t))||s);return i>3&&s&&Object.defineProperty(e,t,s),s}h(Oe,"_ts_decorate");function z(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)}h(z,"_ts_metadata");var S=class extends Y.default{static{h(this,"StreamWorker")}static class="str_wrk";static async start(e,t){await O(e,{id:this.getThreadId(e),state:{step:e.id,class:this.class,event:t}})}static isBusy(e){let t=this.getThread(e);return t!=null&&!t.ended}static getThread(e){let t=this.getThreadId(e);return e.process.getThread(t)}static getThreadId(e){return`llm_cmp_${this.class}_${e.id}`}runStep(){if(!("event"in this.state)||this.state.event==null)throw new u("Stream worker thread state must contain an event to process",{code:d.STEP_LOGIC_ISSUE});let e=this.state.event;this.log.DEBUG?.("Executing stream worker thread",e),this.exitStep("chunk",{chunk:e})}};Oe([p,z("design:type",Function),z("design:paramtypes",[]),z("design:returntype",void 0)],S.prototype,"runStep",null);var te=require("@onereach/flow-sdk/types");var Le={allowHandleError:!0,useErrorFilter:!0},x=G((n,e,t,r)=>{let i=r.value;if(!(!i||typeof i!="function"))return function(...s){try{let l=i.apply(this,s);return l instanceof Promise?l.catch(c=>ee.call(this,n,c,t)):l}catch(l){return ee.call(this,n,l,t)}}},Le);function ee(n,e,t){let r=t.toString();this.log.DEBUG?.(`Error in method '${r}'`,e);let i=n.useErrorFilter?N(e):e;if(i instanceof Error)if(n.allowHandleError){this.thread.enqueue({name:te.ACTION.error,error:i});return}else{this.end(i);return}throw i}h(ee,"errorHandler");var oe=R(require("@onereach/flow-sdk/step"));var ne=R(require("@onereach/flow-sdk/step"));function xe(n,e,t,r){var i=arguments.length,s=i<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,l;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")s=Reflect.decorate(n,e,t,r);else for(var c=n.length-1;c>=0;c--)(l=n[c])&&(s=(i<3?l(s):i>3?l(e,t,s):l(e,t))||s);return i>3&&s&&Object.defineProperty(e,t,s),s}h(xe,"_ts_decorate");function V(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)}h(V,"_ts_metadata");var C=class extends ne.default{static{h(this,"ToolsWorker")}static class="tl_wrk";static async start(e,t){let r=JSON.parse(t.function?.arguments);await O(e,{id:this.getThreadId(t),state:{step:e.id,class:this.class},local:{toolCall:t,parsedArguments:r}})}static getThreadId(e){return`llm_cmp_${this.class}_${e.id}`}runStep(){let{toolCall:e,parsedArguments:t}=this.local;this.log.DEBUG?.("Initializing tool worker thread",e),this.exitStep(this.getExitName(),{toolCall:{id:e.id,type:e.type,function:{name:e.function.name,arguments:t}}})}getExitName(){return"function"}};xe([p,V("design:type",Function),V("design:paramtypes",[]),V("design:returntype",void 0)],C.prototype,"runStep",null);var re=require("@onereach/flow-sdk/types");function D(n,e,t,r){var i=arguments.length,s=i<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,l;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")s=Reflect.decorate(n,e,t,r);else for(var c=n.length-1;c>=0;c--)(l=n[c])&&(s=(i<3?l(s):i>3?l(e,t,s):l(e,t))||s);return i>3&&s&&Object.defineProperty(e,t,s),s}h(D,"_ts_decorate");function T(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)}h(T,"_ts_metadata");var y=class extends oe.default{static{h(this,"ToolsController")}static class="tl_ctrl";static async start(e){let t=this.getThreadId(e);await O(e,{id:t,state:{step:e.id,class:this.class,tasks:{},expectMoreTasks:!0}})}static async callTool(e,t){await e.process.enqueueAndRun({thread:this.getThreadId(e),name:"tl_run_call",params:{toolCall:t}})}static async lastToolCallReceived(e){await e.process.enqueueAndRun({thread:this.getThreadId(e),name:"tl_rsp_end"})}static getThreadId(e){return`llm_cmp_${this.class}_${e.id}`}runStep(){this.triggers.local("tl_run_call",this.onCallTool).local("tl_rsp_end",this.onLastToolCallReceived).otherwise(this.initialize)}initialize(){this.log.DEBUG?.("Initializing tools controller thread"),this.validateMergeFieldType()}onCallTool(e){let{toolCall:t}=e.params;if(t.type!=="function")throw new u("Only function tools are supported at the moment",{code:d.UNSUPPORTED});this.state.tasks[t.id]={call:t,status:"pending"},this.startToolWorkerThread(t)}onLastToolCallReceived(){this.log.DEBUG?.("No more tool calls expected",this.state.tasks),this.state.expectMoreTasks=!1,this.tryEndToolsControllerThread()}startToolWorkerThread(e){this.triggers.hook({name:re.ACTION.end,thread:C.getThreadId(e)},this.onWorkerThreadEnd),C.start(this,e)}onWorkerThreadEnd(e){this.log.DEBUG?.("Tool caller worker thread has ended",e);let{result:t}=e.params;if(t==null)throw new u("Tool worker ended unexpectedly",{code:d.STEP_LOGIC_ISSUE});if(t instanceof Error)throw new u("Tool worker thread ended with error",t,{code:d.STEP_LOGIC_ISSUE});this.log.DEBUG?.("Tool worker thread completed successfully",{toolCallId:t.toolCallId,result:t.data}),this.setToolCallResult(t.toolCallId,t.data),this.tryEndToolsControllerThread()}setToolCallResult(e,t){let r=this.state.tasks[e];if(r==null)throw new u(`Unknown tool call with id '${e}'`,{code:d.STEP_LOGIC_ISSUE});r.status="completed",r.result=t}tryEndToolsControllerThread(){this.state.expectMoreTasks||Object.values(this.state.tasks).some(t=>t.status==="pending")||(this.log.DEBUG?.("All tool calls completed or failed",this.state.tasks),this.end({status:"ok",messages:this.messages}))}get messages(){return Object.values(this.state.tasks).map(e=>({role:"tool",tool_call_id:e.call.id,content:JSON.stringify(e.result)}))}validateMergeFieldType(){let{functionsList:e}=this.data;if(!(!Array.isArray(e)||e.length===0)&&(this.dataOut==null||this.getMergeField(this.dataOut).type!=="thread"))throw new u('Merge-field type has to be "Thread" if you are using functions',{code:d.VALIDATION})}};D([p,T("design:type",Function),T("design:paramtypes",[]),T("design:returntype",void 0)],y.prototype,"runStep",null);D([p,T("design:type",Function),T("design:paramtypes",[]),T("design:returntype",void 0)],y.prototype,"initialize",null);D([p,T("design:type",Function),T("design:paramtypes",[typeof IEvent>"u"?Object:IEvent]),T("design:returntype",void 0)],y.prototype,"onCallTool",null);D([p,T("design:type",Function),T("design:paramtypes",[]),T("design:returntype",void 0)],y.prototype,"onLastToolCallReceived",null);D([x({allowHandleError:!1}),T("design:type",Function),T("design:paramtypes",[typeof IActionEvent>"u"?Object:IActionEvent]),T("design:returntype",void 0)],y.prototype,"onWorkerThreadEnd",null);var a=require("zod/v4-mini"),se=a.z.object({name:a.z.string(),params:a.z.object({chunk:a.z.object({id:a.z.string(),object:a.z.literal("chat.completion.chunk"),created:a.z.number(),model:a.z.string(),service_tier:a.z.optional(a.z.union([a.z.literal("default"),a.z.literal("auto"),a.z.literal("flex"),a.z.literal("scale"),a.z.literal("priority"),a.z.null()])),system_fingerprint:a.z.optional(a.z.string()),choices:a.z.array(a.z.object({index:a.z.number(),delta:a.z.object({role:a.z.optional(a.z.enum(["developer","system","user","assistant","tool"])),content:a.z.optional(a.z.string()),refusal:a.z.nullish(a.z.string()),tool_calls:a.z.optional(a.z.array(a.z.object({index:a.z.number().check(a.z.int(),a.z.gte(0)),id:a.z.optional(a.z.string()),type:a.z.optional(a.z.literal("function")),function:a.z.object({name:a.z.optional(a.z.string()),arguments:a.z.optional(a.z.string())})})))}),logprobs:a.z.optional(a.z.any()),finish_reason:a.z.union([a.z.literal("stop"),a.z.literal("length"),a.z.literal("tool_calls"),a.z.literal("content_filter"),a.z.null()])})),logprobs:a.z.nullish(a.z.object({content:a.z.nullable(a.z.array(a.z.looseObject({}))),refusal:a.z.nullable(a.z.array(a.z.looseObject({})))})),usage:a.z.nullish(a.z.object({prompt_tokens:a.z.number(),completion_tokens:a.z.number(),total_tokens:a.z.number(),completion_tokens_details:a.z.optional(a.z.object({accepted_prediction_tokens:a.z.optional(a.z.number()),audio_tokens:a.z.optional(a.z.number()),reasoning_tokens:a.z.optional(a.z.number()),rejected_prediction_tokens:a.z.optional(a.z.number())})),prompt_tokens_details:a.z.optional(a.z.object({audio_tokens:a.z.optional(a.z.number()),cached_tokens:a.z.optional(a.z.number())}))}))})})});var B=class{static{h(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,...s}=t;r=s,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!=null){let{content:i,...s}=t.delta;r.message??=s,r.message.content??="",r.message.content+=i}if(t.delta?.tool_calls!=null){let{tool_calls:i,...s}=t.delta;r.message??=s,r.message.tool_calls??=[];for(let l of t.delta.tool_calls){let c=l.index;if(r.message.tool_calls[c]==null)r.message.tool_calls[c]=structuredClone(l);else{let f=r.message.tool_calls[c];if(!("function"in f)||f.function==null)continue;f.function.arguments+=l.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{}}};var ae=require("@onereach/flow-sdk/types");function P(n,e,t,r){var i=arguments.length,s=i<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,l;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")s=Reflect.decorate(n,e,t,r);else for(var c=n.length-1;c>=0;c--)(l=n[c])&&(s=(i<3?l(s):i>3?l(e,t,s):l(e,t))||s);return i>3&&s&&Object.defineProperty(e,t,s),s}h(P,"_ts_decorate");function k(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)}h(k,"_ts_metadata");var w=class extends ie.default{static{h(this,"StreamController")}static class="str_ctrl";static async start(e){await O(e,{id:this.getThreadId(e),state:{step:e.id,class:this.class,completionResult:{},events:[],lastChunkReceived:!1,index:-1,skipIndexWarning:!1}})}static async handleChunk(e,t){await e.process.enqueueAndRun({thread:this.getThreadId(e),name:"add_chunk",params:{chunk:t}})}static async lastChunkReceived(e){await e.process.enqueueAndRun({thread:this.getThreadId(e),name:"llm_rsp_end"})}static getThreadId(e){return`llm_cmp_${this.class}_${e.id}`}runStep(){this.triggers.hook({name:ae.ACTION.end,thread:S.getThreadId(this)},this.onWorkerThreadEnd).local("add_chunk",this.onStreamChunk).local("llm_rsp_end",this.onLastStreamChunkReceived).otherwise(()=>{this.log.DEBUG?.("Initializing stream controller thread")})}onWorkerThreadEnd(e){this.log.DEBUG?.("Stream worker thread finished processing chunk",e.params.result),this.tryRunWorker()}onStreamChunk(e){let r=se.parse(e).params.chunk;new B(this.state.completionResult,this.onToolCall.bind(this)).reduceChunk(r);for(let s of r.choices){if(this.log.DEBUG?.("LLM stream response chunk",s),s.index>0){this.handleMultipleChoices(s);continue}let l=s.delta?.content;l!=null&&l.length>0&&(this.addContentToQueue(l),this.scheduleNextContentEvent()),this.handleLengthFinishReason(s)}}handleMultipleChoices(e){this.state.skipIndexWarning||(this.log.WARN?.("Multiple choices received from LLM, but only the first one will be processed",{choiceIndex:e.index}),this.state.skipIndexWarning=!0)}handleLengthFinishReason(e){if(e.finish_reason==="length")throw new u("Reached limit of tokens for LLM completion response",{code:d.LLM_FINISH_LENGTH})}onToolCall(e){this.log.DEBUG?.("Tool call received",e),y.callTool(this,e)}scheduleNextContentEvent(){let e=this.state.events[0];e==null||!this.isEventReady(e)||"lastChunkReceived"in e||this.tryRunWorker()}addContentToQueue(e){let t=this.state.events.at(-1);if(t!=null){if("lastChunkReceived"in t){this.log.WARN?.("A new chunk received after the `lastChunkReceived` event. Ignoring it.");return}if(t.content.length<this.maxChunkContentLength){let 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(S.isBusy(this)){this.log.DEBUG?.("Skip event processing. Worker thread is busy");return}let e=this.getEventToProcess();if(e!=null){if("lastChunkReceived"in e){this.log.DEBUG?.("Stopping controller thread. All response content chunks were processed and no new chunks are coming"),this.end({status:"ok",completion:this.state.completionResult});return}this.log.DEBUG?.("Notify stream worker thread about response chunk to process",e),S.start(this,e)}}isEventReady(e){if(e==null)return!1;if("lastChunkReceived"in e)return!0;if(e.content==null)return!1;let t=Date.now()-e.ts;return this.state.lastChunkReceived||t>=this.debounceDuration||e.content.length>=this.maxChunkContentLength}getEventToProcess(){let e=this.state.events[0];if(e!=null&&this.isEventReady(e))return"lastChunkReceived"in e||this.state.events.shift(),e}async onLastStreamChunkReceived(){this.log.DEBUG?.("All LLM response chunks were received. No more response chunks expected"),this.state.events.push({lastChunkReceived:!0}),this.state.lastChunkReceived=!0,this.tryRunWorker(),await y.lastToolCallReceived(this)}get maxChunkContentLength(){return this.data.streamSettings?.maxBufferLength??100}get debounceDuration(){return this.data.streamSettings?.debounceDuration??200}};P([p,k("design:type",Function),k("design:paramtypes",[]),k("design:returntype",void 0)],w.prototype,"runStep",null);P([x({allowHandleError:!1}),k("design:type",Function),k("design:paramtypes",[typeof IActionEvent>"u"?Object:IActionEvent]),k("design:returntype",void 0)],w.prototype,"onWorkerThreadEnd",null);P([p,k("design:type",Function),k("design:paramtypes",[typeof IEvent>"u"?Object:IEvent]),k("design:returntype",void 0)],w.prototype,"onStreamChunk",null);P([p,k("design:type",Function),k("design:paramtypes",[]),k("design:returntype",void 0)],w.prototype,"tryRunWorker",null);P([p,k("design:type",Function),k("design:paramtypes",[]),k("design:returntype",Promise)],w.prototype,"onLastStreamChunkReceived",null);var o=require("zod/v4-mini"),ce=require("zod/v4/locales");o.z.config((0,ce.en)());var m=o.z.string().check(o.z.trim(),o.z.refine(n=>!["undefined","null"].includes(n),{error:"Unexpected undefined or null merge-field value"})),le=o.z.discriminatedUnion("role",[o.z.object({role:o.z.literal("system"),content:m}),o.z.object({role:o.z.literal("user"),content:m,name:o.z.optional(m.check(o.z.minLength(1),o.z.maxLength(64)))}),o.z.object({role:o.z.literal("assistant"),content:o.z.nullable(m),tool_calls:o.z.optional(o.z.array(o.z.object({id:m.check(o.z.minLength(1)),type:o.z.literal("function"),function:o.z.object({name:m.check(o.z.minLength(1)),arguments:m.check(o.z.minLength(1))})})))}),o.z.object({role:o.z.literal("tool"),content:m,name:o.z.optional(m.check(o.z.minLength(1),o.z.maxLength(64))),tool_call_id:m.check(o.z.minLength(1))})]),he=o.z.object({provider:m.check(o.z.minLength(1)),model:m.check(o.z.minLength(1)),tokenName:L(m),tokenNameHeader:o.z._default(m.check(o.z.minLength(1)),"x-or-account-token-name"),sessionIdHeader:o.z._default(m.check(o.z.minLength(1)),"x-or-session-id"),typeOfStep:o.z.enum(["chat","completion"]),systemMessage:o.z.optional(m),userMessage:o.z.optional(m),switchAssistantsMessage:o.z._default(o.z.boolean(),!1),assistantsFirstMessage:o.z.optional(m),temperature:L(o.z.coerce.number().check(o.z.gte(0),o.z.lte(2))),topP:L(o.z.coerce.number().check(o.z.gte(0),o.z.lte(1))),maxTokens:L(o.z.coerce.number().check(o.z.int(),o.z.gte(1))),presencePenalty:L(o.z.coerce.number().check(o.z.gte(-2),o.z.lte(2))),frequencyPenalty:L(o.z.coerce.number().check(o.z.gte(-2),o.z.lte(2))),n:L(o.z.coerce.number().check(o.z.int(),o.z.gte(1),o.z.lte(128))),stop:o.z.optional(o.z.array(o.z.object({token:o.z.string().check(o.z.minLength(1),o.z.maxLength(64))})).check(o.z.maxLength(4))),streamResponse:o.z._default(o.z.boolean(),!1),streamSettings:o.z.optional(o.z.object({maxBufferLength:o.z.coerce.number().check(o.z.overwrite(n=>n===0?50:n),o.z.int(),o.z.gte(1),o.z.lte(32768)),debounceDuration:o.z.coerce.number().check(o.z.int(),o.z.gte(0),o.z.lte(1e4))})),customHistory:o.z._default(o.z.boolean(),!1),historyLength:L(o.z.coerce.number().check(o.z.int(),o.z.gte(1),o.z.lte(100))),historyMode:o.z.optional(o.z.enum(["mergefield","codeHistory"])),historyMergefield:o.z.optional(o.z.array(le)),historyCode:o.z.optional(o.z.array(le)),functionsList:o.z.array(o.z.object({name:m.check(o.z.minLength(1),o.z.maxLength(64)),description:o.z.optional(m.check(o.z.maxLength(1e3))),parameters:o.z.optional(o.z.object({type:o.z.literal("object"),properties:o.z.record(o.z.string().check(o.z.minLength(1),o.z.maxLength(64)),o.z.object({type:o.z.enum(["string","number","boolean","array","object"]),description:o.z.optional(o.z.string().check(o.z.maxLength(1e3))),items:o.z.optional(o.z.object({type:o.z.enum(["string","number","boolean","object"]),description:o.z.optional(o.z.string().check(o.z.maxLength(1e3)))}))})),required:o.z.optional(o.z.array(o.z.string().check(o.z.minLength(1),o.z.maxLength(64)))),additionalProperties:o.z.literal(!1)})),strict:o.z.boolean()})),processError:o.z.boolean(),processTimeout:o.z.boolean(),timeoutDuration:m.check(o.z.trim(),o.z.minLength(1))}).check(o.z.refine(n=>!n.streamResponse||n.provider==="openai",{error:"Streaming is only supported for OpenAI provider"}),o.z.refine(n=>!n.streamResponse||n.streamSettings!==void 0,{error:'Missing "Stream settings" for response streaming mode'}),o.z.refine(n=>n.typeOfStep!=="chat"||n.customHistory||!n.switchAssistantsMessage||n.assistantsFirstMessage!==void 0,{error:`Missing "Assistant's first message" value`}),o.z.refine(n=>n.customHistory||n.userMessage!==void 0,{error:'Missing "User message" value'}),o.z.refine(n=>n.typeOfStep!=="chat"||!n.customHistory||n.historyMode!==void 0,{error:'Missing "History mode" value'}),o.z.refine(n=>n.typeOfStep!=="chat"||!n.customHistory||n.historyMode!=="mergefield"||n.historyMergefield!==void 0,{error:'Missing "History" data via merge-field'}),o.z.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'}),o.z.refine(n=>n.typeOfStep!=="chat"||!n.customHistory||n.historyMode!=="codeHistory"||n.historyCode!==void 0,{error:'Missing "History" data as code'}),o.z.refine(n=>n.typeOfStep!=="chat"||!n.customHistory||n.historyMode!=="codeHistory"||n.historyCode?.find?.(e=>e.role==="user"),{error:'Missing at least one message with role "user" message in "History" data via code'}));function L(n){return o.z.pipe(o.z.union([o.z.undefined(),o.z.literal(""),n]),o.z.transform(e=>e===""?void 0:e))}h(L,"optionalStrValue");var de=R(require("openai")),pe=R(require("timestring")),H=require("zod/v4-mini"),me=require("typescript-memoize"),fe=R(require("@onereach/flow-sdk/services/basic"));function Ae(n,e,t,r){var i=arguments.length,s=i<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,l;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")s=Reflect.decorate(n,e,t,r);else for(var c=n.length-1;c>=0;c--)(l=n[c])&&(s=(i<3?l(s):i>3?l(e,t,s):l(e,t))||s);return i>3&&s&&Object.defineProperty(e,t,s),s}h(Ae,"_ts_decorate");function ue(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)}h(ue,"_ts_metadata");var A=class extends fe.default{static{h(this,"OpenAIRequestService")}data;constructor(e,t){super(e),this.data=t,this.log.DEBUG?.("OpenAIRequestService initialized")}async makeOpenAiRequest(e){let{model:t,temperature:r,topP:i,maxTokens:s,frequencyPenalty:l,presencePenalty:c,n:f,streamResponse:E}=this.data,g={messages:structuredClone(e),model:t,temperature:r,top_p:i,max_tokens:s,frequency_penalty:l,presence_penalty:c,stop:this.stopSequences,n:f,stream:E,tools:this.tools};this.log.DEBUG?.("LLM request",g);let M=await this.openAiClient.chat.completions.create(g);return E||this.log.DEBUG?.("LLM response",M),M}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,tokenName:t,tokenNameHeader:r,sessionIdHeader:i}=this.data,s={baseURL:`${this.config.env.OPENAI_API_URL}/${e}`,apiKey:"",defaultHeaders:{Authorization:this.config.authorization,[i]:this.session.get(["reporting","sessionId"]),...t?{[r]:t}:null},timeout:this.timeoutMs};return this.log.DEBUG?.("OpenAI client options",s),new de.default(s)}get stopSequences(){return(this.data.stop??[]).map(t=>t.token).filter(t=>t.length>0)}get timeoutMs(){let e=(0,pe.default)(this.data.timeoutDuration,"ms");return H.z.number().check(H.z.int(),H.z.gte(1e3),H.z.lte(6e5)).parse(e)}};Ae([(0,me.Memoize)(),ue("design:type",Number),ue("design:paramtypes",[])],A.prototype,"timeoutMs",null);var Ee=require("typescript-memoize");var ge=require("fs/promises");async function ye(n){if(typeof n!="string"||!n.match(/^\d+\.\d+\.\d+$/))throw new Error(`Invalid minimum version format: ${n}`);let e=require.resolve("@onereach/flow-sdk/package.json");if(!e)throw new Error("Could not find package.json for @onereach/flow-sdk");let t=await(0,ge.readFile)(e,"utf-8"),{version:r}=JSON.parse(t),{groups:i}=r.match(/^(?<major>\d+)\.(?<minor>\d+)\.(?<patch>\d+)/)||{};if(!i)throw new Error(`Invalid Flow SDK version format: ${r}`);let s=parseInt(i.major??"0",10),l=parseInt(i.minor??"0",10),c=parseInt(i.patch??"0",10);if(s==null||l==null||c==null||isNaN(s)||isNaN(l)||isNaN(c))throw new Error(`Invalid version format: ${r}`);let[f,E,g]=n.split(".").map(M=>parseInt(M,10));if(f==null||E==null||g==null||isNaN(f)||isNaN(E)||isNaN(g))throw new Error(`Invalid minimum version format: ${n}`);if(s<f||s===f&&l<E||s===f&&l===E&&c<g)throw new Error(`Flow SDK version '${r}' is lower than required minimum version '${n}' for the step`)}h(ye,"validateFlowSdkVersion");var K=require("@onereach/flow-sdk/types");function j(n,e,t,r){var i=arguments.length,s=i<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,l;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")s=Reflect.decorate(n,e,t,r);else for(var c=n.length-1;c>=0;c--)(l=n[c])&&(s=(i<3?l(s):i>3?l(e,t,s):l(e,t))||s);return i>3&&s&&Object.defineProperty(e,t,s),s}h(j,"_ts_decorate");function _(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)}h(_,"_ts_metadata");var je="8.0.20",b=class extends _e.default{static{h(this,"CreateChatCompletionStep")}async resolveDataIn(){let e=await super.resolveDataIn();return this.log.DEBUG?.("data in before validation",e),he.parse(e)}runStep(){let{streamResponse:e}=this.data;e&&this.triggers.hook({name:K.ACTION.end,thread:w.getThreadId(this)},this.onStreamControllerThreadEnd),this.triggers.hook({name:K.ACTION.end,thread:y.getThreadId(this)},this.onToolsControllerEnd),this.triggers.otherwise(this.initRequest)}async initRequest(){await ye(je),this.state.contentReady=!1,this.state.toolsReady=!1,this.state.chatCompletion=void 0,this.state.toolsResults=[];let{streamResponse:e}=this.data;await Promise.all([y.start(this),e?w.start(this):void 0,v.start(this)]),await v.prepareHistory(this);let t=await this.openAiService.makeOpenAiRequest(this.history);e?await this.handleStreamResponse(t):await this.handleResponse(t)}async handleResponse(e){this.state.chatCompletion=e,this.state.contentReady=!0,e.choices.length>1&&this.log.WARN?.("Multiple choices received from LLM, but only the first one will be processed",{choicesNumber:e.choices.length});let r=e.choices[0]?.message.tool_calls??[];for(let i of r)await y.callTool(this,i);await y.lastToolCallReceived(this)}async handleStreamResponse(e){this.log.DEBUG?.("Start processing stream of chunks from LLM");for await(let t of e)await w.handleChunk(this,t);await w.lastChunkReceived(this)}async onToolsControllerEnd(e){let{result:t,thread:r}=e.params;if(this.log.DEBUG?.("Tools controller ended with messages",t),t instanceof Error||r.error instanceof Error){let l=t instanceof Error?t:r.error;throw new u("Tools controller thread ended with an error",l,{code:d.STEP_LOGIC_ISSUE})}let{status:i,messages:s}=t??{};if(i!=="ok"||!Array.isArray(s))throw new u("Unexpected end of the tools controller thread",{code:d.STEP_LOGIC_ISSUE,data:e.params.result});this.state.toolsResults=s,this.state.toolsReady=!0,await this.tryToExitStep()}async onStreamControllerThreadEnd(e){let{result:t,thread:r}=e.params;if(this.log.DEBUG?.("Stream controller ended with result",t),t instanceof Error||r.error instanceof Error){let l=t instanceof Error?t:r.error;throw new u("Stream controller thread ended with an error",l,{code:d.STEP_LOGIC_ISSUE})}let{status:i,completion:s}=t??{};if(i!=="ok"||s==null)throw new u("Unexpected end of the stream controller thread",{code:d.STEP_LOGIC_ISSUE,data:e.params.result});this.log.DEBUG?.("Create Chat Completion result",s),this.state.contentReady=!0,this.state.chatCompletion=s,await this.tryToExitStep()}async tryToExitStep(){let{toolsReady:e,contentReady:t,chatCompletion:r,toolsResults:i}=this.state;if(!e||!t)return;if(r==null)throw new u("Missing chat completion result, but request is marked as processed",{code:d.STEP_LOGIC_ISSUE});let s=r.choices?.[0]?.message;if(s==null)throw new u("Missing completion message in chat completion result",{code:d.STEP_LOGIC_ISSUE});if(await v.appendToHistory(this,[s,...i]),r?.choices?.[0]?.finish_reason==="tool_calls"){this.thread.jumpTo(this.currentStepId);return}if(r==null)throw new u("Missing chat completion result, but request is marked as processed",{code:d.STEP_LOGIC_ISSUE});this.log.DEBUG?.("Exiting step with collected data",r),this.exitStep("next",{...r,_history:this.history})}get history(){return v.getHistory(this)}get openAiService(){return new A(this.thread,this.data)}};j([p,_("design:type",Function),_("design:paramtypes",[]),_("design:returntype",Promise)],b.prototype,"resolveDataIn",null);j([p,_("design:type",Function),_("design:paramtypes",[]),_("design:returntype",void 0)],b.prototype,"runStep",null);j([p,_("design:type",Function),_("design:paramtypes",[]),_("design:returntype",Promise)],b.prototype,"initRequest",null);j([x,_("design:type",Function),_("design:paramtypes",[typeof IActionEvent>"u"?Object:IActionEvent]),_("design:returntype",Promise)],b.prototype,"onToolsControllerEnd",null);j([x,_("design:type",Function),_("design:paramtypes",[typeof IActionEvent>"u"?Object:IActionEvent]),_("design:returntype",Promise)],b.prototype,"onStreamControllerThreadEnd",null);j([(0,Ee.Memoize)(),_("design:type",typeof A>"u"?Object:A),_("design:paramtypes",[])],b.prototype,"openAiService",null);(0,Te.install)();var Me=b,Ue={[v.class]:v,[y.class]:y,[C.class]:C,[w.class]:w,[S.class]:S};0&&(module.exports={states,step});
|
|
2
2
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/step.ts","../src/layers/history/controller.ts","../src/errors/error_filter.ts","../src/errors/step_error.ts","../src/decorators/error_filter.ts","../src/layers/stream_handler/controller.ts","../src/layers/stream_handler/worker.ts","../src/utils/run_thread.ts","../src/layers/tools_caller/controller.ts","../src/layers/tools_caller/worker.ts","../src/layers/stream_handler/schemas/stream_chunk.ts","../src/layers/stream_handler/services/stream_reducer.ts","../src/schemas/data_in.ts","../src/services/openai_request.ts","../src/utils/validate_flow_sdk_version.ts"],"sourcesContent":["import { install } from 'source-map-support';\nimport { CreateChatCompletionStep } from './step';\nimport { HistoryController } from './layers/history/controller';\nimport { StreamController } from './layers/stream_handler/controller';\nimport { StreamWorker } from './layers/stream_handler/worker';\nimport { ToolsController } from './layers/tools_caller/controller';\nimport { ToolsWorker } from './layers/tools_caller/worker';\n\n// enable source map support for better error stack traces\ninstall();\n\nexport const step = CreateChatCompletionStep;\nexport const states = {\n [HistoryController.class]: HistoryController,\n [ToolsController.class]: ToolsController,\n [ToolsWorker.class]: ToolsWorker,\n [StreamController.class]: StreamController,\n [StreamWorker.class]: StreamWorker,\n};\n","/* eslint-disable @typescript-eslint/unbound-method */\n\nimport Step from '@onereach/flow-sdk/step';\nimport { HistoryController } from './layers/history/controller';\nimport { StreamController, StreamControllerConfig } from './layers/stream_handler/controller';\nimport { ToolsController, ToolsControllerConfig } from './layers/tools_caller/controller';\nimport { ErrorFilter } from './decorators/error_filter';\nimport { CreateChatCompletionStepError, ErrorCode } from './errors/step_error';\nimport { type DataIn, dataInSchema } from './schemas/data_in';\nimport { OpenAIRequestService } from './services/openai_request';\nimport { Memoize } from 'typescript-memoize';\nimport { validateFlowSdkVersion } from './utils/validate_flow_sdk_version';\nimport { ACTION } from '@onereach/flow-sdk/types';\n\nimport type {\n ChatCompletion,\n ChatCompletionChunk,\n ChatCompletionMessageParam,\n ChatCompletionToolMessageParam,\n} from 'openai/resources';\nimport type { CONFIG, IActionEvent } from '@onereach/flow-sdk/types';\nimport type { Stream } from 'openai/core/streaming.js';\n\nconst MINIMAL_FLOW_SDK_VERSION = '8.0.15';\n\nexport class CreateChatCompletionStep<TResult> extends Step<ChatCompletionConfig> {\n @ErrorFilter\n public async resolveDataIn() {\n const dataIn = await super.resolveDataIn();\n\n // validate dataIn against schema\n this.log.DEBUG?.('data in before validation', dataIn);\n return dataInSchema.parse(dataIn);\n }\n\n @ErrorFilter\n public runStep(): void {\n const { streamResponse } = this.data;\n\n if (streamResponse) {\n this.triggers.hook<StreamControllerConfig, ACTION.end>(\n { name: ACTION.end, thread: StreamController.getThreadId(this) },\n this.onStreamControllerThreadEnd,\n );\n }\n this.triggers.hook<ToolsControllerConfig<TResult>, ACTION.end>(\n { name: ACTION.end, thread: ToolsController.getThreadId(this) },\n this.onToolsControllerEnd,\n );\n this.triggers.otherwise(this.initRequest);\n }\n\n @ErrorFilter\n public async initRequest(): Promise<void> {\n await validateFlowSdkVersion(MINIMAL_FLOW_SDK_VERSION);\n\n // reset the state\n this.state.contentReady = false;\n this.state.toolsReady = false;\n this.state.chatCompletion = undefined;\n this.state.toolsResults = [];\n\n const { streamResponse } = this.data;\n\n await Promise.all([\n ToolsController.start(this),\n streamResponse ? StreamController.start(this) : undefined,\n HistoryController.start(this),\n ]);\n\n // prepare messages history for the request\n await HistoryController.prepareHistory(this);\n\n const response = await this.openAiService.makeOpenAiRequest(this.history);\n if (streamResponse) {\n await this.handleStreamResponse(response as Stream<ChatCompletionChunk>);\n } else {\n await this.handleResponse(response as ChatCompletion);\n }\n }\n\n private async handleResponse(response: ChatCompletion): Promise<void> {\n // set result to state\n this.state.chatCompletion = response;\n this.state.contentReady = true;\n\n // TODO: handle multiple choices\n if (response.choices.length > 1) {\n this.log.WARN?.('Multiple choices received from LLM, but only the first one will be processed', {\n choicesNumber: response.choices.length,\n });\n }\n\n const choice = response.choices[0];\n\n // Process tool calls if any\n const toolCalls = choice?.message.tool_calls ?? [];\n for (const toolCall of toolCalls) {\n await ToolsController.callTool(this, toolCall);\n }\n\n // notify ToolsController no more tool calls will be made\n await ToolsController.lastToolCallReceived(this);\n }\n\n private async handleStreamResponse(response: Stream<ChatCompletionChunk>): Promise<void> {\n this.log.DEBUG?.('Start processing stream of chunks from LLM');\n for await (const chunk of response) {\n // send each chunk to the controller thread for processing\n await StreamController.handleChunk(this, chunk);\n }\n\n // send last chunk to the controller thread to mark the end of the stream\n await StreamController.lastChunkReceived(this);\n }\n\n @ErrorFilter\n public async onToolsControllerEnd(event: IActionEvent<ToolsControllerConfig<TResult>, ACTION.end>): Promise<void> {\n const { result } = event.params;\n\n this.log.DEBUG?.('Tools controller ended with messages', result);\n\n if (result instanceof Error) {\n throw new CreateChatCompletionStepError('Tools controller thread ended with an error', result, {\n code: ErrorCode.STEP_LOGIC_ISSUE,\n });\n }\n\n const { status, messages } = result ?? {};\n\n if (status !== 'ok' || !Array.isArray(messages)) {\n throw new CreateChatCompletionStepError('Unexpected end of the tools controller thread', {\n code: ErrorCode.STEP_LOGIC_ISSUE,\n data: event.params.result,\n });\n }\n\n this.state.toolsResults = messages;\n this.state.toolsReady = true;\n\n await this.tryToExitStep();\n }\n\n @ErrorFilter\n public async onStreamControllerThreadEnd(event: IActionEvent<StreamControllerConfig, ACTION.end>): Promise<void> {\n const { result } = event.params;\n this.log.DEBUG?.('Stream controller ended with result', result);\n\n if (result instanceof Error) {\n throw new CreateChatCompletionStepError('Stream controller thread ended with an error', result, {\n code: ErrorCode.STEP_LOGIC_ISSUE,\n });\n }\n\n // TODO: figure out better way to check for correct structure of the event (zod?)\n const { status, completion } = result ?? {};\n\n if (status !== 'ok' || completion == null) {\n throw new CreateChatCompletionStepError('Unexpected end of the stream controller thread', {\n code: ErrorCode.STEP_LOGIC_ISSUE,\n data: event.params.result,\n });\n }\n\n this.log.DEBUG?.('Create Chat Completion result', completion);\n\n this.state.contentReady = true;\n this.state.chatCompletion = completion;\n\n await this.tryToExitStep();\n }\n\n private async tryToExitStep(): Promise<void> {\n const { toolsReady, contentReady, chatCompletion, toolsResults } = this.state;\n if (!toolsReady || !contentReady) return;\n\n if (chatCompletion == null) {\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 == null) {\n throw new CreateChatCompletionStepError('Missing completion message in chat completion result', {\n code: ErrorCode.STEP_LOGIC_ISSUE,\n });\n }\n\n // add completion message and possible tool results to history\n await HistoryController.appendToHistory(this, [completionMessage, ...toolsResults]);\n\n if (chatCompletion?.choices?.[0]?.finish_reason === 'tool_calls') {\n // reset the step and run request again\n this.thread.jumpTo(this.currentStepId);\n return;\n }\n\n if (chatCompletion == null) {\n throw new CreateChatCompletionStepError('Missing chat completion result, but request is marked as processed', {\n code: ErrorCode.STEP_LOGIC_ISSUE,\n });\n }\n\n // both tools and content are ready, we can exit the step\n this.log.DEBUG?.('Exiting step with collected data', chatCompletion);\n this.exitStep('next', { ...chatCompletion, _history: this.history });\n }\n\n private get history(): ChatCompletionMessageParam[] {\n return HistoryController.getHistory(this);\n }\n\n @Memoize()\n private get openAiService(): OpenAIRequestService<ChatCompletionConfig> {\n return new OpenAIRequestService(this.thread, this.data);\n }\n}\n\nexport type ChatCompletionOut = ChatCompletion & {\n _history: ChatCompletionMessageParam[];\n};\n\nexport type ChatCompletionState = {\n toolsReady: boolean;\n contentReady: boolean;\n chatCompletion?: ChatCompletion;\n toolsResults: ChatCompletionToolMessageParam[];\n};\n\nexport interface ChatCompletionConfig extends CONFIG {\n dataIn: DataIn;\n dataOut: ChatCompletionOut;\n state: ChatCompletionState;\n}\n","/* eslint-disable @typescript-eslint/unbound-method */\n\nimport Step from '@onereach/flow-sdk/step';\nimport { ErrorFilter } from '../../decorators/error_filter';\n\nimport type { CONFIG, IThreadId, IEvent } from '@onereach/flow-sdk/types';\nimport type { ChatCompletionMessageParam } from 'openai/resources';\nimport type { DataIn } from '../../schemas/data_in';\nimport type { ChatCompletionConfig } from '../../step';\n\nexport class HistoryController extends Step<HistoryControllerConfig> {\n public static readonly class = 'hst_ctrl';\n\n public static async start(step: Step<ChatCompletionConfig>): Promise<void> {\n const threadId = this.getThreadId(step);\n const thread = step.process.getThread<HistoryControllerConfig>(threadId);\n\n if (thread != null) return; // thread already exists\n\n // create tools controller thread\n await step.thread.runThread<HistoryControllerConfig>({\n id: threadId,\n background: true,\n state: {\n step: step.id,\n class: this.class,\n\n messages: [], // messages to send to OpenAI API\n },\n });\n }\n\n public static async prepareHistory(step: Step): Promise<void> {\n await step.process.enqueueAndRun<EventName.prepareHistory>({\n thread: this.getThreadId(step),\n name: EventName.prepareHistory,\n });\n }\n\n public static async appendToHistory(\n step: Step,\n message: ChatCompletionMessageParam | ChatCompletionMessageParam[],\n ): Promise<void> {\n await step.process.enqueueAndRun<EventName.appendToHistory, HistoryControllerAppendParams>({\n thread: this.getThreadId(step),\n name: EventName.appendToHistory,\n params: { message },\n });\n }\n\n public static getHistory(step: Step): ChatCompletionMessageParam[] {\n return step.process.getSafeThread<HistoryControllerConfig>(this.getThreadId(step)).state.messages;\n }\n\n public static getThreadId(step: Step): IThreadId {\n return `llm_cmp_${this.class}_${step.id}`;\n }\n\n // ---------------------------------------\n\n @ErrorFilter\n public runStep(): void {\n this.triggers\n .local(EventName.prepareHistory, this.onPrepareHistory)\n .local(EventName.appendToHistory, this.onAppendToHistory)\n .otherwise(() => {\n this.log.DEBUG?.('Initializing history controller thread');\n });\n }\n\n @ErrorFilter\n public onPrepareHistory(): void {\n this.log.DEBUG?.('Preparing history');\n\n const {\n customHistory,\n historyLength,\n systemMessage,\n typeOfStep,\n userMessage,\n historyMode,\n historyMergefield,\n historyCode,\n assistantsFirstMessage,\n } = this.data;\n\n // 1. text completion mode\n if (typeOfStep === 'completion') {\n this.state.messages = [\n {\n role: 'user',\n content: userMessage!, // never would be undefined due to validation against schema\n },\n ];\n return;\n }\n\n // 2. chat mode (custom history)\n if (customHistory) {\n this.state.messages = historyMode === 'mergefield' ? historyMergefield! : historyCode!;\n return;\n }\n\n // 3. chat mode (step managed history)\n let messages = this.state.messages;\n\n // is a fresh conversation?\n if (messages.length === 0 && assistantsFirstMessage != null && 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 != null && historyLength > 0) {\n messages = messages.slice(-1 * historyLength);\n }\n\n // add system message as first message if it exists\n if (systemMessage != null && systemMessage.length > 0) {\n const systemMessageRecord = {\n role: 'system' as const,\n content: systemMessage,\n };\n\n if (messages[0]?.role === 'system') {\n messages[0] = systemMessageRecord; // replace existing system message\n } else {\n messages.unshift(systemMessageRecord); // add system message as first message\n }\n }\n\n // store history\n this.state.messages = messages;\n }\n\n @ErrorFilter\n public onAppendToHistory(event: IEvent<HistoryControllerAppendParams, EventName.appendToHistory>): void {\n this.log.DEBUG?.('Appending message to history', event.params);\n\n const { message } = event.params;\n const messages = Array.isArray(message) ? message : [message];\n this.state.messages.push(...messages);\n }\n}\n\n// ----------------- TYPES -----------------\n\nexport enum EventName {\n appendToHistory = 'hst_append',\n prepareHistory = 'hst_prepare',\n}\n\nexport type HistoryControllerAppendParams = {\n message: ChatCompletionMessageParam | ChatCompletionMessageParam[];\n};\n\nexport type HistoryControllerEvents =\n | IEvent<HistoryControllerAppendParams, EventName.appendToHistory>\n | IEvent<never, EventName.prepareHistory>;\n\nexport type HistoryControllerState = {\n class: typeof HistoryController.class;\n\n messages: ChatCompletionMessageParam[]; // messages to send to OpenAI API\n};\n\nexport interface HistoryControllerConfig extends CONFIG {\n dataIn: DataIn;\n state: HistoryControllerState;\n events: HistoryControllerEvents;\n}\n","import TimeoutError from '@onereach/flow-sdk/errors/timeout';\nimport { z } from 'zod/v4-mini';\n\nimport { CreateChatCompletionStepError, ErrorCode } from './step_error.js';\n\nexport function errorFilter(error: unknown): CreateChatCompletionStepError | TimeoutError {\n // if error is CreateChatCompletionStepError or TimeoutError, return it directly\n if (error instanceof CreateChatCompletionStepError || error instanceof TimeoutError) {\n return error;\n }\n\n // validation errors\n if (error instanceof z.core.$ZodError) {\n return new CreateChatCompletionStepError(z.prettifyError(error), error, {\n code: ErrorCode.VALIDATION,\n });\n }\n\n if (error instanceof Error) {\n // timeout errors\n if (error.message.includes('Request timed out')) {\n return new TimeoutError('Timeout', error, { code: ErrorCode.TIMEOUT });\n }\n\n // authentication errors\n if (error.message.includes('API key is required')) {\n // TODO: add logic for handling using custom 'no auth' exit here?\n return new CreateChatCompletionStepError('API key is required', error, {\n code: ErrorCode.AUTH,\n });\n }\n\n // TODO: fix interpreting of this kind of errors\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-explicit-any\n const responseErrorMessage: string | undefined =\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-explicit-any\n (error as unknown as any)?.response?.data?.error?.message;\n if (responseErrorMessage != null) {\n return new CreateChatCompletionStepError(responseErrorMessage, error, {\n code: ErrorCode.SERVER_ERROR,\n });\n }\n }\n\n // if error is a string assume it's an error message\n if (typeof error === 'string') {\n return new CreateChatCompletionStepError(error, {\n code: ErrorCode.UNKNOWN,\n });\n }\n\n if (error instanceof Error) {\n return new CreateChatCompletionStepError('Unknown error', error, {\n code: ErrorCode.UNKNOWN,\n });\n }\n\n // catch all for unknown errors\n return new CreateChatCompletionStepError('Unknown error', {\n code: ErrorCode.UNKNOWN,\n data: error,\n });\n}\n","import BaseError from '@onereach/flow-sdk/errors/base';\n\nexport enum 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}\n\nexport class CreateChatCompletionStepError extends BaseError<{\n code: ErrorCode;\n data?: unknown;\n}> {}\n","import { errorFilter } from '../errors/error_filter';\nimport Step from '@onereach/flow-sdk/step';\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function ErrorFilter<T extends (...args: any[]) => unknown>(\n _target: object,\n propertyKey: string | symbol,\n descriptor: TypedPropertyDescriptor<T>,\n): TypedPropertyDescriptor<T> | void {\n const originalMethod = descriptor.value;\n\n if (!originalMethod || typeof originalMethod !== 'function') return;\n\n const wrappedMethod = function (this: Step, ...args: Parameters<T>): ReturnType<T> {\n try {\n const result = originalMethod.apply(this, args) as ReturnType<T>;\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<T>;\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\n if (originalMethod?.name != null) {\n Object.defineProperty(wrappedMethod, 'name', {\n value: originalMethod.name,\n });\n }\n descriptor.value = wrappedMethod as T;\n\n return descriptor;\n}\n","/* eslint-disable @typescript-eslint/unbound-method */\n\nimport Step from '@onereach/flow-sdk/step';\nimport { StreamWorker, StreamWorkerConfig } from './worker';\nimport { ErrorFilter } from '../../decorators/error_filter';\nimport { ToolsController } from '../tools_caller/controller';\nimport { CreateChatCompletionStepError, ErrorCode } from '../../errors/step_error';\nimport { streamChunkEventSchema } from './schemas/stream_chunk';\nimport { StreamReducerService } from './services/stream_reducer';\nimport { runThread } from '../../utils/run_thread';\nimport { ACTION } from '@onereach/flow-sdk/types';\n\nimport type { CONFIG, IThreadId, IEvent, IActionEvent } from '@onereach/flow-sdk/types';\nimport type { ChatCompletion, ChatCompletionChunk, ChatCompletionMessageToolCall } from 'openai/resources';\nimport type { DataIn } from '../../schemas/data_in';\nimport type { ChatCompletionConfig } from '../../step';\n\nexport class StreamController extends Step<StreamControllerConfig> {\n public static readonly class = 'str_ctrl';\n\n public static async start(step: Step<ChatCompletionConfig>): Promise<void> {\n await runThread<StreamControllerConfig>(step, {\n id: this.getThreadId(step),\n state: {\n step: step.id,\n class: this.class,\n\n completionResult: {}, // aggregated result of the LLM response\n\n events: [], // queue of response chunks\n lastChunkReceived: false,\n index: -1, // last index for a chunk\n skipIndexWarning: false, // skip warning about multiple choices\n },\n });\n }\n\n public static async handleChunk(step: Step<ChatCompletionConfig>, chunk: ChatCompletionChunk): Promise<void> {\n await step.process.enqueueAndRun({\n thread: this.getThreadId(step),\n name: EventName.handleChunk,\n params: { chunk },\n });\n }\n\n public static async lastChunkReceived(step: Step<ChatCompletionConfig>): Promise<void> {\n await step.process.enqueueAndRun({\n thread: this.getThreadId(step),\n name: EventName.lastStreamChunkReceived,\n });\n }\n\n public static getThreadId(step: Step): IThreadId {\n return `llm_cmp_${this.class}_${step.id}`;\n }\n\n // ---------------------------------------\n\n @ErrorFilter\n public runStep(): void {\n this.triggers\n .hook<StreamWorkerConfig, ACTION.end>(\n { name: ACTION.end, thread: StreamWorker.getThreadId(this) },\n this.onWorkerThreadEnd,\n )\n .local(EventName.handleChunk, this.onStreamChunk)\n .local(EventName.lastStreamChunkReceived, this.onLastStreamChunkReceived)\n .otherwise(() => {\n this.log.DEBUG?.('Initializing stream controller thread');\n });\n }\n\n /**\n * Handler of the worker thread end event.\n */\n @ErrorFilter\n public onWorkerThreadEnd(event: IActionEvent<StreamWorkerConfig, ACTION.end>): void {\n // TODO: check if end was due to error or normal end in event.params\n this.log.DEBUG?.('Stream worker thread finished processing chunk', event.params.result);\n\n // check if there are more tool calls or content chunks to process\n this.tryRunWorker();\n }\n\n /**\n * Handles a single chunk of the streaming response from the OpenAI API.\n */\n @ErrorFilter\n public onStreamChunk(event: IEvent<StreamChunkParams, EventName.handleChunk>): void {\n const parsedEvent = streamChunkEventSchema.parse(event);\n const chunk = parsedEvent.params.chunk satisfies ChatCompletionChunk;\n\n const streamReducer = new StreamReducerService(this.state.completionResult, this.onToolCall.bind(this));\n streamReducer.reduceChunk(chunk);\n\n for (const chunkChoice of chunk.choices) {\n this.log.DEBUG?.('LLM stream response chunk', chunkChoice);\n\n if (chunkChoice.index > 0) {\n // TODO: figure out how to handle all choices not just first one\n // maybe more than 1 chunk exit?\n // skip streaming additional choices (if n > 1)\n this.handleMultipleChoices(chunkChoice);\n continue;\n }\n\n // aggregate content\n const content = chunkChoice.delta?.content;\n if (content != null && content.length > 0) {\n this.addContentToQueue(content);\n this.scheduleNextContentEvent();\n }\n\n this.handleLengthFinishReason(chunkChoice);\n }\n }\n\n protected handleMultipleChoices(choice: ChatCompletionChunk.Choice): void {\n if (this.state.skipIndexWarning) return;\n\n this.log.WARN?.('Multiple choices received from LLM, but only the first one will be processed', {\n choiceIndex: choice.index,\n });\n this.state.skipIndexWarning = true;\n }\n\n protected handleLengthFinishReason(choice: ChatCompletionChunk.Choice): void {\n // TODO: move logic of handling 'length' out of stream mixin\n if (choice.finish_reason === 'length') {\n // TODO: allow to proceed with partial data?\n throw new CreateChatCompletionStepError('Reached limit of tokens for LLM completion response', {\n code: ErrorCode.LLM_FINISH_LENGTH,\n });\n }\n }\n\n protected onToolCall(toolCall: ChatCompletionMessageToolCall): void {\n this.log.DEBUG?.('Tool call received', toolCall);\n void ToolsController.callTool(this, toolCall);\n }\n\n /**\n * Tries to flush the queue of response chunks to the controller thread.\n * If the first event in the queue is not full, it waits for a debounce duration before flushing.\n * If the first event is full, it flushes it immediately.\n */\n private scheduleNextContentEvent(): void {\n const firstEvent = this.state.events[0];\n\n if (firstEvent == null || !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 != null) {\n if ('lastChunkReceived' in lastEvent) {\n this.log.WARN?.('A new chunk received after the `lastChunkReceived` event. Ignoring it.');\n return;\n }\n\n if (lastEvent.content.length < this.maxChunkContentLength) {\n const mergedChunk = `${lastEvent.content}${content}`;\n // TODO: might be an issue with streaming to TTS\n lastEvent.content = mergedChunk.slice(0, this.maxChunkContentLength);\n this.log.DEBUG?.('Compacting response chunk into last queue event', lastEvent);\n\n content = mergedChunk.slice(this.maxChunkContentLength);\n }\n }\n\n // split chunk into max socket size events\n while (content) {\n this.state.index += 1;\n\n const event: ContentChunkEvent = {\n // TODO: might be an issue with streaming to TTS\n content: content.slice(0, this.maxChunkContentLength),\n index: this.state.index,\n ts: Date.now(),\n };\n this.log.DEBUG?.('Add new event into the queue', event);\n this.state.events.push(event);\n\n content = content.slice(this.maxChunkContentLength);\n }\n }\n\n /**\n * Processes the next event in the controller thread's queue.\n * If the worker thread is busy, it skips processing.\n * If the event is the termination marker, it notifies the end of the controller thread.\n * If the event is ready for processing, it starts the worker thread to handle it.\n */\n @ErrorFilter\n public tryRunWorker(): void {\n // skip if worker thread is busy\n if (StreamWorker.isBusy(this)) {\n this.log.DEBUG?.('Skip event processing. Worker thread is busy');\n return;\n }\n\n const event: ContentEvent | undefined = this.getEventToProcess();\n\n if (event == null) return;\n\n if ('lastChunkReceived' in event) {\n // if last chunk received, stop stream controller thread with aggregated response\n this.log.DEBUG?.(\n 'Stopping controller thread. All response content chunks were processed and no new chunks are coming',\n );\n this.end({\n status: 'ok',\n completion: this.state.completionResult as ChatCompletion, // TODO: maybe validate that completionResult is correct?\n });\n return;\n }\n\n this.log.DEBUG?.('Notify stream worker thread about response chunk to process', event);\n\n void StreamWorker.start(this, event);\n }\n\n private isEventReady(event: ContentEvent): boolean {\n if (event == null) return false;\n if ('lastChunkReceived' in event) return true;\n if (event.content == null) 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 == null) return undefined;\n if (!this.isEventReady(firstEvent)) return undefined;\n if ('lastChunkReceived' in firstEvent) return firstEvent;\n\n this.state.events.shift();\n return firstEvent;\n }\n\n /**\n * Handles the notification that all response chunks were received from the OpenAI API.\n */\n @ErrorFilter\n public async onLastStreamChunkReceived(): Promise<void> {\n this.log.DEBUG?.('All LLM response chunks were received. No more response chunks expected');\n\n // add fake event as marker for end of stream\n this.state.events.push({ lastChunkReceived: true });\n\n // mark last chunk was received in stream controller thread state\n this.state.lastChunkReceived = true;\n\n // force processing of the top chunk in the content queue\n this.tryRunWorker();\n\n // notify tools controller thread that no more tool calls are expected\n // set immediate to make sure last tool call callback is called\n await ToolsController.lastToolCallReceived(this);\n }\n\n protected get maxChunkContentLength(): number {\n return this.data.streamSettings?.maxBufferLength ?? 100;\n }\n\n protected get debounceDuration(): number {\n return this.data.streamSettings?.debounceDuration ?? 200;\n }\n}\n\nexport enum EventName {\n handleChunk = 'add_chunk',\n lastStreamChunkReceived = 'llm_rsp_end',\n}\n\nexport type ContentChunkEvent = {\n content: string;\n index: number;\n ts: number;\n};\nexport type ContentEndEvent = {\n // marker for end of content stream\n lastChunkReceived: true;\n};\nexport type ContentEvent = ContentChunkEvent | ContentEndEvent;\n\nexport type StreamChunkParams = { chunk: ChatCompletionChunk };\n\nexport type StreamControllerEvents = IEvent<StreamChunkParams, 'add_chunk'> | IEvent<unknown, 'llm_rsp_end'>;\n\nexport type StreamControllerState = {\n class: typeof StreamController.class;\n\n completionResult: Partial<ChatCompletion>;\n events: ContentEvent[];\n index: number;\n lastChunkReceived: boolean; // marker for end of response stream\n debounceId?: NodeJS.Timeout;\n skipIndexWarning: boolean;\n};\n\nexport type StreamControllerResult = {\n status: 'ok';\n completion: ChatCompletion;\n};\n\nexport interface StreamControllerConfig extends CONFIG {\n dataIn: DataIn;\n state: StreamControllerState;\n result: StreamControllerResult;\n events: StreamControllerEvents;\n}\n","import Step from '@onereach/flow-sdk/step';\nimport { ErrorFilter } from '../../decorators/error_filter';\nimport { CreateChatCompletionStepError, ErrorCode } from '../../errors/step_error';\nimport { runThread } from '../../utils/run_thread';\n\nimport type { CONFIG, IThread, IThreadId } from '@onereach/flow-sdk/types';\nimport type { DataIn } from '../../schemas/data_in';\nimport type { StreamControllerConfig } from './controller';\n\nexport class StreamWorker extends Step<StreamWorkerConfig> {\n public static readonly class = 'str_wrk';\n\n public static async start(step: Step<StreamControllerConfig>, event: ContentChunk): Promise<void> {\n await runThread<StreamWorkerConfig>(step, {\n id: this.getThreadId(step),\n state: {\n step: step.id,\n class: this.class,\n\n event,\n },\n });\n }\n\n public static isBusy(step: Step<StreamControllerConfig>): boolean {\n const workerThread = this.getThread(step);\n return workerThread != null && !workerThread.ended;\n }\n\n public static getThread(step: Step<StreamControllerConfig>): IThread<StreamWorkerConfig> | undefined {\n const workerThreadId = this.getThreadId(step);\n return step.process.getThread(workerThreadId);\n }\n\n public static getThreadId(step: Step<StreamControllerConfig>): IThreadId {\n return `llm_cmp_${this.class}_${step.id}`;\n }\n\n // ----------------------------------------------\n\n @ErrorFilter\n public runStep(): void {\n if ('event' in this.state === false || this.state.event == null) {\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(WithStreamingStepExitName.chunk, { chunk });\n }\n}\n\nexport enum WithStreamingStepExitName {\n chunk = 'chunk',\n}\n\nexport type ContentChunk = {\n content: string;\n index: number;\n ts: number;\n};\n\nexport type StreamWorkerOut = {\n chunk: ContentChunk;\n};\n\nexport type StreamWorkerState = {\n class: typeof StreamWorker.class;\n\n event: ContentChunk;\n};\n\nexport interface StreamWorkerConfig extends CONFIG {\n dataIn: DataIn;\n dataOut: StreamWorkerOut;\n state: StreamWorkerState;\n}\n","import Step from '@onereach/flow-sdk/step';\nimport { ACTION } from '@onereach/flow-sdk/types';\nimport type { AnyConfig, CONFIG, IThread, IThreadOptions } from '@onereach/flow-sdk/types';\n\n/**\n * Runs a new thread or reuses an existing one (if it ended).\n * @param step The step to run the thread for.\n * @throws Error if the thread is not ended or if the state is not provided.\n */\nexport async function runThread<ThreadConfig extends CONFIG, StepConfig extends CONFIG = AnyConfig>(\n step: Step<StepConfig>,\n { id, state, ...options }: IThreadOptions<ThreadConfig>,\n): Promise<ReturnType<IThread<ThreadConfig>['runThread']>> {\n const thread = step.process.getThread<ThreadConfig>(id);\n step.log.DEBUG?.(`runThread: thread with id '${id}'`, options);\n\n if (thread == null) {\n // create thread\n return await step.thread.runThread<ThreadConfig>({\n id,\n background: true,\n state,\n ...options,\n });\n } else {\n if (!thread.ended) throw new Error(`Thread with id '${id}' has not ended yet, cannot start it again`);\n if (state == null) throw new Error(`Thread with id '${id}' must have a state to run`);\n\n // reuse existing thread\n return await thread.enqueueAndRun({\n name: ACTION.goto,\n state,\n });\n }\n}\n","/* eslint-disable @typescript-eslint/unbound-method */\n\nimport Step from '@onereach/flow-sdk/step';\nimport { ErrorFilter } from '../../decorators/error_filter';\nimport { CreateChatCompletionStepError, ErrorCode } from '../../errors/step_error';\nimport { ParsedArguments, ToolsWorker, ToolsWorkerConfig } from './worker';\nimport { runThread } from '../../utils/run_thread';\nimport { ACTION } from '@onereach/flow-sdk/types';\n\nimport type { CONFIG, IActionEvent, IEvent, IThreadId } from '@onereach/flow-sdk/types';\nimport type { ChatCompletionMessageToolCall, ChatCompletionToolMessageParam } from 'openai/resources';\nimport type { DataIn } from '../../schemas/data_in';\nimport type { ChatCompletionConfig } from '../../step';\nimport { StreamControllerConfig } from '../stream_handler/controller';\n\nexport class ToolsController<TArgs extends ParsedArguments, TResult> extends Step<ToolsControllerConfig<TResult>> {\n public static readonly class = 'tl_ctrl';\n\n public static async start<TResult>(step: Step<ChatCompletionConfig>): Promise<void> {\n const threadId = this.getThreadId(step);\n await runThread<ToolsControllerConfig<TResult>>(step, {\n id: threadId,\n state: {\n step: step.id,\n class: this.class,\n\n tasks: {}, // tool calls from LLM response\n expectMoreTasks: true, // flag to indicate if there are more tasks to process\n },\n });\n }\n\n public static async callTool<T extends ChatCompletionConfig | StreamControllerConfig>(\n step: Step<T>,\n toolCall: ChatCompletionMessageToolCall,\n ): Promise<void> {\n await step.process.enqueueAndRun<EventName.callTool, CallToolParams>({\n thread: this.getThreadId(step),\n name: EventName.callTool,\n params: { toolCall },\n });\n }\n\n public static async lastToolCallReceived<T extends ChatCompletionConfig | StreamControllerConfig>(\n step: Step<T>,\n ): Promise<void> {\n // notify tools controller thread that no more tool calls are expected\n // without await to prevent blocking the stream controller thread\n await step.process.enqueueAndRun<EventName.lastToolCallReceived>({\n thread: this.getThreadId(step),\n name: EventName.lastToolCallReceived,\n });\n }\n\n public static getThreadId<T extends CONFIG>(step: Step<T>): IThreadId {\n return `llm_cmp_${this.class}_${step.id}`;\n }\n\n // ---------------------------------------\n\n @ErrorFilter\n public runStep(): void {\n this.triggers\n .local(EventName.callTool, this.onCallTool)\n .local(EventName.lastToolCallReceived, this.onLastToolCallReceived)\n .otherwise(this.initialize);\n }\n\n @ErrorFilter\n public initialize(): void {\n this.log.DEBUG?.('Initializing tools controller thread');\n this.validateMergeFieldType();\n }\n\n @ErrorFilter\n public onCallTool(event: IEvent<CallToolParams, EventName.callTool>): void {\n const { toolCall } = event.params;\n\n // TODO: support other tool types\n if (toolCall.type !== 'function') {\n throw new CreateChatCompletionStepError('Only function tools are supported at the moment', {\n code: ErrorCode.UNSUPPORTED,\n });\n }\n\n this.state.tasks[toolCall.id] = {\n call: toolCall,\n status: 'pending',\n };\n\n this.startToolWorkerThread(toolCall);\n }\n\n @ErrorFilter\n public onLastToolCallReceived(): void {\n this.log.DEBUG?.('No more tool calls expected', this.state.tasks);\n this.state.expectMoreTasks = false; // set flag to indicate no more tasks expected\n this.tryEndToolsControllerThread();\n }\n\n /**\n * Starts the tool worker thread to process the tool call.\n */\n protected startToolWorkerThread(toolCall: ChatCompletionMessageToolCall): void {\n // TODO: handle error from tool worker thread\n // subscribe to tool worker thread end event\n this.triggers.hook<ToolsWorkerConfig<TArgs, TResult>, ACTION.end>(\n { name: ACTION.end, thread: ToolsWorker.getThreadId(toolCall) },\n this.onToolWorkerThreadEnd,\n );\n\n void ToolsWorker.start<TArgs, TResult>(this, toolCall);\n }\n\n @ErrorFilter\n public onToolWorkerThreadEnd(event: IActionEvent<ToolsWorkerConfig<TArgs, TResult>, ACTION.end>): void {\n this.log.DEBUG?.('Tool caller worker thread has ended', event);\n\n if (!('result' in event.params) || event.params.result == null) {\n throw new CreateChatCompletionStepError('Tool worker thread ended without result', {\n code: ErrorCode.STEP_LOGIC_ISSUE,\n });\n }\n\n // TODO: figure out how to make sure what worker thread has ended? (local.toolCall?)\n // TODO: add setting 'failed' status to the tool call if worker thread ended with error\n\n // const toolCallId = 'toolCallId' in event.params.result\n // ? event.params.result.toolCallId\n // : undefined\n\n const { result } = event.params;\n\n if (result instanceof Error) {\n // TODO: handle error from tool worker thread\n throw new CreateChatCompletionStepError('Tool worker thread ended with error', result, {\n code: ErrorCode.STEP_LOGIC_ISSUE,\n });\n }\n\n this.log.DEBUG?.(`Tool worker thread completed successfully`, {\n toolCallId: result.toolCallId,\n result: result.data,\n });\n this.setToolCallResult(result.toolCallId, result.data);\n\n this.tryEndToolsControllerThread();\n }\n\n protected setToolCallResult(toolCallId: string, result: TResult): void {\n const toolCall = this.state.tasks[toolCallId];\n\n if (toolCall == null) {\n throw new CreateChatCompletionStepError(`Unknown tool call with id '${toolCallId}'`, {\n code: ErrorCode.STEP_LOGIC_ISSUE,\n });\n }\n\n toolCall.status = 'completed';\n toolCall.result = result;\n }\n\n protected tryEndToolsControllerThread(): void {\n if (this.state.expectMoreTasks) return;\n\n // TODO: handle errored out tool calls\n\n // check if all tool calls are completed\n const hasActiveTasks = Object.values(this.state.tasks).some((task) => task.status === 'pending');\n if (hasActiveTasks) return;\n\n this.log.DEBUG?.('All tool calls completed or failed', this.state.tasks);\n this.end({\n status: 'ok',\n messages: this.messages,\n });\n }\n\n protected get messages(): ChatCompletionToolMessageParam[] {\n return Object.values(this.state.tasks).map((task) => ({\n role: 'tool',\n tool_call_id: task.call.id,\n content: JSON.stringify(task.result),\n }));\n }\n\n protected validateMergeFieldType(): void {\n const { functionsList } = this.data;\n if (!Array.isArray(functionsList) || functionsList.length === 0) return; // no functions used\n\n if (this.dataOut == null || this.getMergeField(this.dataOut).type !== 'thread') {\n throw new CreateChatCompletionStepError('Merge-field type has to be \"Thread\" if you are using functions', {\n code: ErrorCode.VALIDATION,\n });\n }\n }\n}\n\n// ----------------- TYPES -----------------\n\nexport enum EventName {\n callTool = 'tl_run_call',\n lastToolCallReceived = 'tl_rsp_end',\n}\n\nexport type ToolCallTask<TResult> = {\n status: 'pending' | 'completed' | 'failed';\n call: ChatCompletionMessageToolCall;\n result?: TResult; // result of the tool call, if completed\n};\nexport type TasksMap<TResult> = Record<ChatCompletionMessageToolCall['id'], ToolCallTask<TResult>>;\n\nexport type ToolsControllerResult = {\n status: 'ok';\n messages: ChatCompletionToolMessageParam[]; // messages to be sent to the LLM\n};\n\nexport type CallToolParams = {\n toolCall: ChatCompletionMessageToolCall;\n};\n\nexport type ToolsControllerEvents =\n | IEvent<CallToolParams, EventName.callTool>\n | IEvent<never, EventName.lastToolCallReceived>;\n\nexport type ToolsControllerState<TResult> = {\n tasks: TasksMap<TResult>; // tool calls from LLM response,\n expectMoreTasks: boolean; // flag to indicate if there are more tasks to process\n};\n\nexport interface ToolsControllerConfig<TResult> extends CONFIG {\n dataIn: DataIn;\n state: ToolsControllerState<TResult>;\n result: ToolsControllerResult;\n events: ToolsControllerEvents;\n}\n","import Step from '@onereach/flow-sdk/step';\nimport { ErrorFilter } from '../../decorators/error_filter';\nimport { runThread } from '../../utils/run_thread';\n\nimport type { CONFIG, IThreadId } from '@onereach/flow-sdk/types';\nimport type { ChatCompletionMessageToolCall } from 'openai/resources';\nimport type { DataIn } from '../../schemas/data_in';\nimport type { ToolsControllerConfig } from './controller';\n\nexport class ToolsWorker<TArgs extends ParsedArguments, TResult> extends Step<ToolsWorkerConfig<TArgs, TResult>> {\n public static readonly class = 'tl_wrk';\n\n public static async start<TArgs extends ParsedArguments, TResult>(\n step: Step<ToolsControllerConfig<TResult>>,\n toolCall: ChatCompletionMessageToolCall,\n ): Promise<void> {\n // parse tool call arguments if they are in string format\n const parsedArguments = JSON.parse(toolCall.function?.arguments) as TArgs;\n\n await runThread<ToolsWorkerConfig<TArgs, TResult>>(step, {\n id: this.getThreadId(toolCall),\n state: {\n step: step.id,\n class: this.class,\n },\n local: {\n toolCall,\n parsedArguments,\n },\n });\n }\n\n public static getThreadId(toolCall: ChatCompletionMessageToolCall): IThreadId {\n return `llm_cmp_${this.class}_${toolCall.id}`;\n }\n\n // -----------------------------------------------------------------------------------\n\n /**\n * Initializes the tool worker thread to handle processing of repackaged content chunks.\n */\n @ErrorFilter\n public runStep(): void {\n const { toolCall, parsedArguments } = this.local as ToolsWorkerLocal<TArgs>; // TODO: remove type cast\n\n this.log.DEBUG?.('Initializing tool worker thread', toolCall);\n this.exitStep(this.getExitName(/*toolCall*/), {\n toolCall: {\n id: toolCall.id,\n type: toolCall.type,\n function: {\n name: toolCall.function.name,\n arguments: parsedArguments, // use parsed arguments\n },\n },\n });\n }\n\n protected getExitName(/*toolCall: ChatCompletionMessageToolCall*/): string {\n // TODO: add support for exits based on individual functions\n return 'function';\n }\n}\n\n// ----------------- TYPES -----------------\n\nexport type ParsedArguments<TArgs extends Record<string, unknown> = Record<string, unknown>> = TArgs;\nexport type ToolCallWithParsedArgs<TArgs extends ParsedArguments> = {\n id: string;\n type: 'function';\n function: {\n name: string;\n arguments: TArgs;\n };\n};\nexport type ToolsWorkerMergeField<TArgs extends ParsedArguments> = {\n toolCall: ToolCallWithParsedArgs<TArgs>;\n};\n\nexport type ToolsWorkerOut<TArgs extends ParsedArguments> = ToolsWorkerMergeField<TArgs>;\n\nexport type ToolsWorkerState = {\n class: typeof ToolsWorker.class;\n};\n\nexport type ToolsWorkerLocal<TArgs extends ParsedArguments> = {\n toolCall: ChatCompletionMessageToolCall;\n parsedArguments: TArgs;\n};\n\nexport type ThreadWorkerResult<TResult> = {\n toolCallId: string; // ID of the tool call that was processed\n data: TResult; // result of the tool call\n};\n\nexport interface ToolsWorkerConfig<TArgs extends ParsedArguments, TResult> extends CONFIG {\n dataIn: DataIn;\n dataOut: ToolsWorkerOut<TArgs>;\n state: ToolsWorkerState;\n result: ThreadWorkerResult<TResult>;\n local: ToolsWorkerLocal<TArgs>;\n}\n","import { z } from 'zod/v4-mini';\nimport { StreamChunkParams } from '../controller';\nimport { ChatCompletionChunk } from 'openai/resources';\nimport { IEvent } from '@onereach/flow-sdk/types';\n\nexport const streamChunkEventSchema = z.object({\n name: z.string(),\n params: z.object({\n chunk: z.object({\n id: z.string(),\n object: z.literal('chat.completion.chunk'),\n created: z.number(),\n model: z.string(),\n service_tier: z.optional(\n z.union([\n z.literal('default'),\n z.literal('auto'),\n z.literal('flex'),\n z.literal('scale'),\n z.literal('priority'),\n z.null(),\n ]),\n ),\n system_fingerprint: z.optional(z.string()),\n choices: z.array(\n z.object({\n index: z.number(),\n delta: z.object({\n role: z.optional(z.enum(['developer', 'system', 'user', 'assistant', 'tool'])),\n content: z.optional(z.string()),\n refusal: z.nullish(z.string()),\n tool_calls: z.optional(\n z.array(\n z.object({\n index: z.number().check(z.int(), z.gte(0)),\n id: z.optional(z.string()),\n type: z.optional(z.literal('function')),\n function: z.object({\n name: z.optional(z.string()),\n arguments: z.optional(z.string()),\n }),\n }) satisfies z.core.$ZodType<ChatCompletionChunk.Choice.Delta.ToolCall>,\n ),\n ),\n }),\n logprobs: z.optional(z.any()), // logprobs may be null or omitted\n finish_reason: z.union([\n z.literal('stop'),\n z.literal('length'),\n z.literal('tool_calls'),\n z.literal('content_filter'),\n z.null(),\n ]),\n }),\n ),\n\n logprobs: z.nullish(\n z.object({\n content: z.nullable(z.array(z.looseObject({}))),\n refusal: z.nullable(z.array(z.looseObject({}))),\n }),\n ),\n\n usage: z.nullish(\n z.object({\n prompt_tokens: z.number(),\n completion_tokens: z.number(),\n total_tokens: z.number(),\n completion_tokens_details: z.optional(\n z.object({\n accepted_prediction_tokens: z.optional(z.number()),\n audio_tokens: z.optional(z.number()),\n reasoning_tokens: z.optional(z.number()),\n rejected_prediction_tokens: z.optional(z.number()),\n }),\n ),\n prompt_tokens_details: z.optional(\n z.object({\n audio_tokens: z.optional(z.number()),\n cached_tokens: z.optional(z.number()),\n }),\n ),\n }),\n ),\n }) satisfies z.core.$ZodType<ChatCompletionChunk>,\n }),\n}) satisfies z.core.$ZodType<IEvent<StreamChunkParams>>;\n\nexport type StreamChunkEvent = z.infer<typeof streamChunkEventSchema>;\n","import type {\n ChatCompletion,\n ChatCompletionChunk,\n ChatCompletionMessage,\n ChatCompletionMessageToolCall,\n} from 'openai/resources';\nimport { ParsedArguments } from '../../tools_caller/worker';\n\nexport class StreamReducerService<TArgs = ParsedArguments> {\n protected _result: Partial<ChatCompletion>;\n protected readonly _onToolCall: OnToolCallCallback<TArgs>;\n\n constructor(memo: Partial<ChatCompletion>, onToolCall: OnToolCallCallback<TArgs>) {\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 != null) {\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 const { delta, ...rest } = choice; // eslint-disable-line @typescript-eslint/no-unused-vars\n existing = rest as ChatCompletion.Choice;\n this._result.choices ??= [];\n this._result.choices[choice.index] = existing;\n }\n\n if (choice.finish_reason != null) {\n existing.finish_reason = choice.finish_reason;\n }\n\n if (choice.logprobs != null) {\n existing.logprobs = choice.logprobs;\n }\n\n if (choice.delta?.content != null) {\n const { content, ...delta } = choice.delta;\n existing.message ??= delta as ChatCompletionMessage; // TODO: not sure if it's correct to cast here\n existing.message.content ??= '';\n existing.message.content += content;\n }\n\n if (choice.delta?.tool_calls != null) {\n const { tool_calls, ...delta } = choice.delta; // eslint-disable-line @typescript-eslint/no-unused-vars\n existing.message ??= delta as ChatCompletionMessage; // TODO: not sure if it's correct to cast here\n existing.message.tool_calls ??= [];\n\n for (const deltaToolCall of choice.delta.tool_calls) {\n const i = deltaToolCall.index;\n if (existing.message.tool_calls[i] == null) {\n existing.message.tool_calls[i] = structuredClone(deltaToolCall) as ChatCompletionMessageToolCall;\n } else {\n existing.message.tool_calls[i].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[i]);\n }\n }\n }\n }\n }\n\n protected tryParseToolCall(toolCall: ChatCompletionMessageToolCall): void {\n try {\n const parsedArgs = JSON.parse(toolCall.function.arguments) as TArgs;\n this._onToolCall(toolCall, parsedArgs);\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n } catch (error) {\n // if failed to parse, just ignore it assume it's not fully loaded yet\n }\n }\n}\n\nexport type OnToolCallCallback<TArgs = ParsedArguments> = (\n toolCall: ChatCompletionMessageToolCall,\n parsedArgs: TArgs,\n) => void;\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((val) => !['undefined', 'null'].includes(val), {\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\nexport const dataInSchema = z\n .object({\n provider: stringNoUndefinedSchema.check(z.minLength(1)),\n model: stringNoUndefinedSchema.check(z.minLength(1)),\n\n tokenName: optionalStrValue(stringNoUndefinedSchema),\n tokenNameHeader: z._default(stringNoUndefinedSchema.check(z.minLength(1)), 'x-or-account-token-name'),\n sessionIdHeader: z._default(stringNoUndefinedSchema.check(z.minLength(1)), 'x-or-session-id'),\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: optionalStrValue(z.coerce.number().check(z.gte(0), z.lte(2))),\n topP: optionalStrValue(z.coerce.number().check(z.gte(0), z.lte(1))),\n maxTokens: optionalStrValue(z.coerce.number().check(z.int(), z.gte(1))),\n presencePenalty: optionalStrValue(z.coerce.number().check(z.gte(-2), z.lte(2))),\n frequencyPenalty: optionalStrValue(z.coerce.number().check(z.gte(-2), z.lte(2))),\n n: optionalStrValue(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((val) => (val === 0 ? 50 : val)), // default value is 50\n z.int(),\n z.gte(1),\n z.lte(32768),\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: optionalStrValue(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.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 required: z.optional(z.array(z.string().check(z.minLength(1), z.maxLength(64)))),\n additionalProperties: z.literal(false),\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?.((msg) => msg.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?.((msg) => msg.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 optionalStrValue<T extends z.core.SomeType>(schema: T) {\n return z.pipe(\n z.union([z.undefined(), z.literal(''), schema]),\n z.transform((val) => (val === '' ? undefined : val)),\n );\n}\n","import OpenAI from 'openai';\nimport timestring from 'timestring';\nimport { z } from 'zod/v4-mini';\nimport { Memoize } from 'typescript-memoize';\nimport BasicThreadService from '@onereach/flow-sdk/services/basic';\n\nimport type { Stream } from 'openai/core/streaming.js';\nimport type {\n ChatCompletion,\n ChatCompletionChunk,\n ChatCompletionMessageParam,\n ChatCompletionTool,\n} from 'openai/resources';\nimport type { DataIn } from '../schemas/data_in';\nimport type { CONFIG, IThread } from '@onereach/flow-sdk/types';\n\nexport class OpenAIRequestService<TConfig extends CONFIG> extends BasicThreadService<TConfig> {\n constructor(\n thread: IThread<TConfig>,\n private readonly data: DataIn,\n ) {\n super(thread);\n this.log.DEBUG?.('OpenAIRequestService initialized');\n }\n\n /**\n * Makes a request to the OpenAI API to create a chat completion.\n */\n public async makeOpenAiRequest(\n messages: ChatCompletionMessageParam[],\n ): 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 const response = await this.openAiClient.chat.completions.create(request);\n\n if (!streamResponse) this.log.DEBUG?.('LLM response', response);\n\n return response;\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, tokenName, tokenNameHeader, sessionIdHeader } = 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 [sessionIdHeader]: this.session.get<string>(['reporting', 'sessionId']),\n ...(tokenName ? { [tokenNameHeader]: tokenName } : null),\n },\n timeout: this.timeoutMs,\n };\n this.log.DEBUG?.('OpenAI client options', clientOptions);\n\n return new OpenAI(clientOptions);\n }\n\n private get stopSequences(): string[] {\n const list = this.data.stop ?? [];\n return list.map((item) => item.token).filter((token) => token.length > 0);\n }\n\n /**\n * Returns the timeout duration in milliseconds.\n */\n @Memoize()\n private get timeoutMs(): number {\n const value = timestring(this.data.timeoutDuration, 'ms');\n\n // 1 second to 10 minutes\n return z.number().check(z.int(), z.gte(1000), z.lte(600_000)).parse(value);\n }\n}\n","import { readFile } from 'fs/promises';\n\nexport async function validateFlowSdkVersion(minVersion: string): Promise<void> {\n if (typeof minVersion !== 'string' || !minVersion.match(/^\\d+\\.\\d+\\.\\d+$/)) {\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 // eslint-disable-next-line @typescript-eslint/no-var-requires\n const packageJsonContent = await readFile(packageJsonPath, 'utf-8');\n\n const { version } = JSON.parse(packageJsonContent) as { version: string };\n const { groups } = version.match(/^(?<major>\\d+)\\.(?<minor>\\d+)\\.(?<patch>\\d+)/) || {};\n\n if (!groups) throw new Error(`Invalid Flow SDK version format: ${version}`);\n\n const major = parseInt(groups.major, 10);\n const minor = parseInt(groups.minor, 10);\n const patch = parseInt(groups.patch, 10);\n\n const [minMajor, minMinor, minPatch] = minVersion.split('.').map((x) => parseInt(x, 10));\n\n if (\n major < minMajor ||\n (major === minMajor && minor < minMinor) ||\n (major === minMajor && minor === minMinor && patch < minPatch)\n ) {\n throw new Error(\n `Flow SDK version '${version}' is lower than required minimum version '${minVersion}' for the step`,\n );\n }\n}\n"],"mappings":"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","names":["index_exports","__export","states","step","__toCommonJS","import_source_map_support","import_step","import_step","import_timeout","import_v4_mini","import_base","ErrorCode","CreateChatCompletionStepError","BaseError","errorFilter","error","CreateChatCompletionStepError","TimeoutError","z","core","$ZodError","prettifyError","code","ErrorCode","VALIDATION","Error","message","includes","TIMEOUT","AUTH","responseErrorMessage","response","data","SERVER_ERROR","UNKNOWN","ErrorFilter","_target","propertyKey","descriptor","originalMethod","value","wrappedMethod","__name","args","result","apply","Promise","catch","error","methodName","toString","log","DEBUG","errorFilter","name","Object","defineProperty","_ts_decorate","decorators","target","key","desc","__name","HistoryController","Step","class","start","step","threadId","getThreadId","process","getThread","thread","runThread","id","background","state","messages","prepareHistory","enqueueAndRun","name","appendToHistory","message","params","getHistory","getSafeThread","runStep","triggers","local","onPrepareHistory","onAppendToHistory","otherwise","log","DEBUG","customHistory","historyLength","systemMessage","typeOfStep","userMessage","historyMode","historyMergefield","historyCode","assistantsFirstMessage","data","role","content","length","push","at","some","slice","systemMessageRecord","unshift","event","Array","isArray","import_step","import_step","import_types","runThread","step","id","state","options","thread","process","getThread","log","DEBUG","background","ended","Error","enqueueAndRun","name","ACTION","goto","StreamWorker","Step","class","start","step","event","runThread","id","getThreadId","state","isBusy","workerThread","getThread","ended","workerThreadId","process","runStep","CreateChatCompletionStepError","code","ErrorCode","STEP_LOGIC_ISSUE","chunk","log","DEBUG","exitStep","import_step","import_step","ToolsWorker","Step","class","start","step","toolCall","parsedArguments","JSON","parse","function","arguments","runThread","id","getThreadId","state","local","runStep","log","DEBUG","exitStep","getExitName","type","name","import_types","_ts_decorate","decorators","target","key","desc","__name","ToolsController","Step","class","start","step","threadId","getThreadId","runThread","id","state","tasks","expectMoreTasks","callTool","toolCall","process","enqueueAndRun","thread","name","params","lastToolCallReceived","runStep","triggers","local","onCallTool","onLastToolCallReceived","otherwise","initialize","log","DEBUG","validateMergeFieldType","event","type","CreateChatCompletionStepError","code","ErrorCode","UNSUPPORTED","call","status","startToolWorkerThread","tryEndToolsControllerThread","hook","ACTION","end","ToolsWorker","onToolWorkerThreadEnd","result","STEP_LOGIC_ISSUE","Error","toolCallId","data","setToolCallResult","Object","values","some","task","messages","map","role","tool_call_id","content","JSON","stringify","functionsList","Array","isArray","length","dataOut","getMergeField","VALIDATION","import_v4_mini","streamChunkEventSchema","z","object","name","string","params","chunk","id","literal","created","number","model","service_tier","optional","union","null","system_fingerprint","choices","array","index","delta","role","enum","content","refusal","nullish","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","usage","choice","existing","index","delta","finish_reason","logprobs","content","message","tool_calls","deltaToolCall","i","structuredClone","function","arguments","tryParseToolCall","toolCall","parsedArgs","JSON","parse","import_types","_ts_decorate","decorators","target","key","desc","__name","StreamController","Step","class","start","step","runThread","id","getThreadId","state","completionResult","events","lastChunkReceived","index","skipIndexWarning","handleChunk","chunk","process","enqueueAndRun","thread","name","params","runStep","triggers","hook","ACTION","end","StreamWorker","onWorkerThreadEnd","local","onStreamChunk","onLastStreamChunkReceived","otherwise","log","DEBUG","event","result","tryRunWorker","streamChunkEventSchema","parse","StreamReducerService","onToolCall","bind","reduceChunk","chunkChoice","choices","handleMultipleChoices","content","delta","length","addContentToQueue","scheduleNextContentEvent","handleLengthFinishReason","choice","WARN","choiceIndex","finish_reason","CreateChatCompletionStepError","code","ErrorCode","LLM_FINISH_LENGTH","toolCall","ToolsController","callTool","firstEvent","isEventReady","lastEvent","at","maxChunkContentLength","mergedChunk","slice","ts","Date","now","push","isBusy","getEventToProcess","status","completion","eventDelay","debounceDuration","shift","lastToolCallReceived","data","streamSettings","maxBufferLength","import_v4_mini","import_locales","z","config","en","stringNoUndefinedSchema","string","check","trim","refine","val","includes","error","messageSchema","discriminatedUnion","object","role","literal","content","name","optional","minLength","maxLength","nullable","tool_calls","array","id","type","function","arguments","tool_call_id","dataInSchema","provider","model","tokenName","optionalStrValue","tokenNameHeader","_default","sessionIdHeader","typeOfStep","enum","systemMessage","userMessage","switchAssistantsMessage","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","description","parameters","properties","record","items","required","additionalProperties","strict","processError","processTimeout","timeoutDuration","data","undefined","find","msg","schema","pipe","union","transform","import_openai","import_timestring","import_v4_mini","import_typescript_memoize","import_basic","OpenAIRequestService","BasicThreadService","thread","data","log","DEBUG","makeOpenAiRequest","messages","model","temperature","topP","maxTokens","frequencyPenalty","presencePenalty","n","streamResponse","request","structuredClone","top_p","max_tokens","frequency_penalty","presence_penalty","stop","stopSequences","stream","tools","response","openAiClient","chat","completions","create","functionsList","Array","isArray","length","map","tool","type","function","name","description","parameters","Object","keys","undefined","strict","provider","tokenName","tokenNameHeader","sessionIdHeader","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","import_typescript_memoize","import_promises","validateFlowSdkVersion","minVersion","match","Error","packageJsonPath","require","packageJsonContent","readFile","version","JSON","parse","groups","major","parseInt","minor","patch","minMajor","minMinor","minPatch","split","map","x","import_types","_ts_decorate","decorators","target","key","desc","__name","MINIMAL_FLOW_SDK_VERSION","CreateChatCompletionStep","Step","resolveDataIn","dataIn","log","DEBUG","dataInSchema","parse","runStep","streamResponse","data","triggers","hook","name","ACTION","end","thread","StreamController","getThreadId","onStreamControllerThreadEnd","ToolsController","onToolsControllerEnd","otherwise","initRequest","validateFlowSdkVersion","state","contentReady","toolsReady","chatCompletion","undefined","toolsResults","Promise","all","start","HistoryController","prepareHistory","response","openAiService","makeOpenAiRequest","history","handleStreamResponse","handleResponse","choices","length","WARN","choicesNumber","toolCalls","message","tool_calls","toolCall","callTool","lastToolCallReceived","chunk","handleChunk","lastChunkReceived","event","result","params","Error","CreateChatCompletionStepError","code","ErrorCode","STEP_LOGIC_ISSUE","status","messages","Array","isArray","tryToExitStep","completion","completionMessage","appendToHistory","finish_reason","jumpTo","currentStepId","exitStep","_history","getHistory","OpenAIRequestService","install","step","CreateChatCompletionStep","states","HistoryController","class","ToolsController","ToolsWorker","StreamController","StreamWorker"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/step.ts","../src/layers/history/controller.ts","../src/utils/create_method_decorator.ts","../src/errors/error_filter.ts","../src/errors/step_error.ts","../src/decorators/error_filter.ts","../src/layers/stream_handler/controller.ts","../src/layers/stream_handler/worker.ts","../src/utils/run_thread.ts","../src/decorators/hook_error_filter.ts","../src/layers/tools_caller/controller.ts","../src/layers/tools_caller/worker.ts","../src/layers/stream_handler/schemas/stream_chunk.ts","../src/layers/stream_handler/services/stream_reducer.ts","../src/schemas/data_in.ts","../src/services/openai_request.ts","../src/utils/validate_flow_sdk_version.ts"],"sourcesContent":["import { install } from 'source-map-support';\nimport { CreateChatCompletionStep } from './step';\nimport { HistoryController } from './layers/history/controller';\nimport { StreamController } from './layers/stream_handler/controller';\nimport { StreamWorker } from './layers/stream_handler/worker';\nimport { ToolsController } from './layers/tools_caller/controller';\nimport { ToolsWorker } from './layers/tools_caller/worker';\n\n// enable source map support for better error stack traces\ninstall();\n\nexport const step = CreateChatCompletionStep;\nexport const states = {\n [HistoryController.class]: HistoryController,\n [ToolsController.class]: ToolsController,\n [ToolsWorker.class]: ToolsWorker,\n [StreamController.class]: StreamController,\n [StreamWorker.class]: StreamWorker,\n};\n","/* eslint-disable @typescript-eslint/unbound-method */\n\nimport Step from '@onereach/flow-sdk/step';\nimport { HistoryController } from './layers/history/controller';\nimport { StreamController, StreamControllerConfig } from './layers/stream_handler/controller';\nimport { ToolsController, ToolsControllerConfig } from './layers/tools_caller/controller';\nimport { ErrorFilter } from './decorators/error_filter';\nimport { HookErrorFilter } from './decorators/hook_error_filter';\nimport { CreateChatCompletionStepError, ErrorCode } from './errors/step_error';\nimport { type DataIn, dataInSchema } from './schemas/data_in';\nimport { OpenAIRequestService } from './services/openai_request';\nimport { Memoize } from 'typescript-memoize';\nimport { validateFlowSdkVersion } from './utils/validate_flow_sdk_version';\nimport { ACTION } from '@onereach/flow-sdk/types';\n\nimport type {\n ChatCompletion,\n ChatCompletionChunk,\n ChatCompletionMessageFunctionToolCall,\n ChatCompletionMessageParam,\n ChatCompletionToolMessageParam,\n} from 'openai/resources';\nimport type { CONFIG, IActionEvent } from '@onereach/flow-sdk/types';\nimport type { Stream } from 'openai/core/streaming.js';\n\nconst MINIMAL_FLOW_SDK_VERSION = '8.0.20';\n\nexport class CreateChatCompletionStep<TResult> extends Step<ChatCompletionConfig> {\n @ErrorFilter\n public async resolveDataIn() {\n const dataIn = await super.resolveDataIn();\n\n // validate dataIn against schema\n this.log.DEBUG?.('data in before validation', dataIn);\n return dataInSchema.parse(dataIn);\n }\n\n @ErrorFilter\n public runStep(): void {\n const { streamResponse } = this.data;\n\n if (streamResponse) {\n this.triggers.hook<StreamControllerConfig, ACTION.end>(\n { name: ACTION.end, thread: StreamController.getThreadId(this) },\n this.onStreamControllerThreadEnd,\n );\n }\n this.triggers.hook<ToolsControllerConfig<TResult>, ACTION.end>(\n { name: ACTION.end, thread: ToolsController.getThreadId(this) },\n this.onToolsControllerEnd,\n );\n this.triggers.otherwise(this.initRequest);\n }\n\n @ErrorFilter\n public async initRequest(): Promise<void> {\n await validateFlowSdkVersion(MINIMAL_FLOW_SDK_VERSION);\n\n // reset the state\n this.state.contentReady = false;\n this.state.toolsReady = false;\n this.state.chatCompletion = undefined;\n this.state.toolsResults = [];\n\n const { streamResponse } = this.data;\n\n await Promise.all([\n ToolsController.start(this),\n streamResponse ? StreamController.start(this) : undefined,\n HistoryController.start(this),\n ]);\n\n // prepare messages history for the request\n await HistoryController.prepareHistory(this);\n\n const response = await this.openAiService.makeOpenAiRequest(this.history);\n if (streamResponse) {\n await this.handleStreamResponse(response as Stream<ChatCompletionChunk>);\n } else {\n await this.handleResponse(response as ChatCompletion);\n }\n }\n\n private async handleResponse(response: ChatCompletion): Promise<void> {\n // set result to state\n this.state.chatCompletion = response;\n this.state.contentReady = true;\n\n // TODO: handle multiple choices\n if (response.choices.length > 1) {\n this.log.WARN?.('Multiple choices received from LLM, but only the first one will be processed', {\n choicesNumber: response.choices.length,\n });\n }\n\n const choice = response.choices[0];\n\n // Process tool calls if any\n const toolCalls = choice?.message.tool_calls ?? [];\n for (const toolCall of toolCalls) {\n await ToolsController.callTool(this, toolCall as ChatCompletionMessageFunctionToolCall);\n }\n\n // notify ToolsController no more tool calls will be made\n await ToolsController.lastToolCallReceived(this);\n }\n\n private async handleStreamResponse(response: Stream<ChatCompletionChunk>): Promise<void> {\n this.log.DEBUG?.('Start processing stream of chunks from LLM');\n for await (const chunk of response) {\n // send each chunk to the controller thread for processing\n await StreamController.handleChunk(this, chunk);\n }\n\n // send last chunk to the controller thread to mark the end of the stream\n await StreamController.lastChunkReceived(this);\n }\n\n @HookErrorFilter\n public async onToolsControllerEnd(event: IActionEvent<ToolsControllerConfig<TResult>, ACTION.end>): Promise<void> {\n const { result, thread } = event.params;\n\n this.log.DEBUG?.('Tools controller ended with messages', result);\n\n if (result instanceof Error || thread.error instanceof Error) {\n const error = result instanceof Error ? result : (thread.error as Error);\n throw new CreateChatCompletionStepError('Tools controller thread ended with an error', error, {\n code: ErrorCode.STEP_LOGIC_ISSUE,\n });\n }\n\n const { status, messages } = result ?? {};\n\n if (status !== 'ok' || !Array.isArray(messages)) {\n throw new CreateChatCompletionStepError('Unexpected end of the tools controller thread', {\n code: ErrorCode.STEP_LOGIC_ISSUE,\n data: event.params.result,\n });\n }\n\n this.state.toolsResults = messages;\n this.state.toolsReady = true;\n\n await this.tryToExitStep();\n }\n\n @HookErrorFilter\n public async onStreamControllerThreadEnd(event: IActionEvent<StreamControllerConfig, ACTION.end>): Promise<void> {\n const { result, thread } = event.params;\n this.log.DEBUG?.('Stream controller ended with result', result);\n\n if (result instanceof Error || thread.error instanceof Error) {\n const error = result instanceof Error ? result : (thread.error as Error);\n throw new CreateChatCompletionStepError('Stream controller thread ended with an error', error, {\n code: ErrorCode.STEP_LOGIC_ISSUE,\n });\n }\n\n // TODO: figure out better way to check for correct structure of the event (zod?)\n const { status, completion } = result ?? {};\n\n if (status !== 'ok' || completion == null) {\n throw new CreateChatCompletionStepError('Unexpected end of the stream controller thread', {\n code: ErrorCode.STEP_LOGIC_ISSUE,\n data: event.params.result,\n });\n }\n\n this.log.DEBUG?.('Create Chat Completion result', completion);\n\n this.state.contentReady = true;\n this.state.chatCompletion = completion;\n\n await this.tryToExitStep();\n }\n\n private async tryToExitStep(): Promise<void> {\n const { toolsReady, contentReady, chatCompletion, toolsResults } = this.state;\n if (!toolsReady || !contentReady) return;\n\n if (chatCompletion == null) {\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 == null) {\n throw new CreateChatCompletionStepError('Missing completion message in chat completion result', {\n code: ErrorCode.STEP_LOGIC_ISSUE,\n });\n }\n\n // add completion message and possible tool results to history\n await HistoryController.appendToHistory(this, [completionMessage, ...toolsResults]);\n\n if (chatCompletion?.choices?.[0]?.finish_reason === 'tool_calls') {\n // reset the step and run request again\n this.thread.jumpTo(this.currentStepId);\n return;\n }\n\n if (chatCompletion == null) {\n throw new CreateChatCompletionStepError('Missing chat completion result, but request is marked as processed', {\n code: ErrorCode.STEP_LOGIC_ISSUE,\n });\n }\n\n // both tools and content are ready, we can exit the step\n this.log.DEBUG?.('Exiting step with collected data', chatCompletion);\n this.exitStep('next', { ...chatCompletion, _history: this.history });\n }\n\n private get history(): ChatCompletionMessageParam[] {\n return HistoryController.getHistory(this);\n }\n\n @Memoize()\n private get openAiService(): OpenAIRequestService<ChatCompletionConfig> {\n return new OpenAIRequestService(this.thread, this.data);\n }\n}\n\nexport type ChatCompletionOut = ChatCompletion & {\n _history: ChatCompletionMessageParam[];\n};\n\nexport type ChatCompletionState = {\n toolsReady: boolean;\n contentReady: boolean;\n chatCompletion?: ChatCompletion;\n toolsResults: ChatCompletionToolMessageParam[];\n};\n\nexport interface ChatCompletionConfig extends CONFIG {\n dataIn: DataIn;\n dataOut: ChatCompletionOut;\n state: ChatCompletionState;\n}\n","/* eslint-disable @typescript-eslint/unbound-method */\n\nimport Step from '@onereach/flow-sdk/step';\nimport { ErrorFilter } from '../../decorators/error_filter';\n\nimport type { CONFIG, IThreadId, IEvent } from '@onereach/flow-sdk/types';\nimport type { ChatCompletionMessageParam } from 'openai/resources';\nimport type { DataIn } from '../../schemas/data_in';\nimport type { ChatCompletionConfig } from '../../step';\n\nexport class HistoryController extends Step<HistoryControllerConfig> {\n public static readonly class = 'hst_ctrl';\n\n public static async start(step: Step<ChatCompletionConfig>): Promise<void> {\n const threadId = this.getThreadId(step);\n const thread = step.process.getThread<HistoryControllerConfig>(threadId);\n\n if (thread != null) return; // thread already exists\n\n // create tools controller thread\n await step.thread.runThread<HistoryControllerConfig>({\n id: threadId,\n background: true,\n state: {\n step: step.id,\n class: this.class,\n\n messages: [], // messages to send to OpenAI API\n },\n });\n }\n\n public static async prepareHistory<T extends CONFIG>(step: Step<T>): Promise<void> {\n await step.process.enqueueAndRun<EventName.prepareHistory>({\n thread: this.getThreadId(step),\n name: EventName.prepareHistory,\n });\n }\n\n public static async appendToHistory<T extends CONFIG>(\n step: Step<T>,\n message: ChatCompletionMessageParam | ChatCompletionMessageParam[],\n ): Promise<void> {\n await step.process.enqueueAndRun<EventName.appendToHistory, HistoryControllerAppendParams>({\n thread: this.getThreadId(step),\n name: EventName.appendToHistory,\n params: { message },\n });\n }\n\n public static getHistory<T extends CONFIG>(step: Step<T>): ChatCompletionMessageParam[] {\n return step.process.getSafeThread<HistoryControllerConfig>(this.getThreadId(step)).state.messages;\n }\n\n public static getThreadId<T extends CONFIG>(step: Step<T>): IThreadId {\n return `llm_cmp_${this.class}_${step.id}`;\n }\n\n // ---------------------------------------\n\n @ErrorFilter\n public runStep(): void {\n this.triggers\n .local(EventName.prepareHistory, this.onPrepareHistory)\n .local(EventName.appendToHistory, this.onAppendToHistory)\n .otherwise(() => {\n this.log.DEBUG?.('Initializing history controller thread');\n });\n }\n\n @ErrorFilter\n public onPrepareHistory(): void {\n this.log.DEBUG?.('Preparing history');\n\n const {\n customHistory,\n historyLength,\n systemMessage,\n typeOfStep,\n userMessage,\n historyMode,\n historyMergefield,\n historyCode,\n assistantsFirstMessage,\n } = this.data;\n\n // 1. text completion mode\n if (typeOfStep === 'completion') {\n this.state.messages = [\n {\n role: 'user',\n content: userMessage!, // never would be undefined due to validation against schema\n },\n ];\n return;\n }\n\n // 2. chat mode (custom history)\n if (customHistory) {\n this.state.messages = historyMode === 'mergefield' ? historyMergefield! : historyCode!;\n return;\n }\n\n // 3. chat mode (step managed history)\n let messages = this.state.messages;\n\n // is a fresh conversation?\n if (messages.length === 0 && assistantsFirstMessage != null && 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 != null && historyLength > 0) {\n messages = messages.slice(-1 * historyLength);\n }\n\n // add system message as first message if it exists\n if (systemMessage != null && systemMessage.length > 0) {\n const systemMessageRecord = {\n role: 'system' as const,\n content: systemMessage,\n };\n\n if (messages[0]?.role === 'system') {\n messages[0] = systemMessageRecord; // replace existing system message\n } else {\n messages.unshift(systemMessageRecord); // add system message as first message\n }\n }\n\n // store history\n this.state.messages = messages;\n }\n\n @ErrorFilter\n public onAppendToHistory(event: IEvent<HistoryControllerAppendParams, EventName.appendToHistory>): void {\n this.log.DEBUG?.('Appending message to history', event.params);\n\n const { message } = event.params;\n const messages = Array.isArray(message) ? message : [message];\n this.state.messages.push(...messages);\n }\n}\n\n// ----------------- TYPES -----------------\n\nexport enum EventName {\n appendToHistory = 'hst_append',\n prepareHistory = 'hst_prepare',\n}\n\nexport type HistoryControllerAppendParams = {\n message: ChatCompletionMessageParam | ChatCompletionMessageParam[];\n};\n\nexport type HistoryControllerEvents =\n | IEvent<HistoryControllerAppendParams, EventName.appendToHistory>\n | IEvent<never, EventName.prepareHistory>;\n\nexport type HistoryControllerState = {\n class: typeof HistoryController.class;\n\n messages: ChatCompletionMessageParam[]; // messages to send to OpenAI API\n};\n\nexport interface HistoryControllerConfig extends CONFIG {\n dataIn: DataIn;\n state: HistoryControllerState;\n events: HistoryControllerEvents;\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\n\n/**\n * Creates a method decorator that can be used with or without options.\n * @param apply - Function that applies the decorator logic with given options.\n * @param defaultOptions - Default options to use if none are provided.\n */\nexport function createMethodDecoratorWithOptionalArgs<A, T extends AnyFunction = AnyFunction>(\n apply: (\n options: A,\n target: object,\n propertyKey: string | symbol,\n descriptor: TypedPropertyDescriptor<T>,\n ) => T | TypedPropertyDescriptor<T> | void,\n defaultOptions: A,\n): {\n (\n target: object,\n propertyKey: string | symbol,\n descriptor: TypedPropertyDescriptor<T>,\n ): TypedPropertyDescriptor<T> | void;\n (\n options?: A,\n ): (\n target: object,\n propertyKey: string | symbol,\n descriptor: TypedPropertyDescriptor<T>,\n ) => TypedPropertyDescriptor<T> | void;\n} {\n function runApply(\n options: A,\n target: object,\n propertyKey: string | symbol,\n descriptor: TypedPropertyDescriptor<T>,\n ): TypedPropertyDescriptor<T> | void {\n const maybe = apply(options, target, propertyKey, descriptor);\n\n // If the decorator factory returned a wrapped function, assign it to the descriptor here\n if (typeof maybe === 'function') {\n const originalMethod = descriptor.value;\n const wrappedMethod = maybe as typeof originalMethod;\n\n if (originalMethod?.name != null) {\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 arg0?: object | A,\n arg1?: string | symbol,\n arg2?: TypedPropertyDescriptor<T>,\n ): any {\n if (\n arg0 !== null &&\n typeof arg0 === 'object' &&\n (typeof arg1 === 'string' || typeof arg1 === 'symbol') &&\n arg2 !== null &&\n typeof arg2 === 'object'\n ) {\n // Called as plain decorator: @Decorator\n return runApply(defaultOptions, arg0, arg1, arg2);\n } else {\n // Called as decorator factory: @Decorator(options)\n const options = (arg0 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 = (...args: any[]) => any;\n","import TimeoutError from '@onereach/flow-sdk/errors/timeout';\nimport { z } from 'zod/v4-mini';\n\nimport { CreateChatCompletionStepError, ErrorCode } from './step_error.js';\n\nexport function errorFilter(error: unknown): CreateChatCompletionStepError | TimeoutError {\n // if error is CreateChatCompletionStepError or TimeoutError, return it directly\n if (error instanceof CreateChatCompletionStepError || error instanceof TimeoutError) {\n return error;\n }\n\n // validation errors\n if (error instanceof z.core.$ZodError) {\n return new CreateChatCompletionStepError(z.prettifyError(error), error, {\n code: ErrorCode.VALIDATION,\n });\n }\n\n if (error instanceof Error) {\n // timeout errors\n if (error.message.includes('Request timed out')) {\n return new TimeoutError('Timeout', error, { code: ErrorCode.TIMEOUT });\n }\n\n // authentication errors\n if (error.message.includes('API key is required')) {\n // TODO: add logic for handling using custom 'no auth' exit here?\n return new CreateChatCompletionStepError('API key is required', error, {\n code: ErrorCode.AUTH,\n });\n }\n\n // TODO: fix interpreting of this kind of errors\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-explicit-any\n const responseErrorMessage: string | undefined =\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-explicit-any\n (error as unknown as any)?.response?.data?.error?.message;\n if (responseErrorMessage != null) {\n return new CreateChatCompletionStepError(responseErrorMessage, error, {\n code: ErrorCode.SERVER_ERROR,\n });\n }\n }\n\n // if error is a string assume it's an error message\n if (typeof error === 'string') {\n return new CreateChatCompletionStepError(error, {\n code: ErrorCode.UNKNOWN,\n });\n }\n\n if (error instanceof Error) {\n return new CreateChatCompletionStepError('Unknown error', error, {\n code: ErrorCode.UNKNOWN,\n });\n }\n\n // catch all for unknown errors\n return new CreateChatCompletionStepError('Unknown error', {\n code: ErrorCode.UNKNOWN,\n data: error,\n });\n}\n","import BaseError from '@onereach/flow-sdk/errors/base';\n\nexport enum 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}\n\nexport class CreateChatCompletionStepError extends BaseError<{\n code: ErrorCode;\n data?: unknown;\n}> {}\n","import { createMethodDecoratorWithOptionalArgs } from '../utils/create_method_decorator';\nimport { errorFilter } from '../errors/error_filter';\nimport Step from '@onereach/flow-sdk/step';\n\nconst defaultOptions = {};\n\nexport const ErrorFilter = createMethodDecoratorWithOptionalArgs((_options, _target, propertyKey, descriptor) => {\n const originalMethod = descriptor.value;\n\n if (!originalMethod || typeof originalMethod !== 'function') return;\n\n return function (this: Step, ...args: Parameters<typeof originalMethod>): ReturnType<typeof originalMethod> {\n try {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n const result = originalMethod.apply(this, args);\n\n if (result instanceof Promise) {\n return result.catch((error) => {\n const methodName = propertyKey.toString();\n this.log.DEBUG?.(`Error in method '${methodName}'`, error);\n throw errorFilter(error);\n }) as ReturnType<typeof originalMethod>;\n }\n\n return result;\n } catch (error) {\n const methodName = propertyKey.toString();\n this.log.DEBUG?.(`Error in method '${methodName}'`, error);\n throw errorFilter(error);\n }\n };\n}, defaultOptions);\n","/* eslint-disable @typescript-eslint/unbound-method */\n\nimport Step from '@onereach/flow-sdk/step';\nimport { StreamWorker, StreamWorkerConfig } from './worker';\nimport { ErrorFilter } from '../../decorators/error_filter';\nimport { HookErrorFilter } from '../../decorators/hook_error_filter';\nimport { ToolsController } from '../tools_caller/controller';\nimport { CreateChatCompletionStepError, ErrorCode } from '../../errors/step_error';\nimport { streamChunkEventSchema } from './schemas/stream_chunk';\nimport { StreamReducerService } from './services/stream_reducer';\nimport { runThread } from '../../utils/run_thread';\nimport { ACTION } from '@onereach/flow-sdk/types';\n\nimport type { CONFIG, IThreadId, IEvent, IActionEvent } from '@onereach/flow-sdk/types';\nimport type { ChatCompletion, ChatCompletionChunk, ChatCompletionMessageFunctionToolCall } from 'openai/resources';\nimport type { DataIn } from '../../schemas/data_in';\nimport type { ChatCompletionConfig } from '../../step';\n\nexport class StreamController extends Step<StreamControllerConfig> {\n public static readonly class = 'str_ctrl';\n\n public static async start(step: Step<ChatCompletionConfig>): Promise<void> {\n await runThread<StreamControllerConfig, ChatCompletionConfig>(step, {\n id: this.getThreadId(step),\n state: {\n step: step.id,\n class: this.class,\n\n completionResult: {}, // aggregated result of the LLM response\n\n events: [], // queue of response chunks\n lastChunkReceived: false,\n index: -1, // last index for a chunk\n skipIndexWarning: false, // skip warning about multiple choices\n },\n });\n }\n\n public static async handleChunk(step: Step<ChatCompletionConfig>, chunk: ChatCompletionChunk): Promise<void> {\n await step.process.enqueueAndRun({\n thread: this.getThreadId(step),\n name: EventName.handleChunk,\n params: { chunk },\n });\n }\n\n public static async lastChunkReceived(step: Step<ChatCompletionConfig>): Promise<void> {\n await step.process.enqueueAndRun({\n thread: this.getThreadId(step),\n name: EventName.lastStreamChunkReceived,\n });\n }\n\n public static getThreadId<T extends CONFIG>(step: Step<T>): IThreadId {\n return `llm_cmp_${this.class}_${step.id}`;\n }\n\n // ---------------------------------------\n\n @ErrorFilter\n public runStep(): void {\n this.triggers\n .hook<StreamWorkerConfig, ACTION.end>(\n { name: ACTION.end, thread: StreamWorker.getThreadId(this) },\n this.onWorkerThreadEnd,\n )\n .local(EventName.handleChunk, this.onStreamChunk)\n .local(EventName.lastStreamChunkReceived, this.onLastStreamChunkReceived)\n .otherwise(() => {\n this.log.DEBUG?.('Initializing stream controller thread');\n });\n }\n\n /**\n * Handler of the worker thread end event.\n */\n @HookErrorFilter({ allowHandleError: false })\n public onWorkerThreadEnd(event: IActionEvent<StreamWorkerConfig, ACTION.end>): void {\n // TODO: check if end was due to error or normal end in event.params\n this.log.DEBUG?.('Stream worker thread finished processing chunk', event.params.result);\n\n // check if there are more tool calls or content chunks to process\n this.tryRunWorker();\n }\n\n /**\n * Handles a single chunk of the streaming response from the OpenAI API.\n */\n @ErrorFilter\n public onStreamChunk(event: IEvent<StreamChunkParams, EventName.handleChunk>): void {\n const parsedEvent = streamChunkEventSchema.parse(event);\n const chunk = parsedEvent.params.chunk satisfies ChatCompletionChunk;\n\n const streamReducer = new StreamReducerService(this.state.completionResult, this.onToolCall.bind(this));\n streamReducer.reduceChunk(chunk);\n\n for (const chunkChoice of chunk.choices) {\n this.log.DEBUG?.('LLM stream response chunk', chunkChoice);\n\n if (chunkChoice.index > 0) {\n // TODO: figure out how to handle all choices not just first one\n // maybe more than 1 chunk exit?\n // skip streaming additional choices (if n > 1)\n this.handleMultipleChoices(chunkChoice);\n continue;\n }\n\n // aggregate content\n const content = chunkChoice.delta?.content;\n if (content != null && content.length > 0) {\n this.addContentToQueue(content);\n this.scheduleNextContentEvent();\n }\n\n this.handleLengthFinishReason(chunkChoice);\n }\n }\n\n protected handleMultipleChoices(choice: ChatCompletionChunk.Choice): void {\n if (this.state.skipIndexWarning) return;\n\n this.log.WARN?.('Multiple choices received from LLM, but only the first one will be processed', {\n choiceIndex: choice.index,\n });\n this.state.skipIndexWarning = true;\n }\n\n protected handleLengthFinishReason(choice: ChatCompletionChunk.Choice): void {\n // TODO: move logic of handling 'length' out of stream mixin\n if (choice.finish_reason === 'length') {\n // TODO: allow to proceed with partial data?\n throw new CreateChatCompletionStepError('Reached limit of tokens for LLM completion response', {\n code: ErrorCode.LLM_FINISH_LENGTH,\n });\n }\n }\n\n protected onToolCall(toolCall: ChatCompletionMessageFunctionToolCall): void {\n this.log.DEBUG?.('Tool call received', toolCall);\n void ToolsController.callTool(this, toolCall);\n }\n\n /**\n * Tries to flush the queue of response chunks to the controller thread.\n * If the first event in the queue is not full, it waits for a debounce duration before flushing.\n * If the first event is full, it flushes it immediately.\n */\n private scheduleNextContentEvent(): void {\n const firstEvent = this.state.events[0];\n\n if (firstEvent == null || !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 != null) {\n if ('lastChunkReceived' in lastEvent) {\n this.log.WARN?.('A new chunk received after the `lastChunkReceived` event. Ignoring it.');\n return;\n }\n\n if (lastEvent.content.length < this.maxChunkContentLength) {\n const mergedChunk = `${lastEvent.content}${content}`;\n // TODO: might be an issue with streaming to TTS\n lastEvent.content = mergedChunk.slice(0, this.maxChunkContentLength);\n this.log.DEBUG?.('Compacting response chunk into last queue event', lastEvent);\n\n content = mergedChunk.slice(this.maxChunkContentLength);\n }\n }\n\n // split chunk into max socket size events\n while (content) {\n this.state.index += 1;\n\n const event: ContentChunkEvent = {\n // TODO: might be an issue with streaming to TTS\n content: content.slice(0, this.maxChunkContentLength),\n index: this.state.index,\n ts: Date.now(),\n };\n this.log.DEBUG?.('Add new event into the queue', event);\n this.state.events.push(event);\n\n content = content.slice(this.maxChunkContentLength);\n }\n }\n\n /**\n * Processes the next event in the controller thread's queue.\n * If the worker thread is busy, it skips processing.\n * If the event is the termination marker, it notifies the end of the controller thread.\n * If the event is ready for processing, it starts the worker thread to handle it.\n */\n @ErrorFilter\n public tryRunWorker(): void {\n // skip if worker thread is busy\n if (StreamWorker.isBusy(this)) {\n this.log.DEBUG?.('Skip event processing. Worker thread is busy');\n return;\n }\n\n const event: ContentEvent | undefined = this.getEventToProcess();\n\n if (event == null) return;\n\n if ('lastChunkReceived' in event) {\n // if last chunk received, stop stream controller thread with aggregated response\n this.log.DEBUG?.(\n 'Stopping controller thread. All response content chunks were processed and no new chunks are coming',\n );\n this.end({\n status: 'ok',\n completion: this.state.completionResult as ChatCompletion, // TODO: maybe validate that completionResult is correct?\n });\n return;\n }\n\n this.log.DEBUG?.('Notify stream worker thread about response chunk to process', event);\n\n void StreamWorker.start(this, event);\n }\n\n private isEventReady(event: ContentEvent): boolean {\n if (event == null) return false;\n if ('lastChunkReceived' in event) return true;\n if (event.content == null) 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 == null) return undefined;\n if (!this.isEventReady(firstEvent)) return undefined;\n if ('lastChunkReceived' in firstEvent) return firstEvent;\n\n this.state.events.shift();\n return firstEvent;\n }\n\n /**\n * Handles the notification that all response chunks were received from the OpenAI API.\n */\n @ErrorFilter\n public async onLastStreamChunkReceived(): Promise<void> {\n this.log.DEBUG?.('All LLM response chunks were received. No more response chunks expected');\n\n // add fake event as marker for end of stream\n this.state.events.push({ lastChunkReceived: true });\n\n // mark last chunk was received in stream controller thread state\n this.state.lastChunkReceived = true;\n\n // force processing of the top chunk in the content queue\n this.tryRunWorker();\n\n // notify tools controller thread that no more tool calls are expected\n // set immediate to make sure last tool call callback is called\n await ToolsController.lastToolCallReceived(this);\n }\n\n protected get maxChunkContentLength(): number {\n return this.data.streamSettings?.maxBufferLength ?? 100;\n }\n\n protected get debounceDuration(): number {\n return this.data.streamSettings?.debounceDuration ?? 200;\n }\n}\n\nexport enum EventName {\n handleChunk = 'add_chunk',\n lastStreamChunkReceived = 'llm_rsp_end',\n}\n\nexport type ContentChunkEvent = {\n content: string;\n index: number;\n ts: number;\n};\nexport type ContentEndEvent = {\n // marker for end of content stream\n lastChunkReceived: true;\n};\nexport type ContentEvent = ContentChunkEvent | ContentEndEvent;\n\nexport type StreamChunkParams = { chunk: ChatCompletionChunk };\n\nexport type StreamControllerEvents = IEvent<StreamChunkParams, 'add_chunk'> | IEvent<unknown, 'llm_rsp_end'>;\n\nexport type StreamControllerState = {\n class: typeof StreamController.class;\n\n completionResult: Partial<ChatCompletion>;\n events: ContentEvent[];\n index: number;\n lastChunkReceived: boolean; // marker for end of response stream\n debounceId?: NodeJS.Timeout;\n skipIndexWarning: boolean;\n};\n\nexport type StreamControllerResult = {\n status: 'ok';\n completion: ChatCompletion;\n};\n\nexport interface StreamControllerConfig extends CONFIG {\n dataIn: DataIn;\n state: StreamControllerState;\n result: StreamControllerResult;\n events: StreamControllerEvents;\n}\n","import Step from '@onereach/flow-sdk/step';\nimport { ErrorFilter } from '../../decorators/error_filter';\nimport { CreateChatCompletionStepError, ErrorCode } from '../../errors/step_error';\nimport { runThread } from '../../utils/run_thread';\n\nimport type { CONFIG, IThread, IThreadId } from '@onereach/flow-sdk/types';\nimport type { DataIn } from '../../schemas/data_in';\nimport type { StreamControllerConfig } from './controller';\n\nexport class StreamWorker extends Step<StreamWorkerConfig> {\n public static readonly class = 'str_wrk';\n\n public static async start(step: Step<StreamControllerConfig>, event: ContentChunk): Promise<void> {\n await runThread<StreamWorkerConfig, StreamControllerConfig>(step, {\n id: this.getThreadId(step),\n state: {\n step: step.id,\n class: this.class,\n\n event,\n },\n });\n }\n\n public static isBusy(step: Step<StreamControllerConfig>): boolean {\n const workerThread = this.getThread(step);\n return workerThread != null && !workerThread.ended;\n }\n\n public static getThread(step: Step<StreamControllerConfig>): IThread<StreamWorkerConfig> | undefined {\n const workerThreadId = this.getThreadId(step);\n return step.process.getThread(workerThreadId);\n }\n\n public static getThreadId<T extends CONFIG>(step: Step<T>): IThreadId {\n return `llm_cmp_${this.class}_${step.id}`;\n }\n\n // ----------------------------------------------\n\n @ErrorFilter\n public runStep(): void {\n if ('event' in this.state === false || this.state.event == null) {\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(WithStreamingStepExitName.chunk, { chunk });\n }\n}\n\nexport enum WithStreamingStepExitName {\n chunk = 'chunk',\n}\n\nexport type ContentChunk = {\n content: string;\n index: number;\n ts: number;\n};\n\nexport type StreamWorkerOut = {\n chunk: ContentChunk;\n};\n\nexport type StreamWorkerState = {\n class: typeof StreamWorker.class;\n\n event: ContentChunk;\n};\n\nexport interface StreamWorkerConfig extends CONFIG {\n dataIn: DataIn;\n dataOut: StreamWorkerOut;\n state: StreamWorkerState;\n}\n","import Step from '@onereach/flow-sdk/step';\nimport { ACTION } from '@onereach/flow-sdk/types';\nimport type { CONFIG, IThread, IThreadOptions } from '@onereach/flow-sdk/types';\n\n/**\n * Runs a new thread or reuses an existing one (if it ended).\n * @param step The step to run the thread for.\n * @throws Error if the thread is not ended or if the state is not provided.\n */\nexport async function runThread<ThreadConfig extends CONFIG, StepConfig extends CONFIG>(\n step: Step<StepConfig>,\n { id, state, ...options }: IThreadOptions<ThreadConfig>,\n): Promise<ReturnType<IThread<ThreadConfig>['runThread']>> {\n const thread = step.process.getThread<ThreadConfig>(id);\n step.log.DEBUG?.(`runThread: thread with id '${id}'`, options);\n\n if (thread == null) {\n // create thread\n return await step.thread.runThread<ThreadConfig>({\n id,\n background: true,\n state,\n ...options,\n });\n } else {\n if (!thread.ended) throw new Error(`Thread with id '${id}' has not ended yet, cannot start it again`);\n if (state == null) throw new Error(`Thread with id '${id}' must have a state to run`);\n\n // reuse existing thread\n return await thread.enqueueAndRun({\n name: ACTION.goto,\n state,\n });\n }\n}\n","import Step from '@onereach/flow-sdk/step';\nimport { ACTION } from '@onereach/flow-sdk/types';\nimport { createMethodDecoratorWithOptionalArgs } from '../utils/create_method_decorator';\nimport { errorFilter } from '../errors/error_filter';\n\nconst defaultOptions: HookErrorFilterOptions = { allowHandleError: true, useErrorFilter: true };\n\n/**\n * Since errors in hooks are fatal and can't be processed this decorator allows to wrap hook handler\n * and manage errors by ending a thread with the error (preventing sending error to `error` exit)\n * @param options\n * @param options.allowHandleError - Default `true`. If `false` in case of error will end thread with error as result, if `true` will allow to handle error via 'error' exit\n * @param options.useErrorFilter - Default `true`. If `true` every error wild be processed with `errorFilter` utility function\n */\nexport const HookErrorFilter = createMethodDecoratorWithOptionalArgs((options, _target, propertyKey, descriptor) => {\n const originalMethod = descriptor.value;\n if (!originalMethod || typeof originalMethod !== 'function') return;\n\n return function (this: Step, ...args: Parameters<typeof originalMethod>): ReturnType<typeof originalMethod> {\n try {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n const result = originalMethod.apply(this, args);\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}, defaultOptions);\n\nfunction errorHandler(this: Step, options: HookErrorFilterOptions, error: unknown, propertyKey: string | symbol): void {\n const methodName = propertyKey.toString();\n this.log.DEBUG?.(`Error in method '${methodName}'`, error);\n const filteredError = options.useErrorFilter ? errorFilter(error) : error;\n\n if (filteredError instanceof Error) {\n if (options.allowHandleError) {\n // Send it to the 'error' exit and stop here\n this.thread.enqueue({ name: ACTION.error, error: filteredError });\n return;\n } else {\n // End the thread with the error and stop here\n this.end(filteredError);\n return;\n }\n }\n\n // Only throw if it's not an Error instance and you truly want to bubble it\n throw filteredError;\n}\n\nexport type HookErrorFilterOptions = {\n allowHandleError?: boolean;\n useErrorFilter?: boolean;\n};\n","/* eslint-disable @typescript-eslint/unbound-method */\n\nimport Step from '@onereach/flow-sdk/step';\nimport { ErrorFilter } from '../../decorators/error_filter';\nimport { HookErrorFilter } from '../../decorators/hook_error_filter';\nimport { CreateChatCompletionStepError, ErrorCode } from '../../errors/step_error';\nimport { ParsedArguments, ToolsWorker, ToolsWorkerConfig } from './worker';\nimport { runThread } from '../../utils/run_thread';\nimport { ACTION } from '@onereach/flow-sdk/types';\n\nimport type { CONFIG, IActionEvent, IEvent, IThreadId } from '@onereach/flow-sdk/types';\nimport type { ChatCompletionMessageFunctionToolCall, ChatCompletionToolMessageParam } from 'openai/resources';\nimport type { DataIn } from '../../schemas/data_in';\nimport type { ChatCompletionConfig } from '../../step';\nimport type { StreamControllerConfig } from '../stream_handler/controller';\n\nexport class ToolsController<TArgs extends ParsedArguments, TResult> extends Step<ToolsControllerConfig<TResult>> {\n public static readonly class = 'tl_ctrl';\n\n public static async start<TResult>(step: Step<ChatCompletionConfig>): Promise<void> {\n const threadId = this.getThreadId(step);\n await runThread<ToolsControllerConfig<TResult>, ChatCompletionConfig>(step, {\n id: threadId,\n state: {\n step: step.id,\n class: this.class,\n\n tasks: {}, // tool calls from LLM response\n expectMoreTasks: true, // flag to indicate if there are more tasks to process\n },\n });\n }\n\n public static async callTool<T extends ChatCompletionConfig | StreamControllerConfig>(\n step: Step<T>,\n toolCall: ChatCompletionMessageFunctionToolCall,\n ): Promise<void> {\n await step.process.enqueueAndRun<EventName.callTool, CallToolParams>({\n thread: this.getThreadId(step),\n name: EventName.callTool,\n params: { toolCall },\n });\n }\n\n public static async lastToolCallReceived<T extends ChatCompletionConfig | StreamControllerConfig>(\n step: Step<T>,\n ): Promise<void> {\n // notify tools controller thread that no more tool calls are expected\n // without await to prevent blocking the stream controller thread\n await step.process.enqueueAndRun<EventName.lastToolCallReceived>({\n thread: this.getThreadId(step),\n name: EventName.lastToolCallReceived,\n });\n }\n\n public static getThreadId<T extends CONFIG>(step: Step<T>): IThreadId {\n return `llm_cmp_${this.class}_${step.id}`;\n }\n\n // ---------------------------------------\n\n @ErrorFilter\n public runStep(): void {\n this.triggers\n .local(EventName.callTool, this.onCallTool)\n .local(EventName.lastToolCallReceived, this.onLastToolCallReceived)\n .otherwise(this.initialize);\n }\n\n @ErrorFilter\n public initialize(): void {\n this.log.DEBUG?.('Initializing tools controller thread');\n this.validateMergeFieldType();\n }\n\n @ErrorFilter\n public onCallTool(event: IEvent<CallToolParams, EventName.callTool>): void {\n const { toolCall } = event.params;\n\n // TODO: support other tool types\n if (toolCall.type !== 'function') {\n throw new CreateChatCompletionStepError('Only function tools are supported at the moment', {\n code: ErrorCode.UNSUPPORTED,\n });\n }\n\n this.state.tasks[toolCall.id] = {\n call: toolCall,\n status: 'pending',\n };\n\n this.startToolWorkerThread(toolCall);\n }\n\n @ErrorFilter\n public onLastToolCallReceived(): void {\n this.log.DEBUG?.('No more tool calls expected', this.state.tasks);\n this.state.expectMoreTasks = false; // set flag to indicate no more tasks expected\n this.tryEndToolsControllerThread();\n }\n\n /**\n * Starts the tool worker thread to process the tool call.\n */\n protected startToolWorkerThread(toolCall: ChatCompletionMessageFunctionToolCall): void {\n // TODO: handle error from tool worker thread\n // subscribe to tool worker thread end event\n this.triggers.hook<ToolsWorkerConfig<TArgs, TResult>, ACTION.end>(\n { name: ACTION.end, thread: ToolsWorker.getThreadId(toolCall) },\n this.onWorkerThreadEnd,\n );\n\n void ToolsWorker.start<TArgs, TResult>(this, toolCall);\n }\n\n @HookErrorFilter({ allowHandleError: false })\n public onWorkerThreadEnd(event: IActionEvent<ToolsWorkerConfig<TArgs, TResult>, ACTION.end>): void {\n this.log.DEBUG?.('Tool caller worker thread has ended', event);\n\n const { result } = event.params;\n\n if (result == null) {\n throw new CreateChatCompletionStepError('Tool worker ended unexpectedly', {\n code: ErrorCode.STEP_LOGIC_ISSUE,\n });\n } else if (result instanceof Error) {\n throw new CreateChatCompletionStepError('Tool worker thread ended with error', result, {\n code: ErrorCode.STEP_LOGIC_ISSUE,\n });\n }\n\n // TODO: validate structure of the result (zod?)\n this.log.DEBUG?.(`Tool worker thread completed successfully`, {\n toolCallId: result.toolCallId,\n result: result.data,\n });\n this.setToolCallResult(result.toolCallId, result.data);\n\n this.tryEndToolsControllerThread();\n }\n\n protected setToolCallResult(toolCallId: string, result: TResult): void {\n const toolCall = this.state.tasks[toolCallId];\n\n if (toolCall == null) {\n throw new CreateChatCompletionStepError(`Unknown tool call with id '${toolCallId}'`, {\n code: ErrorCode.STEP_LOGIC_ISSUE,\n });\n }\n\n toolCall.status = 'completed';\n toolCall.result = result;\n }\n\n protected tryEndToolsControllerThread(): void {\n if (this.state.expectMoreTasks) return;\n\n // TODO: handle errored out tool calls\n\n // check if all tool calls are completed\n const hasActiveTasks = Object.values(this.state.tasks).some((task) => task.status === 'pending');\n if (hasActiveTasks) return;\n\n this.log.DEBUG?.('All tool calls completed or failed', this.state.tasks);\n this.end({\n status: 'ok',\n messages: this.messages,\n });\n }\n\n protected get messages(): ChatCompletionToolMessageParam[] {\n return Object.values(this.state.tasks).map((task) => ({\n role: 'tool',\n tool_call_id: task.call.id,\n content: JSON.stringify(task.result),\n }));\n }\n\n protected validateMergeFieldType(): void {\n const { functionsList } = this.data;\n if (!Array.isArray(functionsList) || functionsList.length === 0) return; // no functions used\n\n if (this.dataOut == null || this.getMergeField(this.dataOut).type !== 'thread') {\n throw new CreateChatCompletionStepError('Merge-field type has to be \"Thread\" if you are using functions', {\n code: ErrorCode.VALIDATION,\n });\n }\n }\n}\n\n// ----------------- TYPES -----------------\n\nexport enum EventName {\n callTool = 'tl_run_call',\n lastToolCallReceived = 'tl_rsp_end',\n}\n\nexport type ToolCallTask<TResult> = {\n status: 'pending' | 'completed' | 'failed';\n call: ChatCompletionMessageFunctionToolCall;\n result?: TResult; // result of the tool call, if completed\n};\nexport type TasksMap<TResult> = Record<ChatCompletionMessageFunctionToolCall['id'], ToolCallTask<TResult>>;\n\nexport type ToolsControllerResult = {\n status: 'ok';\n messages: ChatCompletionToolMessageParam[]; // messages to be sent to the LLM\n};\n\nexport type CallToolParams = {\n toolCall: ChatCompletionMessageFunctionToolCall;\n};\n\nexport type ToolsControllerEvents =\n | IEvent<CallToolParams, EventName.callTool>\n | IEvent<never, EventName.lastToolCallReceived>;\n\nexport type ToolsControllerState<TResult> = {\n tasks: TasksMap<TResult>; // tool calls from LLM response,\n expectMoreTasks: boolean; // flag to indicate if there are more tasks to process\n};\n\nexport interface ToolsControllerConfig<TResult> extends CONFIG {\n dataIn: DataIn;\n state: ToolsControllerState<TResult>;\n result: ToolsControllerResult;\n events: ToolsControllerEvents;\n}\n","import Step from '@onereach/flow-sdk/step';\nimport { ErrorFilter } from '../../decorators/error_filter';\nimport { runThread } from '../../utils/run_thread';\n\nimport type { CONFIG, IThreadId } from '@onereach/flow-sdk/types';\nimport type { ChatCompletionMessageFunctionToolCall } from 'openai/resources';\nimport type { DataIn } from '../../schemas/data_in';\nimport type { ToolsControllerConfig } from './controller';\n\nexport class ToolsWorker<TArgs extends ParsedArguments, TResult> extends Step<ToolsWorkerConfig<TArgs, TResult>> {\n public static readonly class = 'tl_wrk';\n\n public static async start<TArgs extends ParsedArguments, TResult>(\n step: Step<ToolsControllerConfig<TResult>>,\n toolCall: ChatCompletionMessageFunctionToolCall,\n ): Promise<void> {\n // parse tool call arguments if they are in string format\n const parsedArguments = JSON.parse(toolCall.function?.arguments) as TArgs;\n\n await runThread<ToolsWorkerConfig<TArgs, TResult>, ToolsControllerConfig<TResult>>(step, {\n id: this.getThreadId(toolCall),\n state: {\n step: step.id,\n class: this.class,\n },\n local: {\n toolCall,\n parsedArguments,\n },\n });\n }\n\n public static getThreadId(toolCall: ChatCompletionMessageFunctionToolCall): IThreadId {\n return `llm_cmp_${this.class}_${toolCall.id}`;\n }\n\n // -----------------------------------------------------------------------------------\n\n /**\n * Initializes the tool worker thread to handle processing of repackaged content chunks.\n */\n @ErrorFilter\n public runStep(): void {\n const { toolCall, parsedArguments } = this.local as ToolsWorkerLocal<TArgs>; // TODO: remove type cast\n\n this.log.DEBUG?.('Initializing tool worker thread', toolCall);\n this.exitStep(this.getExitName(/*toolCall*/), {\n toolCall: {\n id: toolCall.id,\n type: toolCall.type,\n function: {\n name: toolCall.function.name,\n arguments: parsedArguments, // use parsed arguments\n },\n },\n });\n }\n\n protected getExitName(/*toolCall: ChatCompletionMessageFunctionToolCall*/): string {\n // TODO: add support for exits based on individual functions\n return 'function';\n }\n}\n\n// ----------------- TYPES -----------------\n\nexport type ParsedArguments<TArgs extends Record<string, unknown> = Record<string, unknown>> = TArgs;\nexport type ToolCallWithParsedArgs<TArgs extends ParsedArguments> = {\n id: string;\n type: 'function';\n function: {\n name: string;\n arguments: TArgs;\n };\n};\nexport type ToolsWorkerMergeField<TArgs extends ParsedArguments> = {\n toolCall: ToolCallWithParsedArgs<TArgs>;\n};\n\nexport type ToolsWorkerOut<TArgs extends ParsedArguments> = ToolsWorkerMergeField<TArgs>;\n\nexport type ToolsWorkerState = {\n class: typeof ToolsWorker.class;\n};\n\nexport type ToolsWorkerLocal<TArgs extends ParsedArguments> = {\n toolCall: ChatCompletionMessageFunctionToolCall;\n parsedArguments: TArgs;\n};\n\nexport type ThreadWorkerResult<TResult> = {\n toolCallId: string; // ID of the tool call that was processed\n data: TResult; // result of the tool call\n};\n\nexport interface ToolsWorkerConfig<TArgs extends ParsedArguments, TResult> extends CONFIG {\n dataIn: DataIn;\n dataOut: ToolsWorkerOut<TArgs>;\n state: ToolsWorkerState;\n result: ThreadWorkerResult<TResult>;\n local: ToolsWorkerLocal<TArgs>;\n}\n","import { z } from 'zod/v4-mini';\nimport { StreamChunkParams } from '../controller';\nimport { ChatCompletionChunk } from 'openai/resources';\nimport { IEvent } from '@onereach/flow-sdk/types';\n\nexport const streamChunkEventSchema = z.object({\n name: z.string(),\n params: z.object({\n chunk: z.object({\n id: z.string(),\n object: z.literal('chat.completion.chunk'),\n created: z.number(),\n model: z.string(),\n service_tier: z.optional(\n z.union([\n z.literal('default'),\n z.literal('auto'),\n z.literal('flex'),\n z.literal('scale'),\n z.literal('priority'),\n z.null(),\n ]),\n ),\n system_fingerprint: z.optional(z.string()),\n choices: z.array(\n z.object({\n index: z.number(),\n delta: z.object({\n role: z.optional(z.enum(['developer', 'system', 'user', 'assistant', 'tool'])),\n content: z.optional(z.string()),\n refusal: z.nullish(z.string()),\n tool_calls: z.optional(\n z.array(\n z.object({\n index: z.number().check(z.int(), z.gte(0)),\n id: z.optional(z.string()),\n type: z.optional(z.literal('function')),\n function: z.object({\n name: z.optional(z.string()),\n arguments: z.optional(z.string()),\n }),\n }) satisfies z.core.$ZodType<ChatCompletionChunk.Choice.Delta.ToolCall>,\n ),\n ),\n }),\n logprobs: z.optional(z.any()), // logprobs may be null or omitted\n finish_reason: z.union([\n z.literal('stop'),\n z.literal('length'),\n z.literal('tool_calls'),\n z.literal('content_filter'),\n z.null(),\n ]),\n }),\n ),\n\n logprobs: z.nullish(\n z.object({\n content: z.nullable(z.array(z.looseObject({}))),\n refusal: z.nullable(z.array(z.looseObject({}))),\n }),\n ),\n\n usage: z.nullish(\n z.object({\n prompt_tokens: z.number(),\n completion_tokens: z.number(),\n total_tokens: z.number(),\n completion_tokens_details: z.optional(\n z.object({\n accepted_prediction_tokens: z.optional(z.number()),\n audio_tokens: z.optional(z.number()),\n reasoning_tokens: z.optional(z.number()),\n rejected_prediction_tokens: z.optional(z.number()),\n }),\n ),\n prompt_tokens_details: z.optional(\n z.object({\n audio_tokens: z.optional(z.number()),\n cached_tokens: z.optional(z.number()),\n }),\n ),\n }),\n ),\n }) satisfies z.core.$ZodType<ChatCompletionChunk>,\n }),\n}) satisfies z.core.$ZodType<IEvent<StreamChunkParams>>;\n\nexport type StreamChunkEvent = z.infer<typeof streamChunkEventSchema>;\n","import type {\n ChatCompletion,\n ChatCompletionChunk,\n ChatCompletionMessage,\n ChatCompletionMessageFunctionToolCall,\n ChatCompletionMessageToolCall,\n} from 'openai/resources';\nimport { ParsedArguments } from '../../tools_caller/worker';\n\nexport class StreamReducerService<TArgs = ParsedArguments> {\n protected _result: Partial<ChatCompletion>;\n protected readonly _onToolCall: OnToolCallCallback<TArgs>;\n\n constructor(memo: Partial<ChatCompletion>, onToolCall: OnToolCallCallback<TArgs>) {\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 != null) {\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 const { delta, ...rest } = choice; // eslint-disable-line @typescript-eslint/no-unused-vars\n existing = rest as ChatCompletion.Choice;\n this._result.choices ??= [];\n this._result.choices[choice.index] = existing;\n }\n\n if (choice.finish_reason != null) {\n existing.finish_reason = choice.finish_reason;\n }\n\n if (choice.logprobs != null) {\n existing.logprobs = choice.logprobs;\n }\n\n if (choice.delta?.content != null) {\n const { content, ...delta } = choice.delta;\n existing.message ??= delta as ChatCompletionMessage; // TODO: not sure if it's correct to cast here\n existing.message.content ??= '';\n existing.message.content += content;\n }\n\n if (choice.delta?.tool_calls != null) {\n const { tool_calls, ...delta } = choice.delta; // eslint-disable-line @typescript-eslint/no-unused-vars\n existing.message ??= delta as ChatCompletionMessage; // TODO: not sure if it's correct to cast here\n existing.message.tool_calls ??= [];\n\n for (const deltaToolCall of choice.delta.tool_calls) {\n const i = deltaToolCall.index;\n if (existing.message.tool_calls[i] == null) {\n existing.message.tool_calls[i] = structuredClone(deltaToolCall) as ChatCompletionMessageFunctionToolCall;\n } else {\n const toolCall = existing.message.tool_calls[i];\n if (!('function' in toolCall) || toolCall.function == null) 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[i]);\n }\n }\n }\n }\n }\n\n protected tryParseToolCall(toolCall: ChatCompletionMessageToolCall): void {\n try {\n if (!('function' in toolCall) || toolCall.function == null) return;\n const parsedArgs = JSON.parse(toolCall.function.arguments) as TArgs;\n this._onToolCall(toolCall, parsedArgs);\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n } catch (error) {\n // if failed to parse, just ignore it assume it's not fully loaded yet\n }\n }\n}\n\nexport type OnToolCallCallback<TArgs = ParsedArguments> = (\n toolCall: ChatCompletionMessageFunctionToolCall,\n parsedArgs: TArgs,\n) => void;\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((val) => !['undefined', 'null'].includes(val), {\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\nexport const dataInSchema = z\n .object({\n provider: stringNoUndefinedSchema.check(z.minLength(1)),\n model: stringNoUndefinedSchema.check(z.minLength(1)),\n\n tokenName: optionalStrValue(stringNoUndefinedSchema),\n tokenNameHeader: z._default(stringNoUndefinedSchema.check(z.minLength(1)), 'x-or-account-token-name'),\n sessionIdHeader: z._default(stringNoUndefinedSchema.check(z.minLength(1)), 'x-or-session-id'),\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: optionalStrValue(z.coerce.number().check(z.gte(0), z.lte(2))),\n topP: optionalStrValue(z.coerce.number().check(z.gte(0), z.lte(1))),\n maxTokens: optionalStrValue(z.coerce.number().check(z.int(), z.gte(1))),\n presencePenalty: optionalStrValue(z.coerce.number().check(z.gte(-2), z.lte(2))),\n frequencyPenalty: optionalStrValue(z.coerce.number().check(z.gte(-2), z.lte(2))),\n n: optionalStrValue(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((val) => (val === 0 ? 50 : val)), // default value is 50\n z.int(),\n z.gte(1),\n z.lte(32768),\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: optionalStrValue(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.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 required: z.optional(z.array(z.string().check(z.minLength(1), z.maxLength(64)))),\n additionalProperties: z.literal(false),\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?.((msg) => msg.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?.((msg) => msg.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 optionalStrValue<T extends z.core.SomeType>(schema: T) {\n return z.pipe(\n z.union([z.undefined(), z.literal(''), schema]),\n z.transform((val) => (val === '' ? undefined : val)),\n );\n}\n","import OpenAI from 'openai';\nimport timestring from 'timestring';\nimport { z } from 'zod/v4-mini';\nimport { Memoize } from 'typescript-memoize';\nimport BasicThreadService from '@onereach/flow-sdk/services/basic';\n\nimport type { Stream } from 'openai/core/streaming.js';\nimport type {\n ChatCompletion,\n ChatCompletionChunk,\n ChatCompletionMessageParam,\n ChatCompletionTool,\n} from 'openai/resources';\nimport type { DataIn } from '../schemas/data_in';\nimport type { CONFIG, IThread } from '@onereach/flow-sdk/types';\n\nexport class OpenAIRequestService<TConfig extends CONFIG> extends BasicThreadService<TConfig> {\n constructor(\n thread: IThread<TConfig>,\n private readonly data: DataIn,\n ) {\n super(thread);\n this.log.DEBUG?.('OpenAIRequestService initialized');\n }\n\n /**\n * Makes a request to the OpenAI API to create a chat completion.\n */\n public async makeOpenAiRequest(\n messages: ChatCompletionMessageParam[],\n ): 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 const response = await this.openAiClient.chat.completions.create(request);\n\n if (!streamResponse) this.log.DEBUG?.('LLM response', response);\n\n return response;\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, tokenName, tokenNameHeader, sessionIdHeader } = 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 [sessionIdHeader]: this.session.get<string>(['reporting', 'sessionId']),\n ...(tokenName ? { [tokenNameHeader]: tokenName } : null),\n },\n timeout: this.timeoutMs,\n };\n this.log.DEBUG?.('OpenAI client options', clientOptions);\n\n return new OpenAI(clientOptions);\n }\n\n private get stopSequences(): string[] {\n const list = this.data.stop ?? [];\n return list.map((item) => item.token).filter((token) => token.length > 0);\n }\n\n /**\n * Returns the timeout duration in milliseconds.\n */\n @Memoize()\n private get timeoutMs(): number {\n const value = timestring(this.data.timeoutDuration, 'ms');\n\n // 1 second to 10 minutes\n return z.number().check(z.int(), z.gte(1000), z.lte(600_000)).parse(value);\n }\n}\n","import { readFile } from 'fs/promises';\n\nexport async function validateFlowSdkVersion(minVersion: string): Promise<void> {\n if (typeof minVersion !== 'string' || !minVersion.match(/^\\d+\\.\\d+\\.\\d+$/)) {\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, 'utf-8');\n\n const { version } = JSON.parse(packageJsonContent) as { version: string };\n const { groups } = version.match(/^(?<major>\\d+)\\.(?<minor>\\d+)\\.(?<patch>\\d+)/) || {};\n\n if (!groups) throw new Error(`Invalid Flow SDK version format: ${version}`);\n\n const major = parseInt(groups.major ?? '0', 10);\n const minor = parseInt(groups.minor ?? '0', 10);\n const patch = parseInt(groups.patch ?? '0', 10);\n\n if (major == null || minor == null || patch == null || isNaN(major) || isNaN(minor) || isNaN(patch)) {\n throw new Error(`Invalid version format: ${version}`);\n }\n\n const [minMajor, minMinor, minPatch] = minVersion.split('.').map((x) => parseInt(x, 10));\n\n if (\n minMajor == null ||\n minMinor == null ||\n minPatch == null ||\n isNaN(minMajor) ||\n isNaN(minMinor) ||\n isNaN(minPatch)\n ) {\n throw new Error(`Invalid minimum version format: ${minVersion}`);\n }\n\n if (\n major < minMajor ||\n (major === minMajor && minor < minMinor) ||\n (major === minMajor && minor === minMinor && patch < minPatch)\n ) {\n throw new Error(\n `Flow SDK version '${version}' is lower than required minimum version '${minVersion}' for the step`,\n );\n }\n}\n"],"mappings":"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","names":["index_exports","__export","states","step","__toCommonJS","import_source_map_support","import_step","import_step","createMethodDecoratorWithOptionalArgs","apply","defaultOptions","runApply","options","target","propertyKey","descriptor","maybe","originalMethod","value","wrappedMethod","name","Object","defineProperty","__name","arg0","arg1","arg2","import_timeout","import_v4_mini","import_base","ErrorCode","CreateChatCompletionStepError","BaseError","errorFilter","error","CreateChatCompletionStepError","TimeoutError","z","core","$ZodError","prettifyError","code","ErrorCode","VALIDATION","Error","message","includes","TIMEOUT","AUTH","responseErrorMessage","response","data","SERVER_ERROR","UNKNOWN","defaultOptions","ErrorFilter","createMethodDecoratorWithOptionalArgs","_options","_target","propertyKey","descriptor","originalMethod","value","args","result","apply","Promise","catch","error","methodName","toString","log","DEBUG","errorFilter","_ts_decorate","decorators","target","key","desc","__name","HistoryController","Step","class","start","step","threadId","getThreadId","process","getThread","thread","runThread","id","background","state","messages","prepareHistory","enqueueAndRun","name","appendToHistory","message","params","getHistory","getSafeThread","runStep","triggers","local","onPrepareHistory","onAppendToHistory","otherwise","log","DEBUG","customHistory","historyLength","systemMessage","typeOfStep","userMessage","historyMode","historyMergefield","historyCode","assistantsFirstMessage","data","role","content","length","push","at","some","slice","systemMessageRecord","unshift","event","Array","isArray","import_step","import_step","import_types","runThread","step","id","state","options","thread","process","getThread","log","DEBUG","background","ended","Error","enqueueAndRun","name","ACTION","goto","StreamWorker","Step","class","start","step","event","runThread","id","getThreadId","state","isBusy","workerThread","getThread","ended","workerThreadId","process","runStep","CreateChatCompletionStepError","code","ErrorCode","STEP_LOGIC_ISSUE","chunk","log","DEBUG","exitStep","import_types","defaultOptions","allowHandleError","useErrorFilter","HookErrorFilter","createMethodDecoratorWithOptionalArgs","options","_target","propertyKey","descriptor","originalMethod","value","args","result","apply","Promise","catch","error","errorHandler","call","methodName","toString","log","DEBUG","filteredError","errorFilter","Error","thread","enqueue","name","ACTION","end","import_step","import_step","ToolsWorker","Step","class","start","step","toolCall","parsedArguments","JSON","parse","function","arguments","runThread","id","getThreadId","state","local","runStep","log","DEBUG","exitStep","getExitName","type","name","import_types","_ts_decorate","decorators","target","key","desc","__name","ToolsController","Step","class","start","step","threadId","getThreadId","runThread","id","state","tasks","expectMoreTasks","callTool","toolCall","process","enqueueAndRun","thread","name","params","lastToolCallReceived","runStep","triggers","local","onCallTool","onLastToolCallReceived","otherwise","initialize","log","DEBUG","validateMergeFieldType","event","type","CreateChatCompletionStepError","code","ErrorCode","UNSUPPORTED","call","status","startToolWorkerThread","tryEndToolsControllerThread","hook","ACTION","end","ToolsWorker","onWorkerThreadEnd","result","STEP_LOGIC_ISSUE","Error","toolCallId","data","setToolCallResult","Object","values","some","task","messages","map","role","tool_call_id","content","JSON","stringify","functionsList","Array","isArray","length","dataOut","getMergeField","VALIDATION","allowHandleError","import_v4_mini","streamChunkEventSchema","z","object","name","string","params","chunk","id","literal","created","number","model","service_tier","optional","union","null","system_fingerprint","choices","array","index","delta","role","enum","content","refusal","nullish","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","usage","choice","existing","index","delta","finish_reason","logprobs","content","message","tool_calls","deltaToolCall","i","structuredClone","toolCall","function","arguments","tryParseToolCall","parsedArgs","JSON","parse","import_types","_ts_decorate","decorators","target","key","desc","__name","StreamController","Step","class","start","step","runThread","id","getThreadId","state","completionResult","events","lastChunkReceived","index","skipIndexWarning","handleChunk","chunk","process","enqueueAndRun","thread","name","params","runStep","triggers","hook","ACTION","end","StreamWorker","onWorkerThreadEnd","local","onStreamChunk","onLastStreamChunkReceived","otherwise","log","DEBUG","event","result","tryRunWorker","streamChunkEventSchema","parse","StreamReducerService","onToolCall","bind","reduceChunk","chunkChoice","choices","handleMultipleChoices","content","delta","length","addContentToQueue","scheduleNextContentEvent","handleLengthFinishReason","choice","WARN","choiceIndex","finish_reason","CreateChatCompletionStepError","code","ErrorCode","LLM_FINISH_LENGTH","toolCall","ToolsController","callTool","firstEvent","isEventReady","lastEvent","at","maxChunkContentLength","mergedChunk","slice","ts","Date","now","push","isBusy","getEventToProcess","status","completion","eventDelay","debounceDuration","shift","lastToolCallReceived","data","streamSettings","maxBufferLength","allowHandleError","import_v4_mini","import_locales","z","config","en","stringNoUndefinedSchema","string","check","trim","refine","val","includes","error","messageSchema","discriminatedUnion","object","role","literal","content","name","optional","minLength","maxLength","nullable","tool_calls","array","id","type","function","arguments","tool_call_id","dataInSchema","provider","model","tokenName","optionalStrValue","tokenNameHeader","_default","sessionIdHeader","typeOfStep","enum","systemMessage","userMessage","switchAssistantsMessage","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","description","parameters","properties","record","items","required","additionalProperties","strict","processError","processTimeout","timeoutDuration","data","undefined","find","msg","schema","pipe","union","transform","import_openai","import_timestring","import_v4_mini","import_typescript_memoize","import_basic","OpenAIRequestService","BasicThreadService","thread","data","log","DEBUG","makeOpenAiRequest","messages","model","temperature","topP","maxTokens","frequencyPenalty","presencePenalty","n","streamResponse","request","structuredClone","top_p","max_tokens","frequency_penalty","presence_penalty","stop","stopSequences","stream","tools","response","openAiClient","chat","completions","create","functionsList","Array","isArray","length","map","tool","type","function","name","description","parameters","Object","keys","undefined","strict","provider","tokenName","tokenNameHeader","sessionIdHeader","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","import_typescript_memoize","import_promises","validateFlowSdkVersion","minVersion","match","Error","packageJsonPath","require","packageJsonContent","readFile","version","JSON","parse","groups","major","parseInt","minor","patch","isNaN","minMajor","minMinor","minPatch","split","map","x","import_types","_ts_decorate","decorators","target","key","desc","__name","MINIMAL_FLOW_SDK_VERSION","CreateChatCompletionStep","Step","resolveDataIn","dataIn","log","DEBUG","dataInSchema","parse","runStep","streamResponse","data","triggers","hook","name","ACTION","end","thread","StreamController","getThreadId","onStreamControllerThreadEnd","ToolsController","onToolsControllerEnd","otherwise","initRequest","validateFlowSdkVersion","state","contentReady","toolsReady","chatCompletion","undefined","toolsResults","Promise","all","start","HistoryController","prepareHistory","response","openAiService","makeOpenAiRequest","history","handleStreamResponse","handleResponse","choices","length","WARN","choicesNumber","toolCalls","message","tool_calls","toolCall","callTool","lastToolCallReceived","chunk","handleChunk","lastChunkReceived","event","result","params","Error","error","CreateChatCompletionStepError","code","ErrorCode","STEP_LOGIC_ISSUE","status","messages","Array","isArray","tryToExitStep","completion","completionMessage","appendToHistory","finish_reason","jumpTo","currentStepId","exitStep","_history","getHistory","OpenAIRequestService","install","step","CreateChatCompletionStep","states","HistoryController","class","ToolsController","ToolsWorker","StreamController","StreamWorker"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@onereach/step-create-chat-completion",
|
|
3
|
-
"version": "0.0.7-rc.
|
|
3
|
+
"version": "0.0.7-rc.22",
|
|
4
4
|
"description": "Logic for creating LLM chat completion step",
|
|
5
5
|
"keywords": [],
|
|
6
6
|
"license": "MIT",
|
|
@@ -20,20 +20,20 @@
|
|
|
20
20
|
"preversion": "pnpm build && pnpm test"
|
|
21
21
|
},
|
|
22
22
|
"dependencies": {
|
|
23
|
-
"openai": "^5.
|
|
23
|
+
"openai": "^5.12.2",
|
|
24
24
|
"source-map-support": "^0.5.21",
|
|
25
25
|
"timestring": "^7.0.0",
|
|
26
26
|
"typescript-memoize": "^1.1.1",
|
|
27
27
|
"zod": "^3.25.76"
|
|
28
28
|
},
|
|
29
29
|
"devDependencies": {
|
|
30
|
-
"@aws-sdk/client-kms": "^3.
|
|
31
|
-
"@onereach/flow-sdk": "^8.0.
|
|
30
|
+
"@aws-sdk/client-kms": "^3.864.0",
|
|
31
|
+
"@onereach/flow-sdk": "^8.0.20",
|
|
32
32
|
"@onereach/get-version-data": "^3.1.0",
|
|
33
33
|
"@onereach/orb-em-core": "7.2.12",
|
|
34
34
|
"@onereach/orb-test-helpers": "7.2.12",
|
|
35
|
-
"@swc/core": "^1.13.
|
|
36
|
-
"@types/node": "^24.1
|
|
35
|
+
"@swc/core": "^1.13.3",
|
|
36
|
+
"@types/node": "^24.2.1",
|
|
37
37
|
"@types/source-map-support": "^0.5.10",
|
|
38
38
|
"@types/timestring": "^7.0.0",
|
|
39
39
|
"esbuild-visualizer": "^0.7.0",
|