CrewAI-Studio / my_tools.py
zhengr's picture
init
58e0d8e
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
}