@cloudbase/agent-adapter-llamaindex 0.0.2 → 0.0.6

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/CHANGELOG.md CHANGED
@@ -1,5 +1,71 @@
1
1
  # @cloudbase/agent-adapter-llamaindex
2
2
 
3
+ ## 0.0.11-alpha.3
4
+
5
+ ### Patch Changes
6
+
7
+ - alpha release 0.0.10-alpha.2
8
+ - Update all public packages to version 0.0.10-alpha.2
9
+ - Trigger automated alpha release workflow
10
+ - Includes latest features and improvements
11
+
12
+ - Updated dependencies
13
+ - @cloudbase/agent-agents@0.0.11-alpha.3
14
+
15
+ ## 0.0.11-alpha.2
16
+
17
+ ### Patch Changes
18
+
19
+ - alpha release 0.0.10-alpha.2
20
+ - Update all public packages to version 0.0.10-alpha.2
21
+ - Trigger automated alpha release workflow
22
+ - Includes latest features and improvements
23
+
24
+ - Updated dependencies
25
+ - @cloudbase/agent-agents@0.0.11-alpha.2
26
+
27
+ ## 0.0.11-alpha.1
28
+
29
+ ### Patch Changes
30
+
31
+ - alpha release 0.0.10-alpha.2
32
+ - Update all public packages to version 0.0.10-alpha.2
33
+ - Trigger automated alpha release workflow
34
+ - Includes latest features and improvements
35
+
36
+ - Updated dependencies
37
+ - @cloudbase/agent-agents@0.0.11-alpha.1
38
+
39
+ ## 0.0.11-alpha.0
40
+
41
+ ### Patch Changes
42
+
43
+ - 97b2740: alpha release 0.0.10-alpha.2
44
+ - Update all public packages to version 0.0.10-alpha.2
45
+ - Trigger automated alpha release workflow
46
+ - Includes latest features and improvements
47
+
48
+ - fd4c62a: alpha release 0.0.10-alpha.2
49
+ - Update all public packages to version 0.0.10-alpha.2
50
+ - Trigger automated alpha release workflow
51
+ - Includes latest features and improvements
52
+
53
+ - da3388c: alpha release 0.0.10-alpha.2
54
+ - Update all public packages to version 0.0.10-alpha.2
55
+ - Trigger automated alpha release workflow
56
+ - Includes latest features and improvements
57
+
58
+ - alpha release 0.0.10-alpha.2
59
+ - Update all public packages to version 0.0.10-alpha.2
60
+ - Trigger automated alpha release workflow
61
+ - Includes latest features and improvements
62
+
63
+ - Updated dependencies [97b2740]
64
+ - Updated dependencies [fd4c62a]
65
+ - Updated dependencies [da3388c]
66
+ - Updated dependencies
67
+ - @cloudbase/agent-agents@0.0.11-alpha.0
68
+
3
69
  ## 0.0.10
4
70
 
5
71
  ### Patch Changes
