diff --git a/packages/core/src/QueryEngine.ts b/packages/core/src/QueryEngine.ts
index 10dace35954c1f89cb4e4662f1e607d5167d3a49..2300043e0309342244137e25ebde7f8c4bb517d0 100644
--- a/packages/core/src/QueryEngine.ts
+++ b/packages/core/src/QueryEngine.ts
@@ -1,3 +1,7 @@
+import {
+  BaseQuestionGenerator,
+  LLMQuestionGenerator,
+} from "./QuestionGenerator";
 import { Response } from "./Response";
 import { ResponseSynthesizer } from "./ResponseSynthesizer";
 import { BaseRetriever } from "./Retriever";
@@ -6,7 +10,7 @@ export interface BaseQueryEngine {
   aquery(query: string): Promise<Response>;
 }
 
-export class RetrieverQueryEngine {
+export class RetrieverQueryEngine implements BaseQueryEngine {
   retriever: BaseRetriever;
   responseSynthesizer: ResponseSynthesizer;
 
@@ -20,3 +24,19 @@ export class RetrieverQueryEngine {
     return this.responseSynthesizer.asynthesize(query, nodes);
   }
 }
+
+export class SubQuestionQueryEngine implements BaseQueryEngine {
+  responseSynthesizer: ResponseSynthesizer;
+  questionGenerator: BaseQuestionGenerator;
+
+  constructor(init?: Partial<SubQuestionQueryEngine>) {
+    this.responseSynthesizer =
+      init?.responseSynthesizer ?? new ResponseSynthesizer();
+    this.questionGenerator =
+      init?.questionGenerator ?? new LLMQuestionGenerator();
+  }
+
+  aquery(query: string): Promise<Response> {
+    throw new Error("Method not implemented.");
+  }
+}
diff --git a/packages/core/src/QuestionGenerator.ts b/packages/core/src/QuestionGenerator.ts
new file mode 100644
index 0000000000000000000000000000000000000000..7391888313dbc533cae5b082a161666bb1ab18e0
--- /dev/null
+++ b/packages/core/src/QuestionGenerator.ts
@@ -0,0 +1,29 @@
+import { BaseLLMPredictor } from "./LLMPredictor";
+import { SimplePrompt } from "./Prompt";
+import { ToolMetadata } from "./Tool";
+
+export interface BaseQuestionGenerator {
+  agenerate(tools: ToolMetadata[], query: string): Promise<SubQuestion[]>;
+}
+
+export class LLMQuestionGenerator implements BaseQuestionGenerator {
+  llmPredictor: BaseLLMPredictor;
+  prompt: SimplePrompt;
+
+  constructor(init?: Partial<LLMQuestionGenerator>) {
+    this.llmPredictor = init?.llmPredictor ?? new BaseLLMPredictor();
+    this.prompt = init?.prompt ?? new SimplePrompt();
+  }
+
+  async agenerate(
+    tools: ToolMetadata[],
+    query: string
+  ): Promise<SubQuestion[]> {
+    throw new Error("Method not implemented.");
+  }
+}
+
+interface SubQuestion {
+  subQuestion: string;
+  toolName: string;
+}
diff --git a/packages/core/src/Tool.ts b/packages/core/src/Tool.ts
new file mode 100644
index 0000000000000000000000000000000000000000..221141e12efe23ee91d3e6297b163462ef69c74d
--- /dev/null
+++ b/packages/core/src/Tool.ts
@@ -0,0 +1 @@
+export interface ToolMetadata {}