From 26652e5e245737c8a626749865c5b18a7ee257dc Mon Sep 17 00:00:00 2001 From: Thiago Moretto <168731+thiagomoretto@users.noreply.github.com> Date: Tue, 1 Jul 2025 15:08:30 -0300 Subject: [PATCH] Mapping required env vars of more tools (#353) --- src/crewai_tools/tools/composio_tool/composio_tool.py | 5 ++++- src/crewai_tools/tools/dalle_tool/dalle_tool.py | 8 ++++++-- .../firecrawl_crawl_website_tool.py | 5 ++++- .../firecrawl_scrape_website_tool.py | 5 ++++- .../tools/firecrawl_search_tool/firecrawl_search_tool.py | 5 ++++- .../tools/serply_api_tool/serply_job_search_tool.py | 6 +++++- .../tools/serply_api_tool/serply_news_search_tool.py | 7 +++++-- .../tools/serply_api_tool/serply_scholar_search_tool.py | 7 +++++-- .../serply_api_tool/serply_webpage_to_markdown_tool.py | 6 +++++- src/crewai_tools/tools/vision_tool/vision_tool.py | 7 +++++-- 10 files changed, 47 insertions(+), 14 deletions(-) diff --git a/src/crewai_tools/tools/composio_tool/composio_tool.py b/src/crewai_tools/tools/composio_tool/composio_tool.py index 4823441bf..019b7895c 100644 --- a/src/crewai_tools/tools/composio_tool/composio_tool.py +++ b/src/crewai_tools/tools/composio_tool/composio_tool.py @@ -5,13 +5,16 @@ Composio tools wrapper. import typing as t import typing_extensions as te -from crewai.tools import BaseTool +from crewai.tools import BaseTool, EnvVar class ComposioTool(BaseTool): """Wrapper for composio tools.""" composio_action: t.Callable + env_vars: t.List[EnvVar] = [ + EnvVar(name="COMPOSIO_API_KEY", description="API key for Composio services", required=True), + ] def _run(self, *args: t.Any, **kwargs: t.Any) -> t.Any: """Run the composio action with given arguments.""" diff --git a/src/crewai_tools/tools/dalle_tool/dalle_tool.py b/src/crewai_tools/tools/dalle_tool/dalle_tool.py index 8957d9636..6a4a9e84f 100644 --- a/src/crewai_tools/tools/dalle_tool/dalle_tool.py +++ b/src/crewai_tools/tools/dalle_tool/dalle_tool.py @@ -1,7 +1,7 @@ import json -from typing import Type +from typing import List, Type -from crewai.tools import BaseTool +from crewai.tools import BaseTool, EnvVar from openai import OpenAI from pydantic import BaseModel, Field @@ -22,6 +22,10 @@ class DallETool(BaseTool): quality: str = "standard" n: int = 1 + env_vars: List[EnvVar] = [ + EnvVar(name="OPENAI_API_KEY", description="API key for OpenAI services", required=True), + ] + def _run(self, **kwargs) -> str: client = OpenAI() diff --git a/src/crewai_tools/tools/firecrawl_crawl_website_tool/firecrawl_crawl_website_tool.py b/src/crewai_tools/tools/firecrawl_crawl_website_tool/firecrawl_crawl_website_tool.py index 0d2ef325e..9c99fe8d4 100644 --- a/src/crewai_tools/tools/firecrawl_crawl_website_tool/firecrawl_crawl_website_tool.py +++ b/src/crewai_tools/tools/firecrawl_crawl_website_tool/firecrawl_crawl_website_tool.py @@ -1,6 +1,6 @@ from typing import Any, Optional, Type, List, TYPE_CHECKING -from crewai.tools import BaseTool +from crewai.tools import BaseTool, EnvVar from pydantic import BaseModel, ConfigDict, Field, PrivateAttr if TYPE_CHECKING: @@ -61,6 +61,9 @@ class FirecrawlCrawlWebsiteTool(BaseTool): ) _firecrawl: Optional["FirecrawlApp"] = PrivateAttr(None) package_dependencies: List[str] = ["firecrawl-py"] + env_vars: List[EnvVar] = [ + EnvVar(name="FIRECRAWL_API_KEY", description="API key for Firecrawl services", required=True), + ] def __init__(self, api_key: Optional[str] = None, **kwargs): super().__init__(**kwargs) diff --git a/src/crewai_tools/tools/firecrawl_scrape_website_tool/firecrawl_scrape_website_tool.py b/src/crewai_tools/tools/firecrawl_scrape_website_tool/firecrawl_scrape_website_tool.py index 31742340d..816e40159 100644 --- a/src/crewai_tools/tools/firecrawl_scrape_website_tool/firecrawl_scrape_website_tool.py +++ b/src/crewai_tools/tools/firecrawl_scrape_website_tool/firecrawl_scrape_website_tool.py @@ -1,6 +1,6 @@ from typing import Any, Optional, Type, Dict, List, TYPE_CHECKING -from crewai.tools import BaseTool +from crewai.tools import BaseTool, EnvVar from pydantic import BaseModel, ConfigDict, Field, PrivateAttr if TYPE_CHECKING: @@ -56,6 +56,9 @@ class FirecrawlScrapeWebsiteTool(BaseTool): _firecrawl: Optional["FirecrawlApp"] = PrivateAttr(None) package_dependencies: List[str] = ["firecrawl-py"] + env_vars: List[EnvVar] = [ + EnvVar(name="FIRECRAWL_API_KEY", description="API key for Firecrawl services", required=True), + ] def __init__(self, api_key: Optional[str] = None, **kwargs): super().__init__(**kwargs) diff --git a/src/crewai_tools/tools/firecrawl_search_tool/firecrawl_search_tool.py b/src/crewai_tools/tools/firecrawl_search_tool/firecrawl_search_tool.py index 1cad4819a..ba4d4c242 100644 --- a/src/crewai_tools/tools/firecrawl_search_tool/firecrawl_search_tool.py +++ b/src/crewai_tools/tools/firecrawl_search_tool/firecrawl_search_tool.py @@ -1,6 +1,6 @@ from typing import TYPE_CHECKING, Any, Dict, Optional, Type, List -from crewai.tools import BaseTool +from crewai.tools import BaseTool, EnvVar from pydantic import BaseModel, ConfigDict, Field, PrivateAttr if TYPE_CHECKING: @@ -58,6 +58,9 @@ class FirecrawlSearchTool(BaseTool): ) _firecrawl: Optional["FirecrawlApp"] = PrivateAttr(None) package_dependencies: List[str] = ["firecrawl-py"] + env_vars: List[EnvVar] = [ + EnvVar(name="FIRECRAWL_API_KEY", description="API key for Firecrawl services", required=True), + ] def __init__(self, api_key: Optional[str] = None, **kwargs): super().__init__(**kwargs) diff --git a/src/crewai_tools/tools/serply_api_tool/serply_job_search_tool.py b/src/crewai_tools/tools/serply_api_tool/serply_job_search_tool.py index 1c0c665b5..9d99fa01b 100644 --- a/src/crewai_tools/tools/serply_api_tool/serply_job_search_tool.py +++ b/src/crewai_tools/tools/serply_api_tool/serply_job_search_tool.py @@ -1,10 +1,11 @@ import os -from typing import Any, Optional, Type +from typing import Any, List, Optional, Type from urllib.parse import urlencode import requests from pydantic import BaseModel, Field +from crewai.tools import EnvVar from crewai_tools.tools.rag.rag_tool import RagTool @@ -30,6 +31,9 @@ class SerplyJobSearchTool(RagTool): - Currently only supports US """ headers: Optional[dict] = {} + env_vars: List[EnvVar] = [ + EnvVar(name="SERPLY_API_KEY", description="API key for Serply services", required=True), + ] def __init__(self, **kwargs): super().__init__(**kwargs) diff --git a/src/crewai_tools/tools/serply_api_tool/serply_news_search_tool.py b/src/crewai_tools/tools/serply_api_tool/serply_news_search_tool.py index c058091a2..5a2b27798 100644 --- a/src/crewai_tools/tools/serply_api_tool/serply_news_search_tool.py +++ b/src/crewai_tools/tools/serply_api_tool/serply_news_search_tool.py @@ -1,9 +1,9 @@ import os -from typing import Any, Optional, Type +from typing import Any, List, Optional, Type from urllib.parse import urlencode import requests -from crewai.tools import BaseTool +from crewai.tools import BaseTool, EnvVar from pydantic import BaseModel, Field @@ -23,6 +23,9 @@ class SerplyNewsSearchTool(BaseTool): proxy_location: Optional[str] = "US" headers: Optional[dict] = {} limit: Optional[int] = 10 + env_vars: List[EnvVar] = [ + EnvVar(name="SERPLY_API_KEY", description="API key for Serply services", required=True), + ] def __init__( self, limit: Optional[int] = 10, proxy_location: Optional[str] = "US", **kwargs diff --git a/src/crewai_tools/tools/serply_api_tool/serply_scholar_search_tool.py b/src/crewai_tools/tools/serply_api_tool/serply_scholar_search_tool.py index 3ed9de4ab..c49734c56 100644 --- a/src/crewai_tools/tools/serply_api_tool/serply_scholar_search_tool.py +++ b/src/crewai_tools/tools/serply_api_tool/serply_scholar_search_tool.py @@ -1,9 +1,9 @@ import os -from typing import Any, Optional, Type +from typing import Any, List, Optional, Type from urllib.parse import urlencode import requests -from crewai.tools import BaseTool +from crewai.tools import BaseTool, EnvVar from pydantic import BaseModel, Field @@ -26,6 +26,9 @@ class SerplyScholarSearchTool(BaseTool): hl: Optional[str] = "us" proxy_location: Optional[str] = "US" headers: Optional[dict] = {} + env_vars: List[EnvVar] = [ + EnvVar(name="SERPLY_API_KEY", description="API key for Serply services", required=True), + ] def __init__(self, hl: str = "us", proxy_location: Optional[str] = "US", **kwargs): """ diff --git a/src/crewai_tools/tools/serply_api_tool/serply_webpage_to_markdown_tool.py b/src/crewai_tools/tools/serply_api_tool/serply_webpage_to_markdown_tool.py index c7678f852..fa2404f75 100644 --- a/src/crewai_tools/tools/serply_api_tool/serply_webpage_to_markdown_tool.py +++ b/src/crewai_tools/tools/serply_api_tool/serply_webpage_to_markdown_tool.py @@ -1,7 +1,8 @@ import os -from typing import Any, Optional, Type +from typing import Any, List, Optional, Type import requests +from crewai.tools import EnvVar from pydantic import BaseModel, Field from crewai_tools.tools.rag.rag_tool import RagTool @@ -25,6 +26,9 @@ class SerplyWebpageToMarkdownTool(RagTool): request_url: str = "https://api.serply.io/v1/request" proxy_location: Optional[str] = "US" headers: Optional[dict] = {} + env_vars: List[EnvVar] = [ + EnvVar(name="SERPLY_API_KEY", description="API key for Serply services", required=True), + ] def __init__(self, proxy_location: Optional[str] = "US", **kwargs): """ diff --git a/src/crewai_tools/tools/vision_tool/vision_tool.py b/src/crewai_tools/tools/vision_tool/vision_tool.py index cd4f5e74c..6df658898 100644 --- a/src/crewai_tools/tools/vision_tool/vision_tool.py +++ b/src/crewai_tools/tools/vision_tool/vision_tool.py @@ -1,9 +1,9 @@ import base64 from pathlib import Path -from typing import Optional, Type +from typing import List, Optional, Type from crewai import LLM -from crewai.tools import BaseTool +from crewai.tools import BaseTool, EnvVar from pydantic import BaseModel, PrivateAttr, field_validator @@ -44,6 +44,9 @@ class VisionTool(BaseTool): "This tool uses OpenAI's Vision API to describe the contents of an image." ) args_schema: Type[BaseModel] = ImagePromptSchema + env_vars: List[EnvVar] = [ + EnvVar(name="OPENAI_API_KEY", description="API key for OpenAI services", required=True), + ] _model: str = PrivateAttr(default="gpt-4o-mini") _llm: Optional[LLM] = PrivateAttr(default=None)