diff --git a/.changeset/calm-waves-press.md b/.changeset/calm-waves-press.md
new file mode 100644
index 0000000000000000000000000000000000000000..23683988826f935b0cfce73e4d6a65d977faf051
--- /dev/null
+++ b/.changeset/calm-waves-press.md
@@ -0,0 +1,5 @@
+---
+"@llamaindex/tools": patch
+---
+
+fix: crypto is not defined when running on node18
diff --git a/.changeset/nervous-cars-own.md b/.changeset/nervous-cars-own.md
new file mode 100644
index 0000000000000000000000000000000000000000..f4e117f48bd7b75dc6c34fd67ae8c4ee95ee2218
--- /dev/null
+++ b/.changeset/nervous-cars-own.md
@@ -0,0 +1,5 @@
+---
+"@llamaindex/doc": patch
+---
+
+Added documentation for structured output in openai and ollama
diff --git a/.changeset/tidy-waves-play.md b/.changeset/tidy-waves-play.md
new file mode 100644
index 0000000000000000000000000000000000000000..e68ee871e4f194c1683a31fbe4a67b609e13d710
--- /dev/null
+++ b/.changeset/tidy-waves-play.md
@@ -0,0 +1,6 @@
+---
+"@llamaindex/community": patch
+"@llamaindex/google": patch
+---
+
+feat: use google's new gen ai library to support multimodal output
diff --git a/apps/next/src/content/docs/llamaindex/modules/llms/ollama.mdx b/apps/next/src/content/docs/llamaindex/modules/llms/ollama.mdx
index ed3161f2446ddde0f7bf5b4a15e81f5e063d143a..4767d285b52edc91e6b6dea401b2feeb2638e338 100644
--- a/apps/next/src/content/docs/llamaindex/modules/llms/ollama.mdx
+++ b/apps/next/src/content/docs/llamaindex/modules/llms/ollama.mdx
@@ -55,6 +55,35 @@ const results = await queryEngine.query({
 });
 ```
 
+## Using JSON Response Format
+
+You can configure Ollama to return responses in JSON format:
+
+```ts
+import { Ollama } from "@llamaindex/llms/ollama";
+import { z } from "zod";
+
+// Simple JSON format
+const llm = new Ollama({ 
+  model: "llama2", 
+  temperature: 0,
+  responseFormat: { type: "json_object" }
+});
+
+// Using Zod schema for validation
+const responseSchema = z.object({
+  summary: z.string(),
+  topics: z.array(z.string()),
+  sentiment: z.enum(["positive", "negative", "neutral"])
+});
+
+const llm = new Ollama({ 
+  model: "llama2", 
+  temperature: 0,
+  responseFormat: responseSchema  
+});
+```
+
 ## Full Example
 
 ```ts
diff --git a/apps/next/src/content/docs/llamaindex/modules/llms/openai.mdx b/apps/next/src/content/docs/llamaindex/modules/llms/openai.mdx
index a861a3501cbfe28cbf7ef331ca00941221853195..fb14423335dd7bd71696a56768b428925d4045ec 100644
--- a/apps/next/src/content/docs/llamaindex/modules/llms/openai.mdx
+++ b/apps/next/src/content/docs/llamaindex/modules/llms/openai.mdx
@@ -46,6 +46,33 @@ or
 Settings.llm = new OpenAI({ model: "gpt-3.5-turbo", temperature: 0, apiKey: <YOUR_API_KEY>, baseURL: "https://api.scaleway.ai/v1" });
 ```
 
+## Using JSON Response Format
+
+You can configure OpenAI to return responses in JSON format:
+
+```ts
+Settings.llm = new OpenAI({ 
+  model: "gpt-4o", 
+  temperature: 0,
+  responseFormat: { type: "json_object" }  
+});
+
+// You can also use a Zod schema to validate the response structure
+import { z } from "zod";
+
+const responseSchema = z.object({
+  summary: z.string(),  
+  topics: z.array(z.string()),
+  sentiment: z.enum(["positive", "negative", "neutral"])
+});
+
+Settings.llm = new OpenAI({ 
+  model: "gpt-4o", 
+  temperature: 0,
+  responseFormat: responseSchema  
+});
+```
+
 ## Load and index documents
 
 For this example, we will use a single document. In a real-world scenario, you would have multiple documents to index.
diff --git a/packages/community/src/llm/bedrock/amazon/utils.ts b/packages/community/src/llm/bedrock/amazon/utils.ts
index 51833c6ed0458c535ee3c8965df782f120e89362..6fc35813c7b1c977564b8854307c57ac599a4061 100644
--- a/packages/community/src/llm/bedrock/amazon/utils.ts
+++ b/packages/community/src/llm/bedrock/amazon/utils.ts
@@ -10,12 +10,10 @@ import type {
   MessageContentDetail,
   ToolCallLLMMessageOptions,
 } from "@llamaindex/core/llms";
-import {
-  extractDataUrlComponents,
-  mapMessageContentToMessageContentDetails,
-} from "../utils";
+import { extractDataUrlComponents } from "../utils";
 
 import type { JSONObject } from "@llamaindex/core/global";
+import { mapMessageContentToMessageContentDetails } from "../../utils";
 import type { AmazonMessage, AmazonMessages } from "./types";
 
 const ACCEPTED_IMAGE_MIME_TYPES = [
diff --git a/packages/community/src/llm/bedrock/anthropic/utils.ts b/packages/community/src/llm/bedrock/anthropic/utils.ts
index ac841e543c7a805dddf5bdb5f8e6fe9d3f7a1eb7..ba53dedea2d835559e1fa105c9eba8594a10eff3 100644
--- a/packages/community/src/llm/bedrock/anthropic/utils.ts
+++ b/packages/community/src/llm/bedrock/anthropic/utils.ts
@@ -6,10 +6,8 @@ import type {
   MessageContentDetail,
   ToolCallLLMMessageOptions,
 } from "@llamaindex/core/llms";
-import {
-  extractDataUrlComponents,
-  mapMessageContentToMessageContentDetails,
-} from "../utils";
+import { mapMessageContentToMessageContentDetails } from "../../utils";
+import { extractDataUrlComponents } from "../utils";
 import type {
   AnthropicContent,
   AnthropicImageContent,
diff --git a/packages/community/src/llm/bedrock/index.ts b/packages/community/src/llm/bedrock/index.ts
index 1e491247f797093a64cba8e4670de4a949a5a068..f282b443ce04c48f0c9e13aa14db66a4d4838057 100644
--- a/packages/community/src/llm/bedrock/index.ts
+++ b/packages/community/src/llm/bedrock/index.ts
@@ -22,9 +22,9 @@ import {
   type BedrockChatStreamResponse,
   Provider,
 } from "./provider";
-import { mapMessageContentToMessageContentDetails } from "./utils";
 
 import { wrapLLMEvent } from "@llamaindex/core/decorator";
+import { mapMessageContentToMessageContentDetails } from "../utils";
 import { AmazonProvider } from "./amazon/provider";
 import { AnthropicProvider } from "./anthropic/provider";
 import { MetaProvider } from "./meta/provider";
diff --git a/packages/community/src/llm/bedrock/utils.ts b/packages/community/src/llm/bedrock/utils.ts
index 9e90c14dd85ccd8ee4cb21b68bf5bf94e1cc8779..b60bc8257eeb4bb15dc0cea0970e74a72bf6092d 100644
--- a/packages/community/src/llm/bedrock/utils.ts
+++ b/packages/community/src/llm/bedrock/utils.ts
@@ -1,14 +1,3 @@
-import type {
-  MessageContent,
-  MessageContentDetail,
-} from "@llamaindex/core/llms";
-
-export const mapMessageContentToMessageContentDetails = (
-  content: MessageContent,
-): MessageContentDetail[] => {
-  return Array.isArray(content) ? content : [{ type: "text", text: content }];
-};
-
 export const toUtf8 = (input: Uint8Array): string =>
   new TextDecoder("utf-8").decode(input);
 
diff --git a/packages/community/src/llm/utils.ts b/packages/community/src/llm/utils.ts
new file mode 100644
index 0000000000000000000000000000000000000000..b375a32b3438610bbe5d20eda4fa3d3b3db1f9cf
--- /dev/null
+++ b/packages/community/src/llm/utils.ts
@@ -0,0 +1,10 @@
+import type {
+  MessageContent,
+  MessageContentDetail,
+} from "@llamaindex/core/llms";
+
+export const mapMessageContentToMessageContentDetails = (
+  content: MessageContent,
+): MessageContentDetail[] => {
+  return Array.isArray(content) ? content : [{ type: "text", text: content }];
+};
diff --git a/packages/providers/google/package.json b/packages/providers/google/package.json
index 664f2dfad5ca7eea9b07bdb2407d3349960e5266..b67f7936fefcfe995cc6ead7ee2a65eb11a435d4 100644
--- a/packages/providers/google/package.json
+++ b/packages/providers/google/package.json
@@ -34,6 +34,7 @@
   },
   "dependencies": {
     "@google-cloud/vertexai": "1.9.0",
+    "@google/genai": "^0.4.0",
     "@google/generative-ai": "0.21.0",
     "@llamaindex/core": "workspace:*",
     "@llamaindex/env": "workspace:*"
diff --git a/packages/providers/google/src/base.ts b/packages/providers/google/src/base.ts
index ea5eb40599307f5ec4cf3429cefde0799d39f261..2e074a69445401c157f81d8eda27bfd06af8e68d 100644
--- a/packages/providers/google/src/base.ts
+++ b/packages/providers/google/src/base.ts
@@ -63,7 +63,7 @@ export const GEMINI_MODEL_INFO_MAP: Record<GEMINI_MODEL, GeminiModelInfo> = {
   [GEMINI_MODEL.GEMINI_2_0_PRO_EXPERIMENTAL]: { contextWindow: 2 * 10 ** 6 },
 };
 
-const SUPPORT_TOOL_CALL_MODELS: GEMINI_MODEL[] = [
+export const SUPPORT_TOOL_CALL_MODELS: GEMINI_MODEL[] = [
   GEMINI_MODEL.GEMINI_PRO,
   GEMINI_MODEL.GEMINI_PRO_VISION,
   GEMINI_MODEL.GEMINI_PRO_1_5_PRO_PREVIEW,
@@ -79,7 +79,7 @@ const SUPPORT_TOOL_CALL_MODELS: GEMINI_MODEL[] = [
   GEMINI_MODEL.GEMINI_2_0_PRO_EXPERIMENTAL,
 ];
 
-const DEFAULT_GEMINI_PARAMS = {
+export const DEFAULT_GEMINI_PARAMS = {
   model: GEMINI_MODEL.GEMINI_PRO,
   temperature: 0.1,
   topP: 1,
diff --git a/packages/providers/google/src/index.ts b/packages/providers/google/src/index.ts
index 64e1b16e1327a34c0e156d03e1bc7c65f031124c..202d496e497785e581dc7a311b8e6d40a4cd6789 100644
--- a/packages/providers/google/src/index.ts
+++ b/packages/providers/google/src/index.ts
@@ -3,4 +3,10 @@ export * from "./types";
 export * from "./utils";
 export * from "./vertex";
 
+export {
+  GoogleStudio,
+  Modality,
+  getGoogleStudioInlineData,
+} from "./studio/index.js";
+
 export * from "./GeminiEmbedding";
diff --git a/packages/providers/google/src/studio/index.ts b/packages/providers/google/src/studio/index.ts
new file mode 100644
index 0000000000000000000000000000000000000000..b7f2301b8ca63996a9cb8452c91e2ee9b21d863c
--- /dev/null
+++ b/packages/providers/google/src/studio/index.ts
@@ -0,0 +1,262 @@
+import {
+  GenerateContentResponse,
+  GoogleGenAI,
+  Modality,
+  type Blob,
+  type GenerateContentConfig,
+  type GoogleGenAIOptions,
+} from "@google/genai";
+import {
+  ToolCallLLM,
+  type ChatResponse,
+  type ChatResponseChunk,
+  type CompletionResponse,
+  type LLMChatParamsNonStreaming,
+  type LLMChatParamsStreaming,
+  type LLMCompletionParamsNonStreaming,
+  type LLMCompletionParamsStreaming,
+  type LLMMetadata,
+  type ToolCall,
+  type ToolCallLLMMessageOptions,
+} from "@llamaindex/core/llms";
+export { Modality };
+
+import { streamConverter } from "@llamaindex/core/utils";
+
+import { wrapLLMEvent } from "@llamaindex/core/decorator";
+import type { JSONObject } from "@llamaindex/core/global";
+import { DEFAULT_GEMINI_PARAMS, SUPPORT_TOOL_CALL_MODELS } from "../base";
+import type { GEMINI_MODEL } from "../types";
+import {
+  mapChatMessagesToGoogleFunctions,
+  mapChatMessagesToGoogleMessages,
+  mapMessageContentDetailToGooglePart,
+  mapMessageContentToMessageContentDetails,
+} from "./utils";
+
+export type GoogleAdditionalChatOptions = { config: GenerateContentConfig };
+
+export type GoogleChatStreamResponse = AsyncIterable<
+  ChatResponseChunk<
+    ToolCallLLMMessageOptions & {
+      data?: Blob[];
+    }
+  >
+>;
+
+export type GoogleChatParamsStreaming = LLMChatParamsStreaming<
+  GoogleAdditionalChatOptions,
+  ToolCallLLMMessageOptions
+>;
+
+export type GoogleChatParamsNonStreaming = LLMChatParamsNonStreaming<
+  GoogleAdditionalChatOptions,
+  ToolCallLLMMessageOptions
+>;
+
+export type GoogleChatNonStreamResponse =
+  ChatResponse<ToolCallLLMMessageOptions>;
+
+export const getGoogleStudioInlineData = (
+  response: GenerateContentResponse,
+): Blob[] => {
+  return response.candidates
+    ?.flatMap((candidate) => candidate.content?.parts)
+    .map((part) => part?.inlineData)
+    .filter((data) => data) as Blob[];
+};
+
+export type GoogleModelParams = {
+  model: GEMINI_MODEL;
+  temperature?: number;
+  topP?: number;
+  maxTokens?: number;
+};
+
+export type GoogleParams = GoogleGenAIOptions & GoogleModelParams;
+
+export class GoogleStudio extends ToolCallLLM<GoogleAdditionalChatOptions> {
+  client: GoogleGenAI;
+  model: GEMINI_MODEL;
+  temperature: number;
+  topP: number;
+  maxTokens?: number | undefined;
+  topK?: number;
+
+  constructor({
+    temperature,
+    topP,
+    maxTokens,
+    model,
+    ...params
+  }: GoogleParams) {
+    super();
+    this.model = model;
+    this.maxTokens = maxTokens ?? DEFAULT_GEMINI_PARAMS.maxTokens;
+    this.temperature = temperature ?? DEFAULT_GEMINI_PARAMS.temperature;
+    this.topP = topP ?? DEFAULT_GEMINI_PARAMS.topP;
+    this.client = new GoogleGenAI(params);
+  }
+
+  get supportToolCall(): boolean {
+    return SUPPORT_TOOL_CALL_MODELS.includes(this.model);
+  }
+
+  get metadata(): LLMMetadata {
+    return {
+      model: this.model,
+      temperature: this.temperature,
+      topP: this.topP,
+      maxTokens: this.maxTokens,
+      contextWindow: 128000,
+      tokenizer: undefined,
+      structuredOutput: false,
+    };
+  }
+
+  getToolCallsFromResponse(response: GenerateContentResponse): ToolCall[] {
+    if (!response.functionCalls) return [];
+    return response.functionCalls.map((call) => ({
+      id: call.id ?? "",
+      name: call.name ?? "",
+      input: call.args as JSONObject,
+    }));
+  }
+
+  protected async nonStreamChat(
+    params: GoogleChatParamsNonStreaming,
+  ): Promise<GoogleChatNonStreamResponse> {
+    if (!this.supportToolCall && params.tools?.length) {
+      console.warn(`The model "${this.model}" doesn't support ToolCall`);
+    }
+
+    const config: GenerateContentConfig =
+      params.additionalChatOptions?.config ?? {};
+    if (params.tools?.length) {
+      if (config.responseModalities?.includes(Modality.IMAGE)) {
+        console.warn("Tools are currently not supported with Modality.IMAGE");
+      } else {
+        config.tools = mapChatMessagesToGoogleFunctions(params.tools);
+      }
+    }
+    const response = await this.client.models.generateContent({
+      model: this.model,
+      contents: mapChatMessagesToGoogleMessages(params.messages),
+      config,
+    });
+
+    if (this.supportToolCall) {
+      const tools = this.getToolCallsFromResponse(response);
+      if (tools.length) {
+        return {
+          raw: response,
+          message: {
+            role: "assistant",
+            content: "",
+            options: { toolCall: tools },
+          },
+        };
+      }
+    }
+    return {
+      raw: response,
+      message: {
+        role: "assistant",
+        content: response.text ?? "",
+        options: {
+          inlineData: getGoogleStudioInlineData(response),
+        },
+      },
+    };
+  }
+
+  protected async *streamChat(
+    params: GoogleChatParamsStreaming,
+  ): GoogleChatStreamResponse {
+    if (!this.supportToolCall && params.tools?.length) {
+      console.warn(`The model "${this.model}" doesn't support ToolCall`);
+    }
+    const config: GenerateContentConfig =
+      params.additionalChatOptions?.config ?? {};
+    if (params.tools?.length) {
+      if (config.responseModalities?.includes(Modality.IMAGE)) {
+        console.warn("Tools are currently not supported with Modality.IMAGE");
+      } else {
+        config.tools = mapChatMessagesToGoogleFunctions(params.tools);
+      }
+    }
+    const response = await this.client.models.generateContentStream({
+      model: this.model,
+      contents: mapChatMessagesToGoogleMessages(params.messages),
+      config,
+    });
+    yield* streamConverter(response, (response) => {
+      if (response.functionCalls?.length) {
+        return {
+          delta: "",
+          raw: response,
+          options: {
+            toolCall: this.getToolCallsFromResponse(response),
+          },
+        };
+      }
+
+      return {
+        delta: response.text ?? "",
+        raw: response,
+        options: {
+          inlineData: getGoogleStudioInlineData(response),
+        },
+      };
+    });
+  }
+
+  chat(params: GoogleChatParamsStreaming): Promise<GoogleChatStreamResponse>;
+  chat(
+    params: GoogleChatParamsNonStreaming,
+  ): Promise<GoogleChatNonStreamResponse>;
+  @wrapLLMEvent
+  async chat(
+    params: GoogleChatParamsStreaming | GoogleChatParamsNonStreaming,
+  ): Promise<GoogleChatStreamResponse | GoogleChatNonStreamResponse> {
+    if (params.stream) {
+      return this.streamChat(params);
+    }
+    return this.nonStreamChat(params);
+  }
+
+  complete(
+    params: LLMCompletionParamsStreaming,
+  ): Promise<AsyncIterable<CompletionResponse>>;
+  complete(
+    params: LLMCompletionParamsNonStreaming,
+  ): Promise<CompletionResponse>;
+  async complete(
+    params: LLMCompletionParamsStreaming | LLMCompletionParamsNonStreaming,
+  ): Promise<CompletionResponse | AsyncIterable<CompletionResponse>> {
+    const contents = mapMessageContentToMessageContentDetails(
+      params.prompt,
+    ).map(mapMessageContentDetailToGooglePart);
+    if (params.stream) {
+      const response = await this.client.models.generateContentStream({
+        model: this.model,
+        contents,
+      });
+      return streamConverter(response, (response) => {
+        return {
+          text: response.text ?? "",
+          raw: response,
+        };
+      });
+    }
+    const response = await this.client.models.generateContent({
+      model: this.model,
+      contents,
+    });
+
+    return {
+      text: response.text || "",
+      raw: response,
+    };
+  }
+}
diff --git a/packages/providers/google/src/studio/utils.ts b/packages/providers/google/src/studio/utils.ts
new file mode 100644
index 0000000000000000000000000000000000000000..924bdb7c3dd653f018be65157b10dedcb79e5203
--- /dev/null
+++ b/packages/providers/google/src/studio/utils.ts
@@ -0,0 +1,136 @@
+import type {
+  ContentListUnion,
+  ContentUnion,
+  Part,
+  Schema,
+  ToolListUnion,
+} from "@google/genai";
+import type {
+  BaseTool,
+  ChatMessage,
+  MessageContentDetail,
+  ToolCallLLMMessageOptions,
+} from "@llamaindex/core/llms";
+import { extractDataUrlComponents } from "@llamaindex/core/utils";
+
+import type { MessageContent } from "@llamaindex/core/llms";
+
+export const mapMessageContentToMessageContentDetails = (
+  content: MessageContent,
+): MessageContentDetail[] => {
+  return Array.isArray(content) ? content : [{ type: "text", text: content }];
+};
+
+const ACCEPTED_IMAGE_MIME_TYPES = ["image/jpeg", "image/png"];
+
+export const mapTextPart = (text: string): Part => {
+  return { text };
+};
+
+export const mapImagePart = (imageUrl: string): Part => {
+  if (!imageUrl.startsWith("data:"))
+    throw new Error(
+      "For Google please only use base64 data url, e.g.: data:image/jpeg;base64,SGVsbG8sIFdvcmxkIQ==",
+    );
+  const { mimeType, base64: data } = extractDataUrlComponents(imageUrl);
+  if (!ACCEPTED_IMAGE_MIME_TYPES.includes(mimeType))
+    throw new Error(
+      `Anthropic only accepts the following mimeTypes: ${ACCEPTED_IMAGE_MIME_TYPES.join("\n")}`,
+    );
+
+  return {
+    inlineData: {
+      mimeType,
+      data,
+    },
+  };
+};
+
+export const mapMessageContentDetailToGooglePart = <
+  T extends MessageContentDetail,
+>(
+  detail: T,
+): Part => {
+  let part: Part;
+
+  if (detail.type === "text") {
+    part = mapTextPart(detail.text);
+  } else if (detail.type === "image_url") {
+    part = mapImagePart(detail.image_url.url);
+  } else {
+    throw new Error("Unsupported content detail type");
+  }
+  return part;
+};
+export const mapChatMessagesToGoogleFunctions = (
+  tools: BaseTool[],
+): ToolListUnion => {
+  return [
+    {
+      functionDeclarations: tools.map((tool) => ({
+        response: tool.metadata.parameters as Schema,
+        description: tool.metadata.description,
+        name: tool.metadata.name,
+      })),
+    },
+  ];
+};
+
+export const mapChatMessagesToGoogleMessages = <
+  T extends ChatMessage<ToolCallLLMMessageOptions>,
+>(
+  messages: T[],
+): ContentListUnion => {
+  const functionNames: Record<string, string> = {};
+  messages.forEach((msg: T) => {
+    if (msg.options && "toolCall" in msg.options) {
+      const mapped = msg.options.toolCall.reduce(
+        (result, item) => {
+          result[item.id] = item.name;
+          return result;
+        },
+        {} as Record<string, string>,
+      );
+
+      Object.assign(functionNames, mapped);
+    }
+  });
+  return messages.flatMap((msg: T): ContentListUnion => {
+    if (msg.options && "toolResult" in msg.options) {
+      return {
+        role: "user",
+        parts: [
+          {
+            functionResponse: {
+              name: functionNames[msg.options.toolResult.id] ?? "",
+              response: msg.options.toolResult,
+            },
+          },
+        ],
+      };
+    }
+
+    if (msg.options && "toolCall" in msg.options) {
+      return {
+        role: "model",
+        parts: msg.options.toolCall.map((call) => ({
+          functionCall: {
+            name: call.name,
+            args: call.input as Record<string, unknown>,
+          },
+        })),
+      };
+    }
+    return mapMessageContentToMessageContentDetails(msg.content)
+      .map((detail: MessageContentDetail): ContentUnion | null => {
+        const part = mapMessageContentDetailToGooglePart(detail);
+        if (!part.text) return null;
+
+        return {
+          role: msg.role === "assistant" ? "model" : "user",
+          parts: [part],
+        };
+      })
+      .filter((content) => content) as ContentUnion;
+  });
+};
diff --git a/packages/tools/src/tools/img-gen.ts b/packages/tools/src/tools/img-gen.ts
index b46de53d338fde6d85017acc3db91459745fd3e7..5606610b64d5dfc6eccc9d23bd9c92dd33e91a40 100644
--- a/packages/tools/src/tools/img-gen.ts
+++ b/packages/tools/src/tools/img-gen.ts
@@ -1,4 +1,5 @@
 import { tool } from "@llamaindex/core/tools";
