Spaces:
Running
Running
import streamlit as st | |
import os | |
from utils import rnd_id | |
from crewai_tools import CodeInterpreterTool,ScrapeElementFromWebsiteTool,TXTSearchTool,SeleniumScrapingTool,PGSearchTool,PDFSearchTool,MDXSearchTool,JSONSearchTool,GithubSearchTool,EXASearchTool,DOCXSearchTool,CSVSearchTool,ScrapeWebsiteTool, FileReadTool, DirectorySearchTool, DirectoryReadTool, CodeDocsSearchTool, YoutubeVideoSearchTool,SerperDevTool,YoutubeChannelSearchTool,WebsiteSearchTool | |
from custom_tools import CustomApiTool,CustomFileWriteTool,CustomCodeInterpreterTool | |
from langchain_community.tools import YahooFinanceNewsTool | |
class MyTool: | |
def __init__(self, tool_id, name, description, parameters, **kwargs): | |
self.tool_id = tool_id or rnd_id() | |
self.name = name | |
self.description = description | |
self.parameters = kwargs | |
self.parameters_metadata = parameters | |
def create_tool(self): | |
pass | |
def get_parameters(self): | |
return self.parameters | |
def set_parameters(self, **kwargs): | |
self.parameters.update(kwargs) | |
def get_parameter_names(self): | |
return list(self.parameters_metadata.keys()) | |
def is_parameter_mandatory(self, param_name): | |
return self.parameters_metadata.get(param_name, {}).get('mandatory', False) | |
def is_valid(self,show_warning=False): | |
for param_name, metadata in self.parameters_metadata.items(): | |
if metadata['mandatory'] and not self.parameters.get(param_name): | |
if show_warning: | |
st.warning(f"Parameter '{param_name}' is mandatory for tool '{self.name}'") | |
return False | |
return True | |
class MyScrapeWebsiteTool(MyTool): | |
def __init__(self, tool_id=None, website_url=None): | |
parameters = { | |
'website_url': {'mandatory': False} | |
} | |
super().__init__(tool_id, 'ScrapeWebsiteTool', "A tool that can be used to read website content.", parameters, website_url=website_url) | |
def create_tool(self) -> ScrapeWebsiteTool: | |
return ScrapeWebsiteTool(self.parameters.get('website_url') if self.parameters.get('website_url') else None) | |
class MyFileReadTool(MyTool): | |
def __init__(self, tool_id=None, file_path=None): | |
parameters = { | |
'file_path': {'mandatory': False} | |
} | |
super().__init__(tool_id, 'FileReadTool', "A tool that can be used to read a file's content.", parameters, file_path=file_path) | |
def create_tool(self) -> FileReadTool: | |
return FileReadTool(self.parameters.get('file_path') if self.parameters.get('file_path') else None) | |
class MyDirectorySearchTool(MyTool): | |
def __init__(self, tool_id=None, directory=None): | |
parameters = { | |
'directory': {'mandatory': False} | |
} | |
super().__init__(tool_id, 'DirectorySearchTool', "A tool that can be used to semantic search a query from a directory's content.", parameters, directory_path=directory) | |
def create_tool(self) -> DirectorySearchTool: | |
return DirectorySearchTool(self.parameters.get('directory') if self.parameters.get('directory') else None) | |
class MyDirectoryReadTool(MyTool): | |
def __init__(self, tool_id=None, directory_contents=None): | |
parameters = { | |
'directory_contents': {'mandatory': True} | |
} | |
super().__init__(tool_id, 'DirectoryReadTool', "Use the tool to list the contents of the specified directory", parameters, directory_contents=directory_contents) | |
def create_tool(self) -> DirectoryReadTool: | |
return DirectoryReadTool(self.parameters.get('directory_contents')) | |
class MyCodeDocsSearchTool(MyTool): | |
def __init__(self, tool_id=None, code_docs=None): | |
parameters = { | |
'code_docs': {'mandatory': False} | |
} | |
super().__init__(tool_id, 'CodeDocsSearchTool', "A tool that can be used to search through code documentation.", parameters, code_docs=code_docs) | |
def create_tool(self) -> CodeDocsSearchTool: | |
return CodeDocsSearchTool(self.parameters.get('code_docs') if self.parameters.get('code_docs') else None) | |
class MyYoutubeVideoSearchTool(MyTool): | |
def __init__(self, tool_id=None, youtube_video_url=None): | |
parameters = { | |
'youtube_video_url': {'mandatory': False} | |
} | |
super().__init__(tool_id, 'YoutubeVideoSearchTool', "A tool that can be used to semantic search a query from a Youtube Video content.", parameters, youtube_video_url=youtube_video_url) | |
def create_tool(self) -> YoutubeVideoSearchTool: | |
return YoutubeVideoSearchTool(self.parameters.get('youtube_video_url') if self.parameters.get('youtube_video_url') else None) | |
class MySerperDevTool(MyTool): | |
def __init__(self, tool_id=None, SERPER_API_KEY=None): | |
parameters = { | |
'SERPER_API_KEY': {'mandatory': True} | |
} | |
super().__init__(tool_id, 'SerperDevTool', "A tool that can be used to search the internet with a search_query", parameters) | |
def create_tool(self) -> SerperDevTool: | |
os.environ['SERPER_API_KEY'] = self.parameters.get('SERPER_API_KEY') | |
return SerperDevTool() | |
class MyYoutubeChannelSearchTool(MyTool): | |
def __init__(self, tool_id=None, youtube_channel_handle=None): | |
parameters = { | |
'youtube_channel_handle': {'mandatory': False} | |
} | |
super().__init__(tool_id, 'YoutubeChannelSearchTool', "A tool that can be used to semantic search a query from a Youtube Channels content. Channel can be added as @channel", parameters, youtube_channel_handle=youtube_channel_handle) | |
def create_tool(self) -> YoutubeChannelSearchTool: | |
return YoutubeChannelSearchTool(self.parameters.get('youtube_channel_handle') if self.parameters.get('youtube_channel_handle') else None) | |
class MyWebsiteSearchTool(MyTool): | |
def __init__(self, tool_id=None, website=None): | |
parameters = { | |
'website': {'mandatory': False} | |
} | |
super().__init__(tool_id, 'WebsiteSearchTool', "A tool that can be used to semantic search a query from a specific URL content.", parameters, website=website) | |
def create_tool(self) -> WebsiteSearchTool: | |
return WebsiteSearchTool(self.parameters.get('website') if self.parameters.get('website') else None) | |
class MyCSVSearchTool(MyTool): | |
def __init__(self, tool_id=None, csv=None): | |
parameters = { | |
'csv': {'mandatory': False} | |
} | |
super().__init__(tool_id, 'CSVSearchTool', "A tool that can be used to semantic search a query from a CSV's content.", parameters, csv=csv) | |
def create_tool(self) -> CSVSearchTool: | |
return CSVSearchTool(csv=self.parameters.get('csv') if self.parameters.get('csv') else None) | |
class MyDocxSearchTool(MyTool): | |
def __init__(self, tool_id=None, docx=None): | |
parameters = { | |
'docx': {'mandatory': False} | |
} | |
super().__init__(tool_id, 'DOCXSearchTool', "A tool that can be used to semantic search a query from a DOCX's content.", parameters, docx=docx) | |
def create_tool(self) -> DOCXSearchTool: | |
return DOCXSearchTool(docx=self.parameters.get('docx') if self.parameters.get('docx') else None) | |
class MyEXASearchTool(MyTool): | |
def __init__(self, tool_id=None, EXA_API_KEY=None): | |
parameters = { | |
'EXA_API_KEY': {'mandatory': True} | |
} | |
super().__init__(tool_id, 'EXASearchTool', "A tool that can be used to search the internet from a search_query", parameters, EXA_API_KEY=EXA_API_KEY) | |
def create_tool(self) -> EXASearchTool: | |
os.environ['EXA_API_KEY'] = self.parameters.get('EXA_API_KEY') | |
return EXASearchTool() | |
class MyGithubSearchTool(MyTool): | |
def __init__(self, tool_id=None, github_repo=None, gh_token=None, content_types=None): | |
parameters = { | |
'github_repo': {'mandatory': False}, | |
'gh_token': {'mandatory': True}, | |
'content_types': {'mandatory': False} | |
} | |
super().__init__(tool_id, 'GithubSearchTool', "A tool that can be used to semantic search a query from a Github repository's content. Valid content_types: code,repo,pr,issue (comma sepparated)", parameters, github_repo=github_repo, gh_token=gh_token, content_types=content_types) | |
def create_tool(self) -> GithubSearchTool: | |
return GithubSearchTool( | |
github_repo=self.parameters.get('github_repo') if self.parameters.get('github_repo') else None, | |
gh_token=self.parameters.get('gh_token'), | |
content_types=self.parameters.get('search_query').split(",") if self.parameters.get('search_query') else ["code", "repo", "pr", "issue"] | |
) | |
class MyJSONSearchTool(MyTool): | |
def __init__(self, tool_id=None, json_path=None): | |
parameters = { | |
'json_path': {'mandatory': False} | |
} | |
super().__init__(tool_id, 'JSONSearchTool', "A tool that can be used to semantic search a query from a JSON's content.", parameters, json_path=json_path) | |
def create_tool(self) -> JSONSearchTool: | |
return JSONSearchTool(json_path=self.parameters.get('json_path') if self.parameters.get('json_path') else None) | |
class MyMDXSearchTool(MyTool): | |
def __init__(self, tool_id=None, mdx=None): | |
parameters = { | |
'mdx': {'mandatory': False} | |
} | |
super().__init__(tool_id, 'MDXSearchTool', "A tool that can be used to semantic search a query from a MDX's content.", parameters, mdx=mdx) | |
def create_tool(self) -> MDXSearchTool: | |
return MDXSearchTool(mdx=self.parameters.get('mdx') if self.parameters.get('mdx') else None) | |
class MyPDFSearchTool(MyTool): | |
def __init__(self, tool_id=None, pdf=None): | |
parameters = { | |
'pdf': {'mandatory': False} | |
} | |
super().__init__(tool_id, 'PDFSearchTool', "A tool that can be used to semantic search a query from a PDF's content.", parameters, pdf=pdf) | |
def create_tool(self) -> PDFSearchTool: | |
return PDFSearchTool(self.parameters.get('pdf') if self.parameters.get('pdf') else None) | |
class MyPGSearchTool(MyTool): | |
def __init__(self, tool_id=None, db_uri=None): | |
parameters = { | |
'db_uri': {'mandatory': True} | |
} | |
super().__init__(tool_id, 'PGSearchTool', "A tool that can be used to semantic search a query from a database table's content.", parameters, db_uri=db_uri) | |
def create_tool(self) -> PGSearchTool: | |
return PGSearchTool(self.parameters.get('db_uri')) | |
class MySeleniumScrapingTool(MyTool): | |
def __init__(self, tool_id=None, website_url=None, css_element=None, cookie=None, wait_time=None): | |
parameters = { | |
'website_url': {'mandatory': False}, | |
'css_element': {'mandatory': False}, | |
'cookie': {'mandatory': False}, | |
'wait_time': {'mandatory': False} | |
} | |
super().__init__( | |
tool_id, | |
'SeleniumScrapingTool', | |
"A tool that can be used to read a specific part of website content. CSS elements are separated by comma, cookies are in format {key1\:value1},{key2\:value2}", | |
parameters, | |
website_url=website_url, | |
css_element=css_element, | |
cookie=cookie, | |
wait_time=wait_time | |
) | |
def create_tool(self) -> SeleniumScrapingTool: | |
cookie_arrayofdicts = [{k: v} for k, v in (item.strip('{}').split(':') for item in self.parameters.get('cookie', '').split(','))] if self.parameters.get('cookie') else None | |
return SeleniumScrapingTool( | |
website_url=self.parameters.get('website_url') if self.parameters.get('website_url') else None, | |
css_element=self.parameters.get('css_element').split(',') if self.parameters.get('css_element') else None, | |
cookie=cookie_arrayofdicts, | |
wait_time=self.parameters.get('wait_time') if self.parameters.get('wait_time') else 10 | |
) | |
class MyTXTSearchTool(MyTool): | |
def __init__(self, tool_id=None, txt=None): | |
parameters = { | |
'txt': {'mandatory': False} | |
} | |
super().__init__(tool_id, 'TXTSearchTool', "A tool that can be used to semantic search a query from a TXT's content.", parameters, txt=txt) | |
def create_tool(self) -> TXTSearchTool: | |
return TXTSearchTool(self.parameters.get('txt')) | |
class MyScrapeElementFromWebsiteTool(MyTool): | |
def __init__(self, tool_id=None, website_url=None, css_element=None, cookie=None): | |
parameters = { | |
'website_url': {'mandatory': False}, | |
'css_element': {'mandatory': False}, | |
'cookie': {'mandatory': False} | |
} | |
super().__init__( | |
tool_id, | |
'ScrapeElementFromWebsiteTool', | |
"A tool that can be used to read a specific part of website content. CSS elements are separated by comma, cookies are in format {key1\:value1},{key2\:value2}", | |
parameters, | |
website_url=website_url, | |
css_element=css_element, | |
cookie=cookie | |
) | |
def create_tool(self) -> ScrapeElementFromWebsiteTool: | |
cookie_arrayofdicts = [{k: v} for k, v in (item.strip('{}').split(':') for item in self.parameters.get('cookie', '').split(','))] if self.parameters.get('cookie') else None | |
return ScrapeElementFromWebsiteTool( | |
website_url=self.parameters.get('website_url') if self.parameters.get('website_url') else None, | |
css_element=self.parameters.get('css_element').split(",") if self.parameters.get('css_element') else None, | |
cookie=cookie_arrayofdicts | |
) | |
class MyYahooFinanceNewsTool(MyTool): | |
def __init__(self, tool_id=None): | |
parameters = {} | |
super().__init__(tool_id, 'YahooFinanceNewsTool', "A tool that can be used to search Yahoo Finance News.", parameters) | |
def create_tool(self) -> YahooFinanceNewsTool: | |
return YahooFinanceNewsTool() | |
class MyCustomApiTool(MyTool): | |
def __init__(self, tool_id=None, base_url=None, headers=None, query_params=None): | |
parameters = { | |
'base_url': {'mandatory': False}, | |
'headers': {'mandatory': False}, | |
'query_params': {'mandatory': False} | |
} | |
super().__init__(tool_id, 'CustomApiTool', "A tool that can be used to make API calls with customizable parameters.", parameters, base_url=base_url, headers=headers, query_params=query_params) | |
def create_tool(self) -> CustomApiTool: | |
return CustomApiTool( | |
base_url=self.parameters.get('base_url') if self.parameters.get('base_url') else None, | |
headers=eval(self.parameters.get('headers')) if self.parameters.get('headers') else None, | |
query_params=self.parameters.get('query_params') if self.parameters.get('query_params') else None | |
) | |
class MyCustomFileWriteTool(MyTool): | |
def __init__(self, tool_id=None, base_folder=None, filename=None): | |
parameters = { | |
'base_folder': {'mandatory': True}, | |
'filename': {'mandatory': False} | |
} | |
super().__init__(tool_id, 'CustomFileWriteTool', "A tool that can be used to write a file to a specific folder.", parameters,base_folder=base_folder, filename=filename) | |
def create_tool(self) -> CustomFileWriteTool: | |
return CustomFileWriteTool( | |
base_folder=self.parameters.get('base_folder') if self.parameters.get('base_folder') else "workspace", | |
filename=self.parameters.get('filename') if self.parameters.get('filename') else None | |
) | |
class MyCodeInterpreterTool(MyTool): | |
def __init__(self, tool_id=None): | |
parameters = {} | |
super().__init__(tool_id, 'CodeInterpreterTool', "This tool is used to give the Agent the ability to run code (Python3) from the code generated by the Agent itself. The code is executed in a sandboxed environment, so it is safe to run any code. Docker required.", parameters) | |
def create_tool(self) -> CodeInterpreterTool: | |
return CodeInterpreterTool() | |
class MyCustomCodeInterpreterTool(MyTool): | |
def __init__(self, tool_id=None,workspace_dir=None): | |
parameters = { | |
'workspace_dir': {'mandatory': False} | |
} | |
super().__init__(tool_id, 'CustomCodeInterpreterTool', "This tool is used to give the Agent the ability to run code (Python3) from the code generated by the Agent itself. The code is executed in a sandboxed environment, so it is safe to run any code. Worskpace folder is shared. Docker required.", parameters, workspace_dir=workspace_dir) | |
def create_tool(self) -> CustomCodeInterpreterTool: | |
return CustomCodeInterpreterTool(workspace_dir=self.parameters.get('workspace_dir') if self.parameters.get('workspace_dir') else "workspace") | |
# Register all tools here | |
TOOL_CLASSES = { | |
'SerperDevTool': MySerperDevTool, | |
'WebsiteSearchTool': MyWebsiteSearchTool, | |
'ScrapeWebsiteTool': MyScrapeWebsiteTool, | |
'SeleniumScrapingTool': MySeleniumScrapingTool, | |
'ScrapeElementFromWebsiteTool': MyScrapeElementFromWebsiteTool, | |
'CustomApiTool': MyCustomApiTool, | |
'CodeInterpreterTool': MyCodeInterpreterTool, | |
'CustomCodeInterpreterTool': MyCustomCodeInterpreterTool, | |
'FileReadTool': MyFileReadTool, | |
'CustomFileWriteTool': MyCustomFileWriteTool, | |
'DirectorySearchTool': MyDirectorySearchTool, | |
'DirectoryReadTool': MyDirectoryReadTool, | |
'YoutubeVideoSearchTool': MyYoutubeVideoSearchTool, | |
'YoutubeChannelSearchTool' :MyYoutubeChannelSearchTool, | |
'GithubSearchTool': MyGithubSearchTool, | |
'CodeDocsSearchTool': MyCodeDocsSearchTool, | |
'YahooFinanceNewsTool': MyYahooFinanceNewsTool, | |
'TXTSearchTool': MyTXTSearchTool, | |
'CSVSearchTool': MyCSVSearchTool, | |
'DOCXSearchTool': MyDocxSearchTool, | |
'EXASearchTool': MyEXASearchTool, | |
'JSONSearchTool': MyJSONSearchTool, | |
'MDXSearchTool': MyMDXSearchTool, | |
'PDFSearchTool': MyPDFSearchTool, | |
'PGSearchTool': MyPGSearchTool | |
} |