diff --git a/application/agents/tools/read_webpage.py b/application/agents/tools/read_webpage.py new file mode 100644 index 00000000..e87c79e3 --- /dev/null +++ b/application/agents/tools/read_webpage.py @@ -0,0 +1,83 @@ +import requests +from markdownify import markdownify +from application.agents.tools.base import Tool +from urllib.parse import urlparse + +class ReadWebpageTool(Tool): + """ + Read Webpage (browser) + A tool to fetch the HTML content of a URL and convert it to Markdown. + """ + + def __init__(self, config=None): + """ + Initializes the tool. + :param config: Optional configuration dictionary. Not used by this tool. + """ + self.config = config + + def execute_action(self, action_name: str, **kwargs) -> str: + """ + Executes the specified action. For this tool, the only action is 'read_webpage'. + + :param action_name: The name of the action to execute. Should be 'read_webpage'. + :param kwargs: Keyword arguments, must include 'url'. + :return: The Markdown content of the webpage or an error message. + """ + if action_name != "read_webpage": + return f"Error: Unknown action '{action_name}'. This tool only supports 'read_webpage'." + + url = kwargs.get("url") + if not url: + return "Error: URL parameter is missing." + + # Ensure the URL has a scheme (if not, default to http) + parsed_url = urlparse(url) + if not parsed_url.scheme: + url = "http://" + url + + try: + response = requests.get(url, timeout=10, headers={'User-Agent': 'DocsGPT-Agent/1.0'}) + response.raise_for_status() # Raise an exception for HTTP errors (4xx or 5xx) + + html_content = response.text + #soup = BeautifulSoup(html_content, 'html.parser') + + + markdown_content = markdownify(html_content, heading_style="ATX", newline_style="BACKSLASH") + + return markdown_content + + except requests.exceptions.RequestException as e: + return f"Error fetching URL {url}: {e}" + except Exception as e: + return f"Error processing URL {url}: {e}" + + def get_actions_metadata(self): + """ + Returns metadata for the actions supported by this tool. + """ + return [ + { + "name": "read_webpage", + "description": "Fetches the HTML content of a given URL and returns it as clean Markdown text. Input must be a valid URL.", + "parameters": { + "type": "object", + "properties": { + "url": { + "type": "string", + "description": "The fully qualified URL of the webpage to read (e.g., 'https://www.example.com').", + } + }, + "required": ["url"], + "additionalProperties": False, + }, + } + ] + + def get_config_requirements(self): + """ + Returns a dictionary describing the configuration requirements for the tool. + This tool does not require any specific configuration. + """ + return {} diff --git a/application/api/answer/routes.py b/application/api/answer/routes.py index 2d889b34..e5a33874 100644 --- a/application/api/answer/routes.py +++ b/application/api/answer/routes.py @@ -472,6 +472,7 @@ class Stream(Resource): decoded_token = request.decoded_token else: decoded_token = {"sub": data_key.get("user")} + is_shared_usage = False elif "active_docs" in data: source = {"active_docs": data["active_docs"]} @@ -524,7 +525,8 @@ class Stream(Resource): user_api_key=user_api_key, decoded_token=decoded_token, ) - + is_shared_usage_val = data.get("is_shared_usage", False) + is_shared_token_val = data.get("shared_token", None) return Response( complete_stream( question=question, @@ -537,8 +539,8 @@ class Stream(Resource): index=index, should_save_conversation=save_conv, agent_id=agent_id, - is_shared_usage=is_shared_usage, - shared_token=shared_token, + is_shared_usage=is_shared_usage_val, + shared_token=is_shared_token_val, ), mimetype="text/event-stream", ) diff --git a/application/prompts/chat_combine_default.txt b/application/prompts/chat_combine_default.txt index fdf0b2c2..eb7e6cb2 100644 --- a/application/prompts/chat_combine_default.txt +++ b/application/prompts/chat_combine_default.txt @@ -1,9 +1,14 @@ -You are a helpful AI assistant, DocsGPT, specializing in document assistance, designed to offer detailed and informative responses. +You are a helpful AI assistant, DocsGPT. You are proactive and helpful. Try to use tools, if they are available to you, +be proactive and fill in missing information. +Users can Upload documents for your context as attachments or sources via UI using the Conversation input box. If appropriate, your answers can include code examples, formatted as follows: ```(language) (code) ``` +Users are also able to see charts and diagrams if you use them with valid mermaid syntax in your responses. +Try to respond with mermaid charts if visualization helps with users queries. You effectively utilize chat history, ensuring relevant and tailored responses. -If a question doesn't align with your context, you provide friendly and helpful replies. +Try to use additional provided context if its available, otherwise use your knowledge and tool capabilities. ---------------- +Possible additional context from uploaded sources: {summaries} \ No newline at end of file diff --git a/frontend/public/toolIcons/tool_read_webpage.svg b/frontend/public/toolIcons/tool_read_webpage.svg new file mode 100644 index 00000000..41692e95 --- /dev/null +++ b/frontend/public/toolIcons/tool_read_webpage.svg @@ -0,0 +1 @@ + \ No newline at end of file