From c5ac5fa78a7604f6b7eca16ec4205526e742ef90 Mon Sep 17 00:00:00 2001 From: Mike Plachta Date: Thu, 2 Oct 2025 09:35:29 -0700 Subject: [PATCH] feat: add required env var validation for brightdata Co-authored-by: Greyson Lalonde --- .../brightdata_tool/brightdata_dataset.py | 16 ++++++++++--- .../tools/brightdata_tool/brightdata_serp.py | 18 +++++++++++---- .../brightdata_tool/brightdata_unlocker.py | 23 +++++++++++++++---- 3 files changed, 45 insertions(+), 12 deletions(-) diff --git a/lib/crewai-tools/src/crewai_tools/tools/brightdata_tool/brightdata_dataset.py b/lib/crewai-tools/src/crewai_tools/tools/brightdata_tool/brightdata_dataset.py index 1707cf19a..ddf4a10a1 100644 --- a/lib/crewai-tools/src/crewai_tools/tools/brightdata_tool/brightdata_dataset.py +++ b/lib/crewai-tools/src/crewai_tools/tools/brightdata_tool/brightdata_dataset.py @@ -3,7 +3,7 @@ import os from typing import Any import aiohttp -from crewai.tools import BaseTool +from crewai.tools import BaseTool, EnvVar from pydantic import BaseModel, Field @@ -414,6 +414,15 @@ class BrightDataDatasetTool(BaseTool): format: str = "json" zipcode: str | None = None additional_params: dict[str, Any] | None = None + env_vars: list[EnvVar] = Field( + default_factory=lambda: [ + EnvVar( + name="BRIGHT_DATA_API_KEY", + description="API key for Bright Data", + required=True, + ), + ] + ) def __init__( self, @@ -422,8 +431,9 @@ class BrightDataDatasetTool(BaseTool): format: str = "json", zipcode: str | None = None, additional_params: dict[str, Any] | None = None, + **kwargs: Any, ): - super().__init__() + super().__init__(**kwargs) self.dataset_type = dataset_type self.url = url self.format = format @@ -441,7 +451,7 @@ class BrightDataDatasetTool(BaseTool): zipcode: str | None = None, additional_params: dict[str, Any] | None = None, polling_interval: int = 1, - ) -> dict: + ) -> str: """Asynchronously trigger and poll Bright Data dataset scraping. Args: diff --git a/lib/crewai-tools/src/crewai_tools/tools/brightdata_tool/brightdata_serp.py b/lib/crewai-tools/src/crewai_tools/tools/brightdata_tool/brightdata_serp.py index 1a110b052..e18b4269a 100644 --- a/lib/crewai-tools/src/crewai_tools/tools/brightdata_tool/brightdata_serp.py +++ b/lib/crewai-tools/src/crewai_tools/tools/brightdata_tool/brightdata_serp.py @@ -2,7 +2,7 @@ import os from typing import Any import urllib.parse -from crewai.tools import BaseTool +from crewai.tools import BaseTool, EnvVar from pydantic import BaseModel, Field import requests @@ -89,6 +89,15 @@ class BrightDataSearchTool(BaseTool): search_type: str | None = None device_type: str = "desktop" parse_results: bool = True + env_vars: list[EnvVar] = Field( + default_factory=lambda: [ + EnvVar( + name="BRIGHT_DATA_API_KEY", + description="API key for Bright Data", + required=True, + ), + ] + ) def __init__( self, @@ -99,8 +108,9 @@ class BrightDataSearchTool(BaseTool): search_type: str | None = None, device_type: str = "desktop", parse_results: bool = True, + **kwargs: Any, ): - super().__init__() + super().__init__(**kwargs) self.base_url = self._config.API_URL self.query = query self.search_engine = search_engine @@ -110,8 +120,8 @@ class BrightDataSearchTool(BaseTool): self.device_type = device_type self.parse_results = parse_results - self.api_key = os.getenv("BRIGHT_DATA_API_KEY") - self.zone = os.getenv("BRIGHT_DATA_ZONE") + self.api_key = os.getenv("BRIGHT_DATA_API_KEY") or "" + self.zone = os.getenv("BRIGHT_DATA_ZONE") or "" if not self.api_key: raise ValueError("BRIGHT_DATA_API_KEY environment variable is required.") if not self.zone: diff --git a/lib/crewai-tools/src/crewai_tools/tools/brightdata_tool/brightdata_unlocker.py b/lib/crewai-tools/src/crewai_tools/tools/brightdata_tool/brightdata_unlocker.py index 10a222782..897b3cdb6 100644 --- a/lib/crewai-tools/src/crewai_tools/tools/brightdata_tool/brightdata_unlocker.py +++ b/lib/crewai-tools/src/crewai_tools/tools/brightdata_tool/brightdata_unlocker.py @@ -1,7 +1,7 @@ import os from typing import Any -from crewai.tools import BaseTool +from crewai.tools import BaseTool, EnvVar from pydantic import BaseModel, Field import requests @@ -69,18 +69,31 @@ class BrightDataWebUnlockerTool(BaseTool): url: str | None = None format: str = "raw" data_format: str = "markdown" + env_vars: list[EnvVar] = Field( + default_factory=lambda: [ + EnvVar( + name="BRIGHT_DATA_API_KEY", + description="API key for Bright Data", + required=True, + ), + ] + ) def __init__( - self, url: str | None = None, format: str = "raw", data_format: str = "markdown" + self, + url: str | None = None, + format: str = "raw", + data_format: str = "markdown", + **kwargs: Any, ): - super().__init__() + super().__init__(**kwargs) self.base_url = self._config.API_URL self.url = url self.format = format self.data_format = data_format - self.api_key = os.getenv("BRIGHT_DATA_API_KEY") - self.zone = os.getenv("BRIGHT_DATA_ZONE") + self.api_key = os.getenv("BRIGHT_DATA_API_KEY") or "" + self.zone = os.getenv("BRIGHT_DATA_ZONE") or "" if not self.api_key: raise ValueError("BRIGHT_DATA_API_KEY environment variable is required.") if not self.zone: