@cloudbase/agent-adapter-llamaindex 1.0.1-alpha.7 → 1.0.1-alpha.9

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,29 @@
1
1
  # @cloudbase/agent-adapter-llamaindex
2
2
 
3
+ ## 1.0.1-alpha.8
4
+
5
+ ### Patch Changes
6
+
7
+ - alpha release 0.1.2-alpha.1
8
+ - Update all public packages to version 0.1.2-alpha.1
9
+ - Trigger automated alpha release workflow
10
+ - Includes latest features and improvements
11
+
12
+ - Updated dependencies
13
+ - @cloudbase/agent-agents@1.0.1-alpha.8
14
+
15
+ ## 1.0.1-alpha.7
16
+
17
+ ### Patch Changes
18
+
19
+ - alpha release 0.1.2-alpha.1
20
+ - Update all public packages to version 0.1.2-alpha.1
21
+ - Trigger automated alpha release workflow
22
+ - Includes latest features and improvements
23
+
24
+ - Updated dependencies
25
+ - @cloudbase/agent-agents@1.0.1-alpha.7
26
+
3
27
  ## 1.0.1-alpha.6
4
28
 
5
29
  ### Patch Changes
package/dist/index.d.mts CHANGED
@@ -5,7 +5,7 @@ import { RunAgentInput, BaseEvent } from '@ag-ui/client';
5
5
  import { Observable } from 'rxjs';
6
6
  import * as llamaindex from 'llamaindex';
7
7
  import { Memory, MessageContent, ChatMessage, JSONObject, JSONValue } from 'llamaindex';
8
- import { ZodSchema, z } from 'zod/v4';
8
+ import { ZodSchema, z } from '@llamaindex/core/zod';
9
9
  import { Logger } from '@llamaindex/env';
10
10
 
11
11
  type AgentResultData<O = JSONObject> = {
package/dist/index.d.ts CHANGED
@@ -5,7 +5,7 @@ import { RunAgentInput, BaseEvent } from '@ag-ui/client';
5
5
  import { Observable } from 'rxjs';
6
6
  import * as llamaindex from 'llamaindex';
7
7
  import { Memory, MessageContent, ChatMessage, JSONObject, JSONValue } from 'llamaindex';
8
- import { ZodSchema, z } from 'zod/v4';
8
+ import { ZodSchema, z } from '@llamaindex/core/zod';
9
9
  import { Logger } from '@llamaindex/env';
10
10
 
11
11
  type AgentResultData<O = JSONObject> = {
package/dist/index.js CHANGED
@@ -52,7 +52,7 @@ var import_llamaindex2 = require("llamaindex");
52
52
  var import_llamaindex3 = require("llamaindex");
53
53
  var import_llamaindex4 = require("llamaindex");
54
54
  var import_llamaindex5 = require("llamaindex");
55
- var import_v4 = require("zod/v4");
55
+ var import_zod = require("@llamaindex/core/zod");
56
56
  var import_env = require("@llamaindex/env");
57
57
  var import_workflow = require("@llamaindex/workflow");
58
58
  var import_workflow2 = require("@llamaindex/workflow");
@@ -591,9 +591,9 @@ var AguiLlamaIndexWorkflow = class _AguiLlamaIndexWorkflow {
591
591
  description: DEFAULT_HANDOFF_PROMPT.format({
592
592
  agent_info: JSON.stringify(agentInfo)
593
593
  }),
594
- parameters: import_v4.z.object({
595
- toAgent: import_v4.z.string().describe("The name of the agent to hand off to"),
596
- reason: import_v4.z.string().describe("The reason for handing off to the agent")
594
+ parameters: import_zod.z.object({
595
+ toAgent: import_zod.z.string().describe("The name of the agent to hand off to"),
596
+ reason: import_zod.z.string().describe("The reason for handing off to the agent")
597
597
  }),
598
598
  execute: ({
599
599
  toAgent,
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 {\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"]}
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 \"@llamaindex/core/zod\";\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
@@ -27,7 +27,7 @@ import { createMemory } from "llamaindex";
27
27
  import { PromptTemplate } from "llamaindex";
28
28
  import { tool } from "llamaindex";
29
29
  import { stringifyJSONToMessageContent } from "llamaindex";
30
- import { z } from "zod/v4";
30
+ import { z } from "@llamaindex/core/zod";
31
31
  import { consoleLogger, emptyLogger } from "@llamaindex/env";
32
32
  import {
33
33
  agentStepEvent,
@@ -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 {\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"]}
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 \"@llamaindex/core/zod\";\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": "1.0.1-alpha.7",
3
+ "version": "1.0.1-alpha.9",
4
4
  "description": "LlamaIndex adapter for AG-Kit agents",
5
5
  "files": [
6
6
  "dist/",
@@ -38,6 +38,7 @@
38
38
  },
39
39
  "dependencies": {
40
40
  "@ag-ui/client": "0.0.42",
41
+ "@llamaindex/core": "0.6.22",
41
42
  "@llamaindex/env": "^0.1.30",
42
43
  "@llamaindex/workflow": "^1.1.24",
43
44
  "debug": "^4.4.3",
@@ -45,11 +46,11 @@
45
46
  "llamaindex": "^0.12.0",
46
47
  "rxjs": "^7.8.1",
47
48
  "zod": "^3.25.0 || ^4.0.0",
48
- "@cloudbase/agent-agents": "1.0.1-alpha.7"
49
+ "@cloudbase/agent-agents": "1.0.1-alpha.9"
49
50
  },
50
51
  "peerDependencies": {
51
52
  "zod": "^3.25.0 || ^4.0.0",
52
- "@cloudbase/agent-agents": "1.0.1-alpha.7"
53
+ "@cloudbase/agent-agents": "1.0.1-alpha.9"
53
54
  },
54
55
  "scripts": {
55
56
  "test": "echo \"Error: no test specified\" && exit 1",