mirror of
https://github.com/open-webui/open-webui
synced 2024-11-21 23:57:51 +00:00
fix: python code execution
This commit is contained in:
parent
325fd2b97b
commit
18a7634f5c
@ -21,6 +21,116 @@
|
||||
}, 1000);
|
||||
};
|
||||
|
||||
const checkPythonCode = (str) => {
|
||||
// Check if the string contains typical Python keywords, syntax, or functions
|
||||
const pythonKeywords = [
|
||||
'def',
|
||||
'class',
|
||||
'import',
|
||||
'from',
|
||||
'if',
|
||||
'else',
|
||||
'elif',
|
||||
'for',
|
||||
'while',
|
||||
'try',
|
||||
'except',
|
||||
'finally',
|
||||
'return',
|
||||
'yield',
|
||||
'lambda',
|
||||
'assert',
|
||||
'pass',
|
||||
'break',
|
||||
'continue',
|
||||
'global',
|
||||
'nonlocal',
|
||||
'del',
|
||||
'True',
|
||||
'False',
|
||||
'None',
|
||||
'and',
|
||||
'or',
|
||||
'not',
|
||||
'in',
|
||||
'is',
|
||||
'as',
|
||||
'with'
|
||||
];
|
||||
|
||||
for (let keyword of pythonKeywords) {
|
||||
if (str.includes(keyword)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
// Check if the string contains typical Python syntax characters
|
||||
const pythonSyntax = [
|
||||
'def ',
|
||||
'class ',
|
||||
'import ',
|
||||
'from ',
|
||||
'if ',
|
||||
'else:',
|
||||
'elif ',
|
||||
'for ',
|
||||
'while ',
|
||||
'try:',
|
||||
'except:',
|
||||
'finally:',
|
||||
'return ',
|
||||
'yield ',
|
||||
'lambda ',
|
||||
'assert ',
|
||||
'pass',
|
||||
'break',
|
||||
'continue',
|
||||
'global ',
|
||||
'nonlocal ',
|
||||
'del ',
|
||||
'True',
|
||||
'False',
|
||||
'None',
|
||||
' and ',
|
||||
' or ',
|
||||
' not ',
|
||||
' in ',
|
||||
' is ',
|
||||
' as ',
|
||||
' with ',
|
||||
':',
|
||||
'=',
|
||||
'==',
|
||||
'!=',
|
||||
'>',
|
||||
'<',
|
||||
'>=',
|
||||
'<=',
|
||||
'+',
|
||||
'-',
|
||||
'*',
|
||||
'/',
|
||||
'%',
|
||||
'**',
|
||||
'//',
|
||||
'(',
|
||||
')',
|
||||
'[',
|
||||
']',
|
||||
'{',
|
||||
'}'
|
||||
];
|
||||
|
||||
for (let syntax of pythonSyntax) {
|
||||
if (str.includes(syntax)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
// If none of the above conditions met, it's probably not Python code
|
||||
return false;
|
||||
};
|
||||
|
||||
const executePython = async (text) => {
|
||||
executed = true;
|
||||
|
||||
@ -31,9 +141,15 @@
|
||||
outputDiv.innerText = 'Running...';
|
||||
}
|
||||
|
||||
text = text
|
||||
.split('\n')
|
||||
.map((line, index) => (index === 0 ? line : ' ' + line))
|
||||
.join('\n');
|
||||
|
||||
// pyscript
|
||||
let div = document.createElement('div');
|
||||
let html = `<py-script type="py" worker>
|
||||
let html = `
|
||||
<py-script type="py" worker>
|
||||
import js
|
||||
import sys
|
||||
import io
|
||||
@ -48,7 +164,7 @@ original_stdout = sys.stdout
|
||||
sys.stdout = output_capture
|
||||
|
||||
try:
|
||||
${text}
|
||||
${text}
|
||||
except Exception as e:
|
||||
# Capture any errors and write them to the output capture
|
||||
print(f"Error: {e}", file=output_capture)
|
||||
@ -68,7 +184,7 @@ def display_message():
|
||||
output_div.innerText = captured_output
|
||||
|
||||
display_message()
|
||||
</py-script>`;
|
||||
</py-script>`;
|
||||
|
||||
div.innerHTML = html;
|
||||
const pyScript = div.firstElementChild;
|
||||
@ -94,7 +210,7 @@ display_message()
|
||||
<div class="p-1">{@html lang}</div>
|
||||
|
||||
<div class="flex items-center">
|
||||
{#if lang === 'python'}
|
||||
{#if lang === 'python' || checkPythonCode(code)}
|
||||
<button
|
||||
class="copy-code-button bg-none border-none p-1"
|
||||
on:click={() => {
|
||||
|
Loading…
Reference in New Issue
Block a user