diff --git a/.changeset/happy-lamps-rush.md b/.changeset/happy-lamps-rush.md
new file mode 100644
index 0000000000000000000000000000000000000000..b47deeb2cfc1e4486c3ee1abcd416b7388c32240
--- /dev/null
+++ b/.changeset/happy-lamps-rush.md
@@ -0,0 +1,5 @@
+---
+"create-llama": patch
+---
+
+chore: update to llamaindex 0.4.3
diff --git a/templates/types/streaming/express/package.json b/templates/types/streaming/express/package.json
index 4f6a3a4ca9683949e0837121e468af393922afe3..32a8f5334b8748ec186c027ce67c5c358338f304 100644
--- a/templates/types/streaming/express/package.json
+++ b/templates/types/streaming/express/package.json
@@ -20,7 +20,7 @@
     "dotenv": "^16.3.1",
     "duck-duck-scrape": "^2.2.5",
     "express": "^4.18.2",
-    "llamaindex": "0.3.16",
+    "llamaindex": "0.4.3",
     "pdf2json": "3.0.5",
     "ajv": "^8.12.0",
     "@e2b/code-interpreter": "^0.0.5",
diff --git a/templates/types/streaming/express/src/controllers/llamaindex-stream.ts b/templates/types/streaming/express/src/controllers/llamaindex-stream.ts
index f2f4b5a33f60aedb4fb8598e3e2757328280af7c..d01e7d91afb9cd2afa50aec03dee47ef3de8f65f 100644
--- a/templates/types/streaming/express/src/controllers/llamaindex-stream.ts
+++ b/templates/types/streaming/express/src/controllers/llamaindex-stream.ts
@@ -7,20 +7,12 @@ import {
   type AIStreamCallbacksAndOptions,
 } from "ai";
 import {
+  EngineResponse,
   MessageContent,
   MessageContentDetail,
-  Metadata,
-  NodeWithScore,
-  Response,
-  ToolCallLLMMessageOptions,
 } from "llamaindex";
 
