Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
chenpangpang
open-webui
Commits
18a7634f
Commit
18a7634f
authored
May 16, 2024
by
Timothy J. Baek
Browse files
fix: python code execution
parent
325fd2b9
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
120 additions
and
4 deletions
+120
-4
src/lib/components/chat/Messages/CodeBlock.svelte
src/lib/components/chat/Messages/CodeBlock.svelte
+120
-4
No files found.
src/lib/components/chat/Messages/CodeBlock.svelte
View file @
18a7634f
...
...
@@ -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={() => {
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment