From d3b635b1934118199b53fa37e8aa6a3e0c2169bc Mon Sep 17 00:00:00 2001
From: Parham Saidi <parham@parha.me>
Date: Mon, 17 Jun 2024 19:33:57 +0200
Subject: [PATCH] fix: agents to use chat history (#933)

---
 .changeset/lovely-emus-camp.md  |  5 +++++
 packages/core/src/agent/base.ts | 21 +++++++++++++++++++--
 2 files changed, 24 insertions(+), 2 deletions(-)
 create mode 100644 .changeset/lovely-emus-camp.md

diff --git a/.changeset/lovely-emus-camp.md b/.changeset/lovely-emus-camp.md
new file mode 100644
index 000000000..28d3cfbeb
--- /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 a5e18df06..5775c8d33 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];
-- 
GitLab