diff --git a/packages/server/src/handlers/chat.ts b/packages/server/src/handlers/chat.ts
index 8f2d1a7e97739de3f9115f06f078f9831478bf6e..d8b56308ce4aa7a976918c49116c9c64747851c7 100644
--- a/packages/server/src/handlers/chat.ts
+++ b/packages/server/src/handlers/chat.ts
@@ -1,4 +1,4 @@
-import { LlamaIndexAdapter } from "ai";
+import { type Message } from "ai";
 import { IncomingMessage, ServerResponse } from "http";
 import { type ChatMessage } from "llamaindex";
 import type { ServerWorkflow } from "../types";
@@ -7,7 +7,7 @@ import {
   pipeResponse,
   sendJSONResponse,
 } from "../utils/request";
-import { createStreamFromWorkflowContext } from "../utils/stream";
+import { runWorkflow } from "../utils/workflow";
 
 export const handleChat = async (
   workflow: ServerWorkflow,
@@ -16,7 +16,7 @@ export const handleChat = async (
 ) => {
   try {
     const body = await parseRequestBody(req);
-    const { messages } = body as { messages: ChatMessage[] };
+    const { messages } = body as { messages: Message[] };
 
     const lastMessage = messages[messages.length - 1];
     if (lastMessage?.role !== "user") {
@@ -25,15 +25,9 @@ export const handleChat = async (
       });
     }
 
-    const userMessage = lastMessage.content;
-    const chatHistory = messages.slice(0, -1);
-
-    const context = workflow.run({ userMessage, chatHistory });
-    const { stream, dataStream } =
-      await createStreamFromWorkflowContext(context);
-    const streamResponse = LlamaIndexAdapter.toDataStreamResponse(stream, {
-      data: dataStream,
-    });
+    const userInput = lastMessage.content;
+    const chatHistory = messages.slice(0, -1) as ChatMessage[];
+    const streamResponse = await runWorkflow(workflow, userInput, chatHistory);
     pipeResponse(res, streamResponse);
   } catch (error) {
     console.error("Chat error:", error);
diff --git a/packages/server/src/types.ts b/packages/server/src/types.ts
index 9a41a7dce678fdf18801cae3d8916e9b0e10f42c..c0d0744fc962dee9573a660bc353887d394ee6ae 100644
--- a/packages/server/src/types.ts
+++ b/packages/server/src/types.ts
@@ -1,13 +1,15 @@
 import {
+  AgentWorkflow,
   Workflow,
   type ChatMessage,
   type ChatResponseChunk,
-  type MessageContent,
 } from "llamaindex";
 
 export type AgentInput = {
-  userMessage: MessageContent;
-  chatHistory: ChatMessage[];
+  userInput: string; // the last message content from the user
+  chatHistory: ChatMessage[]; // the previous chat history (not including the last message)
 };
 
-export type ServerWorkflow = Workflow<null, AgentInput, ChatResponseChunk>;
+export type ServerWorkflow =
+  | Workflow<null, AgentInput, ChatResponseChunk>
+  | AgentWorkflow;
diff --git a/packages/server/src/utils/stream.ts b/packages/server/src/utils/workflow.ts
similarity index 66%
rename from packages/server/src/utils/stream.ts
rename to packages/server/src/utils/workflow.ts
index 056a5ac8275b830f3a6b26ff3e67bc0924ee8b5d..328f9f9755ed99dcf23dc91152132e12fbda29bc 100644
--- a/packages/server/src/utils/stream.ts
+++ b/packages/server/src/utils/workflow.ts
@@ -1,14 +1,36 @@
-import { StreamData, type JSONValue } from "ai";
+import { LlamaIndexAdapter, StreamData, type JSONValue } from "ai";
 import {
+  AgentWorkflow,
   EngineResponse,
   StopEvent,
   WorkflowContext,
   WorkflowEvent,
+  type ChatMessage,
   type ChatResponseChunk,
 } from "llamaindex";
 import { ReadableStream } from "stream/web";
+import type { ServerWorkflow } from "../types";
 
-export async function createStreamFromWorkflowContext<Input, Output, Context>(
+export async function runWorkflow(
+  workflow: ServerWorkflow,
+  userInput: string,
+  chatHistory: ChatMessage[],
+) {
+  if (workflow instanceof AgentWorkflow) {
+    const context = workflow.run(userInput, { chatHistory });
+    const { stream, dataStream } = await createStreamFromWorkflowContext(
+      // eslint-disable-next-line @typescript-eslint/no-explicit-any
+      context as any,
+    );
+    return LlamaIndexAdapter.toDataStreamResponse(stream, { data: dataStream });
+  }
+
+  const context = workflow.run({ userInput, chatHistory });
+  const { stream, dataStream } = await createStreamFromWorkflowContext(context);
+  return LlamaIndexAdapter.toDataStreamResponse(stream, { data: dataStream });
+}
+
+async function createStreamFromWorkflowContext<Input, Output, Context>(
   context: WorkflowContext<Input, Output, Context>,
 ): Promise<{ stream: ReadableStream<EngineResponse>; dataStream: StreamData }> {
   const dataStream = new StreamData();