beea/open-webui
0
1const packages = [2 'micropip',3 'packaging',4 'requests',5 'beautifulsoup4',6 'numpy',7 'pandas',8 'matplotlib',9 'scikit-learn',10 'scipy',11 'regex',12 'seaborn'13];14 15import { loadPyodide } from 'pyodide';16import { writeFile, readFile, copyFile, readdir, rmdir } from 'fs/promises';17 18async function downloadPackages() {19 console.log('Setting up pyodide + micropip');20 21 let pyodide;22 try {23 pyodide = await loadPyodide({24 packageCacheDir: 'static/pyodide'25 });26 } catch (err) {27 console.error('Failed to load Pyodide:', err);28 return;29 }30 31 const packageJson = JSON.parse(await readFile('package.json'));32 const pyodideVersion = packageJson.dependencies.pyodide.replace('^', '');33 34 try {35 const pyodidePackageJson = JSON.parse(await readFile('static/pyodide/package.json'));36 const pyodidePackageVersion = pyodidePackageJson.version.replace('^', '');37 38 if (pyodideVersion !== pyodidePackageVersion) {39 console.log('Pyodide version mismatch, removing static/pyodide directory');40 await rmdir('static/pyodide', { recursive: true });41 }42 } catch (e) {43 console.log('Pyodide package not found, proceeding with download.');44 }45 46 try {47 console.log('Loading micropip package');48 await pyodide.loadPackage('micropip');49 50 const micropip = pyodide.pyimport('micropip');51 console.log('Downloading Pyodide packages:', packages);52 53 try {54 for (const pkg of packages) {55 console.log(`Installing package: ${pkg}`);56 await micropip.install(pkg);57 }58 } catch (err) {59 console.error('Package installation failed:', err);60 return;61 }62 63 console.log('Pyodide packages downloaded, freezing into lock file');64 65 try {66 const lockFile = await micropip.freeze();67 await writeFile('static/pyodide/pyodide-lock.json', lockFile);68 } catch (err) {69 console.error('Failed to write lock file:', err);70 }71 } catch (err) {72 console.error('Failed to load or install micropip:', err);73 }74}75 76async function copyPyodide() {77 console.log('Copying Pyodide files into static directory');78 // Copy all files from node_modules/pyodide to static/pyodide79 for await (const entry of await readdir('node_modules/pyodide')) {80 await copyFile(`node_modules/pyodide/${entry}`, `static/pyodide/${entry}`);81 }82}83 84await downloadPackages();85await copyPyodide();86 