Spaces:
Runtime error
Runtime error
Add new agents and tools for Devid and BrowsingAgent; remove obsolete ResearchAndReportAgent
670dd87
| import os | |
| from dotenv import load_dotenv | |
| from agency_swarm.tools import BaseTool | |
| from pydantic import Field | |
| from typing import Dict, List, Optional, Any | |
| load_dotenv() | |
| notion_integration_secret = os.getenv("NOTION_INTEGRATION_SECRET") | |
| class GetTaskTool(BaseTool): | |
| """ | |
| Tool for retrieving a specific task (page) from Notion. | |
| This tool fetches the properties of a specific task using its page ID and | |
| by default, does not fetch the page content (blocks). Content can be included by setting include_content to True. | |
| """ | |
| # Add example_field with a default value to satisfy BaseTool validation | |
| example_field: str = Field( | |
| default="notion_task", | |
| description="Identifier for this tool. Can be left at its default value.", | |
| ) | |
| page_id: str = Field( | |
| ..., | |
| description="The ID of the Notion page (task) to retrieve. This is a required field.", | |
| ) | |
| include_content: bool = Field( | |
| default=False, | |
| description="Whether to include the page content (blocks) in the response. When True, all nested blocks will be included.", | |
| ) | |
| page_size: int = Field( | |
| default=100, | |
| description="Number of blocks to retrieve per request. Maximum is 100.", | |
| ) | |
| def run(self): | |
| """ | |
| Retrieve a Notion page (task) by its ID, optionally including its content. | |
| Returns: | |
| dict: A dictionary containing the page properties and optionally its content. | |
| """ | |
| import requests | |
| result = {} | |
| # Fetch page properties | |
| properties = self._get_page_properties() | |
| result["properties"] = properties | |
| # Fetch page content if requested | |
| if self.include_content: | |
| content = self._get_page_content() | |
| result["content"] = content | |
| return result | |
| def _get_page_properties(self) -> Dict[str, Any]: | |
| """ | |
| Retrieve the properties of a Notion page. | |
| Returns: | |
| dict: The JSON response from the Notion API containing the page properties. | |
| """ | |
| import requests | |
| # Set up the API endpoint | |
| url = f"https://api.notion.com/v1/pages/{self.page_id}" | |
| # Set up the headers | |
| headers = { | |
| "Authorization": f"Bearer {os.getenv('NOTION_INTEGRATION_SECRET')}", | |
| "Notion-Version": "2022-06-28", | |
| "Content-Type": "application/json", | |
| } | |
| # Make the request | |
| response = requests.get(url, headers=headers) | |
| return response.json() | |
| def _get_page_content(self) -> List[Dict[str, Any]]: | |
| """ | |
| Retrieve the content (blocks) of a Notion page including all nested blocks. | |
| Returns: | |
| list: A list of block objects representing the page content. | |
| """ | |
| import requests | |
| # Since pages are also blocks, we can use the page ID as a block ID | |
| blocks = [] | |
| has_more = True | |
| start_cursor = None | |
| # Set up the headers | |
| headers = { | |
| "Authorization": f"Bearer {os.getenv('NOTION_INTEGRATION_SECRET')}", | |
| "Notion-Version": "2022-06-28", | |
| "Content-Type": "application/json", | |
| } | |
| # Paginate through all blocks | |
| while has_more: | |
| # Build URL with pagination parameters | |
| url = f"https://api.notion.com/v1/blocks/{self.page_id}/children?page_size={self.page_size}" | |
| if start_cursor: | |
| url += f"&start_cursor={start_cursor}" | |
| # Make the request | |
| response = requests.get(url, headers=headers) | |
| data = response.json() | |
| # Add blocks to our result | |
| if "results" in data: | |
| current_blocks = data["results"] | |
| # Always fetch children of blocks with children | |
| for i, block in enumerate(current_blocks): | |
| if block.get("has_children", False): | |
| current_blocks[i]["children"] = self._get_block_children( | |
| block["id"] | |
| ) | |
| blocks.extend(current_blocks) | |
| # Update pagination info | |
| has_more = data.get("has_more", False) | |
| start_cursor = data.get("next_cursor") | |
| return blocks | |
| def _get_block_children(self, block_id: str) -> List[Dict[str, Any]]: | |
| """ | |
| Recursively retrieve children of a block. | |
| Args: | |
| block_id: The ID of the block to retrieve children for. | |
| Returns: | |
| list: A list of block objects representing the block's children. | |
| """ | |
| import requests | |
| # Set up the headers | |
| headers = { | |
| "Authorization": f"Bearer {os.getenv('NOTION_INTEGRATION_SECRET')}", | |
| "Notion-Version": "2022-06-28", | |
| "Content-Type": "application/json", | |
| } | |
| # Build URL | |
| url = f"https://api.notion.com/v1/blocks/{block_id}/children?page_size={self.page_size}" | |
| # Make the request | |
| response = requests.get(url, headers=headers) | |
| data = response.json() | |
| blocks = [] | |
| if "results" in data: | |
| blocks = data["results"] | |
| # Recursively fetch children | |
| for i, block in enumerate(blocks): | |
| if block.get("has_children", False): | |
| blocks[i]["children"] = self._get_block_children(block["id"]) | |
| return blocks | |