You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
47 lines
1.5 KiB
47 lines
1.5 KiB
from ..tool import Tool
|
|
|
|
class CodeInterpreter:
|
|
def __init__(self, timeout=300):
|
|
self.globals = {}
|
|
self.locals = {}
|
|
self.timeout = timeout
|
|
|
|
def execute_code(self, code):
|
|
try:
|
|
# Wrap the code in an eval() call to return the result
|
|
wrapped_code = f"__result__ = eval({repr(code)}, globals(), locals())"
|
|
exec(wrapped_code, self.globals, self.locals)
|
|
return self.locals.get('__result__', None)
|
|
except Exception as e:
|
|
try:
|
|
# If eval fails, attempt to exec the code without returning a result
|
|
exec(code, self.globals, self.locals)
|
|
return "Code executed successfully."
|
|
except Exception as e:
|
|
return f"Error: {str(e)}"
|
|
|
|
def reset_session(self):
|
|
self.globals = {}
|
|
self.locals = {}
|
|
|
|
def build_tool(config) -> Tool:
|
|
tool = Tool(
|
|
"Python Code Interpreter Tool",
|
|
"Execute Python Codes",
|
|
name_for_model="code_interpreter",
|
|
description_for_model="Plugin for executing python codes",
|
|
logo_url=None,
|
|
contact_email=None,
|
|
legal_info_url=None
|
|
)
|
|
|
|
# Usage example
|
|
interpreter = CodeInterpreter()
|
|
|
|
@tool.get("/execute_code")
|
|
def execute_python_code(code: str):
|
|
'''execute Python expressions with Python Interpreter, can be used as a simple calculator e.g., "(123 + 234) / 23 * 19"
|
|
'''
|
|
return interpreter.execute_code(code)
|
|
|
|
return tool |