diff --git a/apps/simple/assemblyai.ts b/apps/simple/assemblyai.ts deleted file mode 100644 index d0333806349002eb500a241701c31b677fd67e87..0000000000000000000000000000000000000000 --- a/apps/simple/assemblyai.ts +++ /dev/null @@ -1,60 +0,0 @@ -import { program } from "commander"; -import { AudioTranscriptReader, CreateTranscriptParameters } from "llamaindex"; -import { stdin as input, stdout as output } from "node:process"; -// readline/promises is still experimental so not in @types/node yet -// @ts-ignore -import readline from "node:readline/promises"; -import { VectorStoreIndex } from "../../packages/core/src/indices"; - -program - .option( - "-a, --audio-url [string]", - "URL or path of the audio file to transcribe", - ) - .option("-i, --transcript-id [string]", "ID of the AssemblyAI transcript") - .action(async (options) => { - if (!process.env.ASSEMBLYAI_API_KEY) { - console.log("No ASSEMBLYAI_API_KEY found in environment variables."); - return; - } - - const reader = new AudioTranscriptReader(); - let params: CreateTranscriptParameters | string; - console.log(options); - if (options.audioUrl) { - params = { - audio_url: options.audioUrl, - }; - } else if (options.transcriptId) { - params = options.transcriptId; - } else { - console.log( - "You must provide either an --audio-url or a --transcript-id", - ); - return; - } - - const documents = await reader.loadData(params); - console.log(documents); - - // Split text and create embeddings. Store them in a VectorStoreIndex - const index = await VectorStoreIndex.fromDocuments(documents); - - // Create query engine - const queryEngine = index.asQueryEngine(); - - const rl = readline.createInterface({ input, output }); - while (true) { - const query = await rl.question("Ask a question: "); - - if (!query) { - break; - } - - const response = await queryEngine.query(query); - - console.log(response.toString()); - } - }); - -program.parse(); diff --git a/examples/assemblyai.ts b/examples/assemblyai.ts deleted file mode 100644 index d0333806349002eb500a241701c31b677fd67e87..0000000000000000000000000000000000000000 --- a/examples/assemblyai.ts +++ /dev/null @@ -1,60 +0,0 @@ -import { program } from "commander"; -import { AudioTranscriptReader, CreateTranscriptParameters } from "llamaindex"; -import { stdin as input, stdout as output } from "node:process"; -// readline/promises is still experimental so not in @types/node yet -// @ts-ignore -import readline from "node:readline/promises"; -import { VectorStoreIndex } from "../../packages/core/src/indices"; - -program - .option( - "-a, --audio-url [string]", - "URL or path of the audio file to transcribe", - ) - .option("-i, --transcript-id [string]", "ID of the AssemblyAI transcript") - .action(async (options) => { - if (!process.env.ASSEMBLYAI_API_KEY) { - console.log("No ASSEMBLYAI_API_KEY found in environment variables."); - return; - } - - const reader = new AudioTranscriptReader(); - let params: CreateTranscriptParameters | string; - console.log(options); - if (options.audioUrl) { - params = { - audio_url: options.audioUrl, - }; - } else if (options.transcriptId) { - params = options.transcriptId; - } else { - console.log( - "You must provide either an --audio-url or a --transcript-id", - ); - return; - } - - const documents = await reader.loadData(params); - console.log(documents); - - // Split text and create embeddings. Store them in a VectorStoreIndex - const index = await VectorStoreIndex.fromDocuments(documents); - - // Create query engine - const queryEngine = index.asQueryEngine(); - - const rl = readline.createInterface({ input, output }); - while (true) { - const query = await rl.question("Ask a question: "); - - if (!query) { - break; - } - - const response = await queryEngine.query(query); - - console.log(response.toString()); - } - }); - -program.parse(); diff --git a/packages/core/package.json b/packages/core/package.json index 6ed4251c3490113f7b0faebe15b56b002d693d91..0f3dbc5c9956f68e3573fe15aa7a541585d7c69e 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -6,7 +6,6 @@ "@anthropic-ai/sdk": "^0.9.1", "@notionhq/client": "^2.2.13", "@xenova/transformers": "^2.8.0", - "assemblyai": "^3.0.1", "crypto-js": "^4.2.0", "js-tiktoken": "^1.0.8", "lodash": "^4.17.21", @@ -50,12 +49,5 @@ "test": "jest", "build": "tsup src/index.ts --format esm,cjs --dts", "dev": "tsup src/index.ts --format esm,cjs --dts --watch" - }, - "exports": { - ".": { - "require": "./dist/index.js", - "import": "./dist/index.mjs", - "types": "./dist/index.d.ts" - } } } \ No newline at end of file diff --git a/packages/core/src/index.ts b/packages/core/src/index.ts index c049a0710edd6b362be6784a3579850f3d1957c7..dde8fff26fef4de5c78d7adb567f956952259183 100644 --- a/packages/core/src/index.ts +++ b/packages/core/src/index.ts @@ -19,7 +19,6 @@ export * from "./constants"; export * from "./embeddings"; export * from "./indices"; export * from "./llm/LLM"; -export * from "./readers/AssemblyAI"; export * from "./readers/CSVReader"; export * from "./readers/HTMLReader"; export * from "./readers/MarkdownReader"; diff --git a/packages/core/src/readers/AssemblyAI.ts b/packages/core/src/readers/AssemblyAI.ts deleted file mode 100644 index 6eea143bb0c529cb47b2aa4c9572417b975bdf6a..0000000000000000000000000000000000000000 --- a/packages/core/src/readers/AssemblyAI.ts +++ /dev/null @@ -1,148 +0,0 @@ -import { - AssemblyAI, - BaseServiceParams, - CreateTranscriptParameters, - SubtitleFormat, - TranscriptParagraph, - TranscriptSentence, -} from "assemblyai"; -import { Document } from "../Node"; -import { BaseReader } from "./base"; - -type AssemblyAIOptions = Partial<BaseServiceParams>; - -/** - * Base class for AssemblyAI Readers. - */ -abstract class AssemblyAIReader implements BaseReader { - protected client: AssemblyAI; - - /** - * Creates a new AssemblyAI Reader. - * @param assemblyAIOptions The options to configure the AssemblyAI Reader. - * Configure the `assemblyAIOptions.apiKey` with your AssemblyAI API key, or configure it as the `ASSEMBLYAI_API_KEY` environment variable. - */ - constructor(assemblyAIOptions?: AssemblyAIOptions) { - let options = assemblyAIOptions; - if (!options) { - options = {}; - } - if (!options.apiKey) { - options.apiKey = process.env.ASSEMBLYAI_API_KEY; - } - if (!options.apiKey) { - throw new Error("No AssemblyAI API key provided. Pass an `apiKey` option, or configure the `ASSEMBLYAI_API_KEY` environment variable."); - } - - this.client = new AssemblyAI(options as BaseServiceParams); - } - - abstract loadData(...args: any[]): Promise<Document[]>; - - protected async getOrCreateTranscript(params: CreateTranscriptParameters | string) { - if (typeof params === "string") { - return await this.client.transcripts.get(params); - } - else { - return await this.client.transcripts.create(params); - } - } - - protected async getTranscriptId(params: CreateTranscriptParameters | string) { - if (typeof params === "string") { - return params; - } - else { - return (await this.client.transcripts.create(params)).id; - } - } -} - -/** - * Creates and reads the transcript as a document using AssemblyAI. - */ -class AudioTranscriptReader extends AssemblyAIReader { - /** - * Creates or gets a transcript and loads the transcript as a document using AssemblyAI. - * @param params The parameters to create or get the transcript. - * @returns A promise that resolves to a single document containing the transcript text. - */ - async loadData(params: CreateTranscriptParameters | string): Promise<Document[]> { - const transcript = await this.getOrCreateTranscript(params); - return [ - new Document({ text: transcript.text || undefined }), - ]; - } -} - -/** - * Creates a transcript and returns a document for each paragraph. - */ -class AudioTranscriptParagraphsReader extends AssemblyAIReader { - /** - * Creates or gets a transcript, and returns a document for each paragraph. - * @param params The parameters to create or get the transcript. - * @returns A promise that resolves to an array of documents, each containing a paragraph of the transcript. - */ - async loadData(params: CreateTranscriptParameters | string): Promise<Document[]> { - let transcriptId = await this.getTranscriptId(params); - const paragraphsResponse = await this.client.transcripts.paragraphs( - transcriptId - ); - return paragraphsResponse.paragraphs.map((p: TranscriptParagraph) => - new Document({ text: p.text }), - ); - } -} - -/** - * Creates a transcript and returns a document for each sentence. - */ -class AudioTranscriptSentencesReader extends AssemblyAIReader { - /** - * Creates or gets a transcript, and returns a document for each sentence. - * @param params The parameters to create or get the transcript. - * @returns A promise that resolves to an array of documents, each containing a sentence of the transcript. - */ - async loadData(params: CreateTranscriptParameters | string): Promise<Document[]> { - let transcriptId = await this.getTranscriptId(params); - const sentencesResponse = await this.client.transcripts.sentences( - transcriptId - ); - return sentencesResponse.sentences.map((p: TranscriptSentence) => - new Document({ text: p.text }), - ); - } -} - -/** - * Creates a transcript and reads subtitles for the transcript as `srt` or `vtt` format. - */ -class AudioSubtitlesReader extends AssemblyAIReader { - /** - * Creates or gets a transcript and reads subtitles for the transcript as `srt` or `vtt` format. - * @param params The parameters to create or get the transcript. - * @param subtitleFormat The format of the subtitles, either `srt` or `vtt`. - * @returns A promise that resolves a document containing the subtitles as the page content. - */ - async loadData( - params: CreateTranscriptParameters | string, - subtitleFormat: SubtitleFormat = 'srt' - ): Promise<Document[]> { - let transcriptId = await this.getTranscriptId(params); - const subtitles = await this.client.transcripts.subtitles(transcriptId, subtitleFormat); - return [new Document({ text: subtitles })]; - } -} - -export { - AudioTranscriptReader, - AudioTranscriptParagraphsReader, - AudioTranscriptSentencesReader, - AudioSubtitlesReader, -} -export type { - AssemblyAIOptions, - CreateTranscriptParameters, - SubtitleFormat -} diff --git a/packages/create-llama/templates/components/engines/context/generate.mjs b/packages/create-llama/templates/components/engines/context/generate.mjs index 8420dd5f81eab52574ec51770cf0e09ccb139563..9334f98e47558b5d451e21143b9eacf5b0287955 100644 --- a/packages/create-llama/templates/components/engines/context/generate.mjs +++ b/packages/create-llama/templates/components/engines/context/generate.mjs @@ -5,6 +5,8 @@ import { VectorStoreIndex, } from "llamaindex"; +import * as dotenv from "dotenv"; + import { CHUNK_OVERLAP, CHUNK_SIZE, @@ -12,6 +14,9 @@ import { STORAGE_DIR, } from "./constants.mjs"; +// Load environment variables from local .env file +dotenv.config(); + async function getRuntime(func) { const start = Date.now(); await func(); diff --git a/packages/create-llama/templates/index.ts b/packages/create-llama/templates/index.ts index a9f0998eb2315ee1e2166904e548d14db7fb5b00..2c1f8737706d9f58afb7a269d15c743f2f8f2bc3 100644 --- a/packages/create-llama/templates/index.ts +++ b/packages/create-llama/templates/index.ts @@ -14,26 +14,14 @@ import { TemplateFramework, } from "./types"; -const envFileNameMap: Record<TemplateFramework, string> = { - nextjs: ".env.local", - express: ".env", - fastapi: ".env", -}; - -const createEnvLocalFile = async ( - root: string, - framework: TemplateFramework, - openAIKey?: string, -) => { +const createEnvLocalFile = async (root: string, openAIKey?: string) => { if (openAIKey) { - const envFileName = envFileNameMap[framework]; - if (!envFileName) return; + const envFileName = ".env"; await fs.writeFile( path.join(root, envFileName), `OPENAI_API_KEY=${openAIKey}\n`, ); console.log(`Created '${envFileName}' file containing OPENAI_API_KEY`); - process.env["OPENAI_API_KEY"] = openAIKey; } }; @@ -42,7 +30,16 @@ const copyTestData = async ( framework: TemplateFramework, packageManager?: PackageManager, engine?: TemplateEngine, + openAIKey?: string, ) => { + if (framework === "nextjs") { + // XXX: This is a hack to make the build for nextjs work with pdf-parse + // pdf-parse needs './test/data/05-versions-space.pdf' to exist - can be removed when pdf-parse is removed + const srcFile = path.join(__dirname, "components", "data", "101.pdf"); + const destPath = path.join(root, "test", "data"); + await fs.mkdir(destPath, { recursive: true }); + await fs.copyFile(srcFile, path.join(destPath, "05-versions-space.pdf")); + } if (engine === "context" || framework === "fastapi") { const srcPath = path.join(__dirname, "components", "data"); const destPath = path.join(root, "data"); @@ -54,7 +51,7 @@ const copyTestData = async ( } if (packageManager && engine === "context") { - if (process.env["OPENAI_API_KEY"]) { + if (openAIKey || process.env["OPENAI_API_KEY"]) { console.log( `\nRunning ${cyan( `${packageManager} run generate`, @@ -226,6 +223,7 @@ const installTSTemplate = async ({ "tailwind-merge": "^2", "@radix-ui/react-slot": "^1", "class-variance-authority": "^0.7", + clsx: "^1.2.1", "lucide-react": "^0.291", remark: "^14.0.3", "remark-code-import": "^1.2.0", @@ -313,7 +311,7 @@ export const installTemplate = async ( // This is a backend, so we need to copy the test data and create the env file. // Copy the environment file to the target directory. - await createEnvLocalFile(props.root, props.framework, props.openAIKey); + await createEnvLocalFile(props.root, props.openAIKey); // Copy test pdf file await copyTestData( @@ -321,6 +319,7 @@ export const installTemplate = async ( props.framework, props.packageManager, props.engine, + props.openAIKey, ); } }; diff --git a/packages/create-llama/templates/types/simple/nextjs/next.config.app.js b/packages/create-llama/templates/types/simple/nextjs/next.config.app.js index 74655207e206e9efa7215e79ea163e8ae2052361..0ff94969142b0c759dfa75ace8ee4300e8860620 100644 --- a/packages/create-llama/templates/types/simple/nextjs/next.config.app.js +++ b/packages/create-llama/templates/types/simple/nextjs/next.config.app.js @@ -1,5 +1,15 @@ /** @type {import('next').NextConfig} */ const nextConfig = { + webpack: (config) => { + // See https://webpack.js.org/configuration/resolve/#resolvealias + config.resolve.alias = { + ...config.resolve.alias, + sharp$: false, + "onnxruntime-node$": false, + mongodb$: false, + }; + return config; + }, experimental: { serverComponentsExternalPackages: ["llamaindex"], outputFileTracingIncludes: { diff --git a/packages/create-llama/templates/types/simple/nextjs/next.config.static.js b/packages/create-llama/templates/types/simple/nextjs/next.config.static.js index 166b3e67d75ddc6d594b1c3d0960cc51f54b13b9..c5e9ab41f7395aba6fddbfd39ef9c7c776ae9f79 100644 --- a/packages/create-llama/templates/types/simple/nextjs/next.config.static.js +++ b/packages/create-llama/templates/types/simple/nextjs/next.config.static.js @@ -2,6 +2,16 @@ const nextConfig = { output: "export", images: { unoptimized: true }, + webpack: (config) => { + // See https://webpack.js.org/configuration/resolve/#resolvealias + config.resolve.alias = { + ...config.resolve.alias, + sharp$: false, + "onnxruntime-node$": false, + mongodb$: false, + }; + return config; + }, experimental: { serverComponentsExternalPackages: ["llamaindex"], outputFileTracingIncludes: { diff --git a/packages/create-llama/templates/types/simple/nextjs/package.json b/packages/create-llama/templates/types/simple/nextjs/package.json index 990b41c832c69b81883c88b2d078c55bef15b42c..5faf066d60bb3256f245b9f1536c9cf58e2fe2f4 100644 --- a/packages/create-llama/templates/types/simple/nextjs/package.json +++ b/packages/create-llama/templates/types/simple/nextjs/package.json @@ -9,6 +9,7 @@ }, "dependencies": { "llamaindex": "0.0.31", + "dotenv": "^16.3.1", "nanoid": "^5", "next": "^13", "react": "^18", @@ -18,11 +19,11 @@ "@types/node": "^20", "@types/react": "^18", "@types/react-dom": "^18", - "autoprefixer": "^10", + "autoprefixer": "^10.1", "eslint": "^8", "eslint-config-next": "^13", "postcss": "^8", - "tailwindcss": "^3", + "tailwindcss": "^3.3", "typescript": "^5" } } \ No newline at end of file diff --git a/packages/create-llama/templates/types/simple/nextjs/tsconfig.json b/packages/create-llama/templates/types/simple/nextjs/tsconfig.json index c7146963787144d4861e149d8d233049b7daefc7..e779aa667e9e83943147b44d06fa930e9175a2b7 100644 --- a/packages/create-llama/templates/types/simple/nextjs/tsconfig.json +++ b/packages/create-llama/templates/types/simple/nextjs/tsconfig.json @@ -1,7 +1,11 @@ { "compilerOptions": { "target": "es5", - "lib": ["dom", "dom.iterable", "esnext"], + "lib": [ + "dom", + "dom.iterable", + "esnext" + ], "allowJs": true, "skipLibCheck": true, "strict": true, @@ -19,9 +23,19 @@ } ], "paths": { - "@/*": ["./*"] - } + "@/*": [ + "./*" + ] + }, + "forceConsistentCasingInFileNames": true, }, - "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"], - "exclude": ["node_modules"] -} + "include": [ + "next-env.d.ts", + "**/*.ts", + "**/*.tsx", + ".next/types/**/*.ts" + ], + "exclude": [ + "node_modules" + ] +} \ No newline at end of file diff --git a/packages/create-llama/templates/types/streaming/express/README-template.md b/packages/create-llama/templates/types/streaming/express/README-template.md index 7ea94ab755535aefd4d5edc9f20a5908d7fedead..0e9d796106725e9d9ebaa653fa5471e807ee1760 100644 --- a/packages/create-llama/templates/types/streaming/express/README-template.md +++ b/packages/create-llama/templates/types/streaming/express/README-template.md @@ -18,7 +18,7 @@ Then call the express API endpoint `/api/chat` to see the result: ``` curl --location 'localhost:8000/api/chat' \ ---header 'Content-Type: application/json' \ +--header 'Content-Type: text/plain' \ --data '{ "messages": [{ "role": "user", "content": "Hello" }] }' ``` diff --git a/packages/create-llama/templates/types/streaming/express/package.json b/packages/create-llama/templates/types/streaming/express/package.json index 72f127b407a8c7ce675bf4d634a42f57af78bb4c..6af064a8b6915055d556271119335ee341cec65f 100644 --- a/packages/create-llama/templates/types/streaming/express/package.json +++ b/packages/create-llama/templates/types/streaming/express/package.json @@ -9,7 +9,7 @@ "dev": "concurrently \"tsup index.ts --format esm --dts --watch\" \"nodemon -q dist/index.js\"" }, "dependencies": { - "ai": "^2", + "ai": "^2.2.5", "cors": "^2.8.5", "dotenv": "^16.3.1", "express": "^4", @@ -25,4 +25,4 @@ "tsup": "^7", "typescript": "^5" } -} +} \ No newline at end of file diff --git a/packages/create-llama/templates/types/streaming/nextjs/next.config.app.js b/packages/create-llama/templates/types/streaming/nextjs/next.config.app.js index 74655207e206e9efa7215e79ea163e8ae2052361..0ff94969142b0c759dfa75ace8ee4300e8860620 100644 --- a/packages/create-llama/templates/types/streaming/nextjs/next.config.app.js +++ b/packages/create-llama/templates/types/streaming/nextjs/next.config.app.js @@ -1,5 +1,15 @@ /** @type {import('next').NextConfig} */ const nextConfig = { + webpack: (config) => { + // See https://webpack.js.org/configuration/resolve/#resolvealias + config.resolve.alias = { + ...config.resolve.alias, + sharp$: false, + "onnxruntime-node$": false, + mongodb$: false, + }; + return config; + }, experimental: { serverComponentsExternalPackages: ["llamaindex"], outputFileTracingIncludes: { diff --git a/packages/create-llama/templates/types/streaming/nextjs/next.config.static.js b/packages/create-llama/templates/types/streaming/nextjs/next.config.static.js index 166b3e67d75ddc6d594b1c3d0960cc51f54b13b9..c5e9ab41f7395aba6fddbfd39ef9c7c776ae9f79 100644 --- a/packages/create-llama/templates/types/streaming/nextjs/next.config.static.js +++ b/packages/create-llama/templates/types/streaming/nextjs/next.config.static.js @@ -2,6 +2,16 @@ const nextConfig = { output: "export", images: { unoptimized: true }, + webpack: (config) => { + // See https://webpack.js.org/configuration/resolve/#resolvealias + config.resolve.alias = { + ...config.resolve.alias, + sharp$: false, + "onnxruntime-node$": false, + mongodb$: false, + }; + return config; + }, experimental: { serverComponentsExternalPackages: ["llamaindex"], outputFileTracingIncludes: { diff --git a/packages/create-llama/templates/types/streaming/nextjs/package.json b/packages/create-llama/templates/types/streaming/nextjs/package.json index e9f23201d893320cfdfcbd3fbac9ad48ebbb8d7c..fc5e483e074b76b101f6089ee7850a57530ea3f4 100644 --- a/packages/create-llama/templates/types/streaming/nextjs/package.json +++ b/packages/create-llama/templates/types/streaming/nextjs/package.json @@ -8,8 +8,9 @@ "lint": "next lint" }, "dependencies": { - "ai": "^2", + "ai": "^2.2.5", "llamaindex": "0.0.31", + "dotenv": "^16.3.1", "next": "^13", "react": "^18", "react-dom": "^18" @@ -18,11 +19,11 @@ "@types/node": "^20", "@types/react": "^18", "@types/react-dom": "^18", - "autoprefixer": "^10", + "autoprefixer": "^10.1", "eslint": "^8", "eslint-config-next": "^13", "postcss": "^8", - "tailwindcss": "^3", + "tailwindcss": "^3.3", "typescript": "^5" } } \ No newline at end of file diff --git a/packages/create-llama/templates/types/streaming/nextjs/tsconfig.json b/packages/create-llama/templates/types/streaming/nextjs/tsconfig.json index c7146963787144d4861e149d8d233049b7daefc7..e779aa667e9e83943147b44d06fa930e9175a2b7 100644 --- a/packages/create-llama/templates/types/streaming/nextjs/tsconfig.json +++ b/packages/create-llama/templates/types/streaming/nextjs/tsconfig.json @@ -1,7 +1,11 @@ { "compilerOptions": { "target": "es5", - "lib": ["dom", "dom.iterable", "esnext"], + "lib": [ + "dom", + "dom.iterable", + "esnext" + ], "allowJs": true, "skipLibCheck": true, "strict": true, @@ -19,9 +23,19 @@ } ], "paths": { - "@/*": ["./*"] - } + "@/*": [ + "./*" + ] + }, + "forceConsistentCasingInFileNames": true, }, - "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"], - "exclude": ["node_modules"] -} + "include": [ + "next-env.d.ts", + "**/*.ts", + "**/*.tsx", + ".next/types/**/*.ts" + ], + "exclude": [ + "node_modules" + ] +} \ No newline at end of file diff --git a/packages/eslint-config-custom/index.js b/packages/eslint-config-custom/index.js index 8417c5e6d90aef30254fec90a19fbb1d347ed4f1..142321257509d7748ce9de170d9cae31406ba968 100644 --- a/packages/eslint-config-custom/index.js +++ b/packages/eslint-config-custom/index.js @@ -9,7 +9,6 @@ module.exports = { "OPENAI_API_KEY", "REPLICATE_API_TOKEN", "ANTHROPIC_API_KEY", - "ASSEMBLYAI_API_KEY", "AZURE_OPENAI_KEY", "AZURE_OPENAI_ENDPOINT", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 7b8fa48c4e4b4ce819d245eb0e2a17ebdb617073..3bdf8e4f5a3459f6fcaba09136e0b4074f5d215d 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -156,9 +156,6 @@ importers: '@xenova/transformers': specifier: ^2.8.0 version: 2.8.0 - assemblyai: - specifier: ^3.0.1 - version: 3.1.1 crypto-js: specifier: ^4.2.0 version: 4.2.0 @@ -5203,15 +5200,6 @@ packages: safer-buffer: 2.1.2 dev: true - /assemblyai@3.1.1: - resolution: {integrity: sha512-rEhLnIZU7TupOkdzN9WjxhVU5bxMVofkNslzTArsuilaqOusPUmh6I7SGcJCGwKKE8qEweBaoY4DZ03cxv4KoA==} - dependencies: - ws: 8.14.2 - transitivePeerDependencies: - - bufferutil - - utf-8-validate - dev: false - /assert@2.1.0: resolution: {integrity: sha512-eLHpSK/Y4nhMJ07gDaAzoX/XAKS8PSaojml3M0DM4JpV1LAi5JOJ/p6H/XWrl8L+DzVEvVCW1z3vWAaB9oTsQw==} dependencies: