File size: 1,595 Bytes
5f048ad 9f1e882 5f048ad 9f1e882 5f048ad 9f1e882 5f048ad 9f1e882 5f048ad |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 |
from __future__ import annotations
import sys
from io import StringIO
from typing import Annotated
import gradio as gr
from ._docstrings import autodoc
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; 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
redirected_output = sys.stdout = StringIO()
try:
exec(code)
result = redirected_output.getvalue()
except Exception as exc: # pylint: disable=broad-except
result = str(exc)
finally:
sys.stdout = old_stdout
_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="<div style=\"text-align:center\">Execute Python code and see the output.</div>",
api_description=TOOL_SUMMARY,
flagging_mode="never",
)
__all__ = ["Code_Interpreter", "build_interface"]
|