diff --git a/.changeset/pretty-swans-fly.md b/.changeset/pretty-swans-fly.md
new file mode 100644
index 0000000000000000000000000000000000000000..07bff4615fc81932faee7df6777a952408914f80
--- /dev/null
+++ b/.changeset/pretty-swans-fly.md
@@ -0,0 +1,5 @@
+---
+"@llamaindex/core": patch
+---
+
+fix: source nodes is empty
diff --git a/packages/core/src/response-synthesizers/base-synthesizer.ts b/packages/core/src/response-synthesizers/base-synthesizer.ts
index 11c92d2dc794ece0ee6e5d94a0a3b173aaff39f2..756eddd48482ab558a237fceb1c64e3d84cdabe6 100644
--- a/packages/core/src/response-synthesizers/base-synthesizer.ts
+++ b/packages/core/src/response-synthesizers/base-synthesizer.ts
@@ -43,9 +43,9 @@ export abstract class BaseSynthesizer extends PromptMixin {
     let response: EngineResponse | AsyncIterable<EngineResponse>;
     if (query.nodes.length === 0) {
       if (stream) {
-        response = EngineResponse.fromResponse("Empty Response", true);
+        response = EngineResponse.fromResponse("Empty Response", true, []);
       } else {
-        response = EngineResponse.fromResponse("Empty Response", false);
+        response = EngineResponse.fromResponse("Empty Response", false, []);
       }
     } else {
       const queryMessage: MessageContent =
diff --git a/packages/core/src/response-synthesizers/factory.ts b/packages/core/src/response-synthesizers/factory.ts
index 85d4d3e5fd0c685450ace59dcb593438cadc9a37..0b0ff673dfccaa0972674adb91e18a4fd80dda68 100644
--- a/packages/core/src/response-synthesizers/factory.ts
+++ b/packages/core/src/response-synthesizers/factory.ts
@@ -108,10 +108,10 @@ class Refine extends BaseSynthesizer {
 
     // fixme: no source nodes provided, cannot fix right now due to lack of context
     if (typeof response === "string") {
-      return EngineResponse.fromResponse(response, false);
+      return EngineResponse.fromResponse(response, false, nodes);
     } else {
       return streamConverter(response!, (text) =>
-        EngineResponse.fromResponse(text, true),
+        EngineResponse.fromResponse(text, true, nodes),
       );
     }
   }
@@ -293,12 +293,13 @@ class TreeSummarize extends BaseSynthesizer {
       if (stream) {
         const response = await this.llm.complete({ ...params, stream });
         return streamConverter(response, (chunk) =>
-          EngineResponse.fromResponse(chunk.text, true),
+          EngineResponse.fromResponse(chunk.text, true, nodes),
         );
       }
       return EngineResponse.fromResponse(
         (await this.llm.complete(params)).text,
         false,
+        nodes,
       );
     } else {
       const summaries = await Promise.all(
@@ -393,13 +394,13 @@ class MultiModal extends BaseSynthesizer {
         stream,
       });
       return streamConverter(response, ({ text }) =>
-        EngineResponse.fromResponse(text, true),
+        EngineResponse.fromResponse(text, true, nodes),
       );
     }
     const response = await llm.complete({
       prompt,
     });
-    return EngineResponse.fromResponse(response.text, false);
+    return EngineResponse.fromResponse(response.text, false, nodes);
   }
 }
 
diff --git "a/packages/core/src/schema/type/engine\342\200\223response.ts" "b/packages/core/src/schema/type/engine\342\200\223response.ts"
index 4f7086414ac27db73fc4b5752663ec1fc680bafa..e540ad65ec3724c0b3cefe930337795ad123e542 100644
--- "a/packages/core/src/schema/type/engine\342\200\223response.ts"
+++ "b/packages/core/src/schema/type/engine\342\200\223response.ts"
@@ -26,7 +26,7 @@ export class EngineResponse implements ChatResponse, ChatResponseChunk {
   static fromResponse(
     response: string,
     stream: boolean,
-    sourceNodes?: NodeWithScore[],
+    sourceNodes: NodeWithScore[],
   ): EngineResponse {
     return new EngineResponse(
       EngineResponse.toChatResponse(response),