from llama_cpp_agent import LlamaCppAgent, MessagesFormatterType from llama_cpp_agent.chat_history.messages import Roles from llama_cpp_agent.llm_output_settings import LlmStructuredOutputSettings from llama_cpp_agent.providers import LlamaCppServerProvider from llama_cpp_agent.providers.provider_base import LlmProvider from web_search_interfaces import WebCrawler, WebSearchProvider from default_web_crawlers import TrafilaturaWebCrawler from default_web_search_providers import DDGWebSearchProvider class WebSearchTool: def __init__(self, llm_provider: LlmProvider, message_formatter_type: MessagesFormatterType, context_character_limit: int = 7500, web_crawler: WebCrawler = None, web_search_provider: WebSearchProvider = None): self.summarising_agent = LlamaCppAgent(llm_provider, debug_output=True, system_prompt="You are a text summarization and information extraction specialist and you are able to summarize and filter out information relevant to a specific query.", predefined_messages_formatter_type=message_formatter_type) if web_crawler is None: self.web_crawler = TrafilaturaWebCrawler() else: self.web_crawler = web_crawler if web_search_provider is None: self.web_search_provider = DDGWebSearchProvider() else: self.web_search_provider = web_search_provider self.context_character_limit = context_character_limit def search_web(self, search_query: str): """ Search the web for information. Args: search_query (str): Search query to search for. """ results = self.web_search_provider.search_web(search_query) result_string = '' for res in results: web_info = self.web_crawler.get_website_content_from_url(res) if web_info != "": web_info = self.summarising_agent.get_chat_response( f"Please summarize the following Website content and extract relevant information to this query:'{search_query}'.\n\n" + web_info, add_response_to_chat_history=False, add_message_to_chat_history=False) result_string += web_info res = result_string.strip() return "Please combine this summarizes results below, into one summary as markdown document:\nResults:\n\n" + res[:self.context_character_limit] def get_tool(self): return self.search_web