File size: 3,067 Bytes
58e0d8e
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
import streamlit as st
from utils import rnd_id
from my_tools import TOOL_CLASSES
from streamlit import session_state as ss
import db_utils

class PageTools:
    def __init__(self):
        self.name = "Tools"
        self.available_tools = TOOL_CLASSES

    def create_tool(self, tool_name):
        tool_class = self.available_tools[tool_name]
        tool_instance = tool_class(rnd_id())
        if 'tools' not in ss:
            ss.tools = []
        ss.tools.append(tool_instance)
        db_utils.save_tool(tool_instance)  # Save tool to database

    def remove_tool(self, tool_id):
        ss.tools = [tool for tool in ss.tools if tool.tool_id != tool_id]
        db_utils.delete_tool(tool_id)
        st.rerun()

    def set_tool_parameter(self, tool_id, param_name, value):
        if value == "":
            value = None
        for tool in ss.tools:
            if tool.tool_id == tool_id:
                tool.set_parameters(**{param_name: value})
                db_utils.save_tool(tool)
                break

    def get_tool_display_name(self, tool):
        first_param_name = tool.get_parameter_names()[0] if tool.get_parameter_names() else None
        first_param_value = tool.parameters.get(first_param_name, '') if first_param_name else ''
        return f"{tool.name} ({first_param_value if first_param_value else tool.tool_id})"

    def draw_tools(self):
        c1,c2 = st.columns([1, 3])
        #st.write("Available Tools:")
        with c1:
            for tool_name in self.available_tools.keys():
                tool_class = self.available_tools[tool_name]
                tool_instance = tool_class()
                tool_description = tool_instance.description
                if st.button(f"{tool_name}", key=f"enable_{tool_name}", help=tool_description):
                    self.create_tool(tool_name)
        with c2:
            if 'tools' in ss:
                st.write("##### Enabled Tools")
                for tool in ss.tools:
                    display_name = self.get_tool_display_name(tool)
                    is_complete = tool.is_valid()
                    expander_title = display_name if is_complete else f"❗ {display_name}"
                    with st.expander(expander_title):
                        st.write(tool.description)
                        for param_name in tool.get_parameter_names():
                            param_value = tool.parameters.get(param_name, "")
                            placeholder = "Required" if tool.is_parameter_mandatory(param_name) else "Optional"
                            new_value = st.text_input(f"{param_name}", value=param_value, key=f"{tool.tool_id}_{param_name}", placeholder=placeholder)
                            if new_value != param_value:
                                self.set_tool_parameter(tool.tool_id, param_name, new_value)
                        if st.button(f"Remove", key=f"remove_{tool.tool_id}"):
                            self.remove_tool(tool.tool_id)

    def draw(self):
        st.subheader(self.name)
        self.draw_tools()