From 359fd33041920fa96d2e66cb124ae43535dbd896 Mon Sep 17 00:00:00 2001 From: Alex Yang <himself65@outlook.com> Date: Sun, 27 Oct 2024 00:39:03 -0500 Subject: [PATCH] refactor(core): move `ContextChatEngine` and `SimpleChatEngine` (#1401) --- .changeset/shaggy-houses-breathe.md | 6 +++ apps/next/src/actions/index.tsx | 10 +++-- packages/core/src/agent/base.ts | 2 +- packages/core/src/chat-engine/base.ts | 36 +++++++++++++++ .../src/chat-engine/context-chat-engine.ts} | 41 +++++++---------- .../chat-engine/default-context-generator.ts} | 14 +++--- packages/core/src/chat-engine/index.ts | 45 ++++--------------- .../src/chat-engine/simple-chat-engine.ts} | 14 +++--- .../types.ts => core/src/chat-engine/type.ts} | 5 ++- packages/llamaindex/src/engines/chat/index.ts | 4 +- 10 files changed, 92 insertions(+), 85 deletions(-) create mode 100644 .changeset/shaggy-houses-breathe.md create mode 100644 packages/core/src/chat-engine/base.ts rename packages/{llamaindex/src/engines/chat/ContextChatEngine.ts => core/src/chat-engine/context-chat-engine.ts} (84%) rename packages/{llamaindex/src/engines/chat/DefaultContextGenerator.ts => core/src/chat-engine/default-context-generator.ts} (83%) rename packages/{llamaindex/src/engines/chat/SimpleChatEngine.ts => core/src/chat-engine/simple-chat-engine.ts} (83%) rename packages/{llamaindex/src/engines/chat/types.ts => core/src/chat-engine/type.ts} (68%) diff --git a/.changeset/shaggy-houses-breathe.md b/.changeset/shaggy-houses-breathe.md new file mode 100644 index 000000000..94ffcc6b2 --- /dev/null +++ b/.changeset/shaggy-houses-breathe.md @@ -0,0 +1,6 @@ +--- +"@llamaindex/core": patch +"llamaindex": patch +--- + +refactor(core): move `ContextChatEngine` and `SimpleChatEngine` diff --git a/apps/next/src/actions/index.tsx b/apps/next/src/actions/index.tsx index 17f7d035c..b215c44e4 100644 --- a/apps/next/src/actions/index.tsx +++ b/apps/next/src/actions/index.tsx @@ -2,9 +2,9 @@ import { ClientMDXContent } from "@/components/mdx"; import { BotMessage } from "@/components/message"; import { Skeleton } from "@/components/ui/skeleton"; import { LlamaCloudRetriever } from "@/deps/cloud"; +import { ContextChatEngine } from "@llamaindex/core/chat-engine"; import { Settings } from "@llamaindex/core/global"; import { ChatMessage } from "@llamaindex/core/llms"; -import { RetrieverQueryEngine } from "@llamaindex/core/query-engine"; import { OpenAI } from "@llamaindex/openai"; import { createAI, createStreamableUI, getMutableAIState } from "ai/rsc"; import { ReactNode } from "react"; @@ -50,7 +50,7 @@ export const AIProvider = createAI({ actions: { query: async (message: string): Promise<UIMessage> => { "use server"; - const queryEngine = new RetrieverQueryEngine(retriever); + const chatEngine = new ContextChatEngine({ retriever }); const id = Date.now(); const aiState = getMutableAIState<typeof AIProvider>(); @@ -73,10 +73,12 @@ export const AIProvider = createAI({ ); runAsyncFnWithoutBlocking(async () => { - const response = await queryEngine.query({ - query: message, + const response = await chatEngine.chat({ + message, + chatHistory: aiState.get().messages, stream: true, }); + let content = ""; for await (const { delta } of response) { diff --git a/packages/core/src/agent/base.ts b/packages/core/src/agent/base.ts index 64fd92bd4..19fab33fc 100644 --- a/packages/core/src/agent/base.ts +++ b/packages/core/src/agent/base.ts @@ -3,7 +3,7 @@ import { BaseChatEngine, type NonStreamingChatEngineParams, type StreamingChatEngineParams, -} from "../chat-engine"; +} from "../chat-engine/base"; import { wrapEventCaller } from "../decorator"; import { Settings } from "../global"; import type { diff --git a/packages/core/src/chat-engine/base.ts b/packages/core/src/chat-engine/base.ts new file mode 100644 index 000000000..b4bd4cf3b --- /dev/null +++ b/packages/core/src/chat-engine/base.ts @@ -0,0 +1,36 @@ +import type { ChatMessage, MessageContent } from "../llms"; +import type { BaseMemory } from "../memory"; +import { EngineResponse } from "../schema"; + +export interface BaseChatEngineParams< + AdditionalMessageOptions extends object = object, +> { + message: MessageContent; + /** + * Optional chat history if you want to customize the chat history. + */ + chatHistory?: + | ChatMessage<AdditionalMessageOptions>[] + | BaseMemory<AdditionalMessageOptions>; +} + +export interface StreamingChatEngineParams< + AdditionalMessageOptions extends object = object, +> extends BaseChatEngineParams<AdditionalMessageOptions> { + stream: true; +} + +export interface NonStreamingChatEngineParams< + AdditionalMessageOptions extends object = object, +> extends BaseChatEngineParams<AdditionalMessageOptions> { + stream?: false; +} + +export abstract class BaseChatEngine { + abstract chat(params: NonStreamingChatEngineParams): Promise<EngineResponse>; + abstract chat( + params: StreamingChatEngineParams, + ): Promise<AsyncIterable<EngineResponse>>; + + abstract chatHistory: ChatMessage[] | Promise<ChatMessage[]>; +} diff --git a/packages/llamaindex/src/engines/chat/ContextChatEngine.ts b/packages/core/src/chat-engine/context-chat-engine.ts similarity index 84% rename from packages/llamaindex/src/engines/chat/ContextChatEngine.ts rename to packages/core/src/chat-engine/context-chat-engine.ts index e7b9a9ce2..fb2a50f65 100644 --- a/packages/llamaindex/src/engines/chat/ContextChatEngine.ts +++ b/packages/core/src/chat-engine/context-chat-engine.ts @@ -1,33 +1,24 @@ -import type { - BaseChatEngine, - NonStreamingChatEngineParams, - StreamingChatEngineParams, -} from "@llamaindex/core/chat-engine"; -import { wrapEventCaller } from "@llamaindex/core/decorator"; -import type { - ChatMessage, - LLM, - MessageContent, - MessageType, -} from "@llamaindex/core/llms"; -import { BaseMemory, ChatMemoryBuffer } from "@llamaindex/core/memory"; -import type { BaseNodePostprocessor } from "@llamaindex/core/postprocessor"; +import { wrapEventCaller } from "../decorator"; +import { Settings } from "../global"; +import type { ChatMessage, LLM, MessageContent, MessageType } from "../llms"; +import { BaseMemory, ChatMemoryBuffer } from "../memory"; +import type { BaseNodePostprocessor } from "../postprocessor"; import { type ContextSystemPrompt, type ModuleRecord, PromptMixin, type PromptsRecord, -} from "@llamaindex/core/prompts"; -import type { BaseRetriever } from "@llamaindex/core/retriever"; -import { EngineResponse, MetadataMode } from "@llamaindex/core/schema"; -import { - extractText, - streamConverter, - streamReducer, -} from "@llamaindex/core/utils"; -import { Settings } from "../../Settings.js"; -import { DefaultContextGenerator } from "./DefaultContextGenerator.js"; -import type { ContextGenerator } from "./types.js"; +} from "../prompts"; +import type { BaseRetriever } from "../retriever"; +import { EngineResponse, MetadataMode } from "../schema"; +import { extractText, streamConverter, streamReducer } from "../utils"; +import type { + BaseChatEngine, + NonStreamingChatEngineParams, + StreamingChatEngineParams, +} from "./base"; +import { DefaultContextGenerator } from "./default-context-generator"; +import type { ContextGenerator } from "./type"; /** * ContextChatEngine uses the Index to get the appropriate context for each query. diff --git a/packages/llamaindex/src/engines/chat/DefaultContextGenerator.ts b/packages/core/src/chat-engine/default-context-generator.ts similarity index 83% rename from packages/llamaindex/src/engines/chat/DefaultContextGenerator.ts rename to packages/core/src/chat-engine/default-context-generator.ts index 55cd3403c..9a0e596d5 100644 --- a/packages/llamaindex/src/engines/chat/DefaultContextGenerator.ts +++ b/packages/core/src/chat-engine/default-context-generator.ts @@ -1,15 +1,15 @@ -import type { MessageContent, MessageType } from "@llamaindex/core/llms"; -import type { BaseNodePostprocessor } from "@llamaindex/core/postprocessor"; +import type { MessageContent, MessageType } from "../llms"; +import type { BaseNodePostprocessor } from "../postprocessor"; import { type ContextSystemPrompt, defaultContextSystemPrompt, type ModuleRecord, PromptMixin, -} from "@llamaindex/core/prompts"; -import { createMessageContent } from "@llamaindex/core/response-synthesizers"; -import type { BaseRetriever } from "@llamaindex/core/retriever"; -import { MetadataMode, type NodeWithScore } from "@llamaindex/core/schema"; -import type { Context, ContextGenerator } from "./types.js"; +} from "../prompts"; +import { createMessageContent } from "../response-synthesizers"; +import type { BaseRetriever } from "../retriever"; +import { MetadataMode, type NodeWithScore } from "../schema"; +import type { Context, ContextGenerator } from "./type.js"; export class DefaultContextGenerator extends PromptMixin diff --git a/packages/core/src/chat-engine/index.ts b/packages/core/src/chat-engine/index.ts index b4bd4cf3b..f5af4dd4d 100644 --- a/packages/core/src/chat-engine/index.ts +++ b/packages/core/src/chat-engine/index.ts @@ -1,36 +1,9 @@ -import type { ChatMessage, MessageContent } from "../llms"; -import type { BaseMemory } from "../memory"; -import { EngineResponse } from "../schema"; - -export interface BaseChatEngineParams< - AdditionalMessageOptions extends object = object, -> { - message: MessageContent; - /** - * Optional chat history if you want to customize the chat history. - */ - chatHistory?: - | ChatMessage<AdditionalMessageOptions>[] - | BaseMemory<AdditionalMessageOptions>; -} - -export interface StreamingChatEngineParams< - AdditionalMessageOptions extends object = object, -> extends BaseChatEngineParams<AdditionalMessageOptions> { - stream: true; -} - -export interface NonStreamingChatEngineParams< - AdditionalMessageOptions extends object = object, -> extends BaseChatEngineParams<AdditionalMessageOptions> { - stream?: false; -} - -export abstract class BaseChatEngine { - abstract chat(params: NonStreamingChatEngineParams): Promise<EngineResponse>; - abstract chat( - params: StreamingChatEngineParams, - ): Promise<AsyncIterable<EngineResponse>>; - - abstract chatHistory: ChatMessage[] | Promise<ChatMessage[]>; -} +export { + BaseChatEngine, + type BaseChatEngineParams, + type NonStreamingChatEngineParams, + type StreamingChatEngineParams, +} from "./base"; +export { ContextChatEngine } from "./context-chat-engine"; +export { DefaultContextGenerator } from "./default-context-generator"; +export { SimpleChatEngine } from "./simple-chat-engine"; diff --git a/packages/llamaindex/src/engines/chat/SimpleChatEngine.ts b/packages/core/src/chat-engine/simple-chat-engine.ts similarity index 83% rename from packages/llamaindex/src/engines/chat/SimpleChatEngine.ts rename to packages/core/src/chat-engine/simple-chat-engine.ts index 6aa2c8c42..568d2f584 100644 --- a/packages/llamaindex/src/engines/chat/SimpleChatEngine.ts +++ b/packages/core/src/chat-engine/simple-chat-engine.ts @@ -1,15 +1,15 @@ +import type { LLM } from "../llms"; +import { BaseMemory, ChatMemoryBuffer } from "../memory"; +import { EngineResponse } from "../schema"; +import { streamConverter, streamReducer } from "../utils"; import type { BaseChatEngine, NonStreamingChatEngineParams, StreamingChatEngineParams, -} from "@llamaindex/core/chat-engine"; -import type { LLM } from "@llamaindex/core/llms"; -import { BaseMemory, ChatMemoryBuffer } from "@llamaindex/core/memory"; -import { EngineResponse } from "@llamaindex/core/schema"; -import { streamConverter, streamReducer } from "@llamaindex/core/utils"; +} from "./base"; -import { wrapEventCaller } from "@llamaindex/core/decorator"; -import { Settings } from "../../Settings.js"; +import { wrapEventCaller } from "../decorator"; +import { Settings } from "../global"; /** * SimpleChatEngine is the simplest possible chat engine. Useful for using your own custom prompts. diff --git a/packages/llamaindex/src/engines/chat/types.ts b/packages/core/src/chat-engine/type.ts similarity index 68% rename from packages/llamaindex/src/engines/chat/types.ts rename to packages/core/src/chat-engine/type.ts index 2c5a811d1..693b724e7 100644 --- a/packages/llamaindex/src/engines/chat/types.ts +++ b/packages/core/src/chat-engine/type.ts @@ -1,10 +1,11 @@ -import type { ChatMessage } from "@llamaindex/core/llms"; -import type { NodeWithScore } from "@llamaindex/core/schema"; +import type { ChatMessage } from "../llms"; +import type { NodeWithScore } from "../schema"; export interface Context { message: ChatMessage; nodes: NodeWithScore[]; } + /** * A ContextGenerator is used to generate a context based on a message's text content */ diff --git a/packages/llamaindex/src/engines/chat/index.ts b/packages/llamaindex/src/engines/chat/index.ts index c66c20fbf..1411cbac2 100644 --- a/packages/llamaindex/src/engines/chat/index.ts +++ b/packages/llamaindex/src/engines/chat/index.ts @@ -1,4 +1,2 @@ +export * from "@llamaindex/core/chat-engine"; export { CondenseQuestionChatEngine } from "./CondenseQuestionChatEngine.js"; -export { ContextChatEngine } from "./ContextChatEngine.js"; -export { SimpleChatEngine } from "./SimpleChatEngine.js"; -export * from "./types.js"; -- GitLab