mirror of
https://github.com/open-webui/open-webui
synced 2025-06-26 18:26:48 +00:00
Merge pull request #2366 from cheahjs/refac/pyscript-npm
refac: fetch pyodide deps at build time, not checked into git
This commit is contained in:
@@ -5,6 +5,7 @@
|
||||
import 'highlight.js/styles/github-dark.min.css';
|
||||
import { loadPyodide } from 'pyodide';
|
||||
import { tick } from 'svelte';
|
||||
import PyodideWorker from '../../../workers/pyodide.worker?worker';
|
||||
|
||||
export let id = '';
|
||||
|
||||
@@ -168,13 +169,11 @@
|
||||
} else {
|
||||
stderr = `${text}\n`;
|
||||
}
|
||||
}
|
||||
},
|
||||
packages: ['micropip']
|
||||
});
|
||||
|
||||
try {
|
||||
const res = await pyodide.loadPackage('micropip');
|
||||
console.log(res);
|
||||
|
||||
const micropip = pyodide.pyimport('micropip');
|
||||
|
||||
await micropip.set_index_urls('https://pypi.org/pypi/{package_name}/json');
|
||||
@@ -234,7 +233,7 @@ __builtins__.input = input`);
|
||||
code.includes('matplotlib') ? 'matplotlib' : null
|
||||
].filter(Boolean);
|
||||
|
||||
const pyodideWorker = new Worker('/pyodide-worker.js');
|
||||
const pyodideWorker = new PyodideWorker();
|
||||
|
||||
pyodideWorker.postMessage({
|
||||
id: id,
|
||||
|
||||
66
src/lib/workers/pyodide.worker.ts
Normal file
66
src/lib/workers/pyodide.worker.ts
Normal file
@@ -0,0 +1,66 @@
|
||||
import { loadPyodide, type PyodideInterface } from 'pyodide';
|
||||
|
||||
declare global {
|
||||
interface Window {
|
||||
stdout: string | null;
|
||||
stderr: string | null;
|
||||
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
||||
result: any;
|
||||
pyodide: PyodideInterface;
|
||||
packages: string[];
|
||||
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
||||
[key: string]: any;
|
||||
}
|
||||
}
|
||||
|
||||
async function loadPyodideAndPackages(packages: string[] = []) {
|
||||
self.stdout = null;
|
||||
self.stderr = null;
|
||||
self.result = null;
|
||||
|
||||
self.pyodide = await loadPyodide({
|
||||
indexURL: '/pyodide/',
|
||||
stdout: (text) => {
|
||||
console.log('Python output:', text);
|
||||
|
||||
if (self.stdout) {
|
||||
self.stdout += `${text}\n`;
|
||||
} else {
|
||||
self.stdout = `${text}\n`;
|
||||
}
|
||||
},
|
||||
stderr: (text) => {
|
||||
console.log('An error occurred:', text);
|
||||
if (self.stderr) {
|
||||
self.stderr += `${text}\n`;
|
||||
} else {
|
||||
self.stderr = `${text}\n`;
|
||||
}
|
||||
},
|
||||
packages: ['micropip']
|
||||
});
|
||||
|
||||
const micropip = self.pyodide.pyimport('micropip');
|
||||
|
||||
await micropip.set_index_urls('https://pypi.org/pypi/{package_name}/json');
|
||||
await micropip.install(packages);
|
||||
}
|
||||
|
||||
self.onmessage = async (event) => {
|
||||
const { id, code, ...context } = event.data;
|
||||
|
||||
console.log(event.data);
|
||||
|
||||
// The worker copies the context in its own "memory" (an object mapping name to values)
|
||||
for (const key of Object.keys(context)) {
|
||||
self[key] = context[key];
|
||||
}
|
||||
|
||||
// make sure loading is done
|
||||
await loadPyodideAndPackages(self.packages);
|
||||
|
||||
self.result = await self.pyodide.runPythonAsync(code);
|
||||
self.postMessage({ id, result: self.result, stdout: self.stdout, stderr: self.stderr });
|
||||
};
|
||||
|
||||
export default {};
|
||||
Reference in New Issue
Block a user