chain-check3 / plugins /python /functions.py
ashm's picture
Upload 21 files
d4ea1a4
Raw History Blame Contribute Delete
2.82 kB
import asyncio
import subprocess
import sys
import chainlit as cl
import os
from .executor import PythonExecutor
async def python_exec(code: str, language: str = "python"):
"""
Exexute code. \nNote: This endpoint current supports a REPL-like environment for Python only.\n\nArgs:\n request (CodeExecutionRequest): The request object containing the code to execute.\n\nReturns:\n CodeExecutionResponse: The result of the code execution.
Parameters: code: (str, required): A Python code snippet for execution in a Jupyter environment, where variables and imports from previously executed code are accessible. The code must not rely on external variables/imports not available in this environment, and must print a dictionary `{"type": "<type>", "path": "<path>", "status": "<status>"}` as the last operation. `<type>` can be "image", "file", or "content", `<path>` is the file path (not needed if `<type>` is "content"), `<status>` indicates execution status. Display operations should save output as a file with path returned in the dictionary. If tabular data is generated, it should be directly returned as a string. The code must end with a `print` statement.the end must be print({"type": "<type>", "path": "<path>", "status": "<status>"})
"""
myexcutor = PythonExecutor()
code_output = myexcutor.execute(code)
print(f"REPL execution result: {code_output}")
response = {"result": code_output.strip()}
return response
async def need_install_package(package_name: str) -> dict:
"""
If the user's question mentions installing packages, and the packages need to be installed,
you can call this function.
Parameters: package_name: The name of the package.(required)
"""
# check if package is already installed
cmd_check = [sys.executable, '-m', 'pip', 'show', package_name]
proc = subprocess.Popen(cmd_check,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE)
out, _ = proc.communicate()
if out:
return {'description': f"{package_name} is already installed"}
# install package if it's not installed
cmd_install = [sys.executable, '-m', 'pip', 'install', package_name]
process = await asyncio.create_subprocess_exec(
*cmd_install,
stdout=asyncio.subprocess.PIPE,
stderr=asyncio.subprocess.PIPE)
stdout, stderr = await process.communicate()
if process.returncode != 0:
await cl.Message(content=f"Failed to install {package_name}.").send()
return {
'description':
f"Error installing {package_name}: {stderr.decode()}"
}
await cl.Message(content=f"Successfully installed {package_name}.").send()
return {'description': f"{package_name} has been successfully installed"}