From f865c984d3d18445f65650360b3fb8001c163131 Mon Sep 17 00:00:00 2001 From: Alex Yang <himself65@outlook.com> Date: Tue, 12 Nov 2024 10:59:44 -0800 Subject: [PATCH] feat: async get message on chat store (#1470) --- .changeset/soft-tools-wonder.md | 5 +++++ packages/core/src/memory/base.ts | 4 +++- packages/core/src/memory/chat-memory-buffer.ts | 4 ++-- .../core/src/storage/chat-store/base-chat-store.ts | 6 +++++- .../core/tests/memory/chat-memory-buffer.test.ts | 14 +++++++------- 5 files changed, 22 insertions(+), 11 deletions(-) create mode 100644 .changeset/soft-tools-wonder.md diff --git a/.changeset/soft-tools-wonder.md b/.changeset/soft-tools-wonder.md new file mode 100644 index 000000000..3eaae4f2c --- /dev/null +++ b/.changeset/soft-tools-wonder.md @@ -0,0 +1,5 @@ +--- +"@llamaindex/core": patch +--- + +feat: async get message on chat store diff --git a/packages/core/src/memory/base.ts b/packages/core/src/memory/base.ts index e89e4822d..ef468e5b9 100644 --- a/packages/core/src/memory/base.ts +++ b/packages/core/src/memory/base.ts @@ -65,7 +65,9 @@ export abstract class BaseChatStoreMemory< super(); } - getAllMessages(): ChatMessage<AdditionalMessageOptions>[] { + getAllMessages(): + | ChatMessage<AdditionalMessageOptions>[] + | Promise<ChatMessage<AdditionalMessageOptions>[]> { return this.chatStore.getMessages(this.chatStoreKey); } diff --git a/packages/core/src/memory/chat-memory-buffer.ts b/packages/core/src/memory/chat-memory-buffer.ts index 9fd067368..68b0b6e2b 100644 --- a/packages/core/src/memory/chat-memory-buffer.ts +++ b/packages/core/src/memory/chat-memory-buffer.ts @@ -33,11 +33,11 @@ export class ChatMemoryBuffer< } } - getMessages( + async getMessages( transientMessages?: ChatMessage<AdditionalMessageOptions>[] | undefined, initialTokenCount: number = 0, ) { - const messages = this.getAllMessages(); + const messages = await this.getAllMessages(); if (initialTokenCount > this.tokenLimit) { throw new Error("Initial token count exceeds token limit"); diff --git a/packages/core/src/storage/chat-store/base-chat-store.ts b/packages/core/src/storage/chat-store/base-chat-store.ts index be19928f2..80e6295e8 100644 --- a/packages/core/src/storage/chat-store/base-chat-store.ts +++ b/packages/core/src/storage/chat-store/base-chat-store.ts @@ -7,7 +7,11 @@ export abstract class BaseChatStore< key: string, messages: ChatMessage<AdditionalMessageOptions>[], ): void; - abstract getMessages(key: string): ChatMessage<AdditionalMessageOptions>[]; + abstract getMessages( + key: string, + ): + | ChatMessage<AdditionalMessageOptions>[] + | Promise<ChatMessage<AdditionalMessageOptions>[]>; abstract addMessage( key: string, message: ChatMessage<AdditionalMessageOptions>, diff --git a/packages/core/tests/memory/chat-memory-buffer.test.ts b/packages/core/tests/memory/chat-memory-buffer.test.ts index 35f4a50bb..92f13c59b 100644 --- a/packages/core/tests/memory/chat-memory-buffer.test.ts +++ b/packages/core/tests/memory/chat-memory-buffer.test.ts @@ -19,7 +19,7 @@ describe("ChatMemoryBuffer", () => { expect(buffer.tokenLimit).toBe(500); }); - test("getMessages returns all messages when under token limit", () => { + test("getMessages returns all messages when under token limit", async () => { const messages: ChatMessage[] = [ { role: "user", content: "Hello" }, { role: "assistant", content: "Hi there!" }, @@ -30,11 +30,11 @@ describe("ChatMemoryBuffer", () => { chatHistory: messages, }); - const result = buffer.getMessages(); + const result = await buffer.getMessages(); expect(result).toEqual(messages); }); - test("getMessages truncates messages when over token limit", () => { + test("getMessages truncates messages when over token limit", async () => { const messages: ChatMessage[] = [ { role: "user", content: "This is a long message" }, { role: "assistant", content: "This is also a long reply" }, @@ -45,11 +45,11 @@ describe("ChatMemoryBuffer", () => { chatHistory: messages, }); - const result = buffer.getMessages(); + const result = await buffer.getMessages(); expect(result).toEqual([{ role: "user", content: "Short" }]); }); - test("getMessages handles input messages", () => { + test("getMessages handles input messages", async () => { const storedMessages: ChatMessage[] = [ { role: "user", content: "Hello" }, { role: "assistant", content: "Hi there!" }, @@ -62,13 +62,13 @@ describe("ChatMemoryBuffer", () => { const inputMessages: ChatMessage[] = [ { role: "user", content: "New message" }, ]; - const result = buffer.getMessages(inputMessages); + const result = await buffer.getMessages(inputMessages); expect(result).toEqual([...inputMessages, ...storedMessages]); }); test("getMessages throws error when initial token count exceeds limit", () => { const buffer = new ChatMemoryBuffer({ tokenLimit: 10 }); - expect(() => buffer.getMessages(undefined, 20)).toThrow( + expect(async () => buffer.getMessages(undefined, 20)).rejects.toThrow( "Initial token count exceeds token limit", ); }); -- GitLab