diff --git a/.changeset/lovely-emus-camp.md b/.changeset/lovely-emus-camp.md
new file mode 100644
index 0000000000000000000000000000000000000000..28d3cfbeb1b6444a8d6ba8ed616ff1a07aea8250
--- /dev/null
+++ b/.changeset/lovely-emus-camp.md
@@ -0,0 +1,5 @@
+---
+"llamaindex": patch
+---
+
+fix: agents to use chat history
diff --git a/packages/core/src/agent/base.ts b/packages/core/src/agent/base.ts
index a5e18df06c5923528f90396113b3b5ff6911f35a..5775c8d33d2439c00c1f47536ae1149120f36a2f 100644
--- a/packages/core/src/agent/base.ts
+++ b/packages/core/src/agent/base.ts
@@ -1,4 +1,5 @@
 import { ReadableStream, TransformStream, randomUUID } from "@llamaindex/env";
+import { ChatHistory } from "../ChatHistory.js";
 import { EngineResponse } from "../EngineResponse.js";
 import { Settings } from "../Settings.js";
 import {
@@ -266,8 +267,9 @@ export abstract class AgentRunner<
     message: MessageContent,
     stream: boolean = false,
     verbose: boolean | undefined = undefined,
+    chatHistory?: ChatMessage<AdditionalMessageOptions>[],
   ) {
-    const initialMessages = [...this.#chatHistory];
+    const initialMessages = [...(chatHistory ?? this.#chatHistory)];
     if (this.#systemPrompt !== null) {
       const systemPrompt = this.#systemPrompt;
       const alreadyHasSystemPrompt = initialMessages
@@ -309,7 +311,22 @@ export abstract class AgentRunner<
   async chat(
     params: ChatEngineParamsNonStreaming | ChatEngineParamsStreaming,
   ): Promise<EngineResponse | ReadableStream<EngineResponse>> {
-    const task = this.createTask(params.message, !!params.stream);
+    let chatHistory: ChatMessage<AdditionalMessageOptions>[] | undefined = [];
+
+    if (params.chatHistory instanceof ChatHistory) {
+      chatHistory = params.chatHistory
+        .messages as ChatMessage<AdditionalMessageOptions>[];
+    } else {
+      chatHistory =
+        params.chatHistory as ChatMessage<AdditionalMessageOptions>[];
+    }
+
+    const task = this.createTask(
+      params.message,
+      !!params.stream,
+      false,
+      chatHistory,
+    );
     for await (const stepOutput of task) {
       // update chat history for each round
       this.#chatHistory = [...stepOutput.taskStep.context.store.messages];