package/dist/index.d.mts CHANGED
@@ -135,14 +135,14 @@ interface RunnableWorkflow<T = unknown, R extends unknown[] = unknown[]> {
135
135
  type AgentConstructorConfig<T = unknown> = AgentConfig & {
136
136
  workflowFactory?: () => RunnableWorkflow;
137
137
  memoryFactory?: () => Memory;
138
- } & Pick<FunctionAgentParams, 'llm' | 'tools' | 'systemPrompt' | 'name'>;
138
+ } & Pick<FunctionAgentParams, "llm" | "tools" | "systemPrompt" | "name">;
139
139
  declare class LlamaIndexAgent<T = unknown> extends AbstractAgent {
140
140
  name: string;
141
141
  private _conversationMemory;
142
- readonly baseParams: Pick<FunctionAgentParams, 'llm' | 'tools' | 'systemPrompt'>;
142
+ readonly baseParams: Pick<FunctionAgentParams, "llm" | "tools" | "systemPrompt">;
143
143
  private readonly _workflowFactory?;
144
144
  constructor(agentConfig: AgentConstructorConfig<T>);
145
- protected run(input: RunAgentInput): Observable<BaseEvent>;
145
+ run(input: RunAgentInput): Observable<BaseEvent>;
146
146
  private _run;
147
147
  private getEventLabel;
148
148
  toAGUIAgent(): AbstractAgent;
package/dist/index.d.ts CHANGED
@@ -135,14 +135,14 @@ interface RunnableWorkflow<T = unknown, R extends unknown[] = unknown[]> {
135
135
  type AgentConstructorConfig<T = unknown> = AgentConfig & {
136
136
  workflowFactory?: () => RunnableWorkflow;
137
137
  memoryFactory?: () => Memory;
138
- } & Pick<FunctionAgentParams, 'llm' | 'tools' | 'systemPrompt' | 'name'>;
138
+ } & Pick<FunctionAgentParams, "llm" | "tools" | "systemPrompt" | "name">;
139
139
  declare class LlamaIndexAgent<T = unknown> extends AbstractAgent {
140
140
  name: string;
141
141
  private _conversationMemory;
142
- readonly baseParams: Pick<FunctionAgentParams, 'llm' | 'tools' | 'systemPrompt'>;
142
+ readonly baseParams: Pick<FunctionAgentParams, "llm" | "tools" | "systemPrompt">;
143
143
  private readonly _workflowFactory?;
144
144
  constructor(agentConfig: AgentConstructorConfig<T>);
145
- protected run(input: RunAgentInput): Observable<BaseEvent>;
145
+ run(input: RunAgentInput): Observable<BaseEvent>;
146
146
  private _run;
147
147
  private getEventLabel;
148
148
  toAGUIAgent(): AbstractAgent;
package/dist/index.js CHANGED
@@ -733,7 +733,9 @@ var LlamaIndexAgent = class extends import_abstract.AbstractAgent {
733
733
  });
734
734
  const lastUserMessage = [...messages].reverse().find((x) => x.role === "user");
735
735
  const userInput = lastUserMessage?.content;
736
- const chatHistory = messages.filter((m) => m !== lastUserMessage).map((m) => aguiToLlamaIndexMessage(m)).filter((m) => Boolean(m));
736
+ const chatHistory = messages.filter((m) => m !== lastUserMessage).map((m) => aguiToLlamaIndexMessage(m)).filter(
737
+ (m) => Boolean(m)
738
+ );
737
739
  let activeMessageId;
738
740
  try {
739
741
  const { llm, tools, systemPrompt } = this.baseParams;
@@ -741,7 +743,10 @@ var LlamaIndexAgent = class extends import_abstract.AbstractAgent {
741
743
  const workflow = typeof this._workflowFactory === "function" ? this._workflowFactory() : AguiLlamaIndexWorkflow.fromTools({
742
744
  memory: memoryForRun,
743
745
  llm,
744
- tools: [...tools ?? [], ...convertToolsToLlamaIndexTools(inputTools ?? [])],
746
+ tools: [
747
+ ...tools ?? [],
748
+ ...convertToolsToLlamaIndexTools(inputTools ?? [])
749
+ ],
745
750
  systemPrompt
746
751
  });
747
752
  workflow.setFrontendTools?.((inputTools ?? [])?.map((t) => t.name));
@@ -920,7 +925,11 @@ function aguiToLlamaIndexMessage(message) {
920
925
  case "system":
921
926
  return { role: "system", content: message.content };
922
927
  case "tool":
923
- return { role: "tool", content: message.content, toolCallId: message.toolCallId };
928
+ return {
929
+ role: "tool",
930
+ content: message.content,
931
+ toolCallId: message.toolCallId
932
+ };
924
933
  default:
925
934
  return void 0;
926
935
  }
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/agent.ts","../src/workflow.ts","../src/conversation-memory.ts"],"sourcesContent":["import { ChatMessage } from 'llamaindex';\n\nexport { startAgentEvent, stopAgentEvent, toolCallsEvent, toolResultsEvent } from \"@llamaindex/workflow\";\n\nexport { LlamaIndexAgent } from './agent';\nexport { AguiLlamaIndexWorkflow } from './workflow';","import { AbstractAgent, AgentConfig } from \"@cloudbase/agent-agents/abstract\";\nimport { BaseEvent, EventType, RunAgentInput, RunFinishedEvent, RunStartedEvent, TextMessageContentEvent, TextMessageEndEvent, TextMessageStartEvent, ToolCallArgsEvent, ToolCallEndEvent, ToolCallResultEvent, ToolCallStartEvent } from \"@ag-ui/client\";\nimport { Observable, Subscriber } from \"rxjs\";\nimport { FunctionAgentParams, agentStreamEvent, startAgentEvent, stopAgentEvent, toolCallsEvent, toolResultsEvent, agentToolCallEvent, agentToolCallResultEvent, FunctionAgent, agentInputEvent, agentSetupEvent, agentStepEvent, agentOutputEvent, WorkflowEvent, AgentToolCall, WorkflowStream, WorkflowEventData } from \"@llamaindex/workflow\";\nimport { AguiLlamaIndexWorkflow, RunnableWorkflow, toolCallChunkEvent, toolCallStartEvent } from \"./workflow\";\nimport { BaseTool, BaseToolWithCall, createMemory, Memory } from \"llamaindex\";\nimport { ConversationMemory } from \"./conversation-memory\";\nimport { safeDestr } from 'destr'\nimport { setTimeout } from \"node:timers/promises\";\nimport debug from \"debug\";\n\nconst log = debug('agkit:llamaindex-ts_events');\ntype AgentConstructorConfig<T = unknown> = AgentConfig & { workflowFactory?: () => RunnableWorkflow; memoryFactory?: () => Memory } & Pick<FunctionAgentParams, 'llm' | 'tools' | 'systemPrompt' | 'name'>;\n\nexport class LlamaIndexAgent<T = unknown> extends AbstractAgent {\n public name: string;\n private _conversationMemory: ConversationMemory;\n\n readonly baseParams: Pick<FunctionAgentParams, 'llm' | 'tools' | 'systemPrompt'>;\n private readonly _workflowFactory?: () => RunnableWorkflow;\n\n constructor(agentConfig: AgentConstructorConfig<T>) {\n const { workflowFactory, ...rest } = agentConfig as AgentConstructorConfig<T>;\n super(rest);\n const { llm, tools, systemPrompt, memoryFactory } = rest as Pick<FunctionAgentParams, 'llm' | 'tools' | 'systemPrompt'> & { memoryFactory?: () => Memory };\n this._conversationMemory = new ConversationMemory({ memoryFactory });\n this.baseParams = { llm, tools, systemPrompt };\n this.name = agentConfig.name || 'Agent';\n this._workflowFactory = workflowFactory;\n }\n\n protected run(input: RunAgentInput): Observable<BaseEvent> {\n return new Observable<BaseEvent>((subscriber) => {\n this._run(subscriber, input);\n });\n }\n\n private async _run(subscriber: Subscriber<BaseEvent>, input: RunAgentInput) {\n const { messages, runId, threadId, tools: inputTools } = input;\n\n const toolCallArgsTemp: Record<string, string> = {};\n\n\n subscriber.next({\n type: EventType.RUN_STARTED,\n threadId,\n runId,\n } as RunStartedEvent);\n\n const lastUserMessage = [...messages].reverse().find((x) => x.role === \"user\");\n const userInput = lastUserMessage?.content;\n // if (!userInput) {\n // throw new Error(\"User input is required\");\n // }\n\n // Convert AG-UI messages to LlamaIndex ChatMessage[] as chat history (excluding latest user input)\n const chatHistory = messages\n .filter((m) => m !== lastUserMessage)\n .map((m) => aguiToLlamaIndexMessage(m))\n .filter((m): m is NonNullable<ReturnType<typeof aguiToLlamaIndexMessage>> => Boolean(m));\n\n let activeMessageId: string | undefined;\n\n try {\n const { llm, tools, systemPrompt } = this.baseParams;\n const memoryForRun = this._conversationMemory.getMemory(threadId);\n const workflow = typeof this._workflowFactory === 'function' ? this._workflowFactory() : AguiLlamaIndexWorkflow.fromTools({\n memory: memoryForRun,\n llm,\n tools: [...(tools ?? []), ...(convertToolsToLlamaIndexTools(inputTools ?? []))],\n systemPrompt,\n });\n workflow.setFrontendTools?.((inputTools ?? [])?.map((t) => t.name));\n const stream = workflow.runStream(userInput ?? '', { chatHistory });\n\n for await (const ev of stream as any) {\n\n log('event', this.getEventLabel(ev), ev.toJSON());\n // Text streaming\n if (agentStreamEvent.include(ev)) {\n if (!activeMessageId) {\n activeMessageId = generateId();\n subscriber.next({\n type: EventType.TEXT_MESSAGE_START,\n messageId: activeMessageId,\n role: \"assistant\",\n } as TextMessageStartEvent);\n }\n\n const delta = (ev.data as any)?.delta as string | undefined;\n if (delta) {\n subscriber.next({\n type: EventType.TEXT_MESSAGE_CONTENT,\n messageId: activeMessageId,\n delta,\n } as TextMessageContentEvent);\n }\n continue;\n }\n let hasToolCallStartEvent = false;\n if (toolCallStartEvent.include(ev)) {\n hasToolCallStartEvent = true;\n const { toolCall } = ev.data;\n const toolCallId = toolCall.toolId ?? generateId();\n const toolCallName = toolCall.toolName;\n const args = toolCall.toolKwargs ?? {};\n subscriber.next({\n type: EventType.TOOL_CALL_START,\n toolCallId,\n toolCallName,\n } as ToolCallStartEvent);\n\n }\n if (toolCallChunkEvent.include(ev)) {\n const { toolCall: toolCallOptions } = ev.data;\n for (const toolCall of toolCallOptions) {\n const { input, id } = toolCall\n const oldInput = toolCallArgsTemp[id] ?? '';\n if (typeof input === 'string') {\n subscriber.next({\n type: EventType.TOOL_CALL_ARGS,\n toolCallId: id,\n delta: input.replace(new RegExp(`^${oldInput}`), ''),\n } as ToolCallArgsEvent);\n toolCallArgsTemp[id] = input;\n }\n\n }\n }\n if (hasToolCallStartEvent && toolCallsEvent.include(ev)) {\n const { toolCalls } = ev.data;\n for (const toolCall of toolCalls) {\n const toolCallId = toolCall.toolId ?? generateId();\n subscriber.next({\n type: EventType.TOOL_CALL_END,\n toolCallId,\n } as ToolCallEndEvent);\n delete toolCallArgsTemp[toolCallId];\n }\n }\n\n // Single tool call event\n if (agentToolCallEvent.include(ev) && !hasToolCallStartEvent) {\n const call = ev.data as any;\n const toolCallId = call.toolId ?? generateId();\n const toolCallName = call.toolName;\n const args = call.toolKwargs ?? {};\n\n subscriber.next({\n type: EventType.TOOL_CALL_START,\n toolCallId,\n toolCallName,\n } as ToolCallStartEvent);\n\n subscriber.next({\n type: EventType.TOOL_CALL_ARGS,\n toolCallId,\n delta: JSON.stringify(args),\n } as ToolCallArgsEvent);\n\n subscriber.next({\n type: EventType.TOOL_CALL_END,\n toolCallId,\n } as ToolCallEndEvent);\n continue;\n }\n\n // Single tool result event\n if (agentToolCallResultEvent.include(ev)) {\n const r = ev.data as any;\n const toolCallId = r.toolId ?? generateId();\n const content = normalizeToolOutput(r.toolOutput);\n subscriber.next({\n type: EventType.TOOL_CALL_RESULT,\n toolCallId,\n content,\n messageId: activeMessageId,\n } as ToolCallResultEvent);\n continue;\n }\n\n // Agent finished\n if (stopAgentEvent.include(ev)) {\n if (activeMessageId) {\n subscriber.next({\n type: EventType.TEXT_MESSAGE_END,\n messageId: activeMessageId,\n } as TextMessageEndEvent);\n }\n\n subscriber.next({\n type: EventType.RUN_FINISHED,\n threadId,\n runId,\n } as RunFinishedEvent);\n subscriber.complete();\n return;\n }\n\n }\n\n workflow.setFrontendTools?.([]);\n\n // Fallback if stream ends without explicit stop event\n if (activeMessageId) {\n subscriber.next({\n type: EventType.TEXT_MESSAGE_END,\n messageId: activeMessageId,\n } as TextMessageEndEvent);\n }\n subscriber.next({\n type: EventType.RUN_FINISHED,\n threadId,\n runId,\n } as RunFinishedEvent);\n subscriber.complete();\n } catch (err) {\n // Let AbstractAgent error handling deal with it by throwing\n throw err;\n }\n }\n\n private getEventLabel(ev: WorkflowEvent<unknown>): string {\n let label = ev.debugLabel;\n if (!label) {\n if (agentStreamEvent.include(ev)) {\n label = 'agent_stream';\n } else if (agentToolCallEvent.include(ev)) {\n label = 'agent_tool_call';\n } else if (toolResultsEvent.include(ev)) {\n label = 'tool_results';\n } else if (agentToolCallResultEvent.include(ev)) {\n label = 'agent_tool_call_result';\n } else if (stopAgentEvent.include(ev)) {\n label = 'stop_agent';\n } else if (startAgentEvent.include(ev)) {\n label = 'start_agent';\n } else if (agentInputEvent.include(ev)) {\n label = 'agent_input';\n } else if (agentSetupEvent.include(ev)) {\n label = 'agent_setup';\n } else if (agentStepEvent.include(ev)) {\n label = 'agent_step';\n } else if (toolCallChunkEvent.include(ev)) {\n label = 'tool_call_chunk';\n } else if (toolCallStartEvent.include(ev)) {\n label = 'tool_call_start';\n } else if (toolCallsEvent.include(ev)) {\n label = 'tool_calls';\n } else if (agentOutputEvent.include(ev)) {\n label = 'agent_output';\n } else {\n label = 'unknown' + ev.toString();\n }\n }\n return label;\n }\n\n toAGUIAgent(): AbstractAgent {\n return this;\n }\n}\n\nfunction aguiToLlamaIndexMessage(message: any): any | undefined {\n switch (message.role) {\n case \"user\":\n return { role: \"user\", content: message.content };\n case \"assistant\":\n return { role: \"assistant\", content: message.content ?? \"\" };\n case \"system\":\n return { role: \"system\", content: message.content };\n case \"tool\":\n return { role: \"tool\", content: message.content, toolCallId: message.toolCallId };\n default:\n return undefined;\n }\n}\n\nfunction generateId(): string {\n return `${Date.now()}-${Math.random().toString(36).slice(2, 10)}`;\n}\n\nfunction normalizeToolOutput(output: any): string {\n if (output == null) return \"\";\n if (typeof output === \"string\") return output;\n if (typeof output === \"object\" && \"content\" in output && typeof (output as any).content === \"string\") {\n return (output as any).content as string;\n }\n try {\n return JSON.stringify(output);\n } catch {\n return String(output);\n }\n}\n\n\n\nfunction convertToolsToLlamaIndexTools(tools: RunAgentInput['tools']): BaseToolWithCall[] {\n return tools.map((t) => ({\n metadata: {\n name: t.name,\n description: t.description,\n parameters: safeDestr(t.parameters),\n },\n call: async (input: any) => {\n return `Called ${t.name} with input ${JSON.stringify(input)}`;\n }\n }));\n}\n\n\n","// Modified from https://github.com/run-llama/LlamaIndexTS/blob/fc385dc16757a73dc19ca239ebbe1e6155ed4b4d/packages/workflow/src/agent/agent-workflow.ts#L175\n\nimport { callTool } from \"llamaindex\";\nimport type { BaseToolWithCall, ChatResponseChunk, JSONObject, JSONValue, ToolCallLLMMessageOptions, ToolCallOptions } from \"llamaindex\";\nimport type { ChatMessage, MessageContent } from \"llamaindex\";\nimport { createMemory, Memory } from \"llamaindex\";\nimport { PromptTemplate } from \"llamaindex\";\nimport { tool } from \"llamaindex\";\nimport { stringifyJSONToMessageContent } from \"llamaindex\";\nimport { z, type ZodSchema } from \"zod/v4\";\nimport { consoleLogger, emptyLogger, type Logger } from \"@llamaindex/env\";\nimport {\n AgentOutput,\n agentStepEvent,\n agentStreamEvent,\n AgentWorkflowState,\n BaseWorkflowAgent,\n createStatefulMiddleware,\n createWorkflow,\n startAgentEvent,\n StatefulContext,\n stopAgentEvent,\n toolCallsEvent,\n toolResultsEvent,\n workflowEvent,\n WorkflowStream,\n type Handler,\n type Workflow,\n type WorkflowContext,\n type WorkflowEvent,\n type WorkflowEventData,\n} from \"@llamaindex/workflow\";\nimport {\n agentInputEvent,\n agentOutputEvent,\n agentSetupEvent,\n agentToolCallEvent,\n agentToolCallResultEvent,\n type AgentInput,\n type AgentSetup,\n type AgentToolCall,\n type AgentToolCallResult,\n} from \"@llamaindex/workflow\";\nimport { FunctionAgent, type FunctionAgentParams } from \"@llamaindex/workflow\";\n\nconst DEFAULT_HANDOFF_PROMPT = new PromptTemplate({\n template: `Useful for handing off to another agent.\nIf you are currently not equipped to handle the user's request, or another agent is better suited to handle the request, please hand off to the appropriate agent.\n\nCurrently available agents: \n{agent_info}\n`,\n});\n\nconst DEFAULT_HANDOFF_OUTPUT_PROMPT = new PromptTemplate({\n template: `Agent {to_agent} is now handling the request due to the following reason: {reason}.\\nPlease continue with the current request.`,\n});\n\nexport type AgentInputData = {\n userInput?: MessageContent | undefined;\n chatHistory?: Array<ChatMessage | Omit<ChatMessage, 'role'> & { role: \"tool\", toolCallId: string }> | undefined;\n};\n\n\nexport type AgentResultData<O = JSONObject> = {\n result: MessageContent;\n message: ChatMessage;\n state?: AgentWorkflowState | undefined;\n object?: O | undefined;\n};\n\n// Wrapper events for multiple tool calls and results\nexport type ToolCalls = {\n agentName: string;\n toolCalls: AgentToolCall[];\n};\n\nexport type ToolResults = {\n agentName: string;\n results: AgentToolCallResult[];\n};\n\nexport type AgentStep = {\n agentName: string;\n response: ChatMessage;\n toolCalls: AgentToolCall[];\n};\n\nexport type SingleAgentParams = FunctionAgentParams & {\n /**\n * Optional predefined memory to use for the workflow.\n * If not provided, a new empty memory will be created.\n */\n memory?: Memory;\n /**\n * Whether to log verbose output\n */\n verbose?: boolean;\n /**\n * Timeout for the workflow in seconds\n */\n timeout?: number;\n /**\n * Attach optional custom logger\n */\n logger?: Logger;\n};\n\nexport type AgentWorkflowParams = {\n /**\n * List of agents to include in the workflow.\n * Need at least one agent.\n * Can also be an array of AgentWorkflow objects, in which case the agents from each workflow will be extracted.\n */\n agents: BaseWorkflowAgent[] | AguiLlamaIndexWorkflow[];\n /**\n * The agent to start the workflow with.\n * Must be an agent in the `agents` list.\n * Can also be an AgentWorkflow object, in which case the workflow must have exactly one agent.\n */\n rootAgent: BaseWorkflowAgent | AguiLlamaIndexWorkflow;\n /**\n * Optional predefined memory to use for the workflow.\n * If not provided, a new empty memory will be created.\n */\n memory?: Memory | undefined;\n /**\n * Whether to log verbose output\n */\n verbose?: boolean;\n /**\n * Timeout for the workflow in seconds.\n */\n timeout?: number;\n /**\n * Attach optional custom logger\n */\n logger?: Logger | undefined;\n};\n\n/**\n * Create a multi-agent workflow\n * @param params - Parameters for the AgentWorkflow\n * @returns A new AgentWorkflow instance\n */\nexport const multiAgent = (params: AgentWorkflowParams): AguiLlamaIndexWorkflow => {\n return new AguiLlamaIndexWorkflow(params);\n};\n\n/**\n * Create a simple workflow with a single agent and specified tools\n * @param params - Parameters for the single agent workflow\n * @returns A new AgentWorkflow instance\n */\nexport const agent = (params: SingleAgentParams): AguiLlamaIndexWorkflow => {\n return AguiLlamaIndexWorkflow.fromTools(params);\n};\n\nexport const FRONTEND_TOOL_MARKER = '~@~@FRONTEND_TOOL_MARKER@~@~';\n\n/**\n * AgentWorkflow - An event-driven workflow for executing agents with tools\n *\n * This class provides a simple interface for creating and running agent workflows\n * based on the LlamaIndexTS workflow system. It supports single agent workflows\n * with multiple tools.\n */\nexport class AguiLlamaIndexWorkflow implements Workflow, RunnableWorkflow {\n private stateful = createStatefulMiddleware(\n (state: AgentWorkflowState) => state,\n );\n private workflow = this.stateful.withState(createWorkflow());\n private agents: Map<string, BaseWorkflowAgent> = new Map();\n private verbose: boolean;\n private rootAgentName: string;\n private initialMemory?: Memory;\n private logger: Logger;\n\n private frontendTools: string[] = [];\n\n constructor({\n agents,\n rootAgent,\n memory,\n verbose,\n logger,\n }: AgentWorkflowParams) {\n this.verbose = verbose ?? false;\n if (memory) {\n this.initialMemory = memory;\n }\n\n // Handle AgentWorkflow cases for agents\n const processedAgents: BaseWorkflowAgent[] = [];\n if (agents.length > 0) {\n if (agents[0] instanceof AguiLlamaIndexWorkflow) {\n // If agents is AgentWorkflow[], extract the BaseWorkflowAgent from each workflow\n const agentWorkflows = agents as AguiLlamaIndexWorkflow[];\n agentWorkflows.forEach((workflow) => {\n const workflowAgents = workflow.getAgents();\n processedAgents.push(...workflowAgents);\n });\n } else {\n // Otherwise, agents is already BaseWorkflowAgent[]\n processedAgents.push(...(agents as BaseWorkflowAgent[]));\n }\n }\n\n // Handle AgentWorkflow case for rootAgent and set rootAgentName\n if (rootAgent instanceof AguiLlamaIndexWorkflow) {\n // If rootAgent is an AgentWorkflow, check if it has exactly one agent\n const rootAgents = rootAgent.getAgents();\n\n if (rootAgents.length !== 1) {\n throw new Error(\n `Root agent must be a single agent, but it is a workflow with ${rootAgents.length} agents`,\n );\n }\n\n // We know rootAgents[0] exists because we checked length === 1 above\n this.rootAgentName = rootAgents[0]!.name;\n } else {\n // Otherwise, rootAgent is already a BaseWorkflowAgent\n this.rootAgentName = rootAgent.name;\n }\n\n // Validate root agent\n if (!processedAgents.some((a) => a.name === this.rootAgentName)) {\n throw new Error(`Root agent ${this.rootAgentName} not found in agents`);\n }\n\n this.addAgents(processedAgents);\n this.setupWorkflowSteps();\n\n // Use the provided logger if exists, else default to consoleLogger if verbose, else emptyLogger\n this.logger = logger ?? (this.verbose ? consoleLogger : emptyLogger);\n }\n\n handle<\n const AcceptEvents extends WorkflowEvent<unknown>[],\n Result extends ReturnType<WorkflowEvent<unknown>[\"with\"]> | void,\n >(accept: AcceptEvents, handler: Handler<AcceptEvents, Result>): void {\n this.workflow.handle(accept, handler);\n }\n\n createContext(): WorkflowContext {\n return this.workflow.createContext(this.createInitialState());\n }\n\n private addAgents(agents: BaseWorkflowAgent[]): void {\n const agentNames = new Set(agents.map((a) => a.name));\n if (agentNames.size !== agents.length) {\n throw new Error(\"The agent names must be unique!\");\n }\n\n agents.forEach((agent) => {\n this.agents.set(agent.name, agent);\n });\n\n if (agents.length > 1) {\n agents.forEach((agent) => {\n this.validateAgent(agent);\n this.addHandoffTool(agent);\n });\n }\n }\n\n private validateAgent(agent: BaseWorkflowAgent) {\n // Validate that all canHandoffTo agents exist\n const invalidAgents = agent.canHandoffTo.filter(\n (name) => !this.agents.has(name),\n );\n if (invalidAgents.length > 0) {\n throw new Error(\n `Agent \"${agent.name}\" references non-existent agents in canHandoffTo: ${invalidAgents.join(\", \")}`,\n );\n }\n }\n\n private addHandoffTool(agent: BaseWorkflowAgent) {\n if (agent.tools.some((t) => t.metadata.name === \"handOff\")) {\n return;\n }\n const toHandoffAgents: Map<string, BaseWorkflowAgent> = new Map();\n agent.canHandoffTo.forEach((name) => {\n toHandoffAgents.set(name, this.agents.get(name)!);\n });\n const handoffTool = this.createHandoffTool(toHandoffAgents);\n if (\n agent.canHandoffTo.length > 0 &&\n !agent.tools.some((t) => t.metadata.name === handoffTool.metadata.name)\n ) {\n agent.tools.push(handoffTool);\n }\n }\n\n /**\n * Adds a new agent to the workflow\n */\n addAgent(agent: BaseWorkflowAgent): this {\n this.agents.set(agent.name, agent);\n this.validateAgent(agent);\n this.addHandoffTool(agent);\n return this;\n }\n\n /**\n * Gets all agents in this workflow\n * @returns Array of agents in this workflow\n */\n getAgents(): BaseWorkflowAgent[] {\n return Array.from(this.agents.values());\n }\n\n /**\n * Create a simple workflow with a single agent and specified tools\n * @param params - Parameters for the single agent workflow\n * @returns A new AgentWorkflow instance\n */\n static fromTools(params: SingleAgentParams): AguiLlamaIndexWorkflow {\n const agent = new LlamaIndexFunctionAgent({\n name: params.name,\n description: params.description,\n tools: params.tools,\n llm: params.llm,\n systemPrompt: params.systemPrompt,\n canHandoffTo: params.canHandoffTo,\n });\n\n const workflowParams: AgentWorkflowParams = {\n agents: [agent],\n rootAgent: agent,\n verbose: params.verbose ?? false,\n timeout: params.timeout ?? 60,\n memory: params.memory,\n logger: params.logger,\n };\n\n const workflow = new AguiLlamaIndexWorkflow(workflowParams);\n\n return workflow;\n }\n\n private handleInputStep = async (\n context: StatefulContext<AgentWorkflowState>,\n event: WorkflowEventData<AgentInputData>,\n ) => {\n const { state } = context;\n const { userInput, chatHistory } = event.data;\n const memory = state.memory;\n if (chatHistory) {\n if (chatHistory.length === 1 && chatHistory[0].role === \"tool\") {\n const agent = this.agents.get(context.state.currentAgentName);\n if (!agent) {\n throw new Error(`Agent ${context.state.currentAgentName} not found`);\n }\n const toolMessage = chatHistory[0];\n agent.handleToolCallResults(context.state, [{\n // toolName: chatHistory[0].name,\n // toolKwargs: chatHistory[0].args,\n toolName: 'NOT used',\n toolKwargs: { NotUsed: 'NOT used' },\n toolId: chatHistory[0].toolCallId,\n toolOutput: {\n isError: false,\n id: chatHistory[0].toolCallId,\n result: stringifyJSONToMessageContent(toolMessage.content),\n },\n returnDirect: false,\n raw: toolMessage.content,\n }]);\n } else {\n chatHistory.forEach((message) => {\n memory.add(message);\n });\n }\n }\n if (userInput) {\n const userMessage: ChatMessage = {\n role: \"user\",\n content: userInput,\n };\n memory.add(userMessage);\n }\n // if (userInput) {\n // const userMessage: ChatMessage = {\n // role: \"user\",\n // content: userInput,\n // };\n // memory.add(userMessage);\n // } else if (chatHistory) {\n // // If no user message, use the last message from chat history as user_msg_str\n // const lastMessage = chatHistory[chatHistory.length - 1];\n // if (lastMessage?.role !== \"user\") {\n // throw new Error(\n // \"Either provide a user message or a chat history with a user message as the last message\",\n // );\n // }\n // } else {\n // throw new Error(\"No user message or chat history provided\");\n // }\n\n this.logger.log(`[Agent ${this.rootAgentName}]: Starting agent`);\n\n return agentInputEvent.with({\n input: await memory.getLLM(this.agents.get(this.rootAgentName)?.llm),\n currentAgentName: this.rootAgentName,\n });\n };\n\n private setupAgent = async (\n context: StatefulContext<AgentWorkflowState>,\n event: WorkflowEventData<AgentInput>,\n ) => {\n const currentAgentName = event.data.currentAgentName;\n const agent = this.agents.get(currentAgentName);\n if (!agent) {\n throw new Error(`Agent ${currentAgentName} not found`);\n }\n\n const llmInput = event.data.input;\n if (agent.systemPrompt) {\n llmInput.unshift({\n role: \"system\",\n content: agent.systemPrompt,\n });\n }\n\n return agentSetupEvent.with({\n input: llmInput,\n currentAgentName: currentAgentName,\n });\n };\n\n private runAgentStep = async (\n context: StatefulContext<AgentWorkflowState>,\n event: WorkflowEventData<AgentSetup>,\n ) => {\n const { sendEvent } = context;\n const agent = this.agents.get(event.data.currentAgentName);\n if (!agent) {\n throw new Error(\"No valid agent found\");\n }\n\n const output = await agent.takeStep(\n context,\n context.state,\n event.data.input,\n agent.tools,\n );\n\n sendEvent(\n agentStepEvent.with({\n agentName: agent.name,\n response: output.response,\n toolCalls: output.toolCalls,\n }),\n );\n\n sendEvent(agentOutputEvent.with(output));\n };\n\n private parseAgentOutput = async (\n context: StatefulContext<AgentWorkflowState>,\n event: WorkflowEventData<AgentStep>,\n ) => {\n const { agentName, response, toolCalls } = event.data;\n const agent = this.agents.get(agentName);\n if (!agent) {\n throw new Error(\n `parseAgentOutput failed: agent ${agentName} does not exist`,\n );\n }\n\n // If no tool calls, return final response\n if (!toolCalls || toolCalls.length === 0) {\n this.logger.log(\n `[Agent ${agentName}]: No tool calls to process, returning final response`,\n );\n\n const agentOutput = {\n response,\n toolCalls: [],\n raw: response,\n currentAgentName: agentName,\n };\n const content = await agent.finalize(context.state, agentOutput);\n\n // if responseFormat is set, use the structured tool to parse the response\n let object: JSONObject | undefined = undefined;\n if (context.state.responseFormat) {\n object = await agent.getStructuredOutput(\n context.state.responseFormat,\n content.response,\n );\n }\n\n return stopAgentEvent.with({\n message: content.response,\n result: content.response.content,\n state: context.state,\n object,\n });\n }\n\n return toolCallsEvent.with({\n agentName,\n toolCalls,\n });\n };\n\n private executeToolCalls = async (\n context: StatefulContext<AgentWorkflowState>,\n event: WorkflowEventData<ToolCalls>,\n ) => {\n const { sendEvent } = context;\n const { agentName, toolCalls } = event.data;\n const agent = this.agents.get(agentName);\n if (!agent) {\n throw new Error(`Agent ${agentName} not found`);\n }\n\n const results: AgentToolCallResult[] = [];\n\n // Execute each tool call\n for (const toolCall of toolCalls) {\n // Send single tool call event, useful for UI\n sendEvent(agentToolCallEvent.with(toolCall));\n const toolResult = {\n toolName: toolCall.toolName,\n toolKwargs: toolCall.toolKwargs,\n toolId: toolCall.toolId,\n toolOutput: {\n id: toolCall.toolId,\n result: \"\",\n isError: false,\n },\n returnDirect: false,\n raw: {},\n };\n try {\n const output = await this.callTool(toolCall);\n toolResult.raw = output;\n toolResult.toolOutput.result = stringifyJSONToMessageContent(output);\n toolResult.returnDirect = toolCall.toolName === \"handOff\";\n } catch (error) {\n toolResult.toolOutput.isError = true;\n toolResult.toolOutput.result = `Error: ${error}`;\n }\n results.push(toolResult);\n // Send single tool result event, useful for UI\n sendEvent(agentToolCallResultEvent.with(toolResult));\n }\n\n return toolResultsEvent.with({\n agentName,\n results,\n });\n };\n\n private processToolResults = async (\n context: StatefulContext<AgentWorkflowState>,\n event: WorkflowEventData<ToolResults>,\n ) => {\n const { agentName, results } = event.data;\n\n // Get agent\n const agent = this.agents.get(agentName);\n if (!agent) {\n throw new Error(`Agent ${agentName} not found`);\n }\n\n const backendResults = results.filter(r => r.toolOutput.result !== FRONTEND_TOOL_MARKER);\n const frontendResults = results.filter(r => r.toolOutput.result === FRONTEND_TOOL_MARKER);\n\n await agent.handleToolCallResults(context.state, backendResults);\n\n const directResult = results.find(\n (r: AgentToolCallResult) => r.returnDirect,\n );\n if (directResult) {\n const isHandoff = directResult.toolName === \"handOff\";\n\n const raw = directResult.raw;\n const output = typeof raw === \"string\" ? raw : JSON.stringify(raw);\n const responseMessage: ChatMessage = {\n role: \"assistant\" as const,\n content: output, // use stringified tool output for assistant message\n };\n\n const agentOutput = {\n response: responseMessage,\n toolCalls: [],\n raw,\n currentAgentName: agent.name,\n };\n\n await agent.finalize(context.state, agentOutput);\n\n if (isHandoff) {\n const nextAgentName = context.state.nextAgentName;\n\n this.logger.log(\n `[Agent ${agentName}]: Handoff to ${nextAgentName}: ${directResult.toolOutput.result}`,\n );\n\n if (nextAgentName) {\n context.state.currentAgentName = nextAgentName;\n context.state.nextAgentName = null;\n\n const messages = await context.state.memory.getLLM(\n this.agents.get(nextAgentName)?.llm,\n );\n\n this.logger.log(`[Agent ${nextAgentName}]: Starting agent`);\n\n return agentInputEvent.with({\n input: messages,\n currentAgentName: nextAgentName,\n });\n }\n }\n\n return stopAgentEvent.with({\n message: responseMessage,\n result: output,\n state: context.state,\n });\n }\n\n // Continue with another agent step\n const messages = await context.state.memory.getLLM(\n this.agents.get(agent.name)?.llm,\n );\n if (frontendResults.length > 0) {\n return stopAgentEvent.with({\n message: {\n role: 'assistant',\n content: `Frontend tool called`,\n },\n result: `Frontend tool called`,\n state: context.state,\n });\n }\n\n\n return agentInputEvent.with({\n input: messages,\n currentAgentName: agent.name,\n });\n };\n\n private setupWorkflowSteps() {\n this.workflow.handle([startAgentEvent], this.handleInputStep);\n this.workflow.handle([agentInputEvent], this.setupAgent);\n this.workflow.handle([agentSetupEvent], this.runAgentStep);\n this.workflow.handle([agentStepEvent], this.parseAgentOutput);\n this.workflow.handle([toolCallsEvent], this.overriddenExecuteToolCalls);\n this.workflow.handle([toolResultsEvent], this.processToolResults);\n }\n\n private overriddenExecuteToolCalls = async (\n context: StatefulContext<AgentWorkflowState>,\n event: WorkflowEventData<ToolCalls>,\n ) => {\n const { sendEvent } = context;\n const { agentName, toolCalls } = event.data;\n\n const frontendToolCalls = toolCalls.filter(t => this.frontendTools.includes(t.toolName));\n const backendToolCalls = toolCalls.filter(t => !this.frontendTools.includes(t.toolName));\n if (frontendToolCalls.length <= 0) {\n return this.executeToolCalls(context, event);\n };\n\n const results: AgentToolCallResult[] = [];\n\n // Execute each tool call\n for (const toolCall of backendToolCalls) {\n // Send single tool call event, useful for UI\n sendEvent(agentToolCallEvent.with(toolCall));\n const toolResult = {\n toolName: toolCall.toolName,\n toolKwargs: toolCall.toolKwargs,\n toolId: toolCall.toolId,\n toolOutput: {\n id: toolCall.toolId,\n result: \"\",\n isError: false,\n },\n returnDirect: false,\n raw: {},\n };\n try {\n const output = await this.callTool(toolCall);\n toolResult.raw = output;\n toolResult.toolOutput.result = stringifyJSONToMessageContent(output);\n toolResult.returnDirect = toolCall.toolName === \"handOff\";\n } catch (error) {\n toolResult.toolOutput.isError = true;\n toolResult.toolOutput.result = `Error: ${error}`;\n }\n results.push(toolResult);\n // Send single tool result event, useful for UI\n sendEvent(agentToolCallResultEvent.with(toolResult));\n }\n\n // Run each frontend tool call\n for (const toolCall of frontendToolCalls) {\n // Send single tool call event, useful for UI\n sendEvent(agentToolCallEvent.with(toolCall));\n continue\n const toolResult = {\n toolName: toolCall.toolName,\n toolKwargs: toolCall.toolKwargs,\n toolId: toolCall.toolId,\n toolOutput: {\n id: toolCall.toolId,\n result: FRONTEND_TOOL_MARKER,\n isError: true,\n },\n returnDirect: false,\n raw: {},\n };\n results.push(toolResult);\n\n }\n if (frontendToolCalls.length > 0) {\n if (results.length > 0) {\n const agent = this.agents.get(agentName);\n if (!agent) {\n throw new Error(`Agent ${agentName} not found`);\n }\n await agent.handleToolCallResults(context.state, results);\n await agent.finalize(context.state, {\n response: {\n role: 'assistant',\n content: `Frontend tool called`,\n },\n toolCalls: [],\n raw: `Frontend tool called`,\n currentAgentName: agentName,\n });\n }\n return stopAgentEvent.with({\n message: {\n role: 'assistant',\n content: `Frontend tool called`,\n },\n result: `Frontend tool called`,\n state: context.state,\n });\n }\n\n return toolResultsEvent.with({\n agentName,\n results,\n });\n }\n\n private async callTool(toolCall: AgentToolCall): Promise<JSONValue> {\n const tool = this.agents\n .get(toolCall.agentName)\n ?.tools.find((t) => t.metadata.name === toolCall.toolName);\n\n const toolOutput = await callTool(\n tool,\n {\n name: toolCall.toolName,\n input: toolCall.toolKwargs,\n id: toolCall.toolId,\n },\n this.logger,\n );\n\n if (toolOutput.isError) {\n throw new Error(String(toolOutput.output));\n }\n\n return toolOutput.output;\n }\n\n private createInitialState(): AgentWorkflowState {\n return {\n memory: this.initialMemory ?? createMemory(),\n scratchpad: [],\n currentAgentName: this.rootAgentName,\n agents: Array.from(this.agents.keys()),\n nextAgentName: null,\n };\n }\n\n runStream<Z extends ZodSchema>(\n userInput: MessageContent,\n params?: {\n chatHistory?: ChatMessage[];\n state?: AgentWorkflowState;\n responseFormat?: Z;\n },\n ): WorkflowStream<WorkflowEventData<AgentResultData<z.infer<Z>>>> {\n if (this.agents.size === 0) {\n throw new Error(\"No agents added to workflow\");\n }\n const state = params?.state ?? this.createInitialState();\n\n const { sendEvent, stream } = this.workflow.createContext({\n ...state,\n responseFormat: params?.responseFormat,\n });\n sendEvent(\n startAgentEvent.with({\n userInput: userInput,\n chatHistory: params?.chatHistory,\n }),\n );\n return stream.until(stopAgentEvent);\n }\n\n async run<Z extends ZodSchema>(\n userInput: MessageContent,\n params?: {\n chatHistory?: ChatMessage[];\n state?: AgentWorkflowState;\n responseFormat?: Z;\n },\n ): Promise<WorkflowEventData<AgentResultData<z.infer<Z>>>> {\n const finalEvent = (await this.runStream(userInput, params).toArray()).at(\n -1,\n );\n if (!stopAgentEvent.include(finalEvent)) {\n throw new Error(\n `Agent stopped with unexpected ${finalEvent?.toString() ?? \"unknown\"} event.`,\n );\n }\n return finalEvent;\n }\n\n createHandoffTool(agents: Map<string, BaseWorkflowAgent>) {\n const agentInfo = Array.from(agents.values()).reduce(\n (acc, a) => {\n acc[a.name] = a.description;\n return acc;\n },\n {} as Record<string, string>,\n );\n return tool({\n name: \"handOff\",\n description: DEFAULT_HANDOFF_PROMPT.format({\n agent_info: JSON.stringify(agentInfo),\n }),\n parameters: z.object({\n toAgent: z.string().describe(\"The name of the agent to hand off to\"),\n reason: z.string().describe(\"The reason for handing off to the agent\"),\n }),\n execute: (\n {\n toAgent,\n reason,\n }: {\n toAgent: string;\n reason: string;\n },\n contextProvider?: () => AgentWorkflowState,\n ) => {\n if (!contextProvider) {\n throw new Error(\n \"Handoff tool internal error: Context was not provided.\",\n );\n }\n const context = contextProvider();\n const agents = context.agents;\n if (!agents.includes(toAgent)) {\n return `Agent ${toAgent} not found. Select a valid agent to hand off to. Valid agents: ${agents.join(\n \", \",\n )}`;\n }\n context.nextAgentName = toAgent;\n return DEFAULT_HANDOFF_OUTPUT_PROMPT.format({\n to_agent: toAgent,\n reason: reason,\n });\n },\n }).bind(() => this.stateful.getContext().state);\n }\n\n setFrontendTools(tools: string[]): this {\n this.frontendTools = tools;\n return this;\n }\n\n\n}\n\n\nexport const toolCallStartEvent = workflowEvent<{ toolCall: AgentToolCall }>({ debugLabel: 'ToolCallStartEvent' })\nexport const toolCallChunkEvent = workflowEvent<ToolCallOptions>({ debugLabel: 'ToolCallChunkEvent' })\nclass LlamaIndexFunctionAgent extends FunctionAgent {\n constructor(params: FunctionAgentParams) {\n super(params);\n // const _getToolCallFromResponseChunk = this['getToolCallFromResponseChunk'].bind(this);\n // this['getToolCallFromResponseChunk'] = (chunk: any): AgentToolCall[] => {\n // const toolCall = _getToolCallFromResponseChunk(chunk);\n // if(toolCall) {\n\n // }\n // return toolCall;\n // }\n }\n\n // https://github.com/run-llama/LlamaIndexTS/blob/fc385dc16757a73dc19ca239ebbe1e6155ed4b4d/packages/workflow/src/agent/function-agent.ts#L181C3-L240C4\n async takeStep(\n ctx: WorkflowContext,\n state: AgentWorkflowState,\n llmInput: ChatMessage[],\n tools: BaseToolWithCall[],\n ): Promise<AgentOutput> {\n // Get scratchpad from context or initialize if not present\n const scratchpad: ChatMessage[] = state.scratchpad;\n const currentLLMInput = [...llmInput, ...scratchpad];\n\n const responseStream = await this.llm.chat({\n messages: currentLLMInput,\n tools,\n stream: true,\n });\n let response = \"\";\n let lastChunk: ChatResponseChunk | undefined;\n const toolCalls: Map<string, AgentToolCall> = new Map();\n for await (const chunk of responseStream) {\n response += chunk.delta;\n ctx.sendEvent(\n agentStreamEvent.with({\n delta: chunk.delta,\n response: response,\n currentAgentName: this.name,\n raw: chunk.raw,\n }),\n );\n const toolCallsInChunk: AgentToolCall[] = this['getToolCallFromResponseChunk'](chunk);\n if (toolCallsInChunk.length > 0) {\n\n // Just upsert the tool calls with the latest one if they exist\n toolCallsInChunk.forEach((toolCall) => {\n if (!toolCalls.has(toolCall.toolId)) {\n ctx.sendEvent(toolCallStartEvent.with({ toolCall }));\n }\n // @ts-expect-error\n ctx.sendEvent(toolCallChunkEvent.with({ toolCall: chunk.options?.toolCall ?? [] }));\n\n toolCalls.set(toolCall.toolId, toolCall);\n });\n\n }\n }\n\n const message: ChatMessage = {\n role: \"assistant\" as const,\n content: response,\n };\n\n if (toolCalls.size > 0) {\n message.options = {\n toolCall: Array.from(toolCalls.values()).map((toolCall) => ({\n name: toolCall.toolName,\n input: toolCall.toolKwargs,\n id: toolCall.toolId,\n })),\n };\n }\n scratchpad.push(message);\n state.scratchpad = scratchpad;\n return {\n response: message,\n toolCalls: Array.from(toolCalls.values()),\n raw: lastChunk?.raw,\n currentAgentName: this.name,\n };\n }\n\n}\n\nexport interface RunnableWorkflow<T = unknown, R extends unknown[] = unknown[]> {\n runStream(...args: R): WorkflowStream<WorkflowEventData<T>>\n setFrontendTools?: (names: string[]) => void;\n}","import { createMemory, Memory } from \"llamaindex\";\n\nexport class ConversationMemory {\n _map = new Map<string, Memory>();\n private _memoryFactory: () => Memory;\n\n constructor({ memoryFactory }: { memoryFactory?: () => Memory } = {}) {\n this._memoryFactory = memoryFactory ?? createMemory;\n }\n\n getMemory(conversationId: string): Memory {\n let memory = this._map.get(conversationId);\n if (!memory) {\n memory = this._memoryFactory();\n this._map.set(conversationId, memory);\n }\n return memory;\n }\n}"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAEA,IAAAA,mBAAkF;;;ACFlF,sBAA2C;AAC3C,oBAA0O;AAC1O,kBAAuC;AACvC,IAAAC,mBAA2T;;;ACD3T,wBAAyB;AAGzB,IAAAC,qBAAqC;AACrC,IAAAA,qBAA+B;AAC/B,IAAAA,qBAAqB;AACrB,IAAAA,qBAA8C;AAC9C,gBAAkC;AAClC,iBAAwD;AACxD,sBAoBO;AACP,IAAAC,mBAUO;AACP,IAAAA,mBAAwD;AAExD,IAAM,yBAAyB,IAAI,kCAAe;AAAA,EAC9C,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAMd,CAAC;AAED,IAAM,gCAAgC,IAAI,kCAAe;AAAA,EACrD,UAAU;AAAA;AACd,CAAC;AAsGM,IAAM,uBAAuB;AAS7B,IAAM,yBAAN,MAAM,wBAA6D;AAAA,EAatE,YAAY;AAAA,IACR;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACJ,GAAwB;AAlBxB,SAAQ,eAAW;AAAA,MACf,CAAC,UAA8B;AAAA,IACnC;AACA,SAAQ,WAAW,KAAK,SAAS,cAAU,gCAAe,CAAC;AAC3D,SAAQ,SAAyC,oBAAI,IAAI;AAMzD,SAAQ,gBAA0B,CAAC;AAqKnC,SAAQ,kBAAkB,OACtB,SACA,UACC;AACD,YAAM,EAAE,MAAM,IAAI;AAClB,YAAM,EAAE,WAAW,YAAY,IAAI,MAAM;AACzC,YAAM,SAAS,MAAM;AACrB,UAAI,aAAa;AACb,YAAI,YAAY,WAAW,KAAK,YAAY,CAAC,EAAE,SAAS,QAAQ;AAC5D,gBAAM,QAAQ,KAAK,OAAO,IAAI,QAAQ,MAAM,gBAAgB;AAC5D,cAAI,CAAC,OAAO;AACR,kBAAM,IAAI,MAAM,SAAS,QAAQ,MAAM,gBAAgB,YAAY;AAAA,UACvE;AACA,gBAAM,cAAc,YAAY,CAAC;AACjC,gBAAM,sBAAsB,QAAQ,OAAO,CAAC;AAAA;AAAA;AAAA,YAGxC,UAAU;AAAA,YACV,YAAY,EAAE,SAAS,WAAW;AAAA,YAClC,QAAQ,YAAY,CAAC,EAAE;AAAA,YACvB,YAAY;AAAA,cACR,SAAS;AAAA,cACT,IAAI,YAAY,CAAC,EAAE;AAAA,cACnB,YAAQ,kDAA8B,YAAY,OAAO;AAAA,YAC7D;AAAA,YACA,cAAc;AAAA,YACd,KAAK,YAAY;AAAA,UACrB,CAAC,CAAC;AAAA,QACN,OAAO;AACH,sBAAY,QAAQ,CAAC,YAAY;AAC7B,mBAAO,IAAI,OAAO;AAAA,UACtB,CAAC;AAAA,QACL;AAAA,MACJ;AACA,UAAI,WAAW;AACX,cAAM,cAA2B;AAAA,UAC7B,MAAM;AAAA,UACN,SAAS;AAAA,QACb;AACA,eAAO,IAAI,WAAW;AAAA,MAC1B;AAmBA,WAAK,OAAO,IAAI,UAAU,KAAK,aAAa,mBAAmB;AAE/D,aAAO,iCAAgB,KAAK;AAAA,QACxB,OAAO,MAAM,OAAO,OAAO,KAAK,OAAO,IAAI,KAAK,aAAa,GAAG,GAAG;AAAA,QACnE,kBAAkB,KAAK;AAAA,MAC3B,CAAC;AAAA,IACL;AAEA,SAAQ,aAAa,OACjB,SACA,UACC;AACD,YAAM,mBAAmB,MAAM,KAAK;AACpC,YAAM,QAAQ,KAAK,OAAO,IAAI,gBAAgB;AAC9C,UAAI,CAAC,OAAO;AACR,cAAM,IAAI,MAAM,SAAS,gBAAgB,YAAY;AAAA,MACzD;AAEA,YAAM,WAAW,MAAM,KAAK;AAC5B,UAAI,MAAM,cAAc;AACpB,iBAAS,QAAQ;AAAA,UACb,MAAM;AAAA,UACN,SAAS,MAAM;AAAA,QACnB,CAAC;AAAA,MACL;AAEA,aAAO,iCAAgB,KAAK;AAAA,QACxB,OAAO;AAAA,QACP;AAAA,MACJ,CAAC;AAAA,IACL;AAEA,SAAQ,eAAe,OACnB,SACA,UACC;AACD,YAAM,EAAE,UAAU,IAAI;AACtB,YAAM,QAAQ,KAAK,OAAO,IAAI,MAAM,KAAK,gBAAgB;AACzD,UAAI,CAAC,OAAO;AACR,cAAM,IAAI,MAAM,sBAAsB;AAAA,MAC1C;AAEA,YAAM,SAAS,MAAM,MAAM;AAAA,QACvB;AAAA,QACA,QAAQ;AAAA,QACR,MAAM,KAAK;AAAA,QACX,MAAM;AAAA,MACV;AAEA;AAAA,QACI,+BAAe,KAAK;AAAA,UAChB,WAAW,MAAM;AAAA,UACjB,UAAU,OAAO;AAAA,UACjB,WAAW,OAAO;AAAA,QACtB,CAAC;AAAA,MACL;AAEA,gBAAU,kCAAiB,KAAK,MAAM,CAAC;AAAA,IAC3C;AAEA,SAAQ,mBAAmB,OACvB,SACA,UACC;AACD,YAAM,EAAE,WAAW,UAAU,UAAU,IAAI,MAAM;AACjD,YAAM,QAAQ,KAAK,OAAO,IAAI,SAAS;AACvC,UAAI,CAAC,OAAO;AACR,cAAM,IAAI;AAAA,UACN,kCAAkC,SAAS;AAAA,QAC/C;AAAA,MACJ;AAGA,UAAI,CAAC,aAAa,UAAU,WAAW,GAAG;AACtC,aAAK,OAAO;AAAA,UACR,UAAU,SAAS;AAAA,QACvB;AAEA,cAAM,cAAc;AAAA,UAChB;AAAA,UACA,WAAW,CAAC;AAAA,UACZ,KAAK;AAAA,UACL,kBAAkB;AAAA,QACtB;AACA,cAAM,UAAU,MAAM,MAAM,SAAS,QAAQ,OAAO,WAAW;AAG/D,YAAI,SAAiC;AACrC,YAAI,QAAQ,MAAM,gBAAgB;AAC9B,mBAAS,MAAM,MAAM;AAAA,YACjB,QAAQ,MAAM;AAAA,YACd,QAAQ;AAAA,UACZ;AAAA,QACJ;AAEA,eAAO,+BAAe,KAAK;AAAA,UACvB,SAAS,QAAQ;AAAA,UACjB,QAAQ,QAAQ,SAAS;AAAA,UACzB,OAAO,QAAQ;AAAA,UACf;AAAA,QACJ,CAAC;AAAA,MACL;AAEA,aAAO,+BAAe,KAAK;AAAA,QACvB;AAAA,QACA;AAAA,MACJ,CAAC;AAAA,IACL;AAEA,SAAQ,mBAAmB,OACvB,SACA,UACC;AACD,YAAM,EAAE,UAAU,IAAI;AACtB,YAAM,EAAE,WAAW,UAAU,IAAI,MAAM;AACvC,YAAM,QAAQ,KAAK,OAAO,IAAI,SAAS;AACvC,UAAI,CAAC,OAAO;AACR,cAAM,IAAI,MAAM,SAAS,SAAS,YAAY;AAAA,MAClD;AAEA,YAAM,UAAiC,CAAC;AAGxC,iBAAW,YAAY,WAAW;AAE9B,kBAAU,oCAAmB,KAAK,QAAQ,CAAC;AAC3C,cAAM,aAAa;AAAA,UACf,UAAU,SAAS;AAAA,UACnB,YAAY,SAAS;AAAA,UACrB,QAAQ,SAAS;AAAA,UACjB,YAAY;AAAA,YACR,IAAI,SAAS;AAAA,YACb,QAAQ;AAAA,YACR,SAAS;AAAA,UACb;AAAA,UACA,cAAc;AAAA,UACd,KAAK,CAAC;AAAA,QACV;AACA,YAAI;AACA,gBAAM,SAAS,MAAM,KAAK,SAAS,QAAQ;AAC3C,qBAAW,MAAM;AACjB,qBAAW,WAAW,aAAS,kDAA8B,MAAM;AACnE,qBAAW,eAAe,SAAS,aAAa;AAAA,QACpD,SAAS,OAAO;AACZ,qBAAW,WAAW,UAAU;AAChC,qBAAW,WAAW,SAAS,UAAU,KAAK;AAAA,QAClD;AACA,gBAAQ,KAAK,UAAU;AAEvB,kBAAU,0CAAyB,KAAK,UAAU,CAAC;AAAA,MACvD;AAEA,aAAO,iCAAiB,KAAK;AAAA,QACzB;AAAA,QACA;AAAA,MACJ,CAAC;AAAA,IACL;AAEA,SAAQ,qBAAqB,OACzB,SACA,UACC;AACD,YAAM,EAAE,WAAW,QAAQ,IAAI,MAAM;AAGrC,YAAM,QAAQ,KAAK,OAAO,IAAI,SAAS;AACvC,UAAI,CAAC,OAAO;AACR,cAAM,IAAI,MAAM,SAAS,SAAS,YAAY;AAAA,MAClD;AAEA,YAAM,iBAAiB,QAAQ,OAAO,OAAK,EAAE,WAAW,WAAW,oBAAoB;AACvF,YAAM,kBAAkB,QAAQ,OAAO,OAAK,EAAE,WAAW,WAAW,oBAAoB;AAExF,YAAM,MAAM,sBAAsB,QAAQ,OAAO,cAAc;AAE/D,YAAM,eAAe,QAAQ;AAAA,QACzB,CAAC,MAA2B,EAAE;AAAA,MAClC;AACA,UAAI,cAAc;AACd,cAAM,YAAY,aAAa,aAAa;AAE5C,cAAM,MAAM,aAAa;AACzB,cAAM,SAAS,OAAO,QAAQ,WAAW,MAAM,KAAK,UAAU,GAAG;AACjE,cAAM,kBAA+B;AAAA,UACjC,MAAM;AAAA,UACN,SAAS;AAAA;AAAA,QACb;AAEA,cAAM,cAAc;AAAA,UAChB,UAAU;AAAA,UACV,WAAW,CAAC;AAAA,UACZ;AAAA,UACA,kBAAkB,MAAM;AAAA,QAC5B;AAEA,cAAM,MAAM,SAAS,QAAQ,OAAO,WAAW;AAE/C,YAAI,WAAW;AACX,gBAAM,gBAAgB,QAAQ,MAAM;AAEpC,eAAK,OAAO;AAAA,YACR,UAAU,SAAS,iBAAiB,aAAa,KAAK,aAAa,WAAW,MAAM;AAAA,UACxF;AAEA,cAAI,eAAe;AACf,oBAAQ,MAAM,mBAAmB;AACjC,oBAAQ,MAAM,gBAAgB;AAE9B,kBAAMC,YAAW,MAAM,QAAQ,MAAM,OAAO;AAAA,cACxC,KAAK,OAAO,IAAI,aAAa,GAAG;AAAA,YACpC;AAEA,iBAAK,OAAO,IAAI,UAAU,aAAa,mBAAmB;AAE1D,mBAAO,iCAAgB,KAAK;AAAA,cACxB,OAAOA;AAAA,cACP,kBAAkB;AAAA,YACtB,CAAC;AAAA,UACL;AAAA,QACJ;AAEA,eAAO,+BAAe,KAAK;AAAA,UACvB,SAAS;AAAA,UACT,QAAQ;AAAA,UACR,OAAO,QAAQ;AAAA,QACnB,CAAC;AAAA,MACL;AAGA,YAAM,WAAW,MAAM,QAAQ,MAAM,OAAO;AAAA,QACxC,KAAK,OAAO,IAAI,MAAM,IAAI,GAAG;AAAA,MACjC;AACA,UAAI,gBAAgB,SAAS,GAAG;AAC5B,eAAO,+BAAe,KAAK;AAAA,UACvB,SAAS;AAAA,YACL,MAAM;AAAA,YACN,SAAS;AAAA,UACb;AAAA,UACA,QAAQ;AAAA,UACR,OAAO,QAAQ;AAAA,QACnB,CAAC;AAAA,MACL;AAGA,aAAO,iCAAgB,KAAK;AAAA,QACxB,OAAO;AAAA,QACP,kBAAkB,MAAM;AAAA,MAC5B,CAAC;AAAA,IACL;AAWA,SAAQ,6BAA6B,OACjC,SACA,UACC;AACD,YAAM,EAAE,UAAU,IAAI;AACtB,YAAM,EAAE,WAAW,UAAU,IAAI,MAAM;AAEvC,YAAM,oBAAoB,UAAU,OAAO,OAAK,KAAK,cAAc,SAAS,EAAE,QAAQ,CAAC;AACvF,YAAM,mBAAmB,UAAU,OAAO,OAAK,CAAC,KAAK,cAAc,SAAS,EAAE,QAAQ,CAAC;AACvF,UAAI,kBAAkB,UAAU,GAAG;AAC/B,eAAO,KAAK,iBAAiB,SAAS,KAAK;AAAA,MAC/C;AAAC;AAED,YAAM,UAAiC,CAAC;AAGxC,iBAAW,YAAY,kBAAkB;AAErC,kBAAU,oCAAmB,KAAK,QAAQ,CAAC;AAC3C,cAAM,aAAa;AAAA,UACf,UAAU,SAAS;AAAA,UACnB,YAAY,SAAS;AAAA,UACrB,QAAQ,SAAS;AAAA,UACjB,YAAY;AAAA,YACR,IAAI,SAAS;AAAA,YACb,QAAQ;AAAA,YACR,SAAS;AAAA,UACb;AAAA,UACA,cAAc;AAAA,UACd,KAAK,CAAC;AAAA,QACV;AACA,YAAI;AACA,gBAAM,SAAS,MAAM,KAAK,SAAS,QAAQ;AAC3C,qBAAW,MAAM;AACjB,qBAAW,WAAW,aAAS,kDAA8B,MAAM;AACnE,qBAAW,eAAe,SAAS,aAAa;AAAA,QACpD,SAAS,OAAO;AACZ,qBAAW,WAAW,UAAU;AAChC,qBAAW,WAAW,SAAS,UAAU,KAAK;AAAA,QAClD;AACA,gBAAQ,KAAK,UAAU;AAEvB,kBAAU,0CAAyB,KAAK,UAAU,CAAC;AAAA,MACvD;AAGA,iBAAW,YAAY,mBAAmB;AAEtC,kBAAU,oCAAmB,KAAK,QAAQ,CAAC;AAC3C;AACA,cAAM,aAAa;AAAA,UACf,UAAU,SAAS;AAAA,UACnB,YAAY,SAAS;AAAA,UACrB,QAAQ,SAAS;AAAA,UACjB,YAAY;AAAA,YACR,IAAI,SAAS;AAAA,YACb,QAAQ;AAAA,YACR,SAAS;AAAA,UACb;AAAA,UACA,cAAc;AAAA,UACd,KAAK,CAAC;AAAA,QACV;AACA,gBAAQ,KAAK,UAAU;AAAA,MAE3B;AACA,UAAI,kBAAkB,SAAS,GAAG;AAC9B,YAAI,QAAQ,SAAS,GAAG;AACpB,gBAAM,QAAQ,KAAK,OAAO,IAAI,SAAS;AACvC,cAAI,CAAC,OAAO;AACR,kBAAM,IAAI,MAAM,SAAS,SAAS,YAAY;AAAA,UAClD;AACA,gBAAM,MAAM,sBAAsB,QAAQ,OAAO,OAAO;AACxD,gBAAM,MAAM,SAAS,QAAQ,OAAO;AAAA,YAChC,UAAU;AAAA,cACN,MAAM;AAAA,cACN,SAAS;AAAA,YACb;AAAA,YACA,WAAW,CAAC;AAAA,YACZ,KAAK;AAAA,YACL,kBAAkB;AAAA,UACtB,CAAC;AAAA,QACL;AACA,eAAO,+BAAe,KAAK;AAAA,UACvB,SAAS;AAAA,YACL,MAAM;AAAA,YACN,SAAS;AAAA,UACb;AAAA,UACA,QAAQ;AAAA,UACR,OAAO,QAAQ;AAAA,QACnB,CAAC;AAAA,MACL;AAEA,aAAO,iCAAiB,KAAK;AAAA,QACzB;AAAA,QACA;AAAA,MACJ,CAAC;AAAA,IACL;AA1jBI,SAAK,UAAU,WAAW;AAC1B,QAAI,QAAQ;AACR,WAAK,gBAAgB;AAAA,IACzB;AAGA,UAAM,kBAAuC,CAAC;AAC9C,QAAI,OAAO,SAAS,GAAG;AACnB,UAAI,OAAO,CAAC,aAAa,yBAAwB;AAE7C,cAAM,iBAAiB;AACvB,uBAAe,QAAQ,CAAC,aAAa;AACjC,gBAAM,iBAAiB,SAAS,UAAU;AAC1C,0BAAgB,KAAK,GAAG,cAAc;AAAA,QAC1C,CAAC;AAAA,MACL,OAAO;AAEH,wBAAgB,KAAK,GAAI,MAA8B;AAAA,MAC3D;AAAA,IACJ;AAGA,QAAI,qBAAqB,yBAAwB;AAE7C,YAAM,aAAa,UAAU,UAAU;AAEvC,UAAI,WAAW,WAAW,GAAG;AACzB,cAAM,IAAI;AAAA,UACN,gEAAgE,WAAW,MAAM;AAAA,QACrF;AAAA,MACJ;AAGA,WAAK,gBAAgB,WAAW,CAAC,EAAG;AAAA,IACxC,OAAO;AAEH,WAAK,gBAAgB,UAAU;AAAA,IACnC;AAGA,QAAI,CAAC,gBAAgB,KAAK,CAAC,MAAM,EAAE,SAAS,KAAK,aAAa,GAAG;AAC7D,YAAM,IAAI,MAAM,cAAc,KAAK,aAAa,sBAAsB;AAAA,IAC1E;AAEA,SAAK,UAAU,eAAe;AAC9B,SAAK,mBAAmB;AAGxB,SAAK,SAAS,WAAW,KAAK,UAAU,2BAAgB;AAAA,EAC5D;AAAA,EAEA,OAGE,QAAsB,SAA8C;AAClE,SAAK,SAAS,OAAO,QAAQ,OAAO;AAAA,EACxC;AAAA,EAEA,gBAAiC;AAC7B,WAAO,KAAK,SAAS,cAAc,KAAK,mBAAmB,CAAC;AAAA,EAChE;AAAA,EAEQ,UAAU,QAAmC;AACjD,UAAM,aAAa,IAAI,IAAI,OAAO,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC;AACpD,QAAI,WAAW,SAAS,OAAO,QAAQ;AACnC,YAAM,IAAI,MAAM,iCAAiC;AAAA,IACrD;AAEA,WAAO,QAAQ,CAAC,UAAU;AACtB,WAAK,OAAO,IAAI,MAAM,MAAM,KAAK;AAAA,IACrC,CAAC;AAED,QAAI,OAAO,SAAS,GAAG;AACnB,aAAO,QAAQ,CAAC,UAAU;AACtB,aAAK,cAAc,KAAK;AACxB,aAAK,eAAe,KAAK;AAAA,MAC7B,CAAC;AAAA,IACL;AAAA,EACJ;AAAA,EAEQ,cAAc,OAA0B;AAE5C,UAAM,gBAAgB,MAAM,aAAa;AAAA,MACrC,CAAC,SAAS,CAAC,KAAK,OAAO,IAAI,IAAI;AAAA,IACnC;AACA,QAAI,cAAc,SAAS,GAAG;AAC1B,YAAM,IAAI;AAAA,QACN,UAAU,MAAM,IAAI,qDAAqD,cAAc,KAAK,IAAI,CAAC;AAAA,MACrG;AAAA,IACJ;AAAA,EACJ;AAAA,EAEQ,eAAe,OAA0B;AAC7C,QAAI,MAAM,MAAM,KAAK,CAAC,MAAM,EAAE,SAAS,SAAS,SAAS,GAAG;AACxD;AAAA,IACJ;AACA,UAAM,kBAAkD,oBAAI,IAAI;AAChE,UAAM,aAAa,QAAQ,CAAC,SAAS;AACjC,sBAAgB,IAAI,MAAM,KAAK,OAAO,IAAI,IAAI,CAAE;AAAA,IACpD,CAAC;AACD,UAAM,cAAc,KAAK,kBAAkB,eAAe;AAC1D,QACI,MAAM,aAAa,SAAS,KAC5B,CAAC,MAAM,MAAM,KAAK,CAAC,MAAM,EAAE,SAAS,SAAS,YAAY,SAAS,IAAI,GACxE;AACE,YAAM,MAAM,KAAK,WAAW;AAAA,IAChC;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKA,SAAS,OAAgC;AACrC,SAAK,OAAO,IAAI,MAAM,MAAM,KAAK;AACjC,SAAK,cAAc,KAAK;AACxB,SAAK,eAAe,KAAK;AACzB,WAAO;AAAA,EACX;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,YAAiC;AAC7B,WAAO,MAAM,KAAK,KAAK,OAAO,OAAO,CAAC;AAAA,EAC1C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,OAAO,UAAU,QAAmD;AAChE,UAAM,QAAQ,IAAI,wBAAwB;AAAA,MACtC,MAAM,OAAO;AAAA,MACb,aAAa,OAAO;AAAA,MACpB,OAAO,OAAO;AAAA,MACd,KAAK,OAAO;AAAA,MACZ,cAAc,OAAO;AAAA,MACrB,cAAc,OAAO;AAAA,IACzB,CAAC;AAED,UAAM,iBAAsC;AAAA,MACxC,QAAQ,CAAC,KAAK;AAAA,MACd,WAAW;AAAA,MACX,SAAS,OAAO,WAAW;AAAA,MAC3B,SAAS,OAAO,WAAW;AAAA,MAC3B,QAAQ,OAAO;AAAA,MACf,QAAQ,OAAO;AAAA,IACnB;AAEA,UAAM,WAAW,IAAI,wBAAuB,cAAc;AAE1D,WAAO;AAAA,EACX;AAAA,EAuTQ,qBAAqB;AACzB,SAAK,SAAS,OAAO,CAAC,+BAAe,GAAG,KAAK,eAAe;AAC5D,SAAK,SAAS,OAAO,CAAC,gCAAe,GAAG,KAAK,UAAU;AACvD,SAAK,SAAS,OAAO,CAAC,gCAAe,GAAG,KAAK,YAAY;AACzD,SAAK,SAAS,OAAO,CAAC,8BAAc,GAAG,KAAK,gBAAgB;AAC5D,SAAK,SAAS,OAAO,CAAC,8BAAc,GAAG,KAAK,0BAA0B;AACtE,SAAK,SAAS,OAAO,CAAC,gCAAgB,GAAG,KAAK,kBAAkB;AAAA,EACpE;AAAA,EAoGA,MAAc,SAAS,UAA6C;AAChE,UAAMC,QAAO,KAAK,OACb,IAAI,SAAS,SAAS,GACrB,MAAM,KAAK,CAAC,MAAM,EAAE,SAAS,SAAS,SAAS,QAAQ;AAE7D,UAAM,aAAa,UAAM;AAAA,MACrBA;AAAA,MACA;AAAA,QACI,MAAM,SAAS;AAAA,QACf,OAAO,SAAS;AAAA,QAChB,IAAI,SAAS;AAAA,MACjB;AAAA,MACA,KAAK;AAAA,IACT;AAEA,QAAI,WAAW,SAAS;AACpB,YAAM,IAAI,MAAM,OAAO,WAAW,MAAM,CAAC;AAAA,IAC7C;AAEA,WAAO,WAAW;AAAA,EACtB;AAAA,EAEQ,qBAAyC;AAC7C,WAAO;AAAA,MACH,QAAQ,KAAK,qBAAiB,iCAAa;AAAA,MAC3C,YAAY,CAAC;AAAA,MACb,kBAAkB,KAAK;AAAA,MACvB,QAAQ,MAAM,KAAK,KAAK,OAAO,KAAK,CAAC;AAAA,MACrC,eAAe;AAAA,IACnB;AAAA,EACJ;AAAA,EAEA,UACI,WACA,QAK8D;AAC9D,QAAI,KAAK,OAAO,SAAS,GAAG;AACxB,YAAM,IAAI,MAAM,6BAA6B;AAAA,IACjD;AACA,UAAM,QAAQ,QAAQ,SAAS,KAAK,mBAAmB;AAEvD,UAAM,EAAE,WAAW,OAAO,IAAI,KAAK,SAAS,cAAc;AAAA,MACtD,GAAG;AAAA,MACH,gBAAgB,QAAQ;AAAA,IAC5B,CAAC;AACD;AAAA,MACI,gCAAgB,KAAK;AAAA,QACjB;AAAA,QACA,aAAa,QAAQ;AAAA,MACzB,CAAC;AAAA,IACL;AACA,WAAO,OAAO,MAAM,8BAAc;AAAA,EACtC;AAAA,EAEA,MAAM,IACF,WACA,QAKuD;AACvD,UAAM,cAAc,MAAM,KAAK,UAAU,WAAW,MAAM,EAAE,QAAQ,GAAG;AAAA,MACnE;AAAA,IACJ;AACA,QAAI,CAAC,+BAAe,QAAQ,UAAU,GAAG;AACrC,YAAM,IAAI;AAAA,QACN,iCAAiC,YAAY,SAAS,KAAK,SAAS;AAAA,MACxE;AAAA,IACJ;AACA,WAAO;AAAA,EACX;AAAA,EAEA,kBAAkB,QAAwC;AACtD,UAAM,YAAY,MAAM,KAAK,OAAO,OAAO,CAAC,EAAE;AAAA,MAC1C,CAAC,KAAK,MAAM;AACR,YAAI,EAAE,IAAI,IAAI,EAAE;AAChB,eAAO;AAAA,MACX;AAAA,MACA,CAAC;AAAA,IACL;AACA,eAAO,yBAAK;AAAA,MACR,MAAM;AAAA,MACN,aAAa,uBAAuB,OAAO;AAAA,QACvC,YAAY,KAAK,UAAU,SAAS;AAAA,MACxC,CAAC;AAAA,MACD,YAAY,YAAE,OAAO;AAAA,QACjB,SAAS,YAAE,OAAO,EAAE,SAAS,sCAAsC;AAAA,QACnE,QAAQ,YAAE,OAAO,EAAE,SAAS,yCAAyC;AAAA,MACzE,CAAC;AAAA,MACD,SAAS,CACL;AAAA,QACI;AAAA,QACA;AAAA,MACJ,GAIA,oBACC;AACD,YAAI,CAAC,iBAAiB;AAClB,gBAAM,IAAI;AAAA,YACN;AAAA,UACJ;AAAA,QACJ;AACA,cAAM,UAAU,gBAAgB;AAChC,cAAMC,UAAS,QAAQ;AACvB,YAAI,CAACA,QAAO,SAAS,OAAO,GAAG;AAC3B,iBAAO,SAAS,OAAO,kEAAkEA,QAAO;AAAA,YAC5F;AAAA,UACJ,CAAC;AAAA,QACL;AACA,gBAAQ,gBAAgB;AACxB,eAAO,8BAA8B,OAAO;AAAA,UACxC,UAAU;AAAA,UACV;AAAA,QACJ,CAAC;AAAA,MACL;AAAA,IACJ,CAAC,EAAE,KAAK,MAAM,KAAK,SAAS,WAAW,EAAE,KAAK;AAAA,EAClD;AAAA,EAEA,iBAAiB,OAAuB;AACpC,SAAK,gBAAgB;AACrB,WAAO;AAAA,EACX;AAGJ;AAGO,IAAM,yBAAqB,+BAA2C,EAAE,YAAY,qBAAqB,CAAC;AAC1G,IAAM,yBAAqB,+BAA+B,EAAE,YAAY,qBAAqB,CAAC;AACrG,IAAM,0BAAN,cAAsC,+BAAc;AAAA,EAChD,YAAY,QAA6B;AACrC,UAAM,MAAM;AAAA,EAShB;AAAA;AAAA,EAGA,MAAM,SACF,KACA,OACA,UACA,OACoB;AAEpB,UAAM,aAA4B,MAAM;AACxC,UAAM,kBAAkB,CAAC,GAAG,UAAU,GAAG,UAAU;AAEnD,UAAM,iBAAiB,MAAM,KAAK,IAAI,KAAK;AAAA,MACvC,UAAU;AAAA,MACV;AAAA,MACA,QAAQ;AAAA,IACZ,CAAC;AACD,QAAI,WAAW;AACf,QAAI;AACJ,UAAM,YAAwC,oBAAI,IAAI;AACtD,qBAAiB,SAAS,gBAAgB;AACtC,kBAAY,MAAM;AAClB,UAAI;AAAA,QACA,iCAAiB,KAAK;AAAA,UAClB,OAAO,MAAM;AAAA,UACb;AAAA,UACA,kBAAkB,KAAK;AAAA,UACvB,KAAK,MAAM;AAAA,QACf,CAAC;AAAA,MACL;AACA,YAAM,mBAAoC,KAAK,8BAA8B,EAAE,KAAK;AACpF,UAAI,iBAAiB,SAAS,GAAG;AAG7B,yBAAiB,QAAQ,CAAC,aAAa;AACnC,cAAI,CAAC,UAAU,IAAI,SAAS,MAAM,GAAG;AACjC,gBAAI,UAAU,mBAAmB,KAAK,EAAE,SAAS,CAAC,CAAC;AAAA,UACvD;AAEA,cAAI,UAAU,mBAAmB,KAAK,EAAE,UAAU,MAAM,SAAS,YAAY,CAAC,EAAE,CAAC,CAAC;AAElF,oBAAU,IAAI,SAAS,QAAQ,QAAQ;AAAA,QAC3C,CAAC;AAAA,MAEL;AAAA,IACJ;AAEA,UAAM,UAAuB;AAAA,MACzB,MAAM;AAAA,MACN,SAAS;AAAA,IACb;AAEA,QAAI,UAAU,OAAO,GAAG;AACpB,cAAQ,UAAU;AAAA,QACd,UAAU,MAAM,KAAK,UAAU,OAAO,CAAC,EAAE,IAAI,CAAC,cAAc;AAAA,UACxD,MAAM,SAAS;AAAA,UACf,OAAO,SAAS;AAAA,UAChB,IAAI,SAAS;AAAA,QACjB,EAAE;AAAA,MACN;AAAA,IACJ;AACA,eAAW,KAAK,OAAO;AACvB,UAAM,aAAa;AACnB,WAAO;AAAA,MACH,UAAU;AAAA,MACV,WAAW,MAAM,KAAK,UAAU,OAAO,CAAC;AAAA,MACxC,KAAK,WAAW;AAAA,MAChB,kBAAkB,KAAK;AAAA,IAC3B;AAAA,EACJ;AAEJ;;;ACl9BA,IAAAC,qBAAqC;AAE9B,IAAM,qBAAN,MAAyB;AAAA,EAI5B,YAAY,EAAE,cAAc,IAAsC,CAAC,GAAG;AAHtE,gBAAO,oBAAI,IAAoB;AAI3B,SAAK,iBAAiB,iBAAiB;AAAA,EAC3C;AAAA,EAEA,UAAU,gBAAgC;AACtC,QAAI,SAAS,KAAK,KAAK,IAAI,cAAc;AACzC,QAAI,CAAC,QAAQ;AACT,eAAS,KAAK,eAAe;AAC7B,WAAK,KAAK,IAAI,gBAAgB,MAAM;AAAA,IACxC;AACA,WAAO;AAAA,EACX;AACJ;;;AFXA,mBAA0B;AAE1B,mBAAkB;AAElB,IAAM,UAAM,aAAAC,SAAM,4BAA4B;AAGvC,IAAM,kBAAN,cAA2C,8BAAc;AAAA,EAO5D,YAAY,aAAwC;AAChD,UAAM,EAAE,iBAAiB,GAAG,KAAK,IAAI;AACrC,UAAM,IAAI;AACV,UAAM,EAAE,KAAK,OAAO,cAAc,cAAc,IAAI;AACpD,SAAK,sBAAsB,IAAI,mBAAmB,EAAE,cAAc,CAAC;AACnE,SAAK,aAAa,EAAE,KAAK,OAAO,aAAa;AAC7C,SAAK,OAAO,YAAY,QAAQ;AAChC,SAAK,mBAAmB;AAAA,EAC5B;AAAA,EAEU,IAAI,OAA6C;AACvD,WAAO,IAAI,uBAAsB,CAAC,eAAe;AAC7C,WAAK,KAAK,YAAY,KAAK;AAAA,IAC/B,CAAC;AAAA,EACL;AAAA,EAEA,MAAc,KAAK,YAAmC,OAAsB;AACxE,UAAM,EAAE,UAAU,OAAO,UAAU,OAAO,WAAW,IAAI;AAEzD,UAAM,mBAA2C,CAAC;AAGlD,eAAW,KAAK;AAAA,MACZ,MAAM,wBAAU;AAAA,MAChB;AAAA,MACA;AAAA,IACJ,CAAoB;AAEpB,UAAM,kBAAkB,CAAC,GAAG,QAAQ,EAAE,QAAQ,EAAE,KAAK,CAAC,MAAM,EAAE,SAAS,MAAM;AAC7E,UAAM,YAAY,iBAAiB;AAMnC,UAAM,cAAc,SACf,OAAO,CAAC,MAAM,MAAM,eAAe,EACnC,IAAI,CAAC,MAAM,wBAAwB,CAAC,CAAC,EACrC,OAAO,CAAC,MAAoE,QAAQ,CAAC,CAAC;AAE3F,QAAI;AAEJ,QAAI;AACA,YAAM,EAAE,KAAK,OAAO,aAAa,IAAI,KAAK;AAC1C,YAAM,eAAe,KAAK,oBAAoB,UAAU,QAAQ;AAChE,YAAM,WAAW,OAAO,KAAK,qBAAqB,aAAa,KAAK,iBAAiB,IAAI,uBAAuB,UAAU;AAAA,QACtH,QAAQ;AAAA,QACR;AAAA,QACA,OAAO,CAAC,GAAI,SAAS,CAAC,GAAI,GAAI,8BAA8B,cAAc,CAAC,CAAC,CAAE;AAAA,QAC9E;AAAA,MACJ,CAAC;AACD,eAAS,oBAAoB,cAAc,CAAC,IAAI,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC;AAClE,YAAM,SAAS,SAAS,UAAU,aAAa,IAAI,EAAE,YAAY,CAAC;AAElE,uBAAiB,MAAM,QAAe;AAElC,YAAI,SAAS,KAAK,cAAc,EAAE,GAAG,GAAG,OAAO,CAAC;AAEhD,YAAI,kCAAiB,QAAQ,EAAE,GAAG;AAC9B,cAAI,CAAC,iBAAiB;AAClB,8BAAkB,WAAW;AAC7B,uBAAW,KAAK;AAAA,cACZ,MAAM,wBAAU;AAAA,cAChB,WAAW;AAAA,cACX,MAAM;AAAA,YACV,CAA0B;AAAA,UAC9B;AAEA,gBAAM,QAAS,GAAG,MAAc;AAChC,cAAI,OAAO;AACP,uBAAW,KAAK;AAAA,cACZ,MAAM,wBAAU;AAAA,cAChB,WAAW;AAAA,cACX;AAAA,YACJ,CAA4B;AAAA,UAChC;AACA;AAAA,QACJ;AACA,YAAI,wBAAwB;AAC5B,YAAI,mBAAmB,QAAQ,EAAE,GAAG;AAChC,kCAAwB;AACxB,gBAAM,EAAE,SAAS,IAAI,GAAG;AACxB,gBAAM,aAAa,SAAS,UAAU,WAAW;AACjD,gBAAM,eAAe,SAAS;AAC9B,gBAAM,OAAO,SAAS,cAAc,CAAC;AACrC,qBAAW,KAAK;AAAA,YACZ,MAAM,wBAAU;AAAA,YAChB;AAAA,YACA;AAAA,UACJ,CAAuB;AAAA,QAE3B;AACA,YAAI,mBAAmB,QAAQ,EAAE,GAAG;AAChC,gBAAM,EAAE,UAAU,gBAAgB,IAAI,GAAG;AACzC,qBAAW,YAAY,iBAAiB;AACpC,kBAAM,EAAE,OAAAC,QAAO,GAAG,IAAI;AACtB,kBAAM,WAAW,iBAAiB,EAAE,KAAK;AACzC,gBAAI,OAAOA,WAAU,UAAU;AAC3B,yBAAW,KAAK;AAAA,gBACZ,MAAM,wBAAU;AAAA,gBAChB,YAAY;AAAA,gBACZ,OAAOA,OAAM,QAAQ,IAAI,OAAO,IAAI,QAAQ,EAAE,GAAG,EAAE;AAAA,cACvD,CAAsB;AACtB,+BAAiB,EAAE,IAAIA;AAAA,YAC3B;AAAA,UAEJ;AAAA,QACJ;AACA,YAAI,yBAAyB,gCAAe,QAAQ,EAAE,GAAG;AACrD,gBAAM,EAAE,UAAU,IAAI,GAAG;AACzB,qBAAW,YAAY,WAAW;AAC9B,kBAAM,aAAa,SAAS,UAAU,WAAW;AACjD,uBAAW,KAAK;AAAA,cACZ,MAAM,wBAAU;AAAA,cAChB;AAAA,YACJ,CAAqB;AACrB,mBAAO,iBAAiB,UAAU;AAAA,UACtC;AAAA,QACJ;AAGA,YAAI,oCAAmB,QAAQ,EAAE,KAAK,CAAC,uBAAuB;AAC1D,gBAAM,OAAO,GAAG;AAChB,gBAAM,aAAa,KAAK,UAAU,WAAW;AAC7C,gBAAM,eAAe,KAAK;AAC1B,gBAAM,OAAO,KAAK,cAAc,CAAC;AAEjC,qBAAW,KAAK;AAAA,YACZ,MAAM,wBAAU;AAAA,YAChB;AAAA,YACA;AAAA,UACJ,CAAuB;AAEvB,qBAAW,KAAK;AAAA,YACZ,MAAM,wBAAU;AAAA,YAChB;AAAA,YACA,OAAO,KAAK,UAAU,IAAI;AAAA,UAC9B,CAAsB;AAEtB,qBAAW,KAAK;AAAA,YACZ,MAAM,wBAAU;AAAA,YAChB;AAAA,UACJ,CAAqB;AACrB;AAAA,QACJ;AAGA,YAAI,0CAAyB,QAAQ,EAAE,GAAG;AACtC,gBAAM,IAAI,GAAG;AACb,gBAAM,aAAa,EAAE,UAAU,WAAW;AAC1C,gBAAM,UAAU,oBAAoB,EAAE,UAAU;AAChD,qBAAW,KAAK;AAAA,YACZ,MAAM,wBAAU;AAAA,YAChB;AAAA,YACA;AAAA,YACA,WAAW;AAAA,UACf,CAAwB;AACxB;AAAA,QACJ;AAGA,YAAI,gCAAe,QAAQ,EAAE,GAAG;AAC5B,cAAI,iBAAiB;AACjB,uBAAW,KAAK;AAAA,cACZ,MAAM,wBAAU;AAAA,cAChB,WAAW;AAAA,YACf,CAAwB;AAAA,UAC5B;AAEA,qBAAW,KAAK;AAAA,YACZ,MAAM,wBAAU;AAAA,YAChB;AAAA,YACA;AAAA,UACJ,CAAqB;AACrB,qBAAW,SAAS;AACpB;AAAA,QACJ;AAAA,MAEJ;AAEA,eAAS,mBAAmB,CAAC,CAAC;AAG9B,UAAI,iBAAiB;AACjB,mBAAW,KAAK;AAAA,UACZ,MAAM,wBAAU;AAAA,UAChB,WAAW;AAAA,QACf,CAAwB;AAAA,MAC5B;AACA,iBAAW,KAAK;AAAA,QACZ,MAAM,wBAAU;AAAA,QAChB;AAAA,QACA;AAAA,MACJ,CAAqB;AACrB,iBAAW,SAAS;AAAA,IACxB,SAAS,KAAK;AAEV,YAAM;AAAA,IACV;AAAA,EACJ;AAAA,EAEQ,cAAc,IAAoC;AACtD,QAAI,QAAQ,GAAG;AACf,QAAI,CAAC,OAAO;AACR,UAAI,kCAAiB,QAAQ,EAAE,GAAG;AAC9B,gBAAQ;AAAA,MACZ,WAAW,oCAAmB,QAAQ,EAAE,GAAG;AACvC,gBAAQ;AAAA,MACZ,WAAW,kCAAiB,QAAQ,EAAE,GAAG;AACrC,gBAAQ;AAAA,MACZ,WAAW,0CAAyB,QAAQ,EAAE,GAAG;AAC7C,gBAAQ;AAAA,MACZ,WAAW,gCAAe,QAAQ,EAAE,GAAG;AACnC,gBAAQ;AAAA,MACZ,WAAW,iCAAgB,QAAQ,EAAE,GAAG;AACpC,gBAAQ;AAAA,MACZ,WAAW,iCAAgB,QAAQ,EAAE,GAAG;AACpC,gBAAQ;AAAA,MACZ,WAAW,iCAAgB,QAAQ,EAAE,GAAG;AACpC,gBAAQ;AAAA,MACZ,WAAW,gCAAe,QAAQ,EAAE,GAAG;AACnC,gBAAQ;AAAA,MACZ,WAAW,mBAAmB,QAAQ,EAAE,GAAG;AACvC,gBAAQ;AAAA,MACZ,WAAW,mBAAmB,QAAQ,EAAE,GAAG;AACvC,gBAAQ;AAAA,MACZ,WAAW,gCAAe,QAAQ,EAAE,GAAG;AACnC,gBAAQ;AAAA,MACZ,WAAW,kCAAiB,QAAQ,EAAE,GAAG;AACrC,gBAAQ;AAAA,MACZ,OAAO;AACH,gBAAQ,YAAY,GAAG,SAAS;AAAA,MACpC;AAAA,IACJ;AACA,WAAO;AAAA,EACX;AAAA,EAEA,cAA6B;AACzB,WAAO;AAAA,EACX;AACJ;AAEA,SAAS,wBAAwB,SAA+B;AAC5D,UAAQ,QAAQ,MAAM;AAAA,IAClB,KAAK;AACD,aAAO,EAAE,MAAM,QAAQ,SAAS,QAAQ,QAAQ;AAAA,IACpD,KAAK;AACD,aAAO,EAAE,MAAM,aAAa,SAAS,QAAQ,WAAW,GAAG;AAAA,IAC/D,KAAK;AACD,aAAO,EAAE,MAAM,UAAU,SAAS,QAAQ,QAAQ;AAAA,IACtD,KAAK;AACD,aAAO,EAAE,MAAM,QAAQ,SAAS,QAAQ,SAAS,YAAY,QAAQ,WAAW;AAAA,IACpF;AACI,aAAO;AAAA,EACf;AACJ;AAEA,SAAS,aAAqB;AAC1B,SAAO,GAAG,KAAK,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,MAAM,GAAG,EAAE,CAAC;AACnE;AAEA,SAAS,oBAAoB,QAAqB;AAC9C,MAAI,UAAU,KAAM,QAAO;AAC3B,MAAI,OAAO,WAAW,SAAU,QAAO;AACvC,MAAI,OAAO,WAAW,YAAY,aAAa,UAAU,OAAQ,OAAe,YAAY,UAAU;AAClG,WAAQ,OAAe;AAAA,EAC3B;AACA,MAAI;AACA,WAAO,KAAK,UAAU,MAAM;AAAA,EAChC,QAAQ;AACJ,WAAO,OAAO,MAAM;AAAA,EACxB;AACJ;AAIA,SAAS,8BAA8B,OAAmD;AACtF,SAAO,MAAM,IAAI,CAAC,OAAO;AAAA,IACrB,UAAU;AAAA,MACN,MAAM,EAAE;AAAA,MACR,aAAa,EAAE;AAAA,MACf,gBAAY,wBAAU,EAAE,UAAU;AAAA,IACtC;AAAA,IACA,MAAM,OAAO,UAAe;AACxB,aAAO,UAAU,EAAE,IAAI,eAAe,KAAK,UAAU,KAAK,CAAC;AAAA,IAC/D;AAAA,EACJ,EAAE;AACN;","names":["import_workflow","import_workflow","import_llamaindex","import_workflow","messages","tool","agents","import_llamaindex","debug","input"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/agent.ts","../src/workflow.ts","../src/conversation-memory.ts"],"sourcesContent":["import { ChatMessage } from 'llamaindex';\n\nexport { startAgentEvent, stopAgentEvent, toolCallsEvent, toolResultsEvent } from \"@llamaindex/workflow\";\n\nexport { LlamaIndexAgent } from './agent';\nexport { AguiLlamaIndexWorkflow } from './workflow';","import { AbstractAgent, AgentConfig } from \"@cloudbase/agent-agents/abstract\";\nimport {\n BaseEvent,\n EventType,\n RunAgentInput,\n RunFinishedEvent,\n RunStartedEvent,\n TextMessageContentEvent,\n TextMessageEndEvent,\n TextMessageStartEvent,\n ToolCallArgsEvent,\n ToolCallEndEvent,\n ToolCallResultEvent,\n ToolCallStartEvent,\n} from \"@ag-ui/client\";\nimport { Observable, Subscriber } from \"rxjs\";\nimport {\n FunctionAgentParams,\n agentStreamEvent,\n startAgentEvent,\n stopAgentEvent,\n toolCallsEvent,\n toolResultsEvent,\n agentToolCallEvent,\n agentToolCallResultEvent,\n FunctionAgent,\n agentInputEvent,\n agentSetupEvent,\n agentStepEvent,\n agentOutputEvent,\n WorkflowEvent,\n AgentToolCall,\n WorkflowStream,\n WorkflowEventData,\n} from \"@llamaindex/workflow\";\nimport {\n AguiLlamaIndexWorkflow,\n RunnableWorkflow,\n toolCallChunkEvent,\n toolCallStartEvent,\n} from \"./workflow\";\nimport { BaseTool, BaseToolWithCall, createMemory, Memory } from \"llamaindex\";\nimport { ConversationMemory } from \"./conversation-memory\";\nimport { safeDestr } from \"destr\";\nimport { setTimeout } from \"node:timers/promises\";\nimport debug from \"debug\";\n\nconst log = debug(\"agkit:llamaindex-ts_events\");\ntype AgentConstructorConfig<T = unknown> = AgentConfig & {\n workflowFactory?: () => RunnableWorkflow;\n memoryFactory?: () => Memory;\n} & Pick<FunctionAgentParams, \"llm\" | \"tools\" | \"systemPrompt\" | \"name\">;\n\nexport class LlamaIndexAgent<T = unknown> extends AbstractAgent {\n public name: string;\n private _conversationMemory: ConversationMemory;\n\n readonly baseParams: Pick<\n FunctionAgentParams,\n \"llm\" | \"tools\" | \"systemPrompt\"\n >;\n private readonly _workflowFactory?: () => RunnableWorkflow;\n\n constructor(agentConfig: AgentConstructorConfig<T>) {\n const { workflowFactory, ...rest } =\n agentConfig as AgentConstructorConfig<T>;\n super(rest);\n const { llm, tools, systemPrompt, memoryFactory } = rest as Pick<\n FunctionAgentParams,\n \"llm\" | \"tools\" | \"systemPrompt\"\n > & { memoryFactory?: () => Memory };\n this._conversationMemory = new ConversationMemory({ memoryFactory });\n this.baseParams = { llm, tools, systemPrompt };\n this.name = agentConfig.name || \"Agent\";\n this._workflowFactory = workflowFactory;\n }\n\n run(input: RunAgentInput): Observable<BaseEvent> {\n return new Observable<BaseEvent>((subscriber) => {\n this._run(subscriber, input);\n });\n }\n\n private async _run(subscriber: Subscriber<BaseEvent>, input: RunAgentInput) {\n const { messages, runId, threadId, tools: inputTools } = input;\n\n const toolCallArgsTemp: Record<string, string> = {};\n\n subscriber.next({\n type: EventType.RUN_STARTED,\n threadId,\n runId,\n } as RunStartedEvent);\n\n const lastUserMessage = [...messages]\n .reverse()\n .find((x) => x.role === \"user\");\n const userInput = lastUserMessage?.content;\n // if (!userInput) {\n // throw new Error(\"User input is required\");\n // }\n\n // Convert AG-UI messages to LlamaIndex ChatMessage[] as chat history (excluding latest user input)\n const chatHistory = messages\n .filter((m) => m !== lastUserMessage)\n .map((m) => aguiToLlamaIndexMessage(m))\n .filter(\n (m): m is NonNullable<ReturnType<typeof aguiToLlamaIndexMessage>> =>\n Boolean(m)\n );\n\n let activeMessageId: string | undefined;\n\n try {\n const { llm, tools, systemPrompt } = this.baseParams;\n const memoryForRun = this._conversationMemory.getMemory(threadId);\n const workflow =\n typeof this._workflowFactory === \"function\"\n ? this._workflowFactory()\n : AguiLlamaIndexWorkflow.fromTools({\n memory: memoryForRun,\n llm,\n tools: [\n ...(tools ?? []),\n ...convertToolsToLlamaIndexTools(inputTools ?? []),\n ],\n systemPrompt,\n });\n workflow.setFrontendTools?.((inputTools ?? [])?.map((t) => t.name));\n const stream = workflow.runStream(userInput ?? \"\", { chatHistory });\n\n for await (const ev of stream as any) {\n log(\"event\", this.getEventLabel(ev), ev.toJSON());\n // Text streaming\n if (agentStreamEvent.include(ev)) {\n if (!activeMessageId) {\n activeMessageId = generateId();\n subscriber.next({\n type: EventType.TEXT_MESSAGE_START,\n messageId: activeMessageId,\n role: \"assistant\",\n } as TextMessageStartEvent);\n }\n\n const delta = (ev.data as any)?.delta as string | undefined;\n if (delta) {\n subscriber.next({\n type: EventType.TEXT_MESSAGE_CONTENT,\n messageId: activeMessageId,\n delta,\n } as TextMessageContentEvent);\n }\n continue;\n }\n let hasToolCallStartEvent = false;\n if (toolCallStartEvent.include(ev)) {\n hasToolCallStartEvent = true;\n const { toolCall } = ev.data;\n const toolCallId = toolCall.toolId ?? generateId();\n const toolCallName = toolCall.toolName;\n const args = toolCall.toolKwargs ?? {};\n subscriber.next({\n type: EventType.TOOL_CALL_START,\n toolCallId,\n toolCallName,\n } as ToolCallStartEvent);\n }\n if (toolCallChunkEvent.include(ev)) {\n const { toolCall: toolCallOptions } = ev.data;\n for (const toolCall of toolCallOptions) {\n const { input, id } = toolCall;\n const oldInput = toolCallArgsTemp[id] ?? \"\";\n if (typeof input === \"string\") {\n subscriber.next({\n type: EventType.TOOL_CALL_ARGS,\n toolCallId: id,\n delta: input.replace(new RegExp(`^${oldInput}`), \"\"),\n } as ToolCallArgsEvent);\n toolCallArgsTemp[id] = input;\n }\n }\n }\n if (hasToolCallStartEvent && toolCallsEvent.include(ev)) {\n const { toolCalls } = ev.data;\n for (const toolCall of toolCalls) {\n const toolCallId = toolCall.toolId ?? generateId();\n subscriber.next({\n type: EventType.TOOL_CALL_END,\n toolCallId,\n } as ToolCallEndEvent);\n delete toolCallArgsTemp[toolCallId];\n }\n }\n\n // Single tool call event\n if (agentToolCallEvent.include(ev) && !hasToolCallStartEvent) {\n const call = ev.data as any;\n const toolCallId = call.toolId ?? generateId();\n const toolCallName = call.toolName;\n const args = call.toolKwargs ?? {};\n\n subscriber.next({\n type: EventType.TOOL_CALL_START,\n toolCallId,\n toolCallName,\n } as ToolCallStartEvent);\n\n subscriber.next({\n type: EventType.TOOL_CALL_ARGS,\n toolCallId,\n delta: JSON.stringify(args),\n } as ToolCallArgsEvent);\n\n subscriber.next({\n type: EventType.TOOL_CALL_END,\n toolCallId,\n } as ToolCallEndEvent);\n continue;\n }\n\n // Single tool result event\n if (agentToolCallResultEvent.include(ev)) {\n const r = ev.data as any;\n const toolCallId = r.toolId ?? generateId();\n const content = normalizeToolOutput(r.toolOutput);\n subscriber.next({\n type: EventType.TOOL_CALL_RESULT,\n toolCallId,\n content,\n messageId: activeMessageId,\n } as ToolCallResultEvent);\n continue;\n }\n\n // Agent finished\n if (stopAgentEvent.include(ev)) {\n if (activeMessageId) {\n subscriber.next({\n type: EventType.TEXT_MESSAGE_END,\n messageId: activeMessageId,\n } as TextMessageEndEvent);\n }\n\n subscriber.next({\n type: EventType.RUN_FINISHED,\n threadId,\n runId,\n } as RunFinishedEvent);\n subscriber.complete();\n return;\n }\n }\n\n workflow.setFrontendTools?.([]);\n\n // Fallback if stream ends without explicit stop event\n if (activeMessageId) {\n subscriber.next({\n type: EventType.TEXT_MESSAGE_END,\n messageId: activeMessageId,\n } as TextMessageEndEvent);\n }\n subscriber.next({\n type: EventType.RUN_FINISHED,\n threadId,\n runId,\n } as RunFinishedEvent);\n subscriber.complete();\n } catch (err) {\n // Let AbstractAgent error handling deal with it by throwing\n throw err;\n }\n }\n\n private getEventLabel(ev: WorkflowEvent<unknown>): string {\n let label = ev.debugLabel;\n if (!label) {\n if (agentStreamEvent.include(ev)) {\n label = \"agent_stream\";\n } else if (agentToolCallEvent.include(ev)) {\n label = \"agent_tool_call\";\n } else if (toolResultsEvent.include(ev)) {\n label = \"tool_results\";\n } else if (agentToolCallResultEvent.include(ev)) {\n label = \"agent_tool_call_result\";\n } else if (stopAgentEvent.include(ev)) {\n label = \"stop_agent\";\n } else if (startAgentEvent.include(ev)) {\n label = \"start_agent\";\n } else if (agentInputEvent.include(ev)) {\n label = \"agent_input\";\n } else if (agentSetupEvent.include(ev)) {\n label = \"agent_setup\";\n } else if (agentStepEvent.include(ev)) {\n label = \"agent_step\";\n } else if (toolCallChunkEvent.include(ev)) {\n label = \"tool_call_chunk\";\n } else if (toolCallStartEvent.include(ev)) {\n label = \"tool_call_start\";\n } else if (toolCallsEvent.include(ev)) {\n label = \"tool_calls\";\n } else if (agentOutputEvent.include(ev)) {\n label = \"agent_output\";\n } else {\n label = \"unknown\" + ev.toString();\n }\n }\n return label;\n }\n\n toAGUIAgent(): AbstractAgent {\n return this;\n }\n}\n\nfunction aguiToLlamaIndexMessage(message: any): any | undefined {\n switch (message.role) {\n case \"user\":\n return { role: \"user\", content: message.content };\n case \"assistant\":\n return { role: \"assistant\", content: message.content ?? \"\" };\n case \"system\":\n return { role: \"system\", content: message.content };\n case \"tool\":\n return {\n role: \"tool\",\n content: message.content,\n toolCallId: message.toolCallId,\n };\n default:\n return undefined;\n }\n}\n\nfunction generateId(): string {\n return `${Date.now()}-${Math.random().toString(36).slice(2, 10)}`;\n}\n\nfunction normalizeToolOutput(output: any): string {\n if (output == null) return \"\";\n if (typeof output === \"string\") return output;\n if (\n typeof output === \"object\" &&\n \"content\" in output &&\n typeof (output as any).content === \"string\"\n ) {\n return (output as any).content as string;\n }\n try {\n return JSON.stringify(output);\n } catch {\n return String(output);\n }\n}\n\nfunction convertToolsToLlamaIndexTools(\n tools: RunAgentInput[\"tools\"]\n): BaseToolWithCall[] {\n return tools.map((t) => ({\n metadata: {\n name: t.name,\n description: t.description,\n parameters: safeDestr(t.parameters),\n },\n call: async (input: any) => {\n return `Called ${t.name} with input ${JSON.stringify(input)}`;\n },\n }));\n}\n","// Modified from https://github.com/run-llama/LlamaIndexTS/blob/fc385dc16757a73dc19ca239ebbe1e6155ed4b4d/packages/workflow/src/agent/agent-workflow.ts#L175\n\nimport { callTool } from \"llamaindex\";\nimport type { BaseToolWithCall, ChatResponseChunk, JSONObject, JSONValue, ToolCallLLMMessageOptions, ToolCallOptions } from \"llamaindex\";\nimport type { ChatMessage, MessageContent } from \"llamaindex\";\nimport { createMemory, Memory } from \"llamaindex\";\nimport { PromptTemplate } from \"llamaindex\";\nimport { tool } from \"llamaindex\";\nimport { stringifyJSONToMessageContent } from \"llamaindex\";\nimport { z, type ZodSchema } from \"zod/v4\";\nimport { consoleLogger, emptyLogger, type Logger } from \"@llamaindex/env\";\nimport {\n AgentOutput,\n agentStepEvent,\n agentStreamEvent,\n AgentWorkflowState,\n BaseWorkflowAgent,\n createStatefulMiddleware,\n createWorkflow,\n startAgentEvent,\n StatefulContext,\n stopAgentEvent,\n toolCallsEvent,\n toolResultsEvent,\n workflowEvent,\n WorkflowStream,\n type Handler,\n type Workflow,\n type WorkflowContext,\n type WorkflowEvent,\n type WorkflowEventData,\n} from \"@llamaindex/workflow\";\nimport {\n agentInputEvent,\n agentOutputEvent,\n agentSetupEvent,\n agentToolCallEvent,\n agentToolCallResultEvent,\n type AgentInput,\n type AgentSetup,\n type AgentToolCall,\n type AgentToolCallResult,\n} from \"@llamaindex/workflow\";\nimport { FunctionAgent, type FunctionAgentParams } from \"@llamaindex/workflow\";\n\nconst DEFAULT_HANDOFF_PROMPT = new PromptTemplate({\n template: `Useful for handing off to another agent.\nIf you are currently not equipped to handle the user's request, or another agent is better suited to handle the request, please hand off to the appropriate agent.\n\nCurrently available agents: \n{agent_info}\n`,\n});\n\nconst DEFAULT_HANDOFF_OUTPUT_PROMPT = new PromptTemplate({\n template: `Agent {to_agent} is now handling the request due to the following reason: {reason}.\\nPlease continue with the current request.`,\n});\n\nexport type AgentInputData = {\n userInput?: MessageContent | undefined;\n chatHistory?: Array<ChatMessage | Omit<ChatMessage, 'role'> & { role: \"tool\", toolCallId: string }> | undefined;\n};\n\n\nexport type AgentResultData<O = JSONObject> = {\n result: MessageContent;\n message: ChatMessage;\n state?: AgentWorkflowState | undefined;\n object?: O | undefined;\n};\n\n// Wrapper events for multiple tool calls and results\nexport type ToolCalls = {\n agentName: string;\n toolCalls: AgentToolCall[];\n};\n\nexport type ToolResults = {\n agentName: string;\n results: AgentToolCallResult[];\n};\n\nexport type AgentStep = {\n agentName: string;\n response: ChatMessage;\n toolCalls: AgentToolCall[];\n};\n\nexport type SingleAgentParams = FunctionAgentParams & {\n /**\n * Optional predefined memory to use for the workflow.\n * If not provided, a new empty memory will be created.\n */\n memory?: Memory;\n /**\n * Whether to log verbose output\n */\n verbose?: boolean;\n /**\n * Timeout for the workflow in seconds\n */\n timeout?: number;\n /**\n * Attach optional custom logger\n */\n logger?: Logger;\n};\n\nexport type AgentWorkflowParams = {\n /**\n * List of agents to include in the workflow.\n * Need at least one agent.\n * Can also be an array of AgentWorkflow objects, in which case the agents from each workflow will be extracted.\n */\n agents: BaseWorkflowAgent[] | AguiLlamaIndexWorkflow[];\n /**\n * The agent to start the workflow with.\n * Must be an agent in the `agents` list.\n * Can also be an AgentWorkflow object, in which case the workflow must have exactly one agent.\n */\n rootAgent: BaseWorkflowAgent | AguiLlamaIndexWorkflow;\n /**\n * Optional predefined memory to use for the workflow.\n * If not provided, a new empty memory will be created.\n */\n memory?: Memory | undefined;\n /**\n * Whether to log verbose output\n */\n verbose?: boolean;\n /**\n * Timeout for the workflow in seconds.\n */\n timeout?: number;\n /**\n * Attach optional custom logger\n */\n logger?: Logger | undefined;\n};\n\n/**\n * Create a multi-agent workflow\n * @param params - Parameters for the AgentWorkflow\n * @returns A new AgentWorkflow instance\n */\nexport const multiAgent = (params: AgentWorkflowParams): AguiLlamaIndexWorkflow => {\n return new AguiLlamaIndexWorkflow(params);\n};\n\n/**\n * Create a simple workflow with a single agent and specified tools\n * @param params - Parameters for the single agent workflow\n * @returns A new AgentWorkflow instance\n */\nexport const agent = (params: SingleAgentParams): AguiLlamaIndexWorkflow => {\n return AguiLlamaIndexWorkflow.fromTools(params);\n};\n\nexport const FRONTEND_TOOL_MARKER = '~@~@FRONTEND_TOOL_MARKER@~@~';\n\n/**\n * AgentWorkflow - An event-driven workflow for executing agents with tools\n *\n * This class provides a simple interface for creating and running agent workflows\n * based on the LlamaIndexTS workflow system. It supports single agent workflows\n * with multiple tools.\n */\nexport class AguiLlamaIndexWorkflow implements Workflow, RunnableWorkflow {\n private stateful = createStatefulMiddleware(\n (state: AgentWorkflowState) => state,\n );\n private workflow = this.stateful.withState(createWorkflow());\n private agents: Map<string, BaseWorkflowAgent> = new Map();\n private verbose: boolean;\n private rootAgentName: string;\n private initialMemory?: Memory;\n private logger: Logger;\n\n private frontendTools: string[] = [];\n\n constructor({\n agents,\n rootAgent,\n memory,\n verbose,\n logger,\n }: AgentWorkflowParams) {\n this.verbose = verbose ?? false;\n if (memory) {\n this.initialMemory = memory;\n }\n\n // Handle AgentWorkflow cases for agents\n const processedAgents: BaseWorkflowAgent[] = [];\n if (agents.length > 0) {\n if (agents[0] instanceof AguiLlamaIndexWorkflow) {\n // If agents is AgentWorkflow[], extract the BaseWorkflowAgent from each workflow\n const agentWorkflows = agents as AguiLlamaIndexWorkflow[];\n agentWorkflows.forEach((workflow) => {\n const workflowAgents = workflow.getAgents();\n processedAgents.push(...workflowAgents);\n });\n } else {\n // Otherwise, agents is already BaseWorkflowAgent[]\n processedAgents.push(...(agents as BaseWorkflowAgent[]));\n }\n }\n\n // Handle AgentWorkflow case for rootAgent and set rootAgentName\n if (rootAgent instanceof AguiLlamaIndexWorkflow) {\n // If rootAgent is an AgentWorkflow, check if it has exactly one agent\n const rootAgents = rootAgent.getAgents();\n\n if (rootAgents.length !== 1) {\n throw new Error(\n `Root agent must be a single agent, but it is a workflow with ${rootAgents.length} agents`,\n );\n }\n\n // We know rootAgents[0] exists because we checked length === 1 above\n this.rootAgentName = rootAgents[0]!.name;\n } else {\n // Otherwise, rootAgent is already a BaseWorkflowAgent\n this.rootAgentName = rootAgent.name;\n }\n\n // Validate root agent\n if (!processedAgents.some((a) => a.name === this.rootAgentName)) {\n throw new Error(`Root agent ${this.rootAgentName} not found in agents`);\n }\n\n this.addAgents(processedAgents);\n this.setupWorkflowSteps();\n\n // Use the provided logger if exists, else default to consoleLogger if verbose, else emptyLogger\n this.logger = logger ?? (this.verbose ? consoleLogger : emptyLogger);\n }\n\n handle<\n const AcceptEvents extends WorkflowEvent<unknown>[],\n Result extends ReturnType<WorkflowEvent<unknown>[\"with\"]> | void,\n >(accept: AcceptEvents, handler: Handler<AcceptEvents, Result>): void {\n this.workflow.handle(accept, handler);\n }\n\n createContext(): WorkflowContext {\n return this.workflow.createContext(this.createInitialState());\n }\n\n private addAgents(agents: BaseWorkflowAgent[]): void {\n const agentNames = new Set(agents.map((a) => a.name));\n if (agentNames.size !== agents.length) {\n throw new Error(\"The agent names must be unique!\");\n }\n\n agents.forEach((agent) => {\n this.agents.set(agent.name, agent);\n });\n\n if (agents.length > 1) {\n agents.forEach((agent) => {\n this.validateAgent(agent);\n this.addHandoffTool(agent);\n });\n }\n }\n\n private validateAgent(agent: BaseWorkflowAgent) {\n // Validate that all canHandoffTo agents exist\n const invalidAgents = agent.canHandoffTo.filter(\n (name) => !this.agents.has(name),\n );\n if (invalidAgents.length > 0) {\n throw new Error(\n `Agent \"${agent.name}\" references non-existent agents in canHandoffTo: ${invalidAgents.join(\", \")}`,\n );\n }\n }\n\n private addHandoffTool(agent: BaseWorkflowAgent) {\n if (agent.tools.some((t) => t.metadata.name === \"handOff\")) {\n return;\n }\n const toHandoffAgents: Map<string, BaseWorkflowAgent> = new Map();\n agent.canHandoffTo.forEach((name) => {\n toHandoffAgents.set(name, this.agents.get(name)!);\n });\n const handoffTool = this.createHandoffTool(toHandoffAgents);\n if (\n agent.canHandoffTo.length > 0 &&\n !agent.tools.some((t) => t.metadata.name === handoffTool.metadata.name)\n ) {\n agent.tools.push(handoffTool);\n }\n }\n\n /**\n * Adds a new agent to the workflow\n */\n addAgent(agent: BaseWorkflowAgent): this {\n this.agents.set(agent.name, agent);\n this.validateAgent(agent);\n this.addHandoffTool(agent);\n return this;\n }\n\n /**\n * Gets all agents in this workflow\n * @returns Array of agents in this workflow\n */\n getAgents(): BaseWorkflowAgent[] {\n return Array.from(this.agents.values());\n }\n\n /**\n * Create a simple workflow with a single agent and specified tools\n * @param params - Parameters for the single agent workflow\n * @returns A new AgentWorkflow instance\n */\n static fromTools(params: SingleAgentParams): AguiLlamaIndexWorkflow {\n const agent = new LlamaIndexFunctionAgent({\n name: params.name,\n description: params.description,\n tools: params.tools,\n llm: params.llm,\n systemPrompt: params.systemPrompt,\n canHandoffTo: params.canHandoffTo,\n });\n\n const workflowParams: AgentWorkflowParams = {\n agents: [agent],\n rootAgent: agent,\n verbose: params.verbose ?? false,\n timeout: params.timeout ?? 60,\n memory: params.memory,\n logger: params.logger,\n };\n\n const workflow = new AguiLlamaIndexWorkflow(workflowParams);\n\n return workflow;\n }\n\n private handleInputStep = async (\n context: StatefulContext<AgentWorkflowState>,\n event: WorkflowEventData<AgentInputData>,\n ) => {\n const { state } = context;\n const { userInput, chatHistory } = event.data;\n const memory = state.memory;\n if (chatHistory) {\n if (chatHistory.length === 1 && chatHistory[0].role === \"tool\") {\n const agent = this.agents.get(context.state.currentAgentName);\n if (!agent) {\n throw new Error(`Agent ${context.state.currentAgentName} not found`);\n }\n const toolMessage = chatHistory[0];\n agent.handleToolCallResults(context.state, [{\n // toolName: chatHistory[0].name,\n // toolKwargs: chatHistory[0].args,\n toolName: 'NOT used',\n toolKwargs: { NotUsed: 'NOT used' },\n toolId: chatHistory[0].toolCallId,\n toolOutput: {\n isError: false,\n id: chatHistory[0].toolCallId,\n result: stringifyJSONToMessageContent(toolMessage.content),\n },\n returnDirect: false,\n raw: toolMessage.content,\n }]);\n } else {\n chatHistory.forEach((message) => {\n memory.add(message);\n });\n }\n }\n if (userInput) {\n const userMessage: ChatMessage = {\n role: \"user\",\n content: userInput,\n };\n memory.add(userMessage);\n }\n // if (userInput) {\n // const userMessage: ChatMessage = {\n // role: \"user\",\n // content: userInput,\n // };\n // memory.add(userMessage);\n // } else if (chatHistory) {\n // // If no user message, use the last message from chat history as user_msg_str\n // const lastMessage = chatHistory[chatHistory.length - 1];\n // if (lastMessage?.role !== \"user\") {\n // throw new Error(\n // \"Either provide a user message or a chat history with a user message as the last message\",\n // );\n // }\n // } else {\n // throw new Error(\"No user message or chat history provided\");\n // }\n\n this.logger.log(`[Agent ${this.rootAgentName}]: Starting agent`);\n\n return agentInputEvent.with({\n input: await memory.getLLM(this.agents.get(this.rootAgentName)?.llm),\n currentAgentName: this.rootAgentName,\n });\n };\n\n private setupAgent = async (\n context: StatefulContext<AgentWorkflowState>,\n event: WorkflowEventData<AgentInput>,\n ) => {\n const currentAgentName = event.data.currentAgentName;\n const agent = this.agents.get(currentAgentName);\n if (!agent) {\n throw new Error(`Agent ${currentAgentName} not found`);\n }\n\n const llmInput = event.data.input;\n if (agent.systemPrompt) {\n llmInput.unshift({\n role: \"system\",\n content: agent.systemPrompt,\n });\n }\n\n return agentSetupEvent.with({\n input: llmInput,\n currentAgentName: currentAgentName,\n });\n };\n\n private runAgentStep = async (\n context: StatefulContext<AgentWorkflowState>,\n event: WorkflowEventData<AgentSetup>,\n ) => {\n const { sendEvent } = context;\n const agent = this.agents.get(event.data.currentAgentName);\n if (!agent) {\n throw new Error(\"No valid agent found\");\n }\n\n const output = await agent.takeStep(\n context,\n context.state,\n event.data.input,\n agent.tools,\n );\n\n sendEvent(\n agentStepEvent.with({\n agentName: agent.name,\n response: output.response,\n toolCalls: output.toolCalls,\n }),\n );\n\n sendEvent(agentOutputEvent.with(output));\n };\n\n private parseAgentOutput = async (\n context: StatefulContext<AgentWorkflowState>,\n event: WorkflowEventData<AgentStep>,\n ) => {\n const { agentName, response, toolCalls } = event.data;\n const agent = this.agents.get(agentName);\n if (!agent) {\n throw new Error(\n `parseAgentOutput failed: agent ${agentName} does not exist`,\n );\n }\n\n // If no tool calls, return final response\n if (!toolCalls || toolCalls.length === 0) {\n this.logger.log(\n `[Agent ${agentName}]: No tool calls to process, returning final response`,\n );\n\n const agentOutput = {\n response,\n toolCalls: [],\n raw: response,\n currentAgentName: agentName,\n };\n const content = await agent.finalize(context.state, agentOutput);\n\n // if responseFormat is set, use the structured tool to parse the response\n let object: JSONObject | undefined = undefined;\n if (context.state.responseFormat) {\n object = await agent.getStructuredOutput(\n context.state.responseFormat,\n content.response,\n );\n }\n\n return stopAgentEvent.with({\n message: content.response,\n result: content.response.content,\n state: context.state,\n object,\n });\n }\n\n return toolCallsEvent.with({\n agentName,\n toolCalls,\n });\n };\n\n private executeToolCalls = async (\n context: StatefulContext<AgentWorkflowState>,\n event: WorkflowEventData<ToolCalls>,\n ) => {\n const { sendEvent } = context;\n const { agentName, toolCalls } = event.data;\n const agent = this.agents.get(agentName);\n if (!agent) {\n throw new Error(`Agent ${agentName} not found`);\n }\n\n const results: AgentToolCallResult[] = [];\n\n // Execute each tool call\n for (const toolCall of toolCalls) {\n // Send single tool call event, useful for UI\n sendEvent(agentToolCallEvent.with(toolCall));\n const toolResult = {\n toolName: toolCall.toolName,\n toolKwargs: toolCall.toolKwargs,\n toolId: toolCall.toolId,\n toolOutput: {\n id: toolCall.toolId,\n result: \"\",\n isError: false,\n },\n returnDirect: false,\n raw: {},\n };\n try {\n const output = await this.callTool(toolCall);\n toolResult.raw = output;\n toolResult.toolOutput.result = stringifyJSONToMessageContent(output);\n toolResult.returnDirect = toolCall.toolName === \"handOff\";\n } catch (error) {\n toolResult.toolOutput.isError = true;\n toolResult.toolOutput.result = `Error: ${error}`;\n }\n results.push(toolResult);\n // Send single tool result event, useful for UI\n sendEvent(agentToolCallResultEvent.with(toolResult));\n }\n\n return toolResultsEvent.with({\n agentName,\n results,\n });\n };\n\n private processToolResults = async (\n context: StatefulContext<AgentWorkflowState>,\n event: WorkflowEventData<ToolResults>,\n ) => {\n const { agentName, results } = event.data;\n\n // Get agent\n const agent = this.agents.get(agentName);\n if (!agent) {\n throw new Error(`Agent ${agentName} not found`);\n }\n\n const backendResults = results.filter(r => r.toolOutput.result !== FRONTEND_TOOL_MARKER);\n const frontendResults = results.filter(r => r.toolOutput.result === FRONTEND_TOOL_MARKER);\n\n await agent.handleToolCallResults(context.state, backendResults);\n\n const directResult = results.find(\n (r: AgentToolCallResult) => r.returnDirect,\n );\n if (directResult) {\n const isHandoff = directResult.toolName === \"handOff\";\n\n const raw = directResult.raw;\n const output = typeof raw === \"string\" ? raw : JSON.stringify(raw);\n const responseMessage: ChatMessage = {\n role: \"assistant\" as const,\n content: output, // use stringified tool output for assistant message\n };\n\n const agentOutput = {\n response: responseMessage,\n toolCalls: [],\n raw,\n currentAgentName: agent.name,\n };\n\n await agent.finalize(context.state, agentOutput);\n\n if (isHandoff) {\n const nextAgentName = context.state.nextAgentName;\n\n this.logger.log(\n `[Agent ${agentName}]: Handoff to ${nextAgentName}: ${directResult.toolOutput.result}`,\n );\n\n if (nextAgentName) {\n context.state.currentAgentName = nextAgentName;\n context.state.nextAgentName = null;\n\n const messages = await context.state.memory.getLLM(\n this.agents.get(nextAgentName)?.llm,\n );\n\n this.logger.log(`[Agent ${nextAgentName}]: Starting agent`);\n\n return agentInputEvent.with({\n input: messages,\n currentAgentName: nextAgentName,\n });\n }\n }\n\n return stopAgentEvent.with({\n message: responseMessage,\n result: output,\n state: context.state,\n });\n }\n\n // Continue with another agent step\n const messages = await context.state.memory.getLLM(\n this.agents.get(agent.name)?.llm,\n );\n if (frontendResults.length > 0) {\n return stopAgentEvent.with({\n message: {\n role: 'assistant',\n content: `Frontend tool called`,\n },\n result: `Frontend tool called`,\n state: context.state,\n });\n }\n\n\n return agentInputEvent.with({\n input: messages,\n currentAgentName: agent.name,\n });\n };\n\n private setupWorkflowSteps() {\n this.workflow.handle([startAgentEvent], this.handleInputStep);\n this.workflow.handle([agentInputEvent], this.setupAgent);\n this.workflow.handle([agentSetupEvent], this.runAgentStep);\n this.workflow.handle([agentStepEvent], this.parseAgentOutput);\n this.workflow.handle([toolCallsEvent], this.overriddenExecuteToolCalls);\n this.workflow.handle([toolResultsEvent], this.processToolResults);\n }\n\n private overriddenExecuteToolCalls = async (\n context: StatefulContext<AgentWorkflowState>,\n event: WorkflowEventData<ToolCalls>,\n ) => {\n const { sendEvent } = context;\n const { agentName, toolCalls } = event.data;\n\n const frontendToolCalls = toolCalls.filter(t => this.frontendTools.includes(t.toolName));\n const backendToolCalls = toolCalls.filter(t => !this.frontendTools.includes(t.toolName));\n if (frontendToolCalls.length <= 0) {\n return this.executeToolCalls(context, event);\n };\n\n const results: AgentToolCallResult[] = [];\n\n // Execute each tool call\n for (const toolCall of backendToolCalls) {\n // Send single tool call event, useful for UI\n sendEvent(agentToolCallEvent.with(toolCall));\n const toolResult = {\n toolName: toolCall.toolName,\n toolKwargs: toolCall.toolKwargs,\n toolId: toolCall.toolId,\n toolOutput: {\n id: toolCall.toolId,\n result: \"\",\n isError: false,\n },\n returnDirect: false,\n raw: {},\n };\n try {\n const output = await this.callTool(toolCall);\n toolResult.raw = output;\n toolResult.toolOutput.result = stringifyJSONToMessageContent(output);\n toolResult.returnDirect = toolCall.toolName === \"handOff\";\n } catch (error) {\n toolResult.toolOutput.isError = true;\n toolResult.toolOutput.result = `Error: ${error}`;\n }\n results.push(toolResult);\n // Send single tool result event, useful for UI\n sendEvent(agentToolCallResultEvent.with(toolResult));\n }\n\n // Run each frontend tool call\n for (const toolCall of frontendToolCalls) {\n // Send single tool call event, useful for UI\n sendEvent(agentToolCallEvent.with(toolCall));\n continue\n const toolResult = {\n toolName: toolCall.toolName,\n toolKwargs: toolCall.toolKwargs,\n toolId: toolCall.toolId,\n toolOutput: {\n id: toolCall.toolId,\n result: FRONTEND_TOOL_MARKER,\n isError: true,\n },\n returnDirect: false,\n raw: {},\n };\n results.push(toolResult);\n\n }\n if (frontendToolCalls.length > 0) {\n if (results.length > 0) {\n const agent = this.agents.get(agentName);\n if (!agent) {\n throw new Error(`Agent ${agentName} not found`);\n }\n await agent.handleToolCallResults(context.state, results);\n await agent.finalize(context.state, {\n response: {\n role: 'assistant',\n content: `Frontend tool called`,\n },\n toolCalls: [],\n raw: `Frontend tool called`,\n currentAgentName: agentName,\n });\n }\n return stopAgentEvent.with({\n message: {\n role: 'assistant',\n content: `Frontend tool called`,\n },\n result: `Frontend tool called`,\n state: context.state,\n });\n }\n\n return toolResultsEvent.with({\n agentName,\n results,\n });\n }\n\n private async callTool(toolCall: AgentToolCall): Promise<JSONValue> {\n const tool = this.agents\n .get(toolCall.agentName)\n ?.tools.find((t) => t.metadata.name === toolCall.toolName);\n\n const toolOutput = await callTool(\n tool,\n {\n name: toolCall.toolName,\n input: toolCall.toolKwargs,\n id: toolCall.toolId,\n },\n this.logger,\n );\n\n if (toolOutput.isError) {\n throw new Error(String(toolOutput.output));\n }\n\n return toolOutput.output;\n }\n\n private createInitialState(): AgentWorkflowState {\n return {\n memory: this.initialMemory ?? createMemory(),\n scratchpad: [],\n currentAgentName: this.rootAgentName,\n agents: Array.from(this.agents.keys()),\n nextAgentName: null,\n };\n }\n\n runStream<Z extends ZodSchema>(\n userInput: MessageContent,\n params?: {\n chatHistory?: ChatMessage[];\n state?: AgentWorkflowState;\n responseFormat?: Z;\n },\n ): WorkflowStream<WorkflowEventData<AgentResultData<z.infer<Z>>>> {\n if (this.agents.size === 0) {\n throw new Error(\"No agents added to workflow\");\n }\n const state = params?.state ?? this.createInitialState();\n\n const { sendEvent, stream } = this.workflow.createContext({\n ...state,\n responseFormat: params?.responseFormat,\n });\n sendEvent(\n startAgentEvent.with({\n userInput: userInput,\n chatHistory: params?.chatHistory,\n }),\n );\n return stream.until(stopAgentEvent);\n }\n\n async run<Z extends ZodSchema>(\n userInput: MessageContent,\n params?: {\n chatHistory?: ChatMessage[];\n state?: AgentWorkflowState;\n responseFormat?: Z;\n },\n ): Promise<WorkflowEventData<AgentResultData<z.infer<Z>>>> {\n const finalEvent = (await this.runStream(userInput, params).toArray()).at(\n -1,\n );\n if (!stopAgentEvent.include(finalEvent)) {\n throw new Error(\n `Agent stopped with unexpected ${finalEvent?.toString() ?? \"unknown\"} event.`,\n );\n }\n return finalEvent;\n }\n\n createHandoffTool(agents: Map<string, BaseWorkflowAgent>) {\n const agentInfo = Array.from(agents.values()).reduce(\n (acc, a) => {\n acc[a.name] = a.description;\n return acc;\n },\n {} as Record<string, string>,\n );\n return tool({\n name: \"handOff\",\n description: DEFAULT_HANDOFF_PROMPT.format({\n agent_info: JSON.stringify(agentInfo),\n }),\n parameters: z.object({\n toAgent: z.string().describe(\"The name of the agent to hand off to\"),\n reason: z.string().describe(\"The reason for handing off to the agent\"),\n }),\n execute: (\n {\n toAgent,\n reason,\n }: {\n toAgent: string;\n reason: string;\n },\n contextProvider?: () => AgentWorkflowState,\n ) => {\n if (!contextProvider) {\n throw new Error(\n \"Handoff tool internal error: Context was not provided.\",\n );\n }\n const context = contextProvider();\n const agents = context.agents;\n if (!agents.includes(toAgent)) {\n return `Agent ${toAgent} not found. Select a valid agent to hand off to. Valid agents: ${agents.join(\n \", \",\n )}`;\n }\n context.nextAgentName = toAgent;\n return DEFAULT_HANDOFF_OUTPUT_PROMPT.format({\n to_agent: toAgent,\n reason: reason,\n });\n },\n }).bind(() => this.stateful.getContext().state);\n }\n\n setFrontendTools(tools: string[]): this {\n this.frontendTools = tools;\n return this;\n }\n\n\n}\n\n\nexport const toolCallStartEvent = workflowEvent<{ toolCall: AgentToolCall }>({ debugLabel: 'ToolCallStartEvent' })\nexport const toolCallChunkEvent = workflowEvent<ToolCallOptions>({ debugLabel: 'ToolCallChunkEvent' })\nclass LlamaIndexFunctionAgent extends FunctionAgent {\n constructor(params: FunctionAgentParams) {\n super(params);\n // const _getToolCallFromResponseChunk = this['getToolCallFromResponseChunk'].bind(this);\n // this['getToolCallFromResponseChunk'] = (chunk: any): AgentToolCall[] => {\n // const toolCall = _getToolCallFromResponseChunk(chunk);\n // if(toolCall) {\n\n // }\n // return toolCall;\n // }\n }\n\n // https://github.com/run-llama/LlamaIndexTS/blob/fc385dc16757a73dc19ca239ebbe1e6155ed4b4d/packages/workflow/src/agent/function-agent.ts#L181C3-L240C4\n async takeStep(\n ctx: WorkflowContext,\n state: AgentWorkflowState,\n llmInput: ChatMessage[],\n tools: BaseToolWithCall[],\n ): Promise<AgentOutput> {\n // Get scratchpad from context or initialize if not present\n const scratchpad: ChatMessage[] = state.scratchpad;\n const currentLLMInput = [...llmInput, ...scratchpad];\n\n const responseStream = await this.llm.chat({\n messages: currentLLMInput,\n tools,\n stream: true,\n });\n let response = \"\";\n let lastChunk: ChatResponseChunk | undefined;\n const toolCalls: Map<string, AgentToolCall> = new Map();\n for await (const chunk of responseStream) {\n response += chunk.delta;\n ctx.sendEvent(\n agentStreamEvent.with({\n delta: chunk.delta,\n response: response,\n currentAgentName: this.name,\n raw: chunk.raw,\n }),\n );\n const toolCallsInChunk: AgentToolCall[] = this['getToolCallFromResponseChunk'](chunk);\n if (toolCallsInChunk.length > 0) {\n\n // Just upsert the tool calls with the latest one if they exist\n toolCallsInChunk.forEach((toolCall) => {\n if (!toolCalls.has(toolCall.toolId)) {\n ctx.sendEvent(toolCallStartEvent.with({ toolCall }));\n }\n // @ts-expect-error\n ctx.sendEvent(toolCallChunkEvent.with({ toolCall: chunk.options?.toolCall ?? [] }));\n\n toolCalls.set(toolCall.toolId, toolCall);\n });\n\n }\n }\n\n const message: ChatMessage = {\n role: \"assistant\" as const,\n content: response,\n };\n\n if (toolCalls.size > 0) {\n message.options = {\n toolCall: Array.from(toolCalls.values()).map((toolCall) => ({\n name: toolCall.toolName,\n input: toolCall.toolKwargs,\n id: toolCall.toolId,\n })),\n };\n }\n scratchpad.push(message);\n state.scratchpad = scratchpad;\n return {\n response: message,\n toolCalls: Array.from(toolCalls.values()),\n raw: lastChunk?.raw,\n currentAgentName: this.name,\n };\n }\n\n}\n\nexport interface RunnableWorkflow<T = unknown, R extends unknown[] = unknown[]> {\n runStream(...args: R): WorkflowStream<WorkflowEventData<T>>\n setFrontendTools?: (names: string[]) => void;\n}","import { createMemory, Memory } from \"llamaindex\";\n\nexport class ConversationMemory {\n _map = new Map<string, Memory>();\n private _memoryFactory: () => Memory;\n\n constructor({ memoryFactory }: { memoryFactory?: () => Memory } = {}) {\n this._memoryFactory = memoryFactory ?? createMemory;\n }\n\n getMemory(conversationId: string): Memory {\n let memory = this._map.get(conversationId);\n if (!memory) {\n memory = this._memoryFactory();\n this._map.set(conversationId, memory);\n }\n return memory;\n }\n}"],"mappings":"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","names":["import_workflow","import_workflow","import_llamaindex","import_workflow","messages","tool","agents","import_llamaindex","debug","input"]}
package/dist/index.mjs CHANGED
@@ -3,9 +3,23 @@ import { startAgentEvent as startAgentEvent3, stopAgentEvent as stopAgentEvent3,
3
3
 
4
4
  // src/agent.ts
5
5
  import { AbstractAgent } from "@cloudbase/agent-agents/abstract";
6
- import { EventType } from "@ag-ui/client";
6
+ import {
7
+ EventType
8
+ } from "@ag-ui/client";
7
9
  import { Observable } from "rxjs";
8
- import { agentStreamEvent as agentStreamEvent2, startAgentEvent as startAgentEvent2, stopAgentEvent as stopAgentEvent2, toolCallsEvent as toolCallsEvent2, toolResultsEvent as toolResultsEvent2, agentToolCallEvent as agentToolCallEvent2, agentToolCallResultEvent as agentToolCallResultEvent2, agentInputEvent as agentInputEvent2, agentSetupEvent as agentSetupEvent2, agentStepEvent as agentStepEvent2, agentOutputEvent as agentOutputEvent2 } from "@llamaindex/workflow";
10
+ import {
11
+ agentStreamEvent as agentStreamEvent2,
12
+ startAgentEvent as startAgentEvent2,
13
+ stopAgentEvent as stopAgentEvent2,
14
+ toolCallsEvent as toolCallsEvent2,
15
+ toolResultsEvent as toolResultsEvent2,
16
+ agentToolCallEvent as agentToolCallEvent2,
17
+ agentToolCallResultEvent as agentToolCallResultEvent2,
18
+ agentInputEvent as agentInputEvent2,
19
+ agentSetupEvent as agentSetupEvent2,
20
+ agentStepEvent as agentStepEvent2,
21
+ agentOutputEvent as agentOutputEvent2
22
+ } from "@llamaindex/workflow";
9
23
 
10
24
  // src/workflow.ts
11
25
  import { callTool } from "llamaindex";
@@ -710,7 +724,9 @@ var LlamaIndexAgent = class extends AbstractAgent {
710
724
  });
711
725
  const lastUserMessage = [...messages].reverse().find((x) => x.role === "user");
712
726
  const userInput = lastUserMessage?.content;
713
- const chatHistory = messages.filter((m) => m !== lastUserMessage).map((m) => aguiToLlamaIndexMessage(m)).filter((m) => Boolean(m));
727
+ const chatHistory = messages.filter((m) => m !== lastUserMessage).map((m) => aguiToLlamaIndexMessage(m)).filter(
728
+ (m) => Boolean(m)
729
+ );
714
730
  let activeMessageId;
715
731
  try {
716
732
  const { llm, tools, systemPrompt } = this.baseParams;
@@ -718,7 +734,10 @@ var LlamaIndexAgent = class extends AbstractAgent {
718
734
  const workflow = typeof this._workflowFactory === "function" ? this._workflowFactory() : AguiLlamaIndexWorkflow.fromTools({
719
735
  memory: memoryForRun,
720
736
  llm,
721
- tools: [...tools ?? [], ...convertToolsToLlamaIndexTools(inputTools ?? [])],
737
+ tools: [
738
+ ...tools ?? [],
739
+ ...convertToolsToLlamaIndexTools(inputTools ?? [])
740
+ ],
722
741
  systemPrompt
723
742
  });
724
743
  workflow.setFrontendTools?.((inputTools ?? [])?.map((t) => t.name));
@@ -897,7 +916,11 @@ function aguiToLlamaIndexMessage(message) {
897
916
  case "system":
898
917
  return { role: "system", content: message.content };
899
918
  case "tool":
900
- return { role: "tool", content: message.content, toolCallId: message.toolCallId };
919
+ return {
920
+ role: "tool",
921
+ content: message.content,
922
+ toolCallId: message.toolCallId
923
+ };
901
924
  default:
902
925
  return void 0;
903
926
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/agent.ts","../src/workflow.ts","../src/conversation-memory.ts"],"sourcesContent":["import { ChatMessage } from 'llamaindex';\n\nexport { startAgentEvent, stopAgentEvent, toolCallsEvent, toolResultsEvent } from \"@llamaindex/workflow\";\n\nexport { LlamaIndexAgent } from './agent';\nexport { AguiLlamaIndexWorkflow } from './workflow';","import { AbstractAgent, AgentConfig } from \"@cloudbase/agent-agents/abstract\";\nimport { BaseEvent, EventType, RunAgentInput, RunFinishedEvent, RunStartedEvent, TextMessageContentEvent, TextMessageEndEvent, TextMessageStartEvent, ToolCallArgsEvent, ToolCallEndEvent, ToolCallResultEvent, ToolCallStartEvent } from \"@ag-ui/client\";\nimport { Observable, Subscriber } from \"rxjs\";\nimport { FunctionAgentParams, agentStreamEvent, startAgentEvent, stopAgentEvent, toolCallsEvent, toolResultsEvent, agentToolCallEvent, agentToolCallResultEvent, FunctionAgent, agentInputEvent, agentSetupEvent, agentStepEvent, agentOutputEvent, WorkflowEvent, AgentToolCall, WorkflowStream, WorkflowEventData } from \"@llamaindex/workflow\";\nimport { AguiLlamaIndexWorkflow, RunnableWorkflow, toolCallChunkEvent, toolCallStartEvent } from \"./workflow\";\nimport { BaseTool, BaseToolWithCall, createMemory, Memory } from \"llamaindex\";\nimport { ConversationMemory } from \"./conversation-memory\";\nimport { safeDestr } from 'destr'\nimport { setTimeout } from \"node:timers/promises\";\nimport debug from \"debug\";\n\nconst log = debug('agkit:llamaindex-ts_events');\ntype AgentConstructorConfig<T = unknown> = AgentConfig & { workflowFactory?: () => RunnableWorkflow; memoryFactory?: () => Memory } & Pick<FunctionAgentParams, 'llm' | 'tools' | 'systemPrompt' | 'name'>;\n\nexport class LlamaIndexAgent<T = unknown> extends AbstractAgent {\n public name: string;\n private _conversationMemory: ConversationMemory;\n\n readonly baseParams: Pick<FunctionAgentParams, 'llm' | 'tools' | 'systemPrompt'>;\n private readonly _workflowFactory?: () => RunnableWorkflow;\n\n constructor(agentConfig: AgentConstructorConfig<T>) {\n const { workflowFactory, ...rest } = agentConfig as AgentConstructorConfig<T>;\n super(rest);\n const { llm, tools, systemPrompt, memoryFactory } = rest as Pick<FunctionAgentParams, 'llm' | 'tools' | 'systemPrompt'> & { memoryFactory?: () => Memory };\n this._conversationMemory = new ConversationMemory({ memoryFactory });\n this.baseParams = { llm, tools, systemPrompt };\n this.name = agentConfig.name || 'Agent';\n this._workflowFactory = workflowFactory;\n }\n\n protected run(input: RunAgentInput): Observable<BaseEvent> {\n return new Observable<BaseEvent>((subscriber) => {\n this._run(subscriber, input);\n });\n }\n\n private async _run(subscriber: Subscriber<BaseEvent>, input: RunAgentInput) {\n const { messages, runId, threadId, tools: inputTools } = input;\n\n const toolCallArgsTemp: Record<string, string> = {};\n\n\n subscriber.next({\n type: EventType.RUN_STARTED,\n threadId,\n runId,\n } as RunStartedEvent);\n\n const lastUserMessage = [...messages].reverse().find((x) => x.role === \"user\");\n const userInput = lastUserMessage?.content;\n // if (!userInput) {\n // throw new Error(\"User input is required\");\n // }\n\n // Convert AG-UI messages to LlamaIndex ChatMessage[] as chat history (excluding latest user input)\n const chatHistory = messages\n .filter((m) => m !== lastUserMessage)\n .map((m) => aguiToLlamaIndexMessage(m))\n .filter((m): m is NonNullable<ReturnType<typeof aguiToLlamaIndexMessage>> => Boolean(m));\n\n let activeMessageId: string | undefined;\n\n try {\n const { llm, tools, systemPrompt } = this.baseParams;\n const memoryForRun = this._conversationMemory.getMemory(threadId);\n const workflow = typeof this._workflowFactory === 'function' ? this._workflowFactory() : AguiLlamaIndexWorkflow.fromTools({\n memory: memoryForRun,\n llm,\n tools: [...(tools ?? []), ...(convertToolsToLlamaIndexTools(inputTools ?? []))],\n systemPrompt,\n });\n workflow.setFrontendTools?.((inputTools ?? [])?.map((t) => t.name));\n const stream = workflow.runStream(userInput ?? '', { chatHistory });\n\n for await (const ev of stream as any) {\n\n log('event', this.getEventLabel(ev), ev.toJSON());\n // Text streaming\n if (agentStreamEvent.include(ev)) {\n if (!activeMessageId) {\n activeMessageId = generateId();\n subscriber.next({\n type: EventType.TEXT_MESSAGE_START,\n messageId: activeMessageId,\n role: \"assistant\",\n } as TextMessageStartEvent);\n }\n\n const delta = (ev.data as any)?.delta as string | undefined;\n if (delta) {\n subscriber.next({\n type: EventType.TEXT_MESSAGE_CONTENT,\n messageId: activeMessageId,\n delta,\n } as TextMessageContentEvent);\n }\n continue;\n }\n let hasToolCallStartEvent = false;\n if (toolCallStartEvent.include(ev)) {\n hasToolCallStartEvent = true;\n const { toolCall } = ev.data;\n const toolCallId = toolCall.toolId ?? generateId();\n const toolCallName = toolCall.toolName;\n const args = toolCall.toolKwargs ?? {};\n subscriber.next({\n type: EventType.TOOL_CALL_START,\n toolCallId,\n toolCallName,\n } as ToolCallStartEvent);\n\n }\n if (toolCallChunkEvent.include(ev)) {\n const { toolCall: toolCallOptions } = ev.data;\n for (const toolCall of toolCallOptions) {\n const { input, id } = toolCall\n const oldInput = toolCallArgsTemp[id] ?? '';\n if (typeof input === 'string') {\n subscriber.next({\n type: EventType.TOOL_CALL_ARGS,\n toolCallId: id,\n delta: input.replace(new RegExp(`^${oldInput}`), ''),\n } as ToolCallArgsEvent);\n toolCallArgsTemp[id] = input;\n }\n\n }\n }\n if (hasToolCallStartEvent && toolCallsEvent.include(ev)) {\n const { toolCalls } = ev.data;\n for (const toolCall of toolCalls) {\n const toolCallId = toolCall.toolId ?? generateId();\n subscriber.next({\n type: EventType.TOOL_CALL_END,\n toolCallId,\n } as ToolCallEndEvent);\n delete toolCallArgsTemp[toolCallId];\n }\n }\n\n // Single tool call event\n if (agentToolCallEvent.include(ev) && !hasToolCallStartEvent) {\n const call = ev.data as any;\n const toolCallId = call.toolId ?? generateId();\n const toolCallName = call.toolName;\n const args = call.toolKwargs ?? {};\n\n subscriber.next({\n type: EventType.TOOL_CALL_START,\n toolCallId,\n toolCallName,\n } as ToolCallStartEvent);\n\n subscriber.next({\n type: EventType.TOOL_CALL_ARGS,\n toolCallId,\n delta: JSON.stringify(args),\n } as ToolCallArgsEvent);\n\n subscriber.next({\n type: EventType.TOOL_CALL_END,\n toolCallId,\n } as ToolCallEndEvent);\n continue;\n }\n\n // Single tool result event\n if (agentToolCallResultEvent.include(ev)) {\n const r = ev.data as any;\n const toolCallId = r.toolId ?? generateId();\n const content = normalizeToolOutput(r.toolOutput);\n subscriber.next({\n type: EventType.TOOL_CALL_RESULT,\n toolCallId,\n content,\n messageId: activeMessageId,\n } as ToolCallResultEvent);\n continue;\n }\n\n // Agent finished\n if (stopAgentEvent.include(ev)) {\n if (activeMessageId) {\n subscriber.next({\n type: EventType.TEXT_MESSAGE_END,\n messageId: activeMessageId,\n } as TextMessageEndEvent);\n }\n\n subscriber.next({\n type: EventType.RUN_FINISHED,\n threadId,\n runId,\n } as RunFinishedEvent);\n subscriber.complete();\n return;\n }\n\n }\n\n workflow.setFrontendTools?.([]);\n\n // Fallback if stream ends without explicit stop event\n if (activeMessageId) {\n subscriber.next({\n type: EventType.TEXT_MESSAGE_END,\n messageId: activeMessageId,\n } as TextMessageEndEvent);\n }\n subscriber.next({\n type: EventType.RUN_FINISHED,\n threadId,\n runId,\n } as RunFinishedEvent);\n subscriber.complete();\n } catch (err) {\n // Let AbstractAgent error handling deal with it by throwing\n throw err;\n }\n }\n\n private getEventLabel(ev: WorkflowEvent<unknown>): string {\n let label = ev.debugLabel;\n if (!label) {\n if (agentStreamEvent.include(ev)) {\n label = 'agent_stream';\n } else if (agentToolCallEvent.include(ev)) {\n label = 'agent_tool_call';\n } else if (toolResultsEvent.include(ev)) {\n label = 'tool_results';\n } else if (agentToolCallResultEvent.include(ev)) {\n label = 'agent_tool_call_result';\n } else if (stopAgentEvent.include(ev)) {\n label = 'stop_agent';\n } else if (startAgentEvent.include(ev)) {\n label = 'start_agent';\n } else if (agentInputEvent.include(ev)) {\n label = 'agent_input';\n } else if (agentSetupEvent.include(ev)) {\n label = 'agent_setup';\n } else if (agentStepEvent.include(ev)) {\n label = 'agent_step';\n } else if (toolCallChunkEvent.include(ev)) {\n label = 'tool_call_chunk';\n } else if (toolCallStartEvent.include(ev)) {\n label = 'tool_call_start';\n } else if (toolCallsEvent.include(ev)) {\n label = 'tool_calls';\n } else if (agentOutputEvent.include(ev)) {\n label = 'agent_output';\n } else {\n label = 'unknown' + ev.toString();\n }\n }\n return label;\n }\n\n toAGUIAgent(): AbstractAgent {\n return this;\n }\n}\n\nfunction aguiToLlamaIndexMessage(message: any): any | undefined {\n switch (message.role) {\n case \"user\":\n return { role: \"user\", content: message.content };\n case \"assistant\":\n return { role: \"assistant\", content: message.content ?? \"\" };\n case \"system\":\n return { role: \"system\", content: message.content };\n case \"tool\":\n return { role: \"tool\", content: message.content, toolCallId: message.toolCallId };\n default:\n return undefined;\n }\n}\n\nfunction generateId(): string {\n return `${Date.now()}-${Math.random().toString(36).slice(2, 10)}`;\n}\n\nfunction normalizeToolOutput(output: any): string {\n if (output == null) return \"\";\n if (typeof output === \"string\") return output;\n if (typeof output === \"object\" && \"content\" in output && typeof (output as any).content === \"string\") {\n return (output as any).content as string;\n }\n try {\n return JSON.stringify(output);\n } catch {\n return String(output);\n }\n}\n\n\n\nfunction convertToolsToLlamaIndexTools(tools: RunAgentInput['tools']): BaseToolWithCall[] {\n return tools.map((t) => ({\n metadata: {\n name: t.name,\n description: t.description,\n parameters: safeDestr(t.parameters),\n },\n call: async (input: any) => {\n return `Called ${t.name} with input ${JSON.stringify(input)}`;\n }\n }));\n}\n\n\n","// Modified from https://github.com/run-llama/LlamaIndexTS/blob/fc385dc16757a73dc19ca239ebbe1e6155ed4b4d/packages/workflow/src/agent/agent-workflow.ts#L175\n\nimport { callTool } from \"llamaindex\";\nimport type { BaseToolWithCall, ChatResponseChunk, JSONObject, JSONValue, ToolCallLLMMessageOptions, ToolCallOptions } from \"llamaindex\";\nimport type { ChatMessage, MessageContent } from \"llamaindex\";\nimport { createMemory, Memory } from \"llamaindex\";\nimport { PromptTemplate } from \"llamaindex\";\nimport { tool } from \"llamaindex\";\nimport { stringifyJSONToMessageContent } from \"llamaindex\";\nimport { z, type ZodSchema } from \"zod/v4\";\nimport { consoleLogger, emptyLogger, type Logger } from \"@llamaindex/env\";\nimport {\n AgentOutput,\n agentStepEvent,\n agentStreamEvent,\n AgentWorkflowState,\n BaseWorkflowAgent,\n createStatefulMiddleware,\n createWorkflow,\n startAgentEvent,\n StatefulContext,\n stopAgentEvent,\n toolCallsEvent,\n toolResultsEvent,\n workflowEvent,\n WorkflowStream,\n type Handler,\n type Workflow,\n type WorkflowContext,\n type WorkflowEvent,\n type WorkflowEventData,\n} from \"@llamaindex/workflow\";\nimport {\n agentInputEvent,\n agentOutputEvent,\n agentSetupEvent,\n agentToolCallEvent,\n agentToolCallResultEvent,\n type AgentInput,\n type AgentSetup,\n type AgentToolCall,\n type AgentToolCallResult,\n} from \"@llamaindex/workflow\";\nimport { FunctionAgent, type FunctionAgentParams } from \"@llamaindex/workflow\";\n\nconst DEFAULT_HANDOFF_PROMPT = new PromptTemplate({\n template: `Useful for handing off to another agent.\nIf you are currently not equipped to handle the user's request, or another agent is better suited to handle the request, please hand off to the appropriate agent.\n\nCurrently available agents: \n{agent_info}\n`,\n});\n\nconst DEFAULT_HANDOFF_OUTPUT_PROMPT = new PromptTemplate({\n template: `Agent {to_agent} is now handling the request due to the following reason: {reason}.\\nPlease continue with the current request.`,\n});\n\nexport type AgentInputData = {\n userInput?: MessageContent | undefined;\n chatHistory?: Array<ChatMessage | Omit<ChatMessage, 'role'> & { role: \"tool\", toolCallId: string }> | undefined;\n};\n\n\nexport type AgentResultData<O = JSONObject> = {\n result: MessageContent;\n message: ChatMessage;\n state?: AgentWorkflowState | undefined;\n object?: O | undefined;\n};\n\n// Wrapper events for multiple tool calls and results\nexport type ToolCalls = {\n agentName: string;\n toolCalls: AgentToolCall[];\n};\n\nexport type ToolResults = {\n agentName: string;\n results: AgentToolCallResult[];\n};\n\nexport type AgentStep = {\n agentName: string;\n response: ChatMessage;\n toolCalls: AgentToolCall[];\n};\n\nexport type SingleAgentParams = FunctionAgentParams & {\n /**\n * Optional predefined memory to use for the workflow.\n * If not provided, a new empty memory will be created.\n */\n memory?: Memory;\n /**\n * Whether to log verbose output\n */\n verbose?: boolean;\n /**\n * Timeout for the workflow in seconds\n */\n timeout?: number;\n /**\n * Attach optional custom logger\n */\n logger?: Logger;\n};\n\nexport type AgentWorkflowParams = {\n /**\n * List of agents to include in the workflow.\n * Need at least one agent.\n * Can also be an array of AgentWorkflow objects, in which case the agents from each workflow will be extracted.\n */\n agents: BaseWorkflowAgent[] | AguiLlamaIndexWorkflow[];\n /**\n * The agent to start the workflow with.\n * Must be an agent in the `agents` list.\n * Can also be an AgentWorkflow object, in which case the workflow must have exactly one agent.\n */\n rootAgent: BaseWorkflowAgent | AguiLlamaIndexWorkflow;\n /**\n * Optional predefined memory to use for the workflow.\n * If not provided, a new empty memory will be created.\n */\n memory?: Memory | undefined;\n /**\n * Whether to log verbose output\n */\n verbose?: boolean;\n /**\n * Timeout for the workflow in seconds.\n */\n timeout?: number;\n /**\n * Attach optional custom logger\n */\n logger?: Logger | undefined;\n};\n\n/**\n * Create a multi-agent workflow\n * @param params - Parameters for the AgentWorkflow\n * @returns A new AgentWorkflow instance\n */\nexport const multiAgent = (params: AgentWorkflowParams): AguiLlamaIndexWorkflow => {\n return new AguiLlamaIndexWorkflow(params);\n};\n\n/**\n * Create a simple workflow with a single agent and specified tools\n * @param params - Parameters for the single agent workflow\n * @returns A new AgentWorkflow instance\n */\nexport const agent = (params: SingleAgentParams): AguiLlamaIndexWorkflow => {\n return AguiLlamaIndexWorkflow.fromTools(params);\n};\n\nexport const FRONTEND_TOOL_MARKER = '~@~@FRONTEND_TOOL_MARKER@~@~';\n\n/**\n * AgentWorkflow - An event-driven workflow for executing agents with tools\n *\n * This class provides a simple interface for creating and running agent workflows\n * based on the LlamaIndexTS workflow system. It supports single agent workflows\n * with multiple tools.\n */\nexport class AguiLlamaIndexWorkflow implements Workflow, RunnableWorkflow {\n private stateful = createStatefulMiddleware(\n (state: AgentWorkflowState) => state,\n );\n private workflow = this.stateful.withState(createWorkflow());\n private agents: Map<string, BaseWorkflowAgent> = new Map();\n private verbose: boolean;\n private rootAgentName: string;\n private initialMemory?: Memory;\n private logger: Logger;\n\n private frontendTools: string[] = [];\n\n constructor({\n agents,\n rootAgent,\n memory,\n verbose,\n logger,\n }: AgentWorkflowParams) {\n this.verbose = verbose ?? false;\n if (memory) {\n this.initialMemory = memory;\n }\n\n // Handle AgentWorkflow cases for agents\n const processedAgents: BaseWorkflowAgent[] = [];\n if (agents.length > 0) {\n if (agents[0] instanceof AguiLlamaIndexWorkflow) {\n // If agents is AgentWorkflow[], extract the BaseWorkflowAgent from each workflow\n const agentWorkflows = agents as AguiLlamaIndexWorkflow[];\n agentWorkflows.forEach((workflow) => {\n const workflowAgents = workflow.getAgents();\n processedAgents.push(...workflowAgents);\n });\n } else {\n // Otherwise, agents is already BaseWorkflowAgent[]\n processedAgents.push(...(agents as BaseWorkflowAgent[]));\n }\n }\n\n // Handle AgentWorkflow case for rootAgent and set rootAgentName\n if (rootAgent instanceof AguiLlamaIndexWorkflow) {\n // If rootAgent is an AgentWorkflow, check if it has exactly one agent\n const rootAgents = rootAgent.getAgents();\n\n if (rootAgents.length !== 1) {\n throw new Error(\n `Root agent must be a single agent, but it is a workflow with ${rootAgents.length} agents`,\n );\n }\n\n // We know rootAgents[0] exists because we checked length === 1 above\n this.rootAgentName = rootAgents[0]!.name;\n } else {\n // Otherwise, rootAgent is already a BaseWorkflowAgent\n this.rootAgentName = rootAgent.name;\n }\n\n // Validate root agent\n if (!processedAgents.some((a) => a.name === this.rootAgentName)) {\n throw new Error(`Root agent ${this.rootAgentName} not found in agents`);\n }\n\n this.addAgents(processedAgents);\n this.setupWorkflowSteps();\n\n // Use the provided logger if exists, else default to consoleLogger if verbose, else emptyLogger\n this.logger = logger ?? (this.verbose ? consoleLogger : emptyLogger);\n }\n\n handle<\n const AcceptEvents extends WorkflowEvent<unknown>[],\n Result extends ReturnType<WorkflowEvent<unknown>[\"with\"]> | void,\n >(accept: AcceptEvents, handler: Handler<AcceptEvents, Result>): void {\n this.workflow.handle(accept, handler);\n }\n\n createContext(): WorkflowContext {\n return this.workflow.createContext(this.createInitialState());\n }\n\n private addAgents(agents: BaseWorkflowAgent[]): void {\n const agentNames = new Set(agents.map((a) => a.name));\n if (agentNames.size !== agents.length) {\n throw new Error(\"The agent names must be unique!\");\n }\n\n agents.forEach((agent) => {\n this.agents.set(agent.name, agent);\n });\n\n if (agents.length > 1) {\n agents.forEach((agent) => {\n this.validateAgent(agent);\n this.addHandoffTool(agent);\n });\n }\n }\n\n private validateAgent(agent: BaseWorkflowAgent) {\n // Validate that all canHandoffTo agents exist\n const invalidAgents = agent.canHandoffTo.filter(\n (name) => !this.agents.has(name),\n );\n if (invalidAgents.length > 0) {\n throw new Error(\n `Agent \"${agent.name}\" references non-existent agents in canHandoffTo: ${invalidAgents.join(\", \")}`,\n );\n }\n }\n\n private addHandoffTool(agent: BaseWorkflowAgent) {\n if (agent.tools.some((t) => t.metadata.name === \"handOff\")) {\n return;\n }\n const toHandoffAgents: Map<string, BaseWorkflowAgent> = new Map();\n agent.canHandoffTo.forEach((name) => {\n toHandoffAgents.set(name, this.agents.get(name)!);\n });\n const handoffTool = this.createHandoffTool(toHandoffAgents);\n if (\n agent.canHandoffTo.length > 0 &&\n !agent.tools.some((t) => t.metadata.name === handoffTool.metadata.name)\n ) {\n agent.tools.push(handoffTool);\n }\n }\n\n /**\n * Adds a new agent to the workflow\n */\n addAgent(agent: BaseWorkflowAgent): this {\n this.agents.set(agent.name, agent);\n this.validateAgent(agent);\n this.addHandoffTool(agent);\n return this;\n }\n\n /**\n * Gets all agents in this workflow\n * @returns Array of agents in this workflow\n */\n getAgents(): BaseWorkflowAgent[] {\n return Array.from(this.agents.values());\n }\n\n /**\n * Create a simple workflow with a single agent and specified tools\n * @param params - Parameters for the single agent workflow\n * @returns A new AgentWorkflow instance\n */\n static fromTools(params: SingleAgentParams): AguiLlamaIndexWorkflow {\n const agent = new LlamaIndexFunctionAgent({\n name: params.name,\n description: params.description,\n tools: params.tools,\n llm: params.llm,\n systemPrompt: params.systemPrompt,\n canHandoffTo: params.canHandoffTo,\n });\n\n const workflowParams: AgentWorkflowParams = {\n agents: [agent],\n rootAgent: agent,\n verbose: params.verbose ?? false,\n timeout: params.timeout ?? 60,\n memory: params.memory,\n logger: params.logger,\n };\n\n const workflow = new AguiLlamaIndexWorkflow(workflowParams);\n\n return workflow;\n }\n\n private handleInputStep = async (\n context: StatefulContext<AgentWorkflowState>,\n event: WorkflowEventData<AgentInputData>,\n ) => {\n const { state } = context;\n const { userInput, chatHistory } = event.data;\n const memory = state.memory;\n if (chatHistory) {\n if (chatHistory.length === 1 && chatHistory[0].role === \"tool\") {\n const agent = this.agents.get(context.state.currentAgentName);\n if (!agent) {\n throw new Error(`Agent ${context.state.currentAgentName} not found`);\n }\n const toolMessage = chatHistory[0];\n agent.handleToolCallResults(context.state, [{\n // toolName: chatHistory[0].name,\n // toolKwargs: chatHistory[0].args,\n toolName: 'NOT used',\n toolKwargs: { NotUsed: 'NOT used' },\n toolId: chatHistory[0].toolCallId,\n toolOutput: {\n isError: false,\n id: chatHistory[0].toolCallId,\n result: stringifyJSONToMessageContent(toolMessage.content),\n },\n returnDirect: false,\n raw: toolMessage.content,\n }]);\n } else {\n chatHistory.forEach((message) => {\n memory.add(message);\n });\n }\n }\n if (userInput) {\n const userMessage: ChatMessage = {\n role: \"user\",\n content: userInput,\n };\n memory.add(userMessage);\n }\n // if (userInput) {\n // const userMessage: ChatMessage = {\n // role: \"user\",\n // content: userInput,\n // };\n // memory.add(userMessage);\n // } else if (chatHistory) {\n // // If no user message, use the last message from chat history as user_msg_str\n // const lastMessage = chatHistory[chatHistory.length - 1];\n // if (lastMessage?.role !== \"user\") {\n // throw new Error(\n // \"Either provide a user message or a chat history with a user message as the last message\",\n // );\n // }\n // } else {\n // throw new Error(\"No user message or chat history provided\");\n // }\n\n this.logger.log(`[Agent ${this.rootAgentName}]: Starting agent`);\n\n return agentInputEvent.with({\n input: await memory.getLLM(this.agents.get(this.rootAgentName)?.llm),\n currentAgentName: this.rootAgentName,\n });\n };\n\n private setupAgent = async (\n context: StatefulContext<AgentWorkflowState>,\n event: WorkflowEventData<AgentInput>,\n ) => {\n const currentAgentName = event.data.currentAgentName;\n const agent = this.agents.get(currentAgentName);\n if (!agent) {\n throw new Error(`Agent ${currentAgentName} not found`);\n }\n\n const llmInput = event.data.input;\n if (agent.systemPrompt) {\n llmInput.unshift({\n role: \"system\",\n content: agent.systemPrompt,\n });\n }\n\n return agentSetupEvent.with({\n input: llmInput,\n currentAgentName: currentAgentName,\n });\n };\n\n private runAgentStep = async (\n context: StatefulContext<AgentWorkflowState>,\n event: WorkflowEventData<AgentSetup>,\n ) => {\n const { sendEvent } = context;\n const agent = this.agents.get(event.data.currentAgentName);\n if (!agent) {\n throw new Error(\"No valid agent found\");\n }\n\n const output = await agent.takeStep(\n context,\n context.state,\n event.data.input,\n agent.tools,\n );\n\n sendEvent(\n agentStepEvent.with({\n agentName: agent.name,\n response: output.response,\n toolCalls: output.toolCalls,\n }),\n );\n\n sendEvent(agentOutputEvent.with(output));\n };\n\n private parseAgentOutput = async (\n context: StatefulContext<AgentWorkflowState>,\n event: WorkflowEventData<AgentStep>,\n ) => {\n const { agentName, response, toolCalls } = event.data;\n const agent = this.agents.get(agentName);\n if (!agent) {\n throw new Error(\n `parseAgentOutput failed: agent ${agentName} does not exist`,\n );\n }\n\n // If no tool calls, return final response\n if (!toolCalls || toolCalls.length === 0) {\n this.logger.log(\n `[Agent ${agentName}]: No tool calls to process, returning final response`,\n );\n\n const agentOutput = {\n response,\n toolCalls: [],\n raw: response,\n currentAgentName: agentName,\n };\n const content = await agent.finalize(context.state, agentOutput);\n\n // if responseFormat is set, use the structured tool to parse the response\n let object: JSONObject | undefined = undefined;\n if (context.state.responseFormat) {\n object = await agent.getStructuredOutput(\n context.state.responseFormat,\n content.response,\n );\n }\n\n return stopAgentEvent.with({\n message: content.response,\n result: content.response.content,\n state: context.state,\n object,\n });\n }\n\n return toolCallsEvent.with({\n agentName,\n toolCalls,\n });\n };\n\n private executeToolCalls = async (\n context: StatefulContext<AgentWorkflowState>,\n event: WorkflowEventData<ToolCalls>,\n ) => {\n const { sendEvent } = context;\n const { agentName, toolCalls } = event.data;\n const agent = this.agents.get(agentName);\n if (!agent) {\n throw new Error(`Agent ${agentName} not found`);\n }\n\n const results: AgentToolCallResult[] = [];\n\n // Execute each tool call\n for (const toolCall of toolCalls) {\n // Send single tool call event, useful for UI\n sendEvent(agentToolCallEvent.with(toolCall));\n const toolResult = {\n toolName: toolCall.toolName,\n toolKwargs: toolCall.toolKwargs,\n toolId: toolCall.toolId,\n toolOutput: {\n id: toolCall.toolId,\n result: \"\",\n isError: false,\n },\n returnDirect: false,\n raw: {},\n };\n try {\n const output = await this.callTool(toolCall);\n toolResult.raw = output;\n toolResult.toolOutput.result = stringifyJSONToMessageContent(output);\n toolResult.returnDirect = toolCall.toolName === \"handOff\";\n } catch (error) {\n toolResult.toolOutput.isError = true;\n toolResult.toolOutput.result = `Error: ${error}`;\n }\n results.push(toolResult);\n // Send single tool result event, useful for UI\n sendEvent(agentToolCallResultEvent.with(toolResult));\n }\n\n return toolResultsEvent.with({\n agentName,\n results,\n });\n };\n\n private processToolResults = async (\n context: StatefulContext<AgentWorkflowState>,\n event: WorkflowEventData<ToolResults>,\n ) => {\n const { agentName, results } = event.data;\n\n // Get agent\n const agent = this.agents.get(agentName);\n if (!agent) {\n throw new Error(`Agent ${agentName} not found`);\n }\n\n const backendResults = results.filter(r => r.toolOutput.result !== FRONTEND_TOOL_MARKER);\n const frontendResults = results.filter(r => r.toolOutput.result === FRONTEND_TOOL_MARKER);\n\n await agent.handleToolCallResults(context.state, backendResults);\n\n const directResult = results.find(\n (r: AgentToolCallResult) => r.returnDirect,\n );\n if (directResult) {\n const isHandoff = directResult.toolName === \"handOff\";\n\n const raw = directResult.raw;\n const output = typeof raw === \"string\" ? raw : JSON.stringify(raw);\n const responseMessage: ChatMessage = {\n role: \"assistant\" as const,\n content: output, // use stringified tool output for assistant message\n };\n\n const agentOutput = {\n response: responseMessage,\n toolCalls: [],\n raw,\n currentAgentName: agent.name,\n };\n\n await agent.finalize(context.state, agentOutput);\n\n if (isHandoff) {\n const nextAgentName = context.state.nextAgentName;\n\n this.logger.log(\n `[Agent ${agentName}]: Handoff to ${nextAgentName}: ${directResult.toolOutput.result}`,\n );\n\n if (nextAgentName) {\n context.state.currentAgentName = nextAgentName;\n context.state.nextAgentName = null;\n\n const messages = await context.state.memory.getLLM(\n this.agents.get(nextAgentName)?.llm,\n );\n\n this.logger.log(`[Agent ${nextAgentName}]: Starting agent`);\n\n return agentInputEvent.with({\n input: messages,\n currentAgentName: nextAgentName,\n });\n }\n }\n\n return stopAgentEvent.with({\n message: responseMessage,\n result: output,\n state: context.state,\n });\n }\n\n // Continue with another agent step\n const messages = await context.state.memory.getLLM(\n this.agents.get(agent.name)?.llm,\n );\n if (frontendResults.length > 0) {\n return stopAgentEvent.with({\n message: {\n role: 'assistant',\n content: `Frontend tool called`,\n },\n result: `Frontend tool called`,\n state: context.state,\n });\n }\n\n\n return agentInputEvent.with({\n input: messages,\n currentAgentName: agent.name,\n });\n };\n\n private setupWorkflowSteps() {\n this.workflow.handle([startAgentEvent], this.handleInputStep);\n this.workflow.handle([agentInputEvent], this.setupAgent);\n this.workflow.handle([agentSetupEvent], this.runAgentStep);\n this.workflow.handle([agentStepEvent], this.parseAgentOutput);\n this.workflow.handle([toolCallsEvent], this.overriddenExecuteToolCalls);\n this.workflow.handle([toolResultsEvent], this.processToolResults);\n }\n\n private overriddenExecuteToolCalls = async (\n context: StatefulContext<AgentWorkflowState>,\n event: WorkflowEventData<ToolCalls>,\n ) => {\n const { sendEvent } = context;\n const { agentName, toolCalls } = event.data;\n\n const frontendToolCalls = toolCalls.filter(t => this.frontendTools.includes(t.toolName));\n const backendToolCalls = toolCalls.filter(t => !this.frontendTools.includes(t.toolName));\n if (frontendToolCalls.length <= 0) {\n return this.executeToolCalls(context, event);\n };\n\n const results: AgentToolCallResult[] = [];\n\n // Execute each tool call\n for (const toolCall of backendToolCalls) {\n // Send single tool call event, useful for UI\n sendEvent(agentToolCallEvent.with(toolCall));\n const toolResult = {\n toolName: toolCall.toolName,\n toolKwargs: toolCall.toolKwargs,\n toolId: toolCall.toolId,\n toolOutput: {\n id: toolCall.toolId,\n result: \"\",\n isError: false,\n },\n returnDirect: false,\n raw: {},\n };\n try {\n const output = await this.callTool(toolCall);\n toolResult.raw = output;\n toolResult.toolOutput.result = stringifyJSONToMessageContent(output);\n toolResult.returnDirect = toolCall.toolName === \"handOff\";\n } catch (error) {\n toolResult.toolOutput.isError = true;\n toolResult.toolOutput.result = `Error: ${error}`;\n }\n results.push(toolResult);\n // Send single tool result event, useful for UI\n sendEvent(agentToolCallResultEvent.with(toolResult));\n }\n\n // Run each frontend tool call\n for (const toolCall of frontendToolCalls) {\n // Send single tool call event, useful for UI\n sendEvent(agentToolCallEvent.with(toolCall));\n continue\n const toolResult = {\n toolName: toolCall.toolName,\n toolKwargs: toolCall.toolKwargs,\n toolId: toolCall.toolId,\n toolOutput: {\n id: toolCall.toolId,\n result: FRONTEND_TOOL_MARKER,\n isError: true,\n },\n returnDirect: false,\n raw: {},\n };\n results.push(toolResult);\n\n }\n if (frontendToolCalls.length > 0) {\n if (results.length > 0) {\n const agent = this.agents.get(agentName);\n if (!agent) {\n throw new Error(`Agent ${agentName} not found`);\n }\n await agent.handleToolCallResults(context.state, results);\n await agent.finalize(context.state, {\n response: {\n role: 'assistant',\n content: `Frontend tool called`,\n },\n toolCalls: [],\n raw: `Frontend tool called`,\n currentAgentName: agentName,\n });\n }\n return stopAgentEvent.with({\n message: {\n role: 'assistant',\n content: `Frontend tool called`,\n },\n result: `Frontend tool called`,\n state: context.state,\n });\n }\n\n return toolResultsEvent.with({\n agentName,\n results,\n });\n }\n\n private async callTool(toolCall: AgentToolCall): Promise<JSONValue> {\n const tool = this.agents\n .get(toolCall.agentName)\n ?.tools.find((t) => t.metadata.name === toolCall.toolName);\n\n const toolOutput = await callTool(\n tool,\n {\n name: toolCall.toolName,\n input: toolCall.toolKwargs,\n id: toolCall.toolId,\n },\n this.logger,\n );\n\n if (toolOutput.isError) {\n throw new Error(String(toolOutput.output));\n }\n\n return toolOutput.output;\n }\n\n private createInitialState(): AgentWorkflowState {\n return {\n memory: this.initialMemory ?? createMemory(),\n scratchpad: [],\n currentAgentName: this.rootAgentName,\n agents: Array.from(this.agents.keys()),\n nextAgentName: null,\n };\n }\n\n runStream<Z extends ZodSchema>(\n userInput: MessageContent,\n params?: {\n chatHistory?: ChatMessage[];\n state?: AgentWorkflowState;\n responseFormat?: Z;\n },\n ): WorkflowStream<WorkflowEventData<AgentResultData<z.infer<Z>>>> {\n if (this.agents.size === 0) {\n throw new Error(\"No agents added to workflow\");\n }\n const state = params?.state ?? this.createInitialState();\n\n const { sendEvent, stream } = this.workflow.createContext({\n ...state,\n responseFormat: params?.responseFormat,\n });\n sendEvent(\n startAgentEvent.with({\n userInput: userInput,\n chatHistory: params?.chatHistory,\n }),\n );\n return stream.until(stopAgentEvent);\n }\n\n async run<Z extends ZodSchema>(\n userInput: MessageContent,\n params?: {\n chatHistory?: ChatMessage[];\n state?: AgentWorkflowState;\n responseFormat?: Z;\n },\n ): Promise<WorkflowEventData<AgentResultData<z.infer<Z>>>> {\n const finalEvent = (await this.runStream(userInput, params).toArray()).at(\n -1,\n );\n if (!stopAgentEvent.include(finalEvent)) {\n throw new Error(\n `Agent stopped with unexpected ${finalEvent?.toString() ?? \"unknown\"} event.`,\n );\n }\n return finalEvent;\n }\n\n createHandoffTool(agents: Map<string, BaseWorkflowAgent>) {\n const agentInfo = Array.from(agents.values()).reduce(\n (acc, a) => {\n acc[a.name] = a.description;\n return acc;\n },\n {} as Record<string, string>,\n );\n return tool({\n name: \"handOff\",\n description: DEFAULT_HANDOFF_PROMPT.format({\n agent_info: JSON.stringify(agentInfo),\n }),\n parameters: z.object({\n toAgent: z.string().describe(\"The name of the agent to hand off to\"),\n reason: z.string().describe(\"The reason for handing off to the agent\"),\n }),\n execute: (\n {\n toAgent,\n reason,\n }: {\n toAgent: string;\n reason: string;\n },\n contextProvider?: () => AgentWorkflowState,\n ) => {\n if (!contextProvider) {\n throw new Error(\n \"Handoff tool internal error: Context was not provided.\",\n );\n }\n const context = contextProvider();\n const agents = context.agents;\n if (!agents.includes(toAgent)) {\n return `Agent ${toAgent} not found. Select a valid agent to hand off to. Valid agents: ${agents.join(\n \", \",\n )}`;\n }\n context.nextAgentName = toAgent;\n return DEFAULT_HANDOFF_OUTPUT_PROMPT.format({\n to_agent: toAgent,\n reason: reason,\n });\n },\n }).bind(() => this.stateful.getContext().state);\n }\n\n setFrontendTools(tools: string[]): this {\n this.frontendTools = tools;\n return this;\n }\n\n\n}\n\n\nexport const toolCallStartEvent = workflowEvent<{ toolCall: AgentToolCall }>({ debugLabel: 'ToolCallStartEvent' })\nexport const toolCallChunkEvent = workflowEvent<ToolCallOptions>({ debugLabel: 'ToolCallChunkEvent' })\nclass LlamaIndexFunctionAgent extends FunctionAgent {\n constructor(params: FunctionAgentParams) {\n super(params);\n // const _getToolCallFromResponseChunk = this['getToolCallFromResponseChunk'].bind(this);\n // this['getToolCallFromResponseChunk'] = (chunk: any): AgentToolCall[] => {\n // const toolCall = _getToolCallFromResponseChunk(chunk);\n // if(toolCall) {\n\n // }\n // return toolCall;\n // }\n }\n\n // https://github.com/run-llama/LlamaIndexTS/blob/fc385dc16757a73dc19ca239ebbe1e6155ed4b4d/packages/workflow/src/agent/function-agent.ts#L181C3-L240C4\n async takeStep(\n ctx: WorkflowContext,\n state: AgentWorkflowState,\n llmInput: ChatMessage[],\n tools: BaseToolWithCall[],\n ): Promise<AgentOutput> {\n // Get scratchpad from context or initialize if not present\n const scratchpad: ChatMessage[] = state.scratchpad;\n const currentLLMInput = [...llmInput, ...scratchpad];\n\n const responseStream = await this.llm.chat({\n messages: currentLLMInput,\n tools,\n stream: true,\n });\n let response = \"\";\n let lastChunk: ChatResponseChunk | undefined;\n const toolCalls: Map<string, AgentToolCall> = new Map();\n for await (const chunk of responseStream) {\n response += chunk.delta;\n ctx.sendEvent(\n agentStreamEvent.with({\n delta: chunk.delta,\n response: response,\n currentAgentName: this.name,\n raw: chunk.raw,\n }),\n );\n const toolCallsInChunk: AgentToolCall[] = this['getToolCallFromResponseChunk'](chunk);\n if (toolCallsInChunk.length > 0) {\n\n // Just upsert the tool calls with the latest one if they exist\n toolCallsInChunk.forEach((toolCall) => {\n if (!toolCalls.has(toolCall.toolId)) {\n ctx.sendEvent(toolCallStartEvent.with({ toolCall }));\n }\n // @ts-expect-error\n ctx.sendEvent(toolCallChunkEvent.with({ toolCall: chunk.options?.toolCall ?? [] }));\n\n toolCalls.set(toolCall.toolId, toolCall);\n });\n\n }\n }\n\n const message: ChatMessage = {\n role: \"assistant\" as const,\n content: response,\n };\n\n if (toolCalls.size > 0) {\n message.options = {\n toolCall: Array.from(toolCalls.values()).map((toolCall) => ({\n name: toolCall.toolName,\n input: toolCall.toolKwargs,\n id: toolCall.toolId,\n })),\n };\n }\n scratchpad.push(message);\n state.scratchpad = scratchpad;\n return {\n response: message,\n toolCalls: Array.from(toolCalls.values()),\n raw: lastChunk?.raw,\n currentAgentName: this.name,\n };\n }\n\n}\n\nexport interface RunnableWorkflow<T = unknown, R extends unknown[] = unknown[]> {\n runStream(...args: R): WorkflowStream<WorkflowEventData<T>>\n setFrontendTools?: (names: string[]) => void;\n}","import { createMemory, Memory } from \"llamaindex\";\n\nexport class ConversationMemory {\n _map = new Map<string, Memory>();\n private _memoryFactory: () => Memory;\n\n constructor({ memoryFactory }: { memoryFactory?: () => Memory } = {}) {\n this._memoryFactory = memoryFactory ?? createMemory;\n }\n\n getMemory(conversationId: string): Memory {\n let memory = this._map.get(conversationId);\n if (!memory) {\n memory = this._memoryFactory();\n this._map.set(conversationId, memory);\n }\n return memory;\n }\n}"],"mappings":"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","names":["startAgentEvent","stopAgentEvent","toolCallsEvent","toolResultsEvent","agentStreamEvent","startAgentEvent","stopAgentEvent","toolCallsEvent","toolResultsEvent","agentToolCallEvent","agentToolCallResultEvent","agentInputEvent","agentSetupEvent","agentStepEvent","agentOutputEvent","messages","tool","agents","createMemory","agentStreamEvent","input","toolCallsEvent","agentToolCallEvent","agentToolCallResultEvent","stopAgentEvent","toolResultsEvent","startAgentEvent","agentInputEvent","agentSetupEvent","agentStepEvent","agentOutputEvent"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/agent.ts","../src/workflow.ts","../src/conversation-memory.ts"],"sourcesContent":["import { ChatMessage } from 'llamaindex';\n\nexport { startAgentEvent, stopAgentEvent, toolCallsEvent, toolResultsEvent } from \"@llamaindex/workflow\";\n\nexport { LlamaIndexAgent } from './agent';\nexport { AguiLlamaIndexWorkflow } from './workflow';","import { AbstractAgent, AgentConfig } from \"@cloudbase/agent-agents/abstract\";\nimport {\n BaseEvent,\n EventType,\n RunAgentInput,\n RunFinishedEvent,\n RunStartedEvent,\n TextMessageContentEvent,\n TextMessageEndEvent,\n TextMessageStartEvent,\n ToolCallArgsEvent,\n ToolCallEndEvent,\n ToolCallResultEvent,\n ToolCallStartEvent,\n} from \"@ag-ui/client\";\nimport { Observable, Subscriber } from \"rxjs\";\nimport {\n FunctionAgentParams,\n agentStreamEvent,\n startAgentEvent,\n stopAgentEvent,\n toolCallsEvent,\n toolResultsEvent,\n agentToolCallEvent,\n agentToolCallResultEvent,\n FunctionAgent,\n agentInputEvent,\n agentSetupEvent,\n agentStepEvent,\n agentOutputEvent,\n WorkflowEvent,\n AgentToolCall,\n WorkflowStream,\n WorkflowEventData,\n} from \"@llamaindex/workflow\";\nimport {\n AguiLlamaIndexWorkflow,\n RunnableWorkflow,\n toolCallChunkEvent,\n toolCallStartEvent,\n} from \"./workflow\";\nimport { BaseTool, BaseToolWithCall, createMemory, Memory } from \"llamaindex\";\nimport { ConversationMemory } from \"./conversation-memory\";\nimport { safeDestr } from \"destr\";\nimport { setTimeout } from \"node:timers/promises\";\nimport debug from \"debug\";\n\nconst log = debug(\"agkit:llamaindex-ts_events\");\ntype AgentConstructorConfig<T = unknown> = AgentConfig & {\n workflowFactory?: () => RunnableWorkflow;\n memoryFactory?: () => Memory;\n} & Pick<FunctionAgentParams, \"llm\" | \"tools\" | \"systemPrompt\" | \"name\">;\n\nexport class LlamaIndexAgent<T = unknown> extends AbstractAgent {\n public name: string;\n private _conversationMemory: ConversationMemory;\n\n readonly baseParams: Pick<\n FunctionAgentParams,\n \"llm\" | \"tools\" | \"systemPrompt\"\n >;\n private readonly _workflowFactory?: () => RunnableWorkflow;\n\n constructor(agentConfig: AgentConstructorConfig<T>) {\n const { workflowFactory, ...rest } =\n agentConfig as AgentConstructorConfig<T>;\n super(rest);\n const { llm, tools, systemPrompt, memoryFactory } = rest as Pick<\n FunctionAgentParams,\n \"llm\" | \"tools\" | \"systemPrompt\"\n > & { memoryFactory?: () => Memory };\n this._conversationMemory = new ConversationMemory({ memoryFactory });\n this.baseParams = { llm, tools, systemPrompt };\n this.name = agentConfig.name || \"Agent\";\n this._workflowFactory = workflowFactory;\n }\n\n run(input: RunAgentInput): Observable<BaseEvent> {\n return new Observable<BaseEvent>((subscriber) => {\n this._run(subscriber, input);\n });\n }\n\n private async _run(subscriber: Subscriber<BaseEvent>, input: RunAgentInput) {\n const { messages, runId, threadId, tools: inputTools } = input;\n\n const toolCallArgsTemp: Record<string, string> = {};\n\n subscriber.next({\n type: EventType.RUN_STARTED,\n threadId,\n runId,\n } as RunStartedEvent);\n\n const lastUserMessage = [...messages]\n .reverse()\n .find((x) => x.role === \"user\");\n const userInput = lastUserMessage?.content;\n // if (!userInput) {\n // throw new Error(\"User input is required\");\n // }\n\n // Convert AG-UI messages to LlamaIndex ChatMessage[] as chat history (excluding latest user input)\n const chatHistory = messages\n .filter((m) => m !== lastUserMessage)\n .map((m) => aguiToLlamaIndexMessage(m))\n .filter(\n (m): m is NonNullable<ReturnType<typeof aguiToLlamaIndexMessage>> =>\n Boolean(m)\n );\n\n let activeMessageId: string | undefined;\n\n try {\n const { llm, tools, systemPrompt } = this.baseParams;\n const memoryForRun = this._conversationMemory.getMemory(threadId);\n const workflow =\n typeof this._workflowFactory === \"function\"\n ? this._workflowFactory()\n : AguiLlamaIndexWorkflow.fromTools({\n memory: memoryForRun,\n llm,\n tools: [\n ...(tools ?? []),\n ...convertToolsToLlamaIndexTools(inputTools ?? []),\n ],\n systemPrompt,\n });\n workflow.setFrontendTools?.((inputTools ?? [])?.map((t) => t.name));\n const stream = workflow.runStream(userInput ?? \"\", { chatHistory });\n\n for await (const ev of stream as any) {\n log(\"event\", this.getEventLabel(ev), ev.toJSON());\n // Text streaming\n if (agentStreamEvent.include(ev)) {\n if (!activeMessageId) {\n activeMessageId = generateId();\n subscriber.next({\n type: EventType.TEXT_MESSAGE_START,\n messageId: activeMessageId,\n role: \"assistant\",\n } as TextMessageStartEvent);\n }\n\n const delta = (ev.data as any)?.delta as string | undefined;\n if (delta) {\n subscriber.next({\n type: EventType.TEXT_MESSAGE_CONTENT,\n messageId: activeMessageId,\n delta,\n } as TextMessageContentEvent);\n }\n continue;\n }\n let hasToolCallStartEvent = false;\n if (toolCallStartEvent.include(ev)) {\n hasToolCallStartEvent = true;\n const { toolCall } = ev.data;\n const toolCallId = toolCall.toolId ?? generateId();\n const toolCallName = toolCall.toolName;\n const args = toolCall.toolKwargs ?? {};\n subscriber.next({\n type: EventType.TOOL_CALL_START,\n toolCallId,\n toolCallName,\n } as ToolCallStartEvent);\n }\n if (toolCallChunkEvent.include(ev)) {\n const { toolCall: toolCallOptions } = ev.data;\n for (const toolCall of toolCallOptions) {\n const { input, id } = toolCall;\n const oldInput = toolCallArgsTemp[id] ?? \"\";\n if (typeof input === \"string\") {\n subscriber.next({\n type: EventType.TOOL_CALL_ARGS,\n toolCallId: id,\n delta: input.replace(new RegExp(`^${oldInput}`), \"\"),\n } as ToolCallArgsEvent);\n toolCallArgsTemp[id] = input;\n }\n }\n }\n if (hasToolCallStartEvent && toolCallsEvent.include(ev)) {\n const { toolCalls } = ev.data;\n for (const toolCall of toolCalls) {\n const toolCallId = toolCall.toolId ?? generateId();\n subscriber.next({\n type: EventType.TOOL_CALL_END,\n toolCallId,\n } as ToolCallEndEvent);\n delete toolCallArgsTemp[toolCallId];\n }\n }\n\n // Single tool call event\n if (agentToolCallEvent.include(ev) && !hasToolCallStartEvent) {\n const call = ev.data as any;\n const toolCallId = call.toolId ?? generateId();\n const toolCallName = call.toolName;\n const args = call.toolKwargs ?? {};\n\n subscriber.next({\n type: EventType.TOOL_CALL_START,\n toolCallId,\n toolCallName,\n } as ToolCallStartEvent);\n\n subscriber.next({\n type: EventType.TOOL_CALL_ARGS,\n toolCallId,\n delta: JSON.stringify(args),\n } as ToolCallArgsEvent);\n\n subscriber.next({\n type: EventType.TOOL_CALL_END,\n toolCallId,\n } as ToolCallEndEvent);\n continue;\n }\n\n // Single tool result event\n if (agentToolCallResultEvent.include(ev)) {\n const r = ev.data as any;\n const toolCallId = r.toolId ?? generateId();\n const content = normalizeToolOutput(r.toolOutput);\n subscriber.next({\n type: EventType.TOOL_CALL_RESULT,\n toolCallId,\n content,\n messageId: activeMessageId,\n } as ToolCallResultEvent);\n continue;\n }\n\n // Agent finished\n if (stopAgentEvent.include(ev)) {\n if (activeMessageId) {\n subscriber.next({\n type: EventType.TEXT_MESSAGE_END,\n messageId: activeMessageId,\n } as TextMessageEndEvent);\n }\n\n subscriber.next({\n type: EventType.RUN_FINISHED,\n threadId,\n runId,\n } as RunFinishedEvent);\n subscriber.complete();\n return;\n }\n }\n\n workflow.setFrontendTools?.([]);\n\n // Fallback if stream ends without explicit stop event\n if (activeMessageId) {\n subscriber.next({\n type: EventType.TEXT_MESSAGE_END,\n messageId: activeMessageId,\n } as TextMessageEndEvent);\n }\n subscriber.next({\n type: EventType.RUN_FINISHED,\n threadId,\n runId,\n } as RunFinishedEvent);\n subscriber.complete();\n } catch (err) {\n // Let AbstractAgent error handling deal with it by throwing\n throw err;\n }\n }\n\n private getEventLabel(ev: WorkflowEvent<unknown>): string {\n let label = ev.debugLabel;\n if (!label) {\n if (agentStreamEvent.include(ev)) {\n label = \"agent_stream\";\n } else if (agentToolCallEvent.include(ev)) {\n label = \"agent_tool_call\";\n } else if (toolResultsEvent.include(ev)) {\n label = \"tool_results\";\n } else if (agentToolCallResultEvent.include(ev)) {\n label = \"agent_tool_call_result\";\n } else if (stopAgentEvent.include(ev)) {\n label = \"stop_agent\";\n } else if (startAgentEvent.include(ev)) {\n label = \"start_agent\";\n } else if (agentInputEvent.include(ev)) {\n label = \"agent_input\";\n } else if (agentSetupEvent.include(ev)) {\n label = \"agent_setup\";\n } else if (agentStepEvent.include(ev)) {\n label = \"agent_step\";\n } else if (toolCallChunkEvent.include(ev)) {\n label = \"tool_call_chunk\";\n } else if (toolCallStartEvent.include(ev)) {\n label = \"tool_call_start\";\n } else if (toolCallsEvent.include(ev)) {\n label = \"tool_calls\";\n } else if (agentOutputEvent.include(ev)) {\n label = \"agent_output\";\n } else {\n label = \"unknown\" + ev.toString();\n }\n }\n return label;\n }\n\n toAGUIAgent(): AbstractAgent {\n return this;\n }\n}\n\nfunction aguiToLlamaIndexMessage(message: any): any | undefined {\n switch (message.role) {\n case \"user\":\n return { role: \"user\", content: message.content };\n case \"assistant\":\n return { role: \"assistant\", content: message.content ?? \"\" };\n case \"system\":\n return { role: \"system\", content: message.content };\n case \"tool\":\n return {\n role: \"tool\",\n content: message.content,\n toolCallId: message.toolCallId,\n };\n default:\n return undefined;\n }\n}\n\nfunction generateId(): string {\n return `${Date.now()}-${Math.random().toString(36).slice(2, 10)}`;\n}\n\nfunction normalizeToolOutput(output: any): string {\n if (output == null) return \"\";\n if (typeof output === \"string\") return output;\n if (\n typeof output === \"object\" &&\n \"content\" in output &&\n typeof (output as any).content === \"string\"\n ) {\n return (output as any).content as string;\n }\n try {\n return JSON.stringify(output);\n } catch {\n return String(output);\n }\n}\n\nfunction convertToolsToLlamaIndexTools(\n tools: RunAgentInput[\"tools\"]\n): BaseToolWithCall[] {\n return tools.map((t) => ({\n metadata: {\n name: t.name,\n description: t.description,\n parameters: safeDestr(t.parameters),\n },\n call: async (input: any) => {\n return `Called ${t.name} with input ${JSON.stringify(input)}`;\n },\n }));\n}\n","// Modified from https://github.com/run-llama/LlamaIndexTS/blob/fc385dc16757a73dc19ca239ebbe1e6155ed4b4d/packages/workflow/src/agent/agent-workflow.ts#L175\n\nimport { callTool } from \"llamaindex\";\nimport type { BaseToolWithCall, ChatResponseChunk, JSONObject, JSONValue, ToolCallLLMMessageOptions, ToolCallOptions } from \"llamaindex\";\nimport type { ChatMessage, MessageContent } from \"llamaindex\";\nimport { createMemory, Memory } from \"llamaindex\";\nimport { PromptTemplate } from \"llamaindex\";\nimport { tool } from \"llamaindex\";\nimport { stringifyJSONToMessageContent } from \"llamaindex\";\nimport { z, type ZodSchema } from \"zod/v4\";\nimport { consoleLogger, emptyLogger, type Logger } from \"@llamaindex/env\";\nimport {\n AgentOutput,\n agentStepEvent,\n agentStreamEvent,\n AgentWorkflowState,\n BaseWorkflowAgent,\n createStatefulMiddleware,\n createWorkflow,\n startAgentEvent,\n StatefulContext,\n stopAgentEvent,\n toolCallsEvent,\n toolResultsEvent,\n workflowEvent,\n WorkflowStream,\n type Handler,\n type Workflow,\n type WorkflowContext,\n type WorkflowEvent,\n type WorkflowEventData,\n} from \"@llamaindex/workflow\";\nimport {\n agentInputEvent,\n agentOutputEvent,\n agentSetupEvent,\n agentToolCallEvent,\n agentToolCallResultEvent,\n type AgentInput,\n type AgentSetup,\n type AgentToolCall,\n type AgentToolCallResult,\n} from \"@llamaindex/workflow\";\nimport { FunctionAgent, type FunctionAgentParams } from \"@llamaindex/workflow\";\n\nconst DEFAULT_HANDOFF_PROMPT = new PromptTemplate({\n template: `Useful for handing off to another agent.\nIf you are currently not equipped to handle the user's request, or another agent is better suited to handle the request, please hand off to the appropriate agent.\n\nCurrently available agents: \n{agent_info}\n`,\n});\n\nconst DEFAULT_HANDOFF_OUTPUT_PROMPT = new PromptTemplate({\n template: `Agent {to_agent} is now handling the request due to the following reason: {reason}.\\nPlease continue with the current request.`,\n});\n\nexport type AgentInputData = {\n userInput?: MessageContent | undefined;\n chatHistory?: Array<ChatMessage | Omit<ChatMessage, 'role'> & { role: \"tool\", toolCallId: string }> | undefined;\n};\n\n\nexport type AgentResultData<O = JSONObject> = {\n result: MessageContent;\n message: ChatMessage;\n state?: AgentWorkflowState | undefined;\n object?: O | undefined;\n};\n\n// Wrapper events for multiple tool calls and results\nexport type ToolCalls = {\n agentName: string;\n toolCalls: AgentToolCall[];\n};\n\nexport type ToolResults = {\n agentName: string;\n results: AgentToolCallResult[];\n};\n\nexport type AgentStep = {\n agentName: string;\n response: ChatMessage;\n toolCalls: AgentToolCall[];\n};\n\nexport type SingleAgentParams = FunctionAgentParams & {\n /**\n * Optional predefined memory to use for the workflow.\n * If not provided, a new empty memory will be created.\n */\n memory?: Memory;\n /**\n * Whether to log verbose output\n */\n verbose?: boolean;\n /**\n * Timeout for the workflow in seconds\n */\n timeout?: number;\n /**\n * Attach optional custom logger\n */\n logger?: Logger;\n};\n\nexport type AgentWorkflowParams = {\n /**\n * List of agents to include in the workflow.\n * Need at least one agent.\n * Can also be an array of AgentWorkflow objects, in which case the agents from each workflow will be extracted.\n */\n agents: BaseWorkflowAgent[] | AguiLlamaIndexWorkflow[];\n /**\n * The agent to start the workflow with.\n * Must be an agent in the `agents` list.\n * Can also be an AgentWorkflow object, in which case the workflow must have exactly one agent.\n */\n rootAgent: BaseWorkflowAgent | AguiLlamaIndexWorkflow;\n /**\n * Optional predefined memory to use for the workflow.\n * If not provided, a new empty memory will be created.\n */\n memory?: Memory | undefined;\n /**\n * Whether to log verbose output\n */\n verbose?: boolean;\n /**\n * Timeout for the workflow in seconds.\n */\n timeout?: number;\n /**\n * Attach optional custom logger\n */\n logger?: Logger | undefined;\n};\n\n/**\n * Create a multi-agent workflow\n * @param params - Parameters for the AgentWorkflow\n * @returns A new AgentWorkflow instance\n */\nexport const multiAgent = (params: AgentWorkflowParams): AguiLlamaIndexWorkflow => {\n return new AguiLlamaIndexWorkflow(params);\n};\n\n/**\n * Create a simple workflow with a single agent and specified tools\n * @param params - Parameters for the single agent workflow\n * @returns A new AgentWorkflow instance\n */\nexport const agent = (params: SingleAgentParams): AguiLlamaIndexWorkflow => {\n return AguiLlamaIndexWorkflow.fromTools(params);\n};\n\nexport const FRONTEND_TOOL_MARKER = '~@~@FRONTEND_TOOL_MARKER@~@~';\n\n/**\n * AgentWorkflow - An event-driven workflow for executing agents with tools\n *\n * This class provides a simple interface for creating and running agent workflows\n * based on the LlamaIndexTS workflow system. It supports single agent workflows\n * with multiple tools.\n */\nexport class AguiLlamaIndexWorkflow implements Workflow, RunnableWorkflow {\n private stateful = createStatefulMiddleware(\n (state: AgentWorkflowState) => state,\n );\n private workflow = this.stateful.withState(createWorkflow());\n private agents: Map<string, BaseWorkflowAgent> = new Map();\n private verbose: boolean;\n private rootAgentName: string;\n private initialMemory?: Memory;\n private logger: Logger;\n\n private frontendTools: string[] = [];\n\n constructor({\n agents,\n rootAgent,\n memory,\n verbose,\n logger,\n }: AgentWorkflowParams) {\n this.verbose = verbose ?? false;\n if (memory) {\n this.initialMemory = memory;\n }\n\n // Handle AgentWorkflow cases for agents\n const processedAgents: BaseWorkflowAgent[] = [];\n if (agents.length > 0) {\n if (agents[0] instanceof AguiLlamaIndexWorkflow) {\n // If agents is AgentWorkflow[], extract the BaseWorkflowAgent from each workflow\n const agentWorkflows = agents as AguiLlamaIndexWorkflow[];\n agentWorkflows.forEach((workflow) => {\n const workflowAgents = workflow.getAgents();\n processedAgents.push(...workflowAgents);\n });\n } else {\n // Otherwise, agents is already BaseWorkflowAgent[]\n processedAgents.push(...(agents as BaseWorkflowAgent[]));\n }\n }\n\n // Handle AgentWorkflow case for rootAgent and set rootAgentName\n if (rootAgent instanceof AguiLlamaIndexWorkflow) {\n // If rootAgent is an AgentWorkflow, check if it has exactly one agent\n const rootAgents = rootAgent.getAgents();\n\n if (rootAgents.length !== 1) {\n throw new Error(\n `Root agent must be a single agent, but it is a workflow with ${rootAgents.length} agents`,\n );\n }\n\n // We know rootAgents[0] exists because we checked length === 1 above\n this.rootAgentName = rootAgents[0]!.name;\n } else {\n // Otherwise, rootAgent is already a BaseWorkflowAgent\n this.rootAgentName = rootAgent.name;\n }\n\n // Validate root agent\n if (!processedAgents.some((a) => a.name === this.rootAgentName)) {\n throw new Error(`Root agent ${this.rootAgentName} not found in agents`);\n }\n\n this.addAgents(processedAgents);\n this.setupWorkflowSteps();\n\n // Use the provided logger if exists, else default to consoleLogger if verbose, else emptyLogger\n this.logger = logger ?? (this.verbose ? consoleLogger : emptyLogger);\n }\n\n handle<\n const AcceptEvents extends WorkflowEvent<unknown>[],\n Result extends ReturnType<WorkflowEvent<unknown>[\"with\"]> | void,\n >(accept: AcceptEvents, handler: Handler<AcceptEvents, Result>): void {\n this.workflow.handle(accept, handler);\n }\n\n createContext(): WorkflowContext {\n return this.workflow.createContext(this.createInitialState());\n }\n\n private addAgents(agents: BaseWorkflowAgent[]): void {\n const agentNames = new Set(agents.map((a) => a.name));\n if (agentNames.size !== agents.length) {\n throw new Error(\"The agent names must be unique!\");\n }\n\n agents.forEach((agent) => {\n this.agents.set(agent.name, agent);\n });\n\n if (agents.length > 1) {\n agents.forEach((agent) => {\n this.validateAgent(agent);\n this.addHandoffTool(agent);\n });\n }\n }\n\n private validateAgent(agent: BaseWorkflowAgent) {\n // Validate that all canHandoffTo agents exist\n const invalidAgents = agent.canHandoffTo.filter(\n (name) => !this.agents.has(name),\n );\n if (invalidAgents.length > 0) {\n throw new Error(\n `Agent \"${agent.name}\" references non-existent agents in canHandoffTo: ${invalidAgents.join(\", \")}`,\n );\n }\n }\n\n private addHandoffTool(agent: BaseWorkflowAgent) {\n if (agent.tools.some((t) => t.metadata.name === \"handOff\")) {\n return;\n }\n const toHandoffAgents: Map<string, BaseWorkflowAgent> = new Map();\n agent.canHandoffTo.forEach((name) => {\n toHandoffAgents.set(name, this.agents.get(name)!);\n });\n const handoffTool = this.createHandoffTool(toHandoffAgents);\n if (\n agent.canHandoffTo.length > 0 &&\n !agent.tools.some((t) => t.metadata.name === handoffTool.metadata.name)\n ) {\n agent.tools.push(handoffTool);\n }\n }\n\n /**\n * Adds a new agent to the workflow\n */\n addAgent(agent: BaseWorkflowAgent): this {\n this.agents.set(agent.name, agent);\n this.validateAgent(agent);\n this.addHandoffTool(agent);\n return this;\n }\n\n /**\n * Gets all agents in this workflow\n * @returns Array of agents in this workflow\n */\n getAgents(): BaseWorkflowAgent[] {\n return Array.from(this.agents.values());\n }\n\n /**\n * Create a simple workflow with a single agent and specified tools\n * @param params - Parameters for the single agent workflow\n * @returns A new AgentWorkflow instance\n */\n static fromTools(params: SingleAgentParams): AguiLlamaIndexWorkflow {\n const agent = new LlamaIndexFunctionAgent({\n name: params.name,\n description: params.description,\n tools: params.tools,\n llm: params.llm,\n systemPrompt: params.systemPrompt,\n canHandoffTo: params.canHandoffTo,\n });\n\n const workflowParams: AgentWorkflowParams = {\n agents: [agent],\n rootAgent: agent,\n verbose: params.verbose ?? false,\n timeout: params.timeout ?? 60,\n memory: params.memory,\n logger: params.logger,\n };\n\n const workflow = new AguiLlamaIndexWorkflow(workflowParams);\n\n return workflow;\n }\n\n private handleInputStep = async (\n context: StatefulContext<AgentWorkflowState>,\n event: WorkflowEventData<AgentInputData>,\n ) => {\n const { state } = context;\n const { userInput, chatHistory } = event.data;\n const memory = state.memory;\n if (chatHistory) {\n if (chatHistory.length === 1 && chatHistory[0].role === \"tool\") {\n const agent = this.agents.get(context.state.currentAgentName);\n if (!agent) {\n throw new Error(`Agent ${context.state.currentAgentName} not found`);\n }\n const toolMessage = chatHistory[0];\n agent.handleToolCallResults(context.state, [{\n // toolName: chatHistory[0].name,\n // toolKwargs: chatHistory[0].args,\n toolName: 'NOT used',\n toolKwargs: { NotUsed: 'NOT used' },\n toolId: chatHistory[0].toolCallId,\n toolOutput: {\n isError: false,\n id: chatHistory[0].toolCallId,\n result: stringifyJSONToMessageContent(toolMessage.content),\n },\n returnDirect: false,\n raw: toolMessage.content,\n }]);\n } else {\n chatHistory.forEach((message) => {\n memory.add(message);\n });\n }\n }\n if (userInput) {\n const userMessage: ChatMessage = {\n role: \"user\",\n content: userInput,\n };\n memory.add(userMessage);\n }\n // if (userInput) {\n // const userMessage: ChatMessage = {\n // role: \"user\",\n // content: userInput,\n // };\n // memory.add(userMessage);\n // } else if (chatHistory) {\n // // If no user message, use the last message from chat history as user_msg_str\n // const lastMessage = chatHistory[chatHistory.length - 1];\n // if (lastMessage?.role !== \"user\") {\n // throw new Error(\n // \"Either provide a user message or a chat history with a user message as the last message\",\n // );\n // }\n // } else {\n // throw new Error(\"No user message or chat history provided\");\n // }\n\n this.logger.log(`[Agent ${this.rootAgentName}]: Starting agent`);\n\n return agentInputEvent.with({\n input: await memory.getLLM(this.agents.get(this.rootAgentName)?.llm),\n currentAgentName: this.rootAgentName,\n });\n };\n\n private setupAgent = async (\n context: StatefulContext<AgentWorkflowState>,\n event: WorkflowEventData<AgentInput>,\n ) => {\n const currentAgentName = event.data.currentAgentName;\n const agent = this.agents.get(currentAgentName);\n if (!agent) {\n throw new Error(`Agent ${currentAgentName} not found`);\n }\n\n const llmInput = event.data.input;\n if (agent.systemPrompt) {\n llmInput.unshift({\n role: \"system\",\n content: agent.systemPrompt,\n });\n }\n\n return agentSetupEvent.with({\n input: llmInput,\n currentAgentName: currentAgentName,\n });\n };\n\n private runAgentStep = async (\n context: StatefulContext<AgentWorkflowState>,\n event: WorkflowEventData<AgentSetup>,\n ) => {\n const { sendEvent } = context;\n const agent = this.agents.get(event.data.currentAgentName);\n if (!agent) {\n throw new Error(\"No valid agent found\");\n }\n\n const output = await agent.takeStep(\n context,\n context.state,\n event.data.input,\n agent.tools,\n );\n\n sendEvent(\n agentStepEvent.with({\n agentName: agent.name,\n response: output.response,\n toolCalls: output.toolCalls,\n }),\n );\n\n sendEvent(agentOutputEvent.with(output));\n };\n\n private parseAgentOutput = async (\n context: StatefulContext<AgentWorkflowState>,\n event: WorkflowEventData<AgentStep>,\n ) => {\n const { agentName, response, toolCalls } = event.data;\n const agent = this.agents.get(agentName);\n if (!agent) {\n throw new Error(\n `parseAgentOutput failed: agent ${agentName} does not exist`,\n );\n }\n\n // If no tool calls, return final response\n if (!toolCalls || toolCalls.length === 0) {\n this.logger.log(\n `[Agent ${agentName}]: No tool calls to process, returning final response`,\n );\n\n const agentOutput = {\n response,\n toolCalls: [],\n raw: response,\n currentAgentName: agentName,\n };\n const content = await agent.finalize(context.state, agentOutput);\n\n // if responseFormat is set, use the structured tool to parse the response\n let object: JSONObject | undefined = undefined;\n if (context.state.responseFormat) {\n object = await agent.getStructuredOutput(\n context.state.responseFormat,\n content.response,\n );\n }\n\n return stopAgentEvent.with({\n message: content.response,\n result: content.response.content,\n state: context.state,\n object,\n });\n }\n\n return toolCallsEvent.with({\n agentName,\n toolCalls,\n });\n };\n\n private executeToolCalls = async (\n context: StatefulContext<AgentWorkflowState>,\n event: WorkflowEventData<ToolCalls>,\n ) => {\n const { sendEvent } = context;\n const { agentName, toolCalls } = event.data;\n const agent = this.agents.get(agentName);\n if (!agent) {\n throw new Error(`Agent ${agentName} not found`);\n }\n\n const results: AgentToolCallResult[] = [];\n\n // Execute each tool call\n for (const toolCall of toolCalls) {\n // Send single tool call event, useful for UI\n sendEvent(agentToolCallEvent.with(toolCall));\n const toolResult = {\n toolName: toolCall.toolName,\n toolKwargs: toolCall.toolKwargs,\n toolId: toolCall.toolId,\n toolOutput: {\n id: toolCall.toolId,\n result: \"\",\n isError: false,\n },\n returnDirect: false,\n raw: {},\n };\n try {\n const output = await this.callTool(toolCall);\n toolResult.raw = output;\n toolResult.toolOutput.result = stringifyJSONToMessageContent(output);\n toolResult.returnDirect = toolCall.toolName === \"handOff\";\n } catch (error) {\n toolResult.toolOutput.isError = true;\n toolResult.toolOutput.result = `Error: ${error}`;\n }\n results.push(toolResult);\n // Send single tool result event, useful for UI\n sendEvent(agentToolCallResultEvent.with(toolResult));\n }\n\n return toolResultsEvent.with({\n agentName,\n results,\n });\n };\n\n private processToolResults = async (\n context: StatefulContext<AgentWorkflowState>,\n event: WorkflowEventData<ToolResults>,\n ) => {\n const { agentName, results } = event.data;\n\n // Get agent\n const agent = this.agents.get(agentName);\n if (!agent) {\n throw new Error(`Agent ${agentName} not found`);\n }\n\n const backendResults = results.filter(r => r.toolOutput.result !== FRONTEND_TOOL_MARKER);\n const frontendResults = results.filter(r => r.toolOutput.result === FRONTEND_TOOL_MARKER);\n\n await agent.handleToolCallResults(context.state, backendResults);\n\n const directResult = results.find(\n (r: AgentToolCallResult) => r.returnDirect,\n );\n if (directResult) {\n const isHandoff = directResult.toolName === \"handOff\";\n\n const raw = directResult.raw;\n const output = typeof raw === \"string\" ? raw : JSON.stringify(raw);\n const responseMessage: ChatMessage = {\n role: \"assistant\" as const,\n content: output, // use stringified tool output for assistant message\n };\n\n const agentOutput = {\n response: responseMessage,\n toolCalls: [],\n raw,\n currentAgentName: agent.name,\n };\n\n await agent.finalize(context.state, agentOutput);\n\n if (isHandoff) {\n const nextAgentName = context.state.nextAgentName;\n\n this.logger.log(\n `[Agent ${agentName}]: Handoff to ${nextAgentName}: ${directResult.toolOutput.result}`,\n );\n\n if (nextAgentName) {\n context.state.currentAgentName = nextAgentName;\n context.state.nextAgentName = null;\n\n const messages = await context.state.memory.getLLM(\n this.agents.get(nextAgentName)?.llm,\n );\n\n this.logger.log(`[Agent ${nextAgentName}]: Starting agent`);\n\n return agentInputEvent.with({\n input: messages,\n currentAgentName: nextAgentName,\n });\n }\n }\n\n return stopAgentEvent.with({\n message: responseMessage,\n result: output,\n state: context.state,\n });\n }\n\n // Continue with another agent step\n const messages = await context.state.memory.getLLM(\n this.agents.get(agent.name)?.llm,\n );\n if (frontendResults.length > 0) {\n return stopAgentEvent.with({\n message: {\n role: 'assistant',\n content: `Frontend tool called`,\n },\n result: `Frontend tool called`,\n state: context.state,\n });\n }\n\n\n return agentInputEvent.with({\n input: messages,\n currentAgentName: agent.name,\n });\n };\n\n private setupWorkflowSteps() {\n this.workflow.handle([startAgentEvent], this.handleInputStep);\n this.workflow.handle([agentInputEvent], this.setupAgent);\n this.workflow.handle([agentSetupEvent], this.runAgentStep);\n this.workflow.handle([agentStepEvent], this.parseAgentOutput);\n this.workflow.handle([toolCallsEvent], this.overriddenExecuteToolCalls);\n this.workflow.handle([toolResultsEvent], this.processToolResults);\n }\n\n private overriddenExecuteToolCalls = async (\n context: StatefulContext<AgentWorkflowState>,\n event: WorkflowEventData<ToolCalls>,\n ) => {\n const { sendEvent } = context;\n const { agentName, toolCalls } = event.data;\n\n const frontendToolCalls = toolCalls.filter(t => this.frontendTools.includes(t.toolName));\n const backendToolCalls = toolCalls.filter(t => !this.frontendTools.includes(t.toolName));\n if (frontendToolCalls.length <= 0) {\n return this.executeToolCalls(context, event);\n };\n\n const results: AgentToolCallResult[] = [];\n\n // Execute each tool call\n for (const toolCall of backendToolCalls) {\n // Send single tool call event, useful for UI\n sendEvent(agentToolCallEvent.with(toolCall));\n const toolResult = {\n toolName: toolCall.toolName,\n toolKwargs: toolCall.toolKwargs,\n toolId: toolCall.toolId,\n toolOutput: {\n id: toolCall.toolId,\n result: \"\",\n isError: false,\n },\n returnDirect: false,\n raw: {},\n };\n try {\n const output = await this.callTool(toolCall);\n toolResult.raw = output;\n toolResult.toolOutput.result = stringifyJSONToMessageContent(output);\n toolResult.returnDirect = toolCall.toolName === \"handOff\";\n } catch (error) {\n toolResult.toolOutput.isError = true;\n toolResult.toolOutput.result = `Error: ${error}`;\n }\n results.push(toolResult);\n // Send single tool result event, useful for UI\n sendEvent(agentToolCallResultEvent.with(toolResult));\n }\n\n // Run each frontend tool call\n for (const toolCall of frontendToolCalls) {\n // Send single tool call event, useful for UI\n sendEvent(agentToolCallEvent.with(toolCall));\n continue\n const toolResult = {\n toolName: toolCall.toolName,\n toolKwargs: toolCall.toolKwargs,\n toolId: toolCall.toolId,\n toolOutput: {\n id: toolCall.toolId,\n result: FRONTEND_TOOL_MARKER,\n isError: true,\n },\n returnDirect: false,\n raw: {},\n };\n results.push(toolResult);\n\n }\n if (frontendToolCalls.length > 0) {\n if (results.length > 0) {\n const agent = this.agents.get(agentName);\n if (!agent) {\n throw new Error(`Agent ${agentName} not found`);\n }\n await agent.handleToolCallResults(context.state, results);\n await agent.finalize(context.state, {\n response: {\n role: 'assistant',\n content: `Frontend tool called`,\n },\n toolCalls: [],\n raw: `Frontend tool called`,\n currentAgentName: agentName,\n });\n }\n return stopAgentEvent.with({\n message: {\n role: 'assistant',\n content: `Frontend tool called`,\n },\n result: `Frontend tool called`,\n state: context.state,\n });\n }\n\n return toolResultsEvent.with({\n agentName,\n results,\n });\n }\n\n private async callTool(toolCall: AgentToolCall): Promise<JSONValue> {\n const tool = this.agents\n .get(toolCall.agentName)\n ?.tools.find((t) => t.metadata.name === toolCall.toolName);\n\n const toolOutput = await callTool(\n tool,\n {\n name: toolCall.toolName,\n input: toolCall.toolKwargs,\n id: toolCall.toolId,\n },\n this.logger,\n );\n\n if (toolOutput.isError) {\n throw new Error(String(toolOutput.output));\n }\n\n return toolOutput.output;\n }\n\n private createInitialState(): AgentWorkflowState {\n return {\n memory: this.initialMemory ?? createMemory(),\n scratchpad: [],\n currentAgentName: this.rootAgentName,\n agents: Array.from(this.agents.keys()),\n nextAgentName: null,\n };\n }\n\n runStream<Z extends ZodSchema>(\n userInput: MessageContent,\n params?: {\n chatHistory?: ChatMessage[];\n state?: AgentWorkflowState;\n responseFormat?: Z;\n },\n ): WorkflowStream<WorkflowEventData<AgentResultData<z.infer<Z>>>> {\n if (this.agents.size === 0) {\n throw new Error(\"No agents added to workflow\");\n }\n const state = params?.state ?? this.createInitialState();\n\n const { sendEvent, stream } = this.workflow.createContext({\n ...state,\n responseFormat: params?.responseFormat,\n });\n sendEvent(\n startAgentEvent.with({\n userInput: userInput,\n chatHistory: params?.chatHistory,\n }),\n );\n return stream.until(stopAgentEvent);\n }\n\n async run<Z extends ZodSchema>(\n userInput: MessageContent,\n params?: {\n chatHistory?: ChatMessage[];\n state?: AgentWorkflowState;\n responseFormat?: Z;\n },\n ): Promise<WorkflowEventData<AgentResultData<z.infer<Z>>>> {\n const finalEvent = (await this.runStream(userInput, params).toArray()).at(\n -1,\n );\n if (!stopAgentEvent.include(finalEvent)) {\n throw new Error(\n `Agent stopped with unexpected ${finalEvent?.toString() ?? \"unknown\"} event.`,\n );\n }\n return finalEvent;\n }\n\n createHandoffTool(agents: Map<string, BaseWorkflowAgent>) {\n const agentInfo = Array.from(agents.values()).reduce(\n (acc, a) => {\n acc[a.name] = a.description;\n return acc;\n },\n {} as Record<string, string>,\n );\n return tool({\n name: \"handOff\",\n description: DEFAULT_HANDOFF_PROMPT.format({\n agent_info: JSON.stringify(agentInfo),\n }),\n parameters: z.object({\n toAgent: z.string().describe(\"The name of the agent to hand off to\"),\n reason: z.string().describe(\"The reason for handing off to the agent\"),\n }),\n execute: (\n {\n toAgent,\n reason,\n }: {\n toAgent: string;\n reason: string;\n },\n contextProvider?: () => AgentWorkflowState,\n ) => {\n if (!contextProvider) {\n throw new Error(\n \"Handoff tool internal error: Context was not provided.\",\n );\n }\n const context = contextProvider();\n const agents = context.agents;\n if (!agents.includes(toAgent)) {\n return `Agent ${toAgent} not found. Select a valid agent to hand off to. Valid agents: ${agents.join(\n \", \",\n )}`;\n }\n context.nextAgentName = toAgent;\n return DEFAULT_HANDOFF_OUTPUT_PROMPT.format({\n to_agent: toAgent,\n reason: reason,\n });\n },\n }).bind(() => this.stateful.getContext().state);\n }\n\n setFrontendTools(tools: string[]): this {\n this.frontendTools = tools;\n return this;\n }\n\n\n}\n\n\nexport const toolCallStartEvent = workflowEvent<{ toolCall: AgentToolCall }>({ debugLabel: 'ToolCallStartEvent' })\nexport const toolCallChunkEvent = workflowEvent<ToolCallOptions>({ debugLabel: 'ToolCallChunkEvent' })\nclass LlamaIndexFunctionAgent extends FunctionAgent {\n constructor(params: FunctionAgentParams) {\n super(params);\n // const _getToolCallFromResponseChunk = this['getToolCallFromResponseChunk'].bind(this);\n // this['getToolCallFromResponseChunk'] = (chunk: any): AgentToolCall[] => {\n // const toolCall = _getToolCallFromResponseChunk(chunk);\n // if(toolCall) {\n\n // }\n // return toolCall;\n // }\n }\n\n // https://github.com/run-llama/LlamaIndexTS/blob/fc385dc16757a73dc19ca239ebbe1e6155ed4b4d/packages/workflow/src/agent/function-agent.ts#L181C3-L240C4\n async takeStep(\n ctx: WorkflowContext,\n state: AgentWorkflowState,\n llmInput: ChatMessage[],\n tools: BaseToolWithCall[],\n ): Promise<AgentOutput> {\n // Get scratchpad from context or initialize if not present\n const scratchpad: ChatMessage[] = state.scratchpad;\n const currentLLMInput = [...llmInput, ...scratchpad];\n\n const responseStream = await this.llm.chat({\n messages: currentLLMInput,\n tools,\n stream: true,\n });\n let response = \"\";\n let lastChunk: ChatResponseChunk | undefined;\n const toolCalls: Map<string, AgentToolCall> = new Map();\n for await (const chunk of responseStream) {\n response += chunk.delta;\n ctx.sendEvent(\n agentStreamEvent.with({\n delta: chunk.delta,\n response: response,\n currentAgentName: this.name,\n raw: chunk.raw,\n }),\n );\n const toolCallsInChunk: AgentToolCall[] = this['getToolCallFromResponseChunk'](chunk);\n if (toolCallsInChunk.length > 0) {\n\n // Just upsert the tool calls with the latest one if they exist\n toolCallsInChunk.forEach((toolCall) => {\n if (!toolCalls.has(toolCall.toolId)) {\n ctx.sendEvent(toolCallStartEvent.with({ toolCall }));\n }\n // @ts-expect-error\n ctx.sendEvent(toolCallChunkEvent.with({ toolCall: chunk.options?.toolCall ?? [] }));\n\n toolCalls.set(toolCall.toolId, toolCall);\n });\n\n }\n }\n\n const message: ChatMessage = {\n role: \"assistant\" as const,\n content: response,\n };\n\n if (toolCalls.size > 0) {\n message.options = {\n toolCall: Array.from(toolCalls.values()).map((toolCall) => ({\n name: toolCall.toolName,\n input: toolCall.toolKwargs,\n id: toolCall.toolId,\n })),\n };\n }\n scratchpad.push(message);\n state.scratchpad = scratchpad;\n return {\n response: message,\n toolCalls: Array.from(toolCalls.values()),\n raw: lastChunk?.raw,\n currentAgentName: this.name,\n };\n }\n\n}\n\nexport interface RunnableWorkflow<T = unknown, R extends unknown[] = unknown[]> {\n runStream(...args: R): WorkflowStream<WorkflowEventData<T>>\n setFrontendTools?: (names: string[]) => void;\n}","import { createMemory, Memory } from \"llamaindex\";\n\nexport class ConversationMemory {\n _map = new Map<string, Memory>();\n private _memoryFactory: () => Memory;\n\n constructor({ memoryFactory }: { memoryFactory?: () => Memory } = {}) {\n this._memoryFactory = memoryFactory ?? createMemory;\n }\n\n getMemory(conversationId: string): Memory {\n let memory = this._map.get(conversationId);\n if (!memory) {\n memory = this._memoryFactory();\n this._map.set(conversationId, memory);\n }\n return memory;\n }\n}"],"mappings":"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","names":["startAgentEvent","stopAgentEvent","toolCallsEvent","toolResultsEvent","agentStreamEvent","startAgentEvent","stopAgentEvent","toolCallsEvent","toolResultsEvent","agentToolCallEvent","agentToolCallResultEvent","agentInputEvent","agentSetupEvent","agentStepEvent","agentOutputEvent","messages","tool","agents","createMemory","agentStreamEvent","input","toolCallsEvent","agentToolCallEvent","agentToolCallResultEvent","stopAgentEvent","toolResultsEvent","startAgentEvent","agentInputEvent","agentSetupEvent","agentStepEvent","agentOutputEvent"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cloudbase/agent-adapter-llamaindex",
3
- "version": "0.0.2",
3
+ "version": "0.0.6",
4
4
  "description": "LlamaIndex adapter for AG-Kit agents",
5
5
  "files": [
6
6
  "dist/",
@@ -37,7 +37,7 @@
37
37
  "typescript": "^5.0.0"
38
38
  },
39
39
  "dependencies": {
40
- "@ag-ui/client": "^0.0.38",
40
+ "@ag-ui/client": "0.0.42",
41
41
  "@llamaindex/env": "^0.1.30",
42
42
  "@llamaindex/workflow": "^1.1.24",
43
43
  "debug": "^4.4.3",
@@ -45,11 +45,11 @@
45
45
  "llamaindex": "^0.12.0",
46
46
  "rxjs": "^7.8.1",
47
47
  "zod": "^3.25.0 || ^4.0.0",
48
- "@cloudbase/agent-agents": "0.0.2"
48
+ "@cloudbase/agent-agents": "0.0.6"
49
49
  },
50
50
  "peerDependencies": {
51
51
  "zod": "^3.25.0 || ^4.0.0",
52
- "@cloudbase/agent-agents": "0.0.2"
52
+ "@cloudbase/agent-agents": "0.0.6"
53
53
  },
54
54
  "scripts": {
55
55
  "test": "echo \"Error: no test specified\" && exit 1",