Spaces:
Runtime error
Runtime error
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()
|