# Importing the libraries import json import time import hnswlib import numpy as np import streamlit as st from openai import OpenAI import streamlit_nested_layout from sentence_transformers import SentenceTransformer, CrossEncoder from utils import * # -----------------------------------------------------------defined arguments----------------------------------------------------------- count = 0 save = 0 # Defined arguments API_KEY=st.secrets["API_KEY"] model_name = "gpt-3.5-turbo" # model name tool_list_path = "./tools.json" # list of tools path example_path = "./examples.json" # list of examples path user_query = "Summarize my P1 issues in triage" zero_shot = 0 no_of_examples = 2 # ---------------------------------------------------some constants ---------------------------------------------------------------------- EF = 100 # EF K = 3 # top k number COSINE_THRESHOLD = 0.3 # cosine threshold biencoder = SentenceTransformer("BAAI/bge-large-en-v1.5", device="cpu") cross_encoder = CrossEncoder( "cross-encoder/ms-marco-MiniLM-L-12-v2", max_length=512, device="cpu" ) client = OpenAI(api_key=st.secrets["API_KEY"], timeout=60, max_retries=2) # ------------------------------------------------------------------------------------------------------------------------------ if "n_args" not in st.session_state: st.session_state["n_args"] = 0 if "new_tool" not in st.session_state: st.session_state["new_tool"] = {} if "tools" not in st.session_state: st.session_state.tools = list(tool_obj.tools.values()) def warn(message): st.toast(message) # Save Tool def save_tool(tool_list): if type(tool_list) == list: for t in tool_list: tool_obj.add_tool(t) st.toast("Updated", icon="✅") else: tool_obj.add_tool(tool_list) # Function to Add Arguments def add_arguments(i): global count with st.expander(f"Argument {i+1}"): st.session_state["new_tool"]["argument_list"][i][ "argument_name" ] = st.text_input("Argument Name", "", key=count) count += 1 st.session_state["new_tool"]["argument_list"][i][ "argument_description" ] = st.text_input("Argument Description", "", key=count) count += 1 st.session_state["new_tool"]["argument_list"][i][ "argument_type" ] = st.text_input("Argument Type", "", key=count) count += 1 st.session_state["new_tool"]["argument_list"][i]["example"] = st.text_input( "Argument Examples", "", key=count ) count += 1 if st.button( "Delete Argument", key=count, use_container_width=True, type="primary" ): warn( f'Deleted {st.session_state["new_tool"]["argument_list"][i]["argument_name"]}' ) st.session_state["n_args"] -= 1 del st.session_state["new_tool"]["argument_list"][i] st.rerun() count += 1 # -----------------------------------------------------------User Interface----------------------------------------------------------- with st.sidebar: with st.expander("Add Tool"): st.session_state["new_tool"]["tool_name"] = "" st.session_state["new_tool"]["tool_description"] = "" st.session_state["new_tool"]["return_type"] = "" st.session_state["new_tool"]["tool_name"] = st.text_input("Tool Name", st.session_state["new_tool"]["tool_name"]) st.session_state["new_tool"]["tool_description"] = st.text_input( "Tool Description", "" ) st.session_state["new_tool"]["return_type"] = st.text_input( "Return Datatype", "" ) if "argument_list" not in st.session_state["new_tool"]: st.session_state["new_tool"]["argument_list"] = [] with st.expander("Arguments"): for i in range(st.session_state["n_args"]): add_arguments(i) cols = st.columns(2) with cols[0]: if st.button("Add", use_container_width=True): st.session_state["n_args"] += 1 st.session_state["new_tool"]["argument_list"].append( { "argument_name": "", "argument_description": "", "argument_type": "", "example": "", } ) st.rerun() with cols[1]: if st.button("Save", use_container_width=True): save = 1 try: # Make Sure all fields are filled print(st.session_state.new_tool) if not st.session_state["new_tool"]["tool_name"]: raise Exception("Empty Tool Name") if not st.session_state["new_tool"]["tool_description"]: raise Exception("Empty Tool Description") if not st.session_state["new_tool"]["return_type"]: raise Exception("Empty Return Type") for arg in st.session_state["new_tool"]["argument_list"]: if not arg["argument_name"]: raise Exception("No argument name given") if not arg["argument_description"]: raise Exception("No argument description given") if not arg["argument_type"]: raise Exception("No argument type given") if not arg["example"]: raise Exception("No example of argument given") with st.spinner("Adding..."): save_tool(st.session_state["new_tool"]) st.session_state.tools = list(tool_obj.tools.values()) time.sleep(2) st.session_state["new_tool"] = {} st.session_state["n_args"] = 0 except Exception as e: st.toast(e) st.rerun() with st.expander("Add Tools Via Json"): uploaded_file = st.file_uploader("Choose a file") if uploaded_file is not None: data = json.load(uploaded_file) # st.write(data) try: try: for d in data: tool_obj.check_json(d) except Exception as e: st.toast(f"Inccorect Format: {e}") with st.spinner("Adding..."): save_tool(data) # st.session_state["tools"] += data st.session_state.tools = list(tool_obj.tools.values()) st.toast(":green[Added Tools!]") except: st.toast("Incorrect Format Specified") with st.expander("Current Tools"): for i, tool in enumerate(st.session_state.tools): with st.expander(tool["tool_name"]): count += 1 st.session_state["tools"][i]["tool_description"] = st.text_input( "Tool Description", st.session_state["tools"][i]["tool_description"], key=count, ) count += 1 with st.expander("Argument List"): for j, arg in enumerate(tool["argument_list"]): with st.expander(arg["argument_name"]): st.session_state["tools"][i]["argument_list"][j][ "argument_name" ] = st.text_input( "Argument Name", st.session_state["tools"][i]["argument_list"][j][ "argument_name" ], key=count, ) count += 1 st.session_state["tools"][i]["argument_list"][j][ "argument_description" ] = st.text_input( "Argument Description", st.session_state["tools"][i]["argument_list"][j][ "argument_description" ], key=count, ) count += 1 st.session_state["tools"][i]["argument_list"][j][ "argument_type" ] = st.text_input( "Argument Type", st.session_state["tools"][i]["argument_list"][j][ "argument_type" ], key=count, ) count += 1 st.session_state["tools"][i]["argument_list"][j][ "example" ] = st.text_input( "Argument Example", st.session_state["tools"][i]["argument_list"][j][ "example" ], key=count, ) count += 1 columns = st.columns(2) with columns[0]: if st.button( "Delete", key=count, use_container_width=True, type="primary", ): with st.spinner("Deleting..."): del st.session_state["tools"][i]["argument_list"][j] save_tool(st.session_state["tools"][i]) st.session_state.tools = list(tool_obj.tools.values()) st.toast(f":red[Deleted Tool]") st.rerun() count += 1 with columns[1]: if st.button( "Save", key=count, use_container_width=True ): save_tool(st.session_state["tools"][i]) st.session_state.tools = list(tool_obj.tools.values()) st.rerun() count += 1 cols = st.columns([2, 2, 1]) with cols[0]: if st.button("Add", key=count, use_container_width=True): st.session_state.tools[i]["argument_list"].append( { "argument_name": "", "argument_description": "", "argument_type": "", "example": "", } ) st.rerun() count += 1 with cols[1]: if st.button("Save", key=count, use_container_width=True): with st.spinner("Wait"): save_tool(st.session_state["tools"][i]) st.session_state.tools = list(tool_obj.tools.values()) st.toast(f":green[Modified Tool]") st.rerun() count += 1 with cols[2]: if st.button("❌", key=count): warn(f"Deleted {tool['tool_name']}") tool_obj.delete_tool(tool["tool_name"]) st.session_state["tools"] = list(tool_obj.tools.values()) st.rerun() count += 1 from time import sleep st.markdown("# ToolMaster") prompt = st.chat_input("Say something") if prompt: st.chat_message("user").write(prompt.replace(":", "\:")) with st.spinner('Querying...'): answer = main(prompt) st.chat_message("assistant").write(answer)