+import { randomUUID } from "@llamaindex/env";
 import { FormData } from "formdata-node";
 import got from "got";
 import path from "path";
@@ -36,7 +37,7 @@ export const imageGenerator = (params: ImgGeneratorToolParams) => {
 
       try {
         const buffer = await promptToImgBuffer(prompt, apiKey, outputFormat);
-        const filename = `${crypto.randomUUID()}.${outputFormat}`;
+        const filename = `${randomUUID()}.${outputFormat}`;
         const filePath = path.join(outputDir, filename);
         await saveDocument(filePath, buffer);
         const imageUrl = getFileUrl(filePath, { fileServerURLPrefix });
diff --git a/packages/tools/src/tools/interpreter.ts b/packages/tools/src/tools/interpreter.ts
index 364cdf6f425dc65c9acab0126717b37b28c88f85..316690b8b25d6581d923de5c2905c26ba1feb824 100644
--- a/packages/tools/src/tools/interpreter.ts
+++ b/packages/tools/src/tools/interpreter.ts
@@ -1,5 +1,6 @@
 import { type Logs, Result, Sandbox } from "@e2b/code-interpreter";
 import { tool } from "@llamaindex/core/tools";
+import { randomUUID } from "@llamaindex/env";
 import fs from "fs";
 import path from "node:path";
 import { z } from "zod";
@@ -153,7 +154,7 @@ async function getExtraResult(
 }
 
 async function saveToDisk(outputDir: string, base64Data: string, ext: string) {
-  const filename = `${crypto.randomUUID()}.${ext}`;
+  const filename = `${randomUUID()}.${ext}`;
   const buffer = Buffer.from(base64Data, "base64");
   const filePath = path.join(outputDir, filename);
   await saveDocument(filePath, buffer);
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index c417c04f057b36696c0b45e8dcf41803a92d1e1d..49b5087ce16a5060eaf4ccfa476f220f9d804301 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -119,7 +119,7 @@ importers:
         version: 1.6.0(@aws-sdk/credential-provider-web-identity@3.744.0)
       ai:
         specifier: ^3.4.33
-        version: 3.4.33(openai@4.86.0(ws@8.18.0(bufferutil@4.0.9))(zod@3.24.2))(react@19.0.0)(sswr@2.1.0(svelte@5.19.10))(svelte@5.19.10)(vue@3.5.13(typescript@5.7.3))(zod@3.24.2)
+        version: 3.4.33(openai@4.86.0(zod@3.24.2))(react@19.0.0)(sswr@2.1.0(svelte@5.19.10))(svelte@5.19.10)(vue@3.5.13(typescript@5.7.3))(zod@3.24.2)
       class-variance-authority:
         specifier: ^0.7.0
         version: 0.7.1
@@ -791,7 +791,7 @@ importers:
         version: 2.10.2(@types/react@19.0.10)(react@19.0.0)
       openai:
         specifier: ^4
-        version: 4.83.0(ws@8.18.0(bufferutil@4.0.9))(zod@3.24.2)
+        version: 4.83.0(ws@8.18.0)(zod@3.24.2)
       typedoc:
         specifier: ^0.26.11
         version: 0.26.11(typescript@5.7.3)
@@ -843,7 +843,7 @@ importers:
         version: link:../../../llamaindex
       openai:
         specifier: ^4.73.1
-        version: 4.83.0(ws@8.18.0(bufferutil@4.0.9))(zod@3.24.2)
+        version: 4.83.0(ws@8.18.0)(zod@3.24.2)
     devDependencies:
       tsx:
         specifier: ^4.19.3
@@ -1190,6 +1190,9 @@ importers:
       '@google-cloud/vertexai':
         specifier: 1.9.0
         version: 1.9.0
+      '@google/genai':
+        specifier: ^0.4.0
+        version: 0.4.0(bufferutil@4.0.9)
       '@google/generative-ai':
         specifier: 0.21.0
         version: 0.21.0
@@ -1328,7 +1331,7 @@ importers:
         version: link:../../env
       openai:
         specifier: ^4.86.0
-        version: 4.86.0(ws@8.18.0(bufferutil@4.0.9))(zod@3.24.2)
+        version: 4.86.0(ws@8.18.0)(zod@3.24.2)
       zod:
         specifier: ^3.24.2
         version: 3.24.2
@@ -1451,7 +1454,7 @@ importers:
         version: link:../../../env
       chromadb:
         specifier: 1.10.3
-        version: 1.10.3(cohere-ai@7.14.0)(openai@4.86.0(ws@8.18.0(bufferutil@4.0.9))(zod@3.24.2))(voyageai@0.0.3-1)
+        version: 1.10.3(cohere-ai@7.14.0)(openai@4.86.0)(voyageai@0.0.3-1)
       chromadb-default-embed:
         specifier: ^2.13.2
         version: 2.13.2
@@ -1725,64 +1728,6 @@ importers:
         specifier: ^13.4.8
         version: 13.4.8
 
-  packages/server:
-    dependencies:
-      '@llamaindex/chat-ui':
-        specifier: 0.3.1
-        version: 0.3.1(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
-      ai:
-        specifier: ^4.0.3
-        version: 4.1.34(react@19.0.0)(zod@3.24.2)
-      dotenv:
-        specifier: ^16.4.7
-        version: 16.4.7
-      llamaindex:
-        specifier: workspace:*
-        version: link:../llamaindex
-      next:
-        specifier: 15.2.3
-        version: 15.2.3(@opentelemetry/api@1.9.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
-      react:
-        specifier: ^19.0.0
-        version: 19.0.0
-      react-dom:
-        specifier: ^19.0.0
-        version: 19.0.0(react@19.0.0)
-    devDependencies:
-      '@eslint/eslintrc':
-        specifier: ^3
-        version: 3.3.0
-      '@tailwindcss/postcss':
-        specifier: ^4
-        version: 4.0.9
-      '@types/node':
-        specifier: ^22.9.0
-        version: 22.9.0
-      '@types/react':
-        specifier: ^19
-        version: 19.0.10
-      '@types/react-dom':
-        specifier: ^19
-        version: 19.0.4(@types/react@19.0.10)
-      bunchee:
-        specifier: 6.4.0
-        version: 6.4.0(typescript@5.7.3)
-      eslint:
-        specifier: ^9
-        version: 9.22.0(jiti@2.4.2)
-      eslint-config-next:
-        specifier: 15.2.3
-        version: 15.2.3(eslint@9.22.0(jiti@2.4.2))(typescript@5.7.3)
-      tailwindcss:
-        specifier: ^4
-        version: 4.0.9
-      tsx:
-        specifier: ^4.19.3
-        version: 4.19.3
-      vitest:
-        specifier: ^2.1.5
-        version: 2.1.5(@edge-runtime/vm@4.0.4)(@types/node@22.9.0)(happy-dom@15.11.7)(lightningcss@1.29.1)(msw@2.7.0(@types/node@22.9.0)(typescript@5.7.3))(terser@5.38.2)
-
   packages/tools:
     dependencies:
       '@apidevtools/swagger-parser':
@@ -3310,6 +3255,10 @@ packages:
     resolution: {integrity: sha512-8brlcJwFXI4fPuBtsDNQqCdWZmz8gV9jeEKOU0vc5H2SjehCQpXK/NwuSEr916zbhlBHtg/sU37qQQdgvh5BRA==}
     engines: {node: '>=18.0.0'}
 
+  '@google/genai@0.4.0':
+    resolution: {integrity: sha512-u9KHoIDbnUi6GpH6mtkZjdeVy3FXI0Hfvl5QWZyYPBttXWaJ13Q4OXE+8zynbHvvGh4XUaH5fBvzsuNLQqB+qQ==}
+    engines: {node: '>=18.0.0'}
+
   '@google/generative-ai@0.21.0':
     resolution: {integrity: sha512-7XhUbtnlkSEZK15kN3t+tzIMxsbKm/dSkKBFalj+20NvPKe1kBY7mR2P7vuijEn+f06z5+A8bVGKO0v39cr6Wg==}
     engines: {node: '>=18.0.0'}
@@ -3637,11 +3586,6 @@ packages:
     peerDependencies:
       react: ^18.2.0 || ^19.0.0 || ^19.0.0-rc
 
-  '@llamaindex/chat-ui@0.3.1':
-    resolution: {integrity: sha512-sF6axN9LviewAxvBbqkF3u3K0yvIt74prio7uiVruFVT/AYkRlIk721QXTPBscf+ZvyzAqjh0Nx0BoGiZUzBCw==}
-    peerDependencies:
-      react: ^18.2.0 || ^19.0.0 || ^19.0.0-rc
-
   '@llamaindex/pdf-viewer@1.3.0':
     resolution: {integrity: sha512-HJtjzmxn+erb3Vq89W5atPq0q6uyZMMCgzOnmstxudzaHW/Yj1dp1ojCuBh/wlP1tUnIRoe9RmvC0ahmqSwRUA==}
     peerDependencies:
@@ -3792,15 +3736,9 @@ packages:
   '@next/env@15.2.1':
     resolution: {integrity: sha512-JmY0qvnPuS2NCWOz2bbby3Pe0VzdAQ7XpEB6uLIHmtXNfAsAO0KLQLkuAoc42Bxbo3/jMC3dcn9cdf+piCcG2Q==}
 
-  '@next/env@15.2.3':
-    resolution: {integrity: sha512-a26KnbW9DFEUsSxAxKBORR/uD9THoYoKbkpFywMN/AFvboTt94b8+g/07T8J6ACsdLag8/PDU60ov4rPxRAixw==}
-
   '@next/eslint-plugin-next@15.1.0':
     resolution: {integrity: sha512-+jPT0h+nelBT6HC9ZCHGc7DgGVy04cv4shYdAe6tKlEbjQUtwU3LzQhzbDHQyY2m6g39m6B0kOFVuLGBrxxbGg==}
 
-  '@next/eslint-plugin-next@15.2.3':
-    resolution: {integrity: sha512-eNSOIMJtjs+dp4Ms1tB1PPPJUQHP3uZK+OQ7iFY9qXpGO6ojT6imCL+KcUOqE/GXGidWbBZJzYdgAdPHqeCEPA==}
-
   '@next/swc-darwin-arm64@15.2.0':
     resolution: {integrity: sha512-rlp22GZwNJjFCyL7h5wz9vtpBVuCt3ZYjFWpEPBGzG712/uL1bbSkS675rVAUCRZ4hjoTJ26Q7IKhr5DfJrHDA==}
     engines: {node: '>= 10'}
@@ -3813,12 +3751,6 @@ packages:
     cpu: [arm64]
     os: [darwin]
 
-  '@next/swc-darwin-arm64@15.2.3':
-    resolution: {integrity: sha512-uaBhA8aLbXLqwjnsHSkxs353WrRgQgiFjduDpc7YXEU0B54IKx3vU+cxQlYwPCyC8uYEEX7THhtQQsfHnvv8dw==}
-    engines: {node: '>= 10'}
-    cpu: [arm64]
-    os: [darwin]
-
   '@next/swc-darwin-x64@15.2.0':
     resolution: {integrity: sha512-DiU85EqSHogCz80+sgsx90/ecygfCSGl5P3b4XDRVZpgujBm5lp4ts7YaHru7eVTyZMjHInzKr+w0/7+qDrvMA==}
     engines: {node: '>= 10'}
@@ -3831,12 +3763,6 @@ packages:
     cpu: [x64]
     os: [darwin]
 
-  '@next/swc-darwin-x64@15.2.3':
-    resolution: {integrity: sha512-pVwKvJ4Zk7h+4hwhqOUuMx7Ib02u3gDX3HXPKIShBi9JlYllI0nU6TWLbPT94dt7FSi6mSBhfc2JrHViwqbOdw==}
-    engines: {node: '>= 10'}
-    cpu: [x64]
-    os: [darwin]
-
   '@next/swc-linux-arm64-gnu@15.2.0':
     resolution: {integrity: sha512-VnpoMaGukiNWVxeqKHwi8MN47yKGyki5q+7ql/7p/3ifuU2341i/gDwGK1rivk0pVYbdv5D8z63uu9yMw0QhpQ==}
     engines: {node: '>= 10'}
@@ -3849,12 +3775,6 @@ packages:
     cpu: [arm64]
     os: [linux]
 
-  '@next/swc-linux-arm64-gnu@15.2.3':
-    resolution: {integrity: sha512-50ibWdn2RuFFkOEUmo9NCcQbbV9ViQOrUfG48zHBCONciHjaUKtHcYFiCwBVuzD08fzvzkWuuZkd4AqbvKO7UQ==}
-    engines: {node: '>= 10'}
-    cpu: [arm64]
-    os: [linux]
-
   '@next/swc-linux-arm64-musl@15.2.0':
     resolution: {integrity: sha512-ka97/ssYE5nPH4Qs+8bd8RlYeNeUVBhcnsNUmFM6VWEob4jfN9FTr0NBhXVi1XEJpj3cMfgSRW+LdE3SUZbPrw==}
     engines: {node: '>= 10'}
@@ -3867,12 +3787,6 @@ packages:
     cpu: [arm64]
     os: [linux]
 
-  '@next/swc-linux-arm64-musl@15.2.3':
-    resolution: {integrity: sha512-2gAPA7P652D3HzR4cLyAuVYwYqjG0mt/3pHSWTCyKZq/N/dJcUAEoNQMyUmwTZWCJRKofB+JPuDVP2aD8w2J6Q==}
-    engines: {node: '>= 10'}
-    cpu: [arm64]
-    os: [linux]
-
   '@next/swc-linux-x64-gnu@15.2.0':
     resolution: {integrity: sha512-zY1JduE4B3q0k2ZCE+DAF/1efjTXUsKP+VXRtrt/rJCTgDlUyyryx7aOgYXNc1d8gobys/Lof9P9ze8IyRDn7Q==}
     engines: {node: '>= 10'}
@@ -3885,12 +3799,6 @@ packages:
     cpu: [x64]
     os: [linux]
 
-  '@next/swc-linux-x64-gnu@15.2.3':
-    resolution: {integrity: sha512-ODSKvrdMgAJOVU4qElflYy1KSZRM3M45JVbeZu42TINCMG3anp7YCBn80RkISV6bhzKwcUqLBAmOiWkaGtBA9w==}
-    engines: {node: '>= 10'}
-    cpu: [x64]
-    os: [linux]
-
   '@next/swc-linux-x64-musl@15.2.0':
     resolution: {integrity: sha512-QqvLZpurBD46RhaVaVBepkVQzh8xtlUN00RlG4Iq1sBheNugamUNPuZEH1r9X1YGQo1KqAe1iiShF0acva3jHQ==}
     engines: {node: '>= 10'}
@@ -3903,12 +3811,6 @@ packages:
     cpu: [x64]
     os: [linux]
 
-  '@next/swc-linux-x64-musl@15.2.3':
-    resolution: {integrity: sha512-ZR9kLwCWrlYxwEoytqPi1jhPd1TlsSJWAc+H/CJHmHkf2nD92MQpSRIURR1iNgA/kuFSdxB8xIPt4p/T78kwsg==}
-    engines: {node: '>= 10'}
-    cpu: [x64]
-    os: [linux]
-
   '@next/swc-win32-arm64-msvc@15.2.0':
     resolution: {integrity: sha512-ODZ0r9WMyylTHAN6pLtvUtQlGXBL9voljv6ujSlcsjOxhtXPI1Ag6AhZK0SE8hEpR1374WZZ5w33ChpJd5fsjw==}
     engines: {node: '>= 10'}
@@ -3921,12 +3823,6 @@ packages:
     cpu: [arm64]
     os: [win32]
 
-  '@next/swc-win32-arm64-msvc@15.2.3':
-    resolution: {integrity: sha512-+G2FrDcfm2YDbhDiObDU/qPriWeiz/9cRR0yMWJeTLGGX6/x8oryO3tt7HhodA1vZ8r2ddJPCjtLcpaVl7TE2Q==}
-    engines: {node: '>= 10'}
-    cpu: [arm64]
-    os: [win32]
-
   '@next/swc-win32-x64-msvc@15.2.0':
     resolution: {integrity: sha512-8+4Z3Z7xa13NdUuUAcpVNA6o76lNPniBd9Xbo02bwXQXnZgFvEopwY2at5+z7yHl47X9qbZpvwatZ2BRo3EdZw==}
     engines: {node: '>= 10'}
@@ -3939,12 +3835,6 @@ packages:
     cpu: [x64]
     os: [win32]
 
-  '@next/swc-win32-x64-msvc@15.2.3':
-    resolution: {integrity: sha512-gHYS9tc+G2W0ZC8rBL+H6RdtXIyk40uLiaos0yj5US85FNhbFEndMA2nW3z47nzOWiSvXTZ5kBClc3rD0zJg0w==}
-    engines: {node: '>= 10'}
-    cpu: [x64]
-    os: [win32]
-
   '@nodelib/fs.scandir@2.1.5':
     resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==}
     engines: {node: '>= 8'}
@@ -7232,15 +7122,6 @@ packages:
       typescript:
         optional: true
 
-  eslint-config-next@15.2.3:
-    resolution: {integrity: sha512-VDQwbajhNMFmrhLWVyUXCqsGPN+zz5G8Ys/QwFubfsxTIrkqdx3N3x3QPW+pERz8bzGPP0IgEm8cNbZcd8PFRQ==}
-    peerDependencies:
-      eslint: ^7.23.0 || ^8.0.0 || ^9.0.0
-      typescript: '>=3.3.1'
-    peerDependenciesMeta:
-      typescript:
-        optional: true
-
   eslint-config-prettier@9.1.0:
     resolution: {integrity: sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==}
     hasBin: true
@@ -9654,27 +9535,6 @@ packages:
       sass:
         optional: true
 
-  next@15.2.3:
-    resolution: {integrity: sha512-x6eDkZxk2rPpu46E1ZVUWIBhYCLszmUY6fvHBFcbzJ9dD+qRX6vcHusaqqDlnY+VngKzKbAiG2iRCkPbmi8f7w==}
-    engines: {node: ^18.18.0 || ^19.8.0 || >= 20.0.0}
-    hasBin: true
-    peerDependencies:
-      '@opentelemetry/api': ^1.1.0
-      '@playwright/test': ^1.41.2
-      babel-plugin-react-compiler: '*'
-      react: ^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0
-      react-dom: ^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0
-      sass: ^1.3.0
-    peerDependenciesMeta:
-      '@opentelemetry/api':
-        optional: true
-      '@playwright/test':
-        optional: true
-      babel-plugin-react-compiler:
-        optional: true
-      sass:
-        optional: true
-
   nice-grpc-client-middleware-retry@3.1.9:
     resolution: {integrity: sha512-BgbsNjuppxD6hoeCfO5gkBA/G69Tq5d9QX35QLdA46NSjKllelC+FlcgSPMlO9VQKCAPDfp4zzzDJZTNtbvzVw==}
 
@@ -14196,6 +14056,16 @@ snapshots:
       - encoding
       - supports-color
 
+  '@google/genai@0.4.0(bufferutil@4.0.9)':
+    dependencies:
+      google-auth-library: 9.15.1
+      ws: 8.18.0(bufferutil@4.0.9)
+    transitivePeerDependencies:
+      - bufferutil
+      - encoding
+      - supports-color
+      - utf-8-validate
+
   '@google/generative-ai@0.21.0': {}
 
   '@graphql-typed-document-node/core@3.2.0(graphql@16.10.0)':
@@ -14564,36 +14434,6 @@ snapshots:
       - react-dom
       - supports-color
 
-  '@llamaindex/chat-ui@0.3.1(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)':
-    dependencies:
-      '@llamaindex/pdf-viewer': 1.3.0(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
-      '@radix-ui/react-collapsible': 1.1.3(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
-      '@radix-ui/react-hover-card': 1.1.6(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
-      '@radix-ui/react-icons': 1.3.2(react@19.0.0)
-      '@radix-ui/react-progress': 1.1.2(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
-      '@radix-ui/react-select': 2.1.6(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
-      '@radix-ui/react-slot': 1.1.2(@types/react@19.0.10)(react@19.0.0)
-      '@radix-ui/react-tabs': 1.1.3(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
-      class-variance-authority: 0.7.1
-      clsx: 2.1.1
-      highlight.js: 11.11.1
-      katex: 0.16.21
-      lucide-react: 0.453.0(react@19.0.0)
-      react: 19.0.0
-      react-markdown: 8.0.7(@types/react@19.0.10)(react@19.0.0)
-      rehype-katex: 7.0.1
-      remark: 14.0.3
-      remark-code-import: 1.2.0
-      remark-gfm: 3.0.1
-      remark-math: 5.1.1
-      tailwind-merge: 2.6.0
-      vaul: 0.9.9(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
-    transitivePeerDependencies:
-      - '@types/react'
-      - '@types/react-dom'
-      - react-dom
-      - supports-color
-
   '@llamaindex/pdf-viewer@1.3.0(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)':
     dependencies:
       '@wojtekmaj/react-hooks': 1.17.2(react@19.0.0)
@@ -14778,88 +14618,58 @@ snapshots:
 
   '@next/env@15.2.1': {}
 
-  '@next/env@15.2.3': {}
-
   '@next/eslint-plugin-next@15.1.0':
     dependencies:
       fast-glob: 3.3.1
 
-  '@next/eslint-plugin-next@15.2.3':
-    dependencies:
-      fast-glob: 3.3.1
-
   '@next/swc-darwin-arm64@15.2.0':
     optional: true
 
   '@next/swc-darwin-arm64@15.2.1':
     optional: true
 
-  '@next/swc-darwin-arm64@15.2.3':
-    optional: true
-
   '@next/swc-darwin-x64@15.2.0':
     optional: true
 
   '@next/swc-darwin-x64@15.2.1':
     optional: true
 
-  '@next/swc-darwin-x64@15.2.3':
-    optional: true
-
   '@next/swc-linux-arm64-gnu@15.2.0':
     optional: true
 
   '@next/swc-linux-arm64-gnu@15.2.1':
     optional: true
 
-  '@next/swc-linux-arm64-gnu@15.2.3':
-    optional: true
-
   '@next/swc-linux-arm64-musl@15.2.0':
     optional: true
 
   '@next/swc-linux-arm64-musl@15.2.1':
     optional: true
 
-  '@next/swc-linux-arm64-musl@15.2.3':
-    optional: true
-
   '@next/swc-linux-x64-gnu@15.2.0':
     optional: true
 
   '@next/swc-linux-x64-gnu@15.2.1':
     optional: true
 
-  '@next/swc-linux-x64-gnu@15.2.3':
-    optional: true
-
   '@next/swc-linux-x64-musl@15.2.0':
     optional: true
 
   '@next/swc-linux-x64-musl@15.2.1':
     optional: true
 
-  '@next/swc-linux-x64-musl@15.2.3':
-    optional: true
-
   '@next/swc-win32-arm64-msvc@15.2.0':
     optional: true
 
   '@next/swc-win32-arm64-msvc@15.2.1':
     optional: true
 
-  '@next/swc-win32-arm64-msvc@15.2.3':
-    optional: true
-
   '@next/swc-win32-x64-msvc@15.2.0':
     optional: true
 
   '@next/swc-win32-x64-msvc@15.2.1':
     optional: true
 
-  '@next/swc-win32-x64-msvc@15.2.3':
-    optional: true
-
   '@nodelib/fs.scandir@2.1.5':
     dependencies:
       '@nodelib/fs.stat': 2.0.5
@@ -17399,7 +17209,7 @@ snapshots:
     dependencies:
       humanize-ms: 1.2.1
 
-  ai@3.4.33(openai@4.86.0(ws@8.18.0(bufferutil@4.0.9))(zod@3.24.2))(react@19.0.0)(sswr@2.1.0(svelte@5.19.10))(svelte@5.19.10)(vue@3.5.13(typescript@5.7.3))(zod@3.24.2):
+  ai@3.4.33(openai@4.86.0(zod@3.24.2))(react@19.0.0)(sswr@2.1.0(svelte@5.19.10))(svelte@5.19.10)(vue@3.5.13(typescript@5.7.3))(zod@3.24.2):
     dependencies:
       '@ai-sdk/provider': 0.0.26
       '@ai-sdk/provider-utils': 1.0.22(zod@3.24.2)
@@ -17415,7 +17225,7 @@ snapshots:
       secure-json-parse: 2.7.0
       zod-to-json-schema: 3.24.1(zod@3.24.2)
     optionalDependencies:
-      openai: 4.86.0(ws@8.18.0(bufferutil@4.0.9))(zod@3.24.2)
+      openai: 4.86.0(ws@8.18.0)(zod@3.24.2)
       react: 19.0.0
       sswr: 2.1.0(svelte@5.19.10)
       svelte: 5.19.10
@@ -18009,13 +17819,13 @@ snapshots:
     transitivePeerDependencies:
       - bare-buffer
 
-  chromadb@1.10.3(cohere-ai@7.14.0)(openai@4.86.0(ws@8.18.0(bufferutil@4.0.9))(zod@3.24.2))(voyageai@0.0.3-1):
+  chromadb@1.10.3(cohere-ai@7.14.0)(openai@4.86.0)(voyageai@0.0.3-1):
     dependencies:
       cliui: 8.0.1
       isomorphic-fetch: 3.0.0
     optionalDependencies:
       cohere-ai: 7.14.0
-      openai: 4.86.0(ws@8.18.0(bufferutil@4.0.9))(zod@3.24.2)
+      openai: 4.86.0(ws@8.18.0)(zod@3.24.2)
       voyageai: 0.0.3-1
     transitivePeerDependencies:
       - encoding
@@ -18814,26 +18624,6 @@ snapshots:
       - eslint-plugin-import-x
       - supports-color
 
-  eslint-config-next@15.2.3(eslint@9.22.0(jiti@2.4.2))(typescript@5.7.3):
-    dependencies:
-      '@next/eslint-plugin-next': 15.2.3
-      '@rushstack/eslint-patch': 1.10.5
-      '@typescript-eslint/eslint-plugin': 8.24.0(@typescript-eslint/parser@8.24.0(eslint@9.22.0(jiti@2.4.2))(typescript@5.7.3))(eslint@9.22.0(jiti@2.4.2))(typescript@5.7.3)
-      '@typescript-eslint/parser': 8.24.0(eslint@9.22.0(jiti@2.4.2))(typescript@5.7.3)
-      eslint: 9.22.0(jiti@2.4.2)
-      eslint-import-resolver-node: 0.3.9
-      eslint-import-resolver-typescript: 3.7.0(eslint-plugin-import@2.31.0)(eslint@9.22.0(jiti@2.4.2))
-      eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.24.0(eslint@9.22.0(jiti@2.4.2))(typescript@5.7.3))(eslint-import-resolver-typescript@3.7.0)(eslint@9.22.0(jiti@2.4.2))
-      eslint-plugin-jsx-a11y: 6.10.2(eslint@9.22.0(jiti@2.4.2))
-      eslint-plugin-react: 7.37.2(eslint@9.22.0(jiti@2.4.2))
-      eslint-plugin-react-hooks: 5.1.0(eslint@9.22.0(jiti@2.4.2))
-    optionalDependencies:
-      typescript: 5.7.3
-    transitivePeerDependencies:
-      - eslint-import-resolver-webpack
-      - eslint-plugin-import-x
-      - supports-color
-
   eslint-config-prettier@9.1.0(eslint@9.22.0(jiti@2.4.2)):
     dependencies:
       eslint: 9.22.0(jiti@2.4.2)
@@ -18884,7 +18674,7 @@ snapshots:
     transitivePeerDependencies:
       - supports-color
 
-  eslint-module-utils@2.12.0(@typescript-eslint/parser@8.24.0(eslint@9.16.0(jiti@2.4.2))(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.7.0)(eslint@9.16.0(jiti@2.4.2)):
+  eslint-module-utils@2.12.0(@typescript-eslint/parser@8.24.0(eslint@9.16.0(jiti@2.4.2))(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.7.0(eslint-plugin-import@2.31.0)(eslint@9.16.0(jiti@2.4.2)))(eslint@9.16.0(jiti@2.4.2)):
     dependencies:
       debug: 3.2.7
     optionalDependencies:
@@ -18895,7 +18685,7 @@ snapshots:
     transitivePeerDependencies:
       - supports-color
 
-  eslint-module-utils@2.12.0(@typescript-eslint/parser@8.24.0(eslint@9.22.0(jiti@2.4.2))(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.7.0)(eslint@9.22.0(jiti@2.4.2)):
+  eslint-module-utils@2.12.0(@typescript-eslint/parser@8.24.0(eslint@9.22.0(jiti@2.4.2))(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.7.0(eslint-plugin-import@2.31.0)(eslint@9.22.0(jiti@2.4.2)))(eslint@9.22.0(jiti@2.4.2)):
     dependencies:
       debug: 3.2.7
     optionalDependencies:
@@ -18917,7 +18707,7 @@ snapshots:
       doctrine: 2.1.0
       eslint: 9.16.0(jiti@2.4.2)
       eslint-import-resolver-node: 0.3.9
-      eslint-module-utils: 2.12.0(@typescript-eslint/parser@8.24.0(eslint@9.16.0(jiti@2.4.2))(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.7.0)(eslint@9.16.0(jiti@2.4.2))
+      eslint-module-utils: 2.12.0(@typescript-eslint/parser@8.24.0(eslint@9.16.0(jiti@2.4.2))(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.7.0(eslint-plugin-import@2.31.0)(eslint@9.16.0(jiti@2.4.2)))(eslint@9.16.0(jiti@2.4.2))
       hasown: 2.0.2
       is-core-module: 2.16.1
       is-glob: 4.0.3
@@ -18946,7 +18736,7 @@ snapshots:
       doctrine: 2.1.0
       eslint: 9.22.0(jiti@2.4.2)
       eslint-import-resolver-node: 0.3.9
-      eslint-module-utils: 2.12.0(@typescript-eslint/parser@8.24.0(eslint@9.22.0(jiti@2.4.2))(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.7.0)(eslint@9.22.0(jiti@2.4.2))
+      eslint-module-utils: 2.12.0(@typescript-eslint/parser@8.24.0(eslint@9.22.0(jiti@2.4.2))(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.7.0(eslint-plugin-import@2.31.0)(eslint@9.22.0(jiti@2.4.2)))(eslint@9.22.0(jiti@2.4.2))
       hasown: 2.0.2
       is-core-module: 2.16.1
       is-glob: 4.0.3
@@ -22281,32 +22071,6 @@ snapshots:
       - '@babel/core'
       - babel-plugin-macros
 
-  next@15.2.3(@opentelemetry/api@1.9.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0):
-    dependencies:
-      '@next/env': 15.2.3
-      '@swc/counter': 0.1.3
-      '@swc/helpers': 0.5.15
-      busboy: 1.6.0
-      caniuse-lite: 1.0.30001701
-      postcss: 8.4.31
-      react: 19.0.0
-      react-dom: 19.0.0(react@19.0.0)
-      styled-jsx: 5.1.6(react@19.0.0)
-    optionalDependencies:
-      '@next/swc-darwin-arm64': 15.2.3
-      '@next/swc-darwin-x64': 15.2.3
-      '@next/swc-linux-arm64-gnu': 15.2.3
-      '@next/swc-linux-arm64-musl': 15.2.3
-      '@next/swc-linux-x64-gnu': 15.2.3
-      '@next/swc-linux-x64-musl': 15.2.3
-      '@next/swc-win32-arm64-msvc': 15.2.3
-      '@next/swc-win32-x64-msvc': 15.2.3
-      '@opentelemetry/api': 1.9.0
-      sharp: 0.33.5
-    transitivePeerDependencies:
-      - '@babel/core'
-      - babel-plugin-macros
-
   nice-grpc-client-middleware-retry@3.1.9:
     dependencies:
       abort-controller-x: 0.4.3
@@ -22528,7 +22292,7 @@ snapshots:
       is-docker: 2.2.1
       is-wsl: 2.2.0
 
-  openai@4.83.0(ws@8.18.0(bufferutil@4.0.9))(zod@3.24.2):
+  openai@4.83.0(ws@8.18.0)(zod@3.24.2):
     dependencies:
       '@types/node': 18.19.75
       '@types/node-fetch': 2.6.12
@@ -22543,7 +22307,7 @@ snapshots:
     transitivePeerDependencies:
       - encoding
 
-  openai@4.86.0(ws@8.18.0(bufferutil@4.0.9))(zod@3.24.2):
+  openai@4.86.0(ws@8.18.0)(zod@3.24.2):
     dependencies:
       '@types/node': 18.19.76
       '@types/node-fetch': 2.6.12
@@ -25653,4 +25417,4 @@ snapshots:
 
   zod@3.24.2: {}
 
-  zwitch@2.0.4: {}
+  zwitch@2.0.4: {}
\ No newline at end of file