From c6a6a95abadedc033833d61194e07714b90626b2 Mon Sep 17 00:00:00 2001 From: abhijeet Date: Mon, 31 Jul 2023 14:09:26 +0530 Subject: [PATCH 1/8] initial toolkit update --- superagi/controllers/toolkit.py | 21 +++++++++++++++++++++ superagi/models/tool.py | 4 ++++ superagi/models/tool_config.py | 5 +++++ tools.json | 8 +++++--- 4 files changed, 35 insertions(+), 3 deletions(-) diff --git a/superagi/controllers/toolkit.py b/superagi/controllers/toolkit.py index f6ae7aa23..23756fc18 100644 --- a/superagi/controllers/toolkit.py +++ b/superagi/controllers/toolkit.py @@ -303,3 +303,24 @@ def get_installed_toolkit_list(organisation: Organisation = Depends(get_user_org toolkit.tools = toolkit_tools return toolkits + +@router.get("/check_update/{toolkit_name}") +def check_toolkit_update(toolkit_name: str, organisation: Organisation = Depends(get_user_organisation)): + """ + Check if there is an update available for the installed tool kits. + + Returns: + dict: The response containing the update details. + + """ + marketplace_toolkit = Toolkit.fetch_marketplace_detail(search_str="details", + toolkit_name=toolkit_name) + installed_toolkit = Toolkit.get_toolkit_from_name(db.session, toolkit_name, organisation) + installed_toolkit.tools = Tool.get_tools(db.session, installed_toolkit) + installed_toolkit.tools_configs = ToolConfig.get_tool_configs(db.session, installed_toolkit) + print("marketplace_toolkit : ", marketplace_toolkit) + print("installed_toolkit : ", installed_toolkit) + if not installed_toolkit: + return True + + diff --git a/superagi/models/tool.py b/superagi/models/tool.py index 55ee650b2..d32a1af62 100644 --- a/superagi/models/tool.py +++ b/superagi/models/tool.py @@ -109,3 +109,7 @@ def get_invalid_tools(cls, tool_ids, session): if tool is None: invalid_tool_ids.append(tool_id) return invalid_tool_ids + + @classmethod + def get_tools(cls, session, toolkit): + return session.query(Tool).filter(Tool.toolkit_id == toolkit.id).all() \ No newline at end of file diff --git a/superagi/models/tool_config.py b/superagi/models/tool_config.py index d0e3c3566..f88124810 100644 --- a/superagi/models/tool_config.py +++ b/superagi/models/tool_config.py @@ -61,3 +61,8 @@ def add_or_update(session: Session, toolkit_id: int, key: str, value: str = None session.add(tool_config) session.commit() + + @classmethod + def get_tool_config(cls, session: Session, toolkit_id: int): + tool_configs = session.query(ToolConfig).filter_by(toolkit_id=toolkit_id).all() + return tool_configs \ No newline at end of file diff --git a/tools.json b/tools.json index 9091ede76..4b8b1f805 100644 --- a/tools.json +++ b/tools.json @@ -1,4 +1,6 @@ { - "tools": { - } -} + "tools": { + "DuckDuckGo": "https://github.com/TransformerOptimus/SuperAGI-Tools/tree/main/DuckDuckGo", + "notion": "https://github.com/TransformerOptimus/SuperAGI-Tools/tree/main/notion" + } +} \ No newline at end of file From 3c02c63aaef2729ca90c7100f6e53d7866956dc4 Mon Sep 17 00:00:00 2001 From: abhijeet Date: Tue, 1 Aug 2023 15:58:43 +0530 Subject: [PATCH 2/8] Update toolkit feature --- superagi/controllers/toolkit.py | 128 ++++++++++++++++++++++++++++++-- superagi/models/tool.py | 22 +++++- superagi/models/tool_config.py | 5 +- 3 files changed, 141 insertions(+), 14 deletions(-) diff --git a/superagi/controllers/toolkit.py b/superagi/controllers/toolkit.py index 23756fc18..881cf8c9f 100644 --- a/superagi/controllers/toolkit.py +++ b/superagi/controllers/toolkit.py @@ -145,8 +145,8 @@ def install_toolkit_from_marketplace(toolkit_name: str, toolkit = Toolkit.fetch_marketplace_detail(search_str="details", toolkit_name=toolkit_name) db_toolkit = Toolkit.add_or_update(session=db.session, name=toolkit['name'], description=toolkit['description'], - tool_code_link=toolkit['tool_code_link'], organisation_id=organisation.id, - show_toolkit=toolkit['show_toolkit']) + tool_code_link=toolkit['tool_code_link'], organisation_id=organisation.id, + show_toolkit=toolkit['show_toolkit']) for tool in toolkit['tools']: Tool.add_or_update(session=db.session, tool_name=tool['name'], description=tool['description'], folder_name=tool['folder_name'], class_name=tool['class_name'], file_name=tool['file_name'], @@ -304,6 +304,70 @@ def get_installed_toolkit_list(organisation: Organisation = Depends(get_user_org return toolkits + +def compare_tools(tool1, tool2): + print("Comparing Tools ") + print("Tool 1: ", tool1) + print("Tool 2: ", tool2) + fields = ["name", "description"] + result = any(tool1.get(field) != tool2.get(field) for field in fields) + for field in fields: + if tool1.get(field) != tool2.get(field): + print("TOOLS COMPARE FOUND DIFFERENCE -----------------") + print("Field: ", field) + print("Tool 1: ", tool1.get(field)) + print("Tool2 : ", tool2.get(field)) + print("Result: ", result) + return result + + +def compare_configs(config1, config2): + print("Comparing Configs ") + print("Config 1: ", config1) + print("Config 2: ", config2) + + fields = ["key"] + result = any(config1.get(field) != config2.get(field) for field in fields) + for field in fields: + if config1.get(field) != config2.get(field): + print("CONFIG COMPARE FOUND DIFFERENCE -----------------") + print("Field: ", field) + print("Config 1: ", config1.get(field)) + print("Config 2 : ", config2.get(field)) + print("Result: ", result) + return result + + +def compare_objects(obj1, obj2): + # Step 1: Compare the main toolkit fields + main_toolkit_fields = ["description", "show_toolkit", "name", "tool_code_link"] + toolkit_diff = any(obj1.get(field) != obj2.get(field) for field in main_toolkit_fields) + + tools1 = sorted(obj1.get("tools", []), key=lambda tool: tool.get("name", "")) + tools2 = sorted(obj2.get("tools", []), key=lambda tool: tool.get("name", "")) + + if len(tools1) != len(tools2): + tools_diff = True + else: + tools_diff = any(compare_tools(tool1, tool2) for tool1, tool2 in zip(tools1, tools2)) + + # Step 3: Compare the list of tool configs + tool_configs1 = sorted(obj1.get("configs", []), key=lambda config: config.get("key", "")) + tool_configs2 = sorted(obj2.get("configs", []), key=lambda config: config.get("key", "")) + if len(tool_configs1) != len(tool_configs2): + tool_configs_diff = True + else: + tool_configs_diff = any(compare_configs(config1, config2) for config1, config2 in zip(tool_configs1, + tool_configs2)) + + # Check if any part of the objects is different (except for id, created_at, and updated_at) + print("toolkit_diff : ", toolkit_diff) + print("tools_diff : ", tools_diff) + print("tool_configs_diff : ", tool_configs_diff) + + return toolkit_diff or tools_diff or tool_configs_diff + + @router.get("/check_update/{toolkit_name}") def check_toolkit_update(toolkit_name: str, organisation: Organisation = Depends(get_user_organisation)): """ @@ -314,13 +378,61 @@ def check_toolkit_update(toolkit_name: str, organisation: Organisation = Depends """ marketplace_toolkit = Toolkit.fetch_marketplace_detail(search_str="details", - toolkit_name=toolkit_name) - installed_toolkit = Toolkit.get_toolkit_from_name(db.session, toolkit_name, organisation) - installed_toolkit.tools = Tool.get_tools(db.session, installed_toolkit) - installed_toolkit.tools_configs = ToolConfig.get_tool_configs(db.session, installed_toolkit) + toolkit_name=toolkit_name) + if marketplace_toolkit is None: + raise HTTPException(status_code=404, detail="Toolkit not found in marketplace") print("marketplace_toolkit : ", marketplace_toolkit) - print("installed_toolkit : ", installed_toolkit) - if not installed_toolkit: + installed_toolkit = Toolkit.get_toolkit_from_name(db.session, toolkit_name, organisation) + if installed_toolkit is None: return True + installed_toolkit = installed_toolkit.to_dict() + + print("installed_toolkit : ", installed_toolkit) + tools = Tool.get_toolkit_tools(db.session, installed_toolkit["id"]) + configs = ToolConfig.get_toolkit_tool_config(db.session, installed_toolkit["id"]) + installed_toolkit["configs"] = [] + installed_toolkit["tools"] = [] + + for config in configs: + installed_toolkit["configs"].append(config.to_dict()) + for tool in tools: + installed_toolkit["tools"].append(tool.to_dict()) + + print("____________________________________________Final installed_toolkit : ") + print(installed_toolkit) + return compare_objects(marketplace_toolkit, installed_toolkit) +@router.put("/update/{toolkit_name}") +def update_toolkit(toolkit_name: str, organisation: Organisation = Depends(get_user_organisation)): + """ + Update the toolkit with the latest version from the marketplace. + Returns: + dict: The response containing the update details. + """ + marketplace_toolkit = Toolkit.fetch_marketplace_detail(search_str="details", + toolkit_name=toolkit_name) + print("_____________________ MARKET PLACE TOOLKIT : ",marketplace_toolkit) + # Create a new ToolKit object + update_toolkit = Toolkit.add_or_update( + db.session, + name=marketplace_toolkit["name"], + description=marketplace_toolkit["description"], + show_toolkit=True if len(marketplace_toolkit["tools"]) > 1 else False, + organisation_id=organisation.id, + tool_code_link=marketplace_toolkit["tool_code_link"] + ) + print("Updated Toolkit", update_toolkit) + # Store the tools in the database + for tool in marketplace_toolkit["tools"]: + new_tool = Tool.add_or_update(db.session, tool_name=tool["name"], folder_name=tool["folder_name"], + class_name=tool["class_name"], file_name=tool["file_name"], + toolkit_id=update_toolkit.id, description=tool["description"]) + print("updated tool : ", new_tool) + + # Store the tools config in the database + for tool_config_key in marketplace_toolkit["configs"]: + print("tool_config_key : ", tool_config_key) + new_config = ToolConfig.add_or_update(db.session, toolkit_id=update_toolkit.id, + key=tool_config_key["key"]) + print("updated config : ", new_config) \ No newline at end of file diff --git a/superagi/models/tool.py b/superagi/models/tool.py index d32a1af62..4bcd3a69d 100644 --- a/superagi/models/tool.py +++ b/superagi/models/tool.py @@ -38,6 +38,22 @@ def __repr__(self): return f"Tool(id={self.id}, name='{self.name}',description='{self.description}' folder_name='{self.folder_name}'," \ f" file_name = {self.file_name}, class_name='{self.class_name}, toolkit_id={self.toolkit_id}')" + def to_dict(self): + """ + Convert the Tool instance to a dictionary. + + Returns: + dict: A dictionary representation of the Tool instance. + """ + return { + "id": self.id, + "name": self.name, + "description": self.description, + "folder_name": self.folder_name, + "class_name": self.class_name, + "file_name": self.file_name, + "toolkit_id": self.toolkit_id + } @staticmethod def add_or_update(session, tool_name: str, description: str, folder_name: str, class_name: str, file_name: str, toolkit_id: int): @@ -100,7 +116,7 @@ def convert_tool_ids_to_names(cls, db, tool_ids): tools = db.session.query(Tool).filter(Tool.id.in_(tool_ids)).all() return [str(tool.name) for tool in tools] - + @classmethod def get_invalid_tools(cls, tool_ids, session): invalid_tool_ids = [] @@ -111,5 +127,5 @@ def get_invalid_tools(cls, tool_ids, session): return invalid_tool_ids @classmethod - def get_tools(cls, session, toolkit): - return session.query(Tool).filter(Tool.toolkit_id == toolkit.id).all() \ No newline at end of file + def get_toolkit_tools(cls, session, toolkit_id : int): + return session.query(Tool).filter(Tool.toolkit_id == toolkit_id).all() \ No newline at end of file diff --git a/superagi/models/tool_config.py b/superagi/models/tool_config.py index f88124810..95a2cfb47 100644 --- a/superagi/models/tool_config.py +++ b/superagi/models/tool_config.py @@ -63,6 +63,5 @@ def add_or_update(session: Session, toolkit_id: int, key: str, value: str = None session.commit() @classmethod - def get_tool_config(cls, session: Session, toolkit_id: int): - tool_configs = session.query(ToolConfig).filter_by(toolkit_id=toolkit_id).all() - return tool_configs \ No newline at end of file + def get_toolkit_tool_config(cls, session: Session, toolkit_id: int): + return session.query(ToolConfig).filter_by(toolkit_id=toolkit_id).all() From 8c8ff798202153c9581d52cec850d22fe26bb0ee Mon Sep 17 00:00:00 2001 From: abhijeet Date: Tue, 1 Aug 2023 16:19:13 +0530 Subject: [PATCH 3/8] Update Tests --- superagi/controllers/toolkit.py | 91 ++------------------- superagi/helper/tool_helper.py | 40 ++++++++- tests/unit_tests/helper/test_tool_helper.py | 80 +++++++++++++++++- 3 files changed, 127 insertions(+), 84 deletions(-) diff --git a/superagi/controllers/toolkit.py b/superagi/controllers/toolkit.py index 881cf8c9f..849024208 100644 --- a/superagi/controllers/toolkit.py +++ b/superagi/controllers/toolkit.py @@ -14,6 +14,7 @@ from superagi.models.tool_config import ToolConfig from superagi.models.toolkit import Toolkit from superagi.types.common import GitHubLinkRequest +from superagi.helper.tool_helper import compare_toolkit router = APIRouter() @@ -305,69 +306,6 @@ def get_installed_toolkit_list(organisation: Organisation = Depends(get_user_org return toolkits -def compare_tools(tool1, tool2): - print("Comparing Tools ") - print("Tool 1: ", tool1) - print("Tool 2: ", tool2) - fields = ["name", "description"] - result = any(tool1.get(field) != tool2.get(field) for field in fields) - for field in fields: - if tool1.get(field) != tool2.get(field): - print("TOOLS COMPARE FOUND DIFFERENCE -----------------") - print("Field: ", field) - print("Tool 1: ", tool1.get(field)) - print("Tool2 : ", tool2.get(field)) - print("Result: ", result) - return result - - -def compare_configs(config1, config2): - print("Comparing Configs ") - print("Config 1: ", config1) - print("Config 2: ", config2) - - fields = ["key"] - result = any(config1.get(field) != config2.get(field) for field in fields) - for field in fields: - if config1.get(field) != config2.get(field): - print("CONFIG COMPARE FOUND DIFFERENCE -----------------") - print("Field: ", field) - print("Config 1: ", config1.get(field)) - print("Config 2 : ", config2.get(field)) - print("Result: ", result) - return result - - -def compare_objects(obj1, obj2): - # Step 1: Compare the main toolkit fields - main_toolkit_fields = ["description", "show_toolkit", "name", "tool_code_link"] - toolkit_diff = any(obj1.get(field) != obj2.get(field) for field in main_toolkit_fields) - - tools1 = sorted(obj1.get("tools", []), key=lambda tool: tool.get("name", "")) - tools2 = sorted(obj2.get("tools", []), key=lambda tool: tool.get("name", "")) - - if len(tools1) != len(tools2): - tools_diff = True - else: - tools_diff = any(compare_tools(tool1, tool2) for tool1, tool2 in zip(tools1, tools2)) - - # Step 3: Compare the list of tool configs - tool_configs1 = sorted(obj1.get("configs", []), key=lambda config: config.get("key", "")) - tool_configs2 = sorted(obj2.get("configs", []), key=lambda config: config.get("key", "")) - if len(tool_configs1) != len(tool_configs2): - tool_configs_diff = True - else: - tool_configs_diff = any(compare_configs(config1, config2) for config1, config2 in zip(tool_configs1, - tool_configs2)) - - # Check if any part of the objects is different (except for id, created_at, and updated_at) - print("toolkit_diff : ", toolkit_diff) - print("tools_diff : ", tools_diff) - print("tool_configs_diff : ", tool_configs_diff) - - return toolkit_diff or tools_diff or tool_configs_diff - - @router.get("/check_update/{toolkit_name}") def check_toolkit_update(toolkit_name: str, organisation: Organisation = Depends(get_user_organisation)): """ @@ -381,13 +319,10 @@ def check_toolkit_update(toolkit_name: str, organisation: Organisation = Depends toolkit_name=toolkit_name) if marketplace_toolkit is None: raise HTTPException(status_code=404, detail="Toolkit not found in marketplace") - print("marketplace_toolkit : ", marketplace_toolkit) installed_toolkit = Toolkit.get_toolkit_from_name(db.session, toolkit_name, organisation) if installed_toolkit is None: return True installed_toolkit = installed_toolkit.to_dict() - - print("installed_toolkit : ", installed_toolkit) tools = Tool.get_toolkit_tools(db.session, installed_toolkit["id"]) configs = ToolConfig.get_toolkit_tool_config(db.session, installed_toolkit["id"]) installed_toolkit["configs"] = [] @@ -398,9 +333,7 @@ def check_toolkit_update(toolkit_name: str, organisation: Organisation = Depends for tool in tools: installed_toolkit["tools"].append(tool.to_dict()) - print("____________________________________________Final installed_toolkit : ") - print(installed_toolkit) - return compare_objects(marketplace_toolkit, installed_toolkit) + return compare_toolkit(marketplace_toolkit, installed_toolkit) @router.put("/update/{toolkit_name}") @@ -412,8 +345,7 @@ def update_toolkit(toolkit_name: str, organisation: Organisation = Depends(get_u """ marketplace_toolkit = Toolkit.fetch_marketplace_detail(search_str="details", toolkit_name=toolkit_name) - print("_____________________ MARKET PLACE TOOLKIT : ",marketplace_toolkit) - # Create a new ToolKit object + update_toolkit = Toolkit.add_or_update( db.session, name=marketplace_toolkit["name"], @@ -422,17 +354,12 @@ def update_toolkit(toolkit_name: str, organisation: Organisation = Depends(get_u organisation_id=organisation.id, tool_code_link=marketplace_toolkit["tool_code_link"] ) - print("Updated Toolkit", update_toolkit) - # Store the tools in the database + for tool in marketplace_toolkit["tools"]: - new_tool = Tool.add_or_update(db.session, tool_name=tool["name"], folder_name=tool["folder_name"], - class_name=tool["class_name"], file_name=tool["file_name"], - toolkit_id=update_toolkit.id, description=tool["description"]) - print("updated tool : ", new_tool) + Tool.add_or_update(db.session, tool_name=tool["name"], folder_name=tool["folder_name"], + class_name=tool["class_name"], file_name=tool["file_name"], + toolkit_id=update_toolkit.id, description=tool["description"]) - # Store the tools config in the database for tool_config_key in marketplace_toolkit["configs"]: - print("tool_config_key : ", tool_config_key) - new_config = ToolConfig.add_or_update(db.session, toolkit_id=update_toolkit.id, - key=tool_config_key["key"]) - print("updated config : ", new_config) \ No newline at end of file + ToolConfig.add_or_update(db.session, toolkit_id=update_toolkit.id, + key=tool_config_key["key"]) diff --git a/superagi/helper/tool_helper.py b/superagi/helper/tool_helper.py index b9eaf0865..11b50945d 100644 --- a/superagi/helper/tool_helper.py +++ b/superagi/helper/tool_helper.py @@ -257,12 +257,14 @@ def register_toolkits(session, organisation): process_files(tool_paths, session, organisation) logger.info(f"Toolkits Registered Successfully for Organisation ID : {organisation.id}!") + def register_marketplace_toolkits(session, organisation): - tool_paths = ["superagi/tools", "superagi/tools/external_tools","superagi/tools/marketplace_tools"] + tool_paths = ["superagi/tools", "superagi/tools/external_tools", "superagi/tools/marketplace_tools"] if organisation is not None: process_files(tool_paths, session, organisation) logger.info(f"Marketplace Toolkits Registered Successfully for Organisation ID : {organisation.id}!") + def extract_repo_name(repo_link): # Extract the repository name from the link # Assuming the GitHub link format: https://github.com/username/repoName @@ -297,3 +299,39 @@ def handle_tools_import(): folder_dir = os.path.join(tool_path, folder_name) if os.path.isdir(folder_dir): sys.path.append(folder_dir) + + +def compare_tools(tool1, tool2): + fields = ["name", "description"] + return any(tool1.get(field) != tool2.get(field) for field in fields) + + +def compare_configs(config1, config2): + fields = ["key"] + return any(config1.get(field) != config2.get(field) for field in fields) + + +def compare_toolkit(toolkit1, toolkit2): + main_toolkit_fields = ["description", "show_toolkit", "name", "tool_code_link"] + toolkit_diff = any(toolkit1.get(field) != toolkit2.get(field) for field in main_toolkit_fields) + + tools1 = sorted(toolkit1.get("tools", []), key=lambda tool: tool.get("name", "")) + tools2 = sorted(toolkit2.get("tools", []), key=lambda tool: tool.get("name", "")) + + if len(tools1) != len(tools2): + tools_diff = True + else: + tools_diff = any(compare_tools(tool1, tool2) for tool1, tool2 in zip(tools1, tools2)) + + tool_configs1 = sorted(toolkit1.get("configs", []), key=lambda config: config.get("key", "")) + tool_configs2 = sorted(toolkit2.get("configs", []), key=lambda config: config.get("key", "")) + if len(tool_configs1) != len(tool_configs2): + tool_configs_diff = True + else: + tool_configs_diff = any(compare_configs(config1, config2) for config1, config2 in zip(tool_configs1, + tool_configs2)) + + print("toolkit_diff : ", toolkit_diff) + print("tools_diff : ", tools_diff) + print("tool_configs_diff : ", tool_configs_diff) + return toolkit_diff or tools_diff or tool_configs_diff diff --git a/tests/unit_tests/helper/test_tool_helper.py b/tests/unit_tests/helper/test_tool_helper.py index 8d3ce77c7..bce09d215 100644 --- a/tests/unit_tests/helper/test_tool_helper.py +++ b/tests/unit_tests/helper/test_tool_helper.py @@ -10,7 +10,8 @@ parse_github_url, load_module_from_file, extract_repo_name, - get_readme_content_from_code_link, download_tool, handle_tools_import + get_readme_content_from_code_link, download_tool, handle_tools_import, compare_toolkit, compare_configs, + compare_tools ) @@ -108,3 +109,80 @@ def test_handle_tools_import(): initial_path_length = len(sys.path) handle_tools_import() assert len(sys.path), initial_path_length + 2 + +def test_compare_tools(): + tool1 = {"name": "Tool A", "description": "This is Tool A"} + tool2 = {"name": "Tool A", "description": "This is Tool A"} + assert not compare_tools(tool1, tool2) + + tool1 = {"name": "Tool A", "description": "This is Tool A"} + tool2 = {"name": "Tool B", "description": "This is Tool A"} + assert compare_tools(tool1, tool2) + + tool1 = {"name": "Tool A", "description": "This is Tool A"} + tool2 = {"name": "Tool A", "description": "This is Tool B"} + assert compare_tools(tool1, tool2) + +def test_compare_configs(): + config1 = {"key": "config_key"} + config2 = {"key": "config_key"} + assert not compare_configs(config1, config2) + + config1 = {"key": "config_key_1"} + config2 = {"key": "config_key_2"} + assert compare_configs(config1, config2) + +def test_compare_toolkit(): + toolkit1 = { + "description": "Toolkit Description", + "show_toolkit": True, + "name": "Toolkit", + "tool_code_link": "https://example.com/toolkit", + "tools": [{"name": "Tool A", "description": "This is Tool A"}], + "configs": [{"key": "config_key"}] + } + toolkit2 = { + "description": "Toolkit Description", + "show_toolkit": True, + "name": "Toolkit", + "tool_code_link": "https://example.com/toolkit", + "tools": [{"name": "Tool A", "description": "This is Tool A"}], + "configs": [{"key": "config_key"}] + } + assert not compare_toolkit(toolkit1, toolkit2) + + toolkit1 = { + "description": "Toolkit Description", + "show_toolkit": True, + "name": "Toolkit", + "tool_code_link": "https://example.com/toolkit", + "tools": [{"name": "Tool A", "description": "This is Tool A"}], + "configs": [{"key": "config_key"}] + } + toolkit2 = { + "description": "Toolkit Description", + "show_toolkit": True, + "name": "Toolkit", + "tool_code_link": "https://example.com/toolkit", + "tools": [{"name": "Tool A", "description": "This is Tool B"}], + "configs": [{"key": "config_key"}] + } + assert compare_toolkit(toolkit1, toolkit2) + + toolkit1 = { + "description": "Toolkit Description", + "show_toolkit": True, + "name": "Toolkit", + "tool_code_link": "https://example.com/toolkit", + "tools": [{"name": "Tool A", "description": "This is Tool A"}], + "configs": [{"key": "config_key_1"}] + } + toolkit2 = { + "description": "Toolkit Description", + "show_toolkit": True, + "name": "Toolkit", + "tool_code_link": "https://example.com/toolkit", + "tools": [{"name": "Tool A", "description": "This is Tool A"}], + "configs": [{"key": "config_key_2"}] + } + assert compare_toolkit(toolkit1, toolkit2) From 16d2643f748f36e1d72a8a148291fbe9c495c274 Mon Sep 17 00:00:00 2001 From: abhijeet Date: Tue, 1 Aug 2023 16:26:03 +0530 Subject: [PATCH 4/8] updated tools --- tools.json | 2 -- 1 file changed, 2 deletions(-) diff --git a/tools.json b/tools.json index 4b8b1f805..d1df44b0e 100644 --- a/tools.json +++ b/tools.json @@ -1,6 +1,4 @@ { "tools": { - "DuckDuckGo": "https://github.com/TransformerOptimus/SuperAGI-Tools/tree/main/DuckDuckGo", - "notion": "https://github.com/TransformerOptimus/SuperAGI-Tools/tree/main/notion" } } \ No newline at end of file From e070f3e6df69a0ab7ae8133cf9a2b76b2e074aa7 Mon Sep 17 00:00:00 2001 From: abhijeet Date: Tue, 1 Aug 2023 16:28:10 +0530 Subject: [PATCH 5/8] Updated Toolkit docs --- superagi/controllers/toolkit.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/superagi/controllers/toolkit.py b/superagi/controllers/toolkit.py index 849024208..48096dea7 100644 --- a/superagi/controllers/toolkit.py +++ b/superagi/controllers/toolkit.py @@ -340,8 +340,6 @@ def check_toolkit_update(toolkit_name: str, organisation: Organisation = Depends def update_toolkit(toolkit_name: str, organisation: Organisation = Depends(get_user_organisation)): """ Update the toolkit with the latest version from the marketplace. - Returns: - dict: The response containing the update details. """ marketplace_toolkit = Toolkit.fetch_marketplace_detail(search_str="details", toolkit_name=toolkit_name) From c8cd8f1a5291269bf1a654e4ad868fc814446493 Mon Sep 17 00:00:00 2001 From: namansleeps Date: Wed, 2 Aug 2023 14:12:24 +0530 Subject: [PATCH 6/8] minor changes for toolkit update --- .../Content/Marketplace/ToolkitTemplate.js | 65 +++++++++++-------- gui/pages/api/DashboardService.js | 4 ++ 2 files changed, 43 insertions(+), 26 deletions(-) diff --git a/gui/pages/Content/Marketplace/ToolkitTemplate.js b/gui/pages/Content/Marketplace/ToolkitTemplate.js index 242606570..3f15fe818 100644 --- a/gui/pages/Content/Marketplace/ToolkitTemplate.js +++ b/gui/pages/Content/Marketplace/ToolkitTemplate.js @@ -5,7 +5,7 @@ import styles3 from '../Agents/Agents.module.css'; import {ToastContainer, toast} from 'react-toastify'; import 'react-toastify/dist/ReactToastify.css'; import styles2 from "./Market.module.css" -import {fetchToolTemplateOverview, installToolkitTemplate} from "@/pages/api/DashboardService"; +import {checkToolkitUpdate, fetchToolTemplateOverview, installToolkitTemplate} from "@/pages/api/DashboardService"; import {EventBus} from "@/utils/eventBus"; import ReactMarkdown from 'react-markdown'; import axios from 'axios'; @@ -17,29 +17,18 @@ export default function ToolkitTemplate({template, env}) { const [markdownContent, setMarkdownContent] = useState(''); useEffect(() => { - setInstalled(template && template.is_installed ? 'Installed' : 'Install'); - if (window.location.href.toLowerCase().includes('marketplace')) { - setInstalled('Sign in to install'); - axios.get(`https://app.superagi.com/api/toolkits/marketplace/readme/${template.name}`) - .then((response) => { - setMarkdownContent(response.data || ''); - setRightPanel(response.data ? 'overview' : 'tool_view'); - }) - .catch((error) => { - setRightPanel('tool_view'); - console.error('Error fetching template details:', error); - }); - } else { - fetchToolTemplateOverview(template.name) - .then((response) => { - setMarkdownContent(response.data || ''); - setRightPanel(response.data ? 'overview' : 'tool_view'); - }) - .catch((error) => { - setRightPanel('tool_view'); - console.error('Error fetching template details:', error); - }); + if(template.is_installed && !window.location.href.toLowerCase().includes('marketplace')) { + checkToolkitUpdate(template.name).then((response) => { + setInstalled(response.data ? 'Update' : 'Installed'); + }) + .catch((error) => { + console.error('Error fetching update details:', error); + }); + } + else{ + setInstalled(window.location.href.toLowerCase().includes('marketplace') ? 'Sign in to install' : 'Install'); } + fetchReadme() }, []); function handleInstallClick() { @@ -72,6 +61,30 @@ export default function ToolkitTemplate({template, env}) { EventBus.emit('goToMarketplace', {}); } + function fetchReadme() { + if (window.location.href.toLowerCase().includes('marketplace')) { + axios.get(`https://app.superagi.com/api/toolkits/marketplace/readme/${template.name}`) + .then((response) => { + setMarkdownContent(response.data || ''); + setRightPanel(response.data ? 'overview' : 'tool_view'); + }) + .catch((error) => { + setRightPanel('tool_view'); + console.error('Error fetching template details:', error); + }); + } else { + fetchToolTemplateOverview(template.name) + .then((response) => { + setMarkdownContent(response.data || ''); + setRightPanel(response.data ? 'overview' : 'tool_view'); + }) + .catch((error) => { + setRightPanel('tool_view'); + console.error('Error fetching template details:', error); + }); + } + } + return ( <>
@@ -96,10 +109,10 @@ export default function ToolkitTemplate({template, env}) { diff --git a/gui/pages/api/DashboardService.js b/gui/pages/api/DashboardService.js index 32f994ff3..d2d942bc1 100644 --- a/gui/pages/api/DashboardService.js +++ b/gui/pages/api/DashboardService.js @@ -172,6 +172,10 @@ export const installToolkitTemplate = (templateName) => { return api.get(`/toolkits/get/install/${templateName}`); }; +export const checkToolkitUpdate = (templateName) => { + return api.get(`/toolkits/check_update/${templateName}`); +}; + export const getExecutionDetails = (executionId, agentId) => { return api.get(`/agent_executions_configs/details/agent/${agentId}/agent_execution/${executionId}`); }; From 19dccd4a2ec8d8287eea29b0f3b14904d40207c6 Mon Sep 17 00:00:00 2001 From: namansleeps Date: Wed, 2 Aug 2023 17:31:04 +0530 Subject: [PATCH 7/8] minor changes for toolkit update --- .../Content/Marketplace/ToolkitTemplate.js | 19 ++++++++++++++++++- gui/pages/api/DashboardService.js | 4 ++++ 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/gui/pages/Content/Marketplace/ToolkitTemplate.js b/gui/pages/Content/Marketplace/ToolkitTemplate.js index 3f15fe818..b705c802e 100644 --- a/gui/pages/Content/Marketplace/ToolkitTemplate.js +++ b/gui/pages/Content/Marketplace/ToolkitTemplate.js @@ -5,7 +5,12 @@ import styles3 from '../Agents/Agents.module.css'; import {ToastContainer, toast} from 'react-toastify'; import 'react-toastify/dist/ReactToastify.css'; import styles2 from "./Market.module.css" -import {checkToolkitUpdate, fetchToolTemplateOverview, installToolkitTemplate} from "@/pages/api/DashboardService"; +import { + checkToolkitUpdate, + fetchToolTemplateOverview, + installToolkitTemplate, + updateMarketplaceToolTemplate +} from "@/pages/api/DashboardService"; import {EventBus} from "@/utils/eventBus"; import ReactMarkdown from 'react-markdown'; import axios from 'axios'; @@ -42,6 +47,18 @@ export default function ToolkitTemplate({template, env}) { return; } + if(installed === "Update"){ + updateMarketplaceToolTemplate(template.name) + .then((response) => { + toast.success("Template Updated", {autoClose: 1800}); + setInstalled('Installed'); + }) + .catch((error) => { + console.error('Error installing template:', error); + }); + return; + } + if (template && template.is_installed) { toast.error("Template is already installed", {autoClose: 1800}); return; diff --git a/gui/pages/api/DashboardService.js b/gui/pages/api/DashboardService.js index d2d942bc1..eaea69056 100644 --- a/gui/pages/api/DashboardService.js +++ b/gui/pages/api/DashboardService.js @@ -168,6 +168,10 @@ export const fetchToolTemplateOverview = (toolTemplateName) => { return api.get(`/toolkits/marketplace/readme/${toolTemplateName}`); }; +export const updateMarketplaceToolTemplate = (templateName) => { + return api.get(`/toolkits/check_update/${templateName}`); +}; + export const installToolkitTemplate = (templateName) => { return api.get(`/toolkits/get/install/${templateName}`); }; From 81837e5309eb0a2a196b4b9664d2a3148850cc9c Mon Sep 17 00:00:00 2001 From: namansleeps Date: Wed, 2 Aug 2023 18:31:32 +0530 Subject: [PATCH 8/8] bug fix --- gui/pages/api/DashboardService.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gui/pages/api/DashboardService.js b/gui/pages/api/DashboardService.js index eaea69056..006f17308 100644 --- a/gui/pages/api/DashboardService.js +++ b/gui/pages/api/DashboardService.js @@ -169,7 +169,7 @@ export const fetchToolTemplateOverview = (toolTemplateName) => { }; export const updateMarketplaceToolTemplate = (templateName) => { - return api.get(`/toolkits/check_update/${templateName}`); + return api.put(`/toolkits/update/${templateName}`); }; export const installToolkitTemplate = (templateName) => {