-import { AgentStreamChatResponse } from "llamaindex/agent/base";
-import { CsvFile, appendSourceData } from "./stream-helper";
-
-type LlamaIndexResponse =
-  | AgentStreamChatResponse<ToolCallLLMMessageOptions>
-  | Response;
+import { CsvFile } from "./stream-helper";
 
 export const convertMessageContent = (
   content: string,
@@ -86,39 +78,19 @@ const convertAnnotations = (
   return content;
 };
 
-function createParser(
-  res: AsyncIterable<LlamaIndexResponse>,
-  data: StreamData,
-) {
+function createParser(res: AsyncIterable<EngineResponse>, data: StreamData) {
   const it = res[Symbol.asyncIterator]();
   const trimStartOfStream = trimStartOfStreamHelper();
 
-  let sourceNodes: NodeWithScore<Metadata>[] | undefined;
   return new ReadableStream<string>({
     async pull(controller): Promise<void> {
       const { value, done } = await it.next();
       if (done) {
-        if (sourceNodes) {
-          appendSourceData(data, sourceNodes);
-        }
         controller.close();
         data.close();
         return;
       }
-
-      let delta;
-      if (value instanceof Response) {
-        // handle Response type
-        if (value.sourceNodes) {
-          // get source nodes from the first response
-          sourceNodes = value.sourceNodes;
-        }
-        delta = value.response ?? "";
-      } else {
-        // handle other types
-        delta = value.response.delta;
-      }
-      const text = trimStartOfStream(delta ?? "");
+      const text = trimStartOfStream(value.delta ?? "");
       if (text) {
         controller.enqueue(text);
       }
@@ -127,7 +99,7 @@ function createParser(
 }
 
 export function LlamaIndexStream(
-  response: AsyncIterable<LlamaIndexResponse>,
+  response: AsyncIterable<EngineResponse>,
   data: StreamData,
   opts?: {
     callbacks?: AIStreamCallbacksAndOptions;
diff --git a/templates/types/streaming/express/src/controllers/stream-helper.ts b/templates/types/streaming/express/src/controllers/stream-helper.ts
index 15527ba8701eb7eede244426d20055c536cb9cba..e74610ed1a9f912a6051786dd51e224bd1a52a91 100644
--- a/templates/types/streaming/express/src/controllers/stream-helper.ts
+++ b/templates/types/streaming/express/src/controllers/stream-helper.ts
@@ -84,8 +84,9 @@ export function createStreamTimeout(stream: StreamData) {
 export function createCallbackManager(stream: StreamData) {
   const callbackManager = new CallbackManager();
 
-  callbackManager.on("retrieve", (data) => {
-    const { nodes, query } = data.detail;
+  callbackManager.on("retrieve-end", (data) => {
+    const { nodes, query } = data.detail.payload;
+    appendSourceData(stream, nodes);
     appendEventData(stream, `Retrieving context for query: '${query}'`);
     appendEventData(
       stream,
diff --git a/templates/types/streaming/nextjs/app/api/chat/llamaindex-stream.ts b/templates/types/streaming/nextjs/app/api/chat/llamaindex-stream.ts
index f2f4b5a33f60aedb4fb8598e3e2757328280af7c..d01e7d91afb9cd2afa50aec03dee47ef3de8f65f 100644
--- a/templates/types/streaming/nextjs/app/api/chat/llamaindex-stream.ts
+++ b/templates/types/streaming/nextjs/app/api/chat/llamaindex-stream.ts
@@ -7,20 +7,12 @@ import {
   type AIStreamCallbacksAndOptions,
 } from "ai";
 import {
+  EngineResponse,
   MessageContent,
   MessageContentDetail,
-  Metadata,
-  NodeWithScore,
-  Response,
-  ToolCallLLMMessageOptions,
 } from "llamaindex";
 
-import { AgentStreamChatResponse } from "llamaindex/agent/base";
-import { CsvFile, appendSourceData } from "./stream-helper";
-
-type LlamaIndexResponse =
-  | AgentStreamChatResponse<ToolCallLLMMessageOptions>
-  | Response;
+import { CsvFile } from "./stream-helper";
 
 export const convertMessageContent = (
   content: string,
@@ -86,39 +78,19 @@ const convertAnnotations = (
   return content;
 };
 
-function createParser(
-  res: AsyncIterable<LlamaIndexResponse>,
-  data: StreamData,
-) {
+function createParser(res: AsyncIterable<EngineResponse>, data: StreamData) {
   const it = res[Symbol.asyncIterator]();
   const trimStartOfStream = trimStartOfStreamHelper();
 
-  let sourceNodes: NodeWithScore<Metadata>[] | undefined;
   return new ReadableStream<string>({
     async pull(controller): Promise<void> {
       const { value, done } = await it.next();
       if (done) {
-        if (sourceNodes) {
-          appendSourceData(data, sourceNodes);
-        }
         controller.close();
         data.close();
         return;
       }
-
-      let delta;
-      if (value instanceof Response) {
-        // handle Response type
-        if (value.sourceNodes) {
-          // get source nodes from the first response
-          sourceNodes = value.sourceNodes;
-        }
-        delta = value.response ?? "";
-      } else {
-        // handle other types
-        delta = value.response.delta;
-      }
-      const text = trimStartOfStream(delta ?? "");
+      const text = trimStartOfStream(value.delta ?? "");
       if (text) {
         controller.enqueue(text);
       }
@@ -127,7 +99,7 @@ function createParser(
 }
 
 export function LlamaIndexStream(
-  response: AsyncIterable<LlamaIndexResponse>,
+  response: AsyncIterable<EngineResponse>,
   data: StreamData,
   opts?: {
     callbacks?: AIStreamCallbacksAndOptions;
diff --git a/templates/types/streaming/nextjs/app/api/chat/stream-helper.ts b/templates/types/streaming/nextjs/app/api/chat/stream-helper.ts
index 15527ba8701eb7eede244426d20055c536cb9cba..e74610ed1a9f912a6051786dd51e224bd1a52a91 100644
--- a/templates/types/streaming/nextjs/app/api/chat/stream-helper.ts
+++ b/templates/types/streaming/nextjs/app/api/chat/stream-helper.ts
@@ -84,8 +84,9 @@ export function createStreamTimeout(stream: StreamData) {
 export function createCallbackManager(stream: StreamData) {
   const callbackManager = new CallbackManager();
 
-  callbackManager.on("retrieve", (data) => {
-    const { nodes, query } = data.detail;
+  callbackManager.on("retrieve-end", (data) => {
+    const { nodes, query } = data.detail.payload;
+    appendSourceData(stream, nodes);
     appendEventData(stream, `Retrieving context for query: '${query}'`);
     appendEventData(
       stream,
diff --git a/templates/types/streaming/nextjs/package.json b/templates/types/streaming/nextjs/package.json
index 74f2b852cdd5d2e610e8925478d01c1840496f5b..f4d003a28b01682c11f505aeebd4ca131efff0fe 100644
--- a/templates/types/streaming/nextjs/package.json
+++ b/templates/types/streaming/nextjs/package.json
@@ -10,6 +10,9 @@
     "lint": "next lint"
   },
   "dependencies": {
+    "@apidevtools/swagger-parser": "^10.1.0",
+    "@e2b/code-interpreter": "^0.0.5",
+    "@llamaindex/pdf-viewer": "^1.1.1",
     "@radix-ui/react-collapsible": "^1.0.3",
     "@radix-ui/react-hover-card": "^1.0.7",
     "@radix-ui/react-slot": "^1.0.2",
@@ -19,45 +22,43 @@
     "clsx": "^2.1.1",
     "dotenv": "^16.3.1",
     "duck-duck-scrape": "^2.2.5",
-    "llamaindex": "0.3.16",
+    "formdata-node": "^6.0.3",
+    "got": "^14.4.1",
+    "llamaindex": "0.4.3",
     "lucide-react": "^0.294.0",
-    "next": "^14.0.3",
+    "next": "^14.2.4",
     "pdf2json": "3.0.5",
     "react": "^18.2.0",
     "react-dom": "^18.2.0",
     "react-markdown": "^8.0.7",
     "react-syntax-highlighter": "^15.5.0",
+    "rehype-katex": "^7.0.0",
     "remark": "^14.0.3",
     "remark-code-import": "^1.2.0",
     "remark-gfm": "^3.0.1",
     "remark-math": "^5.1.1",
-    "rehype-katex": "^7.0.0",
     "supports-color": "^8.1.1",
     "tailwind-merge": "^2.1.0",
-    "vaul": "^0.9.1",
-    "@llamaindex/pdf-viewer": "^1.1.1",
-    "@e2b/code-interpreter": "^0.0.5",
+    "tiktoken": "^1.0.15",
     "uuid": "^9.0.1",
-    "got": "^14.4.1",
-    "@apidevtools/swagger-parser": "^10.1.0",
-    "formdata-node": "^6.0.3"
+    "vaul": "^0.9.1"
   },
   "devDependencies": {
     "@types/node": "^20.10.3",
     "@types/react": "^18.2.42",
     "@types/react-dom": "^18.2.17",
     "@types/react-syntax-highlighter": "^15.5.11",
+    "@types/uuid": "^9.0.8",
     "autoprefixer": "^10.4.16",
     "cross-env": "^7.0.3",
     "eslint": "^8.55.0",
-    "eslint-config-next": "^14.0.3",
+    "eslint-config-next": "^14.2.4",
     "eslint-config-prettier": "^8.10.0",
     "postcss": "^8.4.32",
     "prettier": "^3.2.5",
     "prettier-plugin-organize-imports": "^3.2.4",
     "tailwindcss": "^3.3.6",
     "tsx": "^4.7.2",
-    "typescript": "^5.3.2",
-    "@types/uuid": "^9.0.8"
+    "typescript": "^5.3.2"
   }
 }