From e61e843bdd86162443e82c80919352444676b0b3 Mon Sep 17 00:00:00 2001 From: Alex Yang Date: Wed, 8 May 2024 21:59:15 -0500 Subject: [PATCH] feat: add nextjs plugin --- .../e2e/examples/nextjs-agent/next.config.mjs | 4 ++- .../nextjs-edge-runtime/next.config.mjs | 4 ++- .../nextjs-edge-runtime/src/utils/llm.ts | 1 + packages/core/src/embeddings/ClipEmbedding.ts | 17 ++------- packages/core/src/next.ts | 36 +++++++++++++++++++ 5 files changed, 46 insertions(+), 16 deletions(-) create mode 100644 packages/core/src/next.ts diff --git a/packages/core/e2e/examples/nextjs-agent/next.config.mjs b/packages/core/e2e/examples/nextjs-agent/next.config.mjs index 4678774e6d..894e9a1dc4 100644 --- a/packages/core/e2e/examples/nextjs-agent/next.config.mjs +++ b/packages/core/e2e/examples/nextjs-agent/next.config.mjs @@ -1,4 +1,6 @@ /** @type {import('next').NextConfig} */ const nextConfig = {}; -export default nextConfig; +import withLlamaIndex from "llamaindex/next"; + +export default withLlamaIndex(nextConfig); diff --git a/packages/core/e2e/examples/nextjs-edge-runtime/next.config.mjs b/packages/core/e2e/examples/nextjs-edge-runtime/next.config.mjs index 4678774e6d..894e9a1dc4 100644 --- a/packages/core/e2e/examples/nextjs-edge-runtime/next.config.mjs +++ b/packages/core/e2e/examples/nextjs-edge-runtime/next.config.mjs @@ -1,4 +1,6 @@ /** @type {import('next').NextConfig} */ const nextConfig = {}; -export default nextConfig; +import withLlamaIndex from "llamaindex/next"; + +export default withLlamaIndex(nextConfig); diff --git a/packages/core/e2e/examples/nextjs-edge-runtime/src/utils/llm.ts b/packages/core/e2e/examples/nextjs-edge-runtime/src/utils/llm.ts index 29635d9c68..9de3efd7fd 100644 --- a/packages/core/e2e/examples/nextjs-edge-runtime/src/utils/llm.ts +++ b/packages/core/e2e/examples/nextjs-edge-runtime/src/utils/llm.ts @@ -1,6 +1,7 @@ "use server"; // test runtime import "llamaindex"; +import "llamaindex/embeddings/ClipEmbedding"; import "llamaindex/readers/SimpleDirectoryReader"; // @ts-expect-error diff --git a/packages/core/src/embeddings/ClipEmbedding.ts b/packages/core/src/embeddings/ClipEmbedding.ts index 5cd6f1bc39..0dab86411a 100644 --- a/packages/core/src/embeddings/ClipEmbedding.ts +++ b/packages/core/src/embeddings/ClipEmbedding.ts @@ -3,10 +3,7 @@ import type { ImageType } from "../Node.js"; import { MultiModalEmbedding } from "./MultiModalEmbedding.js"; async function readImage(input: ImageType) { - const { RawImage } = await import( - /* webpackIgnore: true */ - "@xenova/transformers" - ); + const { RawImage } = await import("@xenova/transformers"); if (input instanceof Blob) { return await RawImage.fromBlob(input); } else if (_.isString(input) || input instanceof URL) { @@ -32,10 +29,7 @@ export class ClipEmbedding extends MultiModalEmbedding { async getTokenizer() { if (!this.tokenizer) { - const { AutoTokenizer } = await import( - /* webpackIgnore: true */ - "@xenova/transformers" - ); + const { AutoTokenizer } = await import("@xenova/transformers"); this.tokenizer = await AutoTokenizer.from_pretrained(this.modelType); } return this.tokenizer; @@ -43,10 +37,7 @@ export class ClipEmbedding extends MultiModalEmbedding { async getProcessor() { if (!this.processor) { - const { AutoProcessor } = await import( - /* webpackIgnore: true */ - "@xenova/transformers" - ); + const { AutoProcessor } = await import("@xenova/transformers"); this.processor = await AutoProcessor.from_pretrained(this.modelType); } return this.processor; @@ -55,7 +46,6 @@ export class ClipEmbedding extends MultiModalEmbedding { async getVisionModel() { if (!this.visionModel) { const { CLIPVisionModelWithProjection } = await import( - /* webpackIgnore: true */ "@xenova/transformers" ); this.visionModel = await CLIPVisionModelWithProjection.from_pretrained( @@ -69,7 +59,6 @@ export class ClipEmbedding extends MultiModalEmbedding { async getTextModel() { if (!this.textModel) { const { CLIPTextModelWithProjection } = await import( - /* webpackIgnore: true */ "@xenova/transformers" ); this.textModel = await CLIPTextModelWithProjection.from_pretrained( diff --git a/packages/core/src/next.ts b/packages/core/src/next.ts new file mode 100644 index 0000000000..8097a0ea73 --- /dev/null +++ b/packages/core/src/next.ts @@ -0,0 +1,36 @@ +/** + * This is a Next.js configuration file that is used to customize the build process. + * + * @example + * ```js + * // next.config.js + * const withLlamaIndex = require("llamaindex/next") + * + * module.exports = withLlamaIndex({ + * // Your Next.js configuration + * }) + * ``` + * + * This is only for Next.js projects, do not export this function on top-level. + * + * @module + */ +export default function withLlamaIndex(config: any) { + const userWebpack = config.webpack; + //#region hack for `@xenova/transformers` + // Ignore node-specific modules when bundling for the browser + // See https://webpack.js.org/configuration/resolve/#resolvealias + config.webpack = function (webpackConfig: any) { + if (userWebpack) { + webpackConfig = userWebpack(webpackConfig); + } + webpackConfig.resolve.alias = { + ...webpackConfig.resolve.alias, + sharp$: false, + "onnxruntime-node$": false, + }; + return webpackConfig; + }; + //#endregion + return config; +}