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"]