From 853b249cbb54bbc777f6d630efe18eed7e5eeeb5 Mon Sep 17 00:00:00 2001
From: Cai GoGwilt <cai@ironcladhq.com>
Date: Fri, 17 Nov 2023 10:07:03 -0800
Subject: [PATCH] Fix gpt-4 vision support for node executor

Image to base64 conversion relied on FileReader, which does not exist in
Node.js. So, use Buffer when running in Node.js instead.
---
 packages/core/src/utils/base64.ts | 20 +++++++++++++-------
 1 file changed, 13 insertions(+), 7 deletions(-)

diff --git a/packages/core/src/utils/base64.ts b/packages/core/src/utils/base64.ts
index b13e780a4..df24d03de 100644
--- a/packages/core/src/utils/base64.ts
+++ b/packages/core/src/utils/base64.ts
@@ -1,11 +1,17 @@
 export async function uint8ArrayToBase64(uint8Array: Uint8Array) {
-  const blob = new Blob([uint8Array], { type: 'application/octet-stream' });
-  const dataUrl = await new Promise<string>((resolve) => {
-    const reader = new FileReader();
-    reader.onload = () => resolve(reader.result as string);
-    reader.readAsDataURL(blob);
-  });
-  return dataUrl.split(',')[1];
+  if (typeof window === 'undefined') {
+    // Node executor
+    return Buffer.from(uint8Array).toString('base64');
+  } else {
+    // Browser executor
+    const blob = new Blob([uint8Array], { type: 'application/octet-stream' });
+    const dataUrl = await new Promise<string>((resolve) => {
+      const reader = new FileReader();
+      reader.onload = () => resolve(reader.result as string);
+      reader.readAsDataURL(blob);
+    });
+    return dataUrl.split(',')[1];
+  }
 }
 
 export function base64ToUint8Array(base64: string) {