from __future__ import annotations import os import sys from io import StringIO from typing import Annotated import gradio as gr from ._docstrings import autodoc from .File_System import ROOT_DIR from app import _log_call_end, _log_call_start, _truncate_for_log # Single source of truth for the LLM-facing tool description TOOL_SUMMARY = ( "Execute Python code from the tool root; returns captured stdout or the exception text." ) @autodoc( summary=TOOL_SUMMARY, ) def Code_Interpreter(code: Annotated[str, "Python source code to run; stdout is captured and returned."]) -> str: _log_call_start("Code_Interpreter", code=_truncate_for_log(code or "", 300)) if code is None: result = "No code provided." _log_call_end("Code_Interpreter", result) return result old_stdout = sys.stdout old_cwd = os.getcwd() redirected_output = sys.stdout = StringIO() try: os.chdir(ROOT_DIR) exec(code) result = redirected_output.getvalue() except Exception as exc: # pylint: disable=broad-except result = str(exc) finally: sys.stdout = old_stdout try: os.chdir(old_cwd) except Exception: pass _log_call_end("Code_Interpreter", _truncate_for_log(result)) return result def build_interface() -> gr.Interface: return gr.Interface( fn=Code_Interpreter, inputs=gr.Code(label="Python Code", language="python"), outputs=gr.Textbox(label="Output", lines=5, max_lines=20), title="Code Interpreter", description="
Execute Python code and see the output.
", api_description=TOOL_SUMMARY, flagging_mode="never", ) __all__ = ["Code_Interpreter", "build_interface"]