diff --git a/packages/core/src/GlobalsHelper.ts b/packages/core/src/GlobalsHelper.ts
index d9d4495b545fc922ade2f108e75af64b2b7d0a6e..a6bd825002a9ff02994345a10ad75eec1272cdca 100644
--- a/packages/core/src/GlobalsHelper.ts
+++ b/packages/core/src/GlobalsHelper.ts
@@ -1,7 +1,7 @@
 import { encodingForModel } from "js-tiktoken";
 
-import { randomUUID } from "node:crypto";
 import { Event, EventTag, EventType } from "./callbacks/CallbackManager";
+import { randomUUID } from "./env";
 
 export enum Tokenizers {
   CL100K_BASE = "cl100k_base",
diff --git a/packages/core/src/Node.ts b/packages/core/src/Node.ts
index cf4f66928aba1c2b578f7a978875d5461c620e1d..a588c51a5e58a774913fb6e07cc5d807b7768d95 100644
--- a/packages/core/src/Node.ts
+++ b/packages/core/src/Node.ts
@@ -1,6 +1,7 @@
 import _ from "lodash";
-import { createHash, randomUUID } from "node:crypto";
+import { createHash } from "node:crypto";
 import path from "node:path";
+import { randomUUID } from "./env";
 
 export enum NodeRelationship {
   SOURCE = "SOURCE",
diff --git a/packages/core/src/QueryEngine.ts b/packages/core/src/QueryEngine.ts
index 0c709504baf1d2a6d0e43b219e9c9fde3c9cb15c..790930d712025e8d5ffda32d8b0fb99b147ad088 100644
--- a/packages/core/src/QueryEngine.ts
+++ b/packages/core/src/QueryEngine.ts
@@ -1,4 +1,3 @@
-import { randomUUID } from "node:crypto";
 import { NodeWithScore, TextNode } from "./Node";
 import {
   BaseQuestionGenerator,
@@ -10,6 +9,7 @@ import { BaseRetriever } from "./Retriever";
 import { ServiceContext, serviceContextFromDefaults } from "./ServiceContext";
 import { QueryEngineTool, ToolMetadata } from "./Tool";
 import { Event } from "./callbacks/CallbackManager";
+import { randomUUID } from "./env";
 import { BaseNodePostprocessor } from "./postprocessors";
 import {
   BaseSynthesizer,
diff --git a/packages/core/src/engines/chat/ContextChatEngine.ts b/packages/core/src/engines/chat/ContextChatEngine.ts
index 23500659715bd4572b36bda5fdc58a5b8e62703c..43cdd2af257e5e7d92fef98e3f20e86f16cc8ff1 100644
--- a/packages/core/src/engines/chat/ContextChatEngine.ts
+++ b/packages/core/src/engines/chat/ContextChatEngine.ts
@@ -1,9 +1,9 @@
-import { randomUUID } from "node:crypto";
 import { ChatHistory, getHistory } from "../../ChatHistory";
 import { ContextSystemPrompt } from "../../Prompt";
 import { Response } from "../../Response";
 import { BaseRetriever } from "../../Retriever";
 import { Event } from "../../callbacks/CallbackManager";
+import { randomUUID } from "../../env";
 import { ChatMessage, ChatResponseChunk, LLM, OpenAI } from "../../llm";
 import { MessageContent } from "../../llm/types";
 import { extractText, streamConverter, streamReducer } from "../../llm/utils";
diff --git a/packages/core/src/engines/chat/DefaultContextGenerator.ts b/packages/core/src/engines/chat/DefaultContextGenerator.ts
index ea5604f2cf74076c349ce63ada7429d17f750d5a..b5db4d27b64696cff91faf65c79d0cba64fd468c 100644
--- a/packages/core/src/engines/chat/DefaultContextGenerator.ts
+++ b/packages/core/src/engines/chat/DefaultContextGenerator.ts
@@ -1,8 +1,8 @@
-import { randomUUID } from "node:crypto";
 import { NodeWithScore, TextNode } from "../../Node";
 import { ContextSystemPrompt, defaultContextSystemPrompt } from "../../Prompt";
 import { BaseRetriever } from "../../Retriever";
 import { Event } from "../../callbacks/CallbackManager";
+import { randomUUID } from "../../env";
 import { BaseNodePostprocessor } from "../../postprocessors";
 import { Context, ContextGenerator } from "./types";
 
diff --git a/packages/core/src/env/index.edge-light.ts b/packages/core/src/env/index.edge-light.ts
index e4a6d208b34c01b3f3d5816fb4a9fd53dc154c4e..509d269e82886d40e2fa3ce96517a6a7458ff11a 100644
--- a/packages/core/src/env/index.edge-light.ts
+++ b/packages/core/src/env/index.edge-light.ts
@@ -1 +1,14 @@
 export const EOL = "\n";
+
+export function ok(value: unknown, message?: string): asserts value {
+  if (!value) {
+    const error = Error(message);
+    error.name = "AssertionError";
+    error.message = message ?? "The expression evaluated to a falsy value.";
+    throw error;
+  }
+}
+
+export function randomUUID(): string {
+  return crypto.randomUUID();
+}
diff --git a/packages/core/src/env/index.ts b/packages/core/src/env/index.ts
index ce1ebf0346b0160da0a8a3a6956322a036e0821a..d3759e07bfff0a0fae8ee565fe84b1df245bd057 100644
--- a/packages/core/src/env/index.ts
+++ b/packages/core/src/env/index.ts
@@ -1,3 +1,5 @@
+import { ok } from "node:assert";
+import { randomUUID } from "node:crypto";
 import { EOL } from "node:os";
 
-export { EOL };
+export { EOL, ok, randomUUID };
diff --git a/packages/core/src/indices/BaseIndex.ts b/packages/core/src/indices/BaseIndex.ts
index 98e60ac5d037a779908b4df0374cef1fedf18942..1f0ee6757dd325ac02ad35deca327e5e88f69017 100644
--- a/packages/core/src/indices/BaseIndex.ts
+++ b/packages/core/src/indices/BaseIndex.ts
@@ -1,8 +1,8 @@
-import { randomUUID } from "node:crypto";
 import { BaseNode, Document, jsonToNode } from "../Node";
 import { BaseQueryEngine } from "../QueryEngine";
 import { BaseRetriever } from "../Retriever";
 import { ServiceContext } from "../ServiceContext";
+import { randomUUID } from "../env";
 import { StorageContext } from "../storage/StorageContext";
 import { BaseDocumentStore } from "../storage/docStore/types";
 import { BaseIndexStore } from "../storage/indexStore/types";
diff --git a/packages/core/src/llm/ollama.ts b/packages/core/src/llm/ollama.ts
index 96a9aba4401a0cf4a7ca981925920a22b52ba328..f1e9b3efcd7894e4ea65fe77fd7d59701577fc59 100644
--- a/packages/core/src/llm/ollama.ts
+++ b/packages/core/src/llm/ollama.ts
@@ -1,6 +1,6 @@
-import { ok } from "node:assert";
 import { CallbackManager, Event } from "../callbacks/CallbackManager";
 import { BaseEmbedding } from "../embeddings";
+import { ok } from "../env";
 import {
   ChatMessage,
   ChatResponse,