From 5456c8055616e75c63240207d6e3d017979fd5e9 Mon Sep 17 00:00:00 2001 From: Greyson LaLonde Date: Thu, 2 Oct 2025 11:06:38 -0400 Subject: [PATCH] chore: apply linting fixes to crewai-tools --- docs/docs.json | 3 + docs/en/observability/braintrust.mdx | 237 +++++++ docs/images/braintrust-thread-view.png | Bin 0 -> 309613 bytes docs/images/braintrust-timeline-view.png | Bin 0 -> 155042 bytes docs/images/braintrust-trace-view.png | Bin 0 -> 345491 bytes docs/ko/observability/braintrust.mdx | 236 +++++++ docs/pt-BR/observability/braintrust.mdx | 237 +++++++ lib/crewai-tools/README.md | 2 +- lib/crewai-tools/generate_tool_specs.py | 95 +-- lib/crewai-tools/pyproject.toml | 2 +- lib/crewai-tools/src/crewai_tools/__init__.py | 288 +++++++-- .../src/crewai_tools/adapters/__init__.py | 0 .../adapters/crewai_rag_adapter.py | 7 +- .../adapters/enterprise_adapter.py | 64 +- .../crewai_tools/adapters/lancedb_adapter.py | 6 +- .../src/crewai_tools/adapters/mcp_adapter.py | 24 +- .../src/crewai_tools/adapters/rag_adapter.py | 6 +- .../crewai_tools/adapters/tool_collection.py | 16 +- .../crewai_tools/adapters/zapier_adapter.py | 33 +- .../aws/bedrock/agents/invoke_agent_tool.py | 25 +- .../browser/browser_session_manager.py | 30 +- .../aws/bedrock/browser/browser_toolkit.py | 52 +- .../crewai_tools/aws/bedrock/browser/utils.py | 16 +- .../code_interpreter_toolkit.py | 69 +- .../bedrock/knowledge_base/retriever_tool.py | 42 +- .../src/crewai_tools/aws/s3/reader_tool.py | 14 +- .../src/crewai_tools/aws/s3/writer_tool.py | 11 +- lib/crewai-tools/src/crewai_tools/printer.py | 30 +- .../src/crewai_tools/rag/base_loader.py | 10 +- .../crewai_tools/rag/chunkers/base_chunker.py | 30 +- .../rag/chunkers/default_chunker.py | 4 +- .../rag/chunkers/structured_chunker.py | 8 +- .../crewai_tools/rag/chunkers/text_chunker.py | 8 +- .../crewai_tools/rag/chunkers/web_chunker.py | 4 +- lib/crewai-tools/src/crewai_tools/rag/core.py | 28 +- .../src/crewai_tools/rag/data_types.py | 6 +- .../crewai_tools/rag/loaders/csv_loader.py | 2 +- .../rag/loaders/directory_loader.py | 18 +- .../rag/loaders/docs_site_loader.py | 4 +- .../crewai_tools/rag/loaders/docx_loader.py | 15 +- .../crewai_tools/rag/loaders/github_loader.py | 4 +- .../crewai_tools/rag/loaders/json_loader.py | 2 +- .../crewai_tools/rag/loaders/mdx_loader.py | 2 +- .../crewai_tools/rag/loaders/mysql_loader.py | 4 +- .../crewai_tools/rag/loaders/pdf_loader.py | 8 +- .../rag/loaders/postgres_loader.py | 4 +- .../rag/loaders/webpage_loader.py | 2 +- .../crewai_tools/rag/loaders/xml_loader.py | 8 +- .../rag/loaders/youtube_channel_loader.py | 10 +- .../rag/loaders/youtube_video_loader.py | 12 +- .../src/crewai_tools/rag/source_content.py | 1 - .../src/crewai_tools/tools/__init__.py | 311 ++++++--- .../tools/ai_mind_tool/ai_mind_tool.py | 28 +- .../tools/apify_actors_tool/__init__.py | 0 .../apify_actors_tool/apify_actors_tool.py | 26 +- .../tools/arxiv_paper_tool/__init__.py | 0 .../arxiv_paper_tool/arxiv_paper_tool.py | 24 +- .../brave_search_tool/brave_search_tool.py | 30 +- .../brightdata_tool/brightdata_dataset.py | 55 +- .../tools/brightdata_tool/brightdata_serp.py | 51 +- .../brightdata_tool/brightdata_unlocker.py | 29 +- .../tools/browserbase_load_tool/__init__.py | 0 .../browserbase_load_tool.py | 58 +- .../tools/code_docs_search_tool/__init__.py | 0 .../code_docs_search_tool.py | 9 +- .../tools/code_interpreter_tool/__init__.py | 0 .../code_interpreter_tool.py | 49 +- .../tools/composio_tool/__init__.py | 0 .../tools/composio_tool/composio_tool.py | 32 +- .../__init__.py | 0 .../contextual_create_agent_tool.py | 16 +- .../tools/contextualai_parse_tool/__init__.py | 0 .../contextual_parse_tool.py | 25 +- .../tools/contextualai_query_tool/__init__.py | 0 .../contextual_query_tool.py | 31 +- .../contextualai_rerank_tool/__init__.py | 0 .../contextual_rerank_tool.py | 24 +- .../tools/couchbase_tool/__init__.py | 0 .../tools/couchbase_tool/couchbase_tool.py | 43 +- .../tools/crewai_enterprise_tools/__init__.py | 0 .../crewai_enterprise_tools.py | 19 +- .../tools/crewai_platform_tools/__init__.py | 2 +- .../crewai_platform_action_tool.py | 44 +- .../crewai_platform_tool_builder.py | 6 +- .../crewai_platform_tools.py | 4 +- .../tools/csv_search_tool/__init__.py | 0 .../tools/csv_search_tool/csv_search_tool.py | 9 +- .../crewai_tools/tools/dalle_tool/__init__.py | 0 .../tools/dalle_tool/dalle_tool.py | 23 +- .../databricks_query_tool.py | 72 +-- .../tools/directory_read_tool/__init__.py | 0 .../directory_read_tool.py | 8 +- .../tools/directory_search_tool/__init__.py | 0 .../directory_search_tool.py | 9 +- .../tools/docx_search_tool/__init__.py | 0 .../docx_search_tool/docx_search_tool.py | 13 +- .../crewai_tools/tools/exa_tools/__init__.py | 0 .../tools/exa_tools/exa_search_tool.py | 66 +- .../tools/file_read_tool/__init__.py | 0 .../tools/file_read_tool/file_read_tool.py | 18 +- .../tools/file_writer_tool/__init__.py | 0 .../file_writer_tool/file_writer_tool.py | 6 +- .../tools/files_compressor_tool/__init__.py | 0 .../files_compressor_tool.py | 17 +- .../firecrawl_crawl_website_tool/__init__.py | 0 .../firecrawl_crawl_website_tool.py | 39 +- .../firecrawl_scrape_website_tool/__init__.py | 0 .../firecrawl_scrape_website_tool.py | 35 +- .../tools/firecrawl_search_tool/__init__.py | 0 .../firecrawl_search_tool.py | 42 +- .../__init__.py | 0 .../generate_crewai_automation_tool.py | 37 +- .../tools/github_search_tool/__init__.py | 0 .../github_search_tool/github_search_tool.py | 19 +- .../tools/hyperbrowser_load_tool/__init__.py | 0 .../hyperbrowser_load_tool.py | 53 +- .../invoke_crewai_automation_tool/__init__.py | 0 .../invoke_crewai_automation_tool.py | 23 +- .../jina_scrape_website_tool/__init__.py | 0 .../jina_scrape_website_tool.py | 18 +- .../tools/json_search_tool/__init__.py | 0 .../json_search_tool/json_search_tool.py | 8 +- .../src/crewai_tools/tools/linkup/__init__.py | 0 .../tools/linkup/linkup_search_tool.py | 31 +- .../tools/llamaindex_tool/__init__.py | 0 .../tools/llamaindex_tool/llamaindex_tool.py | 14 +- .../tools/mdx_search_tool/__init__.py | 0 .../tools/mdx_search_tool/mdx_search_tool.py | 9 +- .../tools/mongodb_vector_search_tool/utils.py | 21 +- .../vector_search.py | 76 +-- .../tools/multion_tool/__init__.py | 0 .../tools/multion_tool/multion_tool.py | 33 +- .../tools/mysql_search_tool/__init__.py | 0 .../mysql_search_tool/mysql_search_tool.py | 9 +- .../src/crewai_tools/tools/nl2sql/__init__.py | 0 .../crewai_tools/tools/nl2sql/nl2sql_tool.py | 19 +- .../crewai_tools/tools/ocr_tool/__init__.py | 0 .../crewai_tools/tools/ocr_tool/ocr_tool.py | 11 +- .../__init__.py | 0 .../oxylabs_amazon_product_scraper_tool.py | 47 +- .../__init__.py | 0 .../oxylabs_amazon_search_scraper_tool.py | 47 +- .../__init__.py | 0 .../oxylabs_google_search_scraper_tool.py | 47 +- .../__init__.py | 0 .../oxylabs_universal_scraper_tool.py | 46 +- .../parallel_tools/parallel_search_tool.py | 38 +- .../patronus_eval_tool/patronus_eval_tool.py | 47 +- .../patronus_local_evaluator_tool.py | 27 +- .../patronus_predefined_criteria_eval_tool.py | 27 +- .../tools/pdf_search_tool/__init__.py | 0 .../tools/pdf_search_tool/pdf_search_tool.py | 9 +- .../pdf_text_writing_tool.py | 87 --- .../tools/pg_search_tool/README.md | 56 -- .../tools/pg_search_tool/pg_search_tool.py | 51 -- .../qdrant_vector_search_tool/__init__.py | 0 .../qdrant_search_tool.py | 49 +- .../src/crewai_tools/tools/rag/rag_tool.py | 3 +- .../scrape_element_from_website/__init__.py | 0 .../scrape_element_from_website.py | 37 +- .../tools/scrape_website_tool/__init__.py | 0 .../scrape_website_tool.py | 36 +- .../tools/scrapegraph_scrape_tool/__init__.py | 0 .../scrapegraph_scrape_tool.py | 89 +-- .../scrapfly_scrape_website_tool/__init__.py | 0 .../scrapfly_scrape_website_tool.py | 36 +- .../tools/selenium_scraping_tool/__init__.py | 0 .../selenium_scraping_tool.py | 60 +- .../tools/serpapi_tool/__init__.py | 0 .../tools/serpapi_tool/serpapi_base_tool.py | 29 +- .../serpapi_google_search_tool.py | 6 +- .../serpapi_google_shopping_tool.py | 6 +- .../tools/serper_dev_tool/__init__.py | 0 .../tools/serper_dev_tool/serper_dev_tool.py | 28 +- .../serper_scrape_website_tool/__init__.py | 0 .../serper_scrape_website_tool.py | 23 +- .../tools/serply_api_tool/__init__.py | 0 .../serply_api_tool/serply_job_search_tool.py | 34 +- .../serply_news_search_tool.py | 47 +- .../serply_scholar_search_tool.py | 42 +- .../serply_api_tool/serply_web_search_tool.py | 46 +- .../serply_webpage_to_markdown_tool.py | 39 +- .../singlestore_search_tool.py | 253 ++++---- .../snowflake_search_tool.py | 104 +-- .../tools/spider_tool/__init__.py | 0 .../tools/spider_tool/spider_tool.py | 40 +- .../tools/stagehand_tool/stagehand_tool.py | 92 ++- .../tools/tavily_extractor_tool/__init__.py | 0 .../tavily_extractor_tool.py | 55 +- .../tools/tavily_search_tool/__init__.py | 0 .../tavily_search_tool/tavily_search_tool.py | 59 +- .../tools/txt_search_tool/__init__.py | 0 .../tools/txt_search_tool/txt_search_tool.py | 8 +- .../tools/vision_tool/__init__.py | 0 .../tools/vision_tool/vision_tool.py | 57 +- .../tools/weaviate_tool/__init__.py | 0 .../tools/weaviate_tool/vector_search.py | 41 +- .../tools/website_search/__init__.py | 0 .../website_search/website_search_tool.py | 9 +- .../tools/xml_search_tool/__init__.py | 0 .../tools/xml_search_tool/xml_search_tool.py | 8 +- .../youtube_channel_search_tool/__init__.py | 0 .../youtube_channel_search_tool.py | 9 +- .../youtube_video_search_tool/__init__.py | 0 .../youtube_video_search_tool.py | 9 +- .../tools/zapier_action_tool/__init__.py | 0 .../zapier_action_tool/zapier_action_tool.py | 8 +- lib/crewai-tools/tests/base_tool_test.py | 6 +- .../tests/rag/test_directory_loader.py | 2 +- .../tests/test_generate_tool_specs.py | 19 +- .../tools}/arxiv_paper_tool_test.py | 0 .../tests/tools/brave_search_tool_test.py | 3 +- .../tools/brightdata_webunlocker_tool_test.py | 4 +- .../tests/tools/couchbase_tool_test.py | 2 +- .../tools/files_compressor_tool_test.py} | 0 .../tools/singlestore_search_tool_test.py | 4 +- .../tests/tools/snowflake_search_tool_test.py | 2 +- .../tools}/test_file_writer_tool.py | 0 .../tests/tools/test_oxylabs_tools.py | 9 +- lib/crewai-tools/tool.specs.json | 99 --- pyproject.toml | 9 +- uv.lock | 591 +++++++++++------- 222 files changed, 3482 insertions(+), 2552 deletions(-) create mode 100644 docs/en/observability/braintrust.mdx create mode 100644 docs/images/braintrust-thread-view.png create mode 100644 docs/images/braintrust-timeline-view.png create mode 100644 docs/images/braintrust-trace-view.png create mode 100644 docs/ko/observability/braintrust.mdx create mode 100644 docs/pt-BR/observability/braintrust.mdx create mode 100644 lib/crewai-tools/src/crewai_tools/adapters/__init__.py create mode 100644 lib/crewai-tools/src/crewai_tools/tools/apify_actors_tool/__init__.py create mode 100644 lib/crewai-tools/src/crewai_tools/tools/arxiv_paper_tool/__init__.py create mode 100644 lib/crewai-tools/src/crewai_tools/tools/browserbase_load_tool/__init__.py create mode 100644 lib/crewai-tools/src/crewai_tools/tools/code_docs_search_tool/__init__.py create mode 100644 lib/crewai-tools/src/crewai_tools/tools/code_interpreter_tool/__init__.py create mode 100644 lib/crewai-tools/src/crewai_tools/tools/composio_tool/__init__.py create mode 100644 lib/crewai-tools/src/crewai_tools/tools/contextualai_create_agent_tool/__init__.py create mode 100644 lib/crewai-tools/src/crewai_tools/tools/contextualai_parse_tool/__init__.py create mode 100644 lib/crewai-tools/src/crewai_tools/tools/contextualai_query_tool/__init__.py create mode 100644 lib/crewai-tools/src/crewai_tools/tools/contextualai_rerank_tool/__init__.py create mode 100644 lib/crewai-tools/src/crewai_tools/tools/couchbase_tool/__init__.py create mode 100644 lib/crewai-tools/src/crewai_tools/tools/crewai_enterprise_tools/__init__.py create mode 100644 lib/crewai-tools/src/crewai_tools/tools/csv_search_tool/__init__.py create mode 100644 lib/crewai-tools/src/crewai_tools/tools/dalle_tool/__init__.py create mode 100644 lib/crewai-tools/src/crewai_tools/tools/directory_read_tool/__init__.py create mode 100644 lib/crewai-tools/src/crewai_tools/tools/directory_search_tool/__init__.py create mode 100644 lib/crewai-tools/src/crewai_tools/tools/docx_search_tool/__init__.py create mode 100644 lib/crewai-tools/src/crewai_tools/tools/exa_tools/__init__.py create mode 100644 lib/crewai-tools/src/crewai_tools/tools/file_read_tool/__init__.py create mode 100644 lib/crewai-tools/src/crewai_tools/tools/file_writer_tool/__init__.py create mode 100644 lib/crewai-tools/src/crewai_tools/tools/files_compressor_tool/__init__.py create mode 100644 lib/crewai-tools/src/crewai_tools/tools/firecrawl_crawl_website_tool/__init__.py create mode 100644 lib/crewai-tools/src/crewai_tools/tools/firecrawl_scrape_website_tool/__init__.py create mode 100644 lib/crewai-tools/src/crewai_tools/tools/firecrawl_search_tool/__init__.py create mode 100644 lib/crewai-tools/src/crewai_tools/tools/generate_crewai_automation_tool/__init__.py create mode 100644 lib/crewai-tools/src/crewai_tools/tools/github_search_tool/__init__.py create mode 100644 lib/crewai-tools/src/crewai_tools/tools/hyperbrowser_load_tool/__init__.py create mode 100644 lib/crewai-tools/src/crewai_tools/tools/invoke_crewai_automation_tool/__init__.py create mode 100644 lib/crewai-tools/src/crewai_tools/tools/jina_scrape_website_tool/__init__.py create mode 100644 lib/crewai-tools/src/crewai_tools/tools/json_search_tool/__init__.py create mode 100644 lib/crewai-tools/src/crewai_tools/tools/linkup/__init__.py create mode 100644 lib/crewai-tools/src/crewai_tools/tools/llamaindex_tool/__init__.py create mode 100644 lib/crewai-tools/src/crewai_tools/tools/mdx_search_tool/__init__.py create mode 100644 lib/crewai-tools/src/crewai_tools/tools/multion_tool/__init__.py create mode 100644 lib/crewai-tools/src/crewai_tools/tools/mysql_search_tool/__init__.py create mode 100644 lib/crewai-tools/src/crewai_tools/tools/nl2sql/__init__.py create mode 100644 lib/crewai-tools/src/crewai_tools/tools/ocr_tool/__init__.py create mode 100644 lib/crewai-tools/src/crewai_tools/tools/oxylabs_amazon_product_scraper_tool/__init__.py create mode 100644 lib/crewai-tools/src/crewai_tools/tools/oxylabs_amazon_search_scraper_tool/__init__.py create mode 100644 lib/crewai-tools/src/crewai_tools/tools/oxylabs_google_search_scraper_tool/__init__.py create mode 100644 lib/crewai-tools/src/crewai_tools/tools/oxylabs_universal_scraper_tool/__init__.py create mode 100644 lib/crewai-tools/src/crewai_tools/tools/pdf_search_tool/__init__.py delete mode 100644 lib/crewai-tools/src/crewai_tools/tools/pdf_text_writing_tool/pdf_text_writing_tool.py delete mode 100644 lib/crewai-tools/src/crewai_tools/tools/pg_search_tool/README.md delete mode 100644 lib/crewai-tools/src/crewai_tools/tools/pg_search_tool/pg_search_tool.py create mode 100644 lib/crewai-tools/src/crewai_tools/tools/qdrant_vector_search_tool/__init__.py create mode 100644 lib/crewai-tools/src/crewai_tools/tools/scrape_element_from_website/__init__.py create mode 100644 lib/crewai-tools/src/crewai_tools/tools/scrape_website_tool/__init__.py create mode 100644 lib/crewai-tools/src/crewai_tools/tools/scrapegraph_scrape_tool/__init__.py create mode 100644 lib/crewai-tools/src/crewai_tools/tools/scrapfly_scrape_website_tool/__init__.py create mode 100644 lib/crewai-tools/src/crewai_tools/tools/selenium_scraping_tool/__init__.py create mode 100644 lib/crewai-tools/src/crewai_tools/tools/serpapi_tool/__init__.py create mode 100644 lib/crewai-tools/src/crewai_tools/tools/serper_dev_tool/__init__.py create mode 100644 lib/crewai-tools/src/crewai_tools/tools/serper_scrape_website_tool/__init__.py create mode 100644 lib/crewai-tools/src/crewai_tools/tools/serply_api_tool/__init__.py create mode 100644 lib/crewai-tools/src/crewai_tools/tools/spider_tool/__init__.py create mode 100644 lib/crewai-tools/src/crewai_tools/tools/tavily_extractor_tool/__init__.py create mode 100644 lib/crewai-tools/src/crewai_tools/tools/tavily_search_tool/__init__.py create mode 100644 lib/crewai-tools/src/crewai_tools/tools/txt_search_tool/__init__.py create mode 100644 lib/crewai-tools/src/crewai_tools/tools/vision_tool/__init__.py create mode 100644 lib/crewai-tools/src/crewai_tools/tools/weaviate_tool/__init__.py create mode 100644 lib/crewai-tools/src/crewai_tools/tools/website_search/__init__.py create mode 100644 lib/crewai-tools/src/crewai_tools/tools/xml_search_tool/__init__.py create mode 100644 lib/crewai-tools/src/crewai_tools/tools/youtube_channel_search_tool/__init__.py create mode 100644 lib/crewai-tools/src/crewai_tools/tools/youtube_video_search_tool/__init__.py create mode 100644 lib/crewai-tools/src/crewai_tools/tools/zapier_action_tool/__init__.py rename lib/crewai-tools/{src/crewai_tools/tools/arxiv_paper_tool => tests/tools}/arxiv_paper_tool_test.py (100%) rename lib/crewai-tools/{src/crewai_tools/tools/files_compressor_tool/files_compressor_tool_test2.py => tests/tools/files_compressor_tool_test.py} (100%) rename lib/crewai-tools/{src/crewai_tools/tools/file_writer_tool/tests => tests/tools}/test_file_writer_tool.py (100%) diff --git a/docs/docs.json b/docs/docs.json index 651bcc614..672ef29f4 100644 --- a/docs/docs.json +++ b/docs/docs.json @@ -273,6 +273,7 @@ "pages": [ "en/observability/overview", "en/observability/arize-phoenix", + "en/observability/braintrust", "en/observability/langdb", "en/observability/langfuse", "en/observability/langtrace", @@ -683,6 +684,7 @@ "pages": [ "pt-BR/observability/overview", "pt-BR/observability/arize-phoenix", + "pt-BR/observability/braintrust", "pt-BR/observability/langdb", "pt-BR/observability/langfuse", "pt-BR/observability/langtrace", @@ -1096,6 +1098,7 @@ "pages": [ "ko/observability/overview", "ko/observability/arize-phoenix", + "ko/observability/braintrust", "ko/observability/langdb", "ko/observability/langfuse", "ko/observability/langtrace", diff --git a/docs/en/observability/braintrust.mdx b/docs/en/observability/braintrust.mdx new file mode 100644 index 000000000..21ab52c85 --- /dev/null +++ b/docs/en/observability/braintrust.mdx @@ -0,0 +1,237 @@ +--- +title: Braintrust +description: Braintrust integration for CrewAI with OpenTelemetry tracing and evaluation +icon: magnifying-glass-chart +mode: "wide" +--- + +# Braintrust Integration + +This guide demonstrates how to integrate **Braintrust** with **CrewAI** using OpenTelemetry for comprehensive tracing and evaluation. By the end of this guide, you will be able to trace your CrewAI agents, monitor their performance, and evaluate their outputs using Braintrust's powerful observability platform. + +> **What is Braintrust?** [Braintrust](https://www.braintrust.dev) is an AI evaluation and observability platform that provides comprehensive tracing, evaluation, and monitoring for AI applications with built-in experiment tracking and performance analytics. + +## Get Started + +We'll walk through a simple example of using CrewAI and integrating it with Braintrust via OpenTelemetry for comprehensive observability and evaluation. + +### Step 1: Install Dependencies + +```bash +uv add braintrust[otel] crewai crewai-tools opentelemetry-instrumentation-openai opentelemetry-instrumentation-crewai python-dotenv +``` + +### Step 2: Set Up Environment Variables + +Setup Braintrust API keys and configure OpenTelemetry to send traces to Braintrust. You'll need a Braintrust API key and your OpenAI API key. + +```python +import os +from getpass import getpass + +# Get your Braintrust credentials +BRAINTRUST_API_KEY = getpass("🔑 Enter your Braintrust API Key: ") + +# Get API keys for services +OPENAI_API_KEY = getpass("🔑 Enter your OpenAI API key: ") + +# Set environment variables +os.environ["BRAINTRUST_API_KEY"] = BRAINTRUST_API_KEY +os.environ["BRAINTRUST_PARENT"] = "project_name:crewai-demo" +os.environ["OPENAI_API_KEY"] = OPENAI_API_KEY +``` + +### Step 3: Initialize OpenTelemetry with Braintrust + +Initialize the Braintrust OpenTelemetry instrumentation to start capturing traces and send them to Braintrust. + +```python +import os +from typing import Any, Dict + +from braintrust.otel import BraintrustSpanProcessor +from crewai import Agent, Crew, Task +from crewai.llm import LLM +from opentelemetry import trace +from opentelemetry.instrumentation.crewai import CrewAIInstrumentor +from opentelemetry.instrumentation.openai import OpenAIInstrumentor +from opentelemetry.sdk.trace import TracerProvider + +def setup_tracing() -> None: + """Setup OpenTelemetry tracing with Braintrust.""" + current_provider = trace.get_tracer_provider() + if isinstance(current_provider, TracerProvider): + provider = current_provider + else: + provider = TracerProvider() + trace.set_tracer_provider(provider) + + provider.add_span_processor(BraintrustSpanProcessor()) + CrewAIInstrumentor().instrument(tracer_provider=provider) + OpenAIInstrumentor().instrument(tracer_provider=provider) + + +setup_tracing() +``` + +### Step 4: Create a CrewAI Application + +We'll create a CrewAI application where two agents collaborate to research and write a blog post about AI advancements, with comprehensive tracing enabled. + +```python +from crewai import Agent, Crew, Process, Task +from crewai_tools import SerperDevTool + +def create_crew() -> Crew: + """Create a crew with multiple agents for comprehensive tracing.""" + llm = LLM(model="gpt-4o-mini") + search_tool = SerperDevTool() + + # Define agents with specific roles + researcher = Agent( + role="Senior Research Analyst", + goal="Uncover cutting-edge developments in AI and data science", + backstory="""You work at a leading tech think tank. + Your expertise lies in identifying emerging trends. + You have a knack for dissecting complex data and presenting actionable insights.""", + verbose=True, + allow_delegation=False, + llm=llm, + tools=[search_tool], + ) + + writer = Agent( + role="Tech Content Strategist", + goal="Craft compelling content on tech advancements", + backstory="""You are a renowned Content Strategist, known for your insightful and engaging articles. + You transform complex concepts into compelling narratives.""", + verbose=True, + allow_delegation=True, + llm=llm, + ) + + # Create tasks for your agents + research_task = Task( + description="""Conduct a comprehensive analysis of the latest advancements in {topic}. + Identify key trends, breakthrough technologies, and potential industry impacts.""", + expected_output="Full analysis report in bullet points", + agent=researcher, + ) + + writing_task = Task( + description="""Using the insights provided, develop an engaging blog + post that highlights the most significant {topic} advancements. + Your post should be informative yet accessible, catering to a tech-savvy audience. + Make it sound cool, avoid complex words so it doesn't sound like AI.""", + expected_output="Full blog post of at least 4 paragraphs", + agent=writer, + context=[research_task], + ) + + # Instantiate your crew with a sequential process + crew = Crew( + agents=[researcher, writer], + tasks=[research_task, writing_task], + verbose=True, + process=Process.sequential + ) + + return crew + +def run_crew(): + """Run the crew and return results.""" + crew = create_crew() + result = crew.kickoff(inputs={"topic": "AI developments"}) + return result + +# Run your crew +if __name__ == "__main__": + # Instrumentation is already initialized above in this module + result = run_crew() + print(result) +``` + +### Step 5: View Traces in Braintrust + +After running your crew, you can view comprehensive traces in Braintrust through different perspectives: + + + + + Braintrust Trace View + + + + + + Braintrust Timeline View + + + + + + Braintrust Thread View + + + + +### Step 6: Evaluate via SDK (Experiments) + +You can also run evaluations using Braintrust's Eval SDK. This is useful for comparing versions or scoring outputs offline. Below is a Python example using the `Eval` class with the crew we created above: + +```python +# eval_crew.py +from braintrust import Eval +from autoevals import Levenshtein + +def evaluate_crew_task(input_data): + """Task function that wraps our crew for evaluation.""" + crew = create_crew() + result = crew.kickoff(inputs={"topic": input_data["topic"]}) + return str(result) + +Eval( + "AI Research Crew", # Project name + { + "data": lambda: [ + {"topic": "artificial intelligence trends 2024"}, + {"topic": "machine learning breakthroughs"}, + {"topic": "AI ethics and governance"}, + ], + "task": evaluate_crew_task, + "scores": [Levenshtein], + }, +) +``` + +Setup your API key and run: + +```bash +export BRAINTRUST_API_KEY="YOUR_API_KEY" +braintrust eval eval_crew.py +``` + +See the [Braintrust Eval SDK guide](https://www.braintrust.dev/docs/start/eval-sdk) for more details. + +### Key Features of Braintrust Integration + +- **Comprehensive Tracing**: Track all agent interactions, tool usage, and LLM calls +- **Performance Monitoring**: Monitor execution times, token usage, and success rates +- **Experiment Tracking**: Compare different crew configurations and models +- **Automated Evaluation**: Set up custom evaluation metrics for crew outputs +- **Error Tracking**: Monitor and debug failures across your crew executions +- **Cost Analysis**: Track token usage and associated costs + +### Version Compatibility Information +- Python 3.8+ +- CrewAI >= 0.86.0 +- Braintrust >= 0.1.0 +- OpenTelemetry SDK >= 1.31.0 + +### References +- [Braintrust Documentation](https://www.braintrust.dev/docs) - Overview of the Braintrust platform +- [Braintrust CrewAI Integration](https://www.braintrust.dev/docs/integrations/crew-ai) - Official CrewAI integration guide +- [Braintrust Eval SDK](https://www.braintrust.dev/docs/start/eval-sdk) - Run experiments via the SDK +- [CrewAI Documentation](https://docs.crewai.com/) - Overview of the CrewAI framework +- [OpenTelemetry Docs](https://opentelemetry.io/docs/) - OpenTelemetry guide +- [Braintrust GitHub](https://github.com/braintrustdata/braintrust) - Source code for Braintrust SDK diff --git a/docs/images/braintrust-thread-view.png b/docs/images/braintrust-thread-view.png new file mode 100644 index 0000000000000000000000000000000000000000..e64343d7c19100c332b599a67e48ad4f8015de16 GIT binary patch literal 309613 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
    4RP`rnW>5V=E0aI`-?2L>dqjA3+_ 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 literal 0 HcmV?d00001 diff --git a/docs/images/braintrust-trace-view.png b/docs/images/braintrust-trace-view.png new file mode 100644 index 0000000000000000000000000000000000000000..1182adca2ce699a281e4ae3a476b0200fb60c2d0 GIT binary patch literal 345491 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

    *;^KAkf~ismG+qR;Wdg!-3Y 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 z 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�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 mx_kbqm5KjP4WZCkWECU(XL5@Gj*gcGc **Braintrust란?** [Braintrust](https://www.braintrust.dev)는 내장된 실험 추적 및 성능 분석을 통해 AI 애플리케이션에 대한 포괄적인 추적, 평가 및 모니터링을 제공하는 AI 평가 및 관찰성 플랫폼입니다. + +## 시작하기 + +CrewAI를 사용하고 포괄적인 관찰성 및 평가를 위해 OpenTelemetry를 통해 Braintrust와 통합하는 간단한 예제를 단계별로 안내합니다. + +### 1단계: 의존성 설치 + +```bash +uv add braintrust[otel] crewai crewai-tools opentelemetry-instrumentation-openai opentelemetry-instrumentation-crewai python-dotenv +``` + +### 2단계: 환경 변수 설정 + +Braintrust API 키를 설정하고 추적을 Braintrust로 전송하도록 OpenTelemetry를 구성합니다. Braintrust API 키와 OpenAI API 키가 필요합니다. + +```python +import os +from getpass import getpass + +# Braintrust 자격 증명 가져오기 +BRAINTRUST_API_KEY = getpass("🔑 Braintrust API 키를 입력하세요: ") + +# 서비스용 API 키 가져오기 +OPENAI_API_KEY = getpass("🔑 OpenAI API 키를 입력하세요: ") + +# 환경 변수 설정 +os.environ["BRAINTRUST_API_KEY"] = BRAINTRUST_API_KEY +os.environ["BRAINTRUST_PARENT"] = "project_name:crewai-demo" +os.environ["OPENAI_API_KEY"] = OPENAI_API_KEY +``` + +### 3단계: Braintrust와 함께 OpenTelemetry 초기화하기 + +추적을 캡처하고 Braintrust로 전송하기 시작하도록 Braintrust OpenTelemetry 계측을 초기화합니다. + +```python +import os +from typing import Any, Dict + +from braintrust.otel import BraintrustSpanProcessor +from crewai import Agent, Crew, Task +from crewai.llm import LLM +from opentelemetry import trace +from opentelemetry.instrumentation.crewai import CrewAIInstrumentor +from opentelemetry.instrumentation.openai import OpenAIInstrumentor +from opentelemetry.sdk.trace import TracerProvider + +def setup_tracing() -> None: + """Braintrust와 함께 OpenTelemetry 추적 설정.""" + current_provider = trace.get_tracer_provider() + if isinstance(current_provider, TracerProvider): + provider = current_provider + else: + provider = TracerProvider() + trace.set_tracer_provider(provider) + + provider.add_span_processor(BraintrustSpanProcessor()) + CrewAIInstrumentor().instrument(tracer_provider=provider) + OpenAIInstrumentor().instrument(tracer_provider=provider) + + +setup_tracing() +``` + +### 4단계: CrewAI 애플리케이션 생성하기 + +포괄적인 추적이 활성화된 CrewAI 애플리케이션을 생성합니다. + +```python +from crewai import Agent, Crew, Process, Task +from crewai_tools import SerperDevTool + +def create_crew() -> Crew: + """포괄적인 추적을 위한 다중 agent가 있는 crew 생성.""" + llm = LLM(model="gpt-4o-mini") + search_tool = SerperDevTool() + + # 특정 역할을 가진 agent 정의 + researcher = Agent( + role="시니어 연구 분석가", + goal="AI 및 데이터 과학의 최첨단 발전 사항 발견", + backstory="""당신은 최고 수준의 기술 싱크탱크에서 근무합니다. + 새로운 트렌드를 식별하는 데 전문성이 있습니다. + 복잡한 데이터를 분석하고 실행 가능한 인사이트로 제시하는 데 뛰어납니다.""", + verbose=True, + allow_delegation=False, + llm=llm, + tools=[search_tool], + ) + + writer = Agent( + role="기술 콘텐츠 전략가", + goal="기술 발전에 대한 매력적인 콘텐츠 작성", + backstory="""당신은 통찰력 있고 흥미로운 기사로 유명한 콘텐츠 전략가입니다. + 복잡한 개념을 매력적인 스토리로 전환합니다.""", + verbose=True, + allow_delegation=True, + llm=llm, + ) + + # agent를 위한 작업 생성 + research_task = Task( + description="""{topic} 분야의 최신 발전 상황에 대한 포괄적인 분석을 수행하세요. + 주요 트렌드, 획기적 기술, 산업에 미칠 잠재적 영향을 식별하세요.""", + expected_output="주요 내용을 불릿 포인트로 정리한 전체 분석 보고서", + agent=researcher, + ) + + writing_task = Task( + description="""제공된 인사이트를 활용하여 + 가장 중요한 {topic} 발전 내용을 강조하는 흥미로운 블로그 글을 작성하세요. + 글은 정보성 있고, 기술에 밝은 독자를 대상으로 하면서 읽기 쉽게 써야 합니다. + 멋지게 들리도록 쓰되, 복잡한 단어는 피하여 AI처럼 들리지 않게 하세요.""", + expected_output="최소 4개의 단락으로 구성된 전체 블로그 글", + agent=writer, + context=[research_task], + ) + + # 순차 프로세스 방식으로 crew 인스턴스화 + crew = Crew( + agents=[researcher, writer], + tasks=[research_task, writing_task], + verbose=True, + process=Process.sequential + ) + + return crew + +def run_crew(): + """crew를 실행하고 결과 반환.""" + crew = create_crew() + result = crew.kickoff(inputs={"topic": "AI 발전"}) + return result + +# crew 실행 +if __name__ == "__main__": + # 이 모듈에서 계측이 이미 초기화됨 + result = run_crew() + print(result) +``` + +### 5단계: Braintrust에서 추적 보기 + +crew를 실행한 후, Braintrust에서 다양한 관점으로 포괄적인 추적을 볼 수 있습니다: + + + + + Braintrust Trace View + + + + + + Braintrust Timeline View + + + + + + Braintrust Thread View + + + + +### 6단계: SDK를 통한 평가 (실험) + +Braintrust의 Eval SDK를 사용하여 평가를 실행할 수도 있습니다. 이는 버전을 비교하거나 출력을 오프라인으로 점수화하는 데 유용합니다. 아래는 위에서 생성한 crew를 사용하는 Python 예제입니다: + +```python +from braintrust import Eval +from autoevals import Levenshtein + +def evaluate_crew_task(input_data): + """crew를 평가하기 위해 감싸는 작업 함수.""" + crew = create_crew() + result = crew.kickoff(inputs={"topic": input_data["topic"]}) + return str(result) + +Eval( + "AI 연구 Crew", # 프로젝트 이름 + { + "data": lambda: [ + {"topic": "artificial intelligence trends 2024"}, + {"topic": "machine learning breakthroughs"}, + {"topic": "AI ethics and governance"}, + ], + "task": evaluate_crew_task, + "scores": [Levenshtein], + }, +) +``` + +API 키를 설정하고 실행: + +```bash +export BRAINTRUST_API_KEY="YOUR_API_KEY" +braintrust eval eval_crew.py +``` + +자세한 내용은 [Braintrust Eval SDK 가이드](https://www.braintrust.dev/docs/start/eval-sdk)를 참조하세요. + +### Braintrust 통합의 주요 기능 + +- **포괄적인 추적**: 모든 agent 상호작용, 도구 사용 및 LLM 호출 추적 +- **성능 모니터링**: 실행 시간, 토큰 사용량 및 성공률 모니터링 +- **실험 추적**: 다른 crew 구성 및 모델 비교 +- **자동화된 평가**: crew 출력에 대한 사용자 정의 평가 메트릭 설정 +- **오류 추적**: crew 실행 전반에 걸친 실패 모니터링 및 디버깅 +- **비용 분석**: 토큰 사용량 및 관련 비용 추적 + +### 버전 호환성 정보 +- Python 3.8+ +- CrewAI >= 0.86.0 +- Braintrust >= 0.1.0 +- OpenTelemetry SDK >= 1.31.0 + +### 참고 자료 +- [Braintrust 문서](https://www.braintrust.dev/docs) - Braintrust 플랫폼 개요 +- [Braintrust CrewAI 통합](https://www.braintrust.dev/docs/integrations/crew-ai) - 공식 CrewAI 통합 가이드 +- [Braintrust Eval SDK](https://www.braintrust.dev/docs/start/eval-sdk) - SDK를 통한 실험 실행 +- [CrewAI 문서](https://docs.crewai.com/) - CrewAI 프레임워크 개요 +- [OpenTelemetry 문서](https://opentelemetry.io/docs/) - OpenTelemetry 가이드 +- [Braintrust GitHub](https://github.com/braintrustdata/braintrust) - Braintrust SDK 소스 코드 diff --git a/docs/pt-BR/observability/braintrust.mdx b/docs/pt-BR/observability/braintrust.mdx new file mode 100644 index 000000000..c0a19cfa3 --- /dev/null +++ b/docs/pt-BR/observability/braintrust.mdx @@ -0,0 +1,237 @@ +--- +title: Braintrust +description: Integração do Braintrust para CrewAI com rastreamento OpenTelemetry e avaliação +icon: magnifying-glass-chart +mode: "wide" +--- + +# Integração Braintrust + +Este guia demonstra como integrar o **Braintrust** com **CrewAI** usando OpenTelemetry para rastreamento e avaliação abrangentes. Ao final deste guia, você poderá rastrear seus agentes CrewAI, monitorar seu desempenho e avaliar suas saídas usando a poderosa plataforma de observabilidade do Braintrust. + +> **O que é Braintrust?** [Braintrust](https://www.braintrust.dev) é uma plataforma de avaliação e observabilidade de IA que fornece rastreamento, avaliação e monitoramento abrangentes para aplicações de IA com rastreamento de experimentos e análises de desempenho integrados. + +## Começar + +Vamos percorrer um exemplo simples de uso do CrewAI e integração com Braintrust via OpenTelemetry para observabilidade e avaliação abrangentes. + +### Passo 1: Instalar Dependências + +```bash +uv add braintrust[otel] crewai crewai-tools opentelemetry-instrumentation-openai opentelemetry-instrumentation-crewai python-dotenv +``` + +### Passo 2: Configurar Variáveis de Ambiente + +Configure as chaves de API do Braintrust e configure o OpenTelemetry para enviar rastreamentos para o Braintrust. Você precisará de uma chave de API do Braintrust e sua chave de API do OpenAI. + +```python +import os +from getpass import getpass + +# Obter suas credenciais do Braintrust +BRAINTRUST_API_KEY = getpass("🔑 Digite sua Chave de API do Braintrust: ") + +# Obter chaves de API para serviços +OPENAI_API_KEY = getpass("🔑 Digite sua chave de API do OpenAI: ") + +# Configurar variáveis de ambiente +os.environ["BRAINTRUST_API_KEY"] = BRAINTRUST_API_KEY +os.environ["BRAINTRUST_PARENT"] = "project_name:crewai-demo" +os.environ["OPENAI_API_KEY"] = OPENAI_API_KEY +``` + +### Passo 3: Inicializar OpenTelemetry com Braintrust + +Inicialize a instrumentação OpenTelemetry do Braintrust para começar a capturar rastreamentos e enviá-los para o Braintrust. + +```python +import os +from typing import Any, Dict + +from braintrust.otel import BraintrustSpanProcessor +from crewai import Agent, Crew, Task +from crewai.llm import LLM +from opentelemetry import trace +from opentelemetry.instrumentation.crewai import CrewAIInstrumentor +from opentelemetry.instrumentation.openai import OpenAIInstrumentor +from opentelemetry.sdk.trace import TracerProvider + +def setup_tracing() -> None: + """Configurar rastreamento OpenTelemetry com Braintrust.""" + current_provider = trace.get_tracer_provider() + if isinstance(current_provider, TracerProvider): + provider = current_provider + else: + provider = TracerProvider() + trace.set_tracer_provider(provider) + + provider.add_span_processor(BraintrustSpanProcessor()) + CrewAIInstrumentor().instrument(tracer_provider=provider) + OpenAIInstrumentor().instrument(tracer_provider=provider) + + +setup_tracing() +``` + +### Passo 4: Criar uma Aplicação CrewAI + +Vamos criar uma aplicação CrewAI onde dois agentes colaboram para pesquisar e escrever um post de blog sobre avanços em IA, com rastreamento abrangente habilitado. + +```python +from crewai import Agent, Crew, Process, Task +from crewai_tools import SerperDevTool + +def create_crew() -> Crew: + """Criar uma crew com múltiplos agentes para rastreamento abrangente.""" + llm = LLM(model="gpt-4o-mini") + search_tool = SerperDevTool() + + # Definir agentes com papéis específicos + researcher = Agent( + role="Analista de Pesquisa Sênior", + goal="Descobrir desenvolvimentos de ponta em IA e ciência de dados", + backstory="""Você trabalha em um think tank de tecnologia líder. + Sua especialidade está em identificar tendências emergentes. + Você tem talento para dissecar dados complexos e apresentar insights acionáveis.""", + verbose=True, + allow_delegation=False, + llm=llm, + tools=[search_tool], + ) + + writer = Agent( + role="Estrategista de Conteúdo Tecnológico", + goal="Criar conteúdo envolvente sobre avanços tecnológicos", + backstory="""Você é um Estrategista de Conteúdo renomado, conhecido por seus artigos perspicazes e envolventes. + Você transforma conceitos complexos em narrativas convincentes.""", + verbose=True, + allow_delegation=True, + llm=llm, + ) + + # Criar tarefas para seus agentes + research_task = Task( + description="""Realize uma análise abrangente dos últimos avanços em {topic}. + Identifique tendências principais, tecnologias revolucionárias e impactos potenciais na indústria.""", + expected_output="Relatório de análise completo em pontos de bala", + agent=researcher, + ) + + writing_task = Task( + description="""Usando os insights fornecidos, desenvolva um post de blog envolvente + que destaque os avanços mais significativos em {topic}. + Seu post deve ser informativo, mas acessível, atendendo a um público conhecedor de tecnologia. + Faça soar legal, evite palavras complexas para não soar como IA.""", + expected_output="Post de blog completo de pelo menos 4 parágrafos", + agent=writer, + context=[research_task], + ) + + # Instanciar sua crew com um processo sequencial + crew = Crew( + agents=[researcher, writer], + tasks=[research_task, writing_task], + verbose=True, + process=Process.sequential + ) + + return crew + +def run_crew(): + """Executar a crew e retornar resultados.""" + crew = create_crew() + result = crew.kickoff(inputs={"topic": "desenvolvimentos em IA"}) + return result + +# Executar sua crew +if __name__ == "__main__": + # A instrumentação já foi inicializada acima neste módulo + result = run_crew() + print(result) +``` + +### Passo 5: Visualizar Rastreamentos no Braintrust + +Após executar sua crew, você pode visualizar rastreamentos abrangentes no Braintrust através de diferentes perspectivas: + + + + + Visualização de Rastreamento Braintrust + + + + + + Visualização de Linha do Tempo Braintrust + + + + + + Visualização de Thread Braintrust + + + + +### Passo 6: Avaliar via SDK (Experimentos) + +Você também pode executar avaliações usando o Eval SDK do Braintrust. Isso é útil para comparar versões ou pontuar saídas offline. Abaixo está um exemplo em Python usando a classe `Eval` com a crew que criamos acima: + +```python +# eval_crew.py +from braintrust import Eval +from autoevals import Levenshtein + +def evaluate_crew_task(input_data): + """Função de tarefa que envolve nossa crew para avaliação.""" + crew = create_crew() + result = crew.kickoff(inputs={"topic": input_data["topic"]}) + return str(result) + +Eval( + "Crew de Pesquisa em IA", # Nome do projeto + { + "data": lambda: [ + {"topic": "tendências de inteligência artificial 2024"}, + {"topic": "avanços em aprendizado de máquina"}, + {"topic": "ética e governança de IA"}, + ], + "task": evaluate_crew_task, + "scores": [Levenshtein], + }, +) +``` + +Configure sua chave de API e execute: + +```bash +export BRAINTRUST_API_KEY="YOUR_API_KEY" +braintrust eval eval_crew.py +``` + +Veja o [guia do Eval SDK do Braintrust](https://www.braintrust.dev/docs/start/eval-sdk) para mais detalhes. + +### Principais Recursos da Integração Braintrust + +- **Rastreamento Abrangente**: Rastreie todas as interações de agentes, uso de ferramentas e chamadas LLM +- **Monitoramento de Desempenho**: Monitore tempos de execução, uso de tokens e taxas de sucesso +- **Rastreamento de Experimentos**: Compare diferentes configurações de crew e modelos +- **Avaliação Automatizada**: Configure métricas de avaliação personalizadas para saídas de crew +- **Rastreamento de Erros**: Monitore e depure falhas em suas execuções de crew +- **Análise de Custos**: Rastreie uso de tokens e custos associados + +### Informações de Compatibilidade de Versão +- Python 3.8+ +- CrewAI >= 0.86.0 +- Braintrust >= 0.1.0 +- OpenTelemetry SDK >= 1.31.0 + +### Referências +- [Documentação Braintrust](https://www.braintrust.dev/docs) - Visão geral da plataforma Braintrust +- [Integração CrewAI Braintrust](https://www.braintrust.dev/docs/integrations/crew-ai) - Guia oficial de integração CrewAI +- [Eval SDK Braintrust](https://www.braintrust.dev/docs/start/eval-sdk) - Execute experimentos via SDK +- [Documentação CrewAI](https://docs.crewai.com/) - Visão geral do framework CrewAI +- [Documentação OpenTelemetry](https://opentelemetry.io/docs/) - Guia OpenTelemetry +- [GitHub Braintrust](https://github.com/braintrustdata/braintrust) - Código fonte do SDK Braintrust diff --git a/lib/crewai-tools/README.md b/lib/crewai-tools/README.md index 3ee271370..693e1a175 100644 --- a/lib/crewai-tools/README.md +++ b/lib/crewai-tools/README.md @@ -24,7 +24,7 @@ CrewAI provides an extensive collection of powerful tools ready to enhance your - **File Management**: `FileReadTool`, `FileWriteTool` - **Web Scraping**: `ScrapeWebsiteTool`, `SeleniumScrapingTool` -- **Database Integrations**: `PGSearchTool`, `MySQLSearchTool` +- **Database Integrations**: `MySQLSearchTool` - **Vector Database Integrations**: `MongoDBVectorSearchTool`, `QdrantVectorSearchTool`, `WeaviateVectorSearchTool` - **API Integrations**: `SerperApiTool`, `EXASearchTool` - **AI-powered Tools**: `DallETool`, `VisionTool`, `StagehandTool` diff --git a/lib/crewai-tools/generate_tool_specs.py b/lib/crewai-tools/generate_tool_specs.py index 285574fbc..af97191c4 100644 --- a/lib/crewai-tools/generate_tool_specs.py +++ b/lib/crewai-tools/generate_tool_specs.py @@ -1,12 +1,14 @@ #!/usr/bin/env python3 +from collections.abc import Mapping import inspect import json from pathlib import Path -from typing import Any, Dict, List, Optional +from typing import Any, cast from crewai.tools.base_tool import BaseTool, EnvVar from crewai_tools import tools +from pydantic import BaseModel from pydantic.json_schema import GenerateJsonSchema from pydantic_core import PydanticOmit @@ -18,19 +20,19 @@ class SchemaGenerator(GenerateJsonSchema): class ToolSpecExtractor: def __init__(self) -> None: - self.tools_spec: List[Dict[str, Any]] = [] + self.tools_spec: list[dict[str, Any]] = [] self.processed_tools: set[str] = set() - def extract_all_tools(self) -> List[Dict[str, Any]]: + def extract_all_tools(self) -> list[dict[str, Any]]: for name in dir(tools): if name.endswith("Tool") and name not in self.processed_tools: obj = getattr(tools, name, None) - if inspect.isclass(obj): + if inspect.isclass(obj) and issubclass(obj, BaseTool): self.extract_tool_info(obj) self.processed_tools.add(name) return self.tools_spec - def extract_tool_info(self, tool_class: BaseTool) -> None: + def extract_tool_info(self, tool_class: type[BaseTool]) -> None: try: core_schema = tool_class.__pydantic_core_schema__ if not core_schema: @@ -44,8 +46,8 @@ class ToolSpecExtractor: "humanized_name": self._extract_field_default( fields.get("name"), fallback=tool_class.__name__ ), - "description": self._extract_field_default( - fields.get("description") + "description": str( + self._extract_field_default(fields.get("description")) ).strip(), "run_params_schema": self._extract_params(fields.get("args_schema")), "init_params_schema": self._extract_init_params(tool_class), @@ -57,17 +59,22 @@ class ToolSpecExtractor: self.tools_spec.append(tool_info) - except Exception as e: - print(f"Error extracting {tool_class.__name__}: {e}") + except Exception: # noqa: S110 + pass - def _unwrap_schema(self, schema: Dict) -> Dict: + @staticmethod + def _unwrap_schema(schema: Mapping[str, Any] | dict[str, Any]) -> dict[str, Any]: + result: dict[str, Any] = dict(schema) while ( - schema.get("type") in {"function-after", "default"} and "schema" in schema + result.get("type") in {"function-after", "default"} and "schema" in result ): - schema = schema["schema"] - return schema + result = dict(result["schema"]) + return result - def _extract_field_default(self, field: Optional[Dict], fallback: str = "") -> str: + @staticmethod + def _extract_field_default( + field: dict | None, fallback: str | list[Any] = "" + ) -> str | list[Any] | int: if not field: return fallback @@ -75,45 +82,43 @@ class ToolSpecExtractor: default = schema.get("default") return default if isinstance(default, (list, str, int)) else fallback - def _extract_params( - self, args_schema_field: Optional[Dict] - ) -> List[Dict[str, str]]: + @staticmethod + def _extract_params(args_schema_field: dict | None) -> dict[str, Any]: if not args_schema_field: return {} args_schema_class = args_schema_field.get("schema", {}).get("default") if not ( inspect.isclass(args_schema_class) - and hasattr(args_schema_class, "__pydantic_core_schema__") + and issubclass(args_schema_class, BaseModel) ): return {} + # Cast to type[BaseModel] after runtime check + schema_class = cast(type[BaseModel], args_schema_class) try: - return args_schema_class.model_json_schema( - schema_generator=SchemaGenerator, mode="validation" - ) - except Exception as e: - print(f"Error extracting params from {args_schema_class}: {e}") + return schema_class.model_json_schema(schema_generator=SchemaGenerator) + except Exception: return {} - def _extract_env_vars(self, env_vars_field: Optional[Dict]) -> List[Dict[str, str]]: + @staticmethod + def _extract_env_vars(env_vars_field: dict | None) -> list[dict[str, Any]]: if not env_vars_field: return [] - env_vars = [] - for env_var in env_vars_field.get("schema", {}).get("default", []): - if isinstance(env_var, EnvVar): - env_vars.append( - { - "name": env_var.name, - "description": env_var.description, - "required": env_var.required, - "default": env_var.default, - } - ) - return env_vars + return [ + { + "name": env_var.name, + "description": env_var.description, + "required": env_var.required, + "default": env_var.default, + } + for env_var in env_vars_field.get("schema", {}).get("default", []) + if isinstance(env_var, EnvVar) + ] - def _extract_init_params(self, tool_class: BaseTool) -> dict: + @staticmethod + def _extract_init_params(tool_class: type[BaseTool]) -> dict[str, Any]: ignored_init_params = [ "name", "description", @@ -131,25 +136,21 @@ class ToolSpecExtractor: schema_generator=SchemaGenerator, mode="serialization" ) - properties = {} - for key, value in json_schema["properties"].items(): - if key not in ignored_init_params: - properties[key] = value - - json_schema["properties"] = properties + json_schema["properties"] = { + key: value + for key, value in json_schema["properties"].items() + if key not in ignored_init_params + } return json_schema def save_to_json(self, output_path: str) -> None: with open(output_path, "w", encoding="utf-8") as f: json.dump({"tools": self.tools_spec}, f, indent=2, sort_keys=True) - print(f"Saved tool specs to {output_path}") if __name__ == "__main__": output_file = Path(__file__).parent / "tool.specs.json" extractor = ToolSpecExtractor() - specs = extractor.extract_all_tools() + extractor.extract_all_tools() extractor.save_to_json(str(output_file)) - - print(f"Extracted {len(specs)} tool classes.") diff --git a/lib/crewai-tools/pyproject.toml b/lib/crewai-tools/pyproject.toml index 6fc8bba03..29a7c1035 100644 --- a/lib/crewai-tools/pyproject.toml +++ b/lib/crewai-tools/pyproject.toml @@ -10,7 +10,7 @@ requires-python = ">=3.10, <3.14" dependencies = [ "lancedb>=0.5.4", "pytube>=15.0.0", - "requests>=2.32.0", + "requests>=2.32.5", "docker>=7.1.0", "crewai==1.0.0a1", "lancedb>=0.5.4", diff --git a/lib/crewai-tools/src/crewai_tools/__init__.py b/lib/crewai-tools/src/crewai_tools/__init__.py index 1655a9240..5466f159f 100644 --- a/lib/crewai-tools/src/crewai_tools/__init__.py +++ b/lib/crewai-tools/src/crewai_tools/__init__.py @@ -1,102 +1,294 @@ -# ruff: noqa: F401 -from .adapters.enterprise_adapter import EnterpriseActionTool -from .adapters.mcp_adapter import MCPServerAdapter -from .adapters.zapier_adapter import ZapierActionTool -from .aws import ( - BedrockInvokeAgentTool, +from crewai_tools.adapters.enterprise_adapter import EnterpriseActionTool +from crewai_tools.adapters.mcp_adapter import MCPServerAdapter +from crewai_tools.adapters.zapier_adapter import ZapierActionTool +from crewai_tools.aws.bedrock.agents.invoke_agent_tool import BedrockInvokeAgentTool +from crewai_tools.aws.bedrock.knowledge_base.retriever_tool import ( BedrockKBRetrieverTool, - S3ReaderTool, - S3WriterTool, ) -from .tools import ( - AIMindTool, - ApifyActorsTool, - ArxivPaperTool, - BraveSearchTool, +from crewai_tools.aws.s3.reader_tool import S3ReaderTool +from crewai_tools.aws.s3.writer_tool import S3WriterTool +from crewai_tools.tools.ai_mind_tool.ai_mind_tool import AIMindTool +from crewai_tools.tools.apify_actors_tool.apify_actors_tool import ApifyActorsTool +from crewai_tools.tools.arxiv_paper_tool.arxiv_paper_tool import ArxivPaperTool +from crewai_tools.tools.brave_search_tool.brave_search_tool import BraveSearchTool +from crewai_tools.tools.brightdata_tool.brightdata_dataset import ( BrightDataDatasetTool, - BrightDataSearchTool, +) +from crewai_tools.tools.brightdata_tool.brightdata_serp import BrightDataSearchTool +from crewai_tools.tools.brightdata_tool.brightdata_unlocker import ( BrightDataWebUnlockerTool, +) +from crewai_tools.tools.browserbase_load_tool.browserbase_load_tool import ( BrowserbaseLoadTool, - CSVSearchTool, +) +from crewai_tools.tools.code_docs_search_tool.code_docs_search_tool import ( CodeDocsSearchTool, +) +from crewai_tools.tools.code_interpreter_tool.code_interpreter_tool import ( CodeInterpreterTool, - ComposioTool, +) +from crewai_tools.tools.composio_tool.composio_tool import ComposioTool +from crewai_tools.tools.contextualai_create_agent_tool.contextual_create_agent_tool import ( ContextualAICreateAgentTool, +) +from crewai_tools.tools.contextualai_parse_tool.contextual_parse_tool import ( ContextualAIParseTool, +) +from crewai_tools.tools.contextualai_query_tool.contextual_query_tool import ( ContextualAIQueryTool, +) +from crewai_tools.tools.contextualai_rerank_tool.contextual_rerank_tool import ( ContextualAIRerankTool, +) +from crewai_tools.tools.couchbase_tool.couchbase_tool import ( CouchbaseFTSVectorSearchTool, +) +from crewai_tools.tools.crewai_enterprise_tools.crewai_enterprise_tools import ( CrewaiEnterpriseTools, +) +from crewai_tools.tools.crewai_platform_tools.crewai_platform_tools import ( CrewaiPlatformTools, - DOCXSearchTool, - DallETool, +) +from crewai_tools.tools.csv_search_tool.csv_search_tool import CSVSearchTool +from crewai_tools.tools.dalle_tool.dalle_tool import DallETool +from crewai_tools.tools.databricks_query_tool.databricks_query_tool import ( DatabricksQueryTool, +) +from crewai_tools.tools.directory_read_tool.directory_read_tool import ( DirectoryReadTool, +) +from crewai_tools.tools.directory_search_tool.directory_search_tool import ( DirectorySearchTool, - EXASearchTool, +) +from crewai_tools.tools.docx_search_tool.docx_search_tool import DOCXSearchTool +from crewai_tools.tools.exa_tools.exa_search_tool import EXASearchTool +from crewai_tools.tools.file_read_tool.file_read_tool import FileReadTool +from crewai_tools.tools.file_writer_tool.file_writer_tool import FileWriterTool +from crewai_tools.tools.files_compressor_tool.files_compressor_tool import ( FileCompressorTool, - FileReadTool, - FileWriterTool, +) +from crewai_tools.tools.firecrawl_crawl_website_tool.firecrawl_crawl_website_tool import ( FirecrawlCrawlWebsiteTool, +) +from crewai_tools.tools.firecrawl_scrape_website_tool.firecrawl_scrape_website_tool import ( FirecrawlScrapeWebsiteTool, +) +from crewai_tools.tools.firecrawl_search_tool.firecrawl_search_tool import ( FirecrawlSearchTool, +) +from crewai_tools.tools.generate_crewai_automation_tool.generate_crewai_automation_tool import ( GenerateCrewaiAutomationTool, - GithubSearchTool, +) +from crewai_tools.tools.github_search_tool.github_search_tool import GithubSearchTool +from crewai_tools.tools.hyperbrowser_load_tool.hyperbrowser_load_tool import ( HyperbrowserLoadTool, +) +from crewai_tools.tools.invoke_crewai_automation_tool.invoke_crewai_automation_tool import ( InvokeCrewAIAutomationTool, - JSONSearchTool, - LinkupSearchTool, - LlamaIndexTool, - MDXSearchTool, +) +from crewai_tools.tools.jina_scrape_website_tool.jina_scrape_website_tool import ( + JinaScrapeWebsiteTool, +) +from crewai_tools.tools.json_search_tool.json_search_tool import JSONSearchTool +from crewai_tools.tools.linkup.linkup_search_tool import LinkupSearchTool +from crewai_tools.tools.llamaindex_tool.llamaindex_tool import LlamaIndexTool +from crewai_tools.tools.mdx_search_tool.mdx_search_tool import MDXSearchTool +from crewai_tools.tools.mongodb_vector_search_tool.vector_search import ( MongoDBVectorSearchConfig, MongoDBVectorSearchTool, - MultiOnTool, - MySQLSearchTool, - NL2SQLTool, - OCRTool, +) +from crewai_tools.tools.multion_tool.multion_tool import MultiOnTool +from crewai_tools.tools.mysql_search_tool.mysql_search_tool import MySQLSearchTool +from crewai_tools.tools.nl2sql.nl2sql_tool import NL2SQLTool +from crewai_tools.tools.ocr_tool.ocr_tool import OCRTool +from crewai_tools.tools.oxylabs_amazon_product_scraper_tool.oxylabs_amazon_product_scraper_tool import ( OxylabsAmazonProductScraperTool, +) +from crewai_tools.tools.oxylabs_amazon_search_scraper_tool.oxylabs_amazon_search_scraper_tool import ( OxylabsAmazonSearchScraperTool, +) +from crewai_tools.tools.oxylabs_google_search_scraper_tool.oxylabs_google_search_scraper_tool import ( OxylabsGoogleSearchScraperTool, +) +from crewai_tools.tools.oxylabs_universal_scraper_tool.oxylabs_universal_scraper_tool import ( OxylabsUniversalScraperTool, - PDFSearchTool, - PGSearchTool, - ParallelSearchTool, - PatronusEvalTool, +) +from crewai_tools.tools.parallel_tools.parallel_search_tool import ParallelSearchTool +from crewai_tools.tools.patronus_eval_tool.patronus_eval_tool import PatronusEvalTool +from crewai_tools.tools.patronus_eval_tool.patronus_local_evaluator_tool import ( PatronusLocalEvaluatorTool, +) +from crewai_tools.tools.patronus_eval_tool.patronus_predefined_criteria_eval_tool import ( PatronusPredefinedCriteriaEvalTool, +) +from crewai_tools.tools.pdf_search_tool.pdf_search_tool import PDFSearchTool +from crewai_tools.tools.qdrant_vector_search_tool.qdrant_search_tool import ( QdrantVectorSearchTool, - RagTool, +) +from crewai_tools.tools.rag.rag_tool import RagTool +from crewai_tools.tools.scrape_element_from_website.scrape_element_from_website import ( ScrapeElementFromWebsiteTool, +) +from crewai_tools.tools.scrape_website_tool.scrape_website_tool import ( ScrapeWebsiteTool, +) +from crewai_tools.tools.scrapegraph_scrape_tool.scrapegraph_scrape_tool import ( ScrapegraphScrapeTool, ScrapegraphScrapeToolSchema, +) +from crewai_tools.tools.scrapfly_scrape_website_tool.scrapfly_scrape_website_tool import ( ScrapflyScrapeWebsiteTool, +) +from crewai_tools.tools.selenium_scraping_tool.selenium_scraping_tool import ( SeleniumScrapingTool, +) +from crewai_tools.tools.serpapi_tool.serpapi_google_search_tool import ( SerpApiGoogleSearchTool, +) +from crewai_tools.tools.serpapi_tool.serpapi_google_shopping_tool import ( SerpApiGoogleShoppingTool, - SerperDevTool, +) +from crewai_tools.tools.serper_dev_tool.serper_dev_tool import SerperDevTool +from crewai_tools.tools.serper_scrape_website_tool.serper_scrape_website_tool import ( SerperScrapeWebsiteTool, +) +from crewai_tools.tools.serply_api_tool.serply_job_search_tool import ( SerplyJobSearchTool, +) +from crewai_tools.tools.serply_api_tool.serply_news_search_tool import ( SerplyNewsSearchTool, +) +from crewai_tools.tools.serply_api_tool.serply_scholar_search_tool import ( SerplyScholarSearchTool, +) +from crewai_tools.tools.serply_api_tool.serply_web_search_tool import ( SerplyWebSearchTool, +) +from crewai_tools.tools.serply_api_tool.serply_webpage_to_markdown_tool import ( SerplyWebpageToMarkdownTool, +) +from crewai_tools.tools.singlestore_search_tool.singlestore_search_tool import ( SingleStoreSearchTool, +) +from crewai_tools.tools.snowflake_search_tool.snowflake_search_tool import ( SnowflakeConfig, SnowflakeSearchTool, - SpiderTool, - StagehandTool, - TXTSearchTool, - TavilyExtractorTool, - TavilySearchTool, - VisionTool, - WeaviateVectorSearchTool, - WebsiteSearchTool, - XMLSearchTool, - YoutubeChannelSearchTool, - YoutubeVideoSearchTool, - ZapierActionTools, ) +from crewai_tools.tools.spider_tool.spider_tool import SpiderTool +from crewai_tools.tools.stagehand_tool.stagehand_tool import StagehandTool +from crewai_tools.tools.tavily_extractor_tool.tavily_extractor_tool import ( + TavilyExtractorTool, +) +from crewai_tools.tools.tavily_search_tool.tavily_search_tool import TavilySearchTool +from crewai_tools.tools.txt_search_tool.txt_search_tool import TXTSearchTool +from crewai_tools.tools.vision_tool.vision_tool import VisionTool +from crewai_tools.tools.weaviate_tool.vector_search import WeaviateVectorSearchTool +from crewai_tools.tools.website_search.website_search_tool import WebsiteSearchTool +from crewai_tools.tools.xml_search_tool.xml_search_tool import XMLSearchTool +from crewai_tools.tools.youtube_channel_search_tool.youtube_channel_search_tool import ( + YoutubeChannelSearchTool, +) +from crewai_tools.tools.youtube_video_search_tool.youtube_video_search_tool import ( + YoutubeVideoSearchTool, +) +from crewai_tools.tools.zapier_action_tool.zapier_action_tool import ZapierActionTools +__all__ = [ + "AIMindTool", + "ApifyActorsTool", + "ArxivPaperTool", + "BedrockInvokeAgentTool", + "BedrockKBRetrieverTool", + "BraveSearchTool", + "BrightDataDatasetTool", + "BrightDataSearchTool", + "BrightDataWebUnlockerTool", + "BrowserbaseLoadTool", + "CSVSearchTool", + "CodeDocsSearchTool", + "CodeInterpreterTool", + "ComposioTool", + "ContextualAICreateAgentTool", + "ContextualAIParseTool", + "ContextualAIQueryTool", + "ContextualAIRerankTool", + "CouchbaseFTSVectorSearchTool", + "CrewaiEnterpriseTools", + "CrewaiPlatformTools", + "DOCXSearchTool", + "DallETool", + "DatabricksQueryTool", + "DirectoryReadTool", + "DirectorySearchTool", + "EXASearchTool", + "EnterpriseActionTool", + "FileCompressorTool", + "FileReadTool", + "FileWriterTool", + "FirecrawlCrawlWebsiteTool", + "FirecrawlScrapeWebsiteTool", + "FirecrawlSearchTool", + "GenerateCrewaiAutomationTool", + "GithubSearchTool", + "HyperbrowserLoadTool", + "InvokeCrewAIAutomationTool", + "JSONSearchTool", + "JinaScrapeWebsiteTool", + "LinkupSearchTool", + "LlamaIndexTool", + "MCPServerAdapter", + "MDXSearchTool", + "MongoDBVectorSearchConfig", + "MongoDBVectorSearchTool", + "MultiOnTool", + "MySQLSearchTool", + "NL2SQLTool", + "OCRTool", + "OxylabsAmazonProductScraperTool", + "OxylabsAmazonSearchScraperTool", + "OxylabsGoogleSearchScraperTool", + "OxylabsUniversalScraperTool", + "PDFSearchTool", + "ParallelSearchTool", + "PatronusEvalTool", + "PatronusLocalEvaluatorTool", + "PatronusPredefinedCriteriaEvalTool", + "QdrantVectorSearchTool", + "RagTool", + "S3ReaderTool", + "S3WriterTool", + "ScrapeElementFromWebsiteTool", + "ScrapeWebsiteTool", + "ScrapegraphScrapeTool", + "ScrapegraphScrapeToolSchema", + "ScrapflyScrapeWebsiteTool", + "SeleniumScrapingTool", + "SerpApiGoogleSearchTool", + "SerpApiGoogleShoppingTool", + "SerperDevTool", + "SerperScrapeWebsiteTool", + "SerplyJobSearchTool", + "SerplyNewsSearchTool", + "SerplyScholarSearchTool", + "SerplyWebSearchTool", + "SerplyWebpageToMarkdownTool", + "SingleStoreSearchTool", + "SnowflakeConfig", + "SnowflakeSearchTool", + "SpiderTool", + "StagehandTool", + "TXTSearchTool", + "TavilyExtractorTool", + "TavilySearchTool", + "VisionTool", + "WeaviateVectorSearchTool", + "WebsiteSearchTool", + "XMLSearchTool", + "YoutubeChannelSearchTool", + "YoutubeVideoSearchTool", + "ZapierActionTool", + "ZapierActionTools", +] + __version__ = "1.0.0a1" diff --git a/lib/crewai-tools/src/crewai_tools/adapters/__init__.py b/lib/crewai-tools/src/crewai_tools/adapters/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/lib/crewai-tools/src/crewai_tools/adapters/crewai_rag_adapter.py b/lib/crewai-tools/src/crewai_tools/adapters/crewai_rag_adapter.py index 8da512989..1e719ed37 100644 --- a/lib/crewai-tools/src/crewai_tools/adapters/crewai_rag_adapter.py +++ b/lib/crewai-tools/src/crewai_tools/adapters/crewai_rag_adapter.py @@ -9,11 +9,12 @@ from crewai.rag.config.utils import get_rag_client from crewai.rag.core.base_client import BaseClient from crewai.rag.factory import create_client from crewai.rag.types import BaseRecord, SearchResult +from pydantic import PrivateAttr +from typing_extensions import Unpack + from crewai_tools.rag.data_types import DataType from crewai_tools.rag.misc import sanitize_metadata_for_chromadb from crewai_tools.tools.rag.rag_tool import Adapter -from pydantic import PrivateAttr -from typing_extensions import Unpack ContentItem: TypeAlias = str | Path | dict[str, Any] @@ -213,7 +214,7 @@ class CrewAIRagAdapter(Adapter): ), } ) - except Exception: + except Exception: # noqa: S112 # Silently skip files that can't be processed continue else: diff --git a/lib/crewai-tools/src/crewai_tools/adapters/enterprise_adapter.py b/lib/crewai-tools/src/crewai_tools/adapters/enterprise_adapter.py index 509b135e9..fd89a007e 100644 --- a/lib/crewai-tools/src/crewai_tools/adapters/enterprise_adapter.py +++ b/lib/crewai-tools/src/crewai_tools/adapters/enterprise_adapter.py @@ -1,7 +1,7 @@ import json import os import re -from typing import Any, Dict, List, Literal, Optional, Type, Union, cast, get_origin +from typing import Any, Literal, Optional, Union, cast, get_origin import warnings from crewai.tools import BaseTool @@ -25,7 +25,7 @@ class EnterpriseActionTool(BaseTool): default="", description="The enterprise action token" ) action_name: str = Field(default="", description="The name of the action") - action_schema: Dict[str, Any] = Field( + action_schema: dict[str, Any] = Field( default={}, description="The schema of the action" ) enterprise_api_base_url: str = Field( @@ -38,8 +38,8 @@ class EnterpriseActionTool(BaseTool): description: str, enterprise_action_token: str, action_name: str, - action_schema: Dict[str, Any], - enterprise_api_base_url: Optional[str] = None, + action_schema: dict[str, Any], + enterprise_api_base_url: str | None = None, ): self._model_registry = {} self._base_name = self._sanitize_name(name) @@ -56,8 +56,7 @@ class EnterpriseActionTool(BaseTool): field_type = self._process_schema_type( param_details, self._sanitize_name(param_name).title() ) - except Exception as e: - print(f"Warning: Could not process schema for {param_name}: {e}") + except Exception: field_type = str # Create field definition based on requirement @@ -71,8 +70,7 @@ class EnterpriseActionTool(BaseTool): args_schema = create_model( f"{self._base_name}Schema", **field_definitions ) - except Exception as e: - print(f"Warning: Could not create main schema model: {e}") + except Exception: args_schema = create_model( f"{self._base_name}Schema", input_text=(str, Field(description="Input for the action")), @@ -99,8 +97,8 @@ class EnterpriseActionTool(BaseTool): return "".join(word.capitalize() for word in parts if word) def _extract_schema_info( - self, action_schema: Dict[str, Any] - ) -> tuple[Dict[str, Any], List[str]]: + self, action_schema: dict[str, Any] + ) -> tuple[dict[str, Any], list[str]]: """Extract schema properties and required fields from action schema.""" schema_props = ( action_schema.get("function", {}) @@ -112,7 +110,7 @@ class EnterpriseActionTool(BaseTool): ) return schema_props, required - def _process_schema_type(self, schema: Dict[str, Any], type_name: str) -> Type[Any]: + def _process_schema_type(self, schema: dict[str, Any], type_name: str) -> type[Any]: """Process a JSON schema and return appropriate Python type.""" if "anyOf" in schema: any_of_types = schema["anyOf"] @@ -121,8 +119,8 @@ class EnterpriseActionTool(BaseTool): if non_null_types: base_type = self._process_schema_type(non_null_types[0], type_name) - return Optional[base_type] if is_nullable else base_type - return cast(Type[Any], Optional[str]) + return Optional[base_type] if is_nullable else base_type # noqa: UP045 + return cast(type[Any], Optional[str]) # noqa: UP045 if "oneOf" in schema: return self._process_schema_type(schema["oneOf"][0], type_name) @@ -141,7 +139,7 @@ class EnterpriseActionTool(BaseTool): if json_type == "array": items_schema = schema.get("items", {"type": "string"}) item_type = self._process_schema_type(items_schema, f"{type_name}Item") - return List[item_type] + return list[item_type] if json_type == "object": return self._create_nested_model(schema, type_name) @@ -149,8 +147,8 @@ class EnterpriseActionTool(BaseTool): return self._map_json_type_to_python(json_type) def _create_nested_model( - self, schema: Dict[str, Any], model_name: str - ) -> Type[Any]: + self, schema: dict[str, Any], model_name: str + ) -> type[Any]: """Create a nested Pydantic model for complex objects.""" full_model_name = f"{self._base_name}{model_name}" @@ -172,8 +170,7 @@ class EnterpriseActionTool(BaseTool): prop_type = self._process_schema_type( prop_schema, f"{model_name}{self._sanitize_name(prop_name).title()}" ) - except Exception as e: - print(f"Warning: Could not process schema for {prop_name}: {e}") + except Exception: prop_type = str field_definitions[prop_name] = self._create_field_definition( @@ -184,12 +181,11 @@ class EnterpriseActionTool(BaseTool): nested_model = create_model(full_model_name, **field_definitions) self._model_registry[full_model_name] = nested_model return nested_model - except Exception as e: - print(f"Warning: Could not create nested model {full_model_name}: {e}") + except Exception: return dict def _create_field_definition( - self, field_type: Type[Any], is_required: bool, description: str + self, field_type: type[Any], is_required: bool, description: str ) -> tuple: """Create Pydantic field definition based on type and requirement.""" if is_required: @@ -197,11 +193,11 @@ class EnterpriseActionTool(BaseTool): if get_origin(field_type) is Union: return (field_type, Field(default=None, description=description)) return ( - Optional[field_type], + Optional[field_type], # noqa: UP045 Field(default=None, description=description), ) - def _map_json_type_to_python(self, json_type: str) -> Type[Any]: + def _map_json_type_to_python(self, json_type: str) -> type[Any]: """Map basic JSON schema types to Python types.""" type_mapping = { "string": str, @@ -214,7 +210,7 @@ class EnterpriseActionTool(BaseTool): } return type_mapping.get(json_type, str) - def _get_required_nullable_fields(self) -> List[str]: + def _get_required_nullable_fields(self) -> list[str]: """Get a list of required nullable fields from the action schema.""" schema_props, required = self._extract_schema_info(self.action_schema) @@ -226,7 +222,7 @@ class EnterpriseActionTool(BaseTool): return required_nullable_fields - def _is_nullable_type(self, schema: Dict[str, Any]) -> bool: + def _is_nullable_type(self, schema: dict[str, Any]) -> bool: """Check if a schema represents a nullable type.""" if "anyOf" in schema: return any(t.get("type") == "null" for t in schema["anyOf"]) @@ -238,7 +234,7 @@ class EnterpriseActionTool(BaseTool): cleaned_kwargs = {} for key, value in kwargs.items(): if value is not None: - cleaned_kwargs[key] = value + cleaned_kwargs[key] = value # noqa: PERF403 required_nullable_fields = self._get_required_nullable_fields() @@ -276,7 +272,7 @@ class EnterpriseActionKitToolAdapter: def __init__( self, enterprise_action_token: str, - enterprise_api_base_url: Optional[str] = None, + enterprise_api_base_url: str | None = None, ): """Initialize the adapter with an enterprise action token.""" self._set_enterprise_action_token(enterprise_action_token) @@ -286,7 +282,7 @@ class EnterpriseActionKitToolAdapter: enterprise_api_base_url or get_enterprise_api_base_url() ) - def tools(self) -> List[BaseTool]: + def tools(self) -> list[BaseTool]: """Get the list of tools created from enterprise actions.""" if self._tools is None: self._fetch_actions() @@ -304,13 +300,12 @@ class EnterpriseActionKitToolAdapter: raw_data = response.json() if "actions" not in raw_data: - print(f"Unexpected API response structure: {raw_data}") return parsed_schema = {} action_categories = raw_data["actions"] - for integration_type, action_list in action_categories.items(): + for action_list in action_categories.values(): if isinstance(action_list, list): for action in action_list: action_name = action.get("name") @@ -328,15 +323,14 @@ class EnterpriseActionKitToolAdapter: self._actions_schema = parsed_schema - except Exception as e: - print(f"Error fetching actions: {e}") + except Exception: import traceback traceback.print_exc() def _generate_detailed_description( - self, schema: Dict[str, Any], indent: int = 0 - ) -> List[str]: + self, schema: dict[str, Any], indent: int = 0 + ) -> list[str]: """Generate detailed description for nested schema structures.""" descriptions = [] indent_str = " " * indent @@ -413,7 +407,7 @@ class EnterpriseActionKitToolAdapter: self._tools = tools - def _set_enterprise_action_token(self, enterprise_action_token: Optional[str]): + def _set_enterprise_action_token(self, enterprise_action_token: str | None): if enterprise_action_token and not enterprise_action_token.startswith("PK_"): warnings.warn( "Legacy token detected, please consider using the new Enterprise Action Auth token. Check out our docs for more information https://docs.crewai.com/en/enterprise/features/integrations.", diff --git a/lib/crewai-tools/src/crewai_tools/adapters/lancedb_adapter.py b/lib/crewai-tools/src/crewai_tools/adapters/lancedb_adapter.py index a960e8d8e..ab3a2276c 100644 --- a/lib/crewai-tools/src/crewai_tools/adapters/lancedb_adapter.py +++ b/lib/crewai-tools/src/crewai_tools/adapters/lancedb_adapter.py @@ -1,12 +1,14 @@ +from collections.abc import Callable from pathlib import Path -from typing import Any, Callable +from typing import Any -from crewai_tools.tools.rag.rag_tool import Adapter from lancedb import DBConnection as LanceDBConnection, connect as lancedb_connect from lancedb.table import Table as LanceDBTable from openai import Client as OpenAIClient from pydantic import Field, PrivateAttr +from crewai_tools.tools.rag.rag_tool import Adapter + def _default_embedding_function(): client = OpenAIClient() diff --git a/lib/crewai-tools/src/crewai_tools/adapters/mcp_adapter.py b/lib/crewai-tools/src/crewai_tools/adapters/mcp_adapter.py index c88afe46b..edfb222a3 100644 --- a/lib/crewai-tools/src/crewai_tools/adapters/mcp_adapter.py +++ b/lib/crewai-tools/src/crewai_tools/adapters/mcp_adapter.py @@ -1,17 +1,15 @@ +"""MCPServer for CrewAI.""" + from __future__ import annotations import logging from typing import TYPE_CHECKING, Any from crewai.tools import BaseTool + from crewai_tools.adapters.tool_collection import ToolCollection -""" -MCPServer for CrewAI. - - -""" logger = logging.getLogger(__name__) if TYPE_CHECKING: @@ -77,8 +75,8 @@ class MCPServerAdapter: serverparams: StdioServerParameters | dict[str, Any], *tool_names: str, connect_timeout: int = 30, - ): - """Initialize the MCP Server + ) -> None: + """Initialize the MCP Server. Args: serverparams: The parameters for the MCP server it supports either a @@ -88,7 +86,6 @@ class MCPServerAdapter: connect_timeout: Connection timeout in seconds to the MCP server (default is 30s). """ - super().__init__() self._adapter = None self._tools = None @@ -103,10 +100,10 @@ class MCPServerAdapter: import subprocess try: - subprocess.run(["uv", "add", "mcp crewai-tools[mcp]"], check=True) + subprocess.run(["uv", "add", "mcp crewai-tools[mcp]"], check=True) # noqa: S607 - except subprocess.CalledProcessError: - raise ImportError("Failed to install mcp package") + except subprocess.CalledProcessError as e: + raise ImportError("Failed to install mcp package") from e else: raise ImportError( "`mcp` package not found, please run `uv add crewai-tools[mcp]`" @@ -132,7 +129,7 @@ class MCPServerAdapter: self._tools = self._adapter.__enter__() def stop(self): - """Stop the MCP server""" + """Stop the MCP server.""" self._adapter.__exit__(None, None, None) @property @@ -156,8 +153,7 @@ class MCPServerAdapter: return tools_collection def __enter__(self): - """ - Enter the context manager. Note that `__init__()` already starts the MCP server. + """Enter the context manager. Note that `__init__()` already starts the MCP server. So tools should already be available. """ return self.tools diff --git a/lib/crewai-tools/src/crewai_tools/adapters/rag_adapter.py b/lib/crewai-tools/src/crewai_tools/adapters/rag_adapter.py index 0f7f07d00..871a7defb 100644 --- a/lib/crewai-tools/src/crewai_tools/adapters/rag_adapter.py +++ b/lib/crewai-tools/src/crewai_tools/adapters/rag_adapter.py @@ -1,4 +1,4 @@ -from typing import Any, Optional +from typing import Any from crewai_tools.rag.core import RAG from crewai_tools.tools.rag.rag_tool import Adapter @@ -8,10 +8,10 @@ class RAGAdapter(Adapter): def __init__( self, collection_name: str = "crewai_knowledge_base", - persist_directory: Optional[str] = None, + persist_directory: str | None = None, embedding_model: str = "text-embedding-3-small", top_k: int = 5, - embedding_api_key: Optional[str] = None, + embedding_api_key: str | None = None, **embedding_kwargs, ): super().__init__() diff --git a/lib/crewai-tools/src/crewai_tools/adapters/tool_collection.py b/lib/crewai-tools/src/crewai_tools/adapters/tool_collection.py index 881859807..c3fa51aa2 100644 --- a/lib/crewai-tools/src/crewai_tools/adapters/tool_collection.py +++ b/lib/crewai-tools/src/crewai_tools/adapters/tool_collection.py @@ -1,4 +1,5 @@ -from typing import Callable, Dict, Generic, List, Optional, TypeVar, Union +from collections.abc import Callable +from typing import Generic, TypeVar from crewai.tools import BaseTool @@ -7,8 +8,7 @@ T = TypeVar("T", bound=BaseTool) class ToolCollection(list, Generic[T]): - """ - A collection of tools that can be accessed by index or name + """A collection of tools that can be accessed by index or name. This class extends the built-in list to provide dictionary-like access to tools based on their name property. @@ -21,15 +21,15 @@ class ToolCollection(list, Generic[T]): search_tool = tools["search"] """ - def __init__(self, tools: Optional[List[T]] = None): + def __init__(self, tools: list[T] | None = None): super().__init__(tools or []) - self._name_cache: Dict[str, T] = {} + self._name_cache: dict[str, T] = {} self._build_name_cache() def _build_name_cache(self) -> None: self._name_cache = {tool.name.lower(): tool for tool in self} - def __getitem__(self, key: Union[int, str]) -> T: + def __getitem__(self, key: int | str) -> T: if isinstance(key, str): return self._name_cache[key.lower()] return super().__getitem__(key) @@ -38,7 +38,7 @@ class ToolCollection(list, Generic[T]): super().append(tool) self._name_cache[tool.name.lower()] = tool - def extend(self, tools: List[T]) -> None: + def extend(self, tools: list[T]) -> None: super().extend(tools) self._build_name_cache() @@ -57,7 +57,7 @@ class ToolCollection(list, Generic[T]): del self._name_cache[tool.name.lower()] return tool - def filter_by_names(self, names: Optional[List[str]] = None) -> "ToolCollection[T]": + def filter_by_names(self, names: list[str] | None = None) -> "ToolCollection[T]": if names is None: return self diff --git a/lib/crewai-tools/src/crewai_tools/adapters/zapier_adapter.py b/lib/crewai-tools/src/crewai_tools/adapters/zapier_adapter.py index 8cbf5a927..f0364eb85 100644 --- a/lib/crewai-tools/src/crewai_tools/adapters/zapier_adapter.py +++ b/lib/crewai-tools/src/crewai_tools/adapters/zapier_adapter.py @@ -1,6 +1,5 @@ import logging import os -from typing import List from crewai.tools import BaseTool from pydantic import Field, create_model @@ -13,9 +12,7 @@ logger = logging.getLogger(__name__) class ZapierActionTool(BaseTool): - """ - A tool that wraps a Zapier action - """ + """A tool that wraps a Zapier action.""" name: str = Field(description="Tool name") description: str = Field(description="Tool description") @@ -23,7 +20,7 @@ class ZapierActionTool(BaseTool): api_key: str = Field(description="Zapier API key") def _run(self, **kwargs) -> str: - """Execute the Zapier action""" + """Execute the Zapier action.""" headers = {"x-api-key": self.api_key, "Content-Type": "application/json"} instructions = kwargs.pop( @@ -43,7 +40,11 @@ class ZapierActionTool(BaseTool): execute_url = f"{ACTIONS_URL}/{self.action_id}/execute/" response = requests.request( - "POST", execute_url, headers=headers, json=action_params + "POST", + execute_url, + headers=headers, + json=action_params, + timeout=30, ) response.raise_for_status() @@ -52,13 +53,11 @@ class ZapierActionTool(BaseTool): class ZapierActionsAdapter: - """ - Adapter for Zapier Actions - """ + """Adapter for Zapier Actions.""" api_key: str - def __init__(self, api_key: str = None): + def __init__(self, api_key: str | None = None): self.api_key = api_key or os.getenv("ZAPIER_API_KEY") if not self.api_key: logger.error("Zapier Actions API key is required") @@ -68,14 +67,18 @@ class ZapierActionsAdapter: headers = { "x-api-key": self.api_key, } - response = requests.request("GET", ACTIONS_URL, headers=headers) + response = requests.request( + "GET", + ACTIONS_URL, + headers=headers, + timeout=30, + ) response.raise_for_status() - response_json = response.json() - return response_json + return response.json() - def tools(self) -> List[BaseTool]: - """Convert Zapier actions to BaseTool instances""" + def tools(self) -> list[BaseTool]: + """Convert Zapier actions to BaseTool instances.""" actions_response = self.get_zapier_actions() tools = [] diff --git a/lib/crewai-tools/src/crewai_tools/aws/bedrock/agents/invoke_agent_tool.py b/lib/crewai-tools/src/crewai_tools/aws/bedrock/agents/invoke_agent_tool.py index 6d811de08..d94a918d0 100644 --- a/lib/crewai-tools/src/crewai_tools/aws/bedrock/agents/invoke_agent_tool.py +++ b/lib/crewai-tools/src/crewai_tools/aws/bedrock/agents/invoke_agent_tool.py @@ -2,7 +2,6 @@ from datetime import datetime, timezone import json import os import time -from typing import List, Optional, Type from crewai.tools import BaseTool from dotenv import load_dotenv @@ -24,22 +23,22 @@ class BedrockInvokeAgentToolInput(BaseModel): class BedrockInvokeAgentTool(BaseTool): name: str = "Bedrock Agent Invoke Tool" description: str = "An agent responsible for policy analysis." - args_schema: Type[BaseModel] = BedrockInvokeAgentToolInput + args_schema: type[BaseModel] = BedrockInvokeAgentToolInput agent_id: str = None agent_alias_id: str = None session_id: str = None enable_trace: bool = False end_session: bool = False - package_dependencies: List[str] = ["boto3"] + package_dependencies: list[str] = Field(default_factory=lambda: ["boto3"]) def __init__( self, - agent_id: str = None, - agent_alias_id: str = None, - session_id: str = None, + agent_id: str | None = None, + agent_alias_id: str | None = None, + session_id: str | None = None, enable_trace: bool = False, end_session: bool = False, - description: Optional[str] = None, + description: str | None = None, **kwargs, ): """Initialize the BedrockInvokeAgentTool with agent configuration. @@ -90,14 +89,16 @@ class BedrockInvokeAgentTool(BaseTool): raise BedrockValidationError("session_id must be a string") except BedrockValidationError as e: - raise BedrockValidationError(f"Parameter validation failed: {e!s}") + raise BedrockValidationError(f"Parameter validation failed: {e!s}") from e def _run(self, query: str) -> str: try: import boto3 from botocore.exceptions import ClientError - except ImportError: - raise ImportError("`boto3` package not found, please run `uv add boto3`") + except ImportError as e: + raise ImportError( + "`boto3` package not found, please run `uv add boto3`" + ) from e try: # Initialize the Bedrock Agent Runtime client @@ -175,9 +176,9 @@ Below is the users query or task. Complete it and answer it consicely and to the error_code = e.response["Error"].get("Code", "Unknown") error_message = e.response["Error"].get("Message", str(e)) - raise BedrockAgentError(f"Error ({error_code}): {error_message}") + raise BedrockAgentError(f"Error ({error_code}): {error_message}") from e except BedrockAgentError: # Re-raise BedrockAgentError exceptions raise except Exception as e: - raise BedrockAgentError(f"Unexpected error: {e!s}") + raise BedrockAgentError(f"Unexpected error: {e!s}") from e diff --git a/lib/crewai-tools/src/crewai_tools/aws/bedrock/browser/browser_session_manager.py b/lib/crewai-tools/src/crewai_tools/aws/bedrock/browser/browser_session_manager.py index fffc4c7db..af273a5d0 100644 --- a/lib/crewai-tools/src/crewai_tools/aws/bedrock/browser/browser_session_manager.py +++ b/lib/crewai-tools/src/crewai_tools/aws/bedrock/browser/browser_session_manager.py @@ -1,7 +1,7 @@ from __future__ import annotations import logging -from typing import TYPE_CHECKING, Dict, Tuple +from typing import TYPE_CHECKING if TYPE_CHECKING: @@ -13,8 +13,7 @@ logger = logging.getLogger(__name__) class BrowserSessionManager: - """ - Manages browser sessions for different threads. + """Manages browser sessions for different threads. This class maintains separate browser sessions for different threads, enabling concurrent usage of browsers in multi-threaded environments. @@ -22,19 +21,17 @@ class BrowserSessionManager: """ def __init__(self, region: str = "us-west-2"): - """ - Initialize the browser session manager. + """Initialize the browser session manager. Args: region: AWS region for browser client """ self.region = region - self._async_sessions: Dict[str, Tuple[BrowserClient, AsyncBrowser]] = {} - self._sync_sessions: Dict[str, Tuple[BrowserClient, SyncBrowser]] = {} + self._async_sessions: dict[str, tuple[BrowserClient, AsyncBrowser]] = {} + self._sync_sessions: dict[str, tuple[BrowserClient, SyncBrowser]] = {} async def get_async_browser(self, thread_id: str) -> AsyncBrowser: - """ - Get or create an async browser for the specified thread. + """Get or create an async browser for the specified thread. Args: thread_id: Unique identifier for the thread requesting the browser @@ -48,8 +45,7 @@ class BrowserSessionManager: return await self._create_async_browser_session(thread_id) def get_sync_browser(self, thread_id: str) -> SyncBrowser: - """ - Get or create a sync browser for the specified thread. + """Get or create a sync browser for the specified thread. Args: thread_id: Unique identifier for the thread requesting the browser @@ -63,8 +59,7 @@ class BrowserSessionManager: return self._create_sync_browser_session(thread_id) async def _create_async_browser_session(self, thread_id: str) -> AsyncBrowser: - """ - Create a new async browser session for the specified thread. + """Create a new async browser session for the specified thread. Args: thread_id: Unique identifier for the thread @@ -121,8 +116,7 @@ class BrowserSessionManager: raise def _create_sync_browser_session(self, thread_id: str) -> SyncBrowser: - """ - Create a new sync browser session for the specified thread. + """Create a new sync browser session for the specified thread. Args: thread_id: Unique identifier for the thread @@ -179,8 +173,7 @@ class BrowserSessionManager: raise async def close_async_browser(self, thread_id: str) -> None: - """ - Close the async browser session for the specified thread. + """Close the async browser session for the specified thread. Args: thread_id: Unique identifier for the thread @@ -214,8 +207,7 @@ class BrowserSessionManager: logger.info(f"Async browser session cleaned up for thread {thread_id}") def close_sync_browser(self, thread_id: str) -> None: - """ - Close the sync browser session for the specified thread. + """Close the sync browser session for the specified thread. Args: thread_id: Unique identifier for the thread diff --git a/lib/crewai-tools/src/crewai_tools/aws/bedrock/browser/browser_toolkit.py b/lib/crewai-tools/src/crewai_tools/aws/bedrock/browser/browser_toolkit.py index d2e3e4e5d..5452c390e 100644 --- a/lib/crewai-tools/src/crewai_tools/aws/bedrock/browser/browser_toolkit.py +++ b/lib/crewai-tools/src/crewai_tools/aws/bedrock/browser/browser_toolkit.py @@ -3,7 +3,7 @@ import asyncio import json import logging -from typing import Any, Dict, List, Tuple, Type +from typing import Any from urllib.parse import urlparse from crewai.tools import BaseTool @@ -106,14 +106,12 @@ class BrowserBaseTool(BaseTool): async def get_async_page(self, thread_id: str) -> Any: """Get or create a page for the specified thread.""" browser = await self._session_manager.get_async_browser(thread_id) - page = await aget_current_page(browser) - return page + return await aget_current_page(browser) def get_sync_page(self, thread_id: str) -> Any: """Get or create a page for the specified thread.""" browser = self._session_manager.get_sync_browser(thread_id) - page = get_current_page(browser) - return page + return get_current_page(browser) def _is_in_asyncio_loop(self) -> bool: """Check if we're currently in an asyncio event loop.""" @@ -130,7 +128,7 @@ class NavigateTool(BrowserBaseTool): name: str = "navigate_browser" description: str = "Navigate a browser to the specified URL" - args_schema: Type[BaseModel] = NavigateToolInput + args_schema: type[BaseModel] = NavigateToolInput def _run(self, url: str, thread_id: str = "default", **kwargs) -> str: """Use the sync tool.""" @@ -174,7 +172,7 @@ class ClickTool(BrowserBaseTool): name: str = "click_element" description: str = "Click on an element with the given CSS selector" - args_schema: Type[BaseModel] = ClickToolInput + args_schema: type[BaseModel] = ClickToolInput visible_only: bool = True """Whether to consider only visible elements.""" @@ -244,7 +242,7 @@ class NavigateBackTool(BrowserBaseTool): name: str = "navigate_back" description: str = "Navigate back to the previous page" - args_schema: Type[BaseModel] = NavigateBackToolInput + args_schema: type[BaseModel] = NavigateBackToolInput def _run(self, thread_id: str = "default", **kwargs) -> str: """Use the sync tool.""" @@ -282,7 +280,7 @@ class ExtractTextTool(BrowserBaseTool): name: str = "extract_text" description: str = "Extract all the text on the current webpage" - args_schema: Type[BaseModel] = ExtractTextToolInput + args_schema: type[BaseModel] = ExtractTextToolInput def _run(self, thread_id: str = "default", **kwargs) -> str: """Use the sync tool.""" @@ -334,7 +332,7 @@ class ExtractHyperlinksTool(BrowserBaseTool): name: str = "extract_hyperlinks" description: str = "Extract all hyperlinks on the current webpage" - args_schema: Type[BaseModel] = ExtractHyperlinksToolInput + args_schema: type[BaseModel] = ExtractHyperlinksToolInput def _run(self, thread_id: str = "default", **kwargs) -> str: """Use the sync tool.""" @@ -358,7 +356,7 @@ class ExtractHyperlinksTool(BrowserBaseTool): for link in soup.find_all("a", href=True): text = link.get_text().strip() href = link["href"] - if href.startswith("http") or href.startswith("https"): + if href.startswith(("http", "https")): links.append({"text": text, "url": href}) if not links: @@ -390,7 +388,7 @@ class ExtractHyperlinksTool(BrowserBaseTool): for link in soup.find_all("a", href=True): text = link.get_text().strip() href = link["href"] - if href.startswith("http") or href.startswith("https"): + if href.startswith(("http", "https")): links.append({"text": text, "url": href}) if not links: @@ -406,7 +404,7 @@ class GetElementsTool(BrowserBaseTool): name: str = "get_elements" description: str = "Get elements from the webpage using a CSS selector" - args_schema: Type[BaseModel] = GetElementsToolInput + args_schema: type[BaseModel] = GetElementsToolInput def _run(self, selector: str, thread_id: str = "default", **kwargs) -> str: """Use the sync tool.""" @@ -454,7 +452,7 @@ class CurrentWebPageTool(BrowserBaseTool): name: str = "current_webpage" description: str = "Get information about the current webpage" - args_schema: Type[BaseModel] = CurrentWebPageToolInput + args_schema: type[BaseModel] = CurrentWebPageToolInput def _run(self, thread_id: str = "default", **kwargs) -> str: """Use the sync tool.""" @@ -524,15 +522,14 @@ class BrowserToolkit: """ def __init__(self, region: str = "us-west-2"): - """ - Initialize the toolkit + """Initialize the toolkit. Args: region: AWS region for the browser client """ self.region = region self.session_manager = BrowserSessionManager(region=region) - self.tools: List[BaseTool] = [] + self.tools: list[BaseTool] = [] self._nest_current_loop() self._setup_tools() @@ -562,18 +559,16 @@ class BrowserToolkit: CurrentWebPageTool(session_manager=self.session_manager), ] - def get_tools(self) -> List[BaseTool]: - """ - Get the list of browser tools + def get_tools(self) -> list[BaseTool]: + """Get the list of browser tools. Returns: List of CrewAI tools """ return self.tools - def get_tools_by_name(self) -> Dict[str, BaseTool]: - """ - Get a dictionary of tools mapped by their names + def get_tools_by_name(self) -> dict[str, BaseTool]: + """Get a dictionary of tools mapped by their names. Returns: Dictionary of {tool_name: tool} @@ -581,18 +576,18 @@ class BrowserToolkit: return {tool.name: tool for tool in self.tools} async def cleanup(self) -> None: - """Clean up all browser sessions asynchronously""" + """Clean up all browser sessions asynchronously.""" await self.session_manager.close_all_browsers() logger.info("All browser sessions cleaned up") def sync_cleanup(self) -> None: - """Clean up all browser sessions from synchronous code""" + """Clean up all browser sessions from synchronous code.""" import asyncio try: loop = asyncio.get_event_loop() if loop.is_running(): - asyncio.create_task(self.cleanup()) + asyncio.create_task(self.cleanup()) # noqa: RUF006 else: loop.run_until_complete(self.cleanup()) except RuntimeError: @@ -601,9 +596,8 @@ class BrowserToolkit: def create_browser_toolkit( region: str = "us-west-2", -) -> Tuple[BrowserToolkit, List[BaseTool]]: - """ - Create a BrowserToolkit +) -> tuple[BrowserToolkit, list[BaseTool]]: + """Create a BrowserToolkit. Args: region: AWS region for browser client diff --git a/lib/crewai-tools/src/crewai_tools/aws/bedrock/browser/utils.py b/lib/crewai-tools/src/crewai_tools/aws/bedrock/browser/utils.py index 80fef79ae..14cad3981 100644 --- a/lib/crewai-tools/src/crewai_tools/aws/bedrock/browser/utils.py +++ b/lib/crewai-tools/src/crewai_tools/aws/bedrock/browser/utils.py @@ -1,6 +1,6 @@ from __future__ import annotations -from typing import TYPE_CHECKING, Any, Union +from typing import TYPE_CHECKING, Any if TYPE_CHECKING: @@ -8,11 +8,12 @@ if TYPE_CHECKING: from playwright.sync_api import Browser as SyncBrowser, Page as SyncPage -async def aget_current_page(browser: Union[AsyncBrowser, Any]) -> AsyncPage: - """ - Asynchronously get the current page of the browser. +async def aget_current_page(browser: AsyncBrowser | Any) -> AsyncPage: + """Asynchronously get the current page of the browser. + Args: browser: The browser (AsyncBrowser) to get the current page from. + Returns: AsyncPage: The current page. """ @@ -25,11 +26,12 @@ async def aget_current_page(browser: Union[AsyncBrowser, Any]) -> AsyncPage: return context.pages[-1] -def get_current_page(browser: Union[SyncBrowser, Any]) -> SyncPage: - """ - Get the current page of the browser. +def get_current_page(browser: SyncBrowser | Any) -> SyncPage: + """Get the current page of the browser. + Args: browser: The browser to get the current page from. + Returns: SyncPage: The current page. """ diff --git a/lib/crewai-tools/src/crewai_tools/aws/bedrock/code_interpreter/code_interpreter_toolkit.py b/lib/crewai-tools/src/crewai_tools/aws/bedrock/code_interpreter/code_interpreter_toolkit.py index a3c753dde..240aa6220 100644 --- a/lib/crewai-tools/src/crewai_tools/aws/bedrock/code_interpreter/code_interpreter_toolkit.py +++ b/lib/crewai-tools/src/crewai_tools/aws/bedrock/code_interpreter/code_interpreter_toolkit.py @@ -4,7 +4,7 @@ from __future__ import annotations import json import logging -from typing import TYPE_CHECKING, Any, Dict, List, Optional, Tuple, Type +from typing import TYPE_CHECKING, Any from crewai.tools import BaseTool from pydantic import BaseModel, Field @@ -17,8 +17,7 @@ logger = logging.getLogger(__name__) def extract_output_from_stream(response): - """ - Extract output from code interpreter response stream + """Extract output from code interpreter response stream. Args: response: Response from code interpreter execution @@ -73,7 +72,7 @@ class ExecuteCommandInput(BaseModel): class ReadFilesInput(BaseModel): """Input for ReadFiles.""" - paths: List[str] = Field(description="List of file paths to read") + paths: list[str] = Field(description="List of file paths to read") thread_id: str = Field( default="default", description="Thread ID for the code interpreter session" ) @@ -91,7 +90,7 @@ class ListFilesInput(BaseModel): class DeleteFilesInput(BaseModel): """Input for DeleteFiles.""" - paths: List[str] = Field(description="List of file paths to delete") + paths: list[str] = Field(description="List of file paths to delete") thread_id: str = Field( default="default", description="Thread ID for the code interpreter session" ) @@ -100,7 +99,7 @@ class DeleteFilesInput(BaseModel): class WriteFilesInput(BaseModel): """Input for WriteFiles.""" - files: List[Dict[str, str]] = Field( + files: list[dict[str, str]] = Field( description="List of dictionaries with path and text fields" ) thread_id: str = Field( @@ -141,7 +140,7 @@ class ExecuteCodeTool(BaseTool): name: str = "execute_code" description: str = "Execute code in various languages (primarily Python)" - args_schema: Type[BaseModel] = ExecuteCodeInput + args_schema: type[BaseModel] = ExecuteCodeInput toolkit: Any = Field(default=None, exclude=True) def __init__(self, toolkit): @@ -196,7 +195,7 @@ class ExecuteCommandTool(BaseTool): name: str = "execute_command" description: str = "Run shell commands in the code interpreter environment" - args_schema: Type[BaseModel] = ExecuteCommandInput + args_schema: type[BaseModel] = ExecuteCommandInput toolkit: Any = Field(default=None, exclude=True) def __init__(self, toolkit): @@ -229,14 +228,14 @@ class ReadFilesTool(BaseTool): name: str = "read_files" description: str = "Read content of files in the environment" - args_schema: Type[BaseModel] = ReadFilesInput + args_schema: type[BaseModel] = ReadFilesInput toolkit: Any = Field(default=None, exclude=True) def __init__(self, toolkit): super().__init__() self.toolkit = toolkit - def _run(self, paths: List[str], thread_id: str = "default") -> str: + def _run(self, paths: list[str], thread_id: str = "default") -> str: try: # Get or create code interpreter code_interpreter = self.toolkit._get_or_create_interpreter( @@ -252,7 +251,7 @@ class ReadFilesTool(BaseTool): except Exception as e: return f"Error reading files: {e!s}" - async def _arun(self, paths: List[str], thread_id: str = "default") -> str: + async def _arun(self, paths: list[str], thread_id: str = "default") -> str: # Use _run as we're working with a synchronous API that's thread-safe return self._run(paths=paths, thread_id=thread_id) @@ -262,7 +261,7 @@ class ListFilesTool(BaseTool): name: str = "list_files" description: str = "List files in directories in the environment" - args_schema: Type[BaseModel] = ListFilesInput + args_schema: type[BaseModel] = ListFilesInput toolkit: Any = Field(default=None, exclude=True) def __init__(self, toolkit): @@ -295,14 +294,14 @@ class DeleteFilesTool(BaseTool): name: str = "delete_files" description: str = "Remove files from the environment" - args_schema: Type[BaseModel] = DeleteFilesInput + args_schema: type[BaseModel] = DeleteFilesInput toolkit: Any = Field(default=None, exclude=True) def __init__(self, toolkit): super().__init__() self.toolkit = toolkit - def _run(self, paths: List[str], thread_id: str = "default") -> str: + def _run(self, paths: list[str], thread_id: str = "default") -> str: try: # Get or create code interpreter code_interpreter = self.toolkit._get_or_create_interpreter( @@ -318,7 +317,7 @@ class DeleteFilesTool(BaseTool): except Exception as e: return f"Error deleting files: {e!s}" - async def _arun(self, paths: List[str], thread_id: str = "default") -> str: + async def _arun(self, paths: list[str], thread_id: str = "default") -> str: # Use _run as we're working with a synchronous API that's thread-safe return self._run(paths=paths, thread_id=thread_id) @@ -328,14 +327,14 @@ class WriteFilesTool(BaseTool): name: str = "write_files" description: str = "Create or update files in the environment" - args_schema: Type[BaseModel] = WriteFilesInput + args_schema: type[BaseModel] = WriteFilesInput toolkit: Any = Field(default=None, exclude=True) def __init__(self, toolkit): super().__init__() self.toolkit = toolkit - def _run(self, files: List[Dict[str, str]], thread_id: str = "default") -> str: + def _run(self, files: list[dict[str, str]], thread_id: str = "default") -> str: try: # Get or create code interpreter code_interpreter = self.toolkit._get_or_create_interpreter( @@ -352,7 +351,7 @@ class WriteFilesTool(BaseTool): return f"Error writing files: {e!s}" async def _arun( - self, files: List[Dict[str, str]], thread_id: str = "default" + self, files: list[dict[str, str]], thread_id: str = "default" ) -> str: # Use _run as we're working with a synchronous API that's thread-safe return self._run(files=files, thread_id=thread_id) @@ -363,7 +362,7 @@ class StartCommandTool(BaseTool): name: str = "start_command_execution" description: str = "Start long-running commands asynchronously" - args_schema: Type[BaseModel] = StartCommandInput + args_schema: type[BaseModel] = StartCommandInput toolkit: Any = Field(default=None, exclude=True) def __init__(self, toolkit): @@ -396,7 +395,7 @@ class GetTaskTool(BaseTool): name: str = "get_task" description: str = "Check status of async tasks" - args_schema: Type[BaseModel] = GetTaskInput + args_schema: type[BaseModel] = GetTaskInput toolkit: Any = Field(default=None, exclude=True) def __init__(self, toolkit): @@ -429,7 +428,7 @@ class StopTaskTool(BaseTool): name: str = "stop_task" description: str = "Stop running tasks" - args_schema: Type[BaseModel] = StopTaskInput + args_schema: type[BaseModel] = StopTaskInput toolkit: Any = Field(default=None, exclude=True) def __init__(self, toolkit): @@ -511,15 +510,14 @@ class CodeInterpreterToolkit: """ def __init__(self, region: str = "us-west-2"): - """ - Initialize the toolkit + """Initialize the toolkit. Args: region: AWS region for the code interpreter """ self.region = region - self._code_interpreters: Dict[str, CodeInterpreter] = {} - self.tools: List[BaseTool] = [] + self._code_interpreters: dict[str, CodeInterpreter] = {} + self.tools: list[BaseTool] = [] self._setup_tools() def _setup_tools(self) -> None: @@ -561,26 +559,24 @@ class CodeInterpreterToolkit: self._code_interpreters[thread_id] = code_interpreter return code_interpreter - def get_tools(self) -> List[BaseTool]: - """ - Get the list of code interpreter tools + def get_tools(self) -> list[BaseTool]: + """Get the list of code interpreter tools. Returns: List of CrewAI tools """ return self.tools - def get_tools_by_name(self) -> Dict[str, BaseTool]: - """ - Get a dictionary of tools mapped by their names + def get_tools_by_name(self) -> dict[str, BaseTool]: + """Get a dictionary of tools mapped by their names. Returns: Dictionary of {tool_name: tool} """ return {tool.name: tool for tool in self.tools} - async def cleanup(self, thread_id: Optional[str] = None) -> None: - """Clean up resources + async def cleanup(self, thread_id: str | None = None) -> None: + """Clean up resources. Args: thread_id: Optional thread ID to clean up. If None, cleans up all sessions. @@ -604,7 +600,7 @@ class CodeInterpreterToolkit: for tid in thread_ids: try: self._code_interpreters[tid].stop() - except Exception as e: + except Exception as e: # noqa: PERF203 logger.warning( f"Error stopping code interpreter for thread {tid}: {e}" ) @@ -615,9 +611,8 @@ class CodeInterpreterToolkit: def create_code_interpreter_toolkit( region: str = "us-west-2", -) -> Tuple[CodeInterpreterToolkit, List[BaseTool]]: - """ - Create a CodeInterpreterToolkit +) -> tuple[CodeInterpreterToolkit, list[BaseTool]]: + """Create a CodeInterpreterToolkit. Args: region: AWS region for code interpreter diff --git a/lib/crewai-tools/src/crewai_tools/aws/bedrock/knowledge_base/retriever_tool.py b/lib/crewai-tools/src/crewai_tools/aws/bedrock/knowledge_base/retriever_tool.py index 12e945bc3..e13e379e3 100644 --- a/lib/crewai-tools/src/crewai_tools/aws/bedrock/knowledge_base/retriever_tool.py +++ b/lib/crewai-tools/src/crewai_tools/aws/bedrock/knowledge_base/retriever_tool.py @@ -1,6 +1,6 @@ import json import os -from typing import Any, Dict, List, Optional, Type +from typing import Any from crewai.tools import BaseTool from dotenv import load_dotenv @@ -26,21 +26,21 @@ class BedrockKBRetrieverTool(BaseTool): description: str = ( "Retrieves information from an Amazon Bedrock Knowledge Base given a query" ) - args_schema: Type[BaseModel] = BedrockKBRetrieverToolInput + args_schema: type[BaseModel] = BedrockKBRetrieverToolInput knowledge_base_id: str = None - number_of_results: Optional[int] = 5 - retrieval_configuration: Optional[Dict[str, Any]] = None - guardrail_configuration: Optional[Dict[str, Any]] = None - next_token: Optional[str] = None - package_dependencies: List[str] = ["boto3"] + number_of_results: int | None = 5 + retrieval_configuration: dict[str, Any] | None = None + guardrail_configuration: dict[str, Any] | None = None + next_token: str | None = None + package_dependencies: list[str] = Field(default_factory=lambda: ["boto3"]) def __init__( self, - knowledge_base_id: str = None, - number_of_results: Optional[int] = 5, - retrieval_configuration: Optional[Dict[str, Any]] = None, - guardrail_configuration: Optional[Dict[str, Any]] = None, - next_token: Optional[str] = None, + knowledge_base_id: str | None = None, + number_of_results: int | None = 5, + retrieval_configuration: dict[str, Any] | None = None, + guardrail_configuration: dict[str, Any] | None = None, + next_token: str | None = None, **kwargs, ): """Initialize the BedrockKBRetrieverTool with knowledge base configuration. @@ -72,7 +72,7 @@ class BedrockKBRetrieverTool(BaseTool): # Update the description to include the knowledge base details self.description = f"Retrieves information from Amazon Bedrock Knowledge Base '{self.knowledge_base_id}' given a query" - def _build_retrieval_configuration(self) -> Dict[str, Any]: + def _build_retrieval_configuration(self) -> dict[str, Any]: """Build the retrieval configuration based on provided parameters. Returns: @@ -124,9 +124,9 @@ class BedrockKBRetrieverTool(BaseTool): ) except BedrockValidationError as e: - raise BedrockValidationError(f"Parameter validation failed: {e!s}") + raise BedrockValidationError(f"Parameter validation failed: {e!s}") from e - def _process_retrieval_result(self, result: Dict[str, Any]) -> Dict[str, Any]: + def _process_retrieval_result(self, result: dict[str, Any]) -> dict[str, Any]: """Process a single retrieval result from Bedrock Knowledge Base. Args: @@ -194,8 +194,10 @@ class BedrockKBRetrieverTool(BaseTool): try: import boto3 from botocore.exceptions import ClientError - except ImportError: - raise ImportError("`boto3` package not found, please run `uv add boto3`") + except ImportError as e: + raise ImportError( + "`boto3` package not found, please run `uv add boto3`" + ) from e try: # Initialize the Bedrock Agent Runtime client @@ -257,6 +259,8 @@ class BedrockKBRetrieverTool(BaseTool): error_code = e.response["Error"].get("Code", "Unknown") error_message = e.response["Error"].get("Message", str(e)) - raise BedrockKnowledgeBaseError(f"Error ({error_code}): {error_message}") + raise BedrockKnowledgeBaseError( + f"Error ({error_code}): {error_message}" + ) from e except Exception as e: - raise BedrockKnowledgeBaseError(f"Unexpected error: {e!s}") + raise BedrockKnowledgeBaseError(f"Unexpected error: {e!s}") from e diff --git a/lib/crewai-tools/src/crewai_tools/aws/s3/reader_tool.py b/lib/crewai-tools/src/crewai_tools/aws/s3/reader_tool.py index d26d4a43c..30203a434 100644 --- a/lib/crewai-tools/src/crewai_tools/aws/s3/reader_tool.py +++ b/lib/crewai-tools/src/crewai_tools/aws/s3/reader_tool.py @@ -1,5 +1,4 @@ import os -from typing import List, Type from crewai.tools import BaseTool from pydantic import BaseModel, Field @@ -16,15 +15,17 @@ class S3ReaderToolInput(BaseModel): class S3ReaderTool(BaseTool): name: str = "S3 Reader Tool" description: str = "Reads a file from Amazon S3 given an S3 file path" - args_schema: Type[BaseModel] = S3ReaderToolInput - package_dependencies: List[str] = ["boto3"] + args_schema: type[BaseModel] = S3ReaderToolInput + package_dependencies: list[str] = Field(default_factory=lambda: ["boto3"]) def _run(self, file_path: str) -> str: try: import boto3 from botocore.exceptions import ClientError - except ImportError: - raise ImportError("`boto3` package not found, please run `uv add boto3`") + except ImportError as e: + raise ImportError( + "`boto3` package not found, please run `uv add boto3`" + ) from e try: bucket_name, object_key = self._parse_s3_path(file_path) @@ -38,9 +39,8 @@ class S3ReaderTool(BaseTool): # Read file content from S3 response = s3.get_object(Bucket=bucket_name, Key=object_key) - file_content = response["Body"].read().decode("utf-8") + return response["Body"].read().decode("utf-8") - return file_content except ClientError as e: return f"Error reading file from S3: {e!s}" diff --git a/lib/crewai-tools/src/crewai_tools/aws/s3/writer_tool.py b/lib/crewai-tools/src/crewai_tools/aws/s3/writer_tool.py index b00e0c698..87f211dbc 100644 --- a/lib/crewai-tools/src/crewai_tools/aws/s3/writer_tool.py +++ b/lib/crewai-tools/src/crewai_tools/aws/s3/writer_tool.py @@ -1,5 +1,4 @@ import os -from typing import List, Type from crewai.tools import BaseTool from pydantic import BaseModel, Field @@ -17,15 +16,17 @@ class S3WriterToolInput(BaseModel): class S3WriterTool(BaseTool): name: str = "S3 Writer Tool" description: str = "Writes content to a file in Amazon S3 given an S3 file path" - args_schema: Type[BaseModel] = S3WriterToolInput - package_dependencies: List[str] = ["boto3"] + args_schema: type[BaseModel] = S3WriterToolInput + package_dependencies: list[str] = Field(default_factory=lambda: ["boto3"]) def _run(self, file_path: str, content: str) -> str: try: import boto3 from botocore.exceptions import ClientError - except ImportError: - raise ImportError("`boto3` package not found, please run `uv add boto3`") + except ImportError as e: + raise ImportError( + "`boto3` package not found, please run `uv add boto3`" + ) from e try: bucket_name, object_key = self._parse_s3_path(file_path) diff --git a/lib/crewai-tools/src/crewai_tools/printer.py b/lib/crewai-tools/src/crewai_tools/printer.py index d0897e472..d50a794fb 100644 --- a/lib/crewai-tools/src/crewai_tools/printer.py +++ b/lib/crewai-tools/src/crewai_tools/printer.py @@ -1,13 +1,11 @@ """Utility for colored console output.""" -from typing import Optional - class Printer: """Handles colored console output formatting.""" @staticmethod - def print(content: str, color: Optional[str] = None) -> None: + def print(content: str, color: str | None = None) -> None: """Prints content with optional color formatting. Args: @@ -20,7 +18,7 @@ class Printer: if hasattr(Printer, f"_print_{color}"): getattr(Printer, f"_print_{color}")(content) else: - print(content) + print(content) # noqa: T201 @staticmethod def _print_bold_purple(content: str) -> None: @@ -29,7 +27,7 @@ class Printer: Args: content: The string to be printed in bold purple. """ - print(f"\033[1m\033[95m {content}\033[00m") + print(f"\033[1m\033[95m {content}\033[00m") # noqa: T201 @staticmethod def _print_bold_green(content: str) -> None: @@ -38,7 +36,7 @@ class Printer: Args: content: The string to be printed in bold green. """ - print(f"\033[1m\033[92m {content}\033[00m") + print(f"\033[1m\033[92m {content}\033[00m") # noqa: T201 @staticmethod def _print_purple(content: str) -> None: @@ -47,7 +45,7 @@ class Printer: Args: content: The string to be printed in purple. """ - print(f"\033[95m {content}\033[00m") + print(f"\033[95m {content}\033[00m") # noqa: T201 @staticmethod def _print_red(content: str) -> None: @@ -56,7 +54,7 @@ class Printer: Args: content: The string to be printed in red. """ - print(f"\033[91m {content}\033[00m") + print(f"\033[91m {content}\033[00m") # noqa: T201 @staticmethod def _print_bold_blue(content: str) -> None: @@ -65,7 +63,7 @@ class Printer: Args: content: The string to be printed in bold blue. """ - print(f"\033[1m\033[94m {content}\033[00m") + print(f"\033[1m\033[94m {content}\033[00m") # noqa: T201 @staticmethod def _print_yellow(content: str) -> None: @@ -74,7 +72,7 @@ class Printer: Args: content: The string to be printed in yellow. """ - print(f"\033[93m {content}\033[00m") + print(f"\033[93m {content}\033[00m") # noqa: T201 @staticmethod def _print_bold_yellow(content: str) -> None: @@ -83,7 +81,7 @@ class Printer: Args: content: The string to be printed in bold yellow. """ - print(f"\033[1m\033[93m {content}\033[00m") + print(f"\033[1m\033[93m {content}\033[00m") # noqa: T201 @staticmethod def _print_cyan(content: str) -> None: @@ -92,7 +90,7 @@ class Printer: Args: content: The string to be printed in cyan. """ - print(f"\033[96m {content}\033[00m") + print(f"\033[96m {content}\033[00m") # noqa: T201 @staticmethod def _print_bold_cyan(content: str) -> None: @@ -101,7 +99,7 @@ class Printer: Args: content: The string to be printed in bold cyan. """ - print(f"\033[1m\033[96m {content}\033[00m") + print(f"\033[1m\033[96m {content}\033[00m") # noqa: T201 @staticmethod def _print_magenta(content: str) -> None: @@ -110,7 +108,7 @@ class Printer: Args: content: The string to be printed in magenta. """ - print(f"\033[35m {content}\033[00m") + print(f"\033[35m {content}\033[00m") # noqa: T201 @staticmethod def _print_bold_magenta(content: str) -> None: @@ -119,7 +117,7 @@ class Printer: Args: content: The string to be printed in bold magenta. """ - print(f"\033[1m\033[35m {content}\033[00m") + print(f"\033[1m\033[35m {content}\033[00m") # noqa: T201 @staticmethod def _print_green(content: str) -> None: @@ -128,4 +126,4 @@ class Printer: Args: content: The string to be printed in green. """ - print(f"\033[32m {content}\033[00m") + print(f"\033[32m {content}\033[00m") # noqa: T201 diff --git a/lib/crewai-tools/src/crewai_tools/rag/base_loader.py b/lib/crewai-tools/src/crewai_tools/rag/base_loader.py index 2145aba0d..9b7732cd6 100644 --- a/lib/crewai-tools/src/crewai_tools/rag/base_loader.py +++ b/lib/crewai-tools/src/crewai_tools/rag/base_loader.py @@ -1,5 +1,5 @@ from abc import ABC, abstractmethod -from typing import Any, Dict, Optional +from typing import Any from pydantic import BaseModel, Field @@ -10,14 +10,14 @@ from crewai_tools.rag.source_content import SourceContent class LoaderResult(BaseModel): content: str = Field(description="The text content of the source") source: str = Field(description="The source of the content", default="unknown") - metadata: Dict[str, Any] = Field( + metadata: dict[str, Any] = Field( description="The metadata of the source", default_factory=dict ) doc_id: str = Field(description="The id of the document") class BaseLoader(ABC): - def __init__(self, config: Optional[Dict[str, Any]] = None): + def __init__(self, config: dict[str, Any] | None = None): self.config = config or {} @abstractmethod @@ -26,15 +26,13 @@ class BaseLoader(ABC): def generate_doc_id( self, source_ref: str | None = None, content: str | None = None ) -> str: - """ - Generate a unique document id based on the source reference and content. + """Generate a unique document id based on the source reference and content. If the source reference is not provided, the content is used as the source reference. If the content is not provided, the source reference is used as the content. If both are provided, the source reference is used as the content. Both are optional because the TEXT content type does not have a source reference. In this case, the content is used as the source reference. """ - source_ref = source_ref or "" content = content or "" diff --git a/lib/crewai-tools/src/crewai_tools/rag/chunkers/base_chunker.py b/lib/crewai-tools/src/crewai_tools/rag/chunkers/base_chunker.py index 831f071f6..38d24b465 100644 --- a/lib/crewai-tools/src/crewai_tools/rag/chunkers/base_chunker.py +++ b/lib/crewai-tools/src/crewai_tools/rag/chunkers/base_chunker.py @@ -1,21 +1,17 @@ import re -from typing import List, Optional class RecursiveCharacterTextSplitter: - """ - A text splitter that recursively splits text based on a hierarchy of separators. - """ + """A text splitter that recursively splits text based on a hierarchy of separators.""" def __init__( self, chunk_size: int = 4000, chunk_overlap: int = 200, - separators: Optional[List[str]] = None, + separators: list[str] | None = None, keep_separator: bool = True, ): - """ - Initialize the RecursiveCharacterTextSplitter. + """Initialize the RecursiveCharacterTextSplitter. Args: chunk_size: Maximum size of each chunk @@ -39,10 +35,10 @@ class RecursiveCharacterTextSplitter: "", ] - def split_text(self, text: str) -> List[str]: + def split_text(self, text: str) -> list[str]: return self._split_text(text, self._separators) - def _split_text(self, text: str, separators: List[str]) -> List[str]: + def _split_text(self, text: str, separators: list[str]) -> list[str]: separator = separators[-1] new_separators = [] @@ -71,7 +67,7 @@ class RecursiveCharacterTextSplitter: return self._merge_splits(good_splits, separator) - def _split_text_with_separator(self, text: str, separator: str) -> List[str]: + def _split_text_with_separator(self, text: str, separator: str) -> list[str]: if separator == "": return list(text) @@ -95,13 +91,13 @@ class RecursiveCharacterTextSplitter: return [s for s in splits if s] return text.split(separator) - def _split_by_characters(self, text: str) -> List[str]: + def _split_by_characters(self, text: str) -> list[str]: chunks = [] for i in range(0, len(text), self._chunk_size): - chunks.append(text[i : i + self._chunk_size]) + chunks.append(text[i : i + self._chunk_size]) # noqa: PERF401 return chunks - def _merge_splits(self, splits: List[str], separator: str) -> List[str]: + def _merge_splits(self, splits: list[str], separator: str) -> list[str]: """Merge splits into chunks with proper overlap.""" docs = [] current_doc = [] @@ -154,11 +150,10 @@ class BaseChunker: self, chunk_size: int = 1000, chunk_overlap: int = 200, - separators: Optional[List[str]] = None, + separators: list[str] | None = None, keep_separator: bool = True, ): - """ - Initialize the Chunker + """Initialize the Chunker. Args: chunk_size: Maximum size of each chunk @@ -166,7 +161,6 @@ class BaseChunker: separators: List of separators to use for splitting keep_separator: Whether to keep separators in the chunks """ - self._splitter = RecursiveCharacterTextSplitter( chunk_size=chunk_size, chunk_overlap=chunk_overlap, @@ -174,7 +168,7 @@ class BaseChunker: keep_separator=keep_separator, ) - def chunk(self, text: str) -> List[str]: + def chunk(self, text: str) -> list[str]: if not text or not text.strip(): return [] diff --git a/lib/crewai-tools/src/crewai_tools/rag/chunkers/default_chunker.py b/lib/crewai-tools/src/crewai_tools/rag/chunkers/default_chunker.py index 55913ce11..7073161b2 100644 --- a/lib/crewai-tools/src/crewai_tools/rag/chunkers/default_chunker.py +++ b/lib/crewai-tools/src/crewai_tools/rag/chunkers/default_chunker.py @@ -1,5 +1,3 @@ -from typing import List, Optional - from crewai_tools.rag.chunkers.base_chunker import BaseChunker @@ -8,7 +6,7 @@ class DefaultChunker(BaseChunker): self, chunk_size: int = 2000, chunk_overlap: int = 20, - separators: Optional[List[str]] = None, + separators: list[str] | None = None, keep_separator: bool = True, ): super().__init__(chunk_size, chunk_overlap, separators, keep_separator) diff --git a/lib/crewai-tools/src/crewai_tools/rag/chunkers/structured_chunker.py b/lib/crewai-tools/src/crewai_tools/rag/chunkers/structured_chunker.py index fa50a6a11..4fb4a36df 100644 --- a/lib/crewai-tools/src/crewai_tools/rag/chunkers/structured_chunker.py +++ b/lib/crewai-tools/src/crewai_tools/rag/chunkers/structured_chunker.py @@ -1,5 +1,3 @@ -from typing import List, Optional - from crewai_tools.rag.chunkers.base_chunker import BaseChunker @@ -8,7 +6,7 @@ class CsvChunker(BaseChunker): self, chunk_size: int = 1200, chunk_overlap: int = 100, - separators: Optional[List[str]] = None, + separators: list[str] | None = None, keep_separator: bool = True, ): if separators is None: @@ -28,7 +26,7 @@ class JsonChunker(BaseChunker): self, chunk_size: int = 2000, chunk_overlap: int = 200, - separators: Optional[List[str]] = None, + separators: list[str] | None = None, keep_separator: bool = True, ): if separators is None: @@ -50,7 +48,7 @@ class XmlChunker(BaseChunker): self, chunk_size: int = 2500, chunk_overlap: int = 250, - separators: Optional[List[str]] = None, + separators: list[str] | None = None, keep_separator: bool = True, ): if separators is None: diff --git a/lib/crewai-tools/src/crewai_tools/rag/chunkers/text_chunker.py b/lib/crewai-tools/src/crewai_tools/rag/chunkers/text_chunker.py index 354b15cfa..7b9aae5b0 100644 --- a/lib/crewai-tools/src/crewai_tools/rag/chunkers/text_chunker.py +++ b/lib/crewai-tools/src/crewai_tools/rag/chunkers/text_chunker.py @@ -1,5 +1,3 @@ -from typing import List, Optional - from crewai_tools.rag.chunkers.base_chunker import BaseChunker @@ -8,7 +6,7 @@ class TextChunker(BaseChunker): self, chunk_size: int = 1500, chunk_overlap: int = 150, - separators: Optional[List[str]] = None, + separators: list[str] | None = None, keep_separator: bool = True, ): if separators is None: @@ -32,7 +30,7 @@ class DocxChunker(BaseChunker): self, chunk_size: int = 2500, chunk_overlap: int = 250, - separators: Optional[List[str]] = None, + separators: list[str] | None = None, keep_separator: bool = True, ): if separators is None: @@ -56,7 +54,7 @@ class MdxChunker(BaseChunker): self, chunk_size: int = 3000, chunk_overlap: int = 300, - separators: Optional[List[str]] = None, + separators: list[str] | None = None, keep_separator: bool = True, ): if separators is None: diff --git a/lib/crewai-tools/src/crewai_tools/rag/chunkers/web_chunker.py b/lib/crewai-tools/src/crewai_tools/rag/chunkers/web_chunker.py index 25d607884..cc1a514d3 100644 --- a/lib/crewai-tools/src/crewai_tools/rag/chunkers/web_chunker.py +++ b/lib/crewai-tools/src/crewai_tools/rag/chunkers/web_chunker.py @@ -1,5 +1,3 @@ -from typing import List, Optional - from crewai_tools.rag.chunkers.base_chunker import BaseChunker @@ -8,7 +6,7 @@ class WebsiteChunker(BaseChunker): self, chunk_size: int = 2500, chunk_overlap: int = 250, - separators: Optional[List[str]] = None, + separators: list[str] | None = None, keep_separator: bool = True, ): if separators is None: diff --git a/lib/crewai-tools/src/crewai_tools/rag/core.py b/lib/crewai-tools/src/crewai_tools/rag/core.py index b68f4f1c1..9c731c223 100644 --- a/lib/crewai-tools/src/crewai_tools/rag/core.py +++ b/lib/crewai-tools/src/crewai_tools/rag/core.py @@ -1,6 +1,6 @@ import logging from pathlib import Path -from typing import Any, Dict, List, Optional, Union +from typing import Any from uuid import uuid4 import chromadb @@ -23,7 +23,7 @@ class EmbeddingService: self.model = model self.kwargs = kwargs - def embed_text(self, text: str) -> List[float]: + def embed_text(self, text: str) -> list[float]: try: response = litellm.embedding(model=self.model, input=[text], **self.kwargs) return response.data[0]["embedding"] @@ -31,7 +31,7 @@ class EmbeddingService: logger.error(f"Error generating embedding: {e}") raise - def embed_batch(self, texts: List[str]) -> List[List[float]]: + def embed_batch(self, texts: list[str]) -> list[list[float]]: if not texts: return [] @@ -46,18 +46,18 @@ class EmbeddingService: class Document(BaseModel): id: str = Field(default_factory=lambda: str(uuid4())) content: str - metadata: Dict[str, Any] = Field(default_factory=dict) + metadata: dict[str, Any] = Field(default_factory=dict) data_type: DataType = DataType.TEXT - source: Optional[str] = None + source: str | None = None class RAG(Adapter): collection_name: str = "crewai_knowledge_base" - persist_directory: Optional[str] = None + persist_directory: str | None = None embedding_model: str = "text-embedding-3-large" summarize: bool = False top_k: int = 5 - embedding_config: Dict[str, Any] = Field(default_factory=dict) + embedding_config: dict[str, Any] = Field(default_factory=dict) _client: Any = PrivateAttr() _collection: Any = PrivateAttr() @@ -90,10 +90,10 @@ class RAG(Adapter): def add( self, content: str | Path, - data_type: Optional[Union[str, DataType]] = None, - metadata: Optional[Dict[str, Any]] = None, - loader: Optional[BaseLoader] = None, - chunker: Optional[BaseChunker] = None, + data_type: str | DataType | None = None, + metadata: dict[str, Any] | None = None, + loader: BaseLoader | None = None, + chunker: BaseChunker | None = None, **kwargs: Any, ) -> None: source_content = SourceContent(content) @@ -181,7 +181,7 @@ class RAG(Adapter): except Exception as e: logger.error(f"Failed to add documents to ChromaDB: {e}") - def query(self, question: str, where: Optional[Dict[str, Any]] = None) -> str: + def query(self, question: str, where: dict[str, Any] | None = None) -> str: try: question_embedding = self._embedding_service.embed_text(question) @@ -228,7 +228,7 @@ class RAG(Adapter): except Exception as e: logger.error(f"Failed to delete collection: {e}") - def get_collection_info(self) -> Dict[str, Any]: + def get_collection_info(self) -> dict[str, Any]: try: count = self._collection.count() return { @@ -246,7 +246,7 @@ class RAG(Adapter): try: if isinstance(data_type, str): return DataType(data_type) - except Exception: + except Exception: # noqa: S110 pass return content.data_type diff --git a/lib/crewai-tools/src/crewai_tools/rag/data_types.py b/lib/crewai-tools/src/crewai_tools/rag/data_types.py index 224b7d195..abe69c382 100644 --- a/lib/crewai-tools/src/crewai_tools/rag/data_types.py +++ b/lib/crewai-tools/src/crewai_tools/rag/data_types.py @@ -65,7 +65,7 @@ class DataType(str, Enum): module = import_module(module_path) return getattr(module, class_name)() except Exception as e: - raise ValueError(f"Error loading chunker for {self}: {e}") + raise ValueError(f"Error loading chunker for {self}: {e}") from e def get_loader(self) -> BaseLoader: from importlib import import_module @@ -100,7 +100,7 @@ class DataType(str, Enum): module = import_module(module_path) return getattr(module, class_name)() except Exception as e: - raise ValueError(f"Error loading loader for {self}: {e}") + raise ValueError(f"Error loading loader for {self}: {e}") from e class DataTypes: @@ -117,7 +117,7 @@ class DataTypes: try: url = urlparse(content) is_url = (url.scheme and url.netloc) or url.scheme == "file" - except Exception: + except Exception: # noqa: S110 pass def get_file_type(path: str) -> DataType | None: diff --git a/lib/crewai-tools/src/crewai_tools/rag/loaders/csv_loader.py b/lib/crewai-tools/src/crewai_tools/rag/loaders/csv_loader.py index fd74cbf19..1135e69a1 100644 --- a/lib/crewai-tools/src/crewai_tools/rag/loaders/csv_loader.py +++ b/lib/crewai-tools/src/crewai_tools/rag/loaders/csv_loader.py @@ -33,7 +33,7 @@ class CSVLoader(BaseLoader): response.raise_for_status() return response.text except Exception as e: - raise ValueError(f"Error fetching CSV from URL {url}: {e!s}") + raise ValueError(f"Error fetching CSV from URL {url}: {e!s}") from e def _load_from_file(self, path: str) -> str: with open(path, "r", encoding="utf-8") as file: diff --git a/lib/crewai-tools/src/crewai_tools/rag/loaders/directory_loader.py b/lib/crewai-tools/src/crewai_tools/rag/loaders/directory_loader.py index 39c4e7102..fdf305cd7 100644 --- a/lib/crewai-tools/src/crewai_tools/rag/loaders/directory_loader.py +++ b/lib/crewai-tools/src/crewai_tools/rag/loaders/directory_loader.py @@ -1,6 +1,5 @@ import os from pathlib import Path -from typing import List from crewai_tools.rag.base_loader import BaseLoader, LoaderResult from crewai_tools.rag.source_content import SourceContent @@ -8,8 +7,7 @@ from crewai_tools.rag.source_content import SourceContent class DirectoryLoader(BaseLoader): def load(self, source_content: SourceContent, **kwargs) -> LoaderResult: - """ - Load and process all files from a directory recursively. + """Load and process all files from a directory recursively. Args: source: Directory path or URL to a directory listing @@ -63,7 +61,7 @@ class DirectoryLoader(BaseLoader): "source": result.source, } ) - except Exception as e: + except Exception as e: # noqa: PERF203 error_msg = f"Error processing {file_path}: {e!s}" errors.append(error_msg) all_contents.append(f"=== File: {file_path} (ERROR) ===\n{error_msg}") @@ -91,9 +89,9 @@ class DirectoryLoader(BaseLoader): self, dir_path: str, recursive: bool, - include_ext: List[str] | None = None, - exclude_ext: List[str] | None = None, - ) -> List[str]: + include_ext: list[str] | None = None, + exclude_ext: list[str] | None = None, + ) -> list[str]: """Find all files in directory matching criteria.""" files = [] @@ -103,7 +101,7 @@ class DirectoryLoader(BaseLoader): for filename in filenames: if self._should_include_file(filename, include_ext, exclude_ext): - files.append(os.path.join(root, filename)) + files.append(os.path.join(root, filename)) # noqa: PERF401 else: try: for item in os.listdir(dir_path): @@ -120,8 +118,8 @@ class DirectoryLoader(BaseLoader): def _should_include_file( self, filename: str, - include_ext: List[str] = None, - exclude_ext: List[str] = None, + include_ext: list[str] | None = None, + exclude_ext: list[str] | None = None, ) -> bool: """Determine if a file should be included based on criteria.""" if filename.startswith("."): diff --git a/lib/crewai-tools/src/crewai_tools/rag/loaders/docs_site_loader.py b/lib/crewai-tools/src/crewai_tools/rag/loaders/docs_site_loader.py index 971750ab4..e000494c6 100644 --- a/lib/crewai-tools/src/crewai_tools/rag/loaders/docs_site_loader.py +++ b/lib/crewai-tools/src/crewai_tools/rag/loaders/docs_site_loader.py @@ -28,7 +28,9 @@ class DocsSiteLoader(BaseLoader): response = requests.get(docs_url, timeout=30) response.raise_for_status() except requests.RequestException as e: - raise ValueError(f"Unable to fetch documentation from {docs_url}: {e}") + raise ValueError( + f"Unable to fetch documentation from {docs_url}: {e}" + ) from e soup = BeautifulSoup(response.text, "html.parser") diff --git a/lib/crewai-tools/src/crewai_tools/rag/loaders/docx_loader.py b/lib/crewai-tools/src/crewai_tools/rag/loaders/docx_loader.py index f1a589b68..ac149f1f7 100644 --- a/lib/crewai-tools/src/crewai_tools/rag/loaders/docx_loader.py +++ b/lib/crewai-tools/src/crewai_tools/rag/loaders/docx_loader.py @@ -9,10 +9,10 @@ class DOCXLoader(BaseLoader): def load(self, source_content: SourceContent, **kwargs) -> LoaderResult: try: from docx import Document as DocxDocument - except ImportError: + except ImportError as e: raise ImportError( "python-docx is required for DOCX loading. Install with: 'uv pip install python-docx' or pip install crewai-tools[rag]" - ) + ) from e source_ref = source_content.source_ref @@ -49,10 +49,13 @@ class DOCXLoader(BaseLoader): temp_file.write(response.content) return temp_file.name except Exception as e: - raise ValueError(f"Error fetching DOCX from URL {url}: {e!s}") + raise ValueError(f"Error fetching DOCX from URL {url}: {e!s}") from e def _load_from_file( - self, file_path: str, source_ref: str, DocxDocument + self, + file_path: str, + source_ref: str, + DocxDocument, # noqa: N803 ) -> LoaderResult: try: doc = DocxDocument(file_path) @@ -60,7 +63,7 @@ class DOCXLoader(BaseLoader): text_parts = [] for paragraph in doc.paragraphs: if paragraph.text.strip(): - text_parts.append(paragraph.text) + text_parts.append(paragraph.text) # noqa: PERF401 content = "\n".join(text_parts) @@ -78,4 +81,4 @@ class DOCXLoader(BaseLoader): ) except Exception as e: - raise ValueError(f"Error loading DOCX file: {e!s}") + raise ValueError(f"Error loading DOCX file: {e!s}") from e diff --git a/lib/crewai-tools/src/crewai_tools/rag/loaders/github_loader.py b/lib/crewai-tools/src/crewai_tools/rag/loaders/github_loader.py index 367f7d789..16020c7ac 100644 --- a/lib/crewai-tools/src/crewai_tools/rag/loaders/github_loader.py +++ b/lib/crewai-tools/src/crewai_tools/rag/loaders/github_loader.py @@ -38,7 +38,7 @@ class GithubLoader(BaseLoader): try: repo = g.get_repo(repo_name) except GithubException as e: - raise ValueError(f"Unable to access repository {repo_name}: {e}") + raise ValueError(f"Unable to access repository {repo_name}: {e}") from e all_content = [] @@ -66,7 +66,7 @@ class GithubLoader(BaseLoader): if isinstance(contents, list): all_content.append("Repository structure:") for content_file in contents[:20]: - all_content.append( + all_content.append( # noqa: PERF401 f"- {content_file.path} ({content_file.type})" ) all_content.append("") diff --git a/lib/crewai-tools/src/crewai_tools/rag/loaders/json_loader.py b/lib/crewai-tools/src/crewai_tools/rag/loaders/json_loader.py index 1bebba8c2..2f2f9ea61 100644 --- a/lib/crewai-tools/src/crewai_tools/rag/loaders/json_loader.py +++ b/lib/crewai-tools/src/crewai_tools/rag/loaders/json_loader.py @@ -36,7 +36,7 @@ class JSONLoader(BaseLoader): else json.dumps(response.json(), indent=2) ) except Exception as e: - raise ValueError(f"Error fetching JSON from URL {url}: {e!s}") + raise ValueError(f"Error fetching JSON from URL {url}: {e!s}") from e def _is_json_response(self, response) -> bool: try: diff --git a/lib/crewai-tools/src/crewai_tools/rag/loaders/mdx_loader.py b/lib/crewai-tools/src/crewai_tools/rag/loaders/mdx_loader.py index 5b6e39933..f9ae38860 100644 --- a/lib/crewai-tools/src/crewai_tools/rag/loaders/mdx_loader.py +++ b/lib/crewai-tools/src/crewai_tools/rag/loaders/mdx_loader.py @@ -32,7 +32,7 @@ class MDXLoader(BaseLoader): response.raise_for_status() return response.text except Exception as e: - raise ValueError(f"Error fetching MDX from URL {url}: {e!s}") + raise ValueError(f"Error fetching MDX from URL {url}: {e!s}") from e def _load_from_file(self, path: str) -> str: with open(path, "r", encoding="utf-8") as file: diff --git a/lib/crewai-tools/src/crewai_tools/rag/loaders/mysql_loader.py b/lib/crewai-tools/src/crewai_tools/rag/loaders/mysql_loader.py index c7a077d40..6c4e9bfd3 100644 --- a/lib/crewai-tools/src/crewai_tools/rag/loaders/mysql_loader.py +++ b/lib/crewai-tools/src/crewai_tools/rag/loaders/mysql_loader.py @@ -95,6 +95,6 @@ class MySQLLoader(BaseLoader): finally: connection.close() except pymysql.Error as e: - raise ValueError(f"MySQL database error: {e}") + raise ValueError(f"MySQL database error: {e}") from e except Exception as e: - raise ValueError(f"Failed to load data from MySQL: {e}") + raise ValueError(f"Failed to load data from MySQL: {e}") from e diff --git a/lib/crewai-tools/src/crewai_tools/rag/loaders/pdf_loader.py b/lib/crewai-tools/src/crewai_tools/rag/loaders/pdf_loader.py index 2ca4a1561..298422504 100644 --- a/lib/crewai-tools/src/crewai_tools/rag/loaders/pdf_loader.py +++ b/lib/crewai-tools/src/crewai_tools/rag/loaders/pdf_loader.py @@ -28,11 +28,11 @@ class PDFLoader(BaseLoader): import pypdf except ImportError: try: - import PyPDF2 as pypdf - except ImportError: + import PyPDF2 as pypdf # noqa: N813 + except ImportError as e: raise ImportError( "PDF support requires pypdf or PyPDF2. Install with: uv add pypdf" - ) + ) from e file_path = source.source @@ -56,7 +56,7 @@ class PDFLoader(BaseLoader): if page_text.strip(): text_content.append(f"Page {page_num}:\n{page_text}") except Exception as e: - raise ValueError(f"Error reading PDF file {file_path}: {e!s}") + raise ValueError(f"Error reading PDF file {file_path}: {e!s}") from e if not text_content: content = f"[PDF file with no extractable text: {Path(file_path).name}]" diff --git a/lib/crewai-tools/src/crewai_tools/rag/loaders/postgres_loader.py b/lib/crewai-tools/src/crewai_tools/rag/loaders/postgres_loader.py index 99a0309d7..a6a8d0a8d 100644 --- a/lib/crewai-tools/src/crewai_tools/rag/loaders/postgres_loader.py +++ b/lib/crewai-tools/src/crewai_tools/rag/loaders/postgres_loader.py @@ -95,6 +95,6 @@ class PostgresLoader(BaseLoader): finally: connection.close() except psycopg2.Error as e: - raise ValueError(f"PostgreSQL database error: {e}") + raise ValueError(f"PostgreSQL database error: {e}") from e except Exception as e: - raise ValueError(f"Failed to load data from PostgreSQL: {e}") + raise ValueError(f"Failed to load data from PostgreSQL: {e}") from e diff --git a/lib/crewai-tools/src/crewai_tools/rag/loaders/webpage_loader.py b/lib/crewai-tools/src/crewai_tools/rag/loaders/webpage_loader.py index a887a9e16..6ad16c6c6 100644 --- a/lib/crewai-tools/src/crewai_tools/rag/loaders/webpage_loader.py +++ b/lib/crewai-tools/src/crewai_tools/rag/loaders/webpage_loader.py @@ -51,4 +51,4 @@ class WebPageLoader(BaseLoader): ) except Exception as e: - raise ValueError(f"Error loading webpage {url}: {e!s}") + raise ValueError(f"Error loading webpage {url}: {e!s}") from e diff --git a/lib/crewai-tools/src/crewai_tools/rag/loaders/xml_loader.py b/lib/crewai-tools/src/crewai_tools/rag/loaders/xml_loader.py index ffac37f71..3d58a6bb8 100644 --- a/lib/crewai-tools/src/crewai_tools/rag/loaders/xml_loader.py +++ b/lib/crewai-tools/src/crewai_tools/rag/loaders/xml_loader.py @@ -32,7 +32,7 @@ class XMLLoader(BaseLoader): response.raise_for_status() return response.text except Exception as e: - raise ValueError(f"Error fetching XML from URL {url}: {e!s}") + raise ValueError(f"Error fetching XML from URL {url}: {e!s}") from e def _load_from_file(self, path: str) -> str: with open(path, "r", encoding="utf-8") as file: @@ -41,14 +41,14 @@ class XMLLoader(BaseLoader): def _parse_xml(self, content: str, source_ref: str) -> LoaderResult: try: if content.strip().startswith("<"): - root = ET.fromstring(content) + root = ET.fromstring(content) # noqa: S314 else: - root = ET.parse(source_ref).getroot() + root = ET.parse(source_ref).getroot() # noqa: S314 text_parts = [] for text_content in root.itertext(): if text_content and text_content.strip(): - text_parts.append(text_content.strip()) + text_parts.append(text_content.strip()) # noqa: PERF401 text = "\n".join(text_parts) metadata = {"format": "xml", "root_tag": root.tag} diff --git a/lib/crewai-tools/src/crewai_tools/rag/loaders/youtube_channel_loader.py b/lib/crewai-tools/src/crewai_tools/rag/loaders/youtube_channel_loader.py index c2d9c2ad1..a6ee4a96d 100644 --- a/lib/crewai-tools/src/crewai_tools/rag/loaders/youtube_channel_loader.py +++ b/lib/crewai-tools/src/crewai_tools/rag/loaders/youtube_channel_loader.py @@ -25,10 +25,10 @@ class YoutubeChannelLoader(BaseLoader): """ try: from pytube import Channel - except ImportError: + except ImportError as e: raise ImportError( "YouTube channel support requires pytube. Install with: uv add pytube" - ) + ) from e channel_url = source.source @@ -93,14 +93,14 @@ class YoutubeChannelLoader(BaseLoader): try: transcript = transcript_list.find_transcript(["en"]) - except: + except Exception: try: transcript = ( transcript_list.find_generated_transcript( ["en"] ) ) - except: + except Exception: transcript = next(iter(transcript_list), None) if transcript: @@ -124,7 +124,7 @@ class YoutubeChannelLoader(BaseLoader): content_parts.append( f" Transcript Preview: {preview}..." ) - except: + except Exception: content_parts.append(" Transcript: Not available") except Exception as e: diff --git a/lib/crewai-tools/src/crewai_tools/rag/loaders/youtube_video_loader.py b/lib/crewai-tools/src/crewai_tools/rag/loaders/youtube_video_loader.py index a0f20aa23..600d45d7c 100644 --- a/lib/crewai-tools/src/crewai_tools/rag/loaders/youtube_video_loader.py +++ b/lib/crewai-tools/src/crewai_tools/rag/loaders/youtube_video_loader.py @@ -26,11 +26,11 @@ class YoutubeVideoLoader(BaseLoader): """ try: from youtube_transcript_api import YouTubeTranscriptApi - except ImportError: + except ImportError as e: raise ImportError( "YouTube support requires youtube-transcript-api. " "Install with: uv add youtube-transcript-api" - ) + ) from e video_url = source.source video_id = self._extract_video_id(video_url) @@ -51,10 +51,10 @@ class YoutubeVideoLoader(BaseLoader): transcript = None try: transcript = transcript_list.find_transcript(["en"]) - except: + except Exception: try: transcript = transcript_list.find_generated_transcript(["en"]) - except: + except Exception: transcript = next(iter(transcript_list)) if transcript: @@ -84,7 +84,7 @@ class YoutubeVideoLoader(BaseLoader): if yt.title: content = f"Title: {yt.title}\n\nAuthor: {yt.author or 'Unknown'}\n\nTranscript:\n{content}" - except: + except Exception: # noqa: S110 pass else: raise ValueError( @@ -128,7 +128,7 @@ class YoutubeVideoLoader(BaseLoader): query_params = parse_qs(parsed.query) if "v" in query_params: return query_params["v"][0] - except: + except Exception: # noqa: S110 pass return None diff --git a/lib/crewai-tools/src/crewai_tools/rag/source_content.py b/lib/crewai-tools/src/crewai_tools/rag/source_content.py index a659f1563..918e4989a 100644 --- a/lib/crewai-tools/src/crewai_tools/rag/source_content.py +++ b/lib/crewai-tools/src/crewai_tools/rag/source_content.py @@ -40,7 +40,6 @@ class SourceContent: If the content is a URL or a local file, returns the source. Otherwise, returns the hash of the content. """ - if self.is_url() or self.path_exists(): return self.source diff --git a/lib/crewai-tools/src/crewai_tools/tools/__init__.py b/lib/crewai-tools/src/crewai_tools/tools/__init__.py index 3e36b8dd0..3902d8cd2 100644 --- a/lib/crewai-tools/src/crewai_tools/tools/__init__.py +++ b/lib/crewai-tools/src/crewai_tools/tools/__init__.py @@ -1,127 +1,274 @@ -from .ai_mind_tool.ai_mind_tool import AIMindTool -from .apify_actors_tool.apify_actors_tool import ApifyActorsTool -from .arxiv_paper_tool.arxiv_paper_tool import ArxivPaperTool -from .brave_search_tool.brave_search_tool import BraveSearchTool -from .brightdata_tool import ( +from crewai_tools.tools.ai_mind_tool.ai_mind_tool import AIMindTool +from crewai_tools.tools.apify_actors_tool.apify_actors_tool import ApifyActorsTool +from crewai_tools.tools.arxiv_paper_tool.arxiv_paper_tool import ArxivPaperTool +from crewai_tools.tools.brave_search_tool.brave_search_tool import BraveSearchTool +from crewai_tools.tools.brightdata_tool import ( BrightDataDatasetTool, BrightDataSearchTool, BrightDataWebUnlockerTool, ) -from .browserbase_load_tool.browserbase_load_tool import BrowserbaseLoadTool -from .code_docs_search_tool.code_docs_search_tool import CodeDocsSearchTool -from .code_interpreter_tool.code_interpreter_tool import CodeInterpreterTool -from .composio_tool.composio_tool import ComposioTool -from .contextualai_create_agent_tool.contextual_create_agent_tool import ( +from crewai_tools.tools.browserbase_load_tool.browserbase_load_tool import ( + BrowserbaseLoadTool, +) +from crewai_tools.tools.code_docs_search_tool.code_docs_search_tool import ( + CodeDocsSearchTool, +) +from crewai_tools.tools.code_interpreter_tool.code_interpreter_tool import ( + CodeInterpreterTool, +) +from crewai_tools.tools.composio_tool.composio_tool import ComposioTool +from crewai_tools.tools.contextualai_create_agent_tool.contextual_create_agent_tool import ( ContextualAICreateAgentTool, ) -from .contextualai_parse_tool.contextual_parse_tool import ContextualAIParseTool -from .contextualai_query_tool.contextual_query_tool import ContextualAIQueryTool -from .contextualai_rerank_tool.contextual_rerank_tool import ContextualAIRerankTool -from .couchbase_tool.couchbase_tool import CouchbaseFTSVectorSearchTool -from .crewai_enterprise_tools.crewai_enterprise_tools import CrewaiEnterpriseTools -from .crewai_platform_tools.crewai_platform_tools import CrewaiPlatformTools -from .csv_search_tool.csv_search_tool import CSVSearchTool -from .dalle_tool.dalle_tool import DallETool -from .databricks_query_tool.databricks_query_tool import DatabricksQueryTool -from .directory_read_tool.directory_read_tool import DirectoryReadTool -from .directory_search_tool.directory_search_tool import DirectorySearchTool -from .docx_search_tool.docx_search_tool import DOCXSearchTool -from .exa_tools.exa_search_tool import EXASearchTool -from .file_read_tool.file_read_tool import FileReadTool -from .file_writer_tool.file_writer_tool import FileWriterTool -from .files_compressor_tool.files_compressor_tool import FileCompressorTool -from .firecrawl_crawl_website_tool.firecrawl_crawl_website_tool import ( +from crewai_tools.tools.contextualai_parse_tool.contextual_parse_tool import ( + ContextualAIParseTool, +) +from crewai_tools.tools.contextualai_query_tool.contextual_query_tool import ( + ContextualAIQueryTool, +) +from crewai_tools.tools.contextualai_rerank_tool.contextual_rerank_tool import ( + ContextualAIRerankTool, +) +from crewai_tools.tools.couchbase_tool.couchbase_tool import ( + CouchbaseFTSVectorSearchTool, +) +from crewai_tools.tools.crewai_enterprise_tools.crewai_enterprise_tools import ( + CrewaiEnterpriseTools, +) +from crewai_tools.tools.crewai_platform_tools.crewai_platform_tools import ( + CrewaiPlatformTools, +) +from crewai_tools.tools.csv_search_tool.csv_search_tool import CSVSearchTool +from crewai_tools.tools.dalle_tool.dalle_tool import DallETool +from crewai_tools.tools.databricks_query_tool.databricks_query_tool import ( + DatabricksQueryTool, +) +from crewai_tools.tools.directory_read_tool.directory_read_tool import ( + DirectoryReadTool, +) +from crewai_tools.tools.directory_search_tool.directory_search_tool import ( + DirectorySearchTool, +) +from crewai_tools.tools.docx_search_tool.docx_search_tool import DOCXSearchTool +from crewai_tools.tools.exa_tools.exa_search_tool import EXASearchTool +from crewai_tools.tools.file_read_tool.file_read_tool import FileReadTool +from crewai_tools.tools.file_writer_tool.file_writer_tool import FileWriterTool +from crewai_tools.tools.files_compressor_tool.files_compressor_tool import ( + FileCompressorTool, +) +from crewai_tools.tools.firecrawl_crawl_website_tool.firecrawl_crawl_website_tool import ( FirecrawlCrawlWebsiteTool, ) -from .firecrawl_scrape_website_tool.firecrawl_scrape_website_tool import ( +from crewai_tools.tools.firecrawl_scrape_website_tool.firecrawl_scrape_website_tool import ( FirecrawlScrapeWebsiteTool, ) -from .firecrawl_search_tool.firecrawl_search_tool import FirecrawlSearchTool -from .generate_crewai_automation_tool.generate_crewai_automation_tool import ( +from crewai_tools.tools.firecrawl_search_tool.firecrawl_search_tool import ( + FirecrawlSearchTool, +) +from crewai_tools.tools.generate_crewai_automation_tool.generate_crewai_automation_tool import ( GenerateCrewaiAutomationTool, ) -from .github_search_tool.github_search_tool import GithubSearchTool -from .hyperbrowser_load_tool.hyperbrowser_load_tool import HyperbrowserLoadTool -from .invoke_crewai_automation_tool.invoke_crewai_automation_tool import ( +from crewai_tools.tools.github_search_tool.github_search_tool import GithubSearchTool +from crewai_tools.tools.hyperbrowser_load_tool.hyperbrowser_load_tool import ( + HyperbrowserLoadTool, +) +from crewai_tools.tools.invoke_crewai_automation_tool.invoke_crewai_automation_tool import ( InvokeCrewAIAutomationTool, ) -from .json_search_tool.json_search_tool import JSONSearchTool -from .linkup.linkup_search_tool import LinkupSearchTool -from .llamaindex_tool.llamaindex_tool import LlamaIndexTool -from .mdx_search_tool.mdx_search_tool import MDXSearchTool -from .mongodb_vector_search_tool import ( +from crewai_tools.tools.jina_scrape_website_tool.jina_scrape_website_tool import ( + JinaScrapeWebsiteTool, +) +from crewai_tools.tools.json_search_tool.json_search_tool import JSONSearchTool +from crewai_tools.tools.linkup.linkup_search_tool import LinkupSearchTool +from crewai_tools.tools.llamaindex_tool.llamaindex_tool import LlamaIndexTool +from crewai_tools.tools.mdx_search_tool.mdx_search_tool import MDXSearchTool +from crewai_tools.tools.mongodb_vector_search_tool import ( MongoDBToolSchema, MongoDBVectorSearchConfig, MongoDBVectorSearchTool, ) -from .multion_tool.multion_tool import MultiOnTool -from .mysql_search_tool.mysql_search_tool import MySQLSearchTool -from .nl2sql.nl2sql_tool import NL2SQLTool -from .ocr_tool.ocr_tool import OCRTool -from .oxylabs_amazon_product_scraper_tool.oxylabs_amazon_product_scraper_tool import ( +from crewai_tools.tools.multion_tool.multion_tool import MultiOnTool +from crewai_tools.tools.mysql_search_tool.mysql_search_tool import MySQLSearchTool +from crewai_tools.tools.nl2sql.nl2sql_tool import NL2SQLTool +from crewai_tools.tools.ocr_tool.ocr_tool import OCRTool +from crewai_tools.tools.oxylabs_amazon_product_scraper_tool.oxylabs_amazon_product_scraper_tool import ( OxylabsAmazonProductScraperTool, ) -from .oxylabs_amazon_search_scraper_tool.oxylabs_amazon_search_scraper_tool import ( +from crewai_tools.tools.oxylabs_amazon_search_scraper_tool.oxylabs_amazon_search_scraper_tool import ( OxylabsAmazonSearchScraperTool, ) -from .oxylabs_google_search_scraper_tool.oxylabs_google_search_scraper_tool import ( +from crewai_tools.tools.oxylabs_google_search_scraper_tool.oxylabs_google_search_scraper_tool import ( OxylabsGoogleSearchScraperTool, ) -from .oxylabs_universal_scraper_tool.oxylabs_universal_scraper_tool import ( +from crewai_tools.tools.oxylabs_universal_scraper_tool.oxylabs_universal_scraper_tool import ( OxylabsUniversalScraperTool, ) -from .parallel_tools import ( - ParallelSearchTool, -) -from .patronus_eval_tool import ( +from crewai_tools.tools.parallel_tools import ParallelSearchTool +from crewai_tools.tools.patronus_eval_tool import ( PatronusEvalTool, PatronusLocalEvaluatorTool, PatronusPredefinedCriteriaEvalTool, ) -from .pdf_search_tool.pdf_search_tool import PDFSearchTool -from .pg_search_tool.pg_search_tool import PGSearchTool -from .qdrant_vector_search_tool.qdrant_search_tool import QdrantVectorSearchTool -from .rag.rag_tool import RagTool -from .scrape_element_from_website.scrape_element_from_website import ( +from crewai_tools.tools.pdf_search_tool.pdf_search_tool import PDFSearchTool +from crewai_tools.tools.qdrant_vector_search_tool.qdrant_search_tool import ( + QdrantVectorSearchTool, +) +from crewai_tools.tools.rag.rag_tool import RagTool +from crewai_tools.tools.scrape_element_from_website.scrape_element_from_website import ( ScrapeElementFromWebsiteTool, ) -from .scrape_website_tool.scrape_website_tool import ScrapeWebsiteTool -from .scrapegraph_scrape_tool.scrapegraph_scrape_tool import ( +from crewai_tools.tools.scrape_website_tool.scrape_website_tool import ( + ScrapeWebsiteTool, +) +from crewai_tools.tools.scrapegraph_scrape_tool.scrapegraph_scrape_tool import ( ScrapegraphScrapeTool, ScrapegraphScrapeToolSchema, ) -from .scrapfly_scrape_website_tool.scrapfly_scrape_website_tool import ( +from crewai_tools.tools.scrapfly_scrape_website_tool.scrapfly_scrape_website_tool import ( ScrapflyScrapeWebsiteTool, ) -from .selenium_scraping_tool.selenium_scraping_tool import SeleniumScrapingTool -from .serpapi_tool.serpapi_google_search_tool import SerpApiGoogleSearchTool -from .serpapi_tool.serpapi_google_shopping_tool import SerpApiGoogleShoppingTool -from .serper_dev_tool.serper_dev_tool import SerperDevTool -from .serper_scrape_website_tool.serper_scrape_website_tool import ( +from crewai_tools.tools.selenium_scraping_tool.selenium_scraping_tool import ( + SeleniumScrapingTool, +) +from crewai_tools.tools.serpapi_tool.serpapi_google_search_tool import ( + SerpApiGoogleSearchTool, +) +from crewai_tools.tools.serpapi_tool.serpapi_google_shopping_tool import ( + SerpApiGoogleShoppingTool, +) +from crewai_tools.tools.serper_dev_tool.serper_dev_tool import SerperDevTool +from crewai_tools.tools.serper_scrape_website_tool.serper_scrape_website_tool import ( SerperScrapeWebsiteTool, ) -from .serply_api_tool.serply_job_search_tool import SerplyJobSearchTool -from .serply_api_tool.serply_news_search_tool import SerplyNewsSearchTool -from .serply_api_tool.serply_scholar_search_tool import SerplyScholarSearchTool -from .serply_api_tool.serply_web_search_tool import SerplyWebSearchTool -from .serply_api_tool.serply_webpage_to_markdown_tool import SerplyWebpageToMarkdownTool -from .singlestore_search_tool import SingleStoreSearchTool -from .snowflake_search_tool import ( +from crewai_tools.tools.serply_api_tool.serply_job_search_tool import ( + SerplyJobSearchTool, +) +from crewai_tools.tools.serply_api_tool.serply_news_search_tool import ( + SerplyNewsSearchTool, +) +from crewai_tools.tools.serply_api_tool.serply_scholar_search_tool import ( + SerplyScholarSearchTool, +) +from crewai_tools.tools.serply_api_tool.serply_web_search_tool import ( + SerplyWebSearchTool, +) +from crewai_tools.tools.serply_api_tool.serply_webpage_to_markdown_tool import ( + SerplyWebpageToMarkdownTool, +) +from crewai_tools.tools.singlestore_search_tool import SingleStoreSearchTool +from crewai_tools.tools.snowflake_search_tool import ( SnowflakeConfig, SnowflakeSearchTool, SnowflakeSearchToolInput, ) -from .spider_tool.spider_tool import SpiderTool -from .stagehand_tool.stagehand_tool import StagehandTool -from .tavily_extractor_tool.tavily_extractor_tool import TavilyExtractorTool -from .tavily_search_tool.tavily_search_tool import TavilySearchTool -from .txt_search_tool.txt_search_tool import TXTSearchTool -from .vision_tool.vision_tool import VisionTool -from .weaviate_tool.vector_search import WeaviateVectorSearchTool -from .website_search.website_search_tool import WebsiteSearchTool -from .xml_search_tool.xml_search_tool import XMLSearchTool -from .youtube_channel_search_tool.youtube_channel_search_tool import ( +from crewai_tools.tools.spider_tool.spider_tool import SpiderTool +from crewai_tools.tools.stagehand_tool.stagehand_tool import StagehandTool +from crewai_tools.tools.tavily_extractor_tool.tavily_extractor_tool import ( + TavilyExtractorTool, +) +from crewai_tools.tools.tavily_search_tool.tavily_search_tool import TavilySearchTool +from crewai_tools.tools.txt_search_tool.txt_search_tool import TXTSearchTool +from crewai_tools.tools.vision_tool.vision_tool import VisionTool +from crewai_tools.tools.weaviate_tool.vector_search import WeaviateVectorSearchTool +from crewai_tools.tools.website_search.website_search_tool import WebsiteSearchTool +from crewai_tools.tools.xml_search_tool.xml_search_tool import XMLSearchTool +from crewai_tools.tools.youtube_channel_search_tool.youtube_channel_search_tool import ( YoutubeChannelSearchTool, ) -from .youtube_video_search_tool.youtube_video_search_tool import YoutubeVideoSearchTool -from .zapier_action_tool.zapier_action_tool import ZapierActionTools +from crewai_tools.tools.youtube_video_search_tool.youtube_video_search_tool import ( + YoutubeVideoSearchTool, +) +from crewai_tools.tools.zapier_action_tool.zapier_action_tool import ZapierActionTools + + +__all__ = [ + "AIMindTool", + "ApifyActorsTool", + "ArxivPaperTool", + "BraveSearchTool", + "BrightDataDatasetTool", + "BrightDataSearchTool", + "BrightDataWebUnlockerTool", + "BrowserbaseLoadTool", + "CSVSearchTool", + "CodeDocsSearchTool", + "CodeInterpreterTool", + "ComposioTool", + "ContextualAICreateAgentTool", + "ContextualAIParseTool", + "ContextualAIQueryTool", + "ContextualAIRerankTool", + "CouchbaseFTSVectorSearchTool", + "CrewaiEnterpriseTools", + "CrewaiPlatformTools", + "DOCXSearchTool", + "DallETool", + "DatabricksQueryTool", + "DirectoryReadTool", + "DirectorySearchTool", + "EXASearchTool", + "FileCompressorTool", + "FileReadTool", + "FileWriterTool", + "FirecrawlCrawlWebsiteTool", + "FirecrawlScrapeWebsiteTool", + "FirecrawlSearchTool", + "GenerateCrewaiAutomationTool", + "GithubSearchTool", + "HyperbrowserLoadTool", + "InvokeCrewAIAutomationTool", + "JSONSearchTool", + "JinaScrapeWebsiteTool", + "LinkupSearchTool", + "LlamaIndexTool", + "MDXSearchTool", + "MongoDBToolSchema", + "MongoDBVectorSearchConfig", + "MongoDBVectorSearchTool", + "MultiOnTool", + "MySQLSearchTool", + "NL2SQLTool", + "OCRTool", + "OxylabsAmazonProductScraperTool", + "OxylabsAmazonSearchScraperTool", + "OxylabsGoogleSearchScraperTool", + "OxylabsUniversalScraperTool", + "PDFSearchTool", + "ParallelSearchTool", + "PatronusEvalTool", + "PatronusLocalEvaluatorTool", + "PatronusPredefinedCriteriaEvalTool", + "QdrantVectorSearchTool", + "RagTool", + "ScrapeElementFromWebsiteTool", + "ScrapeWebsiteTool", + "ScrapegraphScrapeTool", + "ScrapegraphScrapeToolSchema", + "ScrapflyScrapeWebsiteTool", + "SeleniumScrapingTool", + "SerpApiGoogleSearchTool", + "SerpApiGoogleShoppingTool", + "SerperDevTool", + "SerperScrapeWebsiteTool", + "SerplyJobSearchTool", + "SerplyNewsSearchTool", + "SerplyScholarSearchTool", + "SerplyWebSearchTool", + "SerplyWebpageToMarkdownTool", + "SingleStoreSearchTool", + "SnowflakeConfig", + "SnowflakeSearchTool", + "SnowflakeSearchToolInput", + "SpiderTool", + "StagehandTool", + "TXTSearchTool", + "TavilyExtractorTool", + "TavilySearchTool", + "VisionTool", + "WeaviateVectorSearchTool", + "WebsiteSearchTool", + "XMLSearchTool", + "YoutubeChannelSearchTool", + "YoutubeVideoSearchTool", + "ZapierActionTools", +] diff --git a/lib/crewai-tools/src/crewai_tools/tools/ai_mind_tool/ai_mind_tool.py b/lib/crewai-tools/src/crewai_tools/tools/ai_mind_tool/ai_mind_tool.py index 838c0d0d4..d0bc72722 100644 --- a/lib/crewai-tools/src/crewai_tools/tools/ai_mind_tool/ai_mind_tool.py +++ b/lib/crewai-tools/src/crewai_tools/tools/ai_mind_tool/ai_mind_tool.py @@ -1,6 +1,6 @@ import os import secrets -from typing import Any, Dict, List, Optional, Type +from typing import Any from crewai.tools import BaseTool, EnvVar from openai import OpenAI @@ -28,16 +28,20 @@ class AIMindTool(BaseTool): "and Google BigQuery. " "Input should be a question in natural language." ) - args_schema: Type[BaseModel] = AIMindToolInputSchema - api_key: Optional[str] = None - datasources: Optional[List[Dict[str, Any]]] = None - mind_name: Optional[str] = None - package_dependencies: List[str] = ["minds-sdk"] - env_vars: List[EnvVar] = [ - EnvVar(name="MINDS_API_KEY", description="API key for AI-Minds", required=True), - ] + args_schema: type[BaseModel] = AIMindToolInputSchema + api_key: str | None = None + datasources: list[dict[str, Any]] | None = None + mind_name: str | None = None + package_dependencies: list[str] = Field(default_factory=lambda: ["minds-sdk"]) + env_vars: list[EnvVar] = Field( + default_factory=lambda: [ + EnvVar( + name="MINDS_API_KEY", description="API key for AI-Minds", required=True + ), + ] + ) - def __init__(self, api_key: Optional[str] = None, **kwargs): + def __init__(self, api_key: str | None = None, **kwargs): super().__init__(**kwargs) self.api_key = api_key or os.getenv("MINDS_API_KEY") if not self.api_key: @@ -48,10 +52,10 @@ class AIMindTool(BaseTool): try: from minds.client import Client # type: ignore from minds.datasources import DatabaseConfig # type: ignore - except ImportError: + except ImportError as e: raise ImportError( "`minds_sdk` package not found, please run `pip install minds-sdk`" - ) + ) from e minds_client = Client(api_key=self.api_key) diff --git a/lib/crewai-tools/src/crewai_tools/tools/apify_actors_tool/__init__.py b/lib/crewai-tools/src/crewai_tools/tools/apify_actors_tool/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/lib/crewai-tools/src/crewai_tools/tools/apify_actors_tool/apify_actors_tool.py b/lib/crewai-tools/src/crewai_tools/tools/apify_actors_tool/apify_actors_tool.py index b3657cdfe..fc4e45fdd 100644 --- a/lib/crewai-tools/src/crewai_tools/tools/apify_actors_tool/apify_actors_tool.py +++ b/lib/crewai-tools/src/crewai_tools/tools/apify_actors_tool/apify_actors_tool.py @@ -1,5 +1,5 @@ import os -from typing import TYPE_CHECKING, Any, Dict, List +from typing import TYPE_CHECKING, Any from crewai.tools import BaseTool, EnvVar from pydantic import Field @@ -10,13 +10,15 @@ if TYPE_CHECKING: class ApifyActorsTool(BaseTool): - env_vars: List[EnvVar] = [ - EnvVar( - name="APIFY_API_TOKEN", - description="API token for Apify platform access", - required=True, - ), - ] + env_vars: list[EnvVar] = Field( + default_factory=lambda: [ + EnvVar( + name="APIFY_API_TOKEN", + description="API token for Apify platform access", + required=True, + ), + ] + ) """Tool that runs Apify Actors. To use, you should have the environment variable `APIFY_API_TOKEN` set @@ -48,7 +50,7 @@ class ApifyActorsTool(BaseTool): print(f"Content: {result.get('markdown', 'N/A')[:100]}...") """ actor_tool: "_ApifyActorsTool" = Field(description="Apify Actor Tool") - package_dependencies: List[str] = ["langchain-apify"] + package_dependencies: list[str] = Field(default_factory=lambda: ["langchain-apify"]) def __init__(self, actor_name: str, *args: Any, **kwargs: Any) -> None: if not os.environ.get("APIFY_API_TOKEN"): @@ -61,11 +63,11 @@ class ApifyActorsTool(BaseTool): try: from langchain_apify import ApifyActorsTool as _ApifyActorsTool - except ImportError: + except ImportError as e: raise ImportError( "Could not import langchain_apify python package. " "Please install it with `pip install langchain-apify` or `uv add langchain-apify`." - ) + ) from e actor_tool = _ApifyActorsTool(actor_name) kwargs.update( @@ -78,7 +80,7 @@ class ApifyActorsTool(BaseTool): ) super().__init__(*args, **kwargs) - def _run(self, run_input: Dict[str, Any]) -> List[Dict[str, Any]]: + def _run(self, run_input: dict[str, Any]) -> list[dict[str, Any]]: """Run the Actor tool with the given input. Returns: diff --git a/lib/crewai-tools/src/crewai_tools/tools/arxiv_paper_tool/__init__.py b/lib/crewai-tools/src/crewai_tools/tools/arxiv_paper_tool/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/lib/crewai-tools/src/crewai_tools/tools/arxiv_paper_tool/arxiv_paper_tool.py b/lib/crewai-tools/src/crewai_tools/tools/arxiv_paper_tool/arxiv_paper_tool.py index 0bdb66d29..0c8a07f67 100644 --- a/lib/crewai-tools/src/crewai_tools/tools/arxiv_paper_tool/arxiv_paper_tool.py +++ b/lib/crewai-tools/src/crewai_tools/tools/arxiv_paper_tool/arxiv_paper_tool.py @@ -2,14 +2,14 @@ import logging from pathlib import Path import re import time -from typing import ClassVar, List, Optional, Type +from typing import ClassVar import urllib.error import urllib.parse import urllib.request import xml.etree.ElementTree as ET from crewai.tools import BaseTool, EnvVar -from pydantic import BaseModel, Field +from pydantic import BaseModel, ConfigDict, Field logger = logging.getLogger(__file__) @@ -32,10 +32,10 @@ class ArxivPaperTool(BaseTool): REQUEST_TIMEOUT: ClassVar[int] = 10 name: str = "Arxiv Paper Fetcher and Downloader" description: str = "Fetches metadata from Arxiv based on a search query and optionally downloads PDFs." - args_schema: Type[BaseModel] = ArxivToolInput - model_config = {"extra": "allow"} - package_dependencies: List[str] = ["pydantic"] - env_vars: List[EnvVar] = [] + args_schema: type[BaseModel] = ArxivToolInput + model_config = ConfigDict(extra="allow") + package_dependencies: list[str] = Field(default_factory=lambda: ["pydantic"]) + env_vars: list[EnvVar] = Field(default_factory=list) def __init__( self, download_pdfs=False, save_dir="./arxiv_pdfs", use_title_as_filename=False @@ -80,12 +80,12 @@ class ArxivPaperTool(BaseTool): logger.error(f"ArxivTool Error: {e!s}") return f"Failed to fetch or download Arxiv papers: {e!s}" - def fetch_arxiv_data(self, search_query: str, max_results: int) -> List[dict]: + def fetch_arxiv_data(self, search_query: str, max_results: int) -> list[dict]: api_url = f"{self.BASE_API_URL}?search_query={urllib.parse.quote(search_query)}&start=0&max_results={max_results}" logger.info(f"Fetching data from Arxiv API: {api_url}") try: - with urllib.request.urlopen( + with urllib.request.urlopen( # noqa: S310 api_url, timeout=self.REQUEST_TIMEOUT ) as response: if response.status != 200: @@ -95,7 +95,7 @@ class ArxivPaperTool(BaseTool): logger.error(f"Error fetching data from Arxiv: {e}") raise - root = ET.fromstring(data) + root = ET.fromstring(data) # noqa: S314 papers = [] for entry in root.findall(self.ATOM_NAMESPACE + "entry"): @@ -126,11 +126,11 @@ class ArxivPaperTool(BaseTool): return papers @staticmethod - def _get_element_text(entry: ET.Element, element_name: str) -> Optional[str]: + def _get_element_text(entry: ET.Element, element_name: str) -> str | None: elem = entry.find(f"{ArxivPaperTool.ATOM_NAMESPACE}{element_name}") return elem.text.strip() if elem is not None and elem.text else None - def _extract_pdf_url(self, entry: ET.Element) -> Optional[str]: + def _extract_pdf_url(self, entry: ET.Element) -> str | None: for link in entry.findall(self.ATOM_NAMESPACE + "link"): if link.attrib.get("title", "").lower() == "pdf": return link.attrib.get("href") @@ -164,7 +164,7 @@ class ArxivPaperTool(BaseTool): def download_pdf(self, pdf_url: str, save_path: str): try: logger.info(f"Downloading PDF from {pdf_url} to {save_path}") - urllib.request.urlretrieve(pdf_url, str(save_path)) + urllib.request.urlretrieve(pdf_url, str(save_path)) # noqa: S310 logger.info(f"PDF saved: {save_path}") except urllib.error.URLError as e: logger.error(f"Network error occurred while downloading {pdf_url}: {e}") diff --git a/lib/crewai-tools/src/crewai_tools/tools/brave_search_tool/brave_search_tool.py b/lib/crewai-tools/src/crewai_tools/tools/brave_search_tool/brave_search_tool.py index 208a5837e..f174299be 100644 --- a/lib/crewai-tools/src/crewai_tools/tools/brave_search_tool/brave_search_tool.py +++ b/lib/crewai-tools/src/crewai_tools/tools/brave_search_tool/brave_search_tool.py @@ -1,7 +1,7 @@ import datetime import os import time -from typing import Any, ClassVar, List, Optional, Type +from typing import Any, ClassVar from crewai.tools import BaseTool, EnvVar from pydantic import BaseModel, Field @@ -13,7 +13,6 @@ def _save_results_to_file(content: str) -> None: filename = f"search_results_{datetime.now().strftime('%Y-%m-%d_%H-%M-%S')}.txt" with open(filename, "w") as file: file.write(content) - print(f"Results saved to {filename}") class BraveSearchToolSchema(BaseModel): @@ -25,8 +24,7 @@ class BraveSearchToolSchema(BaseModel): class BraveSearchTool(BaseTool): - """ - BraveSearchTool - A tool for performing web searches using the Brave Search API. + """BraveSearchTool - A tool for performing web searches using the Brave Search API. This module provides functionality to search the internet using Brave's Search API, supporting customizable result counts and country-specific searches. @@ -41,18 +39,22 @@ class BraveSearchTool(BaseTool): description: str = ( "A tool that can be used to search the internet with a search_query." ) - args_schema: Type[BaseModel] = BraveSearchToolSchema + args_schema: type[BaseModel] = BraveSearchToolSchema search_url: str = "https://api.search.brave.com/res/v1/web/search" - country: Optional[str] = "" + country: str | None = "" n_results: int = 10 save_file: bool = False _last_request_time: ClassVar[float] = 0 _min_request_interval: ClassVar[float] = 1.0 # seconds - env_vars: List[EnvVar] = [ - EnvVar( - name="BRAVE_API_KEY", description="API key for Brave Search", required=True - ), - ] + env_vars: list[EnvVar] = Field( + default_factory=lambda: [ + EnvVar( + name="BRAVE_API_KEY", + description="API key for Brave Search", + required=True, + ), + ] + ) def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) @@ -89,7 +91,9 @@ class BraveSearchTool(BaseTool): "Accept": "application/json", } - response = requests.get(self.search_url, headers=headers, params=payload) + response = requests.get( + self.search_url, headers=headers, params=payload, timeout=30 + ) response.raise_for_status() # Handle non-200 responses results = response.json() @@ -108,7 +112,7 @@ class BraveSearchTool(BaseTool): ] ) ) - except KeyError: + except KeyError: # noqa: PERF203 continue content = "\n".join(string) 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 361d28ff3..1707cf19a 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 @@ -1,6 +1,6 @@ import asyncio import os -from typing import Any, Dict, Optional, Type +from typing import Any import aiohttp from crewai.tools import BaseTool @@ -23,7 +23,7 @@ class BrightDataConfig(BaseModel): ) -class BrightDataDatasetToolException(Exception): +class BrightDataDatasetToolException(Exception): # noqa: N818 """Exception raised for custom error in the application.""" def __init__(self, message, error_code): @@ -36,8 +36,7 @@ class BrightDataDatasetToolException(Exception): class BrightDataDatasetToolSchema(BaseModel): - """ - Schema for validating input parameters for the BrightDataDatasetTool. + """Schema for validating input parameters for the BrightDataDatasetTool. Attributes: dataset_type (str): Required Bright Data Dataset Type used to specify which dataset to access. @@ -48,12 +47,12 @@ class BrightDataDatasetToolSchema(BaseModel): """ dataset_type: str = Field(..., description="The Bright Data Dataset Type") - format: Optional[str] = Field( + format: str | None = Field( default="json", description="Response format (json by default)" ) url: str = Field(..., description="The URL to extract data from") - zipcode: Optional[str] = Field(default=None, description="Optional zipcode") - additional_params: Optional[Dict[str, Any]] = Field( + zipcode: str | None = Field(default=None, description="Optional zipcode") + additional_params: dict[str, Any] | None = Field( default=None, description="Additional params if any" ) @@ -399,8 +398,7 @@ datasets = [ class BrightDataDatasetTool(BaseTool): - """ - CrewAI-compatible tool for scraping structured data using Bright Data Datasets. + """CrewAI-compatible tool for scraping structured data using Bright Data Datasets. Attributes: name (str): Tool name displayed in the CrewAI environment. @@ -410,20 +408,20 @@ class BrightDataDatasetTool(BaseTool): name: str = "Bright Data Dataset Tool" description: str = "Scrapes structured data using Bright Data Dataset API from a URL and optional input parameters" - args_schema: Type[BaseModel] = BrightDataDatasetToolSchema - dataset_type: Optional[str] = None - url: Optional[str] = None + args_schema: type[BaseModel] = BrightDataDatasetToolSchema + dataset_type: str | None = None + url: str | None = None format: str = "json" - zipcode: Optional[str] = None - additional_params: Optional[Dict[str, Any]] = None + zipcode: str | None = None + additional_params: dict[str, Any] | None = None def __init__( self, - dataset_type: str = None, - url: str = None, + dataset_type: str | None = None, + url: str | None = None, format: str = "json", - zipcode: str = None, - additional_params: Dict[str, Any] = None, + zipcode: str | None = None, + additional_params: dict[str, Any] | None = None, ): super().__init__() self.dataset_type = dataset_type @@ -440,12 +438,11 @@ class BrightDataDatasetTool(BaseTool): dataset_type: str, output_format: str, url: str, - zipcode: Optional[str] = None, - additional_params: Optional[Dict[str, Any]] = None, + zipcode: str | None = None, + additional_params: dict[str, Any] | None = None, polling_interval: int = 1, - ) -> Dict: - """ - Asynchronously trigger and poll Bright Data dataset scraping. + ) -> dict: + """Asynchronously trigger and poll Bright Data dataset scraping. Args: dataset_type (str): Bright Data Dataset Type. @@ -500,7 +497,6 @@ class BrightDataDatasetTool(BaseTool): trigger_response.status, ) trigger_data = await trigger_response.json() - print(trigger_data) snapshot_id = trigger_data.get("snapshot_id") # Step 2: Poll for completion @@ -520,7 +516,6 @@ class BrightDataDatasetTool(BaseTool): ) status_data = await status_response.json() if status_data.get("status") == "ready": - print("Job is ready") break if status_data.get("status") == "error": raise BrightDataDatasetToolException( @@ -545,11 +540,11 @@ class BrightDataDatasetTool(BaseTool): def _run( self, - url: str = None, - dataset_type: str = None, - format: str = None, - zipcode: str = None, - additional_params: Dict[str, Any] = None, + url: str | None = None, + dataset_type: str | None = None, + format: str | None = None, + zipcode: str | None = None, + additional_params: dict[str, Any] | None = None, **kwargs: Any, ) -> Any: dataset_type = dataset_type or self.dataset_type 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 27537a5e5..1a110b052 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 @@ -1,5 +1,5 @@ import os -from typing import Any, Optional, Type +from typing import Any import urllib.parse from crewai.tools import BaseTool @@ -20,8 +20,7 @@ class BrightDataConfig(BaseModel): class BrightDataSearchToolSchema(BaseModel): - """ - Schema that defines the input arguments for the BrightDataSearchToolSchema. + """Schema that defines the input arguments for the BrightDataSearchToolSchema. Attributes: query (str): The search query to be executed (e.g., "latest AI news"). @@ -34,35 +33,34 @@ class BrightDataSearchToolSchema(BaseModel): """ query: str = Field(..., description="Search query to perform") - search_engine: Optional[str] = Field( + search_engine: str | None = Field( default="google", description="Search engine domain (e.g., 'google', 'bing', 'yandex')", ) - country: Optional[str] = Field( + country: str | None = Field( default="us", description="Two-letter country code for geo-targeting (e.g., 'us', 'gb')", ) - language: Optional[str] = Field( + language: str | None = Field( default="en", description="Language code (e.g., 'en', 'es') used in the query URL", ) - search_type: Optional[str] = Field( + search_type: str | None = Field( default=None, description="Type of search (e.g., 'isch' for images, 'nws' for news)", ) - device_type: Optional[str] = Field( + device_type: str | None = Field( default="desktop", description="Device type to simulate (e.g., 'mobile', 'desktop', 'ios')", ) - parse_results: Optional[bool] = Field( + parse_results: bool | None = Field( default=True, description="Whether to parse and return JSON (True) or raw HTML/text (False)", ) class BrightDataSearchTool(BaseTool): - """ - A web search tool that utilizes Bright Data's SERP API to perform queries and return either structured results + """A web search tool that utilizes Bright Data's SERP API to perform queries and return either structured results or raw page content from search engines like Google or Bing. Attributes: @@ -79,26 +77,26 @@ class BrightDataSearchTool(BaseTool): name: str = "Bright Data SERP Search" description: str = "Tool to perform web search using Bright Data SERP API." - args_schema: Type[BaseModel] = BrightDataSearchToolSchema + args_schema: type[BaseModel] = BrightDataSearchToolSchema _config = BrightDataConfig.from_env() base_url: str = "" api_key: str = "" zone: str = "" - query: Optional[str] = None + query: str | None = None search_engine: str = "google" country: str = "us" language: str = "en" - search_type: Optional[str] = None + search_type: str | None = None device_type: str = "desktop" parse_results: bool = True def __init__( self, - query: str = None, + query: str | None = None, search_engine: str = "google", country: str = "us", language: str = "en", - search_type: str = None, + search_type: str | None = None, device_type: str = "desktop", parse_results: bool = True, ): @@ -128,17 +126,16 @@ class BrightDataSearchTool(BaseTool): def _run( self, - query: str = None, - search_engine: str = None, - country: str = None, - language: str = None, - search_type: str = None, - device_type: str = None, - parse_results: bool = None, + query: str | None = None, + search_engine: str | None = None, + country: str | None = None, + language: str | None = None, + search_type: str | None = None, + device_type: str | None = None, + parse_results: bool | None = None, **kwargs, ) -> Any: - """ - Executes a search query using Bright Data SERP API and returns results. + """Executes a search query using Bright Data SERP API and returns results. Args: query (str): The search query string (URL encoded internally). @@ -153,7 +150,6 @@ class BrightDataSearchTool(BaseTool): Returns: dict or str: Parsed JSON data from Bright Data if available, otherwise error message. """ - query = query or self.query search_engine = search_engine or self.search_engine country = country or self.country @@ -218,10 +214,9 @@ class BrightDataSearchTool(BaseTool): try: response = requests.post( - self.base_url, json=request_params, headers=headers + self.base_url, json=request_params, headers=headers, timeout=30 ) - print(f"Status code: {response.status_code}") response.raise_for_status() return response.text 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 8691dff16..10a222782 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,5 +1,5 @@ import os -from typing import Any, Optional, Type +from typing import Any from crewai.tools import BaseTool from pydantic import BaseModel, Field @@ -19,8 +19,7 @@ class BrightDataConfig(BaseModel): class BrightDataUnlockerToolSchema(BaseModel): - """ - Pydantic schema for input parameters used by the BrightDataWebUnlockerTool. + """Pydantic schema for input parameters used by the BrightDataWebUnlockerTool. This schema defines the structure and validation for parameters passed when performing a web scraping request using Bright Data's Web Unlocker. @@ -32,17 +31,16 @@ class BrightDataUnlockerToolSchema(BaseModel): """ url: str = Field(..., description="URL to perform the web scraping") - format: Optional[str] = Field( + format: str | None = Field( default="raw", description="Response format (raw is standard)" ) - data_format: Optional[str] = Field( + data_format: str | None = Field( default="markdown", description="Response data format (html by default)" ) class BrightDataWebUnlockerTool(BaseTool): - """ - A tool for performing web scraping using the Bright Data Web Unlocker API. + """A tool for performing web scraping using the Bright Data Web Unlocker API. This tool allows automated and programmatic access to web pages by routing requests through Bright Data's unlocking and proxy infrastructure, which can bypass bot @@ -63,17 +61,17 @@ class BrightDataWebUnlockerTool(BaseTool): name: str = "Bright Data Web Unlocker Scraping" description: str = "Tool to perform web scraping using Bright Data Web Unlocker" - args_schema: Type[BaseModel] = BrightDataUnlockerToolSchema + args_schema: type[BaseModel] = BrightDataUnlockerToolSchema _config = BrightDataConfig.from_env() base_url: str = "" api_key: str = "" zone: str = "" - url: Optional[str] = None + url: str | None = None format: str = "raw" data_format: str = "markdown" def __init__( - self, url: str = None, format: str = "raw", data_format: str = "markdown" + self, url: str | None = None, format: str = "raw", data_format: str = "markdown" ): super().__init__() self.base_url = self._config.API_URL @@ -90,9 +88,9 @@ class BrightDataWebUnlockerTool(BaseTool): def _run( self, - url: str = None, - format: str = None, - data_format: str = None, + url: str | None = None, + format: str | None = None, + data_format: str | None = None, **kwargs: Any, ) -> Any: url = url or self.url @@ -122,8 +120,9 @@ class BrightDataWebUnlockerTool(BaseTool): } try: - response = requests.post(self.base_url, json=payload, headers=headers) - print(f"Status Code: {response.status_code}") + response = requests.post( + self.base_url, json=payload, headers=headers, timeout=30 + ) response.raise_for_status() return response.text diff --git a/lib/crewai-tools/src/crewai_tools/tools/browserbase_load_tool/__init__.py b/lib/crewai-tools/src/crewai_tools/tools/browserbase_load_tool/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/lib/crewai-tools/src/crewai_tools/tools/browserbase_load_tool/browserbase_load_tool.py b/lib/crewai-tools/src/crewai_tools/tools/browserbase_load_tool/browserbase_load_tool.py index 2d3229e2b..ce9733e03 100644 --- a/lib/crewai-tools/src/crewai_tools/tools/browserbase_load_tool/browserbase_load_tool.py +++ b/lib/crewai-tools/src/crewai_tools/tools/browserbase_load_tool/browserbase_load_tool.py @@ -1,5 +1,5 @@ import os -from typing import Any, List, Optional, Type +from typing import Any from crewai.tools import BaseTool, EnvVar from pydantic import BaseModel, Field @@ -12,34 +12,36 @@ class BrowserbaseLoadToolSchema(BaseModel): class BrowserbaseLoadTool(BaseTool): name: str = "Browserbase web load tool" description: str = "Load webpages url in a headless browser using Browserbase and return the contents" - args_schema: Type[BaseModel] = BrowserbaseLoadToolSchema - api_key: Optional[str] = os.getenv("BROWSERBASE_API_KEY") - project_id: Optional[str] = os.getenv("BROWSERBASE_PROJECT_ID") - text_content: Optional[bool] = False - session_id: Optional[str] = None - proxy: Optional[bool] = None - browserbase: Optional[Any] = None - package_dependencies: List[str] = ["browserbase"] - env_vars: List[EnvVar] = [ - EnvVar( - name="BROWSERBASE_API_KEY", - description="API key for Browserbase services", - required=False, - ), - EnvVar( - name="BROWSERBASE_PROJECT_ID", - description="Project ID for Browserbase services", - required=False, - ), - ] + args_schema: type[BaseModel] = BrowserbaseLoadToolSchema + api_key: str | None = os.getenv("BROWSERBASE_API_KEY") + project_id: str | None = os.getenv("BROWSERBASE_PROJECT_ID") + text_content: bool | None = False + session_id: str | None = None + proxy: bool | None = None + browserbase: Any | None = None + package_dependencies: list[str] = Field(default_factory=lambda: ["browserbase"]) + env_vars: list[EnvVar] = Field( + default_factory=lambda: [ + EnvVar( + name="BROWSERBASE_API_KEY", + description="API key for Browserbase services", + required=False, + ), + EnvVar( + name="BROWSERBASE_PROJECT_ID", + description="Project ID for Browserbase services", + required=False, + ), + ] + ) def __init__( self, - api_key: Optional[str] = None, - project_id: Optional[str] = None, - text_content: Optional[bool] = False, - session_id: Optional[str] = None, - proxy: Optional[bool] = None, + api_key: str | None = None, + project_id: str | None = None, + text_content: bool | None = False, + session_id: str | None = None, + proxy: bool | None = None, **kwargs, ): super().__init__(**kwargs) @@ -57,12 +59,12 @@ class BrowserbaseLoadTool(BaseTool): ): import subprocess - subprocess.run(["uv", "add", "browserbase"], check=True) + subprocess.run(["uv", "add", "browserbase"], check=True) # noqa: S607 from browserbase import Browserbase # type: ignore else: raise ImportError( "`browserbase` package not found, please run `uv add browserbase`" - ) + ) from None self.browserbase = Browserbase(api_key=self.api_key) self.text_content = text_content diff --git a/lib/crewai-tools/src/crewai_tools/tools/code_docs_search_tool/__init__.py b/lib/crewai-tools/src/crewai_tools/tools/code_docs_search_tool/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/lib/crewai-tools/src/crewai_tools/tools/code_docs_search_tool/code_docs_search_tool.py b/lib/crewai-tools/src/crewai_tools/tools/code_docs_search_tool/code_docs_search_tool.py index ef4cbc0a8..49d5d2356 100644 --- a/lib/crewai-tools/src/crewai_tools/tools/code_docs_search_tool/code_docs_search_tool.py +++ b/lib/crewai-tools/src/crewai_tools/tools/code_docs_search_tool/code_docs_search_tool.py @@ -1,7 +1,6 @@ -from typing import Optional, Type +from pydantic import BaseModel, Field from crewai_tools.rag.data_types import DataType -from pydantic import BaseModel, Field from ..rag.rag_tool import RagTool @@ -26,9 +25,9 @@ class CodeDocsSearchTool(RagTool): description: str = ( "A tool that can be used to semantic search a query from a Code Docs content." ) - args_schema: Type[BaseModel] = CodeDocsSearchToolSchema + args_schema: type[BaseModel] = CodeDocsSearchToolSchema - def __init__(self, docs_url: Optional[str] = None, **kwargs): + def __init__(self, docs_url: str | None = None, **kwargs): super().__init__(**kwargs) if docs_url is not None: self.add(docs_url) @@ -42,7 +41,7 @@ class CodeDocsSearchTool(RagTool): def _run( self, search_query: str, - docs_url: Optional[str] = None, + docs_url: str | None = None, similarity_threshold: float | None = None, limit: int | None = None, ) -> str: diff --git a/lib/crewai-tools/src/crewai_tools/tools/code_interpreter_tool/__init__.py b/lib/crewai-tools/src/crewai_tools/tools/code_interpreter_tool/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/lib/crewai-tools/src/crewai_tools/tools/code_interpreter_tool/code_interpreter_tool.py b/lib/crewai-tools/src/crewai_tools/tools/code_interpreter_tool/code_interpreter_tool.py index 73d8d8819..50f1f9c5f 100644 --- a/lib/crewai-tools/src/crewai_tools/tools/code_interpreter_tool/code_interpreter_tool.py +++ b/lib/crewai-tools/src/crewai_tools/tools/code_interpreter_tool/code_interpreter_tool.py @@ -8,15 +8,16 @@ potentially unsafe operations and importing restricted modules. import importlib.util import os from types import ModuleType -from typing import Any, Dict, List, Optional, Type +from typing import Any, ClassVar from crewai.tools import BaseTool -from crewai_tools.printer import Printer from docker import DockerClient, from_env as docker_from_env from docker.errors import ImageNotFound, NotFound from docker.models.containers import Container from pydantic import BaseModel, Field +from crewai_tools.printer import Printer + class CodeInterpreterSchema(BaseModel): """Schema for defining inputs to the CodeInterpreterTool. @@ -30,7 +31,7 @@ class CodeInterpreterSchema(BaseModel): description="Python3 code used to be interpreted in the Docker container. ALWAYS PRINT the final result and the output of the code", ) - libraries_used: List[str] = Field( + libraries_used: list[str] = Field( ..., description="List of libraries used in the code with proper installing names separated by commas. Example: numpy,pandas,beautifulsoup4", ) @@ -44,7 +45,7 @@ class SandboxPython: environment where harmful operations are blocked. """ - BLOCKED_MODULES = { + BLOCKED_MODULES: ClassVar[set[str]] = { "os", "sys", "subprocess", @@ -56,7 +57,7 @@ class SandboxPython: "builtins", } - UNSAFE_BUILTINS = { + UNSAFE_BUILTINS: ClassVar[set[str]] = { "exec", "eval", "open", @@ -72,9 +73,9 @@ class SandboxPython: @staticmethod def restricted_import( name: str, - custom_globals: Optional[Dict[str, Any]] = None, - custom_locals: Optional[Dict[str, Any]] = None, - fromlist: Optional[List[str]] = None, + custom_globals: dict[str, Any] | None = None, + custom_locals: dict[str, Any] | None = None, + fromlist: list[str] | None = None, level: int = 0, ) -> ModuleType: """A restricted import function that blocks importing of unsafe modules. @@ -97,7 +98,7 @@ class SandboxPython: return __import__(name, custom_globals, custom_locals, fromlist or (), level) @staticmethod - def safe_builtins() -> Dict[str, Any]: + def safe_builtins() -> dict[str, Any]: """Creates a dictionary of built-in functions with unsafe ones removed. Returns: @@ -114,14 +115,14 @@ class SandboxPython: return safe_builtins @staticmethod - def exec(code: str, locals: Dict[str, Any]) -> None: + def exec(code: str, locals: dict[str, Any]) -> None: """Executes Python code in a restricted environment. Args: code: The Python code to execute as a string. locals: A dictionary that will be used for local variable storage. """ - exec(code, {"__builtins__": SandboxPython.safe_builtins()}, locals) + exec(code, {"__builtins__": SandboxPython.safe_builtins()}, locals) # noqa: S102 class CodeInterpreterTool(BaseTool): @@ -134,11 +135,11 @@ class CodeInterpreterTool(BaseTool): name: str = "Code Interpreter" description: str = "Interprets Python3 code strings with a final print statement." - args_schema: Type[BaseModel] = CodeInterpreterSchema + args_schema: type[BaseModel] = CodeInterpreterSchema default_image_tag: str = "code-interpreter:latest" - code: Optional[str] = None - user_dockerfile_path: Optional[str] = None - user_docker_base_url: Optional[str] = None + code: str | None = None + user_dockerfile_path: str | None = None + user_docker_base_url: str | None = None unsafe_mode: bool = False @staticmethod @@ -160,7 +161,6 @@ class CodeInterpreterTool(BaseTool): Raises: FileNotFoundError: If the Dockerfile cannot be found. """ - client = ( docker_from_env() if self.user_docker_base_url is None @@ -181,7 +181,7 @@ class CodeInterpreterTool(BaseTool): if not os.path.exists(dockerfile_path): raise FileNotFoundError( f"Dockerfile not found in {dockerfile_path}" - ) + ) from None client.images.build( path=dockerfile_path, @@ -205,7 +205,7 @@ class CodeInterpreterTool(BaseTool): return self.run_code_unsafe(code, libraries_used) return self.run_code_safety(code, libraries_used) - def _install_libraries(self, container: Container, libraries: List[str]) -> None: + def _install_libraries(self, container: Container, libraries: list[str]) -> None: """Installs required Python libraries in the Docker container. Args: @@ -258,7 +258,7 @@ class CodeInterpreterTool(BaseTool): try: subprocess.run( - ["docker", "info"], + ["docker", "info"], # noqa: S607 check=True, stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL, @@ -275,7 +275,7 @@ class CodeInterpreterTool(BaseTool): Printer.print("Docker is not installed", color="bold_purple") return False - def run_code_safety(self, code: str, libraries_used: List[str]) -> str: + def run_code_safety(self, code: str, libraries_used: list[str]) -> str: """Runs code in the safest available environment. Attempts to run code in Docker if available, falls back to a restricted @@ -292,7 +292,7 @@ class CodeInterpreterTool(BaseTool): return self.run_code_in_docker(code, libraries_used) return self.run_code_in_restricted_sandbox(code) - def run_code_in_docker(self, code: str, libraries_used: List[str]) -> str: + def run_code_in_docker(self, code: str, libraries_used: list[str]) -> str: """Runs Python code in a Docker container for safe isolation. Creates a Docker container, installs the required libraries, executes the code, @@ -340,7 +340,7 @@ class CodeInterpreterTool(BaseTool): except Exception as e: return f"An error occurred: {e!s}" - def run_code_unsafe(self, code: str, libraries_used: List[str]) -> str: + def run_code_unsafe(self, code: str, libraries_used: list[str]) -> str: """Runs code directly on the host machine without any safety restrictions. WARNING: This mode is unsafe and should only be used in trusted environments @@ -354,16 +354,15 @@ class CodeInterpreterTool(BaseTool): The value of the 'result' variable from the executed code, or an error message if execution failed. """ - Printer.print("WARNING: Running code in unsafe mode", color="bold_magenta") # Install libraries on the host machine for library in libraries_used: - os.system(f"pip install {library}") + os.system(f"pip install {library}") # noqa: S605 # Execute the code try: exec_locals = {} - exec(code, {}, exec_locals) + exec(code, {}, exec_locals) # noqa: S102 return exec_locals.get("result", "No result variable found.") except Exception as e: return f"An error occurred: {e!s}" diff --git a/lib/crewai-tools/src/crewai_tools/tools/composio_tool/__init__.py b/lib/crewai-tools/src/crewai_tools/tools/composio_tool/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/lib/crewai-tools/src/crewai_tools/tools/composio_tool/composio_tool.py b/lib/crewai-tools/src/crewai_tools/tools/composio_tool/composio_tool.py index fa5419daf..bae5194b4 100644 --- a/lib/crewai-tools/src/crewai_tools/tools/composio_tool/composio_tool.py +++ b/lib/crewai-tools/src/crewai_tools/tools/composio_tool/composio_tool.py @@ -1,10 +1,9 @@ -""" -Composio tools wrapper. -""" +"""Composio tools wrapper.""" import typing as t from crewai.tools import BaseTool, EnvVar +from pydantic import Field import typing_extensions as te @@ -12,13 +11,15 @@ 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, - ), - ] + env_vars: list[EnvVar] = Field( + default_factory=lambda: [ + 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.""" @@ -35,7 +36,7 @@ class ComposioTool(BaseTool): return connections = t.cast( - t.List[ConnectedAccountModel], + list[ConnectedAccountModel], toolset.client.connected_accounts.get(), ) if tool.app not in [connection.appUniqueId for connection in connections]: @@ -51,7 +52,6 @@ class ComposioTool(BaseTool): **kwargs: t.Any, ) -> te.Self: """Wrap a composio tool as crewAI tool.""" - from composio import Action, ComposioToolSet from composio.constants import DEFAULT_ENTITY_ID from composio.utils.shared import json_schema_to_model @@ -70,7 +70,7 @@ class ComposioTool(BaseTool): schema = action_schema.model_dump(exclude_none=True) entity_id = kwargs.pop("entity_id", DEFAULT_ENTITY_ID) - def function(**kwargs: t.Any) -> t.Dict: + def function(**kwargs: t.Any) -> dict: """Wrapper function for composio action.""" return toolset.execute_action( action=Action(schema["name"]), @@ -97,10 +97,10 @@ class ComposioTool(BaseTool): def from_app( cls, *apps: t.Any, - tags: t.Optional[t.List[str]] = None, - use_case: t.Optional[str] = None, + tags: list[str] | None = None, + use_case: str | None = None, **kwargs: t.Any, - ) -> t.List[te.Self]: + ) -> list[te.Self]: """Create toolset from an app.""" if len(apps) == 0: raise ValueError("You need to provide at least one app name") diff --git a/lib/crewai-tools/src/crewai_tools/tools/contextualai_create_agent_tool/__init__.py b/lib/crewai-tools/src/crewai_tools/tools/contextualai_create_agent_tool/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/lib/crewai-tools/src/crewai_tools/tools/contextualai_create_agent_tool/contextual_create_agent_tool.py b/lib/crewai-tools/src/crewai_tools/tools/contextualai_create_agent_tool/contextual_create_agent_tool.py index c859550bd..add80f928 100644 --- a/lib/crewai-tools/src/crewai_tools/tools/contextualai_create_agent_tool/contextual_create_agent_tool.py +++ b/lib/crewai-tools/src/crewai_tools/tools/contextualai_create_agent_tool/contextual_create_agent_tool.py @@ -1,4 +1,4 @@ -from typing import Any, List, Type +from typing import Any from crewai.tools import BaseTool from pydantic import BaseModel, Field @@ -10,7 +10,7 @@ class ContextualAICreateAgentSchema(BaseModel): agent_name: str = Field(..., description="Name for the new agent") agent_description: str = Field(..., description="Description for the new agent") datastore_name: str = Field(..., description="Name for the new datastore") - document_paths: List[str] = Field(..., description="List of file paths to upload") + document_paths: list[str] = Field(..., description="List of file paths to upload") class ContextualAICreateAgentTool(BaseTool): @@ -20,11 +20,13 @@ class ContextualAICreateAgentTool(BaseTool): description: str = ( "Create a new Contextual AI RAG agent with documents and datastore" ) - args_schema: Type[BaseModel] = ContextualAICreateAgentSchema + args_schema: type[BaseModel] = ContextualAICreateAgentSchema api_key: str contextual_client: Any = None - package_dependencies: List[str] = ["contextual-client"] + package_dependencies: list[str] = Field( + default_factory=lambda: ["contextual-client"] + ) def __init__(self, **kwargs): super().__init__(**kwargs) @@ -32,17 +34,17 @@ class ContextualAICreateAgentTool(BaseTool): from contextual import ContextualAI self.contextual_client = ContextualAI(api_key=self.api_key) - except ImportError: + except ImportError as e: raise ImportError( "contextual-client package is required. Install it with: pip install contextual-client" - ) + ) from e def _run( self, agent_name: str, agent_description: str, datastore_name: str, - document_paths: List[str], + document_paths: list[str], ) -> str: """Create a complete RAG pipeline with documents.""" try: diff --git a/lib/crewai-tools/src/crewai_tools/tools/contextualai_parse_tool/__init__.py b/lib/crewai-tools/src/crewai_tools/tools/contextualai_parse_tool/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/lib/crewai-tools/src/crewai_tools/tools/contextualai_parse_tool/contextual_parse_tool.py b/lib/crewai-tools/src/crewai_tools/tools/contextualai_parse_tool/contextual_parse_tool.py index bcd617cf9..1a0317172 100644 --- a/lib/crewai-tools/src/crewai_tools/tools/contextualai_parse_tool/contextual_parse_tool.py +++ b/lib/crewai-tools/src/crewai_tools/tools/contextualai_parse_tool/contextual_parse_tool.py @@ -1,5 +1,3 @@ -from typing import List, Optional, Type - from crewai.tools import BaseTool from pydantic import BaseModel, Field @@ -15,10 +13,10 @@ class ContextualAIParseSchema(BaseModel): enable_document_hierarchy: bool = Field( default=True, description="Enable document hierarchy" ) - page_range: Optional[str] = Field( + page_range: str | None = Field( default=None, description="Page range to parse (e.g., '0-5')" ) - output_types: List[str] = Field( + output_types: list[str] = Field( default=["markdown-per-page"], description="List of output types" ) @@ -28,10 +26,12 @@ class ContextualAIParseTool(BaseTool): name: str = "Contextual AI Document Parser" description: str = "Parse documents using Contextual AI's advanced document parser" - args_schema: Type[BaseModel] = ContextualAIParseSchema + args_schema: type[BaseModel] = ContextualAIParseSchema api_key: str - package_dependencies: List[str] = ["contextual-client"] + package_dependencies: list[str] = Field( + default_factory=lambda: ["contextual-client"] + ) def _run( self, @@ -39,10 +39,12 @@ class ContextualAIParseTool(BaseTool): parse_mode: str = "standard", figure_caption_mode: str = "concise", enable_document_hierarchy: bool = True, - page_range: Optional[str] = None, - output_types: List[str] = ["markdown-per-page"], + page_range: str | None = None, + output_types: list[str] | None = None, ) -> str: """Parse a document using Contextual AI's parser.""" + if output_types is None: + output_types = ["markdown-per-page"] try: import json import os @@ -72,14 +74,16 @@ class ContextualAIParseTool(BaseTool): with open(file_path, "rb") as fp: file = {"raw_file": fp} - result = requests.post(url, headers=headers, data=config, files=file) + result = requests.post( + url, headers=headers, data=config, files=file, timeout=30 + ) response = json.loads(result.text) job_id = response["job_id"] # Monitor job status status_url = f"{base_url}/parse/jobs/{job_id}/status" while True: - result = requests.get(status_url, headers=headers) + result = requests.get(status_url, headers=headers, timeout=30) parse_response = json.loads(result.text)["status"] if parse_response == "completed": @@ -95,6 +99,7 @@ class ContextualAIParseTool(BaseTool): results_url, headers=headers, params={"output_types": ",".join(output_types)}, + timeout=30, ) return json.dumps(json.loads(result.text), indent=2) diff --git a/lib/crewai-tools/src/crewai_tools/tools/contextualai_query_tool/__init__.py b/lib/crewai-tools/src/crewai_tools/tools/contextualai_query_tool/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/lib/crewai-tools/src/crewai_tools/tools/contextualai_query_tool/contextual_query_tool.py b/lib/crewai-tools/src/crewai_tools/tools/contextualai_query_tool/contextual_query_tool.py index c357475e4..7a5ca7603 100644 --- a/lib/crewai-tools/src/crewai_tools/tools/contextualai_query_tool/contextual_query_tool.py +++ b/lib/crewai-tools/src/crewai_tools/tools/contextualai_query_tool/contextual_query_tool.py @@ -1,5 +1,5 @@ import asyncio -from typing import Any, List, Optional, Type +from typing import Any from crewai.tools import BaseTool from pydantic import BaseModel, Field @@ -11,7 +11,7 @@ class ContextualAIQuerySchema(BaseModel): query: str = Field(..., description="Query to send to the Contextual AI agent.") agent_id: str = Field(..., description="ID of the Contextual AI agent to query") - datastore_id: Optional[str] = Field( + datastore_id: str | None = Field( None, description="Optional datastore ID for document readiness verification" ) @@ -23,11 +23,13 @@ class ContextualAIQueryTool(BaseTool): description: str = ( "Use this tool to query a Contextual AI RAG agent with access to your documents" ) - args_schema: Type[BaseModel] = ContextualAIQuerySchema + args_schema: type[BaseModel] = ContextualAIQuerySchema api_key: str contextual_client: Any = None - package_dependencies: List[str] = ["contextual-client"] + package_dependencies: list[str] = Field( + default_factory=lambda: ["contextual-client"] + ) def __init__(self, **kwargs): super().__init__(**kwargs) @@ -35,16 +37,16 @@ class ContextualAIQueryTool(BaseTool): from contextual import ContextualAI self.contextual_client = ContextualAI(api_key=self.api_key) - except ImportError: + except ImportError as e: raise ImportError( "contextual-client package is required. Install it with: pip install contextual-client" - ) + ) from e def _check_documents_ready(self, datastore_id: str) -> bool: """Synchronous check if all documents are ready.""" url = f"https://api.contextual.ai/v1/datastores/{datastore_id}/documents" headers = {"Authorization": f"Bearer {self.api_key}"} - response = requests.get(url, headers=headers) + response = requests.get(url, headers=headers, timeout=30) if response.status_code == 200: data = response.json() documents = data.get("documents", []) @@ -57,17 +59,14 @@ class ContextualAIQueryTool(BaseTool): self, datastore_id: str, max_attempts: int = 20, interval: float = 30.0 ) -> bool: """Asynchronously poll until documents are ready, exiting early if possible.""" - for attempt in range(max_attempts): + for _attempt in range(max_attempts): ready = await asyncio.to_thread(self._check_documents_ready, datastore_id) if ready: return True await asyncio.sleep(interval) - print("Processing documents ...") return True # give up but don't fail hard - def _run( - self, query: str, agent_id: str, datastore_id: Optional[str] = None - ) -> str: + def _run(self, query: str, agent_id: str, datastore_id: str | None = None) -> str: if not agent_id: raise ValueError("Agent ID is required to query the Contextual AI agent") @@ -89,14 +88,12 @@ class ContextualAIQueryTool(BaseTool): loop.run_until_complete( self._wait_for_documents_async(datastore_id) ) - except Exception as e: - print(f"Failed to apply nest_asyncio: {e!s}") + except Exception: # noqa: S110 + pass else: asyncio.run(self._wait_for_documents_async(datastore_id)) else: - print( - "Warning: No datastore_id provided. Document status checking disabled." - ) + pass try: response = self.contextual_client.agents.query.create( diff --git a/lib/crewai-tools/src/crewai_tools/tools/contextualai_rerank_tool/__init__.py b/lib/crewai-tools/src/crewai_tools/tools/contextualai_rerank_tool/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/lib/crewai-tools/src/crewai_tools/tools/contextualai_rerank_tool/contextual_rerank_tool.py b/lib/crewai-tools/src/crewai_tools/tools/contextualai_rerank_tool/contextual_rerank_tool.py index 0a1425cdc..b78e1d907 100644 --- a/lib/crewai-tools/src/crewai_tools/tools/contextualai_rerank_tool/contextual_rerank_tool.py +++ b/lib/crewai-tools/src/crewai_tools/tools/contextualai_rerank_tool/contextual_rerank_tool.py @@ -1,5 +1,3 @@ -from typing import List, Optional, Type - from crewai.tools import BaseTool from pydantic import BaseModel, Field @@ -8,11 +6,11 @@ class ContextualAIRerankSchema(BaseModel): """Schema for contextual rerank tool.""" query: str = Field(..., description="The search query to rerank documents against") - documents: List[str] = Field(..., description="List of document texts to rerank") - instruction: Optional[str] = Field( + documents: list[str] = Field(..., description="List of document texts to rerank") + instruction: str | None = Field( default=None, description="Optional instruction for reranking behavior" ) - metadata: Optional[List[str]] = Field( + metadata: list[str] | None = Field( default=None, description="Optional metadata for each document" ) model: str = Field( @@ -27,17 +25,19 @@ class ContextualAIRerankTool(BaseTool): description: str = ( "Rerank documents using Contextual AI's instruction-following reranker" ) - args_schema: Type[BaseModel] = ContextualAIRerankSchema + args_schema: type[BaseModel] = ContextualAIRerankSchema api_key: str - package_dependencies: List[str] = ["contextual-client"] + package_dependencies: list[str] = Field( + default_factory=lambda: ["contextual-client"] + ) def _run( self, query: str, - documents: List[str], - instruction: Optional[str] = None, - metadata: Optional[List[str]] = None, + documents: list[str], + instruction: str | None = None, + metadata: list[str] | None = None, model: str = "ctxl-rerank-en-v1-instruct", ) -> str: """Rerank documents using Contextual AI's instruction-following reranker.""" @@ -66,7 +66,9 @@ class ContextualAIRerankTool(BaseTool): payload["metadata"] = metadata rerank_url = f"{base_url}/rerank" - result = requests.post(rerank_url, json=payload, headers=headers) + result = requests.post( + rerank_url, json=payload, headers=headers, timeout=30 + ) if result.status_code != 200: raise RuntimeError( diff --git a/lib/crewai-tools/src/crewai_tools/tools/couchbase_tool/__init__.py b/lib/crewai-tools/src/crewai_tools/tools/couchbase_tool/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/lib/crewai-tools/src/crewai_tools/tools/couchbase_tool/couchbase_tool.py b/lib/crewai-tools/src/crewai_tools/tools/couchbase_tool/couchbase_tool.py index c0f8e8061..4c13fd1e7 100644 --- a/lib/crewai-tools/src/crewai_tools/tools/couchbase_tool/couchbase_tool.py +++ b/lib/crewai-tools/src/crewai_tools/tools/couchbase_tool/couchbase_tool.py @@ -1,5 +1,6 @@ +from collections.abc import Callable import json -from typing import Any, Callable, Dict, List, Optional, Type +from typing import Any try: @@ -18,7 +19,7 @@ except ImportError: VectorSearch = Any from crewai.tools import BaseTool -from pydantic import BaseModel, Field, SkipValidation +from pydantic import BaseModel, ConfigDict, Field, SkipValidation class CouchbaseToolSchema(BaseModel): @@ -31,35 +32,35 @@ class CouchbaseToolSchema(BaseModel): class CouchbaseFTSVectorSearchTool(BaseTool): - """Tool to search the Couchbase database""" + """Tool to search the Couchbase database.""" - model_config = {"arbitrary_types_allowed": True} + model_config = ConfigDict(arbitrary_types_allowed=True) name: str = "CouchbaseFTSVectorSearchTool" description: str = "A tool to search the Couchbase database for relevant information on internal documents." - args_schema: Type[BaseModel] = CouchbaseToolSchema - cluster: SkipValidation[Optional[Cluster]] = None - collection_name: Optional[str] = (None,) - scope_name: Optional[str] = (None,) - bucket_name: Optional[str] = (None,) - index_name: Optional[str] = (None,) - embedding_key: Optional[str] = Field( + args_schema: type[BaseModel] = CouchbaseToolSchema + cluster: SkipValidation[Cluster | None] = None + collection_name: str | None = (None,) + scope_name: str | None = (None,) + bucket_name: str | None = (None,) + index_name: str | None = (None,) + embedding_key: str | None = Field( default="embedding", description="Name of the field in the search index that stores the vector", ) - scoped_index: Optional[bool] = ( + scoped_index: bool | None = ( Field( default=True, description="Specify whether the index is scoped. Is True by default.", ), ) - limit: Optional[int] = Field(default=3) - embedding_function: SkipValidation[Callable[[str], List[float]]] = Field( + limit: int | None = Field(default=3) + embedding_function: SkipValidation[Callable[[str], list[float]]] = Field( default=None, description="A function that takes a string and returns a list of floats. This is used to embed the query before searching the database.", ) def _check_bucket_exists(self) -> bool: - """Check if the bucket exists in the linked Couchbase cluster""" + """Check if the bucket exists in the linked Couchbase cluster.""" bucket_manager = self.cluster.buckets() try: bucket_manager.get_bucket(self.bucket_name) @@ -69,8 +70,9 @@ class CouchbaseFTSVectorSearchTool(BaseTool): def _check_scope_and_collection_exists(self) -> bool: """Check if the scope and collection exists in the linked Couchbase bucket - Raises a ValueError if either is not found""" - scope_collection_map: Dict[str, Any] = {} + Raises a ValueError if either is not found. + """ + scope_collection_map: dict[str, Any] = {} # Get a list of all scopes in the bucket for scope in self._bucket.collections().get_all_scopes(): @@ -98,7 +100,8 @@ class CouchbaseFTSVectorSearchTool(BaseTool): def _check_index_exists(self) -> bool: """Check if the Search index exists in the linked Couchbase cluster - Raises a ValueError if the index does not exist""" + Raises a ValueError if the index does not exist. + """ if self.scoped_index: all_indexes = [ index.name for index in self._scope.search_indexes().get_all_indexes() @@ -182,7 +185,7 @@ class CouchbaseFTSVectorSearchTool(BaseTool): ): import subprocess - subprocess.run(["uv", "add", "couchbase"], check=True) + subprocess.run(["uv", "add", "couchbase"], check=True) # noqa: S607 else: raise ImportError( "The 'couchbase' package is required to use the CouchbaseFTSVectorSearchTool. " @@ -230,7 +233,7 @@ class CouchbaseFTSVectorSearchTool(BaseTool): json_response = [] for row in search_iter.rows(): - json_response.append(row.fields) + json_response.append(row.fields) # noqa: PERF401 except Exception as e: return f"Search failed with error: {e}" diff --git a/lib/crewai-tools/src/crewai_tools/tools/crewai_enterprise_tools/__init__.py b/lib/crewai-tools/src/crewai_tools/tools/crewai_enterprise_tools/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/lib/crewai-tools/src/crewai_tools/tools/crewai_enterprise_tools/crewai_enterprise_tools.py b/lib/crewai-tools/src/crewai_tools/tools/crewai_enterprise_tools/crewai_enterprise_tools.py index f93038047..0d2d72dc5 100644 --- a/lib/crewai-tools/src/crewai_tools/tools/crewai_enterprise_tools/crewai_enterprise_tools.py +++ b/lib/crewai-tools/src/crewai_tools/tools/crewai_enterprise_tools/crewai_enterprise_tools.py @@ -1,13 +1,11 @@ -""" -Crewai Enterprise Tools -""" +"""Crewai Enterprise Tools.""" import json import logging import os -import typing as t from crewai.tools import BaseTool + from crewai_tools.adapters.enterprise_adapter import EnterpriseActionKitToolAdapter from crewai_tools.adapters.tool_collection import ToolCollection @@ -15,11 +13,11 @@ from crewai_tools.adapters.tool_collection import ToolCollection logger = logging.getLogger(__name__) -def CrewaiEnterpriseTools( - enterprise_token: t.Optional[str] = None, - actions_list: t.Optional[t.List[str]] = None, - enterprise_action_kit_project_id: t.Optional[str] = None, - enterprise_action_kit_project_url: t.Optional[str] = None, +def CrewaiEnterpriseTools( # noqa: N802 + enterprise_token: str | None = None, + actions_list: list[str] | None = None, + enterprise_action_kit_project_id: str | None = None, + enterprise_action_kit_project_url: str | None = None, ) -> ToolCollection[BaseTool]: """Factory function that returns crewai enterprise tools. @@ -34,7 +32,6 @@ def CrewaiEnterpriseTools( Returns: A ToolCollection of BaseTool instances for enterprise actions """ - import warnings warnings.warn( @@ -68,7 +65,7 @@ def CrewaiEnterpriseTools( # ENTERPRISE INJECTION ONLY -def _parse_actions_list(actions_list: t.Optional[t.List[str]]) -> t.List[str] | None: +def _parse_actions_list(actions_list: list[str] | None) -> list[str] | None: """Parse a string representation of a list of tool names to a list of tool names. Args: diff --git a/lib/crewai-tools/src/crewai_tools/tools/crewai_platform_tools/__init__.py b/lib/crewai-tools/src/crewai_tools/tools/crewai_platform_tools/__init__.py index 22656d355..588414e19 100644 --- a/lib/crewai-tools/src/crewai_tools/tools/crewai_platform_tools/__init__.py +++ b/lib/crewai-tools/src/crewai_tools/tools/crewai_platform_tools/__init__.py @@ -1,4 +1,4 @@ -"""CrewAI Platform Tools +"""CrewAI Platform Tools. This module provides tools for integrating with various platform applications through the CrewAI platform API. diff --git a/lib/crewai-tools/src/crewai_tools/tools/crewai_platform_tools/crewai_platform_action_tool.py b/lib/crewai-tools/src/crewai_tools/tools/crewai_platform_tools/crewai_platform_action_tool.py index 38a48a28b..95010d6d1 100644 --- a/lib/crewai-tools/src/crewai_tools/tools/crewai_platform_tools/crewai_platform_action_tool.py +++ b/lib/crewai-tools/src/crewai_tools/tools/crewai_platform_tools/crewai_platform_action_tool.py @@ -1,10 +1,8 @@ -""" -Crewai Enterprise Tools -""" +"""Crewai Enterprise Tools.""" import json import re -from typing import Any, Dict, List, Literal, Optional, Type, Union, cast, get_origin +from typing import Any, Literal, Optional, Union, cast, get_origin from crewai.tools import BaseTool from pydantic import Field, create_model @@ -18,7 +16,7 @@ from crewai_tools.tools.crewai_platform_tools.misc import ( class CrewAIPlatformActionTool(BaseTool): action_name: str = Field(default="", description="The name of the action") - action_schema: Dict[str, Any] = Field( + action_schema: dict[str, Any] = Field( default_factory=dict, description="The schema of the action" ) @@ -26,7 +24,7 @@ class CrewAIPlatformActionTool(BaseTool): self, description: str, action_name: str, - action_schema: Dict[str, Any], + action_schema: dict[str, Any], ): self._model_registry = {} self._base_name = self._sanitize_name(action_name) @@ -54,8 +52,7 @@ class CrewAIPlatformActionTool(BaseTool): args_schema = create_model( f"{self._base_name}Schema", **field_definitions ) - except Exception as e: - print(f"Warning: Could not create main schema model: {e}") + except Exception: args_schema = create_model( f"{self._base_name}Schema", input_text=(str, Field(description="Input for the action")), @@ -81,8 +78,8 @@ class CrewAIPlatformActionTool(BaseTool): return "".join(word.capitalize() for word in parts if word) def _extract_schema_info( - self, action_schema: Dict[str, Any] - ) -> tuple[Dict[str, Any], List[str]]: + self, action_schema: dict[str, Any] + ) -> tuple[dict[str, Any], list[str]]: schema_props = ( action_schema.get("function", {}) .get("parameters", {}) @@ -93,7 +90,7 @@ class CrewAIPlatformActionTool(BaseTool): ) return schema_props, required - def _process_schema_type(self, schema: Dict[str, Any], type_name: str) -> Type[Any]: + def _process_schema_type(self, schema: dict[str, Any], type_name: str) -> type[Any]: if "anyOf" in schema: any_of_types = schema["anyOf"] is_nullable = any(t.get("type") == "null" for t in any_of_types) @@ -101,8 +98,8 @@ class CrewAIPlatformActionTool(BaseTool): if non_null_types: base_type = self._process_schema_type(non_null_types[0], type_name) - return Optional[base_type] if is_nullable else base_type - return cast(Type[Any], Optional[str]) + return Optional[base_type] if is_nullable else base_type # noqa: UP045 + return cast(type[Any], Optional[str]) # noqa: UP045 if "oneOf" in schema: return self._process_schema_type(schema["oneOf"][0], type_name) @@ -121,7 +118,7 @@ class CrewAIPlatformActionTool(BaseTool): if json_type == "array": items_schema = schema.get("items", {"type": "string"}) item_type = self._process_schema_type(items_schema, f"{type_name}Item") - return List[item_type] + return list[item_type] if json_type == "object": return self._create_nested_model(schema, type_name) @@ -129,8 +126,8 @@ class CrewAIPlatformActionTool(BaseTool): return self._map_json_type_to_python(json_type) def _create_nested_model( - self, schema: Dict[str, Any], model_name: str - ) -> Type[Any]: + self, schema: dict[str, Any], model_name: str + ) -> type[Any]: full_model_name = f"{self._base_name}{model_name}" if full_model_name in self._model_registry: @@ -162,23 +159,22 @@ class CrewAIPlatformActionTool(BaseTool): nested_model = create_model(full_model_name, **field_definitions) self._model_registry[full_model_name] = nested_model return nested_model - except Exception as e: - print(f"Warning: Could not create nested model {full_model_name}: {e}") + except Exception: return dict def _create_field_definition( - self, field_type: Type[Any], is_required: bool, description: str + self, field_type: type[Any], is_required: bool, description: str ) -> tuple: if is_required: return (field_type, Field(description=description)) if get_origin(field_type) is Union: return (field_type, Field(default=None, description=description)) return ( - Optional[field_type], + Optional[field_type], # noqa: UP045 Field(default=None, description=description), ) - def _map_json_type_to_python(self, json_type: str) -> Type[Any]: + def _map_json_type_to_python(self, json_type: str) -> type[Any]: type_mapping = { "string": str, "integer": int, @@ -190,7 +186,7 @@ class CrewAIPlatformActionTool(BaseTool): } return type_mapping.get(json_type, str) - def _get_required_nullable_fields(self) -> List[str]: + def _get_required_nullable_fields(self) -> list[str]: schema_props, required = self._extract_schema_info(self.action_schema) required_nullable_fields = [] @@ -201,7 +197,7 @@ class CrewAIPlatformActionTool(BaseTool): return required_nullable_fields - def _is_nullable_type(self, schema: Dict[str, Any]) -> bool: + def _is_nullable_type(self, schema: dict[str, Any]) -> bool: if "anyOf" in schema: return any(t.get("type") == "null" for t in schema["anyOf"]) return schema.get("type") == "null" @@ -211,7 +207,7 @@ class CrewAIPlatformActionTool(BaseTool): cleaned_kwargs = {} for key, value in kwargs.items(): if value is not None: - cleaned_kwargs[key] = value + cleaned_kwargs[key] = value # noqa: PERF403 required_nullable_fields = self._get_required_nullable_fields() diff --git a/lib/crewai-tools/src/crewai_tools/tools/crewai_platform_tools/crewai_platform_tool_builder.py b/lib/crewai-tools/src/crewai_tools/tools/crewai_platform_tools/crewai_platform_tool_builder.py index 0c0471d39..71ca36c33 100644 --- a/lib/crewai-tools/src/crewai_tools/tools/crewai_platform_tools/crewai_platform_tool_builder.py +++ b/lib/crewai-tools/src/crewai_tools/tools/crewai_platform_tools/crewai_platform_tool_builder.py @@ -1,4 +1,4 @@ -from typing import Any, Dict, List +from typing import Any from crewai.tools import BaseTool import requests @@ -64,8 +64,8 @@ class CrewaiPlatformToolBuilder: self._actions_schema[action_name] = action_schema def _generate_detailed_description( - self, schema: Dict[str, Any], indent: int = 0 - ) -> List[str]: + self, schema: dict[str, Any], indent: int = 0 + ) -> list[str]: descriptions = [] indent_str = " " * indent diff --git a/lib/crewai-tools/src/crewai_tools/tools/crewai_platform_tools/crewai_platform_tools.py b/lib/crewai-tools/src/crewai_tools/tools/crewai_platform_tools/crewai_platform_tools.py index 1a7053689..ff85af423 100644 --- a/lib/crewai-tools/src/crewai_tools/tools/crewai_platform_tools/crewai_platform_tools.py +++ b/lib/crewai-tools/src/crewai_tools/tools/crewai_platform_tools/crewai_platform_tools.py @@ -11,17 +11,17 @@ from crewai_tools.tools.crewai_platform_tools.crewai_platform_tool_builder impor logger = logging.getLogger(__name__) -def CrewaiPlatformTools( +def CrewaiPlatformTools( # noqa: N802 apps: list[str], ) -> ToolCollection[BaseTool]: """Factory function that returns crewai platform tools. + Args: apps: List of platform apps to get tools that are available on the platform. Returns: A list of BaseTool instances for platform actions """ - builder = CrewaiPlatformToolBuilder(apps=apps) return builder.tools() diff --git a/lib/crewai-tools/src/crewai_tools/tools/csv_search_tool/__init__.py b/lib/crewai-tools/src/crewai_tools/tools/csv_search_tool/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/lib/crewai-tools/src/crewai_tools/tools/csv_search_tool/csv_search_tool.py b/lib/crewai-tools/src/crewai_tools/tools/csv_search_tool/csv_search_tool.py index ad42e613c..a4a95a36e 100644 --- a/lib/crewai-tools/src/crewai_tools/tools/csv_search_tool/csv_search_tool.py +++ b/lib/crewai-tools/src/crewai_tools/tools/csv_search_tool/csv_search_tool.py @@ -1,7 +1,6 @@ -from typing import Optional, Type +from pydantic import BaseModel, Field from crewai_tools.rag.data_types import DataType -from pydantic import BaseModel, Field from ..rag.rag_tool import RagTool @@ -26,9 +25,9 @@ class CSVSearchTool(RagTool): description: str = ( "A tool that can be used to semantic search a query from a CSV's content." ) - args_schema: Type[BaseModel] = CSVSearchToolSchema + args_schema: type[BaseModel] = CSVSearchToolSchema - def __init__(self, csv: Optional[str] = None, **kwargs): + def __init__(self, csv: str | None = None, **kwargs): super().__init__(**kwargs) if csv is not None: self.add(csv) @@ -42,7 +41,7 @@ class CSVSearchTool(RagTool): def _run( self, search_query: str, - csv: Optional[str] = None, + csv: str | None = None, similarity_threshold: float | None = None, limit: int | None = None, ) -> str: diff --git a/lib/crewai-tools/src/crewai_tools/tools/dalle_tool/__init__.py b/lib/crewai-tools/src/crewai_tools/tools/dalle_tool/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/lib/crewai-tools/src/crewai_tools/tools/dalle_tool/dalle_tool.py b/lib/crewai-tools/src/crewai_tools/tools/dalle_tool/dalle_tool.py index 8176e3ce0..e6380a2bf 100644 --- a/lib/crewai-tools/src/crewai_tools/tools/dalle_tool/dalle_tool.py +++ b/lib/crewai-tools/src/crewai_tools/tools/dalle_tool/dalle_tool.py @@ -1,5 +1,4 @@ import json -from typing import List, Type from crewai.tools import BaseTool, EnvVar from openai import OpenAI @@ -17,20 +16,22 @@ class ImagePromptSchema(BaseModel): class DallETool(BaseTool): name: str = "Dall-E Tool" description: str = "Generates images using OpenAI's Dall-E model." - args_schema: Type[BaseModel] = ImagePromptSchema + args_schema: type[BaseModel] = ImagePromptSchema model: str = "dall-e-3" size: str = "1024x1024" quality: str = "standard" n: int = 1 - env_vars: List[EnvVar] = [ - EnvVar( - name="OPENAI_API_KEY", - description="API key for OpenAI services", - required=True, - ), - ] + env_vars: list[EnvVar] = Field( + default_factory=lambda: [ + EnvVar( + name="OPENAI_API_KEY", + description="API key for OpenAI services", + required=True, + ), + ] + ) def _run(self, **kwargs) -> str: client = OpenAI() @@ -48,11 +49,9 @@ class DallETool(BaseTool): n=self.n, ) - image_data = json.dumps( + return json.dumps( { "image_url": response.data[0].url, "image_description": response.data[0].revised_prompt, } ) - - return image_data diff --git a/lib/crewai-tools/src/crewai_tools/tools/databricks_query_tool/databricks_query_tool.py b/lib/crewai-tools/src/crewai_tools/tools/databricks_query_tool/databricks_query_tool.py index 1b26a1ee7..a2399ccc5 100644 --- a/lib/crewai-tools/src/crewai_tools/tools/databricks_query_tool/databricks_query_tool.py +++ b/lib/crewai-tools/src/crewai_tools/tools/databricks_query_tool/databricks_query_tool.py @@ -1,5 +1,5 @@ import os -from typing import TYPE_CHECKING, Any, Dict, List, Optional, Type +from typing import TYPE_CHECKING, Any, Optional from crewai.tools import BaseTool from pydantic import BaseModel, Field, model_validator @@ -15,19 +15,19 @@ class DatabricksQueryToolSchema(BaseModel): query: str = Field( ..., description="SQL query to execute against the Databricks workspace table" ) - catalog: Optional[str] = Field( + catalog: str | None = Field( None, description="Databricks catalog name (optional, defaults to configured catalog)", ) - db_schema: Optional[str] = Field( + db_schema: str | None = Field( None, description="Databricks schema name (optional, defaults to configured schema)", ) - warehouse_id: Optional[str] = Field( + warehouse_id: str | None = Field( None, description="Databricks SQL warehouse ID (optional, defaults to configured warehouse)", ) - row_limit: Optional[int] = Field( + row_limit: int | None = Field( 1000, description="Maximum number of rows to return (default: 1000)" ) @@ -46,8 +46,7 @@ class DatabricksQueryToolSchema(BaseModel): class DatabricksQueryTool(BaseTool): - """ - A tool for querying Databricks workspace tables using SQL. + """A tool for querying Databricks workspace tables using SQL. This tool executes SQL queries against Databricks tables and returns the results. It requires Databricks authentication credentials to be set as environment variables. @@ -66,25 +65,24 @@ class DatabricksQueryTool(BaseTool): "Execute SQL queries against Databricks workspace tables and return the results." " Provide a 'query' parameter with the SQL query to execute." ) - args_schema: Type[BaseModel] = DatabricksQueryToolSchema + args_schema: type[BaseModel] = DatabricksQueryToolSchema # Optional default parameters - default_catalog: Optional[str] = None - default_schema: Optional[str] = None - default_warehouse_id: Optional[str] = None + default_catalog: str | None = None + default_schema: str | None = None + default_warehouse_id: str | None = None _workspace_client: Optional["WorkspaceClient"] = None - package_dependencies: List[str] = ["databricks-sdk"] + package_dependencies: list[str] = Field(default_factory=lambda: ["databricks-sdk"]) def __init__( self, - default_catalog: Optional[str] = None, - default_schema: Optional[str] = None, - default_warehouse_id: Optional[str] = None, + default_catalog: str | None = None, + default_schema: str | None = None, + default_warehouse_id: str | None = None, **kwargs: Any, ) -> None: - """ - Initialize the DatabricksQueryTool. + """Initialize the DatabricksQueryTool. Args: default_catalog (Optional[str]): Default catalog to use for queries. @@ -119,13 +117,13 @@ class DatabricksQueryTool(BaseTool): from databricks.sdk import WorkspaceClient self._workspace_client = WorkspaceClient() - except ImportError: + except ImportError as e: raise ImportError( "`databricks-sdk` package not found, please run `uv add databricks-sdk`" - ) + ) from e return self._workspace_client - def _format_results(self, results: List[Dict[str, Any]]) -> str: + def _format_results(self, results: list[dict[str, Any]]) -> str: """Format query results as a readable string.""" if not results: return "Query returned no results." @@ -176,8 +174,7 @@ class DatabricksQueryTool(BaseTool): self, **kwargs: Any, ) -> str: - """ - Execute a SQL query against Databricks and return the results. + """Execute a SQL query against Databricks and return the results. Args: query (str): SQL query to execute @@ -337,9 +334,6 @@ class DatabricksQueryTool(BaseTool): if hasattr(result.result, "data_array"): # Add defensive check for None data_array if result.result.data_array is None: - print( - "data_array is None - likely an empty result set or DDL query" - ) # Return empty result handling rather than trying to process null data return "Query executed successfully (no data returned)" @@ -418,9 +412,6 @@ class DatabricksQueryTool(BaseTool): "is_likely_incorrect_row_structure" in locals() and is_likely_incorrect_row_structure ): - print( - "Data appears to be malformed - will use special row reconstruction" - ) needs_special_string_handling = True else: needs_special_string_handling = False @@ -431,7 +422,6 @@ class DatabricksQueryTool(BaseTool): and needs_special_string_handling ): # We're dealing with data where the rows may be incorrectly structured - print("Using row reconstruction processing mode") # Collect all values into a flat list all_values = [] @@ -568,7 +558,6 @@ class DatabricksQueryTool(BaseTool): ) if title_idx >= 0: - print("Attempting title reconstruction method") # Try to detect if title is split across multiple values i = 0 while i < len(all_values): @@ -609,7 +598,6 @@ class DatabricksQueryTool(BaseTool): # If we still don't have rows, use simple chunking as fallback if not reconstructed_rows: - print("Falling back to basic chunking approach") chunks = [ all_values[i : i + expected_column_count] for i in range( @@ -637,7 +625,6 @@ class DatabricksQueryTool(BaseTool): # Apply post-processing to fix known issues if reconstructed_rows and "Title" in columns: - print("Applying post-processing to improve data quality") for row in reconstructed_rows: # Fix titles that might still have issues if ( @@ -654,7 +641,6 @@ class DatabricksQueryTool(BaseTool): chunk_results = reconstructed_rows else: # Process normal result structure as before - print("Using standard processing mode") # Check different result structures if ( @@ -662,7 +648,9 @@ class DatabricksQueryTool(BaseTool): and result.result.data_array ): # Check if data appears to be malformed within chunks - for chunk_idx, chunk in enumerate(result.result.data_array): + for _chunk_idx, chunk in enumerate( + result.result.data_array + ): # Check if chunk might actually contain individual columns of a single row # This is another way data might be malformed - check the first few values if len(chunk) > 0 and len(columns) > 1: @@ -676,10 +664,6 @@ class DatabricksQueryTool(BaseTool): if ( len(chunk) > len(columns) * 3 ): # Heuristic: if chunk has way more items than columns - print( - "Chunk appears to contain individual values rather than rows - switching to row reconstruction" - ) - # This chunk might actually be values of multiple rows - try to reconstruct values = chunk # All values in this chunk reconstructed_rows = [] @@ -697,7 +681,9 @@ class DatabricksQueryTool(BaseTool): row_dict = { col: val for col, val in zip( - columns, row_values + columns, + row_values, + strict=False, ) } reconstructed_rows.append(row_dict) @@ -726,7 +712,9 @@ class DatabricksQueryTool(BaseTool): row_dict = { col: val for col, val in zip( - columns, row_values + columns, + row_values, + strict=False, ) } chunk_results.append(row_dict) @@ -735,7 +723,7 @@ class DatabricksQueryTool(BaseTool): continue # Normal processing for typical row structure - for row_idx, row in enumerate(chunk): + for _row_idx, row in enumerate(chunk): # Ensure row is actually a collection of values if not isinstance(row, (list, tuple, dict)): # This might be a single value; skip it or handle specially @@ -771,7 +759,7 @@ class DatabricksQueryTool(BaseTool): elif hasattr(result.result, "data") and result.result.data: # Alternative data structure - for row_idx, row in enumerate(result.result.data): + for _row_idx, row in enumerate(result.result.data): # Debug info # Safely create dictionary matching column names to values diff --git a/lib/crewai-tools/src/crewai_tools/tools/directory_read_tool/__init__.py b/lib/crewai-tools/src/crewai_tools/tools/directory_read_tool/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/lib/crewai-tools/src/crewai_tools/tools/directory_read_tool/directory_read_tool.py b/lib/crewai-tools/src/crewai_tools/tools/directory_read_tool/directory_read_tool.py index 8488f391e..d3f88c921 100644 --- a/lib/crewai-tools/src/crewai_tools/tools/directory_read_tool/directory_read_tool.py +++ b/lib/crewai-tools/src/crewai_tools/tools/directory_read_tool/directory_read_tool.py @@ -1,5 +1,5 @@ import os -from typing import Any, Optional, Type +from typing import Any from crewai.tools import BaseTool from pydantic import BaseModel, Field @@ -20,10 +20,10 @@ class DirectoryReadTool(BaseTool): description: str = ( "A tool that can be used to recursively list a directory's content." ) - args_schema: Type[BaseModel] = DirectoryReadToolSchema - directory: Optional[str] = None + args_schema: type[BaseModel] = DirectoryReadToolSchema + directory: str | None = None - def __init__(self, directory: Optional[str] = None, **kwargs): + def __init__(self, directory: str | None = None, **kwargs): super().__init__(**kwargs) if directory is not None: self.directory = directory diff --git a/lib/crewai-tools/src/crewai_tools/tools/directory_search_tool/__init__.py b/lib/crewai-tools/src/crewai_tools/tools/directory_search_tool/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/lib/crewai-tools/src/crewai_tools/tools/directory_search_tool/directory_search_tool.py b/lib/crewai-tools/src/crewai_tools/tools/directory_search_tool/directory_search_tool.py index 85e1e81b9..d41a5c136 100644 --- a/lib/crewai-tools/src/crewai_tools/tools/directory_search_tool/directory_search_tool.py +++ b/lib/crewai-tools/src/crewai_tools/tools/directory_search_tool/directory_search_tool.py @@ -1,7 +1,6 @@ -from typing import Optional, Type +from pydantic import BaseModel, Field from crewai_tools.rag.data_types import DataType -from pydantic import BaseModel, Field from ..rag.rag_tool import RagTool @@ -26,9 +25,9 @@ class DirectorySearchTool(RagTool): description: str = ( "A tool that can be used to semantic search a query from a directory's content." ) - args_schema: Type[BaseModel] = DirectorySearchToolSchema + args_schema: type[BaseModel] = DirectorySearchToolSchema - def __init__(self, directory: Optional[str] = None, **kwargs): + def __init__(self, directory: str | None = None, **kwargs): super().__init__(**kwargs) if directory is not None: self.add(directory) @@ -42,7 +41,7 @@ class DirectorySearchTool(RagTool): def _run( self, search_query: str, - directory: Optional[str] = None, + directory: str | None = None, similarity_threshold: float | None = None, limit: int | None = None, ) -> str: diff --git a/lib/crewai-tools/src/crewai_tools/tools/docx_search_tool/__init__.py b/lib/crewai-tools/src/crewai_tools/tools/docx_search_tool/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/lib/crewai-tools/src/crewai_tools/tools/docx_search_tool/docx_search_tool.py b/lib/crewai-tools/src/crewai_tools/tools/docx_search_tool/docx_search_tool.py index da98f2950..9d23dd228 100644 --- a/lib/crewai-tools/src/crewai_tools/tools/docx_search_tool/docx_search_tool.py +++ b/lib/crewai-tools/src/crewai_tools/tools/docx_search_tool/docx_search_tool.py @@ -1,7 +1,8 @@ -from typing import Any, Optional, Type +from typing import Any + +from pydantic import BaseModel, Field from crewai_tools.rag.data_types import DataType -from pydantic import BaseModel, Field from ..rag.rag_tool import RagTool @@ -9,7 +10,7 @@ from ..rag.rag_tool import RagTool class FixedDOCXSearchToolSchema(BaseModel): """Input for DOCXSearchTool.""" - docx: Optional[str] = Field( + docx: str | None = Field( ..., description="File path or URL of a DOCX file to be searched" ) search_query: str = Field( @@ -32,9 +33,9 @@ class DOCXSearchTool(RagTool): description: str = ( "A tool that can be used to semantic search a query from a DOCX's content." ) - args_schema: Type[BaseModel] = DOCXSearchToolSchema + args_schema: type[BaseModel] = DOCXSearchToolSchema - def __init__(self, docx: Optional[str] = None, **kwargs): + def __init__(self, docx: str | None = None, **kwargs): super().__init__(**kwargs) if docx is not None: self.add(docx) @@ -48,7 +49,7 @@ class DOCXSearchTool(RagTool): def _run( self, search_query: str, - docx: Optional[str] = None, + docx: str | None = None, similarity_threshold: float | None = None, limit: int | None = None, ) -> Any: diff --git a/lib/crewai-tools/src/crewai_tools/tools/exa_tools/__init__.py b/lib/crewai-tools/src/crewai_tools/tools/exa_tools/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/lib/crewai-tools/src/crewai_tools/tools/exa_tools/exa_search_tool.py b/lib/crewai-tools/src/crewai_tools/tools/exa_tools/exa_search_tool.py index 53bb5b4a0..4a7d16b8b 100644 --- a/lib/crewai-tools/src/crewai_tools/tools/exa_tools/exa_search_tool.py +++ b/lib/crewai-tools/src/crewai_tools/tools/exa_tools/exa_search_tool.py @@ -1,8 +1,8 @@ import os -from typing import Any, List, Optional, Type +from typing import Any, Optional from crewai.tools import BaseTool, EnvVar -from pydantic import BaseModel, Field +from pydantic import BaseModel, ConfigDict, Field try: @@ -18,53 +18,55 @@ class EXABaseToolSchema(BaseModel): search_query: str = Field( ..., description="Mandatory search query you want to use to search the internet" ) - start_published_date: Optional[str] = Field( + start_published_date: str | None = Field( None, description="Start date for the search" ) - end_published_date: Optional[str] = Field( - None, description="End date for the search" - ) - include_domains: Optional[list[str]] = Field( + end_published_date: str | None = Field(None, description="End date for the search") + include_domains: list[str] | None = Field( None, description="List of domains to include in the search" ) class EXASearchTool(BaseTool): - model_config = {"arbitrary_types_allowed": True} + model_config = ConfigDict(arbitrary_types_allowed=True) name: str = "EXASearchTool" description: str = "Search the internet using Exa" - args_schema: Type[BaseModel] = EXABaseToolSchema + args_schema: type[BaseModel] = EXABaseToolSchema client: Optional["Exa"] = None - content: Optional[bool] = False - summary: Optional[bool] = False - type: Optional[str] = "auto" - package_dependencies: List[str] = ["exa_py"] - api_key: Optional[str] = Field( + content: bool | None = False + summary: bool | None = False + type: str | None = "auto" + package_dependencies: list[str] = Field(default_factory=lambda: ["exa_py"]) + api_key: str | None = Field( default_factory=lambda: os.getenv("EXA_API_KEY"), description="API key for Exa services", json_schema_extra={"required": False}, ) - base_url: Optional[str] = Field( + base_url: str | None = Field( default_factory=lambda: os.getenv("EXA_BASE_URL"), description="API server url", json_schema_extra={"required": False}, ) - env_vars: List[EnvVar] = [ - EnvVar( - name="EXA_API_KEY", description="API key for Exa services", required=False - ), - EnvVar( - name="EXA_BASE_URL", - description="API url for the Exa services", - required=False, - ), - ] + env_vars: list[EnvVar] = Field( + default_factory=lambda: [ + EnvVar( + name="EXA_API_KEY", + description="API key for Exa services", + required=False, + ), + EnvVar( + name="EXA_BASE_URL", + description="API url for the Exa services", + required=False, + ), + ] + ) def __init__( self, - content: Optional[bool] = False, - summary: Optional[bool] = False, - type: Optional[str] = "auto", + content: bool | None = False, + summary: bool | None = False, + type: str | None = "auto", **kwargs, ): super().__init__( @@ -78,7 +80,7 @@ class EXASearchTool(BaseTool): ): import subprocess - subprocess.run(["uv", "add", "exa_py"], check=True) + subprocess.run(["uv", "add", "exa_py"], check=True) # noqa: S607 else: raise ImportError( @@ -95,9 +97,9 @@ class EXASearchTool(BaseTool): def _run( self, search_query: str, - start_published_date: Optional[str] = None, - end_published_date: Optional[str] = None, - include_domains: Optional[list[str]] = None, + start_published_date: str | None = None, + end_published_date: str | None = None, + include_domains: list[str] | None = None, ) -> Any: if self.client is None: raise ValueError("Client not initialized") diff --git a/lib/crewai-tools/src/crewai_tools/tools/file_read_tool/__init__.py b/lib/crewai-tools/src/crewai_tools/tools/file_read_tool/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/lib/crewai-tools/src/crewai_tools/tools/file_read_tool/file_read_tool.py b/lib/crewai-tools/src/crewai_tools/tools/file_read_tool/file_read_tool.py index c3fd55fbe..2c56a70cd 100644 --- a/lib/crewai-tools/src/crewai_tools/tools/file_read_tool/file_read_tool.py +++ b/lib/crewai-tools/src/crewai_tools/tools/file_read_tool/file_read_tool.py @@ -1,4 +1,4 @@ -from typing import Any, Optional, Type +from typing import Any from crewai.tools import BaseTool from pydantic import BaseModel, Field @@ -8,10 +8,10 @@ class FileReadToolSchema(BaseModel): """Input for FileReadTool.""" file_path: str = Field(..., description="Mandatory file full path to read the file") - start_line: Optional[int] = Field( + start_line: int | None = Field( 1, description="Line number to start reading from (1-indexed)" ) - line_count: Optional[int] = Field( + line_count: int | None = Field( None, description="Number of lines to read. If None, reads the entire file" ) @@ -44,10 +44,10 @@ class FileReadTool(BaseTool): name: str = "Read a file's content" description: str = "A tool that reads the content of a file. To use this tool, provide a 'file_path' parameter with the path to the file you want to read. Optionally, provide 'start_line' to start reading from a specific line and 'line_count' to limit the number of lines read." - args_schema: Type[BaseModel] = FileReadToolSchema - file_path: Optional[str] = None + args_schema: type[BaseModel] = FileReadToolSchema + file_path: str | None = None - def __init__(self, file_path: Optional[str] = None, **kwargs: Any) -> None: + def __init__(self, file_path: str | None = None, **kwargs: Any) -> None: """Initialize the FileReadTool. Args: @@ -65,9 +65,9 @@ class FileReadTool(BaseTool): def _run( self, - file_path: Optional[str] = None, - start_line: Optional[int] = 1, - line_count: Optional[int] = None, + file_path: str | None = None, + start_line: int | None = 1, + line_count: int | None = None, ) -> str: file_path = file_path or self.file_path start_line = start_line or 1 diff --git a/lib/crewai-tools/src/crewai_tools/tools/file_writer_tool/__init__.py b/lib/crewai-tools/src/crewai_tools/tools/file_writer_tool/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/lib/crewai-tools/src/crewai_tools/tools/file_writer_tool/file_writer_tool.py b/lib/crewai-tools/src/crewai_tools/tools/file_writer_tool/file_writer_tool.py index d8f29bbc6..33b43985d 100644 --- a/lib/crewai-tools/src/crewai_tools/tools/file_writer_tool/file_writer_tool.py +++ b/lib/crewai-tools/src/crewai_tools/tools/file_writer_tool/file_writer_tool.py @@ -1,5 +1,5 @@ import os -from typing import Any, Optional, Type +from typing import Any from crewai.tools import BaseTool from pydantic import BaseModel @@ -18,7 +18,7 @@ def strtobool(val) -> bool: class FileWriterToolInput(BaseModel): filename: str - directory: Optional[str] = "./" + directory: str | None = "./" overwrite: str | bool = False content: str @@ -26,7 +26,7 @@ class FileWriterToolInput(BaseModel): class FileWriterTool(BaseTool): name: str = "File Writer Tool" description: str = "A tool to write content to a specified file. Accepts filename, content, and optionally a directory path and overwrite flag as input." - args_schema: Type[BaseModel] = FileWriterToolInput + args_schema: type[BaseModel] = FileWriterToolInput def _run(self, **kwargs: Any) -> str: try: diff --git a/lib/crewai-tools/src/crewai_tools/tools/files_compressor_tool/__init__.py b/lib/crewai-tools/src/crewai_tools/tools/files_compressor_tool/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/lib/crewai-tools/src/crewai_tools/tools/files_compressor_tool/files_compressor_tool.py b/lib/crewai-tools/src/crewai_tools/tools/files_compressor_tool/files_compressor_tool.py index d2edcd8ac..fd78aa376 100644 --- a/lib/crewai-tools/src/crewai_tools/tools/files_compressor_tool/files_compressor_tool.py +++ b/lib/crewai-tools/src/crewai_tools/tools/files_compressor_tool/files_compressor_tool.py @@ -1,6 +1,5 @@ import os import tarfile -from typing import Optional, Type import zipfile from crewai.tools import BaseTool @@ -13,7 +12,7 @@ class FileCompressorToolInput(BaseModel): input_path: str = Field( ..., description="Path to the file or directory to compress." ) - output_path: Optional[str] = Field( + output_path: str | None = Field( default=None, description="Optional output archive filename." ) overwrite: bool = Field( @@ -32,12 +31,12 @@ class FileCompressorTool(BaseTool): "Compresses a file or directory into an archive (.zip currently supported). " "Useful for archiving logs, documents, or backups." ) - args_schema: Type[BaseModel] = FileCompressorToolInput + args_schema: type[BaseModel] = FileCompressorToolInput def _run( self, input_path: str, - output_path: Optional[str] = None, + output_path: str | None = None, overwrite: bool = False, format: str = "zip", ) -> str: @@ -47,7 +46,7 @@ class FileCompressorTool(BaseTool): if not output_path: output_path = self._generate_output_path(input_path, format) - FORMAT_EXTENSION = { + format_extension = { "zip": ".zip", "tar": ".tar", "tar.gz": ".tar.gz", @@ -55,10 +54,10 @@ class FileCompressorTool(BaseTool): "tar.xz": ".tar.xz", } - if format not in FORMAT_EXTENSION: - return f"Compression format '{format}' is not supported. Allowed formats: {', '.join(FORMAT_EXTENSION.keys())}" - if not output_path.endswith(FORMAT_EXTENSION[format]): - return f"Error: If '{format}' format is chosen, output file must have a '{FORMAT_EXTENSION[format]}' extension." + if format not in format_extension: + return f"Compression format '{format}' is not supported. Allowed formats: {', '.join(format_extension.keys())}" + if not output_path.endswith(format_extension[format]): + return f"Error: If '{format}' format is chosen, output file must have a '{format_extension[format]}' extension." if not self._prepare_output(output_path, overwrite): return ( f"Output '{output_path}' already exists and overwrite is set to False." diff --git a/lib/crewai-tools/src/crewai_tools/tools/firecrawl_crawl_website_tool/__init__.py b/lib/crewai-tools/src/crewai_tools/tools/firecrawl_crawl_website_tool/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/lib/crewai-tools/src/crewai_tools/tools/firecrawl_crawl_website_tool/firecrawl_crawl_website_tool.py b/lib/crewai-tools/src/crewai_tools/tools/firecrawl_crawl_website_tool/firecrawl_crawl_website_tool.py index 112bf7fd5..f7f67b733 100644 --- a/lib/crewai-tools/src/crewai_tools/tools/firecrawl_crawl_website_tool/firecrawl_crawl_website_tool.py +++ b/lib/crewai-tools/src/crewai_tools/tools/firecrawl_crawl_website_tool/firecrawl_crawl_website_tool.py @@ -1,4 +1,4 @@ -from typing import TYPE_CHECKING, Any, List, Optional, Type +from typing import TYPE_CHECKING, Any, Optional from crewai.tools import BaseTool, EnvVar from pydantic import BaseModel, ConfigDict, Field, PrivateAttr @@ -20,8 +20,7 @@ class FirecrawlCrawlWebsiteToolSchema(BaseModel): class FirecrawlCrawlWebsiteTool(BaseTool): - """ - Tool for crawling websites using Firecrawl. To run this tool, you need to have a Firecrawl API key. + """Tool for crawling websites using Firecrawl. To run this tool, you need to have a Firecrawl API key. Args: api_key (str): Your Firecrawl API key. @@ -44,9 +43,9 @@ class FirecrawlCrawlWebsiteTool(BaseTool): ) name: str = "Firecrawl web crawl tool" description: str = "Crawl webpages using Firecrawl and return the contents" - args_schema: Type[BaseModel] = FirecrawlCrawlWebsiteToolSchema - api_key: Optional[str] = None - config: Optional[dict[str, Any]] = Field( + args_schema: type[BaseModel] = FirecrawlCrawlWebsiteToolSchema + api_key: str | None = None + config: dict[str, Any] | None = Field( default_factory=lambda: { "maxDepth": 2, "ignoreSitemap": True, @@ -61,16 +60,18 @@ 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, - ), - ] + package_dependencies: list[str] = Field(default_factory=lambda: ["firecrawl-py"]) + env_vars: list[EnvVar] = Field( + default_factory=lambda: [ + EnvVar( + name="FIRECRAWL_API_KEY", + description="API key for Firecrawl services", + required=True, + ), + ] + ) - def __init__(self, api_key: Optional[str] = None, **kwargs): + def __init__(self, api_key: str | None = None, **kwargs): super().__init__(**kwargs) self.api_key = api_key self._initialize_firecrawl() @@ -89,16 +90,16 @@ class FirecrawlCrawlWebsiteTool(BaseTool): import subprocess try: - subprocess.run(["uv", "add", "firecrawl-py"], check=True) + subprocess.run(["uv", "add", "firecrawl-py"], check=True) # noqa: S607 from firecrawl import FirecrawlApp self._firecrawl = FirecrawlApp(api_key=self.api_key) - except subprocess.CalledProcessError: - raise ImportError("Failed to install firecrawl-py package") + except subprocess.CalledProcessError as e: + raise ImportError("Failed to install firecrawl-py package") from e else: raise ImportError( "`firecrawl-py` package not found, please run `uv add firecrawl-py`" - ) + ) from None def _run(self, url: str): if not self._firecrawl: diff --git a/lib/crewai-tools/src/crewai_tools/tools/firecrawl_scrape_website_tool/__init__.py b/lib/crewai-tools/src/crewai_tools/tools/firecrawl_scrape_website_tool/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/lib/crewai-tools/src/crewai_tools/tools/firecrawl_scrape_website_tool/firecrawl_scrape_website_tool.py b/lib/crewai-tools/src/crewai_tools/tools/firecrawl_scrape_website_tool/firecrawl_scrape_website_tool.py index d4ce53249..6c41781f5 100644 --- a/lib/crewai-tools/src/crewai_tools/tools/firecrawl_scrape_website_tool/firecrawl_scrape_website_tool.py +++ b/lib/crewai-tools/src/crewai_tools/tools/firecrawl_scrape_website_tool/firecrawl_scrape_website_tool.py @@ -1,4 +1,4 @@ -from typing import TYPE_CHECKING, Any, Dict, List, Optional, Type +from typing import TYPE_CHECKING, Any, Optional from crewai.tools import BaseTool, EnvVar from pydantic import BaseModel, ConfigDict, Field, PrivateAttr @@ -20,8 +20,7 @@ class FirecrawlScrapeWebsiteToolSchema(BaseModel): class FirecrawlScrapeWebsiteTool(BaseTool): - """ - Tool for scraping webpages using Firecrawl. To run this tool, you need to have a Firecrawl API key. + """Tool for scraping webpages using Firecrawl. To run this tool, you need to have a Firecrawl API key. Args: api_key (str): Your Firecrawl API key. @@ -42,9 +41,9 @@ class FirecrawlScrapeWebsiteTool(BaseTool): ) name: str = "Firecrawl web scrape tool" description: str = "Scrape webpages using Firecrawl and return the contents" - args_schema: Type[BaseModel] = FirecrawlScrapeWebsiteToolSchema - api_key: Optional[str] = None - config: Dict[str, Any] = Field( + args_schema: type[BaseModel] = FirecrawlScrapeWebsiteToolSchema + api_key: str | None = None + config: dict[str, Any] = Field( default_factory=lambda: { "formats": ["markdown"], "onlyMainContent": True, @@ -56,16 +55,18 @@ 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, - ), - ] + package_dependencies: list[str] = Field(default_factory=lambda: ["firecrawl-py"]) + env_vars: list[EnvVar] = Field( + default_factory=lambda: [ + EnvVar( + name="FIRECRAWL_API_KEY", + description="API key for Firecrawl services", + required=True, + ), + ] + ) - def __init__(self, api_key: Optional[str] = None, **kwargs): + def __init__(self, api_key: str | None = None, **kwargs): super().__init__(**kwargs) try: from firecrawl import FirecrawlApp # type: ignore @@ -77,14 +78,14 @@ class FirecrawlScrapeWebsiteTool(BaseTool): ): import subprocess - subprocess.run(["uv", "add", "firecrawl-py"], check=True) + subprocess.run(["uv", "add", "firecrawl-py"], check=True) # noqa: S607 from firecrawl import ( FirecrawlApp, ) else: raise ImportError( "`firecrawl-py` package not found, please run `uv add firecrawl-py`" - ) + ) from None self._firecrawl = FirecrawlApp(api_key=api_key) diff --git a/lib/crewai-tools/src/crewai_tools/tools/firecrawl_search_tool/__init__.py b/lib/crewai-tools/src/crewai_tools/tools/firecrawl_search_tool/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/lib/crewai-tools/src/crewai_tools/tools/firecrawl_search_tool/firecrawl_search_tool.py b/lib/crewai-tools/src/crewai_tools/tools/firecrawl_search_tool/firecrawl_search_tool.py index da2455e20..d9029b302 100644 --- a/lib/crewai-tools/src/crewai_tools/tools/firecrawl_search_tool/firecrawl_search_tool.py +++ b/lib/crewai-tools/src/crewai_tools/tools/firecrawl_search_tool/firecrawl_search_tool.py @@ -1,4 +1,4 @@ -from typing import TYPE_CHECKING, Any, List, Optional, Type +from typing import TYPE_CHECKING, Any, Optional from crewai.tools import BaseTool, EnvVar from pydantic import BaseModel, ConfigDict, Field, PrivateAttr @@ -21,8 +21,7 @@ class FirecrawlSearchToolSchema(BaseModel): class FirecrawlSearchTool(BaseTool): - """ - Tool for searching webpages using Firecrawl. To run this tool, you need to have a Firecrawl API key. + """Tool for searching webpages using Firecrawl. To run this tool, you need to have a Firecrawl API key. Args: api_key (str): Your Firecrawl API key. @@ -37,17 +36,14 @@ class FirecrawlSearchTool(BaseTool): timeout (int): Timeout in milliseconds. Default: 60000 """ - model_config = ConfigDict( - arbitrary_types_allowed=True, validate_assignment=True, frozen=False - ) model_config = ConfigDict( arbitrary_types_allowed=True, validate_assignment=True, frozen=False ) name: str = "Firecrawl web search tool" description: str = "Search webpages using Firecrawl and return the results" - args_schema: Type[BaseModel] = FirecrawlSearchToolSchema - api_key: Optional[str] = None - config: Optional[dict[str, Any]] = Field( + args_schema: type[BaseModel] = FirecrawlSearchToolSchema + api_key: str | None = None + config: dict[str, Any] | None = Field( default_factory=lambda: { "limit": 5, "tbs": None, @@ -58,16 +54,18 @@ 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, - ), - ] + package_dependencies: list[str] = Field(default_factory=lambda: ["firecrawl-py"]) + env_vars: list[EnvVar] = Field( + default_factory=lambda: [ + EnvVar( + name="FIRECRAWL_API_KEY", + description="API key for Firecrawl services", + required=True, + ), + ] + ) - def __init__(self, api_key: Optional[str] = None, **kwargs): + def __init__(self, api_key: str | None = None, **kwargs): super().__init__(**kwargs) self.api_key = api_key self._initialize_firecrawl() @@ -86,16 +84,16 @@ class FirecrawlSearchTool(BaseTool): import subprocess try: - subprocess.run(["uv", "add", "firecrawl-py"], check=True) + subprocess.run(["uv", "add", "firecrawl-py"], check=True) # noqa: S607 from firecrawl import FirecrawlApp self._firecrawl = FirecrawlApp(api_key=self.api_key) - except subprocess.CalledProcessError: - raise ImportError("Failed to install firecrawl-py package") + except subprocess.CalledProcessError as e: + raise ImportError("Failed to install firecrawl-py package") from e else: raise ImportError( "`firecrawl-py` package not found, please run `uv add firecrawl-py`" - ) + ) from None def _run( self, diff --git a/lib/crewai-tools/src/crewai_tools/tools/generate_crewai_automation_tool/__init__.py b/lib/crewai-tools/src/crewai_tools/tools/generate_crewai_automation_tool/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/lib/crewai-tools/src/crewai_tools/tools/generate_crewai_automation_tool/generate_crewai_automation_tool.py b/lib/crewai-tools/src/crewai_tools/tools/generate_crewai_automation_tool/generate_crewai_automation_tool.py index e575b129a..4fd13b978 100644 --- a/lib/crewai-tools/src/crewai_tools/tools/generate_crewai_automation_tool/generate_crewai_automation_tool.py +++ b/lib/crewai-tools/src/crewai_tools/tools/generate_crewai_automation_tool/generate_crewai_automation_tool.py @@ -1,5 +1,4 @@ import os -from typing import List, Optional, Type from crewai.tools import BaseTool, EnvVar from pydantic import BaseModel, Field @@ -10,7 +9,7 @@ class GenerateCrewaiAutomationToolSchema(BaseModel): prompt: str = Field( description="The prompt to generate the CrewAI automation, e.g. 'Generate a CrewAI automation that will scrape the website and store the data in a database.'" ) - organization_id: Optional[str] = Field( + organization_id: str | None = Field( default=None, description="The identifier for the CrewAI AMP organization. If not specified, a default organization will be used.", ) @@ -23,31 +22,33 @@ class GenerateCrewaiAutomationTool(BaseTool): "automations based on natural language descriptions. It translates high-level requirements into " "functional CrewAI implementations." ) - args_schema: Type[BaseModel] = GenerateCrewaiAutomationToolSchema + args_schema: type[BaseModel] = GenerateCrewaiAutomationToolSchema crewai_enterprise_url: str = Field( default_factory=lambda: os.getenv("CREWAI_PLUS_URL", "https://app.crewai.com"), description="The base URL of CrewAI AMP. If not provided, it will be loaded from the environment variable CREWAI_PLUS_URL with default https://app.crewai.com.", ) - personal_access_token: Optional[str] = Field( + personal_access_token: str | None = Field( default_factory=lambda: os.getenv("CREWAI_PERSONAL_ACCESS_TOKEN"), description="The user's Personal Access Token to access CrewAI AMP API. If not provided, it will be loaded from the environment variable CREWAI_PERSONAL_ACCESS_TOKEN.", ) - env_vars: List[EnvVar] = [ - EnvVar( - name="CREWAI_PERSONAL_ACCESS_TOKEN", - description="Personal Access Token for CrewAI AMP API", - required=True, - ), - EnvVar( - name="CREWAI_PLUS_URL", - description="Base URL for CrewAI AMP API", - required=False, - ), - ] + env_vars: list[EnvVar] = Field( + default_factory=lambda: [ + EnvVar( + name="CREWAI_PERSONAL_ACCESS_TOKEN", + description="Personal Access Token for CrewAI Enterprise API", + required=True, + ), + EnvVar( + name="CREWAI_PLUS_URL", + description="Base URL for CrewAI Enterprise API", + required=False, + ), + ] + ) def _run(self, **kwargs) -> str: input_data = GenerateCrewaiAutomationToolSchema(**kwargs) - response = requests.post( + response = requests.post( # noqa: S113 f"{self.crewai_enterprise_url}/crewai_plus/api/v1/studio", headers=self._get_headers(input_data.organization_id), json={"prompt": input_data.prompt}, @@ -57,7 +58,7 @@ class GenerateCrewaiAutomationTool(BaseTool): studio_project_url = response.json().get("url") return f"Generated CrewAI Studio project URL: {studio_project_url}" - def _get_headers(self, organization_id: Optional[str] = None) -> dict: + def _get_headers(self, organization_id: str | None = None) -> dict: headers = { "Authorization": f"Bearer {self.personal_access_token}", "Content-Type": "application/json", diff --git a/lib/crewai-tools/src/crewai_tools/tools/github_search_tool/__init__.py b/lib/crewai-tools/src/crewai_tools/tools/github_search_tool/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/lib/crewai-tools/src/crewai_tools/tools/github_search_tool/github_search_tool.py b/lib/crewai-tools/src/crewai_tools/tools/github_search_tool/github_search_tool.py index c4d5fd29e..4c84648dd 100644 --- a/lib/crewai-tools/src/crewai_tools/tools/github_search_tool/github_search_tool.py +++ b/lib/crewai-tools/src/crewai_tools/tools/github_search_tool/github_search_tool.py @@ -1,7 +1,6 @@ -from typing import List, Optional, Type +from pydantic import BaseModel, Field from crewai_tools.rag.data_types import DataType -from pydantic import BaseModel, Field from ..rag.rag_tool import RagTool @@ -19,7 +18,7 @@ class GithubSearchToolSchema(FixedGithubSearchToolSchema): """Input for GithubSearchTool.""" github_repo: str = Field(..., description="Mandatory github you want to search") - content_types: List[str] = Field( + content_types: list[str] = Field( ..., description="Mandatory content types you want to be included search, options: [code, repo, pr, issue]", ) @@ -30,16 +29,16 @@ class GithubSearchTool(RagTool): description: str = "A tool that can be used to semantic search a query from a github repo's content. This is not the GitHub API, but instead a tool that can provide semantic search capabilities." summarize: bool = False gh_token: str - args_schema: Type[BaseModel] = GithubSearchToolSchema - content_types: List[str] = Field( + args_schema: type[BaseModel] = GithubSearchToolSchema + content_types: list[str] = Field( default_factory=lambda: ["code", "repo", "pr", "issue"], description="Content types you want to be included search, options: [code, repo, pr, issue]", ) def __init__( self, - github_repo: Optional[str] = None, - content_types: Optional[List[str]] = None, + github_repo: str | None = None, + content_types: list[str] | None = None, **kwargs, ): super().__init__(**kwargs) @@ -53,7 +52,7 @@ class GithubSearchTool(RagTool): def add( self, repo: str, - content_types: Optional[List[str]] = None, + content_types: list[str] | None = None, ) -> None: content_types = content_types or self.content_types super().add( @@ -65,8 +64,8 @@ class GithubSearchTool(RagTool): def _run( self, search_query: str, - github_repo: Optional[str] = None, - content_types: Optional[List[str]] = None, + github_repo: str | None = None, + content_types: list[str] | None = None, similarity_threshold: float | None = None, limit: int | None = None, ) -> str: diff --git a/lib/crewai-tools/src/crewai_tools/tools/hyperbrowser_load_tool/__init__.py b/lib/crewai-tools/src/crewai_tools/tools/hyperbrowser_load_tool/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/lib/crewai-tools/src/crewai_tools/tools/hyperbrowser_load_tool/hyperbrowser_load_tool.py b/lib/crewai-tools/src/crewai_tools/tools/hyperbrowser_load_tool/hyperbrowser_load_tool.py index d424d7a84..35c3bc0a5 100644 --- a/lib/crewai-tools/src/crewai_tools/tools/hyperbrowser_load_tool/hyperbrowser_load_tool.py +++ b/lib/crewai-tools/src/crewai_tools/tools/hyperbrowser_load_tool/hyperbrowser_load_tool.py @@ -1,5 +1,5 @@ import os -from typing import Any, Dict, List, Literal, Optional, Type, Union +from typing import Any, Literal from crewai.tools import BaseTool, EnvVar from pydantic import BaseModel, Field @@ -10,7 +10,7 @@ class HyperbrowserLoadToolSchema(BaseModel): operation: Literal["scrape", "crawl"] = Field( description="Operation to perform on the website. Either 'scrape' or 'crawl'" ) - params: Optional[Dict] = Field( + params: dict | None = Field( description="Optional params for scrape or crawl. For more information on the supported params, visit https://docs.hyperbrowser.ai/reference/sdks/python/scrape#start-scrape-job-and-wait or https://docs.hyperbrowser.ai/reference/sdks/python/crawl#start-crawl-job-and-wait" ) @@ -28,19 +28,21 @@ class HyperbrowserLoadTool(BaseTool): name: str = "Hyperbrowser web load tool" description: str = "Scrape or crawl a website using Hyperbrowser and return the contents in properly formatted markdown or html" - args_schema: Type[BaseModel] = HyperbrowserLoadToolSchema - api_key: Optional[str] = None - hyperbrowser: Optional[Any] = None - package_dependencies: List[str] = ["hyperbrowser"] - env_vars: List[EnvVar] = [ - EnvVar( - name="HYPERBROWSER_API_KEY", - description="API key for Hyperbrowser services", - required=False, - ), - ] + args_schema: type[BaseModel] = HyperbrowserLoadToolSchema + api_key: str | None = None + hyperbrowser: Any | None = None + package_dependencies: list[str] = Field(default_factory=lambda: ["hyperbrowser"]) + env_vars: list[EnvVar] = Field( + default_factory=lambda: [ + EnvVar( + name="HYPERBROWSER_API_KEY", + description="API key for Hyperbrowser services", + required=False, + ), + ] + ) - def __init__(self, api_key: Optional[str] = None, **kwargs): + def __init__(self, api_key: str | None = None, **kwargs): super().__init__(**kwargs) self.api_key = api_key or os.getenv("HYPERBROWSER_API_KEY") if not api_key: @@ -50,10 +52,10 @@ class HyperbrowserLoadTool(BaseTool): try: from hyperbrowser import Hyperbrowser - except ImportError: + except ImportError as e: raise ImportError( "`hyperbrowser` package not found, please run `pip install hyperbrowser`" - ) + ) from e if not self.api_key: raise ValueError( @@ -62,15 +64,15 @@ class HyperbrowserLoadTool(BaseTool): self.hyperbrowser = Hyperbrowser(api_key=self.api_key) - def _prepare_params(self, params: Dict) -> Dict: + def _prepare_params(self, params: dict) -> dict: """Prepare session and scrape options parameters.""" try: from hyperbrowser.models.scrape import ScrapeOptions from hyperbrowser.models.session import CreateSessionParams - except ImportError: + except ImportError as e: raise ImportError( "`hyperbrowser` package not found, please run `pip install hyperbrowser`" - ) + ) from e if "scrape_options" in params: if "formats" in params["scrape_options"]: @@ -84,7 +86,7 @@ class HyperbrowserLoadTool(BaseTool): params["scrape_options"] = ScrapeOptions(**params["scrape_options"]) return params - def _extract_content(self, data: Union[Any, None]): + def _extract_content(self, data: Any | None): """Extract content from response data.""" content = "" if data: @@ -95,23 +97,24 @@ class HyperbrowserLoadTool(BaseTool): self, url: str, operation: Literal["scrape", "crawl"] = "scrape", - params: Optional[Dict] = {}, + params: dict | None = None, ): + if params is None: + params = {} try: from hyperbrowser.models.crawl import StartCrawlJobParams from hyperbrowser.models.scrape import StartScrapeJobParams - except ImportError: + except ImportError as e: raise ImportError( "`hyperbrowser` package not found, please run `pip install hyperbrowser`" - ) + ) from e params = self._prepare_params(params) if operation == "scrape": scrape_params = StartScrapeJobParams(url=url, **params) scrape_resp = self.hyperbrowser.scrape.start_and_wait(scrape_params) - content = self._extract_content(scrape_resp.data) - return content + return self._extract_content(scrape_resp.data) crawl_params = StartCrawlJobParams(url=url, **params) crawl_resp = self.hyperbrowser.crawl.start_and_wait(crawl_params) content = "" diff --git a/lib/crewai-tools/src/crewai_tools/tools/invoke_crewai_automation_tool/__init__.py b/lib/crewai-tools/src/crewai_tools/tools/invoke_crewai_automation_tool/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/lib/crewai-tools/src/crewai_tools/tools/invoke_crewai_automation_tool/invoke_crewai_automation_tool.py b/lib/crewai-tools/src/crewai_tools/tools/invoke_crewai_automation_tool/invoke_crewai_automation_tool.py index 19da2ac8b..4f1abc9e9 100644 --- a/lib/crewai-tools/src/crewai_tools/tools/invoke_crewai_automation_tool/invoke_crewai_automation_tool.py +++ b/lib/crewai-tools/src/crewai_tools/tools/invoke_crewai_automation_tool/invoke_crewai_automation_tool.py @@ -1,5 +1,5 @@ import time -from typing import Any, Type +from typing import Any from crewai.tools import BaseTool from pydantic import BaseModel, Field, create_model @@ -13,8 +13,7 @@ class InvokeCrewAIAutomationInput(BaseModel): class InvokeCrewAIAutomationTool(BaseTool): - """ - A CrewAI tool for invoking external crew/flows APIs. + """A CrewAI tool for invoking external crew/flows APIs. This tool provides CrewAI Platform API integration with external crew services, supporting: - Dynamic input schema configuration @@ -46,7 +45,7 @@ class InvokeCrewAIAutomationTool(BaseTool): ... crew_inputs=custom_inputs, ... ) - Example: + Example: >>> tools = [ ... InvokeCrewAIAutomationTool( ... crew_api_url="https://canary-crew-[...].crewai.com", @@ -64,7 +63,7 @@ class InvokeCrewAIAutomationTool(BaseTool): name: str = "invoke_amp_automation" description: str = "Invokes an CrewAI Platform Automation using API" - args_schema: Type[BaseModel] = InvokeCrewAIAutomationInput + args_schema: type[BaseModel] = InvokeCrewAIAutomationInput crew_api_url: str crew_bearer_token: str @@ -77,10 +76,9 @@ class InvokeCrewAIAutomationTool(BaseTool): crew_name: str, crew_description: str, max_polling_time: int = 10 * 60, - crew_inputs: dict[str, Any] = None, + crew_inputs: dict[str, Any] | None = None, ): - """ - Initialize the InvokeCrewAIAutomationTool. + """Initialize the InvokeCrewAIAutomationTool. Args: crew_api_url: Base URL of the crew API service @@ -119,7 +117,7 @@ class InvokeCrewAIAutomationTool(BaseTool): ) def _kickoff_crew(self, inputs: dict[str, Any]) -> dict[str, Any]: - """Start a new crew task + """Start a new crew task. Args: inputs: Dictionary containing the query and other input parameters @@ -134,12 +132,12 @@ class InvokeCrewAIAutomationTool(BaseTool): "Content-Type": "application/json", }, json={"inputs": inputs}, + timeout=30, ) - response_json = response.json() - return response_json + return response.json() def _get_crew_status(self, crew_id: str) -> dict[str, Any]: - """Get the status of a crew task + """Get the status of a crew task. Args: crew_id: The ID of the crew task to check @@ -153,6 +151,7 @@ class InvokeCrewAIAutomationTool(BaseTool): "Authorization": f"Bearer {self.crew_bearer_token}", "Content-Type": "application/json", }, + timeout=30, ) return response.json() diff --git a/lib/crewai-tools/src/crewai_tools/tools/jina_scrape_website_tool/__init__.py b/lib/crewai-tools/src/crewai_tools/tools/jina_scrape_website_tool/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/lib/crewai-tools/src/crewai_tools/tools/jina_scrape_website_tool/jina_scrape_website_tool.py b/lib/crewai-tools/src/crewai_tools/tools/jina_scrape_website_tool/jina_scrape_website_tool.py index 54934b86c..62561b5e2 100644 --- a/lib/crewai-tools/src/crewai_tools/tools/jina_scrape_website_tool/jina_scrape_website_tool.py +++ b/lib/crewai-tools/src/crewai_tools/tools/jina_scrape_website_tool/jina_scrape_website_tool.py @@ -1,5 +1,3 @@ -from typing import Optional, Type - from crewai.tools import BaseTool from pydantic import BaseModel, Field import requests @@ -14,16 +12,16 @@ class JinaScrapeWebsiteToolInput(BaseModel): class JinaScrapeWebsiteTool(BaseTool): name: str = "JinaScrapeWebsiteTool" description: str = "A tool that can be used to read a website content using Jina.ai reader and return markdown content." - args_schema: Type[BaseModel] = JinaScrapeWebsiteToolInput - website_url: Optional[str] = None - api_key: Optional[str] = None - headers: dict = {} + args_schema: type[BaseModel] = JinaScrapeWebsiteToolInput + website_url: str | None = None + api_key: str | None = None + headers: dict = Field(default_factory=dict) def __init__( self, - website_url: Optional[str] = None, - api_key: Optional[str] = None, - custom_headers: Optional[dict] = None, + website_url: str | None = None, + api_key: str | None = None, + custom_headers: dict | None = None, **kwargs, ): super().__init__(**kwargs) @@ -38,7 +36,7 @@ class JinaScrapeWebsiteTool(BaseTool): if api_key is not None: self.headers["Authorization"] = f"Bearer {api_key}" - def _run(self, website_url: Optional[str] = None) -> str: + def _run(self, website_url: str | None = None) -> str: url = website_url or self.website_url if not url: raise ValueError( diff --git a/lib/crewai-tools/src/crewai_tools/tools/json_search_tool/__init__.py b/lib/crewai-tools/src/crewai_tools/tools/json_search_tool/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/lib/crewai-tools/src/crewai_tools/tools/json_search_tool/json_search_tool.py b/lib/crewai-tools/src/crewai_tools/tools/json_search_tool/json_search_tool.py index 487e70015..49e5e4ffb 100644 --- a/lib/crewai-tools/src/crewai_tools/tools/json_search_tool/json_search_tool.py +++ b/lib/crewai-tools/src/crewai_tools/tools/json_search_tool/json_search_tool.py @@ -1,5 +1,3 @@ -from typing import Optional, Type - from pydantic import BaseModel, Field from ..rag.rag_tool import RagTool @@ -27,9 +25,9 @@ class JSONSearchTool(RagTool): description: str = ( "A tool that can be used to semantic search a query from a JSON's content." ) - args_schema: Type[BaseModel] = JSONSearchToolSchema + args_schema: type[BaseModel] = JSONSearchToolSchema - def __init__(self, json_path: Optional[str] = None, **kwargs): + def __init__(self, json_path: str | None = None, **kwargs): super().__init__(**kwargs) if json_path is not None: self.add(json_path) @@ -40,7 +38,7 @@ class JSONSearchTool(RagTool): def _run( self, search_query: str, - json_path: Optional[str] = None, + json_path: str | None = None, similarity_threshold: float | None = None, limit: int | None = None, ) -> str: diff --git a/lib/crewai-tools/src/crewai_tools/tools/linkup/__init__.py b/lib/crewai-tools/src/crewai_tools/tools/linkup/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/lib/crewai-tools/src/crewai_tools/tools/linkup/linkup_search_tool.py b/lib/crewai-tools/src/crewai_tools/tools/linkup/linkup_search_tool.py index 382260887..fe0c2ae08 100644 --- a/lib/crewai-tools/src/crewai_tools/tools/linkup/linkup_search_tool.py +++ b/lib/crewai-tools/src/crewai_tools/tools/linkup/linkup_search_tool.py @@ -1,5 +1,5 @@ import os -from typing import Any, List +from typing import Any from crewai.tools import BaseTool, EnvVar @@ -12,7 +12,7 @@ except ImportError: LINKUP_AVAILABLE = False LinkupClient = Any # type placeholder when package is not available -from pydantic import PrivateAttr +from pydantic import Field, PrivateAttr class LinkupSearchTool(BaseTool): @@ -21,19 +21,17 @@ class LinkupSearchTool(BaseTool): "Performs an API call to Linkup to retrieve contextual information." ) _client: LinkupClient = PrivateAttr() # type: ignore - description: str = ( - "Performs an API call to Linkup to retrieve contextual information." + package_dependencies: list[str] = Field(default_factory=lambda: ["linkup-sdk"]) + env_vars: list[EnvVar] = Field( + default_factory=lambda: [ + EnvVar( + name="LINKUP_API_KEY", description="API key for Linkup", required=True + ), + ] ) - _client: LinkupClient = PrivateAttr() # type: ignore - package_dependencies: List[str] = ["linkup-sdk"] - env_vars: List[EnvVar] = [ - EnvVar(name="LINKUP_API_KEY", description="API key for Linkup", required=True), - ] - def __init__(self, api_key: str | None = None): - """ - Initialize the tool with an API key. - """ + def __init__(self, api_key: str | None = None) -> None: + """Initialize the tool with an API key.""" super().__init__() try: from linkup import LinkupClient @@ -45,21 +43,20 @@ class LinkupSearchTool(BaseTool): ): import subprocess - subprocess.run(["uv", "add", "linkup-sdk"], check=True) + subprocess.run(["uv", "add", "linkup-sdk"], check=True) # noqa: S607 from linkup import LinkupClient else: raise ImportError( "The 'linkup-sdk' package is required to use the LinkupSearchTool. " "Please install it with: uv add linkup-sdk" - ) + ) from None self._client = LinkupClient(api_key=api_key or os.getenv("LINKUP_API_KEY")) def _run( self, query: str, depth: str = "standard", output_type: str = "searchResults" ) -> dict: - """ - Executes a search using the Linkup API. + """Executes a search using the Linkup API. :param query: The query to search for. :param depth: Search depth (default is "standard"). diff --git a/lib/crewai-tools/src/crewai_tools/tools/llamaindex_tool/__init__.py b/lib/crewai-tools/src/crewai_tools/tools/llamaindex_tool/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/lib/crewai-tools/src/crewai_tools/tools/llamaindex_tool/llamaindex_tool.py b/lib/crewai-tools/src/crewai_tools/tools/llamaindex_tool/llamaindex_tool.py index ba2605816..26b820bb2 100644 --- a/lib/crewai-tools/src/crewai_tools/tools/llamaindex_tool/llamaindex_tool.py +++ b/lib/crewai-tools/src/crewai_tools/tools/llamaindex_tool/llamaindex_tool.py @@ -1,4 +1,6 @@ -from typing import Any, Optional, Type, cast +from __future__ import annotations + +from typing import Any, cast from crewai.tools import BaseTool from pydantic import BaseModel, Field @@ -25,7 +27,7 @@ class LlamaIndexTool(BaseTool): return tool(*args, **kwargs) @classmethod - def from_tool(cls, tool: Any, **kwargs: Any) -> "LlamaIndexTool": + def from_tool(cls, tool: Any, **kwargs: Any) -> LlamaIndexTool: from llama_index.core.tools import BaseTool as LlamaBaseTool if not isinstance(tool, LlamaBaseTool): @@ -36,7 +38,7 @@ class LlamaIndexTool(BaseTool): raise ValueError( "The LlamaIndex tool does not have an fn_schema specified." ) - args_schema = cast(Type[BaseModel], tool.metadata.fn_schema) + args_schema = cast(type[BaseModel], tool.metadata.fn_schema) return cls( name=tool.metadata.name, @@ -50,11 +52,11 @@ class LlamaIndexTool(BaseTool): def from_query_engine( cls, query_engine: Any, - name: Optional[str] = None, - description: Optional[str] = None, + name: str | None = None, + description: str | None = None, return_direct: bool = False, **kwargs: Any, - ) -> "LlamaIndexTool": + ) -> LlamaIndexTool: from llama_index.core.query_engine import BaseQueryEngine from llama_index.core.tools import QueryEngineTool diff --git a/lib/crewai-tools/src/crewai_tools/tools/mdx_search_tool/__init__.py b/lib/crewai-tools/src/crewai_tools/tools/mdx_search_tool/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/lib/crewai-tools/src/crewai_tools/tools/mdx_search_tool/mdx_search_tool.py b/lib/crewai-tools/src/crewai_tools/tools/mdx_search_tool/mdx_search_tool.py index ac22b9f9d..97848c945 100644 --- a/lib/crewai-tools/src/crewai_tools/tools/mdx_search_tool/mdx_search_tool.py +++ b/lib/crewai-tools/src/crewai_tools/tools/mdx_search_tool/mdx_search_tool.py @@ -1,7 +1,6 @@ -from typing import Optional, Type +from pydantic import BaseModel, Field from crewai_tools.rag.data_types import DataType -from pydantic import BaseModel, Field from ..rag.rag_tool import RagTool @@ -26,9 +25,9 @@ class MDXSearchTool(RagTool): description: str = ( "A tool that can be used to semantic search a query from a MDX's content." ) - args_schema: Type[BaseModel] = MDXSearchToolSchema + args_schema: type[BaseModel] = MDXSearchToolSchema - def __init__(self, mdx: Optional[str] = None, **kwargs): + def __init__(self, mdx: str | None = None, **kwargs): super().__init__(**kwargs) if mdx is not None: self.add(mdx) @@ -42,7 +41,7 @@ class MDXSearchTool(RagTool): def _run( self, search_query: str, - mdx: Optional[str] = None, + mdx: str | None = None, similarity_threshold: float | None = None, limit: int | None = None, ) -> str: diff --git a/lib/crewai-tools/src/crewai_tools/tools/mongodb_vector_search_tool/utils.py b/lib/crewai-tools/src/crewai_tools/tools/mongodb_vector_search_tool/utils.py index 00a294d88..c1a025094 100644 --- a/lib/crewai-tools/src/crewai_tools/tools/mongodb_vector_search_tool/utils.py +++ b/lib/crewai-tools/src/crewai_tools/tools/mongodb_vector_search_tool/utils.py @@ -1,7 +1,8 @@ from __future__ import annotations +from collections.abc import Callable from time import monotonic, sleep -from typing import TYPE_CHECKING, Any, Callable, Dict, List, Optional +from typing import TYPE_CHECKING, Any if TYPE_CHECKING: @@ -12,9 +13,9 @@ def _vector_search_index_definition( dimensions: int, path: str, similarity: str, - filters: Optional[List[str]] = None, + filters: list[str] | None = None, **kwargs: Any, -) -> Dict[str, Any]: +) -> dict[str, Any]: # https://www.mongodb.com/docs/atlas/atlas-vector-search/vector-search-type/ fields = [ { @@ -26,7 +27,7 @@ def _vector_search_index_definition( ] if filters: for field in filters: - fields.append({"type": "filter", "path": field}) + fields.append({"type": "filter", "path": field}) # noqa: PERF401 definition = {"fields": fields} definition.update(kwargs) return definition @@ -38,12 +39,12 @@ def create_vector_search_index( dimensions: int, path: str, similarity: str, - filters: Optional[List[str]] = None, + filters: list[str] | None = None, *, - wait_until_complete: Optional[float] = None, + wait_until_complete: float | None = None, **kwargs: Any, ) -> None: - """Experimental Utility function to create a vector search index + """Experimental Utility function to create a vector search index. Args: collection (Collection): MongoDB Collection @@ -61,7 +62,7 @@ def create_vector_search_index( if collection.name not in collection.database.list_collection_names(): collection.database.create_collection(collection.name) - result = collection.create_search_index( + collection.create_search_index( SearchIndexModel( definition=_vector_search_index_definition( dimensions=dimensions, @@ -85,7 +86,7 @@ def create_vector_search_index( def _is_index_ready(collection: Collection, index_name: str) -> bool: """Check for the index name in the list of available search indexes to see if the - specified index is of status READY + specified index is of status READY. Args: collection (Collection): MongoDB Collection to for the search indexes @@ -103,7 +104,7 @@ def _is_index_ready(collection: Collection, index_name: str) -> bool: def _wait_for_predicate( predicate: Callable, err: str, timeout: float = 120, interval: float = 0.5 ) -> None: - """Generic to block until the predicate returns true + """Generic to block until the predicate returns true. Args: predicate (Callable[, bool]): A function that returns a boolean value diff --git a/lib/crewai-tools/src/crewai_tools/tools/mongodb_vector_search_tool/vector_search.py b/lib/crewai-tools/src/crewai_tools/tools/mongodb_vector_search_tool/vector_search.py index aa59f456c..228d8b872 100644 --- a/lib/crewai-tools/src/crewai_tools/tools/mongodb_vector_search_tool/vector_search.py +++ b/lib/crewai-tools/src/crewai_tools/tools/mongodb_vector_search_tool/vector_search.py @@ -2,7 +2,7 @@ from collections.abc import Iterable from importlib.metadata import version from logging import getLogger import os -from typing import Any, Dict, List, Optional, Type +from typing import Any from crewai.tools import BaseTool, EnvVar from openai import AzureOpenAI, Client @@ -14,7 +14,7 @@ from crewai_tools.tools.mongodb_vector_search_tool.utils import ( try: - import pymongo + import pymongo # noqa: F401 MONGODB_AVAILABLE = True except ImportError: @@ -26,14 +26,12 @@ logger = getLogger(__name__) class MongoDBVectorSearchConfig(BaseModel): """Configuration for MongoDB vector search queries.""" - limit: Optional[int] = Field( - default=4, description="number of documents to return." - ) - pre_filter: Optional[dict[str, Any]] = Field( + limit: int | None = Field(default=4, description="number of documents to return.") + pre_filter: dict[str, Any] | None = Field( default=None, description="List of MQL match expressions comparing an indexed field", ) - post_filter_pipeline: Optional[list[dict]] = Field( + post_filter_pipeline: list[dict] | None = Field( default=None, description="Pipeline of MongoDB aggregation stages to filter/process results after $vectorSearch.", ) @@ -57,13 +55,13 @@ class MongoDBToolSchema(BaseModel): class MongoDBVectorSearchTool(BaseTool): - """Tool to perfrom a vector search the MongoDB database""" + """Tool to perfrom a vector search the MongoDB database.""" name: str = "MongoDBVectorSearchTool" description: str = "A tool to perfrom a vector search on a MongoDB database for relevant information on internal documents." - args_schema: Type[BaseModel] = MongoDBToolSchema - query_config: Optional[MongoDBVectorSearchConfig] = Field( + args_schema: type[BaseModel] = MongoDBToolSchema + query_config: MongoDBVectorSearchConfig | None = Field( default=None, description="MongoDB Vector Search query configuration" ) embedding_model: str = Field( @@ -91,19 +89,21 @@ class MongoDBVectorSearchTool(BaseTool): default=1536, description="Number of dimensions in the embedding vector", ) - env_vars: List[EnvVar] = [ - EnvVar( - name="BROWSERBASE_API_KEY", - description="API key for Browserbase services", - required=False, - ), - EnvVar( - name="BROWSERBASE_PROJECT_ID", - description="Project ID for Browserbase services", - required=False, - ), - ] - package_dependencies: List[str] = ["mongdb"] + env_vars: list[EnvVar] = Field( + default_factory=lambda: [ + EnvVar( + name="BROWSERBASE_API_KEY", + description="API key for Browserbase services", + required=False, + ), + EnvVar( + name="BROWSERBASE_PROJECT_ID", + description="Project ID for Browserbase services", + required=False, + ), + ] + ) + package_dependencies: list[str] = Field(default_factory=lambda: ["mongdb"]) def __init__(self, **kwargs): super().__init__(**kwargs) @@ -115,7 +115,7 @@ class MongoDBVectorSearchTool(BaseTool): ): import subprocess - subprocess.run(["uv", "add", "pymongo"], check=True) + subprocess.run(["uv", "add", "pymongo"], check=True) # noqa: S607 else: raise ImportError("You are missing the 'mongodb' crewai tool.") @@ -155,7 +155,6 @@ class MongoDBVectorSearchTool(BaseTool): auto_index_timeout: Timeout in seconds to wait for an auto-created index to be ready. """ - create_vector_search_index( collection=self._coll, index_name=self.vector_index_name, @@ -168,11 +167,11 @@ class MongoDBVectorSearchTool(BaseTool): def add_texts( self, texts: Iterable[str], - metadatas: Optional[List[Dict[str, Any]]] = None, - ids: Optional[List[str]] = None, + metadatas: list[dict[str, Any]] | None = None, + ids: list[str] | None = None, batch_size: int = 100, **kwargs: Any, - ) -> List[str]: + ) -> list[str]: """Add texts, create embeddings, and add to the Collection and index. Important notes on ids: @@ -205,7 +204,7 @@ class MongoDBVectorSearchTool(BaseTool): metadatas_batch = [] size = 0 i = 0 - for j, (text, metadata) in enumerate(zip(texts, _metadatas)): + for j, (text, metadata) in enumerate(zip(texts, _metadatas, strict=False)): size += len(text) + len(metadata) texts_batch.append(text) metadatas_batch.append(metadata) @@ -225,7 +224,7 @@ class MongoDBVectorSearchTool(BaseTool): result_ids.extend(batch_res) return result_ids - def _embed_texts(self, texts: List[str]) -> List[List[float]]: + def _embed_texts(self, texts: list[str]) -> list[list[float]]: return [ i.embedding for i in self._openai_client.embeddings.create( @@ -237,10 +236,10 @@ class MongoDBVectorSearchTool(BaseTool): def _bulk_embed_and_insert_texts( self, - texts: List[str], - metadatas: List[dict], - ids: List[str], - ) -> List[str]: + texts: list[str], + metadatas: list[dict], + ids: list[str], + ) -> list[str]: """Bulk insert single batch of texts, embeddings, and ids.""" from bson import ObjectId from pymongo.operations import ReplaceOne @@ -256,12 +255,15 @@ class MongoDBVectorSearchTool(BaseTool): self.embedding_key: embedding, **m, } - for i, t, m, embedding in zip(ids, texts, metadatas, embeddings) + for i, t, m, embedding in zip( + ids, texts, metadatas, embeddings, strict=False + ) ] operations = [ReplaceOne({"_id": doc["_id"]}, doc, upsert=True) for doc in docs] # insert the documents in MongoDB Atlas result = self._coll.bulk_write(operations) - assert result.upserted_ids is not None + if result.upserted_ids is None: + raise ValueError("No documents were inserted.") return [str(_id) for _id in result.upserted_ids.values()] def _run(self, query: str) -> str: @@ -308,7 +310,7 @@ class MongoDBVectorSearchTool(BaseTool): # Format for doc in cursor: - docs.append(doc) + docs.append(doc) # noqa: PERF402 return json_util.dumps(docs) except Exception as e: logger.error(f"Error: {e}") diff --git a/lib/crewai-tools/src/crewai_tools/tools/multion_tool/__init__.py b/lib/crewai-tools/src/crewai_tools/tools/multion_tool/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/lib/crewai-tools/src/crewai_tools/tools/multion_tool/multion_tool.py b/lib/crewai-tools/src/crewai_tools/tools/multion_tool/multion_tool.py index f712b8c13..8b3095446 100644 --- a/lib/crewai-tools/src/crewai_tools/tools/multion_tool/multion_tool.py +++ b/lib/crewai-tools/src/crewai_tools/tools/multion_tool/multion_tool.py @@ -1,9 +1,10 @@ """Multion tool spec.""" import os -from typing import Any, List, Optional +from typing import Any from crewai.tools import BaseTool, EnvVar +from pydantic import Field class MultiOnTool(BaseTool): @@ -13,20 +14,22 @@ class MultiOnTool(BaseTool): description: str = """Multion gives the ability for LLMs to control web browsers using natural language instructions. If the status is 'CONTINUE', reissue the same instruction to continue execution """ - multion: Optional[Any] = None - session_id: Optional[str] = None + multion: Any | None = None + session_id: str | None = None local: bool = False max_steps: int = 3 - package_dependencies: List[str] = ["multion"] - env_vars: List[EnvVar] = [ - EnvVar( - name="MULTION_API_KEY", description="API key for Multion", required=True - ), - ] + package_dependencies: list[str] = Field(default_factory=lambda: ["multion"]) + env_vars: list[EnvVar] = Field( + default_factory=lambda: [ + EnvVar( + name="MULTION_API_KEY", description="API key for Multion", required=True + ), + ] + ) def __init__( self, - api_key: Optional[str] = None, + api_key: str | None = None, local: bool = False, max_steps: int = 3, **kwargs, @@ -42,12 +45,12 @@ class MultiOnTool(BaseTool): ): import subprocess - subprocess.run(["uv", "add", "multion"], check=True) + subprocess.run(["uv", "add", "multion"], check=True) # noqa: S607 from multion.client import MultiOn else: raise ImportError( "`multion` package not found, please run `uv add multion`" - ) + ) from None self.session_id = None self.local = local self.multion = MultiOn(api_key=api_key or os.getenv("MULTION_API_KEY")) @@ -59,8 +62,7 @@ class MultiOnTool(BaseTool): *args: Any, **kwargs: Any, ) -> str: - """ - Run the Multion client with the given command. + """Run the Multion client with the given command. Args: cmd (str): The detailed and specific natural language instructrion for web browsing @@ -68,13 +70,12 @@ class MultiOnTool(BaseTool): *args (Any): Additional arguments to pass to the Multion client **kwargs (Any): Additional keyword arguments to pass to the Multion client """ - browse = self.multion.browse( cmd=cmd, session_id=self.session_id, local=self.local, max_steps=self.max_steps, - *args, + *args, # noqa: B026 **kwargs, ) self.session_id = browse.session_id diff --git a/lib/crewai-tools/src/crewai_tools/tools/mysql_search_tool/__init__.py b/lib/crewai-tools/src/crewai_tools/tools/mysql_search_tool/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/lib/crewai-tools/src/crewai_tools/tools/mysql_search_tool/mysql_search_tool.py b/lib/crewai-tools/src/crewai_tools/tools/mysql_search_tool/mysql_search_tool.py index d29a856a3..f46f2c5a1 100644 --- a/lib/crewai-tools/src/crewai_tools/tools/mysql_search_tool/mysql_search_tool.py +++ b/lib/crewai-tools/src/crewai_tools/tools/mysql_search_tool/mysql_search_tool.py @@ -1,7 +1,8 @@ -from typing import Any, Type +from typing import Any + +from pydantic import BaseModel, Field from crewai_tools.rag.data_types import DataType -from pydantic import BaseModel, Field from ..rag.rag_tool import RagTool @@ -18,7 +19,7 @@ class MySQLSearchToolSchema(BaseModel): class MySQLSearchTool(RagTool): name: str = "Search a database's table content" description: str = "A tool that can be used to semantic search a query from a database table's content." - args_schema: Type[BaseModel] = MySQLSearchToolSchema + args_schema: type[BaseModel] = MySQLSearchToolSchema db_uri: str = Field(..., description="Mandatory database URI") def __init__(self, table_name: str, **kwargs): @@ -32,7 +33,7 @@ class MySQLSearchTool(RagTool): table_name: str, **kwargs: Any, ) -> None: - super().add(f"SELECT * FROM {table_name};", **kwargs) + super().add(f"SELECT * FROM {table_name};", **kwargs) # noqa: S608 def _run( self, diff --git a/lib/crewai-tools/src/crewai_tools/tools/nl2sql/__init__.py b/lib/crewai-tools/src/crewai_tools/tools/nl2sql/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/lib/crewai-tools/src/crewai_tools/tools/nl2sql/nl2sql_tool.py b/lib/crewai-tools/src/crewai_tools/tools/nl2sql/nl2sql_tool.py index f8fda07c7..b8ccaedc7 100644 --- a/lib/crewai-tools/src/crewai_tools/tools/nl2sql/nl2sql_tool.py +++ b/lib/crewai-tools/src/crewai_tools/tools/nl2sql/nl2sql_tool.py @@ -1,4 +1,4 @@ -from typing import Any, Type, Union +from typing import Any from crewai.tools import BaseTool from pydantic import BaseModel, Field @@ -27,9 +27,9 @@ class NL2SQLTool(BaseTool): title="Database URI", description="The URI of the database to connect to.", ) - tables: list = [] - columns: dict = {} - args_schema: Type[BaseModel] = NL2SQLToolInput + tables: list = Field(default_factory=list) + columns: dict = Field(default_factory=dict) + args_schema: type[BaseModel] = NL2SQLToolInput def model_post_init(self, __context: Any) -> None: if not SQLALCHEMY_AVAILABLE: @@ -54,7 +54,7 @@ class NL2SQLTool(BaseTool): def _fetch_all_available_columns(self, table_name: str): return self.execute_sql( - f"SELECT column_name, data_type FROM information_schema.columns WHERE table_name = '{table_name}';" + f"SELECT column_name, data_type FROM information_schema.columns WHERE table_name = '{table_name}';" # noqa: S608 ) def _run(self, sql_query: str): @@ -69,14 +69,14 @@ class NL2SQLTool(BaseTool): return data - def execute_sql(self, sql_query: str) -> Union[list, str]: + def execute_sql(self, sql_query: str) -> list | str: if not SQLALCHEMY_AVAILABLE: raise ImportError( "sqlalchemy is not installed. Please install it with `pip install crewai-tools[sqlalchemy]`" ) engine = create_engine(self.db_uri) - Session = sessionmaker(bind=engine) + Session = sessionmaker(bind=engine) # noqa: N806 session = Session() try: result = session.execute(text(sql_query)) @@ -84,8 +84,9 @@ class NL2SQLTool(BaseTool): if result.returns_rows: columns = result.keys() - data = [dict(zip(columns, row)) for row in result.fetchall()] - return data + return [ + dict(zip(columns, row, strict=False)) for row in result.fetchall() + ] return f"Query {sql_query} executed successfully" except Exception as e: diff --git a/lib/crewai-tools/src/crewai_tools/tools/ocr_tool/__init__.py b/lib/crewai-tools/src/crewai_tools/tools/ocr_tool/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/lib/crewai-tools/src/crewai_tools/tools/ocr_tool/ocr_tool.py b/lib/crewai-tools/src/crewai_tools/tools/ocr_tool/ocr_tool.py index 3b3604c99..b261b7820 100644 --- a/lib/crewai-tools/src/crewai_tools/tools/ocr_tool/ocr_tool.py +++ b/lib/crewai-tools/src/crewai_tools/tools/ocr_tool/ocr_tool.py @@ -1,11 +1,9 @@ -""" -Optical Character Recognition (OCR) Tool +"""Optical Character Recognition (OCR) Tool. This tool provides functionality for extracting text from images using supported LLMs. Make sure your model supports the `vision` feature. """ import base64 -from typing import Optional, Type from crewai import LLM from crewai.tools.base_tool import BaseTool @@ -41,9 +39,9 @@ class OCRTool(BaseTool): name: str = "Optical Character Recognition Tool" description: str = "This tool uses an LLM's API to extract text from an image file." - _llm: Optional[LLM] = PrivateAttr(default=None) + _llm: LLM | None = PrivateAttr(default=None) - args_schema: Type[BaseModel] = OCRToolSchema + args_schema: type[BaseModel] = OCRToolSchema def __init__(self, llm: LLM = None, **kwargs): """Initialize the OCR tool. @@ -106,8 +104,7 @@ class OCRTool(BaseTool): }, ] - response = self._llm.call(messages=messages) - return response + return self._llm.call(messages=messages) def _encode_image(self, image_path: str): """Encode an image file to base64 format. diff --git a/lib/crewai-tools/src/crewai_tools/tools/oxylabs_amazon_product_scraper_tool/__init__.py b/lib/crewai-tools/src/crewai_tools/tools/oxylabs_amazon_product_scraper_tool/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/lib/crewai-tools/src/crewai_tools/tools/oxylabs_amazon_product_scraper_tool/oxylabs_amazon_product_scraper_tool.py b/lib/crewai-tools/src/crewai_tools/tools/oxylabs_amazon_product_scraper_tool/oxylabs_amazon_product_scraper_tool.py index dd42acfa0..cc7295e9c 100644 --- a/lib/crewai-tools/src/crewai_tools/tools/oxylabs_amazon_product_scraper_tool/oxylabs_amazon_product_scraper_tool.py +++ b/lib/crewai-tools/src/crewai_tools/tools/oxylabs_amazon_product_scraper_tool/oxylabs_amazon_product_scraper_tool.py @@ -2,7 +2,7 @@ from importlib.metadata import version import json import os from platform import architecture, python_version -from typing import Any, List, Type +from typing import Any from crewai.tools import BaseTool, EnvVar from pydantic import BaseModel, ConfigDict, Field @@ -28,9 +28,8 @@ class OxylabsAmazonProductScraperArgs(BaseModel): class OxylabsAmazonProductScraperConfig(BaseModel): - """ - Amazon Product Scraper configuration options: - https://developers.oxylabs.io/scraper-apis/web-scraper-api/targets/amazon/product + """Amazon Product Scraper configuration options: + https://developers.oxylabs.io/scraper-apis/web-scraper-api/targets/amazon/product. """ domain: str | None = Field( @@ -51,8 +50,7 @@ class OxylabsAmazonProductScraperConfig(BaseModel): class OxylabsAmazonProductScraperTool(BaseTool): - """ - Scrape Amazon product pages with OxylabsAmazonProductScraperTool. + """Scrape Amazon product pages with OxylabsAmazonProductScraperTool. Get Oxylabs account: https://dashboard.oxylabs.io/en @@ -69,26 +67,31 @@ class OxylabsAmazonProductScraperTool(BaseTool): ) name: str = "Oxylabs Amazon Product Scraper tool" description: str = "Scrape Amazon product pages with Oxylabs Amazon Product Scraper" - args_schema: Type[BaseModel] = OxylabsAmazonProductScraperArgs + args_schema: type[BaseModel] = OxylabsAmazonProductScraperArgs oxylabs_api: RealtimeClient config: OxylabsAmazonProductScraperConfig - package_dependencies: List[str] = ["oxylabs"] - env_vars: List[EnvVar] = [ - EnvVar( - name="OXYLABS_USERNAME", description="Username for Oxylabs", required=True - ), - EnvVar( - name="OXYLABS_PASSWORD", description="Password for Oxylabs", required=True - ), - ] + package_dependencies: list[str] = Field(default_factory=lambda: ["oxylabs"]) + env_vars: list[EnvVar] = Field( + default_factory=lambda: [ + EnvVar( + name="OXYLABS_USERNAME", + description="Username for Oxylabs", + required=True, + ), + EnvVar( + name="OXYLABS_PASSWORD", + description="Password for Oxylabs", + required=True, + ), + ] + ) def __init__( self, username: str | None = None, password: str | None = None, - config: OxylabsAmazonProductScraperConfig - | dict = OxylabsAmazonProductScraperConfig(), + config: OxylabsAmazonProductScraperConfig | dict | None = None, **kwargs, ) -> None: bits, _ = architecture() @@ -119,7 +122,7 @@ class OxylabsAmazonProductScraperTool(BaseTool): import subprocess try: - subprocess.run(["uv", "add", "oxylabs"], check=True) + subprocess.run(["uv", "add", "oxylabs"], check=True) # noqa: S607 from oxylabs import RealtimeClient kwargs["oxylabs_api"] = RealtimeClient( @@ -127,13 +130,15 @@ class OxylabsAmazonProductScraperTool(BaseTool): password=password, sdk_type=sdk_type, ) - except subprocess.CalledProcessError: - raise ImportError("Failed to install oxylabs package") + except subprocess.CalledProcessError as e: + raise ImportError("Failed to install oxylabs package") from e else: raise ImportError( "`oxylabs` package not found, please run `uv add oxylabs`" ) + if config is None: + config = OxylabsAmazonProductScraperConfig() super().__init__(config=config, **kwargs) def _get_credentials_from_env(self) -> tuple[str, str]: diff --git a/lib/crewai-tools/src/crewai_tools/tools/oxylabs_amazon_search_scraper_tool/__init__.py b/lib/crewai-tools/src/crewai_tools/tools/oxylabs_amazon_search_scraper_tool/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/lib/crewai-tools/src/crewai_tools/tools/oxylabs_amazon_search_scraper_tool/oxylabs_amazon_search_scraper_tool.py b/lib/crewai-tools/src/crewai_tools/tools/oxylabs_amazon_search_scraper_tool/oxylabs_amazon_search_scraper_tool.py index 09d9c9194..6957a927d 100644 --- a/lib/crewai-tools/src/crewai_tools/tools/oxylabs_amazon_search_scraper_tool/oxylabs_amazon_search_scraper_tool.py +++ b/lib/crewai-tools/src/crewai_tools/tools/oxylabs_amazon_search_scraper_tool/oxylabs_amazon_search_scraper_tool.py @@ -2,7 +2,7 @@ from importlib.metadata import version import json import os from platform import architecture, python_version -from typing import Any, List, Type +from typing import Any from crewai.tools import BaseTool, EnvVar from pydantic import BaseModel, ConfigDict, Field @@ -28,9 +28,8 @@ class OxylabsAmazonSearchScraperArgs(BaseModel): class OxylabsAmazonSearchScraperConfig(BaseModel): - """ - Amazon Search Scraper configuration options: - https://developers.oxylabs.io/scraper-apis/web-scraper-api/targets/amazon/search + """Amazon Search Scraper configuration options: + https://developers.oxylabs.io/scraper-apis/web-scraper-api/targets/amazon/search. """ domain: str | None = Field( @@ -53,8 +52,7 @@ class OxylabsAmazonSearchScraperConfig(BaseModel): class OxylabsAmazonSearchScraperTool(BaseTool): - """ - Scrape Amazon search results with OxylabsAmazonSearchScraperTool. + """Scrape Amazon search results with OxylabsAmazonSearchScraperTool. Get Oxylabs account: https://dashboard.oxylabs.io/en @@ -71,26 +69,31 @@ class OxylabsAmazonSearchScraperTool(BaseTool): ) name: str = "Oxylabs Amazon Search Scraper tool" description: str = "Scrape Amazon search results with Oxylabs Amazon Search Scraper" - args_schema: Type[BaseModel] = OxylabsAmazonSearchScraperArgs + args_schema: type[BaseModel] = OxylabsAmazonSearchScraperArgs oxylabs_api: RealtimeClient config: OxylabsAmazonSearchScraperConfig - package_dependencies: List[str] = ["oxylabs"] - env_vars: List[EnvVar] = [ - EnvVar( - name="OXYLABS_USERNAME", description="Username for Oxylabs", required=True - ), - EnvVar( - name="OXYLABS_PASSWORD", description="Password for Oxylabs", required=True - ), - ] + package_dependencies: list[str] = Field(default_factory=lambda: ["oxylabs"]) + env_vars: list[EnvVar] = Field( + default_factory=lambda: [ + EnvVar( + name="OXYLABS_USERNAME", + description="Username for Oxylabs", + required=True, + ), + EnvVar( + name="OXYLABS_PASSWORD", + description="Password for Oxylabs", + required=True, + ), + ] + ) def __init__( self, username: str | None = None, password: str | None = None, - config: OxylabsAmazonSearchScraperConfig - | dict = OxylabsAmazonSearchScraperConfig(), + config: OxylabsAmazonSearchScraperConfig | dict | None = None, **kwargs, ): bits, _ = architecture() @@ -121,7 +124,7 @@ class OxylabsAmazonSearchScraperTool(BaseTool): import subprocess try: - subprocess.run(["uv", "add", "oxylabs"], check=True) + subprocess.run(["uv", "add", "oxylabs"], check=True) # noqa: S607 from oxylabs import RealtimeClient kwargs["oxylabs_api"] = RealtimeClient( @@ -129,13 +132,15 @@ class OxylabsAmazonSearchScraperTool(BaseTool): password=password, sdk_type=sdk_type, ) - except subprocess.CalledProcessError: - raise ImportError("Failed to install oxylabs package") + except subprocess.CalledProcessError as e: + raise ImportError("Failed to install oxylabs package") from e else: raise ImportError( "`oxylabs` package not found, please run `uv add oxylabs`" ) + if config is None: + config = OxylabsAmazonSearchScraperConfig() super().__init__(config=config, **kwargs) def _get_credentials_from_env(self) -> tuple[str, str]: diff --git a/lib/crewai-tools/src/crewai_tools/tools/oxylabs_google_search_scraper_tool/__init__.py b/lib/crewai-tools/src/crewai_tools/tools/oxylabs_google_search_scraper_tool/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/lib/crewai-tools/src/crewai_tools/tools/oxylabs_google_search_scraper_tool/oxylabs_google_search_scraper_tool.py b/lib/crewai-tools/src/crewai_tools/tools/oxylabs_google_search_scraper_tool/oxylabs_google_search_scraper_tool.py index 1c899dc1b..fd5fad103 100644 --- a/lib/crewai-tools/src/crewai_tools/tools/oxylabs_google_search_scraper_tool/oxylabs_google_search_scraper_tool.py +++ b/lib/crewai-tools/src/crewai_tools/tools/oxylabs_google_search_scraper_tool/oxylabs_google_search_scraper_tool.py @@ -2,7 +2,7 @@ from importlib.metadata import version import json import os from platform import architecture, python_version -from typing import Any, List, Type +from typing import Any from crewai.tools import BaseTool, EnvVar from pydantic import BaseModel, ConfigDict, Field @@ -28,9 +28,8 @@ class OxylabsGoogleSearchScraperArgs(BaseModel): class OxylabsGoogleSearchScraperConfig(BaseModel): - """ - Google Search Scraper configuration options: - https://developers.oxylabs.io/scraper-apis/web-scraper-api/targets/google/search/search + """Google Search Scraper configuration options: + https://developers.oxylabs.io/scraper-apis/web-scraper-api/targets/google/search/search. """ domain: str | None = Field( @@ -56,8 +55,7 @@ class OxylabsGoogleSearchScraperConfig(BaseModel): class OxylabsGoogleSearchScraperTool(BaseTool): - """ - Scrape Google Search results with OxylabsGoogleSearchScraperTool. + """Scrape Google Search results with OxylabsGoogleSearchScraperTool. Get Oxylabs account: https://dashboard.oxylabs.io/en @@ -74,26 +72,31 @@ class OxylabsGoogleSearchScraperTool(BaseTool): ) name: str = "Oxylabs Google Search Scraper tool" description: str = "Scrape Google Search results with Oxylabs Google Search Scraper" - args_schema: Type[BaseModel] = OxylabsGoogleSearchScraperArgs + args_schema: type[BaseModel] = OxylabsGoogleSearchScraperArgs oxylabs_api: RealtimeClient config: OxylabsGoogleSearchScraperConfig - package_dependencies: List[str] = ["oxylabs"] - env_vars: List[EnvVar] = [ - EnvVar( - name="OXYLABS_USERNAME", description="Username for Oxylabs", required=True - ), - EnvVar( - name="OXYLABS_PASSWORD", description="Password for Oxylabs", required=True - ), - ] + package_dependencies: list[str] = Field(default_factory=lambda: ["oxylabs"]) + env_vars: list[EnvVar] = Field( + default_factory=lambda: [ + EnvVar( + name="OXYLABS_USERNAME", + description="Username for Oxylabs", + required=True, + ), + EnvVar( + name="OXYLABS_PASSWORD", + description="Password for Oxylabs", + required=True, + ), + ] + ) def __init__( self, username: str | None = None, password: str | None = None, - config: OxylabsGoogleSearchScraperConfig - | dict = OxylabsGoogleSearchScraperConfig(), + config: OxylabsGoogleSearchScraperConfig | dict | None = None, **kwargs, ): bits, _ = architecture() @@ -124,7 +127,7 @@ class OxylabsGoogleSearchScraperTool(BaseTool): import subprocess try: - subprocess.run(["uv", "add", "oxylabs"], check=True) + subprocess.run(["uv", "add", "oxylabs"], check=True) # noqa: S607 from oxylabs import RealtimeClient kwargs["oxylabs_api"] = RealtimeClient( @@ -132,13 +135,15 @@ class OxylabsGoogleSearchScraperTool(BaseTool): password=password, sdk_type=sdk_type, ) - except subprocess.CalledProcessError: - raise ImportError("Failed to install oxylabs package") + except subprocess.CalledProcessError as e: + raise ImportError("Failed to install oxylabs package") from e else: raise ImportError( "`oxylabs` package not found, please run `uv add oxylabs`" ) + if config is None: + config = OxylabsGoogleSearchScraperConfig() super().__init__(config=config, **kwargs) def _get_credentials_from_env(self) -> tuple[str, str]: diff --git a/lib/crewai-tools/src/crewai_tools/tools/oxylabs_universal_scraper_tool/__init__.py b/lib/crewai-tools/src/crewai_tools/tools/oxylabs_universal_scraper_tool/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/lib/crewai-tools/src/crewai_tools/tools/oxylabs_universal_scraper_tool/oxylabs_universal_scraper_tool.py b/lib/crewai-tools/src/crewai_tools/tools/oxylabs_universal_scraper_tool/oxylabs_universal_scraper_tool.py index 323a2f8f8..d4dd33c85 100644 --- a/lib/crewai-tools/src/crewai_tools/tools/oxylabs_universal_scraper_tool/oxylabs_universal_scraper_tool.py +++ b/lib/crewai-tools/src/crewai_tools/tools/oxylabs_universal_scraper_tool/oxylabs_universal_scraper_tool.py @@ -2,7 +2,7 @@ from importlib.metadata import version import json import os from platform import architecture, python_version -from typing import Any, List, Type +from typing import Any from crewai.tools import BaseTool, EnvVar from pydantic import BaseModel, ConfigDict, Field @@ -27,9 +27,8 @@ class OxylabsUniversalScraperArgs(BaseModel): class OxylabsUniversalScraperConfig(BaseModel): - """ - Universal Scraper configuration options: - https://developers.oxylabs.io/scraper-apis/web-scraper-api/other-websites + """Universal Scraper configuration options: + https://developers.oxylabs.io/scraper-apis/web-scraper-api/other-websites. """ geo_location: str | None = Field(None, description="The Deliver to location.") @@ -47,8 +46,7 @@ class OxylabsUniversalScraperConfig(BaseModel): class OxylabsUniversalScraperTool(BaseTool): - """ - Scrape any website with OxylabsUniversalScraperTool. + """Scrape any website with OxylabsUniversalScraperTool. Get Oxylabs account: https://dashboard.oxylabs.io/en @@ -65,25 +63,31 @@ class OxylabsUniversalScraperTool(BaseTool): ) name: str = "Oxylabs Universal Scraper tool" description: str = "Scrape any url with Oxylabs Universal Scraper" - args_schema: Type[BaseModel] = OxylabsUniversalScraperArgs + args_schema: type[BaseModel] = OxylabsUniversalScraperArgs oxylabs_api: RealtimeClient config: OxylabsUniversalScraperConfig - package_dependencies: List[str] = ["oxylabs"] - env_vars: List[EnvVar] = [ - EnvVar( - name="OXYLABS_USERNAME", description="Username for Oxylabs", required=True - ), - EnvVar( - name="OXYLABS_PASSWORD", description="Password for Oxylabs", required=True - ), - ] + package_dependencies: list[str] = Field(default_factory=lambda: ["oxylabs"]) + env_vars: list[EnvVar] = Field( + default_factory=lambda: [ + EnvVar( + name="OXYLABS_USERNAME", + description="Username for Oxylabs", + required=True, + ), + EnvVar( + name="OXYLABS_PASSWORD", + description="Password for Oxylabs", + required=True, + ), + ] + ) def __init__( self, username: str | None = None, password: str | None = None, - config: OxylabsUniversalScraperConfig | dict = OxylabsUniversalScraperConfig(), + config: OxylabsUniversalScraperConfig | dict | None = None, **kwargs, ): bits, _ = architecture() @@ -114,7 +118,7 @@ class OxylabsUniversalScraperTool(BaseTool): import subprocess try: - subprocess.run(["uv", "add", "oxylabs"], check=True) + subprocess.run(["uv", "add", "oxylabs"], check=True) # noqa: S607 from oxylabs import RealtimeClient kwargs["oxylabs_api"] = RealtimeClient( @@ -122,13 +126,15 @@ class OxylabsUniversalScraperTool(BaseTool): password=password, sdk_type=sdk_type, ) - except subprocess.CalledProcessError: - raise ImportError("Failed to install oxylabs package") + except subprocess.CalledProcessError as e: + raise ImportError("Failed to install oxylabs package") from e else: raise ImportError( "`oxylabs` package not found, please run `uv add oxylabs`" ) + if config is None: + config = OxylabsUniversalScraperConfig() super().__init__(config=config, **kwargs) def _get_credentials_from_env(self) -> tuple[str, str]: diff --git a/lib/crewai-tools/src/crewai_tools/tools/parallel_tools/parallel_search_tool.py b/lib/crewai-tools/src/crewai_tools/tools/parallel_tools/parallel_search_tool.py index 3f61218ac..b015ec695 100644 --- a/lib/crewai-tools/src/crewai_tools/tools/parallel_tools/parallel_search_tool.py +++ b/lib/crewai-tools/src/crewai_tools/tools/parallel_tools/parallel_search_tool.py @@ -1,5 +1,5 @@ import os -from typing import Annotated, Any, Dict, List, Optional, Type +from typing import Annotated, Any from crewai.tools import BaseTool, EnvVar from pydantic import BaseModel, Field @@ -12,12 +12,12 @@ class ParallelSearchInput(BaseModel): At least one of objective or search_queries is required. """ - objective: Optional[str] = Field( + objective: str | None = Field( None, description="Natural-language goal for the web research (<=5000 chars)", max_length=5000, ) - search_queries: Optional[List[Annotated[str, Field(max_length=200)]]] = Field( + search_queries: list[Annotated[str, Field(max_length=200)]] | None = Field( default=None, description="Optional list of keyword queries (<=5 items, each <=200 chars)", min_length=1, @@ -39,7 +39,7 @@ class ParallelSearchInput(BaseModel): ge=100, description="Maximum characters per result excerpt (values >30000 not guaranteed)", ) - source_policy: Optional[Dict[str, Any]] = Field( + source_policy: dict[str, Any] | None = Field( default=None, description="Optional source policy configuration" ) @@ -50,27 +50,29 @@ class ParallelSearchTool(BaseTool): "Search the web using Parallel's Search API (v1beta). Returns ranked results with " "compressed excerpts optimized for LLMs." ) - args_schema: Type[BaseModel] = ParallelSearchInput + args_schema: type[BaseModel] = ParallelSearchInput - env_vars: List[EnvVar] = [ - EnvVar( - name="PARALLEL_API_KEY", - description="API key for Parallel", - required=True, - ), - ] - package_dependencies: List[str] = ["requests"] + env_vars: list[EnvVar] = Field( + default_factory=lambda: [ + EnvVar( + name="PARALLEL_API_KEY", + description="API key for Parallel", + required=True, + ), + ] + ) + package_dependencies: list[str] = Field(default_factory=lambda: ["requests"]) search_url: str = "https://api.parallel.ai/v1beta/search" def _run( self, - objective: Optional[str] = None, - search_queries: Optional[List[str]] = None, + objective: str | None = None, + search_queries: list[str] | None = None, processor: str = "base", max_results: int = 10, max_chars_per_result: int = 6000, - source_policy: Optional[Dict[str, Any]] = None, + source_policy: dict[str, Any] | None = None, **_: Any, ) -> str: api_key = os.environ.get("PARALLEL_API_KEY") @@ -86,7 +88,7 @@ class ParallelSearchTool(BaseTool): } try: - payload: Dict[str, Any] = { + payload: dict[str, Any] = { "processor": processor, "max_results": max_results, "max_chars_per_result": max_chars_per_result, @@ -113,7 +115,7 @@ class ParallelSearchTool(BaseTool): except Exception as exc: return f"Unexpected error calling Parallel Search API: {exc}" - def _format_output(self, result: Dict[str, Any]) -> str: + def _format_output(self, result: dict[str, Any]) -> str: # Return the full JSON payload (search_id + results) as a compact JSON string try: import json diff --git a/lib/crewai-tools/src/crewai_tools/tools/patronus_eval_tool/patronus_eval_tool.py b/lib/crewai-tools/src/crewai_tools/tools/patronus_eval_tool/patronus_eval_tool.py index 6cc2d0f23..ee2cefb02 100644 --- a/lib/crewai-tools/src/crewai_tools/tools/patronus_eval_tool/patronus_eval_tool.py +++ b/lib/crewai-tools/src/crewai_tools/tools/patronus_eval_tool/patronus_eval_tool.py @@ -1,25 +1,28 @@ import json import os -from typing import Any, Dict, List, Optional +from typing import Any import warnings from crewai.tools import BaseTool, EnvVar +from pydantic import Field import requests class PatronusEvalTool(BaseTool): name: str = "Patronus Evaluation Tool" evaluate_url: str = "https://api.patronus.ai/v1/evaluate" - evaluators: List[Dict[str, str]] = [] - criteria: List[Dict[str, str]] = [] + evaluators: list[dict[str, str]] = Field(default_factory=list) + criteria: list[dict[str, str]] = Field(default_factory=list) description: str = "" - env_vars: List[EnvVar] = [ - EnvVar( - name="PATRONUS_API_KEY", - description="API key for Patronus evaluation services", - required=True, - ), - ] + env_vars: list[EnvVar] = Field( + default_factory=lambda: [ + EnvVar( + name="PATRONUS_API_KEY", + description="API key for Patronus evaluation services", + required=True, + ), + ] + ) def __init__(self, **kwargs: Any): super().__init__(**kwargs) @@ -28,7 +31,8 @@ class PatronusEvalTool(BaseTool): self.criteria = temp_criteria self.description = self._generate_description() warnings.warn( - "You are allowing the agent to select the best evaluator and criteria when you use the `PatronusEvalTool`. If this is not intended then please use `PatronusPredefinedCriteriaEvalTool` instead." + "You are allowing the agent to select the best evaluator and criteria when you use the `PatronusEvalTool`. If this is not intended then please use `PatronusPredefinedCriteriaEvalTool` instead.", + stacklevel=2, ) def _init_run(self): @@ -39,6 +43,7 @@ class PatronusEvalTool(BaseTool): "accept": "application/json", "X-API-KEY": os.environ["PATRONUS_API_KEY"], }, + timeout=30, ).text )["evaluators"] ids, evaluators = set(), [] @@ -61,6 +66,7 @@ class PatronusEvalTool(BaseTool): "accept": "application/json", "X-API-KEY": os.environ["PATRONUS_API_KEY"], }, + timeout=30, ).text )["evaluator_criteria"] criteria = [] @@ -100,24 +106,24 @@ class PatronusEvalTool(BaseTool): 1. evaluated_model_input: str: The agent's task description in simple text 2. evaluated_model_output: str: The agent's output of the task 3. evaluated_model_retrieved_context: str: The agent's context - 4. evaluators: This is a list of dictionaries containing one of the following evaluators and the corresponding criteria. An example input for this field: [{{"evaluator": "Judge", "criteria": "patronus:is-code"}}] + 4. evaluators: This is a list of dictionaries containing one of the following evaluators and the corresponding criteria. An example input for this field: [{{"evaluator": "Judge", "criteria": "patronus:is-code"}}] - Evaluators: + Evaluators: {criteria} You must ONLY choose the most appropriate evaluator and criteria based on the "pass_criteria" or "description" fields for your evaluation task and nothing from outside of the options present.""" def _run( self, - evaluated_model_input: Optional[str], - evaluated_model_output: Optional[str], - evaluated_model_retrieved_context: Optional[str], - evaluators: List[Dict[str, str]], + evaluated_model_input: str | None, + evaluated_model_output: str | None, + evaluated_model_retrieved_context: str | None, + evaluators: list[dict[str, str]], ) -> Any: # Assert correct format of evaluators evals = [] for ev in evaluators: - evals.append( + evals.append( # noqa: PERF401 { "evaluator": ev["evaluator"].lower(), "criteria": ev["name"] if "name" in ev else ev["criteria"], @@ -138,7 +144,10 @@ class PatronusEvalTool(BaseTool): } response = requests.post( - self.evaluate_url, headers=headers, data=json.dumps(data) + self.evaluate_url, + headers=headers, + data=json.dumps(data), + timeout=30, ) if response.status_code != 200: raise Exception( diff --git a/lib/crewai-tools/src/crewai_tools/tools/patronus_eval_tool/patronus_local_evaluator_tool.py b/lib/crewai-tools/src/crewai_tools/tools/patronus_eval_tool/patronus_local_evaluator_tool.py index 6592d1a4a..2c0a90363 100644 --- a/lib/crewai-tools/src/crewai_tools/tools/patronus_eval_tool/patronus_local_evaluator_tool.py +++ b/lib/crewai-tools/src/crewai_tools/tools/patronus_eval_tool/patronus_local_evaluator_tool.py @@ -1,4 +1,4 @@ -from typing import TYPE_CHECKING, Any, List, Type +from typing import TYPE_CHECKING, Any from crewai.tools import BaseTool from pydantic import BaseModel, ConfigDict, Field @@ -8,7 +8,7 @@ if TYPE_CHECKING: from patronus import Client, EvaluationResult try: - import patronus + import patronus # noqa: F401 PYPATRONUS_AVAILABLE = True except ImportError: @@ -34,13 +34,13 @@ class FixedLocalEvaluatorToolSchema(BaseModel): class PatronusLocalEvaluatorTool(BaseTool): name: str = "Patronus Local Evaluator Tool" description: str = "This tool is used to evaluate the model input and output using custom function evaluators." - args_schema: Type[BaseModel] = FixedLocalEvaluatorToolSchema + args_schema: type[BaseModel] = FixedLocalEvaluatorToolSchema client: "Client" = None evaluator: str evaluated_model_gold_answer: str model_config = ConfigDict(arbitrary_types_allowed=True) - package_dependencies: List[str] = ["patronus"] + package_dependencies: list[str] = Field(default_factory=lambda: ["patronus"]) def __init__( self, @@ -59,9 +59,6 @@ class PatronusLocalEvaluatorTool(BaseTool): if PYPATRONUS_AVAILABLE: self.client = patronus_client self._generate_description() - print( - f"Updating evaluator and gold_answer to: {self.evaluator}, {self.evaluated_model_gold_answer}" - ) else: raise ImportError except ImportError: @@ -73,18 +70,15 @@ class PatronusLocalEvaluatorTool(BaseTool): import subprocess try: - subprocess.run(["uv", "add", "patronus"], check=True) + subprocess.run(["uv", "add", "patronus"], check=True) # noqa: S607 self.client = patronus_client self._generate_description() - print( - f"Updating evaluator and gold_answer to: {self.evaluator}, {self.evaluated_model_gold_answer}" - ) - except subprocess.CalledProcessError: - raise ImportError("Failed to install 'patronus' package") + except subprocess.CalledProcessError as e: + raise ImportError("Failed to install 'patronus' package") from e else: raise ImportError( "`patronus` package not found, please run `uv add patronus`" - ) + ) from None def _run( self, @@ -106,8 +100,7 @@ class PatronusLocalEvaluatorTool(BaseTool): evaluated_model_gold_answer=evaluated_model_gold_answer, tags={}, # Optional metadata, supports arbitrary key-value pairs ) - output = f"Evaluation result: {result.pass_}, Explanation: {result.explanation}" - return output + return f"Evaluation result: {result.pass_}, Explanation: {result.explanation}" try: @@ -115,5 +108,5 @@ try: if not hasattr(PatronusLocalEvaluatorTool, "_model_rebuilt"): PatronusLocalEvaluatorTool.model_rebuild() PatronusLocalEvaluatorTool._model_rebuilt = True -except Exception: +except Exception: # noqa: S110 pass diff --git a/lib/crewai-tools/src/crewai_tools/tools/patronus_eval_tool/patronus_predefined_criteria_eval_tool.py b/lib/crewai-tools/src/crewai_tools/tools/patronus_eval_tool/patronus_predefined_criteria_eval_tool.py index 6cec880e5..90553b2dc 100644 --- a/lib/crewai-tools/src/crewai_tools/tools/patronus_eval_tool/patronus_predefined_criteria_eval_tool.py +++ b/lib/crewai-tools/src/crewai_tools/tools/patronus_eval_tool/patronus_predefined_criteria_eval_tool.py @@ -1,6 +1,6 @@ import json import os -from typing import Any, Dict, List, Type +from typing import Any from crewai.tools import BaseTool from pydantic import BaseModel, Field @@ -8,27 +8,26 @@ import requests class FixedBaseToolSchema(BaseModel): - evaluated_model_input: Dict = Field( + evaluated_model_input: dict = Field( ..., description="The agent's task description in simple text" ) - evaluated_model_output: Dict = Field( + evaluated_model_output: dict = Field( ..., description="The agent's output of the task" ) - evaluated_model_retrieved_context: Dict = Field( + evaluated_model_retrieved_context: dict = Field( ..., description="The agent's context" ) - evaluated_model_gold_answer: Dict = Field( + evaluated_model_gold_answer: dict = Field( ..., description="The agent's gold answer only if available" ) - evaluators: List[Dict[str, str]] = Field( + evaluators: list[dict[str, str]] = Field( ..., description="List of dictionaries containing the evaluator and criteria to evaluate the model input and output. An example input for this field: [{'evaluator': '[evaluator-from-user]', 'criteria': '[criteria-from-user]'}]", ) class PatronusPredefinedCriteriaEvalTool(BaseTool): - """ - PatronusEvalTool is a tool to automatically evaluate and score agent interactions. + """PatronusEvalTool is a tool to automatically evaluate and score agent interactions. Results are logged to the Patronus platform at app.patronus.ai """ @@ -36,16 +35,15 @@ class PatronusPredefinedCriteriaEvalTool(BaseTool): name: str = "Call Patronus API tool for evaluation of model inputs and outputs" description: str = """This tool calls the Patronus Evaluation API that takes the following arguments:""" evaluate_url: str = "https://api.patronus.ai/v1/evaluate" - args_schema: Type[BaseModel] = FixedBaseToolSchema - evaluators: List[Dict[str, str]] = [] + args_schema: type[BaseModel] = FixedBaseToolSchema + evaluators: list[dict[str, str]] = Field(default_factory=list) - def __init__(self, evaluators: List[Dict[str, str]], **kwargs: Any): + def __init__(self, evaluators: list[dict[str, str]], **kwargs: Any): super().__init__(**kwargs) if evaluators: self.evaluators = evaluators self.description = f"This tool calls the Patronus Evaluation API that takes an additional argument in addition to the following new argument:\n evaluators={evaluators}" self._generate_description() - print(f"Updating judge criteria to: {self.evaluators}") def _run( self, @@ -94,7 +92,10 @@ class PatronusPredefinedCriteriaEvalTool(BaseTool): } response = requests.post( - self.evaluate_url, headers=headers, data=json.dumps(data) + self.evaluate_url, + headers=headers, + data=json.dumps(data), + timeout=30, ) if response.status_code != 200: raise Exception( diff --git a/lib/crewai-tools/src/crewai_tools/tools/pdf_search_tool/__init__.py b/lib/crewai-tools/src/crewai_tools/tools/pdf_search_tool/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/lib/crewai-tools/src/crewai_tools/tools/pdf_search_tool/pdf_search_tool.py b/lib/crewai-tools/src/crewai_tools/tools/pdf_search_tool/pdf_search_tool.py index f93cf22f6..f4a3b27ac 100644 --- a/lib/crewai-tools/src/crewai_tools/tools/pdf_search_tool/pdf_search_tool.py +++ b/lib/crewai-tools/src/crewai_tools/tools/pdf_search_tool/pdf_search_tool.py @@ -1,7 +1,6 @@ -from typing import Optional, Type +from pydantic import BaseModel, Field from crewai_tools.rag.data_types import DataType -from pydantic import BaseModel, Field from ..rag.rag_tool import RagTool @@ -25,9 +24,9 @@ class PDFSearchTool(RagTool): description: str = ( "A tool that can be used to semantic search a query from a PDF's content." ) - args_schema: Type[BaseModel] = PDFSearchToolSchema + args_schema: type[BaseModel] = PDFSearchToolSchema - def __init__(self, pdf: Optional[str] = None, **kwargs): + def __init__(self, pdf: str | None = None, **kwargs): super().__init__(**kwargs) if pdf is not None: self.add(pdf) @@ -41,7 +40,7 @@ class PDFSearchTool(RagTool): def _run( self, query: str, - pdf: Optional[str] = None, + pdf: str | None = None, similarity_threshold: float | None = None, limit: int | None = None, ) -> str: diff --git a/lib/crewai-tools/src/crewai_tools/tools/pdf_text_writing_tool/pdf_text_writing_tool.py b/lib/crewai-tools/src/crewai_tools/tools/pdf_text_writing_tool/pdf_text_writing_tool.py deleted file mode 100644 index a7c6fab78..000000000 --- a/lib/crewai-tools/src/crewai_tools/tools/pdf_text_writing_tool/pdf_text_writing_tool.py +++ /dev/null @@ -1,87 +0,0 @@ -from pathlib import Path -from typing import Optional, Type - -from crewai_tools.tools.rag.rag_tool import RagTool -from pydantic import BaseModel, Field -from pypdf import ContentStream, Font, NameObject, PageObject, PdfReader, PdfWriter - - -class PDFTextWritingToolSchema(BaseModel): - """Input schema for PDFTextWritingTool.""" - - pdf_path: str = Field(..., description="Path to the PDF file to modify") - text: str = Field(..., description="Text to add to the PDF") - position: tuple = Field( - ..., description="Tuple of (x, y) coordinates for text placement" - ) - font_size: int = Field(default=12, description="Font size of the text") - font_color: str = Field( - default="0 0 0 rg", description="RGB color code for the text" - ) - font_name: Optional[str] = Field( - default="F1", description="Font name for standard fonts" - ) - font_file: Optional[str] = Field( - None, description="Path to a .ttf font file for custom font usage" - ) - page_number: int = Field(default=0, description="Page number to add text to") - - -class PDFTextWritingTool(RagTool): - """A tool to add text to specific positions in a PDF, with custom font support.""" - - name: str = "PDF Text Writing Tool" - description: str = "A tool that can write text to a specific position in a PDF document, with optional custom font embedding." - args_schema: Type[BaseModel] = PDFTextWritingToolSchema - - def run( - self, - pdf_path: str, - text: str, - position: tuple, - font_size: int, - font_color: str, - font_name: str = "F1", - font_file: Optional[str] = None, - page_number: int = 0, - ) -> str: - reader = PdfReader(pdf_path) - writer = PdfWriter() - - if page_number >= len(reader.pages): - return "Page number out of range." - - page: PageObject = reader.pages[page_number] - content = ContentStream(page["/Contents"].data, reader) - - if font_file: - # Check if the font file exists - if not Path(font_file).exists(): - return "Font file does not exist." - - # Embed the custom font - font_name = self.embed_font(writer, font_file) - - # Prepare text operation with the custom or standard font - x_position, y_position = position - text_operation = f"BT /{font_name} {font_size} Tf {x_position} {y_position} Td ({text}) Tj ET" - content.operations.append([font_color]) # Set color - content.operations.append([text_operation]) # Add text - - # Replace old content with new content - page[NameObject("/Contents")] = content - writer.add_page(page) - - # Save the new PDF - output_pdf_path = "modified_output.pdf" - with open(output_pdf_path, "wb") as out_file: - writer.write(out_file) - - return f"Text added to {output_pdf_path} successfully." - - def embed_font(self, writer: PdfWriter, font_file: str) -> str: - """Embeds a TTF font into the PDF and returns the font name.""" - with open(font_file, "rb") as file: - font = Font.true_type(file.read()) - font_ref = writer.add_object(font) - return font_ref diff --git a/lib/crewai-tools/src/crewai_tools/tools/pg_search_tool/README.md b/lib/crewai-tools/src/crewai_tools/tools/pg_search_tool/README.md deleted file mode 100644 index e462be803..000000000 --- a/lib/crewai-tools/src/crewai_tools/tools/pg_search_tool/README.md +++ /dev/null @@ -1,56 +0,0 @@ -# PGSearchTool - -## Description -This tool is designed to facilitate semantic searches within PostgreSQL database tables. Leveraging the RAG (Retrieve and Generate) technology, the PGSearchTool provides users with an efficient means of querying database table content, specifically tailored for PostgreSQL databases. It simplifies the process of finding relevant data through semantic search queries, making it an invaluable resource for users needing to perform advanced queries on extensive datasets within a PostgreSQL database. - -## Installation -To install the `crewai_tools` package and utilize the PGSearchTool, execute the following command in your terminal: - -```shell -pip install 'crewai[tools]' -``` - -## Example -Below is an example showcasing how to use the PGSearchTool to conduct a semantic search on a table within a PostgreSQL database: - -```python -from crewai_tools import PGSearchTool - -# Initialize the tool with the database URI and the target table name -tool = PGSearchTool(db_uri='postgresql://user:password@localhost:5432/mydatabase', table_name='employees') - -``` - -## Arguments -The PGSearchTool requires the following arguments for its operation: - -- `db_uri`: A string representing the URI of the PostgreSQL database to be queried. This argument is mandatory and must include the necessary authentication details and the location of the database. -- `table_name`: A string specifying the name of the table within the database on which the semantic search will be performed. This argument is mandatory. - -## Custom model and embeddings - -By default, the tool uses OpenAI for both embeddings and summarization. To customize the model, you can use a config dictionary as follows: - -```python -tool = PGSearchTool( - config=dict( - llm=dict( - provider="ollama", # or google, openai, anthropic, llama2, ... - config=dict( - model="llama2", - # temperature=0.5, - # top_p=1, - # stream=true, - ), - ), - embedder=dict( - provider="google", - config=dict( - model="models/embedding-001", - task_type="retrieval_document", - # title="Embeddings", - ), - ), - ) -) -``` diff --git a/lib/crewai-tools/src/crewai_tools/tools/pg_search_tool/pg_search_tool.py b/lib/crewai-tools/src/crewai_tools/tools/pg_search_tool/pg_search_tool.py deleted file mode 100644 index 9de548197..000000000 --- a/lib/crewai-tools/src/crewai_tools/tools/pg_search_tool/pg_search_tool.py +++ /dev/null @@ -1,51 +0,0 @@ -from typing import Any, Type - -from crewai_tools.rag.data_types import DataType -from pydantic import BaseModel, Field - -from ..rag.rag_tool import RagTool - - -class PGSearchToolSchema(BaseModel): - """Input for PGSearchTool.""" - - search_query: str = Field( - ..., - description="Mandatory semantic search query you want to use to search the database's content", - ) - - -class PGSearchTool(RagTool): - name: str = "Search a database's table content" - description: str = "A tool that can be used to semantic search a query from a database table's content." - args_schema: Type[BaseModel] = PGSearchToolSchema - db_uri: str = Field(..., description="Mandatory database URI") - - def __init__(self, table_name: str, **kwargs): - super().__init__(**kwargs) - self.add( - table_name, data_type=DataType.POSTGRES, metadata={"db_uri": self.db_uri} - ) - self.description = f"A tool that can be used to semantic search a query the {table_name} database table's content." - self._generate_description() - - def add( - self, - table_name: str, - **kwargs: Any, - ) -> None: - super().add(f"SELECT * FROM {table_name};", **kwargs) - - def _run( - self, - search_query: str, - similarity_threshold: float | None = None, - limit: int | None = None, - **kwargs: Any, - ) -> Any: - return super()._run( - query=search_query, - similarity_threshold=similarity_threshold, - limit=limit, - **kwargs, - ) diff --git a/lib/crewai-tools/src/crewai_tools/tools/qdrant_vector_search_tool/__init__.py b/lib/crewai-tools/src/crewai_tools/tools/qdrant_vector_search_tool/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/lib/crewai-tools/src/crewai_tools/tools/qdrant_vector_search_tool/qdrant_search_tool.py b/lib/crewai-tools/src/crewai_tools/tools/qdrant_vector_search_tool/qdrant_search_tool.py index 6b8b6354b..c461fd4f6 100644 --- a/lib/crewai-tools/src/crewai_tools/tools/qdrant_vector_search_tool/qdrant_search_tool.py +++ b/lib/crewai-tools/src/crewai_tools/tools/qdrant_vector_search_tool/qdrant_search_tool.py @@ -1,6 +1,7 @@ +from collections.abc import Callable import json import os -from typing import Any, Callable, List, Optional, Type +from typing import Any try: @@ -16,7 +17,7 @@ except ImportError: MatchValue = Any from crewai.tools import BaseTool, EnvVar -from pydantic import BaseModel, Field +from pydantic import BaseModel, ConfigDict, Field class QdrantToolSchema(BaseModel): @@ -26,11 +27,11 @@ class QdrantToolSchema(BaseModel): ..., description="The query to search retrieve relevant information from the Qdrant database. Pass only the query, not the question.", ) - filter_by: Optional[str] = Field( + filter_by: str | None = Field( default=None, description="Filter by properties. Pass only the properties, not the question.", ) - filter_value: Optional[str] = Field( + filter_value: str | None = Field( default=None, description="Filter by value. Pass only the value, not the question.", ) @@ -51,33 +52,37 @@ class QdrantVectorSearchTool(BaseTool): qdrant_api_key: Authentication key for Qdrant """ - model_config = {"arbitrary_types_allowed": True} + model_config = ConfigDict(arbitrary_types_allowed=True) client: QdrantClient = None name: str = "QdrantVectorSearchTool" description: str = "A tool to search the Qdrant database for relevant information on internal documents." - args_schema: Type[BaseModel] = QdrantToolSchema - query: Optional[str] = None - filter_by: Optional[str] = None - filter_value: Optional[str] = None - collection_name: Optional[str] = None - limit: Optional[int] = Field(default=3) + args_schema: type[BaseModel] = QdrantToolSchema + query: str | None = None + filter_by: str | None = None + filter_value: str | None = None + collection_name: str | None = None + limit: int | None = Field(default=3) score_threshold: float = Field(default=0.35) qdrant_url: str = Field( ..., description="The URL of the Qdrant server", ) - qdrant_api_key: Optional[str] = Field( + qdrant_api_key: str | None = Field( default=None, description="The API key for the Qdrant server", ) - custom_embedding_fn: Optional[Callable] = Field( + custom_embedding_fn: Callable | None = Field( default=None, description="A custom embedding function to use for vectorization. If not provided, the default model will be used.", ) - package_dependencies: List[str] = ["qdrant-client"] - env_vars: List[EnvVar] = [ - EnvVar(name="OPENAI_API_KEY", description="API key for OpenAI", required=True) - ] + package_dependencies: list[str] = Field(default_factory=lambda: ["qdrant-client"]) + env_vars: list[EnvVar] = Field( + default_factory=lambda: [ + EnvVar( + name="OPENAI_API_KEY", description="API key for OpenAI", required=True + ) + ] + ) def __init__(self, **kwargs): super().__init__(**kwargs) @@ -95,7 +100,7 @@ class QdrantVectorSearchTool(BaseTool): ): import subprocess - subprocess.run(["uv", "add", "qdrant-client"], check=True) + subprocess.run(["uv", "add", "qdrant-client"], check=True) # noqa: S607 else: raise ImportError( "The 'qdrant-client' package is required to use the QdrantVectorSearchTool. " @@ -105,8 +110,8 @@ class QdrantVectorSearchTool(BaseTool): def _run( self, query: str, - filter_by: Optional[str] = None, - filter_value: Optional[str] = None, + filter_by: str | None = None, + filter_value: str | None = None, ) -> str: """Execute vector similarity search on Qdrant. @@ -122,7 +127,6 @@ class QdrantVectorSearchTool(BaseTool): ImportError: If qdrant-client is not installed ValueError: If Qdrant credentials are missing """ - if not self.qdrant_url: raise ValueError("QDRANT_URL is not set") @@ -175,7 +179,7 @@ class QdrantVectorSearchTool(BaseTool): import openai client = openai.Client(api_key=os.getenv("OPENAI_API_KEY")) - embedding = ( + return ( client.embeddings.create( input=[query], model=embedding_model, @@ -183,4 +187,3 @@ class QdrantVectorSearchTool(BaseTool): .data[0] .embedding ) - return embedding diff --git a/lib/crewai-tools/src/crewai_tools/tools/rag/rag_tool.py b/lib/crewai-tools/src/crewai_tools/tools/rag/rag_tool.py index 57c945aae..b3466d0c1 100644 --- a/lib/crewai-tools/src/crewai_tools/tools/rag/rag_tool.py +++ b/lib/crewai-tools/src/crewai_tools/tools/rag/rag_tool.py @@ -130,8 +130,7 @@ class RagTool(BaseTool): factory_config["api_key"] = api_key if provider == "chromadb": - embedding_func = get_embedding_function(factory_config) - return embedding_func + return get_embedding_function(factory_config) if provider == "qdrant": chromadb_func = get_embedding_function(factory_config) diff --git a/lib/crewai-tools/src/crewai_tools/tools/scrape_element_from_website/__init__.py b/lib/crewai-tools/src/crewai_tools/tools/scrape_element_from_website/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/lib/crewai-tools/src/crewai_tools/tools/scrape_element_from_website/scrape_element_from_website.py b/lib/crewai-tools/src/crewai_tools/tools/scrape_element_from_website/scrape_element_from_website.py index 57b5044a8..fee2be41f 100644 --- a/lib/crewai-tools/src/crewai_tools/tools/scrape_element_from_website/scrape_element_from_website.py +++ b/lib/crewai-tools/src/crewai_tools/tools/scrape_element_from_website/scrape_element_from_website.py @@ -1,5 +1,5 @@ import os -from typing import Any, Optional, Type +from typing import Any from crewai.tools import BaseTool from pydantic import BaseModel, Field @@ -31,25 +31,27 @@ class ScrapeElementFromWebsiteToolSchema(FixedScrapeElementFromWebsiteToolSchema class ScrapeElementFromWebsiteTool(BaseTool): name: str = "Read a website content" description: str = "A tool that can be used to read a website content." - args_schema: Type[BaseModel] = ScrapeElementFromWebsiteToolSchema - website_url: Optional[str] = None - cookies: Optional[dict] = None - css_element: Optional[str] = None - headers: Optional[dict] = { - "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36", - "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9", - "Accept-Language": "en-US,en;q=0.9", - "Referer": "https://www.google.com/", - "Connection": "keep-alive", - "Upgrade-Insecure-Requests": "1", - "Accept-Encoding": "gzip, deflate, br", - } + args_schema: type[BaseModel] = ScrapeElementFromWebsiteToolSchema + website_url: str | None = None + cookies: dict | None = None + css_element: str | None = None + headers: dict | None = Field( + default_factory=lambda: { + "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36", + "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9", + "Accept-Language": "en-US,en;q=0.9", + "Referer": "https://www.google.com/", + "Connection": "keep-alive", + "Upgrade-Insecure-Requests": "1", + "Accept-Encoding": "gzip, deflate, br", + } + ) def __init__( self, - website_url: Optional[str] = None, - cookies: Optional[dict] = None, - css_element: Optional[str] = None, + website_url: str | None = None, + cookies: dict | None = None, + css_element: str | None = None, **kwargs, ): super().__init__(**kwargs) @@ -79,6 +81,7 @@ class ScrapeElementFromWebsiteTool(BaseTool): website_url, headers=self.headers, cookies=self.cookies if self.cookies else {}, + timeout=30, ) parsed = BeautifulSoup(page.content, "html.parser") elements = parsed.select(css_element) diff --git a/lib/crewai-tools/src/crewai_tools/tools/scrape_website_tool/__init__.py b/lib/crewai-tools/src/crewai_tools/tools/scrape_website_tool/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/lib/crewai-tools/src/crewai_tools/tools/scrape_website_tool/scrape_website_tool.py b/lib/crewai-tools/src/crewai_tools/tools/scrape_website_tool/scrape_website_tool.py index 206e2d16f..9728463f7 100644 --- a/lib/crewai-tools/src/crewai_tools/tools/scrape_website_tool/scrape_website_tool.py +++ b/lib/crewai-tools/src/crewai_tools/tools/scrape_website_tool/scrape_website_tool.py @@ -1,7 +1,8 @@ import os import re -from typing import Any, Optional, Type +from typing import Any +from pydantic import Field import requests @@ -12,7 +13,7 @@ try: except ImportError: BEAUTIFULSOUP_AVAILABLE = False from crewai.tools import BaseTool -from pydantic import BaseModel, Field +from pydantic import BaseModel class FixedScrapeWebsiteToolSchema(BaseModel): @@ -28,22 +29,24 @@ class ScrapeWebsiteToolSchema(FixedScrapeWebsiteToolSchema): class ScrapeWebsiteTool(BaseTool): name: str = "Read website content" description: str = "A tool that can be used to read a website content." - args_schema: Type[BaseModel] = ScrapeWebsiteToolSchema - website_url: Optional[str] = None - cookies: Optional[dict] = None - headers: Optional[dict] = { - "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36", - "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9", - "Accept-Language": "en-US,en;q=0.9", - "Referer": "https://www.google.com/", - "Connection": "keep-alive", - "Upgrade-Insecure-Requests": "1", - } + args_schema: type[BaseModel] = ScrapeWebsiteToolSchema + website_url: str | None = None + cookies: dict | None = None + headers: dict | None = Field( + default_factory=lambda: { + "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36", + "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9", + "Accept-Language": "en-US,en;q=0.9", + "Referer": "https://www.google.com/", + "Connection": "keep-alive", + "Upgrade-Insecure-Requests": "1", + } + ) def __init__( self, - website_url: Optional[str] = None, - cookies: Optional[dict] = None, + website_url: str | None = None, + cookies: dict | None = None, **kwargs, ): super().__init__(**kwargs) @@ -80,5 +83,4 @@ class ScrapeWebsiteTool(BaseTool): text = "The following text is scraped website content:\n\n" text += parsed.get_text(" ") text = re.sub("[ \t]+", " ", text) - text = re.sub("\\s+\n\\s+", "\n", text) - return text + return re.sub("\\s+\n\\s+", "\n", text) diff --git a/lib/crewai-tools/src/crewai_tools/tools/scrapegraph_scrape_tool/__init__.py b/lib/crewai-tools/src/crewai_tools/tools/scrapegraph_scrape_tool/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/lib/crewai-tools/src/crewai_tools/tools/scrapegraph_scrape_tool/scrapegraph_scrape_tool.py b/lib/crewai-tools/src/crewai_tools/tools/scrapegraph_scrape_tool/scrapegraph_scrape_tool.py index dbcb22c88..7bbfa7e73 100644 --- a/lib/crewai-tools/src/crewai_tools/tools/scrapegraph_scrape_tool/scrapegraph_scrape_tool.py +++ b/lib/crewai-tools/src/crewai_tools/tools/scrapegraph_scrape_tool/scrapegraph_scrape_tool.py @@ -1,5 +1,7 @@ +from __future__ import annotations + import os -from typing import TYPE_CHECKING, Any, List, Optional, Type +from typing import TYPE_CHECKING, Any from urllib.parse import urlparse from crewai.tools import BaseTool, EnvVar @@ -8,15 +10,15 @@ from pydantic import BaseModel, ConfigDict, Field, field_validator # Type checking import if TYPE_CHECKING: - from scrapegraph_py import Client + from scrapegraph_py import Client # type: ignore[import-not-found] class ScrapegraphError(Exception): - """Base exception for Scrapegraph-related errors""" + """Base exception for Scrapegraph-related errors.""" class RateLimitError(ScrapegraphError): - """Raised when API rate limits are exceeded""" + """Raised when API rate limits are exceeded.""" class FixedScrapegraphScrapeToolSchema(BaseModel): @@ -33,22 +35,22 @@ class ScrapegraphScrapeToolSchema(FixedScrapegraphScrapeToolSchema): ) @field_validator("website_url") + @classmethod def validate_url(cls, v): - """Validate URL format""" + """Validate URL format.""" try: result = urlparse(v) if not all([result.scheme, result.netloc]): raise ValueError return v - except Exception: + except Exception as e: raise ValueError( "Invalid URL format. URL must include scheme (http/https) and domain" - ) + ) from e class ScrapegraphScrapeTool(BaseTool): - """ - A tool that uses Scrapegraph AI to intelligently scrape website content. + """A tool that uses Scrapegraph AI to intelligently scrape website content. Raises: ValueError: If API key is missing or URL format is invalid @@ -62,33 +64,37 @@ class ScrapegraphScrapeTool(BaseTool): description: str = ( "A tool that uses Scrapegraph AI to intelligently scrape website content." ) - args_schema: Type[BaseModel] = ScrapegraphScrapeToolSchema - website_url: Optional[str] = None - user_prompt: Optional[str] = None - api_key: Optional[str] = None + args_schema: type[BaseModel] = ScrapegraphScrapeToolSchema + website_url: str | None = None + user_prompt: str | None = None + api_key: str | None = None enable_logging: bool = False - _client: Optional["Client"] = None - package_dependencies: List[str] = ["scrapegraph-py"] - env_vars: List[EnvVar] = [ - EnvVar( - name="SCRAPEGRAPH_API_KEY", - description="API key for Scrapegraph AI services", - required=False, - ), - ] + _client: Client | None = None + package_dependencies: list[str] = Field(default_factory=lambda: ["scrapegraph-py"]) + env_vars: list[EnvVar] = Field( + default_factory=lambda: [ + EnvVar( + name="SCRAPEGRAPH_API_KEY", + description="API key for Scrapegraph AI services", + required=False, + ), + ] + ) def __init__( self, - website_url: Optional[str] = None, - user_prompt: Optional[str] = None, - api_key: Optional[str] = None, + website_url: str | None = None, + user_prompt: str | None = None, + api_key: str | None = None, enable_logging: bool = False, **kwargs, ): super().__init__(**kwargs) try: - from scrapegraph_py import Client - from scrapegraph_py.logger import sgai_logger + from scrapegraph_py import Client # type: ignore[import-not-found] + from scrapegraph_py.logger import ( # type: ignore[import-not-found] + sgai_logger, + ) except ImportError: import click @@ -98,14 +104,16 @@ class ScrapegraphScrapeTool(BaseTool): ): import subprocess - subprocess.run(["uv", "add", "scrapegraph-py"], check=True) - from scrapegraph_py import Client - from scrapegraph_py.logger import sgai_logger + subprocess.run(["uv", "add", "scrapegraph-py"], check=True) # noqa: S607 + from scrapegraph_py import Client # type: ignore[import-not-found] + from scrapegraph_py.logger import ( # type: ignore[import-not-found] + sgai_logger, + ) else: raise ImportError( "`scrapegraph-py` package not found, please run `uv add scrapegraph-py`" - ) + ) from None self.api_key = api_key or os.getenv("SCRAPEGRAPH_API_KEY") self._client = Client(api_key=self.api_key) @@ -128,18 +136,18 @@ class ScrapegraphScrapeTool(BaseTool): @staticmethod def _validate_url(url: str) -> None: - """Validate URL format""" + """Validate URL format.""" try: result = urlparse(url) if not all([result.scheme, result.netloc]): raise ValueError - except Exception: + except Exception as e: raise ValueError( "Invalid URL format. URL must include scheme (http/https) and domain" - ) + ) from e def _handle_api_response(self, response: dict) -> str: - """Handle and validate API response""" + """Handle and validate API response.""" if not response: raise RuntimeError("Empty response from Scrapegraph API") @@ -172,17 +180,18 @@ class ScrapegraphScrapeTool(BaseTool): try: # Make the SmartScraper request - response = self._client.smartscraper( + if self._client is None: + raise RuntimeError("Client not initialized") + return self._client.smartscraper( website_url=website_url, user_prompt=user_prompt, ) - return response - except RateLimitError: raise # Re-raise rate limit errors except Exception as e: - raise RuntimeError(f"Scraping failed: {e!s}") + raise RuntimeError(f"Scraping failed: {e!s}") from e finally: # Always close the client - self._client.close() + if self._client is not None: + self._client.close() diff --git a/lib/crewai-tools/src/crewai_tools/tools/scrapfly_scrape_website_tool/__init__.py b/lib/crewai-tools/src/crewai_tools/tools/scrapfly_scrape_website_tool/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/lib/crewai-tools/src/crewai_tools/tools/scrapfly_scrape_website_tool/scrapfly_scrape_website_tool.py b/lib/crewai-tools/src/crewai_tools/tools/scrapfly_scrape_website_tool/scrapfly_scrape_website_tool.py index c83f7b6d0..e52cf97f0 100644 --- a/lib/crewai-tools/src/crewai_tools/tools/scrapfly_scrape_website_tool/scrapfly_scrape_website_tool.py +++ b/lib/crewai-tools/src/crewai_tools/tools/scrapfly_scrape_website_tool/scrapfly_scrape_website_tool.py @@ -1,6 +1,6 @@ import logging import os -from typing import Any, Dict, List, Literal, Optional, Type +from typing import Any, Literal from crewai.tools import BaseTool, EnvVar from pydantic import BaseModel, Field @@ -11,13 +11,13 @@ logger = logging.getLogger(__file__) class ScrapflyScrapeWebsiteToolSchema(BaseModel): url: str = Field(description="Webpage URL") - scrape_format: Optional[Literal["raw", "markdown", "text"]] = Field( + scrape_format: Literal["raw", "markdown", "text"] | None = Field( default="markdown", description="Webpage extraction format" ) - scrape_config: Optional[Dict[str, Any]] = Field( + scrape_config: dict[str, Any] | None = Field( default=None, description="Scrapfly request scrape config" ) - ignore_scrape_failures: Optional[bool] = Field( + ignore_scrape_failures: bool | None = Field( default=None, description="whether to ignore failures" ) @@ -27,15 +27,19 @@ class ScrapflyScrapeWebsiteTool(BaseTool): description: str = ( "Scrape a webpage url using Scrapfly and return its content as markdown or text" ) - args_schema: Type[BaseModel] = ScrapflyScrapeWebsiteToolSchema + args_schema: type[BaseModel] = ScrapflyScrapeWebsiteToolSchema api_key: str = None - scrapfly: Optional[Any] = None - package_dependencies: List[str] = ["scrapfly-sdk"] - env_vars: List[EnvVar] = [ - EnvVar( - name="SCRAPFLY_API_KEY", description="API key for Scrapfly", required=True - ), - ] + scrapfly: Any | None = None + package_dependencies: list[str] = Field(default_factory=lambda: ["scrapfly-sdk"]) + env_vars: list[EnvVar] = Field( + default_factory=lambda: [ + EnvVar( + name="SCRAPFLY_API_KEY", + description="API key for Scrapfly", + required=True, + ), + ] + ) def __init__(self, api_key: str): super().__init__() @@ -49,19 +53,19 @@ class ScrapflyScrapeWebsiteTool(BaseTool): ): import subprocess - subprocess.run(["uv", "add", "scrapfly-sdk"], check=True) + subprocess.run(["uv", "add", "scrapfly-sdk"], check=True) # noqa: S607 else: raise ImportError( "`scrapfly-sdk` package not found, please run `uv add scrapfly-sdk`" - ) + ) from None self.scrapfly = ScrapflyClient(key=api_key or os.getenv("SCRAPFLY_API_KEY")) def _run( self, url: str, scrape_format: str = "markdown", - scrape_config: Optional[Dict[str, Any]] = None, - ignore_scrape_failures: Optional[bool] = None, + scrape_config: dict[str, Any] | None = None, + ignore_scrape_failures: bool | None = None, ): from scrapfly import ScrapeApiResponse, ScrapeConfig diff --git a/lib/crewai-tools/src/crewai_tools/tools/selenium_scraping_tool/__init__.py b/lib/crewai-tools/src/crewai_tools/tools/selenium_scraping_tool/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/lib/crewai-tools/src/crewai_tools/tools/selenium_scraping_tool/selenium_scraping_tool.py b/lib/crewai-tools/src/crewai_tools/tools/selenium_scraping_tool/selenium_scraping_tool.py index eaeb11af8..2ebfd0d9c 100644 --- a/lib/crewai-tools/src/crewai_tools/tools/selenium_scraping_tool/selenium_scraping_tool.py +++ b/lib/crewai-tools/src/crewai_tools/tools/selenium_scraping_tool/selenium_scraping_tool.py @@ -1,6 +1,6 @@ import re import time -from typing import Any, List, Optional, Type +from typing import Any from urllib.parse import urlparse from crewai.tools import BaseTool @@ -24,6 +24,7 @@ class SeleniumScrapingToolSchema(FixedSeleniumScrapingToolSchema): ) @field_validator("website_url") + @classmethod def validate_website_url(cls, v): if not v: raise ValueError("Website URL cannot be empty") @@ -39,7 +40,7 @@ class SeleniumScrapingToolSchema(FixedSeleniumScrapingToolSchema): if not all([result.scheme, result.netloc]): raise ValueError("Invalid URL format") except Exception as e: - raise ValueError(f"Invalid URL: {e!s}") + raise ValueError(f"Invalid URL: {e!s}") from e if re.search(r"\s", v): raise ValueError("URL cannot contain whitespace") @@ -50,28 +51,34 @@ class SeleniumScrapingToolSchema(FixedSeleniumScrapingToolSchema): class SeleniumScrapingTool(BaseTool): name: str = "Read a website content" description: str = "A tool that can be used to read a website content." - args_schema: Type[BaseModel] = SeleniumScrapingToolSchema - website_url: Optional[str] = None - driver: Optional[Any] = None - cookie: Optional[dict] = None - wait_time: Optional[int] = 3 - css_element: Optional[str] = None - return_html: Optional[bool] = False - _by: Optional[Any] = None - package_dependencies: List[str] = ["selenium", "webdriver-manager"] + args_schema: type[BaseModel] = SeleniumScrapingToolSchema + website_url: str | None = None + driver: Any | None = None + cookie: dict | None = None + wait_time: int | None = 3 + css_element: str | None = None + return_html: bool | None = False + _by: Any | None = None + package_dependencies: list[str] = Field( + default_factory=lambda: ["selenium", "webdriver-manager"] + ) def __init__( self, - website_url: Optional[str] = None, - cookie: Optional[dict] = None, - css_element: Optional[str] = None, + website_url: str | None = None, + cookie: dict | None = None, + css_element: str | None = None, **kwargs, ): super().__init__(**kwargs) try: - from selenium import webdriver - from selenium.webdriver.chrome.options import Options - from selenium.webdriver.common.by import By + from selenium import webdriver # type: ignore[import-not-found] + from selenium.webdriver.chrome.options import ( # type: ignore[import-not-found] + Options, + ) + from selenium.webdriver.common.by import ( # type: ignore[import-not-found] + By, + ) except ImportError: import click @@ -81,16 +88,20 @@ class SeleniumScrapingTool(BaseTool): import subprocess subprocess.run( - ["uv", "pip", "install", "selenium", "webdriver-manager"], + ["uv", "pip", "install", "selenium", "webdriver-manager"], # noqa: S607 check=True, ) - from selenium import webdriver - from selenium.webdriver.chrome.options import Options - from selenium.webdriver.common.by import By + from selenium import webdriver # type: ignore[import-not-found] + from selenium.webdriver.chrome.options import ( # type: ignore[import-not-found] + Options, + ) + from selenium.webdriver.common.by import ( # type: ignore[import-not-found] + By, + ) else: raise ImportError( "`selenium` and `webdriver-manager` package not found, please run `uv add selenium webdriver-manager`" - ) + ) from None if "driver" not in kwargs: if "options" not in kwargs: @@ -132,7 +143,8 @@ class SeleniumScrapingTool(BaseTool): except Exception as e: return f"Error scraping website: {e!s}" finally: - self.driver.close() + if self.driver is not None: + self.driver.close() def _get_content(self, css_element, return_html): content = [] @@ -160,7 +172,7 @@ class SeleniumScrapingTool(BaseTool): elements_content = [] for element in self.driver.find_elements(self._by.CSS_SELECTOR, css_element): - elements_content.append( + elements_content.append( # noqa: PERF401 element.get_attribute("outerHTML") if return_html else element.text ) diff --git a/lib/crewai-tools/src/crewai_tools/tools/serpapi_tool/__init__.py b/lib/crewai-tools/src/crewai_tools/tools/serpapi_tool/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/lib/crewai-tools/src/crewai_tools/tools/serpapi_tool/serpapi_base_tool.py b/lib/crewai-tools/src/crewai_tools/tools/serpapi_tool/serpapi_base_tool.py index 201dd84b4..c5c1ab1cb 100644 --- a/lib/crewai-tools/src/crewai_tools/tools/serpapi_tool/serpapi_base_tool.py +++ b/lib/crewai-tools/src/crewai_tools/tools/serpapi_tool/serpapi_base_tool.py @@ -1,23 +1,26 @@ import os import re -from typing import Any, List, Optional, Union +from typing import Any from crewai.tools import BaseTool, EnvVar +from pydantic import Field class SerpApiBaseTool(BaseTool): """Base class for SerpApi functionality with shared capabilities.""" - package_dependencies: List[str] = ["serpapi"] - env_vars: List[EnvVar] = [ - EnvVar( - name="SERPAPI_API_KEY", - description="API key for SerpApi searches", - required=True, - ), - ] + package_dependencies: list[str] = Field(default_factory=lambda: ["serpapi"]) + env_vars: list[EnvVar] = Field( + default_factory=lambda: [ + EnvVar( + name="SERPAPI_API_KEY", + description="API key for SerpApi searches", + required=True, + ), + ] + ) - client: Optional[Any] = None + client: Any | None = None def __init__(self, **kwargs): super().__init__(**kwargs) @@ -32,12 +35,12 @@ class SerpApiBaseTool(BaseTool): ): import subprocess - subprocess.run(["uv", "add", "serpapi"], check=True) + subprocess.run(["uv", "add", "serpapi"], check=True) # noqa: S607 from serpapi import Client else: raise ImportError( "`serpapi` package not found, please install with `uv add serpapi`" - ) + ) from None api_key = os.getenv("SERPAPI_API_KEY") if not api_key: raise ValueError( @@ -45,7 +48,7 @@ class SerpApiBaseTool(BaseTool): ) self.client = Client(api_key=api_key) - def _omit_fields(self, data: Union[dict, list], omit_patterns: list[str]) -> None: + def _omit_fields(self, data: dict | list, omit_patterns: list[str]) -> None: if isinstance(data, dict): for field in list(data.keys()): if any(re.compile(p).match(field) for p in omit_patterns): diff --git a/lib/crewai-tools/src/crewai_tools/tools/serpapi_tool/serpapi_google_search_tool.py b/lib/crewai-tools/src/crewai_tools/tools/serpapi_tool/serpapi_google_search_tool.py index 6ffe77288..a2f95d425 100644 --- a/lib/crewai-tools/src/crewai_tools/tools/serpapi_tool/serpapi_google_search_tool.py +++ b/lib/crewai-tools/src/crewai_tools/tools/serpapi_tool/serpapi_google_search_tool.py @@ -1,4 +1,4 @@ -from typing import Any, Optional, Type +from typing import Any from pydantic import BaseModel, ConfigDict, Field @@ -17,7 +17,7 @@ class SerpApiGoogleSearchToolSchema(BaseModel): search_query: str = Field( ..., description="Mandatory search query you want to use to Google search." ) - location: Optional[str] = Field( + location: str | None = Field( None, description="Location you want the search to be performed in." ) @@ -30,7 +30,7 @@ class SerpApiGoogleSearchTool(SerpApiBaseTool): description: str = ( "A tool to perform to perform a Google search with a search_query." ) - args_schema: Type[BaseModel] = SerpApiGoogleSearchToolSchema + args_schema: type[BaseModel] = SerpApiGoogleSearchToolSchema def _run( self, diff --git a/lib/crewai-tools/src/crewai_tools/tools/serpapi_tool/serpapi_google_shopping_tool.py b/lib/crewai-tools/src/crewai_tools/tools/serpapi_tool/serpapi_google_shopping_tool.py index ed562e5fa..def41ba7b 100644 --- a/lib/crewai-tools/src/crewai_tools/tools/serpapi_tool/serpapi_google_shopping_tool.py +++ b/lib/crewai-tools/src/crewai_tools/tools/serpapi_tool/serpapi_google_shopping_tool.py @@ -1,4 +1,4 @@ -from typing import Any, Optional, Type +from typing import Any from pydantic import BaseModel, ConfigDict, Field @@ -17,7 +17,7 @@ class SerpApiGoogleShoppingToolSchema(BaseModel): search_query: str = Field( ..., description="Mandatory search query you want to use to Google shopping." ) - location: Optional[str] = Field( + location: str | None = Field( None, description="Location you want the search to be performed in." ) @@ -30,7 +30,7 @@ class SerpApiGoogleShoppingTool(SerpApiBaseTool): description: str = ( "A tool to perform search on Google shopping with a search_query." ) - args_schema: Type[BaseModel] = SerpApiGoogleShoppingToolSchema + args_schema: type[BaseModel] = SerpApiGoogleShoppingToolSchema def _run( self, diff --git a/lib/crewai-tools/src/crewai_tools/tools/serper_dev_tool/__init__.py b/lib/crewai-tools/src/crewai_tools/tools/serper_dev_tool/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/lib/crewai-tools/src/crewai_tools/tools/serper_dev_tool/serper_dev_tool.py b/lib/crewai-tools/src/crewai_tools/tools/serper_dev_tool/serper_dev_tool.py index 92572cfcc..2ffa17025 100644 --- a/lib/crewai-tools/src/crewai_tools/tools/serper_dev_tool/serper_dev_tool.py +++ b/lib/crewai-tools/src/crewai_tools/tools/serper_dev_tool/serper_dev_tool.py @@ -2,7 +2,7 @@ import datetime import json import logging import os -from typing import Any, List, Optional, Type +from typing import Any from crewai.tools import BaseTool, EnvVar from pydantic import BaseModel, Field @@ -38,17 +38,21 @@ class SerperDevTool(BaseTool): "A tool that can be used to search the internet with a search_query. " "Supports different search types: 'search' (default), 'news'" ) - args_schema: Type[BaseModel] = SerperDevToolSchema + args_schema: type[BaseModel] = SerperDevToolSchema base_url: str = "https://google.serper.dev" n_results: int = 10 save_file: bool = False search_type: str = "search" - country: Optional[str] = "" - location: Optional[str] = "" - locale: Optional[str] = "" - env_vars: List[EnvVar] = [ - EnvVar(name="SERPER_API_KEY", description="API key for Serper", required=True), - ] + country: str | None = "" + location: str | None = "" + locale: str | None = "" + env_vars: list[EnvVar] = Field( + default_factory=lambda: [ + EnvVar( + name="SERPER_API_KEY", description="API key for Serper", required=True + ), + ] + ) def _get_search_url(self, search_type: str) -> str: """Get the appropriate endpoint URL based on search type.""" @@ -95,7 +99,7 @@ class SerperDevTool(BaseTool): ] processed_results.append(result_data) - except KeyError: + except KeyError: # noqa: PERF203 logger.warning(f"Skipping malformed organic result: {result}") continue return processed_results @@ -112,7 +116,7 @@ class SerperDevTool(BaseTool): "link": result.get("link", ""), } processed_results.append(result_data) - except KeyError: + except KeyError: # noqa: PERF203 logger.warning(f"Skipping malformed PAA result: {result}") continue return processed_results @@ -123,7 +127,7 @@ class SerperDevTool(BaseTool): for result in related_results[: self.n_results]: try: processed_results.append({"query": result["query"]}) - except KeyError: + except KeyError: # noqa: PERF203 logger.warning(f"Skipping malformed related search result: {result}") continue return processed_results @@ -142,7 +146,7 @@ class SerperDevTool(BaseTool): "imageUrl": result.get("imageUrl", ""), } processed_results.append(result_data) - except KeyError: + except KeyError: # noqa: PERF203 logger.warning(f"Skipping malformed news result: {result}") continue return processed_results diff --git a/lib/crewai-tools/src/crewai_tools/tools/serper_scrape_website_tool/__init__.py b/lib/crewai-tools/src/crewai_tools/tools/serper_scrape_website_tool/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/lib/crewai-tools/src/crewai_tools/tools/serper_scrape_website_tool/serper_scrape_website_tool.py b/lib/crewai-tools/src/crewai_tools/tools/serper_scrape_website_tool/serper_scrape_website_tool.py index ea991dda8..6889fdf4e 100644 --- a/lib/crewai-tools/src/crewai_tools/tools/serper_scrape_website_tool/serper_scrape_website_tool.py +++ b/lib/crewai-tools/src/crewai_tools/tools/serper_scrape_website_tool/serper_scrape_website_tool.py @@ -1,6 +1,5 @@ import json import os -from typing import List, Type from crewai.tools import BaseTool, EnvVar from pydantic import BaseModel, Field @@ -24,14 +23,17 @@ class SerperScrapeWebsiteTool(BaseTool): "This tool can extract clean, readable content from any website URL, " "optionally including markdown formatting for better structure." ) - args_schema: Type[BaseModel] = SerperScrapeWebsiteInput - env_vars: List[EnvVar] = [ - EnvVar(name="SERPER_API_KEY", description="API key for Serper", required=True), - ] + args_schema: type[BaseModel] = SerperScrapeWebsiteInput + env_vars: list[EnvVar] = Field( + default_factory=lambda: [ + EnvVar( + name="SERPER_API_KEY", description="API key for Serper", required=True + ), + ] + ) def _run(self, url: str, include_markdown: bool = True) -> str: - """ - Scrape website content using Serper API. + """Scrape website content using Serper API. Args: url: The URL to scrape @@ -54,7 +56,12 @@ class SerperScrapeWebsiteTool(BaseTool): headers = {"X-API-KEY": api_key, "Content-Type": "application/json"} # Make the API request - response = requests.post(api_url, headers=headers, data=payload) + response = requests.post( + api_url, + headers=headers, + data=payload, + timeout=30, + ) # Check if request was successful if response.status_code == 200: diff --git a/lib/crewai-tools/src/crewai_tools/tools/serply_api_tool/__init__.py b/lib/crewai-tools/src/crewai_tools/tools/serply_api_tool/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/lib/crewai-tools/src/crewai_tools/tools/serply_api_tool/serply_job_search_tool.py b/lib/crewai-tools/src/crewai_tools/tools/serply_api_tool/serply_job_search_tool.py index 4367551e1..c12ed92ac 100644 --- a/lib/crewai-tools/src/crewai_tools/tools/serply_api_tool/serply_job_search_tool.py +++ b/lib/crewai-tools/src/crewai_tools/tools/serply_api_tool/serply_job_search_tool.py @@ -1,12 +1,12 @@ import os -from typing import List, Optional, Type from urllib.parse import urlencode from crewai.tools import EnvVar -from crewai_tools.tools.rag.rag_tool import RagTool from pydantic import BaseModel, Field import requests +from crewai_tools.tools.rag.rag_tool import RagTool + class SerplyJobSearchToolSchema(BaseModel): """Input for Job Search.""" @@ -22,21 +22,23 @@ class SerplyJobSearchTool(RagTool): description: str = ( "A tool to perform to perform a job search in the US with a search_query." ) - args_schema: Type[BaseModel] = SerplyJobSearchToolSchema + args_schema: type[BaseModel] = SerplyJobSearchToolSchema request_url: str = "https://api.serply.io/v1/job/search/" - proxy_location: Optional[str] = "US" + proxy_location: str | None = "US" """ proxy_location: (str): Where to get jobs, specifically for a specific country results. - Currently only supports US """ - headers: Optional[dict] = {} - env_vars: List[EnvVar] = [ - EnvVar( - name="SERPLY_API_KEY", - description="API key for Serply services", - required=True, - ), - ] + headers: dict | None = Field(default_factory=dict) + env_vars: list[EnvVar] = Field( + default_factory=lambda: [ + EnvVar( + name="SERPLY_API_KEY", + description="API key for Serply services", + required=True, + ), + ] + ) def __init__(self, **kwargs): super().__init__(**kwargs) @@ -48,8 +50,8 @@ class SerplyJobSearchTool(RagTool): def _run( self, - query: Optional[str] = None, - search_query: Optional[str] = None, + query: str | None = None, + search_query: str | None = None, ) -> str: query_payload = {} @@ -61,7 +63,7 @@ class SerplyJobSearchTool(RagTool): # build the url url = f"{self.request_url}{urlencode(query_payload)}" - response = requests.request("GET", url, headers=self.headers) + response = requests.request("GET", url, headers=self.headers, timeout=30) jobs = response.json().get("jobs", "") @@ -85,7 +87,7 @@ class SerplyJobSearchTool(RagTool): ] ) ) - except KeyError: + except KeyError: # noqa: PERF203 continue content = "\n".join(string) diff --git a/lib/crewai-tools/src/crewai_tools/tools/serply_api_tool/serply_news_search_tool.py b/lib/crewai-tools/src/crewai_tools/tools/serply_api_tool/serply_news_search_tool.py index 16d91fc6d..98802b4e6 100644 --- a/lib/crewai-tools/src/crewai_tools/tools/serply_api_tool/serply_news_search_tool.py +++ b/lib/crewai-tools/src/crewai_tools/tools/serply_api_tool/serply_news_search_tool.py @@ -1,5 +1,5 @@ import os -from typing import Any, List, Optional, Type +from typing import Any from urllib.parse import urlencode from crewai.tools import BaseTool, EnvVar @@ -18,26 +18,27 @@ class SerplyNewsSearchToolSchema(BaseModel): class SerplyNewsSearchTool(BaseTool): name: str = "News Search" description: str = "A tool to perform News article search with a search_query." - args_schema: Type[BaseModel] = SerplyNewsSearchToolSchema + args_schema: type[BaseModel] = SerplyNewsSearchToolSchema search_url: str = "https://api.serply.io/v1/news/" - 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, - ), - ] + proxy_location: str | None = "US" + headers: dict | None = Field(default_factory=dict) + limit: int | None = 10 + env_vars: list[EnvVar] = Field( + default_factory=lambda: [ + 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 + self, limit: int | None = 10, proxy_location: str | None = "US", **kwargs ): - """ - param: limit (int): The maximum number of results to return [10-100, defaults to 10] + """param: limit (int): The maximum number of results to return [10-100, defaults to 10] proxy_location: (str): Where to get news, specifically for a specific country results. - ['US', 'CA', 'IE', 'GB', 'FR', 'DE', 'SE', 'IN', 'JP', 'KR', 'SG', 'AU', 'BR'] (defaults to US) + ['US', 'CA', 'IE', 'GB', 'FR', 'DE', 'SE', 'IN', 'JP', 'KR', 'SG', 'AU', 'BR'] (defaults to US). """ super().__init__(**kwargs) self.limit = limit @@ -63,7 +64,12 @@ class SerplyNewsSearchTool(BaseTool): # build the url url = f"{self.search_url}{urlencode(query_payload)}" - response = requests.request("GET", url, headers=self.headers) + response = requests.request( + "GET", + url, + headers=self.headers, + timeout=30, + ) results = response.json() if "entries" in results: results = results["entries"] @@ -71,7 +77,10 @@ class SerplyNewsSearchTool(BaseTool): for result in results[: self.limit]: try: # follow url - r = requests.get(result["link"]) + r = requests.get( + result["link"], + timeout=30, + ) final_link = r.history[-1].headers["Location"] string.append( "\n".join( @@ -84,7 +93,7 @@ class SerplyNewsSearchTool(BaseTool): ] ) ) - except KeyError: + except KeyError: # noqa: PERF203 continue content = "\n".join(string) diff --git a/lib/crewai-tools/src/crewai_tools/tools/serply_api_tool/serply_scholar_search_tool.py b/lib/crewai-tools/src/crewai_tools/tools/serply_api_tool/serply_scholar_search_tool.py index 5ac55fc89..c8e3a1ccd 100644 --- a/lib/crewai-tools/src/crewai_tools/tools/serply_api_tool/serply_scholar_search_tool.py +++ b/lib/crewai-tools/src/crewai_tools/tools/serply_api_tool/serply_scholar_search_tool.py @@ -1,5 +1,5 @@ import os -from typing import Any, List, Optional, Type +from typing import Any from urllib.parse import urlencode from crewai.tools import BaseTool, EnvVar @@ -21,25 +21,26 @@ class SerplyScholarSearchTool(BaseTool): description: str = ( "A tool to perform scholarly literature search with a search_query." ) - args_schema: Type[BaseModel] = SerplyScholarSearchToolSchema + args_schema: type[BaseModel] = SerplyScholarSearchToolSchema search_url: str = "https://api.serply.io/v1/scholar/" - 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, - ), - ] + hl: str | None = "us" + proxy_location: str | None = "US" + headers: dict | None = Field(default_factory=dict) + env_vars: list[EnvVar] = Field( + default_factory=lambda: [ + 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): - """ - param: hl (str): host Language code to display results in + def __init__(self, hl: str = "us", proxy_location: str | None = "US", **kwargs): + """param: hl (str): host Language code to display results in (reference https://developers.google.com/custom-search/docs/xml_results?hl=en#wsInterfaceLanguages) proxy_location: (str): Specify the proxy location for the search, specifically for a specific country results. - ['US', 'CA', 'IE', 'GB', 'FR', 'DE', 'SE', 'IN', 'JP', 'KR', 'SG', 'AU', 'BR'] (defaults to US) + ['US', 'CA', 'IE', 'GB', 'FR', 'DE', 'SE', 'IN', 'JP', 'KR', 'SG', 'AU', 'BR'] (defaults to US). """ super().__init__(**kwargs) self.hl = hl @@ -64,7 +65,12 @@ class SerplyScholarSearchTool(BaseTool): # build the url url = f"{self.search_url}{urlencode(query_payload)}" - response = requests.request("GET", url, headers=self.headers) + response = requests.request( + "GET", + url, + headers=self.headers, + timeout=30, + ) articles = response.json().get("articles", "") if not articles: @@ -90,7 +96,7 @@ class SerplyScholarSearchTool(BaseTool): ] ) ) - except KeyError: + except KeyError: # noqa: PERF203 continue content = "\n".join(string) diff --git a/lib/crewai-tools/src/crewai_tools/tools/serply_api_tool/serply_web_search_tool.py b/lib/crewai-tools/src/crewai_tools/tools/serply_api_tool/serply_web_search_tool.py index 40d76099b..2cce6c7b7 100644 --- a/lib/crewai-tools/src/crewai_tools/tools/serply_api_tool/serply_web_search_tool.py +++ b/lib/crewai-tools/src/crewai_tools/tools/serply_api_tool/serply_web_search_tool.py @@ -1,5 +1,5 @@ import os -from typing import Any, List, Optional, Type +from typing import Any from urllib.parse import urlencode from crewai.tools import BaseTool, EnvVar @@ -18,21 +18,23 @@ class SerplyWebSearchToolSchema(BaseModel): class SerplyWebSearchTool(BaseTool): name: str = "Google Search" description: str = "A tool to perform Google search with a search_query." - args_schema: Type[BaseModel] = SerplyWebSearchToolSchema + args_schema: type[BaseModel] = SerplyWebSearchToolSchema search_url: str = "https://api.serply.io/v1/search/" - hl: Optional[str] = "us" - limit: Optional[int] = 10 - device_type: Optional[str] = "desktop" - proxy_location: Optional[str] = "US" - query_payload: Optional[dict] = {} - headers: Optional[dict] = {} - env_vars: List[EnvVar] = [ - EnvVar( - name="SERPLY_API_KEY", - description="API key for Serply services", - required=True, - ), - ] + hl: str | None = "us" + limit: int | None = 10 + device_type: str | None = "desktop" + proxy_location: str | None = "US" + query_payload: dict | None = Field(default_factory=dict) + headers: dict | None = Field(default_factory=dict) + env_vars: list[EnvVar] = Field( + default_factory=lambda: [ + EnvVar( + name="SERPLY_API_KEY", + description="API key for Serply services", + required=True, + ), + ] + ) def __init__( self, @@ -42,14 +44,13 @@ class SerplyWebSearchTool(BaseTool): proxy_location: str = "US", **kwargs, ): - """ - param: query (str): The query to search for + """param: query (str): The query to search for param: hl (str): host Language code to display results in (reference https://developers.google.com/custom-search/docs/xml_results?hl=en#wsInterfaceLanguages) param: limit (int): The maximum number of results to return [10-100, defaults to 10] param: device_type (str): desktop/mobile results (defaults to desktop) proxy_location: (str): Where to perform the search, specifically for local/regional results. - ['US', 'CA', 'IE', 'GB', 'FR', 'DE', 'SE', 'IN', 'JP', 'KR', 'SG', 'AU', 'BR'] (defaults to US) + ['US', 'CA', 'IE', 'GB', 'FR', 'DE', 'SE', 'IN', 'JP', 'KR', 'SG', 'AU', 'BR'] (defaults to US). """ super().__init__(**kwargs) @@ -82,7 +83,12 @@ class SerplyWebSearchTool(BaseTool): # build the url url = f"{self.search_url}{urlencode(self.query_payload)}" - response = requests.request("GET", url, headers=self.headers) + response = requests.request( + "GET", + url, + headers=self.headers, + timeout=30, + ) results = response.json() if "results" in results: results = results["results"] @@ -99,7 +105,7 @@ class SerplyWebSearchTool(BaseTool): ] ) ) - except KeyError: + except KeyError: # noqa: PERF203 continue content = "\n".join(string) diff --git a/lib/crewai-tools/src/crewai_tools/tools/serply_api_tool/serply_webpage_to_markdown_tool.py b/lib/crewai-tools/src/crewai_tools/tools/serply_api_tool/serply_webpage_to_markdown_tool.py index b6f9d6cad..fdf62ed77 100644 --- a/lib/crewai-tools/src/crewai_tools/tools/serply_api_tool/serply_webpage_to_markdown_tool.py +++ b/lib/crewai-tools/src/crewai_tools/tools/serply_api_tool/serply_webpage_to_markdown_tool.py @@ -1,11 +1,11 @@ import os -from typing import List, Optional, Type from crewai.tools import EnvVar -from crewai_tools.tools.rag.rag_tool import RagTool from pydantic import BaseModel, Field import requests +from crewai_tools.tools.rag.rag_tool import RagTool + class SerplyWebpageToMarkdownToolSchema(BaseModel): """Input for Serply Search.""" @@ -19,22 +19,23 @@ class SerplyWebpageToMarkdownToolSchema(BaseModel): class SerplyWebpageToMarkdownTool(RagTool): name: str = "Webpage to Markdown" description: str = "A tool to perform convert a webpage to markdown to make it easier for LLMs to understand" - args_schema: Type[BaseModel] = SerplyWebpageToMarkdownToolSchema + args_schema: type[BaseModel] = SerplyWebpageToMarkdownToolSchema 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, - ), - ] + proxy_location: str | None = "US" + headers: dict | None = Field(default_factory=dict) + env_vars: list[EnvVar] = Field( + default_factory=lambda: [ + EnvVar( + name="SERPLY_API_KEY", + description="API key for Serply services", + required=True, + ), + ] + ) - def __init__(self, proxy_location: Optional[str] = "US", **kwargs): - """ - proxy_location: (str): Where to perform the search, specifically for a specific country results. - ['US', 'CA', 'IE', 'GB', 'FR', 'DE', 'SE', 'IN', 'JP', 'KR', 'SG', 'AU', 'BR'] (defaults to US) + def __init__(self, proxy_location: str | None = "US", **kwargs): + """proxy_location: (str): Where to perform the search, specifically for a specific country results. + ['US', 'CA', 'IE', 'GB', 'FR', 'DE', 'SE', 'IN', 'JP', 'KR', 'SG', 'AU', 'BR'] (defaults to US). """ super().__init__(**kwargs) self.proxy_location = proxy_location @@ -50,6 +51,10 @@ class SerplyWebpageToMarkdownTool(RagTool): ) -> str: data = {"url": url, "method": "GET", "response_type": "markdown"} response = requests.request( - "POST", self.request_url, headers=self.headers, json=data + "POST", + self.request_url, + headers=self.headers, + json=data, + timeout=30, ) return response.text diff --git a/lib/crewai-tools/src/crewai_tools/tools/singlestore_search_tool/singlestore_search_tool.py b/lib/crewai-tools/src/crewai_tools/tools/singlestore_search_tool/singlestore_search_tool.py index 6187d09c6..6cbd522bb 100644 --- a/lib/crewai-tools/src/crewai_tools/tools/singlestore_search_tool/singlestore_search_tool.py +++ b/lib/crewai-tools/src/crewai_tools/tools/singlestore_search_tool/singlestore_search_tool.py @@ -1,4 +1,5 @@ -from typing import Any, Callable, Dict, List, Optional, Type +from collections.abc import Callable +from typing import Any from crewai.tools import BaseTool, EnvVar from pydantic import BaseModel, Field @@ -41,129 +42,133 @@ class SingleStoreSearchTool(BaseTool): description: str = ( "A tool that can be used to semantic search a query from a database." ) - args_schema: Type[BaseModel] = SingleStoreSearchToolSchema + args_schema: type[BaseModel] = SingleStoreSearchToolSchema - package_dependencies: List[str] = ["singlestoredb", "SQLAlchemy"] - env_vars: List[EnvVar] = [ - EnvVar( - name="SINGLESTOREDB_URL", - description="A comprehensive URL string that can encapsulate host, port," - " username, password, and database information, often used in environments" - " like SingleStore notebooks or specific frameworks." - " For example: 'me:p455w0rd@s2-host.com/my_db'", - required=False, - default=None, - ), - EnvVar( - name="SINGLESTOREDB_HOST", - description="Specifies the hostname, IP address, or URL of" - " the SingleStoreDB workspace or cluster", - required=False, - default=None, - ), - EnvVar( - name="SINGLESTOREDB_PORT", - description="Defines the port number on which the" - " SingleStoreDB server is listening", - required=False, - default=None, - ), - EnvVar( - name="SINGLESTOREDB_USER", - description="Specifies the database user name", - required=False, - default=None, - ), - EnvVar( - name="SINGLESTOREDB_PASSWORD", - description="Specifies the database user password", - required=False, - default=None, - ), - EnvVar( - name="SINGLESTOREDB_DATABASE", - description="Name of the database to connect to", - required=False, - default=None, - ), - EnvVar( - name="SINGLESTOREDB_SSL_KEY", - description="File containing SSL key", - required=False, - default=None, - ), - EnvVar( - name="SINGLESTOREDB_SSL_CERT", - description="File containing SSL certificate", - required=False, - default=None, - ), - EnvVar( - name="SINGLESTOREDB_SSL_CA", - description="File containing SSL certificate authority", - required=False, - default=None, - ), - EnvVar( - name="SINGLESTOREDB_CONNECT_TIMEOUT", - description="The timeout for connecting to the database in seconds", - required=False, - default=None, - ), - ] + package_dependencies: list[str] = Field( + default_factory=lambda: ["singlestoredb", "SQLAlchemy"] + ) + env_vars: list[EnvVar] = Field( + default_factory=lambda: [ + EnvVar( + name="SINGLESTOREDB_URL", + description="A comprehensive URL string that can encapsulate host, port," + " username, password, and database information, often used in environments" + " like SingleStore notebooks or specific frameworks." + " For example: 'me:p455w0rd@s2-host.com/my_db'", + required=False, + default=None, + ), + EnvVar( + name="SINGLESTOREDB_HOST", + description="Specifies the hostname, IP address, or URL of" + " the SingleStoreDB workspace or cluster", + required=False, + default=None, + ), + EnvVar( + name="SINGLESTOREDB_PORT", + description="Defines the port number on which the" + " SingleStoreDB server is listening", + required=False, + default=None, + ), + EnvVar( + name="SINGLESTOREDB_USER", + description="Specifies the database user name", + required=False, + default=None, + ), + EnvVar( + name="SINGLESTOREDB_PASSWORD", + description="Specifies the database user password", + required=False, + default=None, + ), + EnvVar( + name="SINGLESTOREDB_DATABASE", + description="Name of the database to connect to", + required=False, + default=None, + ), + EnvVar( + name="SINGLESTOREDB_SSL_KEY", + description="File containing SSL key", + required=False, + default=None, + ), + EnvVar( + name="SINGLESTOREDB_SSL_CERT", + description="File containing SSL certificate", + required=False, + default=None, + ), + EnvVar( + name="SINGLESTOREDB_SSL_CA", + description="File containing SSL certificate authority", + required=False, + default=None, + ), + EnvVar( + name="SINGLESTOREDB_CONNECT_TIMEOUT", + description="The timeout for connecting to the database in seconds", + required=False, + default=None, + ), + ] + ) - connection_args: dict = {} - connection_pool: Optional[Any] = None + connection_args: dict = Field(default_factory=dict) + connection_pool: Any | None = None def __init__( self, - tables: List[str] = [], + tables: list[str] | None = None, # Basic connection parameters - host: Optional[str] = None, - user: Optional[str] = None, - password: Optional[str] = None, - port: Optional[int] = None, - database: Optional[str] = None, - driver: Optional[str] = None, + host: str | None = None, + user: str | None = None, + password: str | None = None, + port: int | None = None, + database: str | None = None, + driver: str | None = None, # Connection behavior options - pure_python: Optional[bool] = None, - local_infile: Optional[bool] = None, - charset: Optional[str] = None, + pure_python: bool | None = None, + local_infile: bool | None = None, + charset: str | None = None, # SSL/TLS configuration - ssl_key: Optional[str] = None, - ssl_cert: Optional[str] = None, - ssl_ca: Optional[str] = None, - ssl_disabled: Optional[bool] = None, - ssl_cipher: Optional[str] = None, - ssl_verify_cert: Optional[bool] = None, - tls_sni_servername: Optional[str] = None, - ssl_verify_identity: Optional[bool] = None, + ssl_key: str | None = None, + ssl_cert: str | None = None, + ssl_ca: str | None = None, + ssl_disabled: bool | None = None, + ssl_cipher: str | None = None, + ssl_verify_cert: bool | None = None, + tls_sni_servername: str | None = None, + ssl_verify_identity: bool | None = None, # Advanced connection options - conv: Optional[Dict[int, Callable[..., Any]]] = None, - credential_type: Optional[str] = None, - autocommit: Optional[bool] = None, + conv: dict[int, Callable[..., Any]] | None = None, + credential_type: str | None = None, + autocommit: bool | None = None, # Result formatting options - results_type: Optional[str] = None, - buffered: Optional[bool] = None, - results_format: Optional[str] = None, - program_name: Optional[str] = None, - conn_attrs: Optional[Dict[str, str]] = {}, + results_type: str | None = None, + buffered: bool | None = None, + results_format: str | None = None, + program_name: str | None = None, + conn_attrs: dict[str, str] | None = None, # Query execution options - multi_statements: Optional[bool] = None, - client_found_rows: Optional[bool] = None, - connect_timeout: Optional[int] = None, + multi_statements: bool | None = None, + client_found_rows: bool | None = None, + connect_timeout: int | None = None, # Data type handling - nan_as_null: Optional[bool] = None, - inf_as_null: Optional[bool] = None, - encoding_errors: Optional[str] = None, - track_env: Optional[bool] = None, - enable_extended_data_types: Optional[bool] = None, - vector_data_format: Optional[str] = None, - parse_json: Optional[bool] = None, + nan_as_null: bool | None = None, + inf_as_null: bool | None = None, + encoding_errors: str | None = None, + track_env: bool | None = None, + enable_extended_data_types: bool | None = None, + vector_data_format: str | None = None, + parse_json: bool | None = None, # Connection pool configuration - pool_size: Optional[int] = 5, - max_overflow: Optional[int] = 10, - timeout: Optional[float] = 30, + pool_size: int | None = 5, + max_overflow: int | None = 10, + timeout: float | None = 30, **kwargs, ): """Initialize the SingleStore search tool. @@ -180,7 +185,10 @@ class SingleStoreSearchTool(BaseTool): timeout: Connection timeout in seconds **kwargs: Additional arguments passed to the parent class """ - + if conn_attrs is None: + conn_attrs = {} + if tables is None: + tables = [] if not SINGLSTORE_AVAILABLE: import click @@ -191,11 +199,12 @@ class SingleStoreSearchTool(BaseTool): try: subprocess.run( - ["uv", "add", "crewai-tools[singlestore]"], check=True + ["uv", "add", "crewai-tools[singlestore]"], # noqa: S607 + check=True, ) - except subprocess.CalledProcessError: - raise ImportError("Failed to install singlestore package") + except subprocess.CalledProcessError as e: + raise ImportError("Failed to install singlestore package") from e else: raise ImportError( "`singlestore` package not found, please run `uv add crewai-tools[singlestore]`" @@ -274,7 +283,7 @@ class SingleStoreSearchTool(BaseTool): # Validate database schema and initialize table information self._initialize_tables(tables) - def _initialize_tables(self, tables: List[str]) -> None: + def _initialize_tables(self, tables: list[str]) -> None: """Initialize and validate the tables that this tool will work with. Args: @@ -326,7 +335,7 @@ class SingleStoreSearchTool(BaseTool): ) self._generate_description() - def _get_connection(self) -> Optional[Any]: + def _get_connection(self) -> Any | None: """Get a connection from the connection pool. Returns: @@ -336,13 +345,12 @@ class SingleStoreSearchTool(BaseTool): Exception: If connection cannot be established """ try: - conn = self.connection_pool.connect() - return conn + return self.connection_pool.connect() except Exception: # Re-raise the exception to be handled by the caller raise - def _create_connection(self) -> Optional[Any]: + def _create_connection(self) -> Any | None: """Create a new SingleStore connection. This method is used by the connection pool to create new connections @@ -355,8 +363,7 @@ class SingleStoreSearchTool(BaseTool): Exception: If connection cannot be created """ try: - conn = connect(**self.connection_args) - return conn + return connect(**self.connection_args) except Exception: # Re-raise the exception to be handled by the caller raise @@ -380,7 +387,7 @@ class SingleStoreSearchTool(BaseTool): query_lower = search_query.strip().lower() # Allow only SELECT and SHOW statements - if not (query_lower.startswith("select") or query_lower.startswith("show")): + if not (query_lower.startswith(("select", "show"))): return ( False, "Only SELECT and SHOW queries are supported for security reasons.", diff --git a/lib/crewai-tools/src/crewai_tools/tools/snowflake_search_tool/snowflake_search_tool.py b/lib/crewai-tools/src/crewai_tools/tools/snowflake_search_tool/snowflake_search_tool.py index e55c23023..946e55ab4 100644 --- a/lib/crewai-tools/src/crewai_tools/tools/snowflake_search_tool/snowflake_search_tool.py +++ b/lib/crewai-tools/src/crewai_tools/tools/snowflake_search_tool/snowflake_search_tool.py @@ -1,7 +1,7 @@ import asyncio from concurrent.futures import ThreadPoolExecutor import logging -from typing import TYPE_CHECKING, Any, Dict, List, Optional, Type +from typing import TYPE_CHECKING, Any from crewai.tools.base_tool import BaseTool from pydantic import BaseModel, ConfigDict, Field, SecretStr @@ -9,13 +9,18 @@ from pydantic import BaseModel, ConfigDict, Field, SecretStr if TYPE_CHECKING: # Import types for type checking only - from snowflake.connector.connection import SnowflakeConnection - from snowflake.connector.errors import DatabaseError, OperationalError + from snowflake.connector.connection import ( # type: ignore[import-not-found] + SnowflakeConnection, + ) + from snowflake.connector.errors import ( # type: ignore[import-not-found] + DatabaseError, + OperationalError, + ) try: from cryptography.hazmat.backends import default_backend from cryptography.hazmat.primitives import serialization - import snowflake.connector + import snowflake.connector # type: ignore[import-not-found] SNOWFLAKE_AVAILABLE = True except ImportError: @@ -25,7 +30,7 @@ except ImportError: logger = logging.getLogger(__name__) # Cache for query results -_query_cache = {} +_query_cache: dict[str, list[dict[str, Any]]] = {} class SnowflakeConfig(BaseModel): @@ -37,15 +42,13 @@ class SnowflakeConfig(BaseModel): ..., description="Snowflake account identifier", pattern=r"^[a-zA-Z0-9\-_]+$" ) user: str = Field(..., description="Snowflake username") - password: Optional[SecretStr] = Field(None, description="Snowflake password") - private_key_path: Optional[str] = Field( - None, description="Path to private key file" - ) - warehouse: Optional[str] = Field(None, description="Snowflake warehouse") - database: Optional[str] = Field(None, description="Default database") - snowflake_schema: Optional[str] = Field(None, description="Default schema") - role: Optional[str] = Field(None, description="Snowflake role") - session_parameters: Optional[Dict[str, Any]] = Field( + password: SecretStr | None = Field(None, description="Snowflake password") + private_key_path: str | None = Field(None, description="Path to private key file") + warehouse: str | None = Field(None, description="Snowflake warehouse") + database: str | None = Field(None, description="Default database") + snowflake_schema: str | None = Field(None, description="Default schema") + role: str | None = Field(None, description="Snowflake role") + session_parameters: dict[str, Any] | None = Field( default_factory=dict, description="Session parameters" ) @@ -64,9 +67,9 @@ class SnowflakeSearchToolInput(BaseModel): model_config = ConfigDict(protected_namespaces=()) query: str = Field(..., description="SQL query or semantic search query to execute") - database: Optional[str] = Field(None, description="Override default database") - snowflake_schema: Optional[str] = Field(None, description="Override default schema") - timeout: Optional[int] = Field(300, description="Query timeout in seconds") + database: str | None = Field(None, description="Override default database") + snowflake_schema: str | None = Field(None, description="Override default schema") + timeout: int | None = Field(300, description="Query timeout in seconds") class SnowflakeSearchTool(BaseTool): @@ -77,7 +80,7 @@ class SnowflakeSearchTool(BaseTool): "Execute SQL queries or semantic search on Snowflake data warehouse. " "Supports both raw SQL and natural language queries." ) - args_schema: Type[BaseModel] = SnowflakeSearchToolInput + args_schema: type[BaseModel] = SnowflakeSearchToolInput # Define Pydantic fields config: SnowflakeConfig = Field( @@ -96,15 +99,17 @@ class SnowflakeSearchTool(BaseTool): arbitrary_types_allowed=True, validate_assignment=True, frozen=False ) - _connection_pool: Optional[List["SnowflakeConnection"]] = None - _pool_lock: Optional[asyncio.Lock] = None - _thread_pool: Optional[ThreadPoolExecutor] = None + _connection_pool: list["SnowflakeConnection"] | None = None + _pool_lock: asyncio.Lock | None = None + _thread_pool: ThreadPoolExecutor | None = None _model_rebuilt: bool = False - package_dependencies: List[str] = [ - "snowflake-connector-python", - "snowflake-sqlalchemy", - "cryptography", - ] + package_dependencies: list[str] = Field( + default_factory=lambda: [ + "snowflake-connector-python", + "snowflake-sqlalchemy", + "cryptography", + ] + ) def __init__(self, **data): """Initialize SnowflakeSearchTool.""" @@ -129,7 +134,7 @@ class SnowflakeSearchTool(BaseTool): try: subprocess.run( - [ + [ # noqa: S607 "uv", "add", "cryptography", @@ -142,16 +147,20 @@ class SnowflakeSearchTool(BaseTool): self._connection_pool = [] self._pool_lock = asyncio.Lock() self._thread_pool = ThreadPoolExecutor(max_workers=self.pool_size) - except subprocess.CalledProcessError: - raise ImportError("Failed to install Snowflake dependencies") + except subprocess.CalledProcessError as e: + raise ImportError("Failed to install Snowflake dependencies") from e else: raise ImportError( "Snowflake dependencies not found. Please install them by running " "`uv add cryptography snowflake-connector-python snowflake-sqlalchemy`" - ) + ) from None async def _get_connection(self) -> "SnowflakeConnection": """Get a connection from the pool or create a new one.""" + if self._pool_lock is None: + raise RuntimeError("Pool lock not initialized") + if self._connection_pool is None: + raise RuntimeError("Connection pool not initialized") async with self._pool_lock: if not self._connection_pool: conn = await asyncio.get_event_loop().run_in_executor( @@ -162,7 +171,7 @@ class SnowflakeSearchTool(BaseTool): def _create_connection(self) -> "SnowflakeConnection": """Create a new Snowflake connection.""" - conn_params = { + conn_params: dict[str, Any] = { "account": self.config.account, "user": self.config.user, "warehouse": self.config.warehouse, @@ -189,9 +198,8 @@ class SnowflakeSearchTool(BaseTool): async def _execute_query( self, query: str, timeout: int = 300 - ) -> List[Dict[str, Any]]: + ) -> list[dict[str, Any]]: """Execute a query with retries and return results.""" - if self.enable_caching: cache_key = self._get_cache_key(query, timeout) if cache_key in _query_cache: @@ -209,7 +217,10 @@ class SnowflakeSearchTool(BaseTool): return [] columns = [col[0] for col in cursor.description] - results = [dict(zip(columns, row)) for row in cursor.fetchall()] + results = [ + dict(zip(columns, row, strict=False)) + for row in cursor.fetchall() + ] if self.enable_caching: _query_cache[self._get_cache_key(query, timeout)] = results @@ -217,25 +228,29 @@ class SnowflakeSearchTool(BaseTool): return results finally: cursor.close() - async with self._pool_lock: - self._connection_pool.append(conn) - except (DatabaseError, OperationalError) as e: + if ( + self._pool_lock is not None + and self._connection_pool is not None + ): + async with self._pool_lock: + self._connection_pool.append(conn) + except (DatabaseError, OperationalError) as e: # noqa: PERF203 if attempt == self.max_retries - 1: raise await asyncio.sleep(self.retry_delay * (2**attempt)) logger.warning(f"Query failed, attempt {attempt + 1}: {e!s}") continue + raise RuntimeError("Query failed after all retries") async def _run( self, query: str, - database: Optional[str] = None, - snowflake_schema: Optional[str] = None, + database: str | None = None, + snowflake_schema: str | None = None, timeout: int = 300, **kwargs: Any, ) -> Any: """Execute the search query.""" - try: # Override database/schema if provided if database: @@ -243,8 +258,7 @@ class SnowflakeSearchTool(BaseTool): if snowflake_schema: await self._execute_query(f"USE SCHEMA {snowflake_schema}") - results = await self._execute_query(query, timeout) - return results + return await self._execute_query(query, timeout) except Exception as e: logger.error(f"Error executing query: {e!s}") raise @@ -256,11 +270,11 @@ class SnowflakeSearchTool(BaseTool): for conn in self._connection_pool: try: conn.close() - except Exception: + except Exception: # noqa: PERF203, S110 pass if self._thread_pool: self._thread_pool.shutdown() - except Exception: + except Exception: # noqa: S110 pass @@ -269,5 +283,5 @@ try: if not hasattr(SnowflakeSearchTool, "_model_rebuilt"): SnowflakeSearchTool.model_rebuild() SnowflakeSearchTool._model_rebuilt = True -except Exception: +except Exception: # noqa: S110 pass diff --git a/lib/crewai-tools/src/crewai_tools/tools/spider_tool/__init__.py b/lib/crewai-tools/src/crewai_tools/tools/spider_tool/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/lib/crewai-tools/src/crewai_tools/tools/spider_tool/spider_tool.py b/lib/crewai-tools/src/crewai_tools/tools/spider_tool/spider_tool.py index 0b0914516..d40b46f2a 100644 --- a/lib/crewai-tools/src/crewai_tools/tools/spider_tool/spider_tool.py +++ b/lib/crewai-tools/src/crewai_tools/tools/spider_tool/spider_tool.py @@ -1,5 +1,5 @@ import logging -from typing import Any, Dict, List, Literal, Optional, Type +from typing import Any, Literal from urllib.parse import unquote, urlparse from crewai.tools import BaseTool, EnvVar @@ -47,25 +47,29 @@ class SpiderTool(BaseTool): description: str = ( "A tool to scrape or crawl a website and return LLM-ready content." ) - args_schema: Type[BaseModel] = SpiderToolSchema - custom_params: Optional[Dict[str, Any]] = None - website_url: Optional[str] = None - api_key: Optional[str] = None + args_schema: type[BaseModel] = SpiderToolSchema + custom_params: dict[str, Any] | None = None + website_url: str | None = None + api_key: str | None = None spider: Any = None log_failures: bool = True config: SpiderToolConfig = SpiderToolConfig() - package_dependencies: List[str] = ["spider-client"] - env_vars: List[EnvVar] = [ - EnvVar( - name="SPIDER_API_KEY", description="API key for Spider.cloud", required=True - ), - ] + package_dependencies: list[str] = Field(default_factory=lambda: ["spider-client"]) + env_vars: list[EnvVar] = Field( + default_factory=lambda: [ + EnvVar( + name="SPIDER_API_KEY", + description="API key for Spider.cloud", + required=True, + ), + ] + ) def __init__( self, - api_key: Optional[str] = None, - website_url: Optional[str] = None, - custom_params: Optional[Dict[str, Any]] = None, + api_key: str | None = None, + website_url: str | None = None, + custom_params: dict[str, Any] | None = None, log_failures: bool = True, **kwargs, ): @@ -83,7 +87,6 @@ class SpiderTool(BaseTool): ImportError: If spider-client package is not installed. RuntimeError: If Spider client initialization fails. """ - super().__init__(**kwargs) if website_url is not None: self.website_url = website_url @@ -102,12 +105,12 @@ class SpiderTool(BaseTool): ): import subprocess - subprocess.run(["uv", "pip", "install", "spider-client"], check=True) + subprocess.run(["uv", "pip", "install", "spider-client"], check=True) # noqa: S607 from spider import Spider else: raise ImportError( "`spider-client` package not found, please run `uv add spider-client`" - ) + ) from None self.spider = Spider(api_key=api_key) def _validate_url(self, url: str) -> bool: @@ -138,7 +141,7 @@ class SpiderTool(BaseTool): self, website_url: str, mode: Literal["scrape", "crawl"] = "scrape", - ) -> Optional[str]: + ) -> str | None: """Execute the spider tool to scrape or crawl the specified website. Args: @@ -157,7 +160,6 @@ class SpiderTool(BaseTool): ConnectionError: If network connection fails while accessing the URL. Exception: For other runtime errors. """ - try: params = {} url = website_url or self.website_url diff --git a/lib/crewai-tools/src/crewai_tools/tools/stagehand_tool/stagehand_tool.py b/lib/crewai-tools/src/crewai_tools/tools/stagehand_tool/stagehand_tool.py index d872147d5..562ecaed1 100644 --- a/lib/crewai-tools/src/crewai_tools/tools/stagehand_tool/stagehand_tool.py +++ b/lib/crewai-tools/src/crewai_tools/tools/stagehand_tool/stagehand_tool.py @@ -2,8 +2,9 @@ import asyncio import json import os import re -from typing import Any, Dict, List, Optional, Type, Union +from typing import Any +from crewai.tools import BaseTool from pydantic import BaseModel, Field @@ -38,9 +39,6 @@ except ImportError: CLAUDE_3_7_SONNET_LATEST = "anthropic.claude-3-7-sonnet-20240607" -from crewai.tools import BaseTool - - class StagehandResult(BaseModel): """Result from a Stagehand operation. @@ -53,10 +51,10 @@ class StagehandResult(BaseModel): success: bool = Field( ..., description="Whether the operation completed successfully" ) - data: Union[str, Dict, List] = Field( + data: str | dict | list = Field( ..., description="The result data from the operation" ) - error: Optional[str] = Field( + error: str | None = Field( None, description="Optional error message if the operation failed" ) @@ -64,15 +62,15 @@ class StagehandResult(BaseModel): class StagehandToolSchema(BaseModel): """Input for StagehandTool.""" - instruction: Optional[str] = Field( + instruction: str | None = Field( None, description="Single atomic action with location context. For reliability on complex pages, use ONE specific action with location hints. Good examples: 'Click the search input field in the header', 'Type Italy in the focused field', 'Press Enter', 'Click the first link in the results area'. Avoid combining multiple actions. For 'navigate' command type, this can be omitted if only URL is provided.", ) - url: Optional[str] = Field( + url: str | None = Field( None, description="The URL to navigate to before executing the instruction. MUST be used with 'navigate' command. ", ) - command_type: Optional[str] = Field( + command_type: str | None = Field( "act", description="""The type of command to execute (choose one): - 'act': Perform an action like clicking buttons, filling forms, etc. (default) @@ -84,8 +82,7 @@ class StagehandToolSchema(BaseModel): class StagehandTool(BaseTool): - """ - A tool that uses Stagehand to automate web browser interactions using natural language with atomic action handling. + """A tool that uses Stagehand to automate web browser interactions using natural language with atomic action handling. Stagehand allows AI agents to interact with websites through a browser, performing actions like clicking buttons, filling forms, and extracting data. @@ -134,14 +131,14 @@ class StagehandTool(BaseTool): - 'extract': For getting data from a specific page section - 'observe': For finding elements in a specific area """ - args_schema: Type[BaseModel] = StagehandToolSchema + args_schema: type[BaseModel] = StagehandToolSchema # Stagehand configuration - api_key: Optional[str] = None - project_id: Optional[str] = None - model_api_key: Optional[str] = None - model_name: Optional[AvailableModel] = AvailableModel.CLAUDE_3_7_SONNET_LATEST - server_url: Optional[str] = "https://api.stagehand.browserbase.com/v1" + api_key: str | None = None + project_id: str | None = None + model_api_key: str | None = None + model_name: AvailableModel | None = AvailableModel.CLAUDE_3_7_SONNET_LATEST + server_url: str | None = "https://api.stagehand.browserbase.com/v1" headless: bool = False dom_settle_timeout_ms: int = 3000 self_heal: bool = True @@ -153,24 +150,24 @@ class StagehandTool(BaseTool): use_simplified_dom: bool = True # Instance variables - _stagehand: Optional[Stagehand] = None - _page: Optional[StagehandPage] = None - _session_id: Optional[str] = None + _stagehand: Stagehand | None = None + _page: StagehandPage | None = None + _session_id: str | None = None _testing: bool = False def __init__( self, - api_key: Optional[str] = None, - project_id: Optional[str] = None, - model_api_key: Optional[str] = None, - model_name: Optional[str] = None, - server_url: Optional[str] = None, - session_id: Optional[str] = None, - headless: Optional[bool] = None, - dom_settle_timeout_ms: Optional[int] = None, - self_heal: Optional[bool] = None, - wait_for_captcha_solves: Optional[bool] = None, - verbose: Optional[int] = None, + api_key: str | None = None, + project_id: str | None = None, + model_api_key: str | None = None, + model_name: str | None = None, + server_url: str | None = None, + session_id: str | None = None, + headless: bool | None = None, + dom_settle_timeout_ms: int | None = None, + self_heal: bool | None = None, + wait_for_captcha_solves: bool | None = None, + verbose: int | None = None, _testing: bool = False, **kwargs, ): @@ -230,10 +227,10 @@ class StagehandTool(BaseTool): ) def __del__(self): - """Ensure cleanup on deletion""" + """Ensure cleanup on deletion.""" try: self.close() - except Exception: + except Exception: # noqa: S110 pass def _get_model_api_key(self): @@ -253,9 +250,8 @@ class StagehandTool(BaseTool): or os.getenv("ANTHROPIC_API_KEY") ) - async def _setup_stagehand(self, session_id: Optional[str] = None): + async def _setup_stagehand(self, session_id: str | None = None): """Initialize Stagehand if not already set up.""" - # If we're in testing mode, return mock objects if self._testing: if not self._stagehand: @@ -342,8 +338,8 @@ class StagehandTool(BaseTool): return self._stagehand, self._page - def _extract_steps(self, instruction: str) -> List[str]: - """Extract individual steps from multi-step instructions""" + def _extract_steps(self, instruction: str) -> list[str]: + """Extract individual steps from multi-step instructions.""" # Check for numbered steps (Step 1:, Step 2:, etc.) if re.search(r"Step \d+:", instruction, re.IGNORECASE): steps = re.findall( @@ -358,7 +354,7 @@ class StagehandTool(BaseTool): return [instruction] def _simplify_instruction(self, instruction: str) -> str: - """Simplify complex instructions to basic actions""" + """Simplify complex instructions to basic actions.""" # Extract the core action from complex instructions instruction_lower = instruction.lower() @@ -382,12 +378,11 @@ class StagehandTool(BaseTool): async def _async_run( self, - instruction: Optional[str] = None, - url: Optional[str] = None, + instruction: str | None = None, + url: str | None = None, command_type: str = "act", ): - """Override _async_run with improved atomic action handling""" - + """Override _async_run with improved atomic action handling.""" # Handle missing instruction based on command type if not instruction: if command_type == "navigate" and url: @@ -563,17 +558,16 @@ class StagehandTool(BaseTool): return self._format_result(False, {}, error_msg) def _format_result(self, success, data, error=None): - """Helper to format results consistently""" + """Helper to format results consistently.""" return StagehandResult(success=success, data=data, error=error) def _run( self, - instruction: Optional[str] = None, - url: Optional[str] = None, + instruction: str | None = None, + url: str | None = None, command_type: str = "act", ) -> str: - """ - Run the Stagehand tool with the given instruction. + """Run the Stagehand tool with the given instruction. Args: instruction: Natural language instruction for browser automation @@ -700,9 +694,9 @@ class StagehandTool(BaseTool): else: # Handle non-async close method (for mocks) self._stagehand.close() - except Exception as e: + except Exception: # noqa: S110 # Log but don't raise - we're cleaning up - print(f"Error closing Stagehand: {e!s}") + pass self._stagehand = None diff --git a/lib/crewai-tools/src/crewai_tools/tools/tavily_extractor_tool/__init__.py b/lib/crewai-tools/src/crewai_tools/tools/tavily_extractor_tool/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/lib/crewai-tools/src/crewai_tools/tools/tavily_extractor_tool/tavily_extractor_tool.py b/lib/crewai-tools/src/crewai_tools/tools/tavily_extractor_tool/tavily_extractor_tool.py index 1d9d13a45..f9184dd80 100644 --- a/lib/crewai-tools/src/crewai_tools/tools/tavily_extractor_tool/tavily_extractor_tool.py +++ b/lib/crewai-tools/src/crewai_tools/tools/tavily_extractor_tool/tavily_extractor_tool.py @@ -1,10 +1,10 @@ import json import os -from typing import Any, List, Literal, Optional, Type, Union +from typing import Any, Literal from crewai.tools import BaseTool, EnvVar from dotenv import load_dotenv -from pydantic import BaseModel, Field +from pydantic import BaseModel, ConfigDict, Field load_dotenv() @@ -21,21 +21,23 @@ except ImportError: class TavilyExtractorToolSchema(BaseModel): """Input schema for TavilyExtractorTool.""" - urls: Union[List[str], str] = Field( + urls: list[str] | str = Field( ..., description="The URL(s) to extract data from. Can be a single URL or a list of URLs.", ) class TavilyExtractorTool(BaseTool): - package_dependencies: List[str] = ["tavily-python"] - env_vars: List[EnvVar] = [ - EnvVar( - name="TAVILY_API_KEY", - description="API key for Tavily extraction service", - required=True, - ), - ] + package_dependencies: list[str] = Field(default_factory=lambda: ["tavily-python"]) + env_vars: list[EnvVar] = Field( + default_factory=lambda: [ + EnvVar( + name="TAVILY_API_KEY", + description="API key for Tavily extraction service", + required=True, + ), + ] + ) """ Tool that uses the Tavily API to extract content from web pages. @@ -52,17 +54,17 @@ class TavilyExtractorTool(BaseTool): timeout: The timeout for the extraction request in seconds. """ - model_config = {"arbitrary_types_allowed": True} - client: Optional[TavilyClient] = None - async_client: Optional[AsyncTavilyClient] = None + model_config = ConfigDict(arbitrary_types_allowed=True) + client: TavilyClient | None = None + async_client: AsyncTavilyClient | None = None name: str = "TavilyExtractorTool" description: str = "Extracts content from one or more web pages using the Tavily API. Returns structured data." - args_schema: Type[BaseModel] = TavilyExtractorToolSchema - api_key: Optional[str] = Field( + args_schema: type[BaseModel] = TavilyExtractorToolSchema + api_key: str | None = Field( default_factory=lambda: os.getenv("TAVILY_API_KEY"), description="The Tavily API key. If not provided, it will be loaded from the environment variable TAVILY_API_KEY.", ) - proxies: Optional[dict[str, str]] = Field( + proxies: dict[str, str] | None = Field( default=None, description="Optional proxies to use for the Tavily API requests.", ) @@ -80,8 +82,7 @@ class TavilyExtractorTool(BaseTool): ) def __init__(self, **kwargs: Any): - """ - Initializes the TavilyExtractorTool. + """Initializes the TavilyExtractorTool. Args: **kwargs: Additional keyword arguments. @@ -101,13 +102,13 @@ class TavilyExtractorTool(BaseTool): raise ImportError( "The 'tavily-python' package is required. 'click' and 'subprocess' are also needed to assist with installation if the package is missing. " "Please install 'tavily-python' manually (e.g., 'uv add tavily-python') and ensure 'click' and 'subprocess' are available." - ) + ) from None if click.confirm( "You are missing the 'tavily-python' package, which is required for TavilyExtractorTool. Would you like to install it?" ): try: - subprocess.run(["pip", "install", "tavily-python"], check=True) + subprocess.run(["uv pip", "install", "tavily-python"], check=True) # noqa: S607 raise ImportError( "'tavily-python' has been installed. Please restart your Python application to use the TavilyExtractorTool." ) @@ -115,7 +116,7 @@ class TavilyExtractorTool(BaseTool): raise ImportError( f"Attempted to install 'tavily-python' but failed: {e}. " f"Please install it manually to use the TavilyExtractorTool." - ) + ) from e else: raise ImportError( "The 'tavily-python' package is required to use the TavilyExtractorTool. " @@ -124,10 +125,9 @@ class TavilyExtractorTool(BaseTool): def _run( self, - urls: Union[List[str], str], + urls: list[str] | str, ) -> str: - """ - Synchronously extracts content from the given URL(s). + """Synchronously extracts content from the given URL(s). Args: urls: The URL(s) to extract data from. @@ -152,10 +152,9 @@ class TavilyExtractorTool(BaseTool): async def _arun( self, - urls: Union[List[str], str], + urls: list[str] | str, ) -> str: - """ - Asynchronously extracts content from the given URL(s). + """Asynchronously extracts content from the given URL(s). Args: urls: The URL(s) to extract data from. diff --git a/lib/crewai-tools/src/crewai_tools/tools/tavily_search_tool/__init__.py b/lib/crewai-tools/src/crewai_tools/tools/tavily_search_tool/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/lib/crewai-tools/src/crewai_tools/tools/tavily_search_tool/tavily_search_tool.py b/lib/crewai-tools/src/crewai_tools/tools/tavily_search_tool/tavily_search_tool.py index 53c798c6b..21375aaa0 100644 --- a/lib/crewai-tools/src/crewai_tools/tools/tavily_search_tool/tavily_search_tool.py +++ b/lib/crewai-tools/src/crewai_tools/tools/tavily_search_tool/tavily_search_tool.py @@ -1,11 +1,11 @@ from collections.abc import Sequence import json import os -from typing import Any, List, Literal, Optional, Type, Union +from typing import Any, Literal from crewai.tools import BaseTool, EnvVar from dotenv import load_dotenv -from pydantic import BaseModel, Field +from pydantic import BaseModel, ConfigDict, Field load_dotenv() @@ -26,8 +26,7 @@ class TavilySearchToolSchema(BaseModel): class TavilySearchTool(BaseTool): - """ - Tool that uses the Tavily Search API to perform web searches. + """Tool that uses the Tavily Search API to perform web searches. Attributes: client: An instance of TavilyClient. @@ -51,20 +50,20 @@ class TavilySearchTool(BaseTool): max_content_length_per_result: Maximum length for the 'content' of each search result. """ - model_config = {"arbitrary_types_allowed": True} - client: Optional[TavilyClient] = None - async_client: Optional[AsyncTavilyClient] = None + model_config = ConfigDict(arbitrary_types_allowed=True) + client: TavilyClient | None = None + async_client: AsyncTavilyClient | None = None name: str = "Tavily Search" description: str = ( "A tool that performs web searches using the Tavily Search API. " "It returns a JSON object containing the search results." ) - args_schema: Type[BaseModel] = TavilySearchToolSchema - api_key: Optional[str] = Field( + args_schema: type[BaseModel] = TavilySearchToolSchema + api_key: str | None = Field( default_factory=lambda: os.getenv("TAVILY_API_KEY"), description="The Tavily API key. If not provided, it will be loaded from the environment variable TAVILY_API_KEY.", ) - proxies: Optional[dict[str, str]] = Field( + proxies: dict[str, str] | None = Field( default=None, description="Optional proxies to use for the Tavily API requests.", ) @@ -74,20 +73,20 @@ class TavilySearchTool(BaseTool): topic: Literal["general", "news", "finance"] = Field( default="general", description="The topic to focus the search on." ) - time_range: Optional[Literal["day", "week", "month", "year"]] = Field( + time_range: Literal["day", "week", "month", "year"] | None = Field( default=None, description="The time range for the search." ) days: int = Field(default=7, description="The number of days to search back.") max_results: int = Field( default=5, description="The maximum number of results to return." ) - include_domains: Optional[Sequence[str]] = Field( + include_domains: Sequence[str] | None = Field( default=None, description="A list of domains to include in the search." ) - exclude_domains: Optional[Sequence[str]] = Field( + exclude_domains: Sequence[str] | None = Field( default=None, description="A list of domains to exclude from the search." ) - include_answer: Union[bool, Literal["basic", "advanced"]] = Field( + include_answer: bool | Literal["basic", "advanced"] = Field( default=False, description="Whether to include a direct answer to the query." ) include_raw_content: bool = Field( @@ -104,14 +103,16 @@ class TavilySearchTool(BaseTool): default=1000, description="Maximum length for the 'content' of each search result to avoid context window issues.", ) - package_dependencies: List[str] = ["tavily-python"] - env_vars: List[EnvVar] = [ - EnvVar( - name="TAVILY_API_KEY", - description="API key for Tavily search service", - required=True, - ), - ] + package_dependencies: list[str] = Field(default_factory=lambda: ["tavily-python"]) + env_vars: list[EnvVar] = Field( + default_factory=lambda: [ + EnvVar( + name="TAVILY_API_KEY", + description="API key for Tavily search service", + required=True, + ), + ] + ) def __init__(self, **kwargs: Any): super().__init__(**kwargs) @@ -125,17 +126,17 @@ class TavilySearchTool(BaseTool): import subprocess import click - except ImportError: + except ImportError as e: raise ImportError( "The 'tavily-python' package is required. 'click' and 'subprocess' are also needed to assist with installation if the package is missing. " "Please install 'tavily-python' manually (e.g., 'pip install tavily-python') and ensure 'click' and 'subprocess' are available." - ) + ) from e if click.confirm( "You are missing the 'tavily-python' package, which is required for TavilySearchTool. Would you like to install it?" ): try: - subprocess.run(["uv", "add", "tavily-python"], check=True) + subprocess.run(["uv", "add", "tavily-python"], check=True) # noqa: S607 raise ImportError( "'tavily-python' has been installed. Please restart your Python application to use the TavilySearchTool." ) @@ -143,7 +144,7 @@ class TavilySearchTool(BaseTool): raise ImportError( f"Attempted to install 'tavily-python' but failed: {e}. " f"Please install it manually to use the TavilySearchTool." - ) + ) from e else: raise ImportError( "The 'tavily-python' package is required to use the TavilySearchTool. " @@ -154,8 +155,7 @@ class TavilySearchTool(BaseTool): self, query: str, ) -> str: - """ - Synchronously performs a search using the Tavily API. + """Synchronously performs a search using the Tavily API. Content of each result is truncated to `max_content_length_per_result`. Args: @@ -207,8 +207,7 @@ class TavilySearchTool(BaseTool): self, query: str, ) -> str: - """ - Asynchronously performs a search using the Tavily API. + """Asynchronously performs a search using the Tavily API. Content of each result is truncated to `max_content_length_per_result`. Args: diff --git a/lib/crewai-tools/src/crewai_tools/tools/txt_search_tool/__init__.py b/lib/crewai-tools/src/crewai_tools/tools/txt_search_tool/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/lib/crewai-tools/src/crewai_tools/tools/txt_search_tool/txt_search_tool.py b/lib/crewai-tools/src/crewai_tools/tools/txt_search_tool/txt_search_tool.py index 9326ba35b..7b45875cf 100644 --- a/lib/crewai-tools/src/crewai_tools/tools/txt_search_tool/txt_search_tool.py +++ b/lib/crewai-tools/src/crewai_tools/tools/txt_search_tool/txt_search_tool.py @@ -1,5 +1,3 @@ -from typing import Optional, Type - from pydantic import BaseModel, Field from ..rag.rag_tool import RagTool @@ -25,9 +23,9 @@ class TXTSearchTool(RagTool): description: str = ( "A tool that can be used to semantic search a query from a txt's content." ) - args_schema: Type[BaseModel] = TXTSearchToolSchema + args_schema: type[BaseModel] = TXTSearchToolSchema - def __init__(self, txt: Optional[str] = None, **kwargs): + def __init__(self, txt: str | None = None, **kwargs): super().__init__(**kwargs) if txt is not None: self.add(txt) @@ -38,7 +36,7 @@ class TXTSearchTool(RagTool): def _run( self, search_query: str, - txt: Optional[str] = None, + txt: str | None = None, similarity_threshold: float | None = None, limit: int | None = None, ) -> str: diff --git a/lib/crewai-tools/src/crewai_tools/tools/vision_tool/__init__.py b/lib/crewai-tools/src/crewai_tools/tools/vision_tool/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/lib/crewai-tools/src/crewai_tools/tools/vision_tool/vision_tool.py b/lib/crewai-tools/src/crewai_tools/tools/vision_tool/vision_tool.py index a3009a67f..3af71c07d 100644 --- a/lib/crewai-tools/src/crewai_tools/tools/vision_tool/vision_tool.py +++ b/lib/crewai-tools/src/crewai_tools/tools/vision_tool/vision_tool.py @@ -1,10 +1,10 @@ import base64 from pathlib import Path -from typing import List, Optional, Type +from typing import Any from crewai import LLM from crewai.tools import BaseTool, EnvVar -from pydantic import BaseModel, PrivateAttr, field_validator +from pydantic import BaseModel, Field, PrivateAttr, field_validator class ImagePromptSchema(BaseModel): @@ -13,6 +13,7 @@ class ImagePromptSchema(BaseModel): image_path_url: str = "The image path or URL." @field_validator("image_path_url") + @classmethod def validate_image_path_url(cls, v: str) -> str: if v.startswith("http"): return v @@ -43,19 +44,21 @@ class VisionTool(BaseTool): description: str = ( "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, - ), - ] + args_schema: type[BaseModel] = ImagePromptSchema + env_vars: list[EnvVar] = Field( + default_factory=lambda: [ + 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) + _llm: LLM | None = PrivateAttr(default=None) - def __init__(self, llm: Optional[LLM] = None, model: str = "gpt-4o-mini", **kwargs): + def __init__(self, llm: LLM | None = None, model: str = "gpt-4o-mini", **kwargs): """Initialize the vision tool. Args: @@ -76,7 +79,7 @@ class VisionTool(BaseTool): def model(self, value: str) -> None: """Set the model identifier and reset LLM if it was auto-created.""" self._model = value - if self._llm is not None and self._llm._model != value: + if self._llm is not None and getattr(self._llm, "model", None) != value: self._llm = None @property @@ -103,21 +106,19 @@ class VisionTool(BaseTool): except Exception as e: return f"Error processing image: {e!s}" - response = self.llm.call( - messages=[ - { - "role": "user", - "content": [ - {"type": "text", "text": "What's in this image?"}, - { - "type": "image_url", - "image_url": {"url": image_data}, - }, - ], - }, - ], - ) - return response + messages: list[dict[str, Any]] = [ + { + "role": "user", + "content": [ + {"type": "text", "text": "What's in this image?"}, + { + "type": "image_url", + "image_url": {"url": image_data}, + }, + ], + }, + ] + return self.llm.call(messages=messages) except Exception as e: return f"An error occurred: {e!s}" diff --git a/lib/crewai-tools/src/crewai_tools/tools/weaviate_tool/__init__.py b/lib/crewai-tools/src/crewai_tools/tools/weaviate_tool/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/lib/crewai-tools/src/crewai_tools/tools/weaviate_tool/vector_search.py b/lib/crewai-tools/src/crewai_tools/tools/weaviate_tool/vector_search.py index 2a286bc42..f079904ae 100644 --- a/lib/crewai-tools/src/crewai_tools/tools/weaviate_tool/vector_search.py +++ b/lib/crewai-tools/src/crewai_tools/tools/weaviate_tool/vector_search.py @@ -1,6 +1,6 @@ import json import os -from typing import Any, List, Optional, Type +from typing import Any try: @@ -30,26 +30,28 @@ class WeaviateToolSchema(BaseModel): class WeaviateVectorSearchTool(BaseTool): - """Tool to search the Weaviate database""" + """Tool to search the Weaviate database.""" - package_dependencies: List[str] = ["weaviate-client"] + package_dependencies: list[str] = Field(default_factory=lambda: ["weaviate-client"]) name: str = "WeaviateVectorSearchTool" description: str = "A tool to search the Weaviate database for relevant information on internal documents." - args_schema: Type[BaseModel] = WeaviateToolSchema - query: Optional[str] = None - vectorizer: Optional[Vectorizers] = None - generative_model: Optional[str] = None - collection_name: Optional[str] = None - limit: Optional[int] = Field(default=3) - headers: Optional[dict] = None - alpha: Optional[int] = Field(default=0.75) - env_vars: List[EnvVar] = [ - EnvVar( - name="OPENAI_API_KEY", - description="OpenAI API key for embedding generation and retrieval", - required=True, - ), - ] + args_schema: type[BaseModel] = WeaviateToolSchema + query: str | None = None + vectorizer: Vectorizers | None = None + generative_model: str | None = None + collection_name: str | None = None + limit: int | None = Field(default=3) + headers: dict | None = None + alpha: int | None = Field(default=0.75) + env_vars: list[EnvVar] = Field( + default_factory=lambda: [ + EnvVar( + name="OPENAI_API_KEY", + description="OpenAI API key for embedding generation and retrieval", + required=True, + ), + ] + ) weaviate_cluster_url: str = Field( ..., description="The URL of the Weaviate cluster", @@ -58,7 +60,6 @@ class WeaviateVectorSearchTool(BaseTool): ..., description="The API key for the Weaviate cluster", ) - package_dependencies: List[str] = ["weaviate-client"] def __init__(self, **kwargs): super().__init__(**kwargs) @@ -86,7 +87,7 @@ class WeaviateVectorSearchTool(BaseTool): ): import subprocess - subprocess.run(["uv", "pip", "install", "weaviate-client"], check=True) + subprocess.run(["uv", "pip", "install", "weaviate-client"], check=True) # noqa: S607 else: raise ImportError( diff --git a/lib/crewai-tools/src/crewai_tools/tools/website_search/__init__.py b/lib/crewai-tools/src/crewai_tools/tools/website_search/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/lib/crewai-tools/src/crewai_tools/tools/website_search/website_search_tool.py b/lib/crewai-tools/src/crewai_tools/tools/website_search/website_search_tool.py index c8c543532..6c027eb2f 100644 --- a/lib/crewai-tools/src/crewai_tools/tools/website_search/website_search_tool.py +++ b/lib/crewai-tools/src/crewai_tools/tools/website_search/website_search_tool.py @@ -1,7 +1,6 @@ -from typing import Optional, Type +from pydantic import BaseModel, Field from crewai_tools.rag.data_types import DataType -from pydantic import BaseModel, Field from ..rag.rag_tool import RagTool @@ -26,9 +25,9 @@ class WebsiteSearchToolSchema(FixedWebsiteSearchToolSchema): class WebsiteSearchTool(RagTool): name: str = "Search in a specific website" description: str = "A tool that can be used to semantic search a query from a specific URL content." - args_schema: Type[BaseModel] = WebsiteSearchToolSchema + args_schema: type[BaseModel] = WebsiteSearchToolSchema - def __init__(self, website: Optional[str] = None, **kwargs): + def __init__(self, website: str | None = None, **kwargs): super().__init__(**kwargs) if website is not None: self.add(website) @@ -42,7 +41,7 @@ class WebsiteSearchTool(RagTool): def _run( self, search_query: str, - website: Optional[str] = None, + website: str | None = None, similarity_threshold: float | None = None, limit: int | None = None, ) -> str: diff --git a/lib/crewai-tools/src/crewai_tools/tools/xml_search_tool/__init__.py b/lib/crewai-tools/src/crewai_tools/tools/xml_search_tool/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/lib/crewai-tools/src/crewai_tools/tools/xml_search_tool/xml_search_tool.py b/lib/crewai-tools/src/crewai_tools/tools/xml_search_tool/xml_search_tool.py index b6e54f9b5..0842ca1b9 100644 --- a/lib/crewai-tools/src/crewai_tools/tools/xml_search_tool/xml_search_tool.py +++ b/lib/crewai-tools/src/crewai_tools/tools/xml_search_tool/xml_search_tool.py @@ -1,5 +1,3 @@ -from typing import Optional, Type - from pydantic import BaseModel, Field from ..rag.rag_tool import RagTool @@ -25,9 +23,9 @@ class XMLSearchTool(RagTool): description: str = ( "A tool that can be used to semantic search a query from a XML's content." ) - args_schema: Type[BaseModel] = XMLSearchToolSchema + args_schema: type[BaseModel] = XMLSearchToolSchema - def __init__(self, xml: Optional[str] = None, **kwargs): + def __init__(self, xml: str | None = None, **kwargs): super().__init__(**kwargs) if xml is not None: self.add(xml) @@ -38,7 +36,7 @@ class XMLSearchTool(RagTool): def _run( self, search_query: str, - xml: Optional[str] = None, + xml: str | None = None, similarity_threshold: float | None = None, limit: int | None = None, ) -> str: diff --git a/lib/crewai-tools/src/crewai_tools/tools/youtube_channel_search_tool/__init__.py b/lib/crewai-tools/src/crewai_tools/tools/youtube_channel_search_tool/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/lib/crewai-tools/src/crewai_tools/tools/youtube_channel_search_tool/youtube_channel_search_tool.py b/lib/crewai-tools/src/crewai_tools/tools/youtube_channel_search_tool/youtube_channel_search_tool.py index db90bbbf3..5d750c054 100644 --- a/lib/crewai-tools/src/crewai_tools/tools/youtube_channel_search_tool/youtube_channel_search_tool.py +++ b/lib/crewai-tools/src/crewai_tools/tools/youtube_channel_search_tool/youtube_channel_search_tool.py @@ -1,7 +1,6 @@ -from typing import Optional, Type +from pydantic import BaseModel, Field from crewai_tools.rag.data_types import DataType -from pydantic import BaseModel, Field from ..rag.rag_tool import RagTool @@ -26,9 +25,9 @@ class YoutubeChannelSearchToolSchema(FixedYoutubeChannelSearchToolSchema): class YoutubeChannelSearchTool(RagTool): name: str = "Search a Youtube Channels content" description: str = "A tool that can be used to semantic search a query from a Youtube Channels content." - args_schema: Type[BaseModel] = YoutubeChannelSearchToolSchema + args_schema: type[BaseModel] = YoutubeChannelSearchToolSchema - def __init__(self, youtube_channel_handle: Optional[str] = None, **kwargs): + def __init__(self, youtube_channel_handle: str | None = None, **kwargs): super().__init__(**kwargs) if youtube_channel_handle is not None: self.add(youtube_channel_handle) @@ -47,7 +46,7 @@ class YoutubeChannelSearchTool(RagTool): def _run( self, search_query: str, - youtube_channel_handle: Optional[str] = None, + youtube_channel_handle: str | None = None, similarity_threshold: float | None = None, limit: int | None = None, ) -> str: diff --git a/lib/crewai-tools/src/crewai_tools/tools/youtube_video_search_tool/__init__.py b/lib/crewai-tools/src/crewai_tools/tools/youtube_video_search_tool/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/lib/crewai-tools/src/crewai_tools/tools/youtube_video_search_tool/youtube_video_search_tool.py b/lib/crewai-tools/src/crewai_tools/tools/youtube_video_search_tool/youtube_video_search_tool.py index 0d15cd04b..3432bf32b 100644 --- a/lib/crewai-tools/src/crewai_tools/tools/youtube_video_search_tool/youtube_video_search_tool.py +++ b/lib/crewai-tools/src/crewai_tools/tools/youtube_video_search_tool/youtube_video_search_tool.py @@ -1,7 +1,6 @@ -from typing import Optional, Type +from pydantic import BaseModel, Field from crewai_tools.rag.data_types import DataType -from pydantic import BaseModel, Field from ..rag.rag_tool import RagTool @@ -26,9 +25,9 @@ class YoutubeVideoSearchToolSchema(FixedYoutubeVideoSearchToolSchema): class YoutubeVideoSearchTool(RagTool): name: str = "Search a Youtube Video content" description: str = "A tool that can be used to semantic search a query from a Youtube Video content." - args_schema: Type[BaseModel] = YoutubeVideoSearchToolSchema + args_schema: type[BaseModel] = YoutubeVideoSearchToolSchema - def __init__(self, youtube_video_url: Optional[str] = None, **kwargs): + def __init__(self, youtube_video_url: str | None = None, **kwargs): super().__init__(**kwargs) if youtube_video_url is not None: self.add(youtube_video_url) @@ -42,7 +41,7 @@ class YoutubeVideoSearchTool(RagTool): def _run( self, search_query: str, - youtube_video_url: Optional[str] = None, + youtube_video_url: str | None = None, similarity_threshold: float | None = None, limit: int | None = None, ) -> str: diff --git a/lib/crewai-tools/src/crewai_tools/tools/zapier_action_tool/__init__.py b/lib/crewai-tools/src/crewai_tools/tools/zapier_action_tool/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/lib/crewai-tools/src/crewai_tools/tools/zapier_action_tool/zapier_action_tool.py b/lib/crewai-tools/src/crewai_tools/tools/zapier_action_tool/zapier_action_tool.py index 21e9c0a0f..3eedb4eda 100644 --- a/lib/crewai-tools/src/crewai_tools/tools/zapier_action_tool/zapier_action_tool.py +++ b/lib/crewai-tools/src/crewai_tools/tools/zapier_action_tool/zapier_action_tool.py @@ -1,17 +1,17 @@ import logging import os -from typing import List, Optional from crewai.tools import BaseTool + from crewai_tools.adapters.zapier_adapter import ZapierActionsAdapter logger = logging.getLogger(__name__) -def ZapierActionTools( - zapier_api_key: Optional[str] = None, action_list: Optional[List[str]] = None -) -> List[BaseTool]: +def ZapierActionTools( # noqa: N802 + zapier_api_key: str | None = None, action_list: list[str] | None = None +) -> list[BaseTool]: """Factory function that returns Zapier action tools. Args: diff --git a/lib/crewai-tools/tests/base_tool_test.py b/lib/crewai-tools/tests/base_tool_test.py index dbb7fe20e..6b7c5e6af 100644 --- a/lib/crewai-tools/tests/base_tool_test.py +++ b/lib/crewai-tools/tests/base_tool_test.py @@ -1,4 +1,4 @@ -from typing import Callable +from collections.abc import Callable from crewai.tools import BaseTool, tool from crewai.tools.base_tool import to_langchain @@ -88,7 +88,7 @@ def test_setting_cache_function(): my_tool = MyCustomTool() # Assert all the right attributes were defined - assert my_tool.cache_function() == False + assert not my_tool.cache_function() def test_default_cache_function_is_true(): @@ -101,4 +101,4 @@ def test_default_cache_function_is_true(): my_tool = MyCustomTool() # Assert all the right attributes were defined - assert my_tool.cache_function() == True + assert my_tool.cache_function() diff --git a/lib/crewai-tools/tests/rag/test_directory_loader.py b/lib/crewai-tools/tests/rag/test_directory_loader.py index 366f5d077..d1e1efee2 100644 --- a/lib/crewai-tools/tests/rag/test_directory_loader.py +++ b/lib/crewai-tools/tests/rag/test_directory_loader.py @@ -111,7 +111,7 @@ class TestDirectoryLoader: def test_processing_error_handling(self, temp_directory): self._create_file(temp_directory, "valid.txt") - error_file = self._create_file(temp_directory, "error.txt") + self._create_file(temp_directory, "error.txt") loader = DirectoryLoader() original_method = loader._process_single_file diff --git a/lib/crewai-tools/tests/test_generate_tool_specs.py b/lib/crewai-tools/tests/test_generate_tool_specs.py index 780c7523a..18c2dfe8d 100644 --- a/lib/crewai-tools/tests/test_generate_tool_specs.py +++ b/lib/crewai-tools/tests/test_generate_tool_specs.py @@ -1,5 +1,4 @@ import json -from typing import List, Optional, Type from unittest import mock from crewai.tools.base_tool import BaseTool, EnvVar @@ -11,23 +10,23 @@ import pytest class MockToolSchema(BaseModel): query: str = Field(..., description="The query parameter") count: int = Field(5, description="Number of results to return") - filters: Optional[List[str]] = Field(None, description="Optional filters to apply") + filters: list[str] | None = Field(None, description="Optional filters to apply") class MockTool(BaseTool): name: str = "Mock Search Tool" description: str = "A tool that mocks search functionality" - args_schema: Type[BaseModel] = MockToolSchema + args_schema: type[BaseModel] = MockToolSchema another_parameter: str = Field( "Another way to define a default value", description="" ) my_parameter: str = Field("This is default value", description="What a description") my_parameter_bool: bool = Field(False) - package_dependencies: List[str] = Field( + package_dependencies: list[str] = Field( ["this-is-a-required-package", "another-required-package"], description="" ) - env_vars: List[EnvVar] = [ + env_vars: list[EnvVar] = [ EnvVar( name="SERPER_API_KEY", description="API key for Serper", @@ -110,7 +109,7 @@ def test_extract_init_params_schema(mock_tool_extractor): assert my_parameter["type"] == "string" my_parameter_bool = init_params_schema["properties"]["my_parameter_bool"] - assert my_parameter_bool["default"] == False + assert not my_parameter_bool["default"] assert my_parameter_bool["type"] == "boolean" @@ -121,12 +120,12 @@ def test_extract_env_vars(mock_tool_extractor): api_key_var, rate_limit_var = tool_info["env_vars"] assert api_key_var["name"] == "SERPER_API_KEY" assert api_key_var["description"] == "API key for Serper" - assert api_key_var["required"] == True - assert api_key_var["default"] == None + assert api_key_var["required"] + assert api_key_var["default"] is None assert rate_limit_var["name"] == "API_RATE_LIMIT" assert rate_limit_var["description"] == "API rate limit" - assert rate_limit_var["required"] == False + assert not rate_limit_var["required"] assert rate_limit_var["default"] == "100" @@ -151,7 +150,7 @@ def test_extract_run_params_schema(mock_tool_extractor): filters_param = run_params_schema["properties"]["filters"] assert filters_param["description"] == "Optional filters to apply" - assert filters_param["default"] == None + assert filters_param["default"] is None assert filters_param["anyOf"] == [ {"items": {"type": "string"}, "type": "array"}, {"type": "null"}, diff --git a/lib/crewai-tools/src/crewai_tools/tools/arxiv_paper_tool/arxiv_paper_tool_test.py b/lib/crewai-tools/tests/tools/arxiv_paper_tool_test.py similarity index 100% rename from lib/crewai-tools/src/crewai_tools/tools/arxiv_paper_tool/arxiv_paper_tool_test.py rename to lib/crewai-tools/tests/tools/arxiv_paper_tool_test.py diff --git a/lib/crewai-tools/tests/tools/brave_search_tool_test.py b/lib/crewai-tools/tests/tools/brave_search_tool_test.py index c865b2bdb..c1c32d830 100644 --- a/lib/crewai-tools/tests/tools/brave_search_tool_test.py +++ b/lib/crewai-tools/tests/tools/brave_search_tool_test.py @@ -39,8 +39,7 @@ def test_brave_tool(): tool = BraveSearchTool( n_results=2, ) - x = tool.run(search_query="ChatGPT") - print(x) + tool.run(search_query="ChatGPT") if __name__ == "__main__": diff --git a/lib/crewai-tools/tests/tools/brightdata_webunlocker_tool_test.py b/lib/crewai-tools/tests/tools/brightdata_webunlocker_tool_test.py index 18b324b46..cba42904a 100644 --- a/lib/crewai-tools/tests/tools/brightdata_webunlocker_tool_test.py +++ b/lib/crewai-tools/tests/tools/brightdata_webunlocker_tool_test.py @@ -19,9 +19,7 @@ def test_run_success_html(mock_post): mock_post.return_value = mock_response tool = BrightDataWebUnlockerTool() - result = tool._run(url="https://example.com", format="html", save_file=False) - - print(result) + tool._run(url="https://example.com", format="html", save_file=False) @patch.dict( diff --git a/lib/crewai-tools/tests/tools/couchbase_tool_test.py b/lib/crewai-tools/tests/tools/couchbase_tool_test.py index 258a76568..851f17580 100644 --- a/lib/crewai-tools/tests/tools/couchbase_tool_test.py +++ b/lib/crewai-tools/tests/tools/couchbase_tool_test.py @@ -190,7 +190,7 @@ def test_initialization_success(couchbase_tool, tool_config): assert couchbase_tool.embedding_function is not None assert couchbase_tool.limit == 5 assert couchbase_tool.embedding_key == "test_embedding" - assert couchbase_tool.scoped_index == True + assert couchbase_tool.scoped_index # Check if helper methods were called during init (via mocks in fixture) couchbase_tool.cluster.buckets().get_bucket.assert_called_once_with("test_bucket") diff --git a/lib/crewai-tools/src/crewai_tools/tools/files_compressor_tool/files_compressor_tool_test2.py b/lib/crewai-tools/tests/tools/files_compressor_tool_test.py similarity index 100% rename from lib/crewai-tools/src/crewai_tools/tools/files_compressor_tool/files_compressor_tool_test2.py rename to lib/crewai-tools/tests/tools/files_compressor_tool_test.py diff --git a/lib/crewai-tools/tests/tools/singlestore_search_tool_test.py b/lib/crewai-tools/tests/tools/singlestore_search_tool_test.py index 28ef446e4..18b1584db 100644 --- a/lib/crewai-tools/tests/tools/singlestore_search_tool_test.py +++ b/lib/crewai-tools/tests/tools/singlestore_search_tool_test.py @@ -73,7 +73,7 @@ def sample_table_setup(clean_db_url): # Insert sample data curr.execute( """ - INSERT INTO employees VALUES + INSERT INTO employees VALUES (1, 'Alice Smith', 'Engineering', 75000.00), (2, 'Bob Johnson', 'Marketing', 65000.00), (3, 'Carol Davis', 'Engineering', 80000.00) @@ -82,7 +82,7 @@ def sample_table_setup(clean_db_url): curr.execute( """ - INSERT INTO departments VALUES + INSERT INTO departments VALUES (1, 'Engineering', 500000.00), (2, 'Marketing', 300000.00) """ diff --git a/lib/crewai-tools/tests/tools/snowflake_search_tool_test.py b/lib/crewai-tools/tests/tools/snowflake_search_tool_test.py index b15660223..fe827d5df 100644 --- a/lib/crewai-tools/tests/tools/snowflake_search_tool_test.py +++ b/lib/crewai-tools/tests/tools/snowflake_search_tool_test.py @@ -31,7 +31,7 @@ def mock_config(): @pytest.fixture def snowflake_tool(mock_config): - with patch("snowflake.connector.connect") as mock_connect: + with patch("snowflake.connector.connect"): tool = SnowflakeSearchTool(config=mock_config) yield tool diff --git a/lib/crewai-tools/src/crewai_tools/tools/file_writer_tool/tests/test_file_writer_tool.py b/lib/crewai-tools/tests/tools/test_file_writer_tool.py similarity index 100% rename from lib/crewai-tools/src/crewai_tools/tools/file_writer_tool/tests/test_file_writer_tool.py rename to lib/crewai-tools/tests/tools/test_file_writer_tool.py diff --git a/lib/crewai-tools/tests/tools/test_oxylabs_tools.py b/lib/crewai-tools/tests/tools/test_oxylabs_tools.py index d6c9a337f..2b0bef76f 100644 --- a/lib/crewai-tools/tests/tools/test_oxylabs_tools.py +++ b/lib/crewai-tools/tests/tools/test_oxylabs_tools.py @@ -1,6 +1,5 @@ import json import os -from typing import Type from unittest.mock import MagicMock from crewai.tools.base_tool import BaseTool @@ -79,7 +78,7 @@ def oxylabs_api() -> RealtimeClient: (OxylabsAmazonProductScraperTool,), ], ) -def test_tool_initialization(tool_class: Type[BaseTool]): +def test_tool_initialization(tool_class: type[BaseTool]): tool = tool_class(username="username", password="password") assert isinstance(tool, tool_class) @@ -93,7 +92,7 @@ def test_tool_initialization(tool_class: Type[BaseTool]): (OxylabsAmazonProductScraperTool,), ], ) -def test_tool_initialization_with_env_vars(tool_class: Type[BaseTool]): +def test_tool_initialization_with_env_vars(tool_class: type[BaseTool]): os.environ["OXYLABS_USERNAME"] = "username" os.environ["OXYLABS_PASSWORD"] = "password" @@ -113,7 +112,7 @@ def test_tool_initialization_with_env_vars(tool_class: Type[BaseTool]): (OxylabsAmazonProductScraperTool,), ], ) -def test_tool_initialization_failure(tool_class: Type[BaseTool]): +def test_tool_initialization_failure(tool_class: type[BaseTool]): # making sure env vars are not set for key in ["OXYLABS_USERNAME", "OXYLABS_PASSWORD"]: if key in os.environ: @@ -142,7 +141,7 @@ def test_tool_initialization_failure(tool_class: Type[BaseTool]): ], ) def test_tool_invocation( - tool_class: Type[BaseTool], + tool_class: type[BaseTool], tool_config: BaseModel, oxylabs_api: RealtimeClient, ): diff --git a/lib/crewai-tools/tool.specs.json b/lib/crewai-tools/tool.specs.json index f7b71384a..c16abee40 100644 --- a/lib/crewai-tools/tool.specs.json +++ b/lib/crewai-tools/tool.specs.json @@ -5439,105 +5439,6 @@ "type": "object" } }, - { - "description": "A tool that can be used to semantic search a query from a database table's content.", - "env_vars": [], - "humanized_name": "Search a database's table content", - "init_params_schema": { - "$defs": { - "Adapter": { - "properties": {}, - "title": "Adapter", - "type": "object" - }, - "EnvVar": { - "properties": { - "default": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "title": "Default" - }, - "description": { - "title": "Description", - "type": "string" - }, - "name": { - "title": "Name", - "type": "string" - }, - "required": { - "default": true, - "title": "Required", - "type": "boolean" - } - }, - "required": [ - "name", - "description" - ], - "title": "EnvVar", - "type": "object" - } - }, - "properties": { - "adapter": { - "$ref": "#/$defs/Adapter" - }, - "config": { - "anyOf": [ - { - "additionalProperties": true, - "type": "object" - }, - { - "type": "null" - } - ], - "default": null, - "title": "Config" - }, - "db_uri": { - "description": "Mandatory database URI", - "title": "Db Uri", - "type": "string" - }, - "summarize": { - "default": false, - "title": "Summarize", - "type": "boolean" - } - }, - "required": [ - "db_uri" - ], - "title": "PGSearchTool", - "type": "object" - }, - "name": "PGSearchTool", - "package_dependencies": [], - "run_params_schema": { - "description": "Input for PGSearchTool.", - "properties": { - "search_query": { - "description": "Mandatory semantic search query you want to use to search the database's content", - "title": "Search Query", - "type": "string" - } - }, - "required": [ - "search_query" - ], - "title": "PGSearchToolSchema", - "type": "object" - } - }, { "description": "Search the web using Parallel's Search API (v1beta). Returns ranked results with compressed excerpts optimized for LLMs.", "env_vars": [ diff --git a/pyproject.toml b/pyproject.toml index 4020d3b6f..e9afa3473 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -21,7 +21,7 @@ dev = [ "pytest-timeout>=2.4.0", "pytest-xdist>=3.8.0", "pytest-split>=0.10.0", -# "types-requests==2.32.*", + "types-requests~=2.31.0.6", "types-pyyaml==6.0.*", "types-regex==2024.11.6.*", "types-appdirs==1.4.*", @@ -33,6 +33,7 @@ exclude = [ "lib/crewai/src/crewai/cli/templates", ] fix = true +target-version = "py310" [tool.ruff.lint] select = [ @@ -44,6 +45,8 @@ select = [ "N", # pep8-naming (naming conventions) "W", # pycodestyle warnings "I", # isort (import formatting) + "T", # flake8-print (print statements) +# "D", # pydocstyle (docstring conventions) disabled until "PERF", # performance issues "PIE", # flake8-pie (unnecessary code) "ASYNC", # async/await best practices @@ -81,8 +84,8 @@ split-on-trailing-comma = true convention = "google" [tool.ruff.lint.per-file-ignores] -"lib/crewai/tests/**/*.py" = ["S101", "RET504"] # Allow assert statements and unnecessary assignments before return in tests -"lib/crewai-tools/tests/**/*.py" = ["S101", "RET504"] # Allow assert statements and unnecessary assignments before return in tests +"lib/crewai/tests/**/*.py" = ["S101", "RET504", "S105", "S106"] # Allow assert statements, unnecessary assignments, and hardcoded passwords in tests +"lib/crewai-tools/tests/**/*.py" = ["S101", "RET504", "S105", "S106", "RUF012", "N818", "E402", "RUF043", "S110", "B017"] # Allow various test-specific patterns [tool.mypy] diff --git a/uv.lock b/uv.lock index 199174256..699c1fb6c 100644 --- a/uv.lock +++ b/uv.lock @@ -2,30 +2,30 @@ version = 1 revision = 3 requires-python = ">=3.10, <3.14" resolution-markers = [ - "python_full_version >= '3.13' and platform_python_implementation == 'PyPy' and sys_platform == 'darwin'", - "python_full_version >= '3.13' and platform_machine == 'aarch64' and platform_python_implementation == 'PyPy' and sys_platform == 'linux'", - "(python_full_version >= '3.13' and platform_machine != 'aarch64' and platform_python_implementation == 'PyPy' and sys_platform == 'linux') or (python_full_version >= '3.13' and platform_python_implementation == 'PyPy' and sys_platform != 'darwin' and sys_platform != 'linux')", "python_full_version >= '3.13' and platform_python_implementation != 'PyPy' and sys_platform == 'darwin'", "python_full_version >= '3.13' and platform_machine == 'aarch64' and platform_python_implementation != 'PyPy' and sys_platform == 'linux'", "(python_full_version >= '3.13' and platform_machine != 'aarch64' and platform_python_implementation != 'PyPy' and sys_platform == 'linux') or (python_full_version >= '3.13' and platform_python_implementation != 'PyPy' and sys_platform != 'darwin' and sys_platform != 'linux')", - "python_full_version == '3.12.*' and platform_python_implementation == 'PyPy' and sys_platform == 'darwin'", "python_full_version == '3.12.*' and platform_python_implementation != 'PyPy' and sys_platform == 'darwin'", - "python_full_version == '3.12.*' and platform_machine == 'aarch64' and platform_python_implementation == 'PyPy' and sys_platform == 'linux'", "python_full_version == '3.12.*' and platform_machine == 'aarch64' and platform_python_implementation != 'PyPy' and sys_platform == 'linux'", - "(python_full_version == '3.12.*' and platform_machine != 'aarch64' and platform_python_implementation == 'PyPy' and sys_platform == 'linux') or (python_full_version == '3.12.*' and platform_python_implementation == 'PyPy' and sys_platform != 'darwin' and sys_platform != 'linux')", "(python_full_version == '3.12.*' and platform_machine != 'aarch64' and platform_python_implementation != 'PyPy' and sys_platform == 'linux') or (python_full_version == '3.12.*' and platform_python_implementation != 'PyPy' and sys_platform != 'darwin' and sys_platform != 'linux')", - "python_full_version == '3.11.*' and platform_python_implementation == 'PyPy' and sys_platform == 'darwin'", "python_full_version == '3.11.*' and platform_python_implementation != 'PyPy' and sys_platform == 'darwin'", - "python_full_version == '3.11.*' and platform_machine == 'aarch64' and platform_python_implementation == 'PyPy' and sys_platform == 'linux'", "python_full_version == '3.11.*' and platform_machine == 'aarch64' and platform_python_implementation != 'PyPy' and sys_platform == 'linux'", - "(python_full_version == '3.11.*' and platform_machine != 'aarch64' and platform_python_implementation == 'PyPy' and sys_platform == 'linux') or (python_full_version == '3.11.*' and platform_python_implementation == 'PyPy' and sys_platform != 'darwin' and sys_platform != 'linux')", "(python_full_version == '3.11.*' and platform_machine != 'aarch64' and platform_python_implementation != 'PyPy' and sys_platform == 'linux') or (python_full_version == '3.11.*' and platform_python_implementation != 'PyPy' and sys_platform != 'darwin' and sys_platform != 'linux')", - "python_full_version < '3.11' and platform_python_implementation == 'PyPy' and sys_platform == 'darwin'", "python_full_version < '3.11' and platform_python_implementation != 'PyPy' and sys_platform == 'darwin'", - "python_full_version < '3.11' and platform_machine == 'aarch64' and platform_python_implementation == 'PyPy' and sys_platform == 'linux'", "python_full_version < '3.11' and platform_machine == 'aarch64' and platform_python_implementation != 'PyPy' and sys_platform == 'linux'", - "(python_full_version < '3.11' and platform_machine != 'aarch64' and platform_python_implementation == 'PyPy' and sys_platform == 'linux') or (python_full_version < '3.11' and platform_python_implementation == 'PyPy' and sys_platform != 'darwin' and sys_platform != 'linux')", "(python_full_version < '3.11' and platform_machine != 'aarch64' and platform_python_implementation != 'PyPy' and sys_platform == 'linux') or (python_full_version < '3.11' and platform_python_implementation != 'PyPy' and sys_platform != 'darwin' and sys_platform != 'linux')", + "python_full_version >= '3.13' and platform_python_implementation == 'PyPy' and sys_platform == 'darwin'", + "python_full_version >= '3.13' and platform_machine == 'aarch64' and platform_python_implementation == 'PyPy' and sys_platform == 'linux'", + "(python_full_version >= '3.13' and platform_machine != 'aarch64' and platform_python_implementation == 'PyPy' and sys_platform == 'linux') or (python_full_version >= '3.13' and platform_python_implementation == 'PyPy' and sys_platform != 'darwin' and sys_platform != 'linux')", + "python_full_version == '3.12.*' and platform_python_implementation == 'PyPy' and sys_platform == 'darwin'", + "python_full_version == '3.12.*' and platform_machine == 'aarch64' and platform_python_implementation == 'PyPy' and sys_platform == 'linux'", + "(python_full_version == '3.12.*' and platform_machine != 'aarch64' and platform_python_implementation == 'PyPy' and sys_platform == 'linux') or (python_full_version == '3.12.*' and platform_python_implementation == 'PyPy' and sys_platform != 'darwin' and sys_platform != 'linux')", + "python_full_version == '3.11.*' and platform_python_implementation == 'PyPy' and sys_platform == 'darwin'", + "python_full_version == '3.11.*' and platform_machine == 'aarch64' and platform_python_implementation == 'PyPy' and sys_platform == 'linux'", + "(python_full_version == '3.11.*' and platform_machine != 'aarch64' and platform_python_implementation == 'PyPy' and sys_platform == 'linux') or (python_full_version == '3.11.*' and platform_python_implementation == 'PyPy' and sys_platform != 'darwin' and sys_platform != 'linux')", + "python_full_version < '3.11' and platform_python_implementation == 'PyPy' and sys_platform == 'darwin'", + "python_full_version < '3.11' and platform_machine == 'aarch64' and platform_python_implementation == 'PyPy' and sys_platform == 'linux'", + "(python_full_version < '3.11' and platform_machine != 'aarch64' and platform_python_implementation == 'PyPy' and sys_platform == 'linux') or (python_full_version < '3.11' and platform_python_implementation == 'PyPy' and sys_platform != 'darwin' and sys_platform != 'linux')", ] [manifest] @@ -51,6 +51,7 @@ dev = [ { name = "types-appdirs", specifier = "==1.4.*" }, { name = "types-pyyaml", specifier = "==6.0.*" }, { name = "types-regex", specifier = "==2024.11.6.*" }, + { name = "types-requests", specifier = "~=2.31.0.6" }, { name = "vcrpy", specifier = "==7.0.0" }, ] @@ -222,7 +223,7 @@ wheels = [ [[package]] name = "anthropic" -version = "0.68.1" +version = "0.69.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "anyio" }, @@ -234,9 +235,9 @@ dependencies = [ { name = "sniffio" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/43/b9/5e736a924dabe0473b212597ae83a124e09818fac672998bb5960a64e9b1/anthropic-0.68.1.tar.gz", hash = "sha256:5fc01019dfffbc39e87a24f4d7cfe34e83dda4fff7b5371f33639f982f0c8dba", size = 471965, upload-time = "2025-09-26T16:27:30.547Z" } +sdist = { url = "https://files.pythonhosted.org/packages/c8/9d/9ad1778b95f15c5b04e7d328c1b5f558f1e893857b7c33cd288c19c0057a/anthropic-0.69.0.tar.gz", hash = "sha256:c604d287f4d73640f40bd2c0f3265a2eb6ce034217ead0608f6b07a8bc5ae5f2", size = 480622, upload-time = "2025-09-29T16:53:45.282Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/c9/5c/e871e40ba11338502569a3f5cb176650f99f7b4ecf915f4d38fe2b8cff37/anthropic-0.68.1-py3-none-any.whl", hash = "sha256:40fc545c4781ebc45d8e7849240c4001f40d61d18a17e5363c0acb10afefc33b", size = 325214, upload-time = "2025-09-26T16:27:29.049Z" }, + { url = "https://files.pythonhosted.org/packages/9b/38/75129688de5637eb5b383e5f2b1570a5cc3aecafa4de422da8eea4b90a6c/anthropic-0.69.0-py3-none-any.whl", hash = "sha256:1f73193040f33f11e27c2cd6ec25f24fe7c3f193dc1c5cde6b7a08b18a16bcc5", size = 337265, upload-time = "2025-09-29T16:53:43.686Z" }, ] [[package]] @@ -433,20 +434,20 @@ wheels = [ [[package]] name = "beautifulsoup4" -version = "4.14.0" +version = "4.14.2" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "soupsieve" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/8a/bb/3387a5bf72121e1e2cd9223d20598c2fb599ef63517ff3e6ec526d8c4928/beautifulsoup4-4.14.0.tar.gz", hash = "sha256:e6150e53c8a52fd4f3b9b28839f8f0fb7c7f029d3c953a50b1762b0947c3cf85", size = 625697, upload-time = "2025-09-27T17:22:17.532Z" } +sdist = { url = "https://files.pythonhosted.org/packages/77/e9/df2358efd7659577435e2177bfa69cba6c33216681af51a707193dec162a/beautifulsoup4-4.14.2.tar.gz", hash = "sha256:2a98ab9f944a11acee9cc848508ec28d9228abfd522ef0fad6a02a72e0ded69e", size = 625822, upload-time = "2025-09-29T10:05:42.613Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/28/4f/3e23dfc8b4951103028d30f29e17aa703a87564abd71bc405964c36326dc/beautifulsoup4-4.14.0-py3-none-any.whl", hash = "sha256:aee96fbccdf2d2a8d1288b2afa51fc76bb60823b7881a50fb1ed5f711d1a7d73", size = 106466, upload-time = "2025-09-27T17:22:16.13Z" }, + { url = "https://files.pythonhosted.org/packages/94/fe/3aed5d0be4d404d12d36ab97e2f1791424d9ca39c2f754a6285d59a3b01d/beautifulsoup4-4.14.2-py3-none-any.whl", hash = "sha256:5ef6fa3a8cbece8488d66985560f97ed091e22bbc4e9c2338508a9d5de6d4515", size = 106392, upload-time = "2025-09-29T10:05:43.771Z" }, ] [[package]] name = "bedrock-agentcore" -version = "0.1.5" +version = "0.1.7" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "boto3" }, @@ -458,9 +459,9 @@ dependencies = [ { name = "urllib3", version = "2.5.0", source = { registry = "https://pypi.org/simple" }, marker = "platform_python_implementation != 'PyPy'" }, { name = "uvicorn" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/91/f3/dbfe86741693305cecd9de6c31b6c6a7773cd834e70d0938994fc3b26d28/bedrock_agentcore-0.1.5.tar.gz", hash = "sha256:287d70291e372d88b38018d88362d4847a170cb81af0d539851358124a53bc54", size = 232680, upload-time = "2025-09-24T06:40:16.052Z" } +sdist = { url = "https://files.pythonhosted.org/packages/b0/87/4c0bacf09430e559657fc986cbb1003f76d597ab7e7365ab247dbef73940/bedrock_agentcore-0.1.7.tar.gz", hash = "sha256:e518e8f5e6fb5a5a80182db95757a20e32b0ac2b33d0a1909dfafcba950c6356", size = 263080, upload-time = "2025-10-01T16:18:39.255Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/4a/c1/7e9d04cadaafb509356882c7503764b317e35374228b6b62660c526233ee/bedrock_agentcore-0.1.5-py3-none-any.whl", hash = "sha256:2d8edefc22db915c2289effdfd11cd8e33685f28d98e60466987bd8dc533b433", size = 62754, upload-time = "2025-09-24T06:40:14.267Z" }, + { url = "https://files.pythonhosted.org/packages/01/f3/a9d961cfba236dc85f27f2f2c6eab88e12698754aaa02459ba7dfafc5062/bedrock_agentcore-0.1.7-py3-none-any.whl", hash = "sha256:441dde64fea596e9571e47ae37ee3b033e58d8d255018f13bdcde8ae8bef2075", size = 77216, upload-time = "2025-10-01T16:18:38.153Z" }, ] [[package]] @@ -474,21 +475,21 @@ wheels = [ [[package]] name = "boto3" -version = "1.40.40" +version = "1.40.42" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "botocore" }, { name = "jmespath" }, { name = "s3transfer" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/3c/12/1a31b36802d0f33bc6982ab8b7e6437d75ef3c179abe6c53d4d8f7b4248f/boto3-1.40.40.tar.gz", hash = "sha256:f384d3a0410d0f1a4d4ae7aa69c41d0549c6ca5a76667dc25fc97d50ad6db740", size = 111606, upload-time = "2025-09-26T19:23:46.923Z" } +sdist = { url = "https://files.pythonhosted.org/packages/97/41/291ea7af352ca7a89619e09e6927d9b7eac415857abd838be88d7f82cd8f/boto3-1.40.42.tar.gz", hash = "sha256:dbd8afc41f0cc759d0115c673e50bd1395b992a5c14627b56163cf35b86673c6", size = 111601, upload-time = "2025-09-30T19:28:15.254Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/90/69/c65566dbdaaea3af0c23f7731ab0f185a38b593fd449d2423374150dbfe0/boto3-1.40.40-py3-none-any.whl", hash = "sha256:385904de68623e1c341bdc095d94a30006843032c912adeb1e0752a343632ec6", size = 139340, upload-time = "2025-09-26T19:23:45.557Z" }, + { url = "https://files.pythonhosted.org/packages/58/b6/c873130aa586ed2df48d0d4a44e897a24c5f2ff800f108e8d973d7a9f19c/boto3-1.40.42-py3-none-any.whl", hash = "sha256:71ea8ca488e8b0d0a16b1b32816f8bab9aa66757c4122caf137ae2dbc95d7001", size = 139344, upload-time = "2025-09-30T19:28:13.376Z" }, ] [[package]] name = "botocore" -version = "1.40.40" +version = "1.40.42" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "jmespath" }, @@ -496,9 +497,9 @@ dependencies = [ { name = "urllib3", version = "1.26.20", source = { registry = "https://pypi.org/simple" }, marker = "platform_python_implementation == 'PyPy'" }, { name = "urllib3", version = "2.5.0", source = { registry = "https://pypi.org/simple" }, marker = "platform_python_implementation != 'PyPy'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/83/5a/43a7fea503ad14fa79819f2b3103a38977fb587a3663d1ac6e958fccf592/botocore-1.40.40.tar.gz", hash = "sha256:78eb121a16a6481ed0f6e1aebe53a4f23aa121f34466846c13a5ca48fa980e31", size = 14363370, upload-time = "2025-09-26T19:23:37.853Z" } +sdist = { url = "https://files.pythonhosted.org/packages/d0/64/746b90bebf904e8d94fc740d8e0dabad1bf644c675fdb2e85ffd852665de/botocore-1.40.42.tar.gz", hash = "sha256:41bea751685fb2a51b4fc6be329a0cd0a285dbeb0686a21099e87ef146664bc0", size = 14384122, upload-time = "2025-09-30T19:28:05.458Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/ed/5e/3bbf6d34cbf307c1b9e58e0204ceba2d35bbc0c93b4e3b3cc895aae0a5fd/botocore-1.40.40-py3-none-any.whl", hash = "sha256:68506142b3cde93145ef3ee0268f2444f2b68ada225a151f714092bbd3d6516a", size = 14031738, upload-time = "2025-09-26T19:23:35.475Z" }, + { url = "https://files.pythonhosted.org/packages/8a/74/c0b454c9ab1b75c70d78068cdb220cb835b6b7eda51243541e125f816c59/botocore-1.40.42-py3-none-any.whl", hash = "sha256:2682a4120be21234036003a806206b6b3963ba53a495d0a57d40d67fce4497a9", size = 14054256, upload-time = "2025-09-30T19:28:02.361Z" }, ] [[package]] @@ -536,11 +537,11 @@ wheels = [ [[package]] name = "cachetools" -version = "5.5.2" +version = "6.2.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/6c/81/3747dad6b14fa2cf53fcf10548cf5aea6913e96fab41a3c198676f8948a5/cachetools-5.5.2.tar.gz", hash = "sha256:1a661caa9175d26759571b2e19580f9d6393969e5dfca11fdb1f947a23e640d4", size = 28380, upload-time = "2025-02-20T21:01:19.524Z" } +sdist = { url = "https://files.pythonhosted.org/packages/9d/61/e4fad8155db4a04bfb4734c7c8ff0882f078f24294d42798b3568eb63bff/cachetools-6.2.0.tar.gz", hash = "sha256:38b328c0889450f05f5e120f56ab68c8abaf424e1275522b138ffc93253f7e32", size = 30988, upload-time = "2025-08-25T18:57:30.924Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/72/76/20fa66124dbe6be5cafeb312ece67de6b61dd91a0247d1ea13db4ebb33c2/cachetools-5.5.2-py3-none-any.whl", hash = "sha256:d26a22bcc62eb95c3beabd9f1ee5e820d3d2704fe2967cbe350e20c8ffcd3f0a", size = 10080, upload-time = "2025-02-20T21:01:16.647Z" }, + { url = "https://files.pythonhosted.org/packages/6c/56/3124f61d37a7a4e7cc96afc5492c78ba0cb551151e530b54669ddd1436ef/cachetools-6.2.0-py3-none-any.whl", hash = "sha256:1c76a8960c0041fcc21097e357f882197c79da0dbff766e7317890a65d7d8ba6", size = 11276, upload-time = "2025-08-25T18:57:29.684Z" }, ] [[package]] @@ -798,12 +799,12 @@ name = "contourpy" version = "1.3.2" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version < '3.11' and platform_python_implementation == 'PyPy' and sys_platform == 'darwin'", "python_full_version < '3.11' and platform_python_implementation != 'PyPy' and sys_platform == 'darwin'", - "python_full_version < '3.11' and platform_machine == 'aarch64' and platform_python_implementation == 'PyPy' and sys_platform == 'linux'", "python_full_version < '3.11' and platform_machine == 'aarch64' and platform_python_implementation != 'PyPy' and sys_platform == 'linux'", - "(python_full_version < '3.11' and platform_machine != 'aarch64' and platform_python_implementation == 'PyPy' and sys_platform == 'linux') or (python_full_version < '3.11' and platform_python_implementation == 'PyPy' and sys_platform != 'darwin' and sys_platform != 'linux')", "(python_full_version < '3.11' and platform_machine != 'aarch64' and platform_python_implementation != 'PyPy' and sys_platform == 'linux') or (python_full_version < '3.11' and platform_python_implementation != 'PyPy' and sys_platform != 'darwin' and sys_platform != 'linux')", + "python_full_version < '3.11' and platform_python_implementation == 'PyPy' and sys_platform == 'darwin'", + "python_full_version < '3.11' and platform_machine == 'aarch64' and platform_python_implementation == 'PyPy' and sys_platform == 'linux'", + "(python_full_version < '3.11' and platform_machine != 'aarch64' and platform_python_implementation == 'PyPy' and sys_platform == 'linux') or (python_full_version < '3.11' and platform_python_implementation == 'PyPy' and sys_platform != 'darwin' and sys_platform != 'linux')", ] dependencies = [ { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, @@ -873,24 +874,24 @@ name = "contourpy" version = "1.3.3" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version >= '3.13' and platform_python_implementation == 'PyPy' and sys_platform == 'darwin'", - "python_full_version >= '3.13' and platform_machine == 'aarch64' and platform_python_implementation == 'PyPy' and sys_platform == 'linux'", - "(python_full_version >= '3.13' and platform_machine != 'aarch64' and platform_python_implementation == 'PyPy' and sys_platform == 'linux') or (python_full_version >= '3.13' and platform_python_implementation == 'PyPy' and sys_platform != 'darwin' and sys_platform != 'linux')", "python_full_version >= '3.13' and platform_python_implementation != 'PyPy' and sys_platform == 'darwin'", "python_full_version >= '3.13' and platform_machine == 'aarch64' and platform_python_implementation != 'PyPy' and sys_platform == 'linux'", "(python_full_version >= '3.13' and platform_machine != 'aarch64' and platform_python_implementation != 'PyPy' and sys_platform == 'linux') or (python_full_version >= '3.13' and platform_python_implementation != 'PyPy' and sys_platform != 'darwin' and sys_platform != 'linux')", - "python_full_version == '3.12.*' and platform_python_implementation == 'PyPy' and sys_platform == 'darwin'", "python_full_version == '3.12.*' and platform_python_implementation != 'PyPy' and sys_platform == 'darwin'", - "python_full_version == '3.12.*' and platform_machine == 'aarch64' and platform_python_implementation == 'PyPy' and sys_platform == 'linux'", "python_full_version == '3.12.*' and platform_machine == 'aarch64' and platform_python_implementation != 'PyPy' and sys_platform == 'linux'", - "(python_full_version == '3.12.*' and platform_machine != 'aarch64' and platform_python_implementation == 'PyPy' and sys_platform == 'linux') or (python_full_version == '3.12.*' and platform_python_implementation == 'PyPy' and sys_platform != 'darwin' and sys_platform != 'linux')", "(python_full_version == '3.12.*' and platform_machine != 'aarch64' and platform_python_implementation != 'PyPy' and sys_platform == 'linux') or (python_full_version == '3.12.*' and platform_python_implementation != 'PyPy' and sys_platform != 'darwin' and sys_platform != 'linux')", - "python_full_version == '3.11.*' and platform_python_implementation == 'PyPy' and sys_platform == 'darwin'", "python_full_version == '3.11.*' and platform_python_implementation != 'PyPy' and sys_platform == 'darwin'", - "python_full_version == '3.11.*' and platform_machine == 'aarch64' and platform_python_implementation == 'PyPy' and sys_platform == 'linux'", "python_full_version == '3.11.*' and platform_machine == 'aarch64' and platform_python_implementation != 'PyPy' and sys_platform == 'linux'", - "(python_full_version == '3.11.*' and platform_machine != 'aarch64' and platform_python_implementation == 'PyPy' and sys_platform == 'linux') or (python_full_version == '3.11.*' and platform_python_implementation == 'PyPy' and sys_platform != 'darwin' and sys_platform != 'linux')", "(python_full_version == '3.11.*' and platform_machine != 'aarch64' and platform_python_implementation != 'PyPy' and sys_platform == 'linux') or (python_full_version == '3.11.*' and platform_python_implementation != 'PyPy' and sys_platform != 'darwin' and sys_platform != 'linux')", + "python_full_version >= '3.13' and platform_python_implementation == 'PyPy' and sys_platform == 'darwin'", + "python_full_version >= '3.13' and platform_machine == 'aarch64' and platform_python_implementation == 'PyPy' and sys_platform == 'linux'", + "(python_full_version >= '3.13' and platform_machine != 'aarch64' and platform_python_implementation == 'PyPy' and sys_platform == 'linux') or (python_full_version >= '3.13' and platform_python_implementation == 'PyPy' and sys_platform != 'darwin' and sys_platform != 'linux')", + "python_full_version == '3.12.*' and platform_python_implementation == 'PyPy' and sys_platform == 'darwin'", + "python_full_version == '3.12.*' and platform_machine == 'aarch64' and platform_python_implementation == 'PyPy' and sys_platform == 'linux'", + "(python_full_version == '3.12.*' and platform_machine != 'aarch64' and platform_python_implementation == 'PyPy' and sys_platform == 'linux') or (python_full_version == '3.12.*' and platform_python_implementation == 'PyPy' and sys_platform != 'darwin' and sys_platform != 'linux')", + "python_full_version == '3.11.*' and platform_python_implementation == 'PyPy' and sys_platform == 'darwin'", + "python_full_version == '3.11.*' and platform_machine == 'aarch64' and platform_python_implementation == 'PyPy' and sys_platform == 'linux'", + "(python_full_version == '3.11.*' and platform_machine != 'aarch64' and platform_python_implementation == 'PyPy' and sys_platform == 'linux') or (python_full_version == '3.11.*' and platform_python_implementation == 'PyPy' and sys_platform != 'darwin' and sys_platform != 'linux')", ] dependencies = [ { name = "numpy", version = "2.3.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, @@ -950,34 +951,34 @@ wheels = [ [[package]] name = "couchbase" -version = "4.4.0" +version = "4.5.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/a9/fb/41552fceef4ee5e4f06bd05fe571560d150c78923083722988e441b8bfa3/couchbase-4.4.0.tar.gz", hash = "sha256:5234dfa0a500ec1dd9b89318b8ca6303f587cc2d2b4772341f937f1473bbaa96", size = 6557625, upload-time = "2025-06-02T22:09:46.182Z" } +sdist = { url = "https://files.pythonhosted.org/packages/73/2f/8f92e743a91c2f4e2ebad0bcfc31ef386c817c64415d89bf44e64dde227a/couchbase-4.5.0.tar.gz", hash = "sha256:fb74386ea5e807ae12cfa294fa6740fe6be3ecaf3bb9ce4fb9ea73706ed05982", size = 6562752, upload-time = "2025-09-30T01:27:37.423Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/37/77/2569fc3f189ebee3c6b969f80031449975e424d4e826f9e046c1cfae3af0/couchbase-4.4.0-cp310-cp310-macosx_10_15_x86_64.whl", hash = "sha256:b287bf9a6780545d0c0f68b27f2957d17d7672a2f11b8c27a210fb70538e061a", size = 5031554, upload-time = "2025-06-02T22:06:56.712Z" }, - { url = "https://files.pythonhosted.org/packages/46/4f/91698faa4fde2d404e4c873a01af99562c7f100e418b41e66d80a71db4e9/couchbase-4.4.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a16813b6329ca0c8e4aad68e801bf8c8ef3c60383dfb7db88a8d9e193a8d0924", size = 4238842, upload-time = "2025-06-02T22:07:01.92Z" }, - { url = "https://files.pythonhosted.org/packages/41/97/f58b5d7458932b3709fab532558d80129b5fc5754cc40377655398a32195/couchbase-4.4.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:3c4327e9c2ac4f968aef0d63ebfdf4fec667163b0560d340b3b50b27a44186cf", size = 5045392, upload-time = "2025-06-02T22:07:08.955Z" }, - { url = "https://files.pythonhosted.org/packages/4c/d5/64e2252cedb5ca9697ba785390fde3454bda62f4bff67fc0e684ef02af18/couchbase-4.4.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:82cde7cca3039d84c30242ce739042afcc6e713e9dbe6e29f2cedb8fd09ff29b", size = 5285374, upload-time = "2025-06-02T22:07:16.11Z" }, - { url = "https://files.pythonhosted.org/packages/60/07/f6422c563f1540d17949253dfbaaf4815dc99c0f5911b73c915186233c51/couchbase-4.4.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:d4314fe9bfad09002c8359fcb11811b152760ec812db689104154e329ed0f19d", size = 5962498, upload-time = "2025-06-02T22:07:23.845Z" }, - { url = "https://files.pythonhosted.org/packages/55/e7/a4a8ab32d3eb2422b546c9fe1fd66757ace4652e7b27d0dd77ba071fc83b/couchbase-4.4.0-cp310-cp310-win_amd64.whl", hash = "sha256:5a099e46584240b9c73c47e33928333a7ec2d60ad5286cffb211290ac74407c1", size = 4210628, upload-time = "2025-06-02T22:07:30.69Z" }, - { url = "https://files.pythonhosted.org/packages/05/60/05875d771c19abde06cac8158c9db30d164fab2a0f1488c6a5d7b12daee8/couchbase-4.4.0-cp311-cp311-macosx_10_15_x86_64.whl", hash = "sha256:8b068c5e0fe25f51fb5e4d7411a8d0df5d571f858e5a1df25f8ef6dda52acf78", size = 5031545, upload-time = "2025-06-02T22:07:36.659Z" }, - { url = "https://files.pythonhosted.org/packages/bf/9d/1dd1ae6278c07ade8b89d598d25b63f4131261744c571111b237ec2b6b01/couchbase-4.4.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ad5d45d74473951b1c7c7a580279dec390750d760dfd9f2b709fc51a88fc7644", size = 4238839, upload-time = "2025-06-02T22:07:41.997Z" }, - { url = "https://files.pythonhosted.org/packages/d8/0e/09269d1af3d8d6c0694c03fac05ec60997a52ab2169ffc6f14d1fbbea3d4/couchbase-4.4.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:5782f50d8612b04a5f03875003a50344b47df5357a046db044ee04d0d8bdf66f", size = 5045527, upload-time = "2025-06-02T22:07:47.952Z" }, - { url = "https://files.pythonhosted.org/packages/54/19/ed6a88e66bf63bd97a9c7507bccd14df8260cf93327153b6885d7649ef67/couchbase-4.4.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:95906185b789d98d345210a318eccdb8a1f8f810f90a2d61be0ca210708cfe19", size = 5285528, upload-time = "2025-06-02T22:07:54.195Z" }, - { url = "https://files.pythonhosted.org/packages/a8/29/5bc1f0a8fac6e8177ab5201d8783e97f65ad5f286a4ddf11396dc728e7b2/couchbase-4.4.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5bd9d5130f27621557df7e80c54d3ef98b86d86a58f4daa61939c0b5e584e726", size = 5962533, upload-time = "2025-06-02T22:08:02.127Z" }, - { url = "https://files.pythonhosted.org/packages/f0/d2/b7048fc510aff91b53a1084bb41a662b4db6d3f84c73eab5a1dc8023f4b6/couchbase-4.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:b867e4071c94193af0e19fe08c23d06d894e2fb7920c1d732681ac63ca15c46a", size = 4210697, upload-time = "2025-06-02T22:08:06.295Z" }, - { url = "https://files.pythonhosted.org/packages/3d/02/a70d69efb904186b788149986873848eedb902417804e7258291b77c9a69/couchbase-4.4.0-cp312-cp312-macosx_10_15_x86_64.whl", hash = "sha256:f30555553ef45ac86dbf26e4d52eaf23545e9e0ea88420a6fccfc5a1f05fd035", size = 4939697, upload-time = "2025-06-02T22:08:11.922Z" }, - { url = "https://files.pythonhosted.org/packages/3b/e0/83736b992a0756ab4345b10b82108137c1769a188333d0a51816679ab182/couchbase-4.4.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ff4d1a963440e8a3095368b8c9a6a06a6c009ae9bcbea25b4f43b9c0cbecf867", size = 4240692, upload-time = "2025-06-02T22:08:18.458Z" }, - { url = "https://files.pythonhosted.org/packages/09/41/41f5d2c3dd9f92307d6442898ae87d84c4b8a4b78e5428ead3edd15536ce/couchbase-4.4.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:f5fba44d95092018dc9e716cc2c38591931d4329136729a0d8dd59a709335305", size = 5049397, upload-time = "2025-06-02T22:08:26.248Z" }, - { url = "https://files.pythonhosted.org/packages/26/36/32a16b5b9f95b4501a957a0463ec0907eebdc2191c1315fb78ce0ed04ecf/couchbase-4.4.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:40b6896dac903185668953597cebc4c4cf825393da76611d67e1b7173433406b", size = 5290540, upload-time = "2025-06-02T22:08:31.104Z" }, - { url = "https://files.pythonhosted.org/packages/f6/b3/1a8993bd822e7635d972dabc44825e62029e5772db1f384f3afe1a37a6ad/couchbase-4.4.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:2b178cce7e3ea0f97596c4368bdc7a5ed2a491d5cea2dc12be788535a30ddc5a", size = 5959844, upload-time = "2025-06-02T22:08:36.274Z" }, - { url = "https://files.pythonhosted.org/packages/ec/ab/be7725830331e930267c27c82f478890c85421d90832cb76d0692cfb4926/couchbase-4.4.0-cp312-cp312-win_amd64.whl", hash = "sha256:54d949da4dd8afe30458dc30b2a85a12e6a1bdc5c4d1c97d04907e37db642b67", size = 4213200, upload-time = "2025-06-02T22:08:40.257Z" }, - { url = "https://files.pythonhosted.org/packages/50/2c/af3a653f4bd8b28e5a641ab5943eb64ed36afa961f10ebc5e03ad522f07f/couchbase-4.4.0-cp313-cp313-macosx_10_15_x86_64.whl", hash = "sha256:40d38e482b8250614e5ae3631d5e7c7738597053598f73ccb2426da1d4cdb196", size = 4939668, upload-time = "2025-06-02T22:08:44.141Z" }, - { url = "https://files.pythonhosted.org/packages/d3/66/9748ee7c46032e3d09c8db8193d24f338f61a3728087f641913db9003156/couchbase-4.4.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:9e1ae9df770f9248a85148683306fad80126ad5c34cc591b346577a08517ed78", size = 4240619, upload-time = "2025-06-02T22:08:48.877Z" }, - { url = "https://files.pythonhosted.org/packages/32/f4/3233ca701277862175742e5eb74cc6890caaa658ce5f6a43f49e3efeee28/couchbase-4.4.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:5c0661cd5e95b03525077ce97b40ee9aa0bfc6cf3d1a71ea29fc39636030dbd0", size = 5049336, upload-time = "2025-06-02T22:08:53.143Z" }, - { url = "https://files.pythonhosted.org/packages/f1/da/3e2366fb6cd1d3a605355c98e7fe39b28db00b59f50634ea0f25ccbe5f2d/couchbase-4.4.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:aadfdd7c920ddcfb0b6491eeadc63dceeda2f74360fea4971c011b2c7b4d18f2", size = 5290569, upload-time = "2025-06-02T22:08:57.577Z" }, - { url = "https://files.pythonhosted.org/packages/76/79/5f0b13aea1a0513d7f226469a3643a183c28ff6c2849effd42e2e14e2391/couchbase-4.4.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:43884a5cb0ccaadb6d484e0a0d8adc11bdd6b617ca0cd66854d63eaebda3bf73", size = 5959836, upload-time = "2025-06-02T22:09:02.672Z" }, - { url = "https://files.pythonhosted.org/packages/7d/0e/fdf57ab5cf40edf1bb0dd70d23b8937581610073e90b8176b6bcab8462d5/couchbase-4.4.0-cp313-cp313-win_amd64.whl", hash = "sha256:671bdfc74383f76890744bef12b06721faccc3206c689058a2c5c72eaccfb0bc", size = 4213137, upload-time = "2025-06-02T22:09:07.203Z" }, + { url = "https://files.pythonhosted.org/packages/f4/75/7263ff900aa800c3c287423353b27de21ef047cf3d528186a002522b201d/couchbase-4.5.0-cp310-cp310-macosx_10_15_x86_64.whl", hash = "sha256:22bf113377c62c5a1b194e5fea3f27bf9df657cfe8fa0c2c2158ad5ce4c6b4cf", size = 5126777, upload-time = "2025-09-30T01:24:34.56Z" }, + { url = "https://files.pythonhosted.org/packages/e5/83/3e26209b7e1647fadf3925cfc96137d0ccddb5ea46b2fe87bfec601528d6/couchbase-4.5.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:5ce8a55c61d8995d44a638a23bfb78db74afc0af844884d25a6738ba71a85886", size = 4323516, upload-time = "2025-09-30T01:24:42.566Z" }, + { url = "https://files.pythonhosted.org/packages/05/0c/3f7408f2bb97ae0ab125c7d3a857240bef8ff0ba69db04545a7f6a8faff9/couchbase-4.5.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:3a0e07ce01ad398bee19acf761f09ac5547fce8080bd92d38c6fa5318fa5a76c", size = 5181071, upload-time = "2025-09-30T01:24:51.2Z" }, + { url = "https://files.pythonhosted.org/packages/82/07/66160fd17c05a4df02094988660f918329209dad4c1fb5f5c5a840f7a9f9/couchbase-4.5.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:76faaa7e4bd2ba20cf7e3982a600ba0bbfae680de16459021bc7086c05ae4624", size = 5442990, upload-time = "2025-09-30T01:24:56.424Z" }, + { url = "https://files.pythonhosted.org/packages/c0/d6/2eacbb8e14401ee403159dd21829e221ce8094b1c0c59d221554ef9a9569/couchbase-4.5.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:d5268c985b1cf66a10ffd25d3e0e691e1b407e6831f43c42d438f1431f3332a2", size = 6108767, upload-time = "2025-09-30T01:25:02.975Z" }, + { url = "https://files.pythonhosted.org/packages/46/2f/dd06826480efa9b0af7f16122a85b4a9ceb425e32415abbc22eab3654667/couchbase-4.5.0-cp310-cp310-win_amd64.whl", hash = "sha256:64ad98058a1264fa2243e2fc63a86ff338b5dd9bd7f45e74cb6f32d2624bc542", size = 4269260, upload-time = "2025-09-30T01:25:09.16Z" }, + { url = "https://files.pythonhosted.org/packages/ca/a7/ba28fcab4f211e570582990d9592d8a57566158a0712fbc9d0d9ac486c2a/couchbase-4.5.0-cp311-cp311-macosx_10_15_x86_64.whl", hash = "sha256:3d3258802baa87d9ffeccbb2b31dcabe2a4ef27c9be81e0d3d710fd7436da24a", size = 5037084, upload-time = "2025-09-30T01:25:16.748Z" }, + { url = "https://files.pythonhosted.org/packages/85/38/f26912b56a41f22ab9606304014ef1435fc4bef76144382f91c1a4ce1d4c/couchbase-4.5.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:18b47f1f3a2007f88203f611570d96e62bb1fb9568dec0483a292a5e87f6d1df", size = 4323514, upload-time = "2025-09-30T01:25:22.628Z" }, + { url = "https://files.pythonhosted.org/packages/35/a6/5ef140f8681a2488ed6eb2a2bc9fc918b6f11e9f71bbad75e4de73b8dbf3/couchbase-4.5.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:9c2a16830db9437aae92e31f9ceda6c7b70707e316152fc99552b866b09a1967", size = 5181111, upload-time = "2025-09-30T01:25:30.538Z" }, + { url = "https://files.pythonhosted.org/packages/7b/2e/1f0f06e920dbae07c3d8af6b2af3d5213e43d3825e0931c19564fe4d5c1b/couchbase-4.5.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:4a86774680e46488a7955c6eae8fba5200a1fd5f9de9ac0a34acb6c87dc2b513", size = 5442969, upload-time = "2025-09-30T01:25:37.976Z" }, + { url = "https://files.pythonhosted.org/packages/9a/2e/6ece47df4d987dbeaae3fdcf7aa4d6a8154c949c28e925f01074dfd0b8b8/couchbase-4.5.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:b68dae005ab4c157930c76a3116e478df25aa1af00fa10cc1cc755df1831ad59", size = 6108562, upload-time = "2025-09-30T01:25:45.674Z" }, + { url = "https://files.pythonhosted.org/packages/be/a7/2f84a1d117cf70ad30e8b08ae9b1c4a03c65146bab030ed6eb84f454045b/couchbase-4.5.0-cp311-cp311-win_amd64.whl", hash = "sha256:cbc50956fb68d42929d21d969f4512b38798259ae48c47cbf6d676cc3a01b058", size = 4269303, upload-time = "2025-09-30T01:25:49.341Z" }, + { url = "https://files.pythonhosted.org/packages/2f/bc/3b00403edd8b188a93f48b8231dbf7faf7b40d318d3e73bb0e68c4965bbd/couchbase-4.5.0-cp312-cp312-macosx_10_15_x86_64.whl", hash = "sha256:be1ac2bf7cbccf28eebd7fa8b1d7199fbe84c96b0f7f2c0d69963b1d6ce53985", size = 5128307, upload-time = "2025-09-30T01:25:53.615Z" }, + { url = "https://files.pythonhosted.org/packages/7f/52/2ccfa8c8650cc341813713a47eeeb8ad13a25e25b0f4747d224106602a24/couchbase-4.5.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:035c394d38297c484bd57fc92b27f6a571a36ab5675b4ec873fd15bf65e8f28e", size = 4326149, upload-time = "2025-09-30T01:25:57.524Z" }, + { url = "https://files.pythonhosted.org/packages/32/80/fe3f074f321474c824ec67b97c5c4aa99047d45c777bb29353f9397c6604/couchbase-4.5.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:117685f6827abbc332e151625b0a9890c2fafe0d3c3d9e564b903d5c411abe5d", size = 5184623, upload-time = "2025-09-30T01:26:02.166Z" }, + { url = "https://files.pythonhosted.org/packages/f3/e5/86381f49e4cf1c6db23c397b6a32b532cd4df7b9975b0cd2da3db2ffe269/couchbase-4.5.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:632a918f81a7373832991b79b6ab429e56ef4ff68dfb3517af03f0e2be7e3e4f", size = 5446579, upload-time = "2025-09-30T01:26:09.39Z" }, + { url = "https://files.pythonhosted.org/packages/c8/85/a68d04233a279e419062ceb1c6866b61852c016d1854cd09cde7f00bc53c/couchbase-4.5.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:67fc0fd1a4535b5be093f834116a70fb6609085399e6b63539241b919da737b7", size = 6104619, upload-time = "2025-09-30T01:26:15.525Z" }, + { url = "https://files.pythonhosted.org/packages/56/8c/0511bac5dd2d998aeabcfba6a2804ecd9eb3d83f9d21cc3293a56fbc70a8/couchbase-4.5.0-cp312-cp312-win_amd64.whl", hash = "sha256:02199b4528f3106c231c00aaf85b7cc6723accbc654b903bb2027f78a04d12f4", size = 4274424, upload-time = "2025-09-30T01:26:21.484Z" }, + { url = "https://files.pythonhosted.org/packages/70/6d/6f6c4ed72f7def240168e48da7c95a81dd45cfe5599bfaaab040ea55c481/couchbase-4.5.0-cp313-cp313-macosx_10_15_x86_64.whl", hash = "sha256:3ca889d708cf82743ec33b2a1cb09211cf55d353297a29e1147f78e6ae05c609", size = 5040068, upload-time = "2025-09-30T01:26:27.367Z" }, + { url = "https://files.pythonhosted.org/packages/a1/1f/e31c68a177cd13f8a83c3e52fc16cf42ede696e5cdaea0ad7e1d0781c9d8/couchbase-4.5.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:d8f69cf185426e5f68a239fb1ce395187b0f31a536e1b2624d20b5b3387fa5d8", size = 4326068, upload-time = "2025-09-30T01:26:32.027Z" }, + { url = "https://files.pythonhosted.org/packages/7c/b2/365ce79459b2a462903698435d67417f5aa11bb8220d853979486dc03284/couchbase-4.5.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:3dddab6fbbe1e44283f41783031728030678e8c9065c2f7a726812e5699c66f5", size = 5184604, upload-time = "2025-09-30T01:26:36.439Z" }, + { url = "https://files.pythonhosted.org/packages/6d/c2/30d395d01279f47813e4e323297380e8d9c431891529922f3bee407b3c15/couchbase-4.5.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:b52a554a36185bd94f04885c3e1822227058a49526d5378162dfa3f3e76fd17e", size = 5446707, upload-time = "2025-09-30T01:26:40.619Z" }, + { url = "https://files.pythonhosted.org/packages/b0/55/4f60cd09e009cbdc705354f9b29e57638a4dcefbf1b3f13d61e5881f5bf4/couchbase-4.5.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:74d00d52128a34f75e908f3ebb16bd33edee82a6695453126a969e1d2c101a86", size = 6104769, upload-time = "2025-09-30T01:26:46.165Z" }, + { url = "https://files.pythonhosted.org/packages/7a/fc/ca70bb20c4a52b71504381c019fe742dcf46815fee3adef4b41a3885eff8/couchbase-4.5.0-cp313-cp313-win_amd64.whl", hash = "sha256:0891eca025a2078fb89389053ac925ef7fa9323631300b60eb749e8a71f9ec1c", size = 4270510, upload-time = "2025-09-30T01:26:50.227Z" }, ] [[package]] @@ -1191,7 +1192,8 @@ scrapfly-sdk = [ { name = "scrapfly-sdk" }, ] selenium = [ - { name = "selenium" }, + { name = "selenium", version = "4.32.0", source = { registry = "https://pypi.org/simple" }, marker = "platform_python_implementation == 'PyPy'" }, + { name = "selenium", version = "4.35.0", source = { registry = "https://pypi.org/simple" }, marker = "platform_python_implementation != 'PyPy'" }, ] serpapi = [ { name = "serpapi" }, @@ -1264,7 +1266,7 @@ requires-dist = [ { name = "python-docx", marker = "extra == 'rag'", specifier = ">=1.1.0" }, { name = "pytube", specifier = ">=15.0.0" }, { name = "qdrant-client", marker = "extra == 'qdrant-client'", specifier = ">=1.12.1" }, - { name = "requests", specifier = ">=2.32.0" }, + { name = "requests", specifier = ">=2.32.5" }, { name = "scrapegraph-py", marker = "extra == 'scrapegraph-py'", specifier = ">=1.9.0" }, { name = "scrapfly-sdk", marker = "extra == 'scrapfly-sdk'", specifier = ">=0.8.19" }, { name = "selenium", marker = "extra == 'selenium'", specifier = ">=4.27.1" }, @@ -1475,7 +1477,7 @@ wheels = [ [[package]] name = "docling" -version = "2.54.0" +version = "2.55.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "accelerate" }, @@ -1507,14 +1509,14 @@ dependencies = [ { name = "tqdm" }, { name = "typer" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/1d/4a/41daa27163b546eb3647e0641560f52ae655c52786617fcc5b7c1724e79e/docling-2.54.0.tar.gz", hash = "sha256:27326d50c33da47d89edc21a7d342af2c5235b66f780a07236196d6e1d1dd357", size = 204198, upload-time = "2025-09-22T15:30:14.675Z" } +sdist = { url = "https://files.pythonhosted.org/packages/d1/9c/124ef8200aa4e6a4ced048dacfad965c203a55281bf3510dc1ea7f677f01/docling-2.55.0.tar.gz", hash = "sha256:bfc9cd874804676a48e9bbe4e6dfbae38aec782f816a89eeb6fc7ee17288bb62", size = 211930, upload-time = "2025-09-30T14:53:36.65Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/ce/57/fdb0a23bc12a03ba30a35d13dcbeb42a2291fedf0b5c2d43e81c1c2d63d0/docling-2.54.0-py3-none-any.whl", hash = "sha256:3d1248811f3d1de7fb05ba4f3704e904ca46880aca0d201fd55150b430968b81", size = 231317, upload-time = "2025-09-22T15:30:12.782Z" }, + { url = "https://files.pythonhosted.org/packages/88/91/655c4ad3f8578ce3ff9a1b6385fc076b13cde213f6fd48122181df8472f7/docling-2.55.0-py3-none-any.whl", hash = "sha256:d06ac604981fd2f485d84f0d5a676d1fcdb23623cbf17ad98fcee2c2b7c20a01", size = 238829, upload-time = "2025-09-30T14:53:34.81Z" }, ] [[package]] name = "docling-core" -version = "2.48.2" +version = "2.48.4" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "jsonref" }, @@ -1528,9 +1530,9 @@ dependencies = [ { name = "typer" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/dd/e6/922de61f2a7b7d337ffc781f8e85f5581b12801fe193827066ccd6c5ba04/docling_core-2.48.2.tar.gz", hash = "sha256:01c12a1d3c9877c6658d0d6adf5cdcefd56cb814d8083860ba2d77ab882ac2d0", size = 161344, upload-time = "2025-09-22T08:39:41.431Z" } +sdist = { url = "https://files.pythonhosted.org/packages/38/d8/f0c8034f87d6151eb955e56975b9f2374a54d57af2b56b1682d7c8ff5c71/docling_core-2.48.4.tar.gz", hash = "sha256:d87ce3021cdae3d073ce7572a2396b69be3cde82ebf9a74d4bad1e1cdfdfd524", size = 161377, upload-time = "2025-10-01T09:10:08.614Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/97/bc/a77739cc31d7de2be9d6682f880761083a2038355e513e813a73a041c644/docling_core-2.48.2-py3-none-any.whl", hash = "sha256:d1f2fe9be9a9f7e7a2fb6ddcc9d9fcbf437bfb02e0c6005cdec1ece1cf4aed44", size = 164376, upload-time = "2025-09-22T08:39:39.704Z" }, + { url = "https://files.pythonhosted.org/packages/c8/2a/06e5f9d3083f830de8bef86f91acda994965f88d8b945ce3b257ea83e780/docling_core-2.48.4-py3-none-any.whl", hash = "sha256:367675c1165d0934ae498fa57ca2d27ef0468aad74dc44a5ab061f5d87882ea1", size = 164374, upload-time = "2025-10-01T09:10:06.034Z" }, ] [package.optional-dependencies] @@ -1708,7 +1710,7 @@ name = "exceptiongroup" version = "1.3.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "typing-extensions", marker = "python_full_version < '3.11'" }, + { name = "typing-extensions", marker = "python_full_version < '3.13'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/0b/9f/a65090624ecf468cdca03533906e7c69ed7588582240cfe7cc9e770b50eb/exceptiongroup-1.3.0.tar.gz", hash = "sha256:b241f5885f560bc56a59ee63ca4c6a8bfa46ae4ad651af316d4e81817bb9fd88", size = 29749, upload-time = "2025-05-10T17:42:51.123Z" } wheels = [ @@ -1747,16 +1749,16 @@ wheels = [ [[package]] name = "fastapi" -version = "0.117.1" +version = "0.118.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "pydantic" }, { name = "starlette" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/7e/7e/d9788300deaf416178f61fb3c2ceb16b7d0dc9f82a08fdb87a5e64ee3cc7/fastapi-0.117.1.tar.gz", hash = "sha256:fb2d42082d22b185f904ca0ecad2e195b851030bd6c5e4c032d1c981240c631a", size = 307155, upload-time = "2025-09-20T20:16:56.663Z" } +sdist = { url = "https://files.pythonhosted.org/packages/28/3c/2b9345a6504e4055eaa490e0b41c10e338ad61d9aeaae41d97807873cdf2/fastapi-0.118.0.tar.gz", hash = "sha256:5e81654d98c4d2f53790a7d32d25a7353b30c81441be7d0958a26b5d761fa1c8", size = 310536, upload-time = "2025-09-29T03:37:23.126Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/6d/45/d9d3e8eeefbe93be1c50060a9d9a9f366dba66f288bb518a9566a23a8631/fastapi-0.117.1-py3-none-any.whl", hash = "sha256:33c51a0d21cab2b9722d4e56dbb9316f3687155be6b276191790d8da03507552", size = 95959, upload-time = "2025-09-20T20:16:53.661Z" }, + { url = "https://files.pythonhosted.org/packages/54/20/54e2bdaad22ca91a59455251998d43094d5c3d3567c52c7c04774b3f43f2/fastapi-0.118.0-py3-none-any.whl", hash = "sha256:705137a61e2ef71019d2445b123aa8845bd97273c395b744d5a7dfe559056855", size = 97694, upload-time = "2025-09-29T03:37:21.338Z" }, ] [[package]] @@ -1828,43 +1830,43 @@ wheels = [ [[package]] name = "fonttools" -version = "4.60.0" +version = "4.60.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/27/d9/4eabd956fe123651a1f0efe29d9758b3837b5ae9a98934bdb571117033bb/fonttools-4.60.0.tar.gz", hash = "sha256:8f5927f049091a0ca74d35cce7f78e8f7775c83a6901a8fbe899babcc297146a", size = 3553671, upload-time = "2025-09-17T11:34:01.504Z" } +sdist = { url = "https://files.pythonhosted.org/packages/4b/42/97a13e47a1e51a5a7142475bbcf5107fe3a68fc34aef331c897d5fb98ad0/fonttools-4.60.1.tar.gz", hash = "sha256:ef00af0439ebfee806b25f24c8f92109157ff3fac5731dc7867957812e87b8d9", size = 3559823, upload-time = "2025-09-29T21:13:27.129Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/01/1e/7c2d660cd2a6718961946f76b6af25ae8c7ad0e2a93a34c9bf8b955cb77f/fonttools-4.60.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:151282a235c36024168c21c02193e939e8b28c73d5fa0b36ae1072671d8fa134", size = 2809773, upload-time = "2025-09-17T11:31:52.648Z" }, - { url = "https://files.pythonhosted.org/packages/f2/74/35cb2e17d984e712f0f7241b1b8bf06bc1b0da345f11620acd78a7eb1f0e/fonttools-4.60.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:3f32cc42d485d9b1546463b9a7a92bdbde8aef90bac3602503e04c2ddb27e164", size = 2345916, upload-time = "2025-09-17T11:31:55.817Z" }, - { url = "https://files.pythonhosted.org/packages/40/52/39e50212f47bad254255734903accb4f44143faf2b950ba67a61f0bfb26a/fonttools-4.60.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:336b89d169c40379b8ccef418c877edbc28840b553099c9a739b0db2bcbb57c5", size = 4863583, upload-time = "2025-09-17T11:31:57.708Z" }, - { url = "https://files.pythonhosted.org/packages/0c/2c/e701ba6a439119fe312f1ad738369519b446503b02d3f0f75424111686f1/fonttools-4.60.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:39a38d950b2b04cd6da729586e6b51d686b0c27d554a2154a6a35887f87c09b1", size = 4793647, upload-time = "2025-09-17T11:31:59.944Z" }, - { url = "https://files.pythonhosted.org/packages/d5/04/a48f5f7cce1653a876d6b57d9626c1364bcb430780bbbdd475662bbbf759/fonttools-4.60.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:7067dd03e0296907a5c6184285807cbb7bc0bf61a584ffebbf97c2b638d8641a", size = 4842891, upload-time = "2025-09-17T11:32:02.149Z" }, - { url = "https://files.pythonhosted.org/packages/dd/af/0f2b742f6b489a62c6f5a2239867c6d203e3ba358cb48dfc940baee41932/fonttools-4.60.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:342753fe1a1bd2e6896e7a4e936a67c0f441d6897bd11477f718e772d6e63e88", size = 4953569, upload-time = "2025-09-17T11:32:04.467Z" }, - { url = "https://files.pythonhosted.org/packages/d6/2b/23c4dde4a869aa138f5fb63fb124e6accb0d643600b437f4eca0f2637ea2/fonttools-4.60.0-cp310-cp310-win32.whl", hash = "sha256:0746c2b2b32087da2ac5f81e14d319c44cb21127d419bc60869daed089790e3d", size = 2231022, upload-time = "2025-09-17T11:32:06.617Z" }, - { url = "https://files.pythonhosted.org/packages/e3/1c/d53dd15d3392d8f69aa3bc49ca7bdfaea06aa875dc3a641eca85433c90b3/fonttools-4.60.0-cp310-cp310-win_amd64.whl", hash = "sha256:b83b32e5e8918f8e0ccd79816fc2f914e30edc6969ab2df6baf4148e72dbcc11", size = 2275804, upload-time = "2025-09-17T11:32:08.578Z" }, - { url = "https://files.pythonhosted.org/packages/da/3d/c57731fbbf204ef1045caca28d5176430161ead73cd9feac3e9d9ef77ee6/fonttools-4.60.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:a9106c202d68ff5f9b4a0094c4d7ad2eaa7e9280f06427b09643215e706eb016", size = 2830883, upload-time = "2025-09-17T11:32:10.552Z" }, - { url = "https://files.pythonhosted.org/packages/cc/2d/b7a6ebaed464ce441c755252cc222af11edc651d17c8f26482f429cc2c0e/fonttools-4.60.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:9da3a4a3f2485b156bb429b4f8faa972480fc01f553f7c8c80d05d48f17eec89", size = 2356005, upload-time = "2025-09-17T11:32:13.248Z" }, - { url = "https://files.pythonhosted.org/packages/ee/c2/ea834e921324e2051403e125c1fe0bfbdde4951a7c1784e4ae6bdbd286cc/fonttools-4.60.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1f84de764c6057b2ffd4feb50ddef481d92e348f0c70f2c849b723118d352bf3", size = 5041201, upload-time = "2025-09-17T11:32:15.373Z" }, - { url = "https://files.pythonhosted.org/packages/93/3c/1c64a338e9aa410d2d0728827d5bb1301463078cb225b94589f27558b427/fonttools-4.60.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:800b3fa0d5c12ddff02179d45b035a23989a6c597a71c8035c010fff3b2ef1bb", size = 4977696, upload-time = "2025-09-17T11:32:17.674Z" }, - { url = "https://files.pythonhosted.org/packages/07/cc/c8c411a0d9732bb886b870e052f20658fec9cf91118314f253950d2c1d65/fonttools-4.60.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:8dd68f60b030277f292a582d31c374edfadc60bb33d51ec7b6cd4304531819ba", size = 5020386, upload-time = "2025-09-17T11:32:20.089Z" }, - { url = "https://files.pythonhosted.org/packages/13/01/1d3bc07cf92e7f4fc27f06d4494bf6078dc595b2e01b959157a4fd23df12/fonttools-4.60.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:53328e3ca9e5c8660ef6de07c35f8f312c189b757535e12141be7a8ec942de6e", size = 5131575, upload-time = "2025-09-17T11:32:22.582Z" }, - { url = "https://files.pythonhosted.org/packages/5a/16/08db3917ee19e89d2eb0ee637d37cd4136c849dc421ff63f406b9165c1a1/fonttools-4.60.0-cp311-cp311-win32.whl", hash = "sha256:d493c175ddd0b88a5376e61163e3e6fde3be8b8987db9b092e0a84650709c9e7", size = 2229297, upload-time = "2025-09-17T11:32:24.834Z" }, - { url = "https://files.pythonhosted.org/packages/d2/0b/76764da82c0dfcea144861f568d9e83f4b921e84f2be617b451257bb25a7/fonttools-4.60.0-cp311-cp311-win_amd64.whl", hash = "sha256:cc2770c9dc49c2d0366e9683f4d03beb46c98042d7ccc8ddbadf3459ecb051a7", size = 2277193, upload-time = "2025-09-17T11:32:27.094Z" }, - { url = "https://files.pythonhosted.org/packages/2a/9b/706ebf84b55ab03439c1f3a94d6915123c0d96099f4238b254fdacffe03a/fonttools-4.60.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:8c68928a438d60dfde90e2f09aa7f848ed201176ca6652341744ceec4215859f", size = 2831953, upload-time = "2025-09-17T11:32:29.39Z" }, - { url = "https://files.pythonhosted.org/packages/76/40/782f485be450846e4f3aecff1f10e42af414fc6e19d235c70020f64278e1/fonttools-4.60.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:b7133821249097cffabf0624eafd37f5a3358d5ce814febe9db688e3673e724e", size = 2351716, upload-time = "2025-09-17T11:32:31.46Z" }, - { url = "https://files.pythonhosted.org/packages/39/77/ad8d2a6ecc19716eb488c8cf118de10f7802e14bdf61d136d7b52358d6b1/fonttools-4.60.0-cp312-cp312-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:d3638905d3d77ac8791127ce181f7cb434f37e4204d8b2e31b8f1e154320b41f", size = 4922729, upload-time = "2025-09-17T11:32:33.659Z" }, - { url = "https://files.pythonhosted.org/packages/6b/48/aa543037c6e7788e1bc36b3f858ac70a59d32d0f45915263d0b330a35140/fonttools-4.60.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7968a26ef010ae89aabbb2f8e9dec1e2709a2541bb8620790451ee8aeb4f6fbf", size = 4967188, upload-time = "2025-09-17T11:32:35.74Z" }, - { url = "https://files.pythonhosted.org/packages/ac/58/e407d2028adc6387947eff8f2940b31f4ed40b9a83c2c7bbc8b9255126e2/fonttools-4.60.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:1ef01ca7847c356b0fe026b7b92304bc31dc60a4218689ee0acc66652c1a36b2", size = 4910043, upload-time = "2025-09-17T11:32:38.054Z" }, - { url = "https://files.pythonhosted.org/packages/16/ef/e78519b3c296ef757a21b792fc6a785aa2ef9a2efb098083d8ed5f6ee2ba/fonttools-4.60.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:f3482d7ed7867edfcf785f77c1dffc876c4b2ddac19539c075712ff2a0703cf5", size = 5061980, upload-time = "2025-09-17T11:32:40.457Z" }, - { url = "https://files.pythonhosted.org/packages/00/4c/ad72444d1e3ef704ee90af8d5abf198016a39908d322bf41235562fb01a0/fonttools-4.60.0-cp312-cp312-win32.whl", hash = "sha256:8c937c4fe8addff575a984c9519433391180bf52cf35895524a07b520f376067", size = 2217750, upload-time = "2025-09-17T11:32:42.586Z" }, - { url = "https://files.pythonhosted.org/packages/46/55/3e8ac21963e130242f5a9ea2ebc57f5726d704bf4dcca89088b5b637b2d3/fonttools-4.60.0-cp312-cp312-win_amd64.whl", hash = "sha256:99b06d5d6f29f32e312adaed0367112f5ff2d300ea24363d377ec917daf9e8c5", size = 2266025, upload-time = "2025-09-17T11:32:44.8Z" }, - { url = "https://files.pythonhosted.org/packages/b4/6b/d090cd54abe88192fe3010f573508b2592cf1d1f98b14bcb799a8ad20525/fonttools-4.60.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:97100ba820936cdb5148b634e0884f0088699c7e2f1302ae7bba3747c7a19fb3", size = 2824791, upload-time = "2025-09-17T11:32:47.002Z" }, - { url = "https://files.pythonhosted.org/packages/97/8c/7ccb5a27aac9a535623fe04935fb9f469a4f8a1253991af9fbac2fe88c17/fonttools-4.60.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:03fccf84f377f83e99a5328a9ebe6b41e16fcf64a1450c352b6aa7e0deedbc01", size = 2347081, upload-time = "2025-09-17T11:32:49.204Z" }, - { url = "https://files.pythonhosted.org/packages/f8/1a/c14f0bb20b4cb7849dc0519f0ab0da74318d52236dc23168530569958599/fonttools-4.60.0-cp313-cp313-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:a3ef06671f862cd7da78ab105fbf8dce9da3634a8f91b3a64ed5c29c0ac6a9a8", size = 4902095, upload-time = "2025-09-17T11:32:51.848Z" }, - { url = "https://files.pythonhosted.org/packages/c9/a0/c7c91f07c40de5399cbaec7d25e04c9afac6c8f80036a98c125efdb5fe1a/fonttools-4.60.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3f2195faf96594c238462c420c7eff97d1aa51de595434f806ec3952df428616", size = 4959137, upload-time = "2025-09-17T11:32:54.185Z" }, - { url = "https://files.pythonhosted.org/packages/38/d2/169e49498df9f2c721763aa39b0bf3d08cb762864ebc8a8ddb99f5ba7ec8/fonttools-4.60.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:3887008865fa4f56cff58a1878f1300ba81a4e34f76daf9b47234698493072ee", size = 4900467, upload-time = "2025-09-17T11:32:56.664Z" }, - { url = "https://files.pythonhosted.org/packages/cc/9c/bfb56b89c3eab8bcb739c7fd1e8a43285c8dd833e1e1d18d4f54f2f641af/fonttools-4.60.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:5567bd130378f21231d3856d8f0571dcdfcd77e47832978c26dabe572d456daa", size = 5043508, upload-time = "2025-09-17T11:32:58.944Z" }, - { url = "https://files.pythonhosted.org/packages/77/30/2b511c7eb99faee1fd9a0b42e984fb91275da3d681da650af4edf409d0fd/fonttools-4.60.0-cp313-cp313-win32.whl", hash = "sha256:699d0b521ec0b188ac11f2c14ccf6a926367795818ddf2bd00a273e9a052dd20", size = 2216037, upload-time = "2025-09-17T11:33:01.192Z" }, - { url = "https://files.pythonhosted.org/packages/3d/73/a2cc5ee4faeb0302cc81942c27f3b516801bf489fdc422a1b20090fff695/fonttools-4.60.0-cp313-cp313-win_amd64.whl", hash = "sha256:24296163268e7c800009711ce5c0e9997be8882c0bd546696c82ef45966163a6", size = 2265190, upload-time = "2025-09-17T11:33:03.935Z" }, - { url = "https://files.pythonhosted.org/packages/f9/a4/247d3e54eb5ed59e94e09866cfc4f9567e274fbf310ba390711851f63b3b/fonttools-4.60.0-py3-none-any.whl", hash = "sha256:496d26e4d14dcccdd6ada2e937e4d174d3138e3d73f5c9b6ec6eb2fd1dab4f66", size = 1142186, upload-time = "2025-09-17T11:33:59.287Z" }, + { url = "https://files.pythonhosted.org/packages/26/70/03e9d89a053caff6ae46053890eba8e4a5665a7c5638279ed4492e6d4b8b/fonttools-4.60.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:9a52f254ce051e196b8fe2af4634c2d2f02c981756c6464dc192f1b6050b4e28", size = 2810747, upload-time = "2025-09-29T21:10:59.653Z" }, + { url = "https://files.pythonhosted.org/packages/6f/41/449ad5aff9670ab0df0f61ee593906b67a36d7e0b4d0cd7fa41ac0325bf5/fonttools-4.60.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c7420a2696a44650120cdd269a5d2e56a477e2bfa9d95e86229059beb1c19e15", size = 2346909, upload-time = "2025-09-29T21:11:02.882Z" }, + { url = "https://files.pythonhosted.org/packages/9a/18/e5970aa96c8fad1cb19a9479cc3b7602c0c98d250fcdc06a5da994309c50/fonttools-4.60.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ee0c0b3b35b34f782afc673d503167157094a16f442ace7c6c5e0ca80b08f50c", size = 4864572, upload-time = "2025-09-29T21:11:05.096Z" }, + { url = "https://files.pythonhosted.org/packages/ce/20/9b2b4051b6ec6689480787d506b5003f72648f50972a92d04527a456192c/fonttools-4.60.1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:282dafa55f9659e8999110bd8ed422ebe1c8aecd0dc396550b038e6c9a08b8ea", size = 4794635, upload-time = "2025-09-29T21:11:08.651Z" }, + { url = "https://files.pythonhosted.org/packages/10/52/c791f57347c1be98f8345e3dca4ac483eb97666dd7c47f3059aeffab8b59/fonttools-4.60.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:4ba4bd646e86de16160f0fb72e31c3b9b7d0721c3e5b26b9fa2fc931dfdb2652", size = 4843878, upload-time = "2025-09-29T21:11:10.893Z" }, + { url = "https://files.pythonhosted.org/packages/69/e9/35c24a8d01644cee8c090a22fad34d5b61d1e0a8ecbc9945ad785ebf2e9e/fonttools-4.60.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:0b0835ed15dd5b40d726bb61c846a688f5b4ce2208ec68779bc81860adb5851a", size = 4954555, upload-time = "2025-09-29T21:11:13.24Z" }, + { url = "https://files.pythonhosted.org/packages/f7/86/fb1e994971be4bdfe3a307de6373ef69a9df83fb66e3faa9c8114893d4cc/fonttools-4.60.1-cp310-cp310-win32.whl", hash = "sha256:1525796c3ffe27bb6268ed2a1bb0dcf214d561dfaf04728abf01489eb5339dce", size = 2232019, upload-time = "2025-09-29T21:11:15.73Z" }, + { url = "https://files.pythonhosted.org/packages/40/84/62a19e2bd56f0e9fb347486a5b26376bade4bf6bbba64dda2c103bd08c94/fonttools-4.60.1-cp310-cp310-win_amd64.whl", hash = "sha256:268ecda8ca6cb5c4f044b1fb9b3b376e8cd1b361cef275082429dc4174907038", size = 2276803, upload-time = "2025-09-29T21:11:18.152Z" }, + { url = "https://files.pythonhosted.org/packages/ea/85/639aa9bface1537e0fb0f643690672dde0695a5bbbc90736bc571b0b1941/fonttools-4.60.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:7b4c32e232a71f63a5d00259ca3d88345ce2a43295bb049d21061f338124246f", size = 2831872, upload-time = "2025-09-29T21:11:20.329Z" }, + { url = "https://files.pythonhosted.org/packages/6b/47/3c63158459c95093be9618794acb1067b3f4d30dcc5c3e8114b70e67a092/fonttools-4.60.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3630e86c484263eaac71d117085d509cbcf7b18f677906824e4bace598fb70d2", size = 2356990, upload-time = "2025-09-29T21:11:22.754Z" }, + { url = "https://files.pythonhosted.org/packages/94/dd/1934b537c86fcf99f9761823f1fc37a98fbd54568e8e613f29a90fed95a9/fonttools-4.60.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5c1015318e4fec75dd4943ad5f6a206d9727adf97410d58b7e32ab644a807914", size = 5042189, upload-time = "2025-09-29T21:11:25.061Z" }, + { url = "https://files.pythonhosted.org/packages/d2/d2/9f4e4c4374dd1daa8367784e1bd910f18ba886db1d6b825b12edf6db3edc/fonttools-4.60.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:e6c58beb17380f7c2ea181ea11e7db8c0ceb474c9dd45f48e71e2cb577d146a1", size = 4978683, upload-time = "2025-09-29T21:11:27.693Z" }, + { url = "https://files.pythonhosted.org/packages/cc/c4/0fb2dfd1ecbe9a07954cc13414713ed1eab17b1c0214ef07fc93df234a47/fonttools-4.60.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:ec3681a0cb34c255d76dd9d865a55f260164adb9fa02628415cdc2d43ee2c05d", size = 5021372, upload-time = "2025-09-29T21:11:30.257Z" }, + { url = "https://files.pythonhosted.org/packages/0c/d5/495fc7ae2fab20223cc87179a8f50f40f9a6f821f271ba8301ae12bb580f/fonttools-4.60.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f4b5c37a5f40e4d733d3bbaaef082149bee5a5ea3156a785ff64d949bd1353fa", size = 5132562, upload-time = "2025-09-29T21:11:32.737Z" }, + { url = "https://files.pythonhosted.org/packages/bc/fa/021dab618526323c744e0206b3f5c8596a2e7ae9aa38db5948a131123e83/fonttools-4.60.1-cp311-cp311-win32.whl", hash = "sha256:398447f3d8c0c786cbf1209711e79080a40761eb44b27cdafffb48f52bcec258", size = 2230288, upload-time = "2025-09-29T21:11:35.015Z" }, + { url = "https://files.pythonhosted.org/packages/bb/78/0e1a6d22b427579ea5c8273e1c07def2f325b977faaf60bb7ddc01456cb1/fonttools-4.60.1-cp311-cp311-win_amd64.whl", hash = "sha256:d066ea419f719ed87bc2c99a4a4bfd77c2e5949cb724588b9dd58f3fd90b92bf", size = 2278184, upload-time = "2025-09-29T21:11:37.434Z" }, + { url = "https://files.pythonhosted.org/packages/e3/f7/a10b101b7a6f8836a5adb47f2791f2075d044a6ca123f35985c42edc82d8/fonttools-4.60.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:7b0c6d57ab00dae9529f3faf187f2254ea0aa1e04215cf2f1a8ec277c96661bc", size = 2832953, upload-time = "2025-09-29T21:11:39.616Z" }, + { url = "https://files.pythonhosted.org/packages/ed/fe/7bd094b59c926acf2304d2151354ddbeb74b94812f3dc943c231db09cb41/fonttools-4.60.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:839565cbf14645952d933853e8ade66a463684ed6ed6c9345d0faf1f0e868877", size = 2352706, upload-time = "2025-09-29T21:11:41.826Z" }, + { url = "https://files.pythonhosted.org/packages/c0/ca/4bb48a26ed95a1e7eba175535fe5805887682140ee0a0d10a88e1de84208/fonttools-4.60.1-cp312-cp312-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:8177ec9676ea6e1793c8a084a90b65a9f778771998eb919d05db6d4b1c0b114c", size = 4923716, upload-time = "2025-09-29T21:11:43.893Z" }, + { url = "https://files.pythonhosted.org/packages/b8/9f/2cb82999f686c1d1ddf06f6ae1a9117a880adbec113611cc9d22b2fdd465/fonttools-4.60.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:996a4d1834524adbb423385d5a629b868ef9d774670856c63c9a0408a3063401", size = 4968175, upload-time = "2025-09-29T21:11:46.439Z" }, + { url = "https://files.pythonhosted.org/packages/18/79/be569699e37d166b78e6218f2cde8c550204f2505038cdd83b42edc469b9/fonttools-4.60.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:a46b2f450bc79e06ef3b6394f0c68660529ed51692606ad7f953fc2e448bc903", size = 4911031, upload-time = "2025-09-29T21:11:48.977Z" }, + { url = "https://files.pythonhosted.org/packages/cc/9f/89411cc116effaec5260ad519162f64f9c150e5522a27cbb05eb62d0c05b/fonttools-4.60.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:6ec722ee589e89a89f5b7574f5c45604030aa6ae24cb2c751e2707193b466fed", size = 5062966, upload-time = "2025-09-29T21:11:54.344Z" }, + { url = "https://files.pythonhosted.org/packages/62/a1/f888221934b5731d46cb9991c7a71f30cb1f97c0ef5fcf37f8da8fce6c8e/fonttools-4.60.1-cp312-cp312-win32.whl", hash = "sha256:b2cf105cee600d2de04ca3cfa1f74f1127f8455b71dbad02b9da6ec266e116d6", size = 2218750, upload-time = "2025-09-29T21:11:56.601Z" }, + { url = "https://files.pythonhosted.org/packages/88/8f/a55b5550cd33cd1028601df41acd057d4be20efa5c958f417b0c0613924d/fonttools-4.60.1-cp312-cp312-win_amd64.whl", hash = "sha256:992775c9fbe2cf794786fa0ffca7f09f564ba3499b8fe9f2f80bd7197db60383", size = 2267026, upload-time = "2025-09-29T21:11:58.852Z" }, + { url = "https://files.pythonhosted.org/packages/7c/5b/cdd2c612277b7ac7ec8c0c9bc41812c43dc7b2d5f2b0897e15fdf5a1f915/fonttools-4.60.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:6f68576bb4bbf6060c7ab047b1574a1ebe5c50a17de62830079967b211059ebb", size = 2825777, upload-time = "2025-09-29T21:12:01.22Z" }, + { url = "https://files.pythonhosted.org/packages/d6/8a/de9cc0540f542963ba5e8f3a1f6ad48fa211badc3177783b9d5cadf79b5d/fonttools-4.60.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:eedacb5c5d22b7097482fa834bda0dafa3d914a4e829ec83cdea2a01f8c813c4", size = 2348080, upload-time = "2025-09-29T21:12:03.785Z" }, + { url = "https://files.pythonhosted.org/packages/2d/8b/371ab3cec97ee3fe1126b3406b7abd60c8fec8975fd79a3c75cdea0c3d83/fonttools-4.60.1-cp313-cp313-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:b33a7884fabd72bdf5f910d0cf46be50dce86a0362a65cfc746a4168c67eb96c", size = 4903082, upload-time = "2025-09-29T21:12:06.382Z" }, + { url = "https://files.pythonhosted.org/packages/04/05/06b1455e4bc653fcb2117ac3ef5fa3a8a14919b93c60742d04440605d058/fonttools-4.60.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2409d5fb7b55fd70f715e6d34e7a6e4f7511b8ad29a49d6df225ee76da76dd77", size = 4960125, upload-time = "2025-09-29T21:12:09.314Z" }, + { url = "https://files.pythonhosted.org/packages/8e/37/f3b840fcb2666f6cb97038793606bdd83488dca2d0b0fc542ccc20afa668/fonttools-4.60.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:c8651e0d4b3bdeda6602b85fdc2abbefc1b41e573ecb37b6779c4ca50753a199", size = 4901454, upload-time = "2025-09-29T21:12:11.931Z" }, + { url = "https://files.pythonhosted.org/packages/fd/9e/eb76f77e82f8d4a46420aadff12cec6237751b0fb9ef1de373186dcffb5f/fonttools-4.60.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:145daa14bf24824b677b9357c5e44fd8895c2a8f53596e1b9ea3496081dc692c", size = 5044495, upload-time = "2025-09-29T21:12:15.241Z" }, + { url = "https://files.pythonhosted.org/packages/f8/b3/cede8f8235d42ff7ae891bae8d619d02c8ac9fd0cfc450c5927a6200c70d/fonttools-4.60.1-cp313-cp313-win32.whl", hash = "sha256:2299df884c11162617a66b7c316957d74a18e3758c0274762d2cc87df7bc0272", size = 2217028, upload-time = "2025-09-29T21:12:17.96Z" }, + { url = "https://files.pythonhosted.org/packages/75/4d/b022c1577807ce8b31ffe055306ec13a866f2337ecee96e75b24b9b753ea/fonttools-4.60.1-cp313-cp313-win_amd64.whl", hash = "sha256:a3db56f153bd4c5c2b619ab02c5db5192e222150ce5a1bc10f16164714bc39ac", size = 2266200, upload-time = "2025-09-29T21:12:20.14Z" }, + { url = "https://files.pythonhosted.org/packages/c7/93/0dd45cd283c32dea1545151d8c3637b4b8c53cdb3a625aeb2885b184d74d/fonttools-4.60.1-py3-none-any.whl", hash = "sha256:906306ac7afe2156fcf0042173d6ebbb05416af70f6b370967b47f8f00103bbb", size = 1143175, upload-time = "2025-09-29T21:13:24.134Z" }, ] [[package]] @@ -2018,16 +2020,16 @@ grpc = [ [[package]] name = "google-auth" -version = "2.40.3" +version = "2.41.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "cachetools" }, { name = "pyasn1-modules" }, { name = "rsa" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/9e/9b/e92ef23b84fa10a64ce4831390b7a4c2e53c0132568d99d4ae61d04c8855/google_auth-2.40.3.tar.gz", hash = "sha256:500c3a29adedeb36ea9cf24b8d10858e152f2412e3ca37829b3fa18e33d63b77", size = 281029, upload-time = "2025-06-04T18:04:57.577Z" } +sdist = { url = "https://files.pythonhosted.org/packages/a8/af/5129ce5b2f9688d2fa49b463e544972a7c82b0fdb50980dafee92e121d9f/google_auth-2.41.1.tar.gz", hash = "sha256:b76b7b1f9e61f0cb7e88870d14f6a94aeef248959ef6992670efee37709cbfd2", size = 292284, upload-time = "2025-09-30T22:51:26.363Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/17/63/b19553b658a1692443c62bd07e5868adaa0ad746a0751ba62c59568cd45b/google_auth-2.40.3-py2.py3-none-any.whl", hash = "sha256:1370d4593e86213563547f97a92752fc658456fe4514c809544f330fed45a7ca", size = 216137, upload-time = "2025-06-04T18:04:55.573Z" }, + { url = "https://files.pythonhosted.org/packages/be/a4/7319a2a8add4cc352be9e3efeff5e2aacee917c85ca2fa1647e29089983c/google_auth-2.41.1-py2.py3-none-any.whl", hash = "sha256:754843be95575b9a19c604a848a41be03f7f2afd8c019f716dc1f51ee41c639d", size = 221302, upload-time = "2025-09-30T22:51:24.212Z" }, ] [[package]] @@ -2306,7 +2308,7 @@ wheels = [ [[package]] name = "huggingface-hub" -version = "0.35.1" +version = "0.35.3" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "filelock" }, @@ -2318,9 +2320,9 @@ dependencies = [ { name = "tqdm" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/f6/42/0e7be334a6851cd7d51cc11717cb95e89333ebf0064431c0255c56957526/huggingface_hub-0.35.1.tar.gz", hash = "sha256:3585b88c5169c64b7e4214d0e88163d4a709de6d1a502e0cd0459e9ee2c9c572", size = 461374, upload-time = "2025-09-23T13:43:47.074Z" } +sdist = { url = "https://files.pythonhosted.org/packages/10/7e/a0a97de7c73671863ca6b3f61fa12518caf35db37825e43d63a70956738c/huggingface_hub-0.35.3.tar.gz", hash = "sha256:350932eaa5cc6a4747efae85126ee220e4ef1b54e29d31c3b45c5612ddf0b32a", size = 461798, upload-time = "2025-09-29T14:29:58.625Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/f1/60/4acf0c8a3925d9ff491dc08fe84d37e09cfca9c3b885e0db3d4dedb98cea/huggingface_hub-0.35.1-py3-none-any.whl", hash = "sha256:2f0e2709c711e3040e31d3e0418341f7092910f1462dd00350c4e97af47280a8", size = 563340, upload-time = "2025-09-23T13:43:45.343Z" }, + { url = "https://files.pythonhosted.org/packages/31/a0/651f93d154cb72323358bf2bbae3e642bdb5d2f1bfc874d096f7cb159fa0/huggingface_hub-0.35.3-py3-none-any.whl", hash = "sha256:0e3a01829c19d86d03793e4577816fe3bdfc1602ac62c7fb220d593d351224ba", size = 564262, upload-time = "2025-09-29T14:29:55.813Z" }, ] [[package]] @@ -2337,16 +2339,16 @@ wheels = [ [[package]] name = "hyperbrowser" -version = "0.58.0" +version = "0.59.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "httpx" }, { name = "jsonref" }, { name = "pydantic" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/a8/9e/3730b317d255aecbec70d5e1562517efa4c6308b3e79b3bd0d83e8c719df/hyperbrowser-0.58.0.tar.gz", hash = "sha256:a3bc0d8678716fec3da14ca67b1d4aa4137b5976b2566e0975e7b967d441022e", size = 26305, upload-time = "2025-09-26T17:34:17.752Z" } +sdist = { url = "https://files.pythonhosted.org/packages/cf/f6/47b9b215962ae0137f3f1528a760a519683ec5976951e72b996377122c1e/hyperbrowser-0.59.0.tar.gz", hash = "sha256:f03ae2930c7b2c9aa8da86af684306b319df036b0d62b53961e811db35a580cf", size = 26316, upload-time = "2025-09-30T00:59:20.06Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/5e/84/0ff4d1cf8c3249593c8b3654c8e485ac21eeb29cfec04a2d6d89d9ed4684/hyperbrowser-0.58.0-py3-none-any.whl", hash = "sha256:b0b952ea6396a64dd8acc79e290664f5ad8d533e95ce2e868863379869c225b4", size = 53093, upload-time = "2025-09-26T17:34:16.697Z" }, + { url = "https://files.pythonhosted.org/packages/73/2d/c63ee41bba554639155a348a2a1232e76acc30a164bf68c34b61309a0b4b/hyperbrowser-0.59.0-py3-none-any.whl", hash = "sha256:cb10f738290d9c6c1cb89e4bbee230b161dbb3593587e01ded366564eb8a7651", size = 53099, upload-time = "2025-09-30T00:59:18.683Z" }, ] [[package]] @@ -2712,12 +2714,12 @@ name = "ipython" version = "8.37.0" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version < '3.11' and platform_python_implementation == 'PyPy' and sys_platform == 'darwin'", "python_full_version < '3.11' and platform_python_implementation != 'PyPy' and sys_platform == 'darwin'", - "python_full_version < '3.11' and platform_machine == 'aarch64' and platform_python_implementation == 'PyPy' and sys_platform == 'linux'", "python_full_version < '3.11' and platform_machine == 'aarch64' and platform_python_implementation != 'PyPy' and sys_platform == 'linux'", - "(python_full_version < '3.11' and platform_machine != 'aarch64' and platform_python_implementation == 'PyPy' and sys_platform == 'linux') or (python_full_version < '3.11' and platform_python_implementation == 'PyPy' and sys_platform != 'darwin' and sys_platform != 'linux')", "(python_full_version < '3.11' and platform_machine != 'aarch64' and platform_python_implementation != 'PyPy' and sys_platform == 'linux') or (python_full_version < '3.11' and platform_python_implementation != 'PyPy' and sys_platform != 'darwin' and sys_platform != 'linux')", + "python_full_version < '3.11' and platform_python_implementation == 'PyPy' and sys_platform == 'darwin'", + "python_full_version < '3.11' and platform_machine == 'aarch64' and platform_python_implementation == 'PyPy' and sys_platform == 'linux'", + "(python_full_version < '3.11' and platform_machine != 'aarch64' and platform_python_implementation == 'PyPy' and sys_platform == 'linux') or (python_full_version < '3.11' and platform_python_implementation == 'PyPy' and sys_platform != 'darwin' and sys_platform != 'linux')", ] dependencies = [ { name = "colorama", marker = "python_full_version < '3.11' and sys_platform == 'win32'" }, @@ -2739,27 +2741,27 @@ wheels = [ [[package]] name = "ipython" -version = "9.5.0" +version = "9.6.0" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version >= '3.13' and platform_python_implementation == 'PyPy' and sys_platform == 'darwin'", - "python_full_version >= '3.13' and platform_machine == 'aarch64' and platform_python_implementation == 'PyPy' and sys_platform == 'linux'", - "(python_full_version >= '3.13' and platform_machine != 'aarch64' and platform_python_implementation == 'PyPy' and sys_platform == 'linux') or (python_full_version >= '3.13' and platform_python_implementation == 'PyPy' and sys_platform != 'darwin' and sys_platform != 'linux')", "python_full_version >= '3.13' and platform_python_implementation != 'PyPy' and sys_platform == 'darwin'", "python_full_version >= '3.13' and platform_machine == 'aarch64' and platform_python_implementation != 'PyPy' and sys_platform == 'linux'", "(python_full_version >= '3.13' and platform_machine != 'aarch64' and platform_python_implementation != 'PyPy' and sys_platform == 'linux') or (python_full_version >= '3.13' and platform_python_implementation != 'PyPy' and sys_platform != 'darwin' and sys_platform != 'linux')", - "python_full_version == '3.12.*' and platform_python_implementation == 'PyPy' and sys_platform == 'darwin'", "python_full_version == '3.12.*' and platform_python_implementation != 'PyPy' and sys_platform == 'darwin'", - "python_full_version == '3.12.*' and platform_machine == 'aarch64' and platform_python_implementation == 'PyPy' and sys_platform == 'linux'", "python_full_version == '3.12.*' and platform_machine == 'aarch64' and platform_python_implementation != 'PyPy' and sys_platform == 'linux'", - "(python_full_version == '3.12.*' and platform_machine != 'aarch64' and platform_python_implementation == 'PyPy' and sys_platform == 'linux') or (python_full_version == '3.12.*' and platform_python_implementation == 'PyPy' and sys_platform != 'darwin' and sys_platform != 'linux')", "(python_full_version == '3.12.*' and platform_machine != 'aarch64' and platform_python_implementation != 'PyPy' and sys_platform == 'linux') or (python_full_version == '3.12.*' and platform_python_implementation != 'PyPy' and sys_platform != 'darwin' and sys_platform != 'linux')", - "python_full_version == '3.11.*' and platform_python_implementation == 'PyPy' and sys_platform == 'darwin'", "python_full_version == '3.11.*' and platform_python_implementation != 'PyPy' and sys_platform == 'darwin'", - "python_full_version == '3.11.*' and platform_machine == 'aarch64' and platform_python_implementation == 'PyPy' and sys_platform == 'linux'", "python_full_version == '3.11.*' and platform_machine == 'aarch64' and platform_python_implementation != 'PyPy' and sys_platform == 'linux'", - "(python_full_version == '3.11.*' and platform_machine != 'aarch64' and platform_python_implementation == 'PyPy' and sys_platform == 'linux') or (python_full_version == '3.11.*' and platform_python_implementation == 'PyPy' and sys_platform != 'darwin' and sys_platform != 'linux')", "(python_full_version == '3.11.*' and platform_machine != 'aarch64' and platform_python_implementation != 'PyPy' and sys_platform == 'linux') or (python_full_version == '3.11.*' and platform_python_implementation != 'PyPy' and sys_platform != 'darwin' and sys_platform != 'linux')", + "python_full_version >= '3.13' and platform_python_implementation == 'PyPy' and sys_platform == 'darwin'", + "python_full_version >= '3.13' and platform_machine == 'aarch64' and platform_python_implementation == 'PyPy' and sys_platform == 'linux'", + "(python_full_version >= '3.13' and platform_machine != 'aarch64' and platform_python_implementation == 'PyPy' and sys_platform == 'linux') or (python_full_version >= '3.13' and platform_python_implementation == 'PyPy' and sys_platform != 'darwin' and sys_platform != 'linux')", + "python_full_version == '3.12.*' and platform_python_implementation == 'PyPy' and sys_platform == 'darwin'", + "python_full_version == '3.12.*' and platform_machine == 'aarch64' and platform_python_implementation == 'PyPy' and sys_platform == 'linux'", + "(python_full_version == '3.12.*' and platform_machine != 'aarch64' and platform_python_implementation == 'PyPy' and sys_platform == 'linux') or (python_full_version == '3.12.*' and platform_python_implementation == 'PyPy' and sys_platform != 'darwin' and sys_platform != 'linux')", + "python_full_version == '3.11.*' and platform_python_implementation == 'PyPy' and sys_platform == 'darwin'", + "python_full_version == '3.11.*' and platform_machine == 'aarch64' and platform_python_implementation == 'PyPy' and sys_platform == 'linux'", + "(python_full_version == '3.11.*' and platform_machine != 'aarch64' and platform_python_implementation == 'PyPy' and sys_platform == 'linux') or (python_full_version == '3.11.*' and platform_python_implementation == 'PyPy' and sys_platform != 'darwin' and sys_platform != 'linux')", ] dependencies = [ { name = "colorama", marker = "python_full_version >= '3.11' and sys_platform == 'win32'" }, @@ -2774,9 +2776,9 @@ dependencies = [ { name = "traitlets", marker = "python_full_version >= '3.11'" }, { name = "typing-extensions", marker = "python_full_version == '3.11.*'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/6e/71/a86262bf5a68bf211bcc71fe302af7e05f18a2852fdc610a854d20d085e6/ipython-9.5.0.tar.gz", hash = "sha256:129c44b941fe6d9b82d36fc7a7c18127ddb1d6f02f78f867f402e2e3adde3113", size = 4389137, upload-time = "2025-08-29T12:15:21.519Z" } +sdist = { url = "https://files.pythonhosted.org/packages/2a/34/29b18c62e39ee2f7a6a3bba7efd952729d8aadd45ca17efc34453b717665/ipython-9.6.0.tar.gz", hash = "sha256:5603d6d5d356378be5043e69441a072b50a5b33b4503428c77b04cb8ce7bc731", size = 4396932, upload-time = "2025-09-29T10:55:53.948Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/08/2a/5628a99d04acb2d2f2e749cdf4ea571d2575e898df0528a090948018b726/ipython-9.5.0-py3-none-any.whl", hash = "sha256:88369ffa1d5817d609120daa523a6da06d02518e582347c29f8451732a9c5e72", size = 612426, upload-time = "2025-08-29T12:15:18.866Z" }, + { url = "https://files.pythonhosted.org/packages/48/c5/d5e07995077e48220269c28a221e168c91123ad5ceee44d548f54a057fc0/ipython-9.6.0-py3-none-any.whl", hash = "sha256:5f77efafc886d2f023442479b8149e7d86547ad0a979e9da9f045d252f648196", size = 616170, upload-time = "2025-09-29T10:55:47.676Z" }, ] [[package]] @@ -3110,7 +3112,7 @@ wheels = [ [[package]] name = "lance-namespace-urllib3-client" -version = "0.0.15" +version = "0.0.17" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "pydantic" }, @@ -3119,9 +3121,9 @@ dependencies = [ { name = "urllib3", version = "1.26.20", source = { registry = "https://pypi.org/simple" }, marker = "platform_python_implementation == 'PyPy'" }, { name = "urllib3", version = "2.5.0", source = { registry = "https://pypi.org/simple" }, marker = "platform_python_implementation != 'PyPy'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/a8/14/023f12f2d1e624965a361b535b94cc65dfd949d7325e85372f3eb1c75a95/lance_namespace_urllib3_client-0.0.15.tar.gz", hash = "sha256:27a7bf3add1c03ed5e9ccbf83632b2d5468c4d0e1d2fd7a7fe612d9e70934113", size = 134497, upload-time = "2025-09-24T05:46:10.2Z" } +sdist = { url = "https://files.pythonhosted.org/packages/1c/1a/acdd230c172c031025bd5f5d5a07038b8c2733d1a90e7c71e910e9178be5/lance_namespace_urllib3_client-0.0.17.tar.gz", hash = "sha256:c8244671a02531b2076c2bb6061cd36e02e630ea2f942995f65afd6059e094df", size = 134493, upload-time = "2025-10-01T04:39:53.249Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/e7/7d/76f92398313658be01b982f29fb2407bf2ed0f920b49d00628b97618ee96/lance_namespace_urllib3_client-0.0.15-py3-none-any.whl", hash = "sha256:ea931c557489002bff212a21f3929827c8ad9cb7c626747714e120a47698ffdd", size = 229640, upload-time = "2025-09-24T05:46:08.795Z" }, + { url = "https://files.pythonhosted.org/packages/b6/fa/5abe475614f763df6ea3ea48bff7a4affc36e4d73726fe9ca8810169d0a7/lance_namespace_urllib3_client-0.0.17-py3-none-any.whl", hash = "sha256:c4364c9b5702865d00bdd17172ae6a971a287dbe0713f7042025d31d4fdbcb03", size = 229640, upload-time = "2025-10-01T04:39:52.242Z" }, ] [[package]] @@ -3165,7 +3167,7 @@ wheels = [ [[package]] name = "langchain-core" -version = "0.3.76" +version = "0.3.77" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "jsonpatch" }, @@ -3176,9 +3178,9 @@ dependencies = [ { name = "tenacity" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/4f/4d/5e2ea7754ee0a1f524c412801c6ba9ad49318ecb58b0d524903c3d9efe0a/langchain_core-0.3.76.tar.gz", hash = "sha256:71136a122dd1abae2c289c5809d035cf12b5f2bb682d8a4c1078cd94feae7419", size = 573568, upload-time = "2025-09-10T14:49:39.863Z" } +sdist = { url = "https://files.pythonhosted.org/packages/40/cc/786184e5f6a921a2aa4d2ac51d3adf0cd037289f3becff39644bee9654ee/langchain_core-0.3.77.tar.gz", hash = "sha256:1d6f2ad6bb98dd806c6c66a822fa93808d821e9f0348b28af0814b3a149830e7", size = 580255, upload-time = "2025-10-01T14:34:37.368Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/77/b5/501c0ffcb09c734457ceaa86bc7b1dd37b6a261147bd653add03b838aacb/langchain_core-0.3.76-py3-none-any.whl", hash = "sha256:46e0eb48c7ac532432d51f8ca1ece1804c82afe9ae3dcf027b867edadf82b3ec", size = 447508, upload-time = "2025-09-10T14:49:38.179Z" }, + { url = "https://files.pythonhosted.org/packages/64/18/e7462ae0ce57caa9f6d5d975dca861e9a751e5ca253d60a809e0d833eac3/langchain_core-0.3.77-py3-none-any.whl", hash = "sha256:9966dfe3d8365847c5fb85f97dd20e3e21b1904ae87cfd9d362b7196fb516637", size = 449525, upload-time = "2025-10-01T14:34:35.672Z" }, ] [[package]] @@ -3988,12 +3990,12 @@ name = "networkx" version = "3.4.2" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version < '3.11' and platform_python_implementation == 'PyPy' and sys_platform == 'darwin'", "python_full_version < '3.11' and platform_python_implementation != 'PyPy' and sys_platform == 'darwin'", - "python_full_version < '3.11' and platform_machine == 'aarch64' and platform_python_implementation == 'PyPy' and sys_platform == 'linux'", "python_full_version < '3.11' and platform_machine == 'aarch64' and platform_python_implementation != 'PyPy' and sys_platform == 'linux'", - "(python_full_version < '3.11' and platform_machine != 'aarch64' and platform_python_implementation == 'PyPy' and sys_platform == 'linux') or (python_full_version < '3.11' and platform_python_implementation == 'PyPy' and sys_platform != 'darwin' and sys_platform != 'linux')", "(python_full_version < '3.11' and platform_machine != 'aarch64' and platform_python_implementation != 'PyPy' and sys_platform == 'linux') or (python_full_version < '3.11' and platform_python_implementation != 'PyPy' and sys_platform != 'darwin' and sys_platform != 'linux')", + "python_full_version < '3.11' and platform_python_implementation == 'PyPy' and sys_platform == 'darwin'", + "python_full_version < '3.11' and platform_machine == 'aarch64' and platform_python_implementation == 'PyPy' and sys_platform == 'linux'", + "(python_full_version < '3.11' and platform_machine != 'aarch64' and platform_python_implementation == 'PyPy' and sys_platform == 'linux') or (python_full_version < '3.11' and platform_python_implementation == 'PyPy' and sys_platform != 'darwin' and sys_platform != 'linux')", ] sdist = { url = "https://files.pythonhosted.org/packages/fd/1d/06475e1cd5264c0b870ea2cc6fdb3e37177c1e565c43f56ff17a10e3937f/networkx-3.4.2.tar.gz", hash = "sha256:307c3669428c5362aab27c8a1260aa8f47c4e91d3891f48be0141738d8d053e1", size = 2151368, upload-time = "2024-10-21T12:39:38.695Z" } wheels = [ @@ -4005,24 +4007,24 @@ name = "networkx" version = "3.5" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version >= '3.13' and platform_python_implementation == 'PyPy' and sys_platform == 'darwin'", - "python_full_version >= '3.13' and platform_machine == 'aarch64' and platform_python_implementation == 'PyPy' and sys_platform == 'linux'", - "(python_full_version >= '3.13' and platform_machine != 'aarch64' and platform_python_implementation == 'PyPy' and sys_platform == 'linux') or (python_full_version >= '3.13' and platform_python_implementation == 'PyPy' and sys_platform != 'darwin' and sys_platform != 'linux')", "python_full_version >= '3.13' and platform_python_implementation != 'PyPy' and sys_platform == 'darwin'", "python_full_version >= '3.13' and platform_machine == 'aarch64' and platform_python_implementation != 'PyPy' and sys_platform == 'linux'", "(python_full_version >= '3.13' and platform_machine != 'aarch64' and platform_python_implementation != 'PyPy' and sys_platform == 'linux') or (python_full_version >= '3.13' and platform_python_implementation != 'PyPy' and sys_platform != 'darwin' and sys_platform != 'linux')", - "python_full_version == '3.12.*' and platform_python_implementation == 'PyPy' and sys_platform == 'darwin'", "python_full_version == '3.12.*' and platform_python_implementation != 'PyPy' and sys_platform == 'darwin'", - "python_full_version == '3.12.*' and platform_machine == 'aarch64' and platform_python_implementation == 'PyPy' and sys_platform == 'linux'", "python_full_version == '3.12.*' and platform_machine == 'aarch64' and platform_python_implementation != 'PyPy' and sys_platform == 'linux'", - "(python_full_version == '3.12.*' and platform_machine != 'aarch64' and platform_python_implementation == 'PyPy' and sys_platform == 'linux') or (python_full_version == '3.12.*' and platform_python_implementation == 'PyPy' and sys_platform != 'darwin' and sys_platform != 'linux')", "(python_full_version == '3.12.*' and platform_machine != 'aarch64' and platform_python_implementation != 'PyPy' and sys_platform == 'linux') or (python_full_version == '3.12.*' and platform_python_implementation != 'PyPy' and sys_platform != 'darwin' and sys_platform != 'linux')", - "python_full_version == '3.11.*' and platform_python_implementation == 'PyPy' and sys_platform == 'darwin'", "python_full_version == '3.11.*' and platform_python_implementation != 'PyPy' and sys_platform == 'darwin'", - "python_full_version == '3.11.*' and platform_machine == 'aarch64' and platform_python_implementation == 'PyPy' and sys_platform == 'linux'", "python_full_version == '3.11.*' and platform_machine == 'aarch64' and platform_python_implementation != 'PyPy' and sys_platform == 'linux'", - "(python_full_version == '3.11.*' and platform_machine != 'aarch64' and platform_python_implementation == 'PyPy' and sys_platform == 'linux') or (python_full_version == '3.11.*' and platform_python_implementation == 'PyPy' and sys_platform != 'darwin' and sys_platform != 'linux')", "(python_full_version == '3.11.*' and platform_machine != 'aarch64' and platform_python_implementation != 'PyPy' and sys_platform == 'linux') or (python_full_version == '3.11.*' and platform_python_implementation != 'PyPy' and sys_platform != 'darwin' and sys_platform != 'linux')", + "python_full_version >= '3.13' and platform_python_implementation == 'PyPy' and sys_platform == 'darwin'", + "python_full_version >= '3.13' and platform_machine == 'aarch64' and platform_python_implementation == 'PyPy' and sys_platform == 'linux'", + "(python_full_version >= '3.13' and platform_machine != 'aarch64' and platform_python_implementation == 'PyPy' and sys_platform == 'linux') or (python_full_version >= '3.13' and platform_python_implementation == 'PyPy' and sys_platform != 'darwin' and sys_platform != 'linux')", + "python_full_version == '3.12.*' and platform_python_implementation == 'PyPy' and sys_platform == 'darwin'", + "python_full_version == '3.12.*' and platform_machine == 'aarch64' and platform_python_implementation == 'PyPy' and sys_platform == 'linux'", + "(python_full_version == '3.12.*' and platform_machine != 'aarch64' and platform_python_implementation == 'PyPy' and sys_platform == 'linux') or (python_full_version == '3.12.*' and platform_python_implementation == 'PyPy' and sys_platform != 'darwin' and sys_platform != 'linux')", + "python_full_version == '3.11.*' and platform_python_implementation == 'PyPy' and sys_platform == 'darwin'", + "python_full_version == '3.11.*' and platform_machine == 'aarch64' and platform_python_implementation == 'PyPy' and sys_platform == 'linux'", + "(python_full_version == '3.11.*' and platform_machine != 'aarch64' and platform_python_implementation == 'PyPy' and sys_platform == 'linux') or (python_full_version == '3.11.*' and platform_python_implementation == 'PyPy' and sys_platform != 'darwin' and sys_platform != 'linux')", ] sdist = { url = "https://files.pythonhosted.org/packages/6c/4f/ccdb8ad3a38e583f214547fd2f7ff1fc160c43a75af88e6aec213404b96a/networkx-3.5.tar.gz", hash = "sha256:d4c6f9cf81f52d69230866796b82afbccdec3db7ae4fbd1b65ea750feed50037", size = 2471065, upload-time = "2025-05-29T11:35:07.804Z" } wheels = [ @@ -4057,7 +4059,7 @@ wheels = [ [[package]] name = "nltk" -version = "3.9.1" +version = "3.9.2" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "click" }, @@ -4065,9 +4067,9 @@ dependencies = [ { name = "regex" }, { name = "tqdm" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/3c/87/db8be88ad32c2d042420b6fd9ffd4a149f9a0d7f0e86b3f543be2eeeedd2/nltk-3.9.1.tar.gz", hash = "sha256:87d127bd3de4bd89a4f81265e5fa59cb1b199b27440175370f7417d2bc7ae868", size = 2904691, upload-time = "2024-08-18T19:48:37.769Z" } +sdist = { url = "https://files.pythonhosted.org/packages/f9/76/3a5e4312c19a028770f86fd7c058cf9f4ec4321c6cf7526bab998a5b683c/nltk-3.9.2.tar.gz", hash = "sha256:0f409e9b069ca4177c1903c3e843eef90c7e92992fa4931ae607da6de49e1419", size = 2887629, upload-time = "2025-10-01T07:19:23.764Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/4d/66/7d9e26593edda06e8cb531874633f7c2372279c3b0f46235539fe546df8b/nltk-3.9.1-py3-none-any.whl", hash = "sha256:4fa26829c5b00715afe3061398a8989dc643b92ce7dd93fb4585a70930d168a1", size = 1505442, upload-time = "2024-08-18T19:48:21.909Z" }, + { url = "https://files.pythonhosted.org/packages/60/90/81ac364ef94209c100e12579629dc92bf7a709a84af32f8c551b02c07e94/nltk-3.9.2-py3-none-any.whl", hash = "sha256:1e209d2b3009110635ed9709a67a1a3e33a10f799490fa71cf4bec218c11c88a", size = 1513404, upload-time = "2025-10-01T07:19:21.648Z" }, ] [[package]] @@ -4084,12 +4086,12 @@ name = "numpy" version = "2.2.6" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version < '3.11' and platform_python_implementation == 'PyPy' and sys_platform == 'darwin'", "python_full_version < '3.11' and platform_python_implementation != 'PyPy' and sys_platform == 'darwin'", - "python_full_version < '3.11' and platform_machine == 'aarch64' and platform_python_implementation == 'PyPy' and sys_platform == 'linux'", "python_full_version < '3.11' and platform_machine == 'aarch64' and platform_python_implementation != 'PyPy' and sys_platform == 'linux'", - "(python_full_version < '3.11' and platform_machine != 'aarch64' and platform_python_implementation == 'PyPy' and sys_platform == 'linux') or (python_full_version < '3.11' and platform_python_implementation == 'PyPy' and sys_platform != 'darwin' and sys_platform != 'linux')", "(python_full_version < '3.11' and platform_machine != 'aarch64' and platform_python_implementation != 'PyPy' and sys_platform == 'linux') or (python_full_version < '3.11' and platform_python_implementation != 'PyPy' and sys_platform != 'darwin' and sys_platform != 'linux')", + "python_full_version < '3.11' and platform_python_implementation == 'PyPy' and sys_platform == 'darwin'", + "python_full_version < '3.11' and platform_machine == 'aarch64' and platform_python_implementation == 'PyPy' and sys_platform == 'linux'", + "(python_full_version < '3.11' and platform_machine != 'aarch64' and platform_python_implementation == 'PyPy' and sys_platform == 'linux') or (python_full_version < '3.11' and platform_python_implementation == 'PyPy' and sys_platform != 'darwin' and sys_platform != 'linux')", ] sdist = { url = "https://files.pythonhosted.org/packages/76/21/7d2a95e4bba9dc13d043ee156a356c0a8f0c6309dff6b21b4d71a073b8a8/numpy-2.2.6.tar.gz", hash = "sha256:e29554e2bef54a90aa5cc07da6ce955accb83f21ab5de01a62c8478897b264fd", size = 20276440, upload-time = "2025-05-17T22:38:04.611Z" } wheels = [ @@ -4154,24 +4156,24 @@ name = "numpy" version = "2.3.3" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version >= '3.13' and platform_python_implementation == 'PyPy' and sys_platform == 'darwin'", - "python_full_version >= '3.13' and platform_machine == 'aarch64' and platform_python_implementation == 'PyPy' and sys_platform == 'linux'", - "(python_full_version >= '3.13' and platform_machine != 'aarch64' and platform_python_implementation == 'PyPy' and sys_platform == 'linux') or (python_full_version >= '3.13' and platform_python_implementation == 'PyPy' and sys_platform != 'darwin' and sys_platform != 'linux')", "python_full_version >= '3.13' and platform_python_implementation != 'PyPy' and sys_platform == 'darwin'", "python_full_version >= '3.13' and platform_machine == 'aarch64' and platform_python_implementation != 'PyPy' and sys_platform == 'linux'", "(python_full_version >= '3.13' and platform_machine != 'aarch64' and platform_python_implementation != 'PyPy' and sys_platform == 'linux') or (python_full_version >= '3.13' and platform_python_implementation != 'PyPy' and sys_platform != 'darwin' and sys_platform != 'linux')", - "python_full_version == '3.12.*' and platform_python_implementation == 'PyPy' and sys_platform == 'darwin'", "python_full_version == '3.12.*' and platform_python_implementation != 'PyPy' and sys_platform == 'darwin'", - "python_full_version == '3.12.*' and platform_machine == 'aarch64' and platform_python_implementation == 'PyPy' and sys_platform == 'linux'", "python_full_version == '3.12.*' and platform_machine == 'aarch64' and platform_python_implementation != 'PyPy' and sys_platform == 'linux'", - "(python_full_version == '3.12.*' and platform_machine != 'aarch64' and platform_python_implementation == 'PyPy' and sys_platform == 'linux') or (python_full_version == '3.12.*' and platform_python_implementation == 'PyPy' and sys_platform != 'darwin' and sys_platform != 'linux')", "(python_full_version == '3.12.*' and platform_machine != 'aarch64' and platform_python_implementation != 'PyPy' and sys_platform == 'linux') or (python_full_version == '3.12.*' and platform_python_implementation != 'PyPy' and sys_platform != 'darwin' and sys_platform != 'linux')", - "python_full_version == '3.11.*' and platform_python_implementation == 'PyPy' and sys_platform == 'darwin'", "python_full_version == '3.11.*' and platform_python_implementation != 'PyPy' and sys_platform == 'darwin'", - "python_full_version == '3.11.*' and platform_machine == 'aarch64' and platform_python_implementation == 'PyPy' and sys_platform == 'linux'", "python_full_version == '3.11.*' and platform_machine == 'aarch64' and platform_python_implementation != 'PyPy' and sys_platform == 'linux'", - "(python_full_version == '3.11.*' and platform_machine != 'aarch64' and platform_python_implementation == 'PyPy' and sys_platform == 'linux') or (python_full_version == '3.11.*' and platform_python_implementation == 'PyPy' and sys_platform != 'darwin' and sys_platform != 'linux')", "(python_full_version == '3.11.*' and platform_machine != 'aarch64' and platform_python_implementation != 'PyPy' and sys_platform == 'linux') or (python_full_version == '3.11.*' and platform_python_implementation != 'PyPy' and sys_platform != 'darwin' and sys_platform != 'linux')", + "python_full_version >= '3.13' and platform_python_implementation == 'PyPy' and sys_platform == 'darwin'", + "python_full_version >= '3.13' and platform_machine == 'aarch64' and platform_python_implementation == 'PyPy' and sys_platform == 'linux'", + "(python_full_version >= '3.13' and platform_machine != 'aarch64' and platform_python_implementation == 'PyPy' and sys_platform == 'linux') or (python_full_version >= '3.13' and platform_python_implementation == 'PyPy' and sys_platform != 'darwin' and sys_platform != 'linux')", + "python_full_version == '3.12.*' and platform_python_implementation == 'PyPy' and sys_platform == 'darwin'", + "python_full_version == '3.12.*' and platform_machine == 'aarch64' and platform_python_implementation == 'PyPy' and sys_platform == 'linux'", + "(python_full_version == '3.12.*' and platform_machine != 'aarch64' and platform_python_implementation == 'PyPy' and sys_platform == 'linux') or (python_full_version == '3.12.*' and platform_python_implementation == 'PyPy' and sys_platform != 'darwin' and sys_platform != 'linux')", + "python_full_version == '3.11.*' and platform_python_implementation == 'PyPy' and sys_platform == 'darwin'", + "python_full_version == '3.11.*' and platform_machine == 'aarch64' and platform_python_implementation == 'PyPy' and sys_platform == 'linux'", + "(python_full_version == '3.11.*' and platform_machine != 'aarch64' and platform_python_implementation == 'PyPy' and sys_platform == 'linux') or (python_full_version == '3.11.*' and platform_python_implementation == 'PyPy' and sys_platform != 'darwin' and sys_platform != 'linux')", ] sdist = { url = "https://files.pythonhosted.org/packages/d0/19/95b3d357407220ed24c139018d2518fab0a61a948e68286a25f1a4d049ff/numpy-2.3.3.tar.gz", hash = "sha256:ddc7c39727ba62b80dfdbedf400d1c10ddfa8eefbd7ec8dcb118be8b56d31029", size = 20576648, upload-time = "2025-09-09T16:54:12.543Z" } wheels = [ @@ -4265,7 +4267,7 @@ name = "nvidia-cudnn-cu12" version = "9.10.2.21" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "nvidia-cublas-cu12", marker = "(platform_machine != 'aarch64' and sys_platform == 'linux') or (sys_platform != 'darwin' and sys_platform != 'linux')" }, + { name = "nvidia-cublas-cu12" }, ] wheels = [ { url = "https://files.pythonhosted.org/packages/ba/51/e123d997aa098c61d029f76663dedbfb9bc8dcf8c60cbd6adbe42f76d049/nvidia_cudnn_cu12-9.10.2.21-py3-none-manylinux_2_27_x86_64.whl", hash = "sha256:949452be657fa16687d0930933f032835951ef0892b37d2d53824d1a84dc97a8", size = 706758467, upload-time = "2025-06-06T21:54:08.597Z" }, @@ -4276,7 +4278,7 @@ name = "nvidia-cufft-cu12" version = "11.3.3.83" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "nvidia-nvjitlink-cu12", marker = "(platform_machine != 'aarch64' and sys_platform == 'linux') or (sys_platform != 'darwin' and sys_platform != 'linux')" }, + { name = "nvidia-nvjitlink-cu12" }, ] wheels = [ { url = "https://files.pythonhosted.org/packages/1f/13/ee4e00f30e676b66ae65b4f08cb5bcbb8392c03f54f2d5413ea99a5d1c80/nvidia_cufft_cu12-11.3.3.83-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:4d2dd21ec0b88cf61b62e6b43564355e5222e4a3fb394cac0db101f2dd0d4f74", size = 193118695, upload-time = "2025-03-07T01:45:27.821Z" }, @@ -4303,9 +4305,9 @@ name = "nvidia-cusolver-cu12" version = "11.7.3.90" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "nvidia-cublas-cu12", marker = "(platform_machine != 'aarch64' and sys_platform == 'linux') or (sys_platform != 'darwin' and sys_platform != 'linux')" }, - { name = "nvidia-cusparse-cu12", marker = "(platform_machine != 'aarch64' and sys_platform == 'linux') or (sys_platform != 'darwin' and sys_platform != 'linux')" }, - { name = "nvidia-nvjitlink-cu12", marker = "(platform_machine != 'aarch64' and sys_platform == 'linux') or (sys_platform != 'darwin' and sys_platform != 'linux')" }, + { name = "nvidia-cublas-cu12" }, + { name = "nvidia-cusparse-cu12" }, + { name = "nvidia-nvjitlink-cu12" }, ] wheels = [ { url = "https://files.pythonhosted.org/packages/85/48/9a13d2975803e8cf2777d5ed57b87a0b6ca2cc795f9a4f59796a910bfb80/nvidia_cusolver_cu12-11.7.3.90-py3-none-manylinux_2_27_x86_64.whl", hash = "sha256:4376c11ad263152bd50ea295c05370360776f8c3427b30991df774f9fb26c450", size = 267506905, upload-time = "2025-03-07T01:47:16.273Z" }, @@ -4316,7 +4318,7 @@ name = "nvidia-cusparse-cu12" version = "12.5.8.93" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "nvidia-nvjitlink-cu12", marker = "(platform_machine != 'aarch64' and sys_platform == 'linux') or (sys_platform != 'darwin' and sys_platform != 'linux')" }, + { name = "nvidia-nvjitlink-cu12" }, ] wheels = [ { url = "https://files.pythonhosted.org/packages/c2/f5/e1854cb2f2bcd4280c44736c93550cc300ff4b8c95ebe370d0aa7d2b473d/nvidia_cusparse_cu12-12.5.8.93-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:1ec05d76bbbd8b61b06a80e1eaf8cf4959c3d4ce8e711b65ebd0443bb0ebb13b", size = 288216466, upload-time = "2025-03-07T01:48:13.779Z" }, @@ -6032,14 +6034,14 @@ wheels = [ [[package]] name = "pypdf" -version = "6.1.0" +version = "6.1.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "typing-extensions", marker = "python_full_version < '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/0b/ac/44d86f16b8ad9b42ea1da4b9aa145be71c89927566d9be87fe74bda1dfef/pypdf-6.1.0.tar.gz", hash = "sha256:0cba440d024da5a2a9304f03cd645346052827b84c5a461c6123e24ed5a3b0b9", size = 5072609, upload-time = "2025-09-21T13:38:39.1Z" } +sdist = { url = "https://files.pythonhosted.org/packages/a6/85/4c0f12616db83c2e3ef580c3cfa98bd082e88fc8d02e136bad3bede1e3fa/pypdf-6.1.1.tar.gz", hash = "sha256:10f44d49bf2a82e54c3c5ba3cdcbb118f2a44fc57df8ce51d6fb9b1ed9bfbe8b", size = 5074507, upload-time = "2025-09-28T13:29:16.165Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/07/f3/4939b609cfd374e495450b22a0385ee3f531e9aa40e8812e5c405f030c54/pypdf-6.1.0-py3-none-any.whl", hash = "sha256:6b34e4147df20978bf270af19826692e0485431a9d3944617b9533bc77efb695", size = 322468, upload-time = "2025-09-21T13:38:37.467Z" }, + { url = "https://files.pythonhosted.org/packages/07/ed/adae13756d9dabdddee483fc7712905bb5585fbf6e922b1a19aca3a29cd1/pypdf-6.1.1-py3-none-any.whl", hash = "sha256:7781f99493208a37a7d4275601d883e19af24e62a525c25844d22157c2e4cde7", size = 323455, upload-time = "2025-09-28T13:29:14.392Z" }, ] [[package]] @@ -6422,7 +6424,7 @@ version = "0.3.2" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "ipython", version = "8.37.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, - { name = "ipython", version = "9.5.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "ipython", version = "9.6.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, { name = "jinja2" }, { name = "jsonpickle" }, { name = "networkx", version = "3.4.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, @@ -6966,7 +6968,7 @@ dependencies = [ { name = "scipy", version = "1.15.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "scipy", version = "1.16.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, { name = "tifffile", version = "2025.5.10", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, - { name = "tifffile", version = "2025.9.20", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "tifffile", version = "2025.9.30", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/c7/a8/3c0f256012b93dd2cb6fda9245e9f4bff7dc0486880b248005f15ea2255e/scikit_image-0.25.2.tar.gz", hash = "sha256:e5a37e6cd4d0c018a7a55b9d601357e3382826d3888c10d0213fc63bff977dde", size = 22693594, upload-time = "2025-02-18T18:05:24.538Z" } wheels = [ @@ -6998,12 +7000,12 @@ name = "scipy" version = "1.15.3" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version < '3.11' and platform_python_implementation == 'PyPy' and sys_platform == 'darwin'", "python_full_version < '3.11' and platform_python_implementation != 'PyPy' and sys_platform == 'darwin'", - "python_full_version < '3.11' and platform_machine == 'aarch64' and platform_python_implementation == 'PyPy' and sys_platform == 'linux'", "python_full_version < '3.11' and platform_machine == 'aarch64' and platform_python_implementation != 'PyPy' and sys_platform == 'linux'", - "(python_full_version < '3.11' and platform_machine != 'aarch64' and platform_python_implementation == 'PyPy' and sys_platform == 'linux') or (python_full_version < '3.11' and platform_python_implementation == 'PyPy' and sys_platform != 'darwin' and sys_platform != 'linux')", "(python_full_version < '3.11' and platform_machine != 'aarch64' and platform_python_implementation != 'PyPy' and sys_platform == 'linux') or (python_full_version < '3.11' and platform_python_implementation != 'PyPy' and sys_platform != 'darwin' and sys_platform != 'linux')", + "python_full_version < '3.11' and platform_python_implementation == 'PyPy' and sys_platform == 'darwin'", + "python_full_version < '3.11' and platform_machine == 'aarch64' and platform_python_implementation == 'PyPy' and sys_platform == 'linux'", + "(python_full_version < '3.11' and platform_machine != 'aarch64' and platform_python_implementation == 'PyPy' and sys_platform == 'linux') or (python_full_version < '3.11' and platform_python_implementation == 'PyPy' and sys_platform != 'darwin' and sys_platform != 'linux')", ] dependencies = [ { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, @@ -7062,24 +7064,24 @@ name = "scipy" version = "1.16.2" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version >= '3.13' and platform_python_implementation == 'PyPy' and sys_platform == 'darwin'", - "python_full_version >= '3.13' and platform_machine == 'aarch64' and platform_python_implementation == 'PyPy' and sys_platform == 'linux'", - "(python_full_version >= '3.13' and platform_machine != 'aarch64' and platform_python_implementation == 'PyPy' and sys_platform == 'linux') or (python_full_version >= '3.13' and platform_python_implementation == 'PyPy' and sys_platform != 'darwin' and sys_platform != 'linux')", "python_full_version >= '3.13' and platform_python_implementation != 'PyPy' and sys_platform == 'darwin'", "python_full_version >= '3.13' and platform_machine == 'aarch64' and platform_python_implementation != 'PyPy' and sys_platform == 'linux'", "(python_full_version >= '3.13' and platform_machine != 'aarch64' and platform_python_implementation != 'PyPy' and sys_platform == 'linux') or (python_full_version >= '3.13' and platform_python_implementation != 'PyPy' and sys_platform != 'darwin' and sys_platform != 'linux')", - "python_full_version == '3.12.*' and platform_python_implementation == 'PyPy' and sys_platform == 'darwin'", "python_full_version == '3.12.*' and platform_python_implementation != 'PyPy' and sys_platform == 'darwin'", - "python_full_version == '3.12.*' and platform_machine == 'aarch64' and platform_python_implementation == 'PyPy' and sys_platform == 'linux'", "python_full_version == '3.12.*' and platform_machine == 'aarch64' and platform_python_implementation != 'PyPy' and sys_platform == 'linux'", - "(python_full_version == '3.12.*' and platform_machine != 'aarch64' and platform_python_implementation == 'PyPy' and sys_platform == 'linux') or (python_full_version == '3.12.*' and platform_python_implementation == 'PyPy' and sys_platform != 'darwin' and sys_platform != 'linux')", "(python_full_version == '3.12.*' and platform_machine != 'aarch64' and platform_python_implementation != 'PyPy' and sys_platform == 'linux') or (python_full_version == '3.12.*' and platform_python_implementation != 'PyPy' and sys_platform != 'darwin' and sys_platform != 'linux')", - "python_full_version == '3.11.*' and platform_python_implementation == 'PyPy' and sys_platform == 'darwin'", "python_full_version == '3.11.*' and platform_python_implementation != 'PyPy' and sys_platform == 'darwin'", - "python_full_version == '3.11.*' and platform_machine == 'aarch64' and platform_python_implementation == 'PyPy' and sys_platform == 'linux'", "python_full_version == '3.11.*' and platform_machine == 'aarch64' and platform_python_implementation != 'PyPy' and sys_platform == 'linux'", - "(python_full_version == '3.11.*' and platform_machine != 'aarch64' and platform_python_implementation == 'PyPy' and sys_platform == 'linux') or (python_full_version == '3.11.*' and platform_python_implementation == 'PyPy' and sys_platform != 'darwin' and sys_platform != 'linux')", "(python_full_version == '3.11.*' and platform_machine != 'aarch64' and platform_python_implementation != 'PyPy' and sys_platform == 'linux') or (python_full_version == '3.11.*' and platform_python_implementation != 'PyPy' and sys_platform != 'darwin' and sys_platform != 'linux')", + "python_full_version >= '3.13' and platform_python_implementation == 'PyPy' and sys_platform == 'darwin'", + "python_full_version >= '3.13' and platform_machine == 'aarch64' and platform_python_implementation == 'PyPy' and sys_platform == 'linux'", + "(python_full_version >= '3.13' and platform_machine != 'aarch64' and platform_python_implementation == 'PyPy' and sys_platform == 'linux') or (python_full_version >= '3.13' and platform_python_implementation == 'PyPy' and sys_platform != 'darwin' and sys_platform != 'linux')", + "python_full_version == '3.12.*' and platform_python_implementation == 'PyPy' and sys_platform == 'darwin'", + "python_full_version == '3.12.*' and platform_machine == 'aarch64' and platform_python_implementation == 'PyPy' and sys_platform == 'linux'", + "(python_full_version == '3.12.*' and platform_machine != 'aarch64' and platform_python_implementation == 'PyPy' and sys_platform == 'linux') or (python_full_version == '3.12.*' and platform_python_implementation == 'PyPy' and sys_platform != 'darwin' and sys_platform != 'linux')", + "python_full_version == '3.11.*' and platform_python_implementation == 'PyPy' and sys_platform == 'darwin'", + "python_full_version == '3.11.*' and platform_machine == 'aarch64' and platform_python_implementation == 'PyPy' and sys_platform == 'linux'", + "(python_full_version == '3.11.*' and platform_machine != 'aarch64' and platform_python_implementation == 'PyPy' and sys_platform == 'linux') or (python_full_version == '3.11.*' and platform_python_implementation == 'PyPy' and sys_platform != 'darwin' and sys_platform != 'linux')", ] dependencies = [ { name = "numpy", version = "2.3.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, @@ -7166,20 +7168,64 @@ wheels = [ name = "selenium" version = "4.32.0" source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.13' and platform_python_implementation == 'PyPy' and sys_platform == 'darwin'", + "python_full_version >= '3.13' and platform_machine == 'aarch64' and platform_python_implementation == 'PyPy' and sys_platform == 'linux'", + "(python_full_version >= '3.13' and platform_machine != 'aarch64' and platform_python_implementation == 'PyPy' and sys_platform == 'linux') or (python_full_version >= '3.13' and platform_python_implementation == 'PyPy' and sys_platform != 'darwin' and sys_platform != 'linux')", + "python_full_version == '3.12.*' and platform_python_implementation == 'PyPy' and sys_platform == 'darwin'", + "python_full_version == '3.12.*' and platform_machine == 'aarch64' and platform_python_implementation == 'PyPy' and sys_platform == 'linux'", + "(python_full_version == '3.12.*' and platform_machine != 'aarch64' and platform_python_implementation == 'PyPy' and sys_platform == 'linux') or (python_full_version == '3.12.*' and platform_python_implementation == 'PyPy' and sys_platform != 'darwin' and sys_platform != 'linux')", + "python_full_version == '3.11.*' and platform_python_implementation == 'PyPy' and sys_platform == 'darwin'", + "python_full_version == '3.11.*' and platform_machine == 'aarch64' and platform_python_implementation == 'PyPy' and sys_platform == 'linux'", + "(python_full_version == '3.11.*' and platform_machine != 'aarch64' and platform_python_implementation == 'PyPy' and sys_platform == 'linux') or (python_full_version == '3.11.*' and platform_python_implementation == 'PyPy' and sys_platform != 'darwin' and sys_platform != 'linux')", + "python_full_version < '3.11' and platform_python_implementation == 'PyPy' and sys_platform == 'darwin'", + "python_full_version < '3.11' and platform_machine == 'aarch64' and platform_python_implementation == 'PyPy' and sys_platform == 'linux'", + "(python_full_version < '3.11' and platform_machine != 'aarch64' and platform_python_implementation == 'PyPy' and sys_platform == 'linux') or (python_full_version < '3.11' and platform_python_implementation == 'PyPy' and sys_platform != 'darwin' and sys_platform != 'linux')", +] dependencies = [ - { name = "certifi" }, - { name = "trio" }, - { name = "trio-websocket" }, - { name = "typing-extensions" }, + { name = "certifi", marker = "platform_python_implementation == 'PyPy'" }, + { name = "trio", marker = "platform_python_implementation == 'PyPy'" }, + { name = "trio-websocket", marker = "platform_python_implementation == 'PyPy'" }, + { name = "typing-extensions", marker = "platform_python_implementation == 'PyPy'" }, { name = "urllib3", version = "1.26.20", source = { registry = "https://pypi.org/simple" }, extra = ["socks"], marker = "platform_python_implementation == 'PyPy'" }, - { name = "urllib3", version = "2.5.0", source = { registry = "https://pypi.org/simple" }, extra = ["socks"], marker = "platform_python_implementation != 'PyPy'" }, - { name = "websocket-client" }, + { name = "websocket-client", marker = "platform_python_implementation == 'PyPy'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/54/2d/fafffe946099033ccf22bf89e12eede14c1d3c5936110c5f6f2b9830722c/selenium-4.32.0.tar.gz", hash = "sha256:b9509bef4056f4083772abb1ae19ff57247d617a29255384b26be6956615b206", size = 870997, upload-time = "2025-05-02T20:35:27.325Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/ea/37/d07ed9d13e571b2115d4ed6956d156c66816ceec0b03b2e463e80d09f572/selenium-4.32.0-py3-none-any.whl", hash = "sha256:c4d9613f8a45693d61530c9660560fadb52db7d730237bc788ddedf442391f97", size = 9369668, upload-time = "2025-05-02T20:35:24.726Z" }, ] +[[package]] +name = "selenium" +version = "4.35.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.13' and platform_python_implementation != 'PyPy' and sys_platform == 'darwin'", + "python_full_version >= '3.13' and platform_machine == 'aarch64' and platform_python_implementation != 'PyPy' and sys_platform == 'linux'", + "(python_full_version >= '3.13' and platform_machine != 'aarch64' and platform_python_implementation != 'PyPy' and sys_platform == 'linux') or (python_full_version >= '3.13' and platform_python_implementation != 'PyPy' and sys_platform != 'darwin' and sys_platform != 'linux')", + "python_full_version == '3.12.*' and platform_python_implementation != 'PyPy' and sys_platform == 'darwin'", + "python_full_version == '3.12.*' and platform_machine == 'aarch64' and platform_python_implementation != 'PyPy' and sys_platform == 'linux'", + "(python_full_version == '3.12.*' and platform_machine != 'aarch64' and platform_python_implementation != 'PyPy' and sys_platform == 'linux') or (python_full_version == '3.12.*' and platform_python_implementation != 'PyPy' and sys_platform != 'darwin' and sys_platform != 'linux')", + "python_full_version == '3.11.*' and platform_python_implementation != 'PyPy' and sys_platform == 'darwin'", + "python_full_version == '3.11.*' and platform_machine == 'aarch64' and platform_python_implementation != 'PyPy' and sys_platform == 'linux'", + "(python_full_version == '3.11.*' and platform_machine != 'aarch64' and platform_python_implementation != 'PyPy' and sys_platform == 'linux') or (python_full_version == '3.11.*' and platform_python_implementation != 'PyPy' and sys_platform != 'darwin' and sys_platform != 'linux')", + "python_full_version < '3.11' and platform_python_implementation != 'PyPy' and sys_platform == 'darwin'", + "python_full_version < '3.11' and platform_machine == 'aarch64' and platform_python_implementation != 'PyPy' and sys_platform == 'linux'", + "(python_full_version < '3.11' and platform_machine != 'aarch64' and platform_python_implementation != 'PyPy' and sys_platform == 'linux') or (python_full_version < '3.11' and platform_python_implementation != 'PyPy' and sys_platform != 'darwin' and sys_platform != 'linux')", +] +dependencies = [ + { name = "certifi", marker = "platform_python_implementation != 'PyPy'" }, + { name = "trio", marker = "platform_python_implementation != 'PyPy'" }, + { name = "trio-websocket", marker = "platform_python_implementation != 'PyPy'" }, + { name = "typing-extensions", marker = "platform_python_implementation != 'PyPy'" }, + { name = "urllib3", version = "2.5.0", source = { registry = "https://pypi.org/simple" }, extra = ["socks"], marker = "platform_python_implementation != 'PyPy'" }, + { name = "websocket-client", marker = "platform_python_implementation != 'PyPy'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/75/67/9016942b5781843cfea6f5bc1383cea852d9fa08f85f55a0547874525b5c/selenium-4.35.0.tar.gz", hash = "sha256:83937a538afb40ef01e384c1405c0863fa184c26c759d34a1ebbe7b925d3481c", size = 907991, upload-time = "2025-08-12T15:46:40.822Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/17/ef/d0e033e1b3f19a0325ce03863b68d709780908381135fc0f9436dea76a7b/selenium-4.35.0-py3-none-any.whl", hash = "sha256:90bb6c6091fa55805785cf1660fa1e2176220475ccdb466190f654ef8eef6114", size = 9602106, upload-time = "2025-08-12T15:46:38.244Z" }, +] + [[package]] name = "semchunk" version = "2.2.2" @@ -7303,12 +7349,12 @@ name = "singlestoredb" version = "1.12.4" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version < '3.11' and platform_python_implementation == 'PyPy' and sys_platform == 'darwin'", "python_full_version < '3.11' and platform_python_implementation != 'PyPy' and sys_platform == 'darwin'", - "python_full_version < '3.11' and platform_machine == 'aarch64' and platform_python_implementation == 'PyPy' and sys_platform == 'linux'", "python_full_version < '3.11' and platform_machine == 'aarch64' and platform_python_implementation != 'PyPy' and sys_platform == 'linux'", - "(python_full_version < '3.11' and platform_machine != 'aarch64' and platform_python_implementation == 'PyPy' and sys_platform == 'linux') or (python_full_version < '3.11' and platform_python_implementation == 'PyPy' and sys_platform != 'darwin' and sys_platform != 'linux')", "(python_full_version < '3.11' and platform_machine != 'aarch64' and platform_python_implementation != 'PyPy' and sys_platform == 'linux') or (python_full_version < '3.11' and platform_python_implementation != 'PyPy' and sys_platform != 'darwin' and sys_platform != 'linux')", + "python_full_version < '3.11' and platform_python_implementation == 'PyPy' and sys_platform == 'darwin'", + "python_full_version < '3.11' and platform_machine == 'aarch64' and platform_python_implementation == 'PyPy' and sys_platform == 'linux'", + "(python_full_version < '3.11' and platform_machine != 'aarch64' and platform_python_implementation == 'PyPy' and sys_platform == 'linux') or (python_full_version < '3.11' and platform_python_implementation == 'PyPy' and sys_platform != 'darwin' and sys_platform != 'linux')", ] dependencies = [ { name = "build", marker = "python_full_version < '3.11'" }, @@ -7335,24 +7381,24 @@ name = "singlestoredb" version = "1.15.8" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version >= '3.13' and platform_python_implementation == 'PyPy' and sys_platform == 'darwin'", - "python_full_version >= '3.13' and platform_machine == 'aarch64' and platform_python_implementation == 'PyPy' and sys_platform == 'linux'", - "(python_full_version >= '3.13' and platform_machine != 'aarch64' and platform_python_implementation == 'PyPy' and sys_platform == 'linux') or (python_full_version >= '3.13' and platform_python_implementation == 'PyPy' and sys_platform != 'darwin' and sys_platform != 'linux')", "python_full_version >= '3.13' and platform_python_implementation != 'PyPy' and sys_platform == 'darwin'", "python_full_version >= '3.13' and platform_machine == 'aarch64' and platform_python_implementation != 'PyPy' and sys_platform == 'linux'", "(python_full_version >= '3.13' and platform_machine != 'aarch64' and platform_python_implementation != 'PyPy' and sys_platform == 'linux') or (python_full_version >= '3.13' and platform_python_implementation != 'PyPy' and sys_platform != 'darwin' and sys_platform != 'linux')", - "python_full_version == '3.12.*' and platform_python_implementation == 'PyPy' and sys_platform == 'darwin'", "python_full_version == '3.12.*' and platform_python_implementation != 'PyPy' and sys_platform == 'darwin'", - "python_full_version == '3.12.*' and platform_machine == 'aarch64' and platform_python_implementation == 'PyPy' and sys_platform == 'linux'", "python_full_version == '3.12.*' and platform_machine == 'aarch64' and platform_python_implementation != 'PyPy' and sys_platform == 'linux'", - "(python_full_version == '3.12.*' and platform_machine != 'aarch64' and platform_python_implementation == 'PyPy' and sys_platform == 'linux') or (python_full_version == '3.12.*' and platform_python_implementation == 'PyPy' and sys_platform != 'darwin' and sys_platform != 'linux')", "(python_full_version == '3.12.*' and platform_machine != 'aarch64' and platform_python_implementation != 'PyPy' and sys_platform == 'linux') or (python_full_version == '3.12.*' and platform_python_implementation != 'PyPy' and sys_platform != 'darwin' and sys_platform != 'linux')", - "python_full_version == '3.11.*' and platform_python_implementation == 'PyPy' and sys_platform == 'darwin'", "python_full_version == '3.11.*' and platform_python_implementation != 'PyPy' and sys_platform == 'darwin'", - "python_full_version == '3.11.*' and platform_machine == 'aarch64' and platform_python_implementation == 'PyPy' and sys_platform == 'linux'", "python_full_version == '3.11.*' and platform_machine == 'aarch64' and platform_python_implementation != 'PyPy' and sys_platform == 'linux'", - "(python_full_version == '3.11.*' and platform_machine != 'aarch64' and platform_python_implementation == 'PyPy' and sys_platform == 'linux') or (python_full_version == '3.11.*' and platform_python_implementation == 'PyPy' and sys_platform != 'darwin' and sys_platform != 'linux')", "(python_full_version == '3.11.*' and platform_machine != 'aarch64' and platform_python_implementation != 'PyPy' and sys_platform == 'linux') or (python_full_version == '3.11.*' and platform_python_implementation != 'PyPy' and sys_platform != 'darwin' and sys_platform != 'linux')", + "python_full_version >= '3.13' and platform_python_implementation == 'PyPy' and sys_platform == 'darwin'", + "python_full_version >= '3.13' and platform_machine == 'aarch64' and platform_python_implementation == 'PyPy' and sys_platform == 'linux'", + "(python_full_version >= '3.13' and platform_machine != 'aarch64' and platform_python_implementation == 'PyPy' and sys_platform == 'linux') or (python_full_version >= '3.13' and platform_python_implementation == 'PyPy' and sys_platform != 'darwin' and sys_platform != 'linux')", + "python_full_version == '3.12.*' and platform_python_implementation == 'PyPy' and sys_platform == 'darwin'", + "python_full_version == '3.12.*' and platform_machine == 'aarch64' and platform_python_implementation == 'PyPy' and sys_platform == 'linux'", + "(python_full_version == '3.12.*' and platform_machine != 'aarch64' and platform_python_implementation == 'PyPy' and sys_platform == 'linux') or (python_full_version == '3.12.*' and platform_python_implementation == 'PyPy' and sys_platform != 'darwin' and sys_platform != 'linux')", + "python_full_version == '3.11.*' and platform_python_implementation == 'PyPy' and sys_platform == 'darwin'", + "python_full_version == '3.11.*' and platform_machine == 'aarch64' and platform_python_implementation == 'PyPy' and sys_platform == 'linux'", + "(python_full_version == '3.11.*' and platform_machine != 'aarch64' and platform_python_implementation == 'PyPy' and sys_platform == 'linux') or (python_full_version == '3.11.*' and platform_python_implementation == 'PyPy' and sys_platform != 'darwin' and sys_platform != 'linux')", ] dependencies = [ { name = "build", marker = "python_full_version >= '3.11'" }, @@ -7667,12 +7713,12 @@ name = "tifffile" version = "2025.5.10" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version < '3.11' and platform_python_implementation == 'PyPy' and sys_platform == 'darwin'", "python_full_version < '3.11' and platform_python_implementation != 'PyPy' and sys_platform == 'darwin'", - "python_full_version < '3.11' and platform_machine == 'aarch64' and platform_python_implementation == 'PyPy' and sys_platform == 'linux'", "python_full_version < '3.11' and platform_machine == 'aarch64' and platform_python_implementation != 'PyPy' and sys_platform == 'linux'", - "(python_full_version < '3.11' and platform_machine != 'aarch64' and platform_python_implementation == 'PyPy' and sys_platform == 'linux') or (python_full_version < '3.11' and platform_python_implementation == 'PyPy' and sys_platform != 'darwin' and sys_platform != 'linux')", "(python_full_version < '3.11' and platform_machine != 'aarch64' and platform_python_implementation != 'PyPy' and sys_platform == 'linux') or (python_full_version < '3.11' and platform_python_implementation != 'PyPy' and sys_platform != 'darwin' and sys_platform != 'linux')", + "python_full_version < '3.11' and platform_python_implementation == 'PyPy' and sys_platform == 'darwin'", + "python_full_version < '3.11' and platform_machine == 'aarch64' and platform_python_implementation == 'PyPy' and sys_platform == 'linux'", + "(python_full_version < '3.11' and platform_machine != 'aarch64' and platform_python_implementation == 'PyPy' and sys_platform == 'linux') or (python_full_version < '3.11' and platform_python_implementation == 'PyPy' and sys_platform != 'darwin' and sys_platform != 'linux')", ] dependencies = [ { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, @@ -7684,34 +7730,34 @@ wheels = [ [[package]] name = "tifffile" -version = "2025.9.20" +version = "2025.9.30" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version >= '3.13' and platform_python_implementation == 'PyPy' and sys_platform == 'darwin'", - "python_full_version >= '3.13' and platform_machine == 'aarch64' and platform_python_implementation == 'PyPy' and sys_platform == 'linux'", - "(python_full_version >= '3.13' and platform_machine != 'aarch64' and platform_python_implementation == 'PyPy' and sys_platform == 'linux') or (python_full_version >= '3.13' and platform_python_implementation == 'PyPy' and sys_platform != 'darwin' and sys_platform != 'linux')", "python_full_version >= '3.13' and platform_python_implementation != 'PyPy' and sys_platform == 'darwin'", "python_full_version >= '3.13' and platform_machine == 'aarch64' and platform_python_implementation != 'PyPy' and sys_platform == 'linux'", "(python_full_version >= '3.13' and platform_machine != 'aarch64' and platform_python_implementation != 'PyPy' and sys_platform == 'linux') or (python_full_version >= '3.13' and platform_python_implementation != 'PyPy' and sys_platform != 'darwin' and sys_platform != 'linux')", - "python_full_version == '3.12.*' and platform_python_implementation == 'PyPy' and sys_platform == 'darwin'", "python_full_version == '3.12.*' and platform_python_implementation != 'PyPy' and sys_platform == 'darwin'", - "python_full_version == '3.12.*' and platform_machine == 'aarch64' and platform_python_implementation == 'PyPy' and sys_platform == 'linux'", "python_full_version == '3.12.*' and platform_machine == 'aarch64' and platform_python_implementation != 'PyPy' and sys_platform == 'linux'", - "(python_full_version == '3.12.*' and platform_machine != 'aarch64' and platform_python_implementation == 'PyPy' and sys_platform == 'linux') or (python_full_version == '3.12.*' and platform_python_implementation == 'PyPy' and sys_platform != 'darwin' and sys_platform != 'linux')", "(python_full_version == '3.12.*' and platform_machine != 'aarch64' and platform_python_implementation != 'PyPy' and sys_platform == 'linux') or (python_full_version == '3.12.*' and platform_python_implementation != 'PyPy' and sys_platform != 'darwin' and sys_platform != 'linux')", - "python_full_version == '3.11.*' and platform_python_implementation == 'PyPy' and sys_platform == 'darwin'", "python_full_version == '3.11.*' and platform_python_implementation != 'PyPy' and sys_platform == 'darwin'", - "python_full_version == '3.11.*' and platform_machine == 'aarch64' and platform_python_implementation == 'PyPy' and sys_platform == 'linux'", "python_full_version == '3.11.*' and platform_machine == 'aarch64' and platform_python_implementation != 'PyPy' and sys_platform == 'linux'", - "(python_full_version == '3.11.*' and platform_machine != 'aarch64' and platform_python_implementation == 'PyPy' and sys_platform == 'linux') or (python_full_version == '3.11.*' and platform_python_implementation == 'PyPy' and sys_platform != 'darwin' and sys_platform != 'linux')", "(python_full_version == '3.11.*' and platform_machine != 'aarch64' and platform_python_implementation != 'PyPy' and sys_platform == 'linux') or (python_full_version == '3.11.*' and platform_python_implementation != 'PyPy' and sys_platform != 'darwin' and sys_platform != 'linux')", + "python_full_version >= '3.13' and platform_python_implementation == 'PyPy' and sys_platform == 'darwin'", + "python_full_version >= '3.13' and platform_machine == 'aarch64' and platform_python_implementation == 'PyPy' and sys_platform == 'linux'", + "(python_full_version >= '3.13' and platform_machine != 'aarch64' and platform_python_implementation == 'PyPy' and sys_platform == 'linux') or (python_full_version >= '3.13' and platform_python_implementation == 'PyPy' and sys_platform != 'darwin' and sys_platform != 'linux')", + "python_full_version == '3.12.*' and platform_python_implementation == 'PyPy' and sys_platform == 'darwin'", + "python_full_version == '3.12.*' and platform_machine == 'aarch64' and platform_python_implementation == 'PyPy' and sys_platform == 'linux'", + "(python_full_version == '3.12.*' and platform_machine != 'aarch64' and platform_python_implementation == 'PyPy' and sys_platform == 'linux') or (python_full_version == '3.12.*' and platform_python_implementation == 'PyPy' and sys_platform != 'darwin' and sys_platform != 'linux')", + "python_full_version == '3.11.*' and platform_python_implementation == 'PyPy' and sys_platform == 'darwin'", + "python_full_version == '3.11.*' and platform_machine == 'aarch64' and platform_python_implementation == 'PyPy' and sys_platform == 'linux'", + "(python_full_version == '3.11.*' and platform_machine != 'aarch64' and platform_python_implementation == 'PyPy' and sys_platform == 'linux') or (python_full_version == '3.11.*' and platform_python_implementation == 'PyPy' and sys_platform != 'darwin' and sys_platform != 'linux')", ] dependencies = [ { name = "numpy", version = "2.3.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/e4/1d/99d2eb1d50f0832d6e6e057f7d3239b77210d663a048780b029d10324b14/tifffile-2025.9.20.tar.gz", hash = "sha256:a0fed4c613ff728979cb6abfd40832b6f36dc9da8183e52840418a25a00552eb", size = 368988, upload-time = "2025-09-20T17:24:43.498Z" } +sdist = { url = "https://files.pythonhosted.org/packages/2a/6e/82f9e07290e1c5270f295f22e32ffd0d86bef31494b004b2a247530a449a/tifffile-2025.9.30.tar.gz", hash = "sha256:1a259f11e94489a9ab599e4e9f40a0e72b17cad206587097209f630768dfcdf3", size = 369276, upload-time = "2025-09-29T20:36:50.356Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/c8/15/e38bf2234e8c09fccc6ec53a7a4374e38a86f7a9d8394fb9c06e1a0f25a5/tifffile-2025.9.20-py3-none-any.whl", hash = "sha256:549dda2f2c65cc63b3d946942b9b43c09ae50caaae0aa7ea3d91a915acd45444", size = 230101, upload-time = "2025-09-20T17:24:41.831Z" }, + { url = "https://files.pythonhosted.org/packages/bb/af/14e1f7dd76a735495293a82fb2dea3f3769812ca95cb1383c929173d0884/tifffile-2025.9.30-py3-none-any.whl", hash = "sha256:0b2c42b6821583335407a8c48686358fcfee6e9e94f38895cbf9b111a6186c86", size = 230238, upload-time = "2025-09-29T20:36:48.475Z" }, ] [[package]] @@ -7978,7 +8024,7 @@ wheels = [ [[package]] name = "trio" -version = "0.31.0" +version = "0.30.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "attrs" }, @@ -7989,9 +8035,9 @@ dependencies = [ { name = "sniffio" }, { name = "sortedcontainers" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/76/8f/c6e36dd11201e2a565977d8b13f0b027ba4593c1a80bed5185489178e257/trio-0.31.0.tar.gz", hash = "sha256:f71d551ccaa79d0cb73017a33ef3264fde8335728eb4c6391451fe5d253a9d5b", size = 605825, upload-time = "2025-09-09T15:17:15.242Z" } +sdist = { url = "https://files.pythonhosted.org/packages/01/c1/68d582b4d3a1c1f8118e18042464bb12a7c1b75d64d75111b297687041e3/trio-0.30.0.tar.gz", hash = "sha256:0781c857c0c81f8f51e0089929a26b5bb63d57f927728a5586f7e36171f064df", size = 593776, upload-time = "2025-04-21T00:48:19.507Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/31/5b/94237a3485620dbff9741df02ff6d8acaa5fdec67d81ab3f62e4d8511bf7/trio-0.31.0-py3-none-any.whl", hash = "sha256:b5d14cd6293d79298b49c3485ffd9c07e3ce03a6da8c7dfbe0cb3dd7dc9a4774", size = 512679, upload-time = "2025-09-09T15:17:13.821Z" }, + { url = "https://files.pythonhosted.org/packages/69/8e/3f6dfda475ecd940e786defe6df6c500734e686c9cd0a0f8ef6821e9b2f2/trio-0.30.0-py3-none-any.whl", hash = "sha256:3bf4f06b8decf8d3cf00af85f40a89824669e2d033bb32469d34840edcfc22a5", size = 499194, upload-time = "2025-04-21T00:48:17.167Z" }, ] [[package]] @@ -8014,7 +8060,7 @@ name = "triton" version = "3.4.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "setuptools", marker = "(platform_machine != 'aarch64' and sys_platform == 'linux') or (sys_platform != 'darwin' and sys_platform != 'linux')" }, + { name = "setuptools" }, ] wheels = [ { url = "https://files.pythonhosted.org/packages/62/ee/0ee5f64a87eeda19bbad9bc54ae5ca5b98186ed00055281fd40fb4beb10e/triton-3.4.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7ff2785de9bc02f500e085420273bb5cc9c9bb767584a4aa28d6e360cec70128", size = 155430069, upload-time = "2025-07-30T19:58:21.715Z" }, @@ -8026,7 +8072,7 @@ wheels = [ [[package]] name = "typer" -version = "0.16.1" +version = "0.19.2" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "click" }, @@ -8034,9 +8080,9 @@ dependencies = [ { name = "shellingham" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/43/78/d90f616bf5f88f8710ad067c1f8705bf7618059836ca084e5bb2a0855d75/typer-0.16.1.tar.gz", hash = "sha256:d358c65a464a7a90f338e3bb7ff0c74ac081449e53884b12ba658cbd72990614", size = 102836, upload-time = "2025-08-18T19:18:22.898Z" } +sdist = { url = "https://files.pythonhosted.org/packages/21/ca/950278884e2ca20547ff3eb109478c6baf6b8cf219318e6bc4f666fad8e8/typer-0.19.2.tar.gz", hash = "sha256:9ad824308ded0ad06cc716434705f691d4ee0bfd0fb081839d2e426860e7fdca", size = 104755, upload-time = "2025-09-23T09:47:48.256Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/2d/76/06dbe78f39b2203d2a47d5facc5df5102d0561e2807396471b5f7c5a30a1/typer-0.16.1-py3-none-any.whl", hash = "sha256:90ee01cb02d9b8395ae21ee3368421faf21fa138cb2a541ed369c08cec5237c9", size = 46397, upload-time = "2025-08-18T19:18:21.663Z" }, + { url = "https://files.pythonhosted.org/packages/00/22/35617eee79080a5d071d0f14ad698d325ee6b3bf824fc0467c03b30e7fa8/typer-0.19.2-py3-none-any.whl", hash = "sha256:755e7e19670ffad8283db353267cb81ef252f595aa6834a0d1ca9312d9326cb9", size = 46748, upload-time = "2025-09-23T09:47:46.777Z" }, ] [[package]] @@ -8067,12 +8113,73 @@ wheels = [ ] [[package]] -name = "typing-extensions" -version = "4.15.0" +name = "types-requests" +version = "2.31.0.6" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/72/94/1a15dd82efb362ac84269196e94cf00f187f7ed21c242792a923cdb1c61f/typing_extensions-4.15.0.tar.gz", hash = "sha256:0cea48d173cc12fa28ecabc3b837ea3cf6f38c6d1136f85cbaaf598984861466", size = 109391, upload-time = "2025-08-25T13:49:26.313Z" } +resolution-markers = [ + "python_full_version >= '3.13' and platform_python_implementation == 'PyPy' and sys_platform == 'darwin'", + "python_full_version >= '3.13' and platform_machine == 'aarch64' and platform_python_implementation == 'PyPy' and sys_platform == 'linux'", + "(python_full_version >= '3.13' and platform_machine != 'aarch64' and platform_python_implementation == 'PyPy' and sys_platform == 'linux') or (python_full_version >= '3.13' and platform_python_implementation == 'PyPy' and sys_platform != 'darwin' and sys_platform != 'linux')", + "python_full_version == '3.12.*' and platform_python_implementation == 'PyPy' and sys_platform == 'darwin'", + "python_full_version == '3.12.*' and platform_machine == 'aarch64' and platform_python_implementation == 'PyPy' and sys_platform == 'linux'", + "(python_full_version == '3.12.*' and platform_machine != 'aarch64' and platform_python_implementation == 'PyPy' and sys_platform == 'linux') or (python_full_version == '3.12.*' and platform_python_implementation == 'PyPy' and sys_platform != 'darwin' and sys_platform != 'linux')", + "python_full_version == '3.11.*' and platform_python_implementation == 'PyPy' and sys_platform == 'darwin'", + "python_full_version == '3.11.*' and platform_machine == 'aarch64' and platform_python_implementation == 'PyPy' and sys_platform == 'linux'", + "(python_full_version == '3.11.*' and platform_machine != 'aarch64' and platform_python_implementation == 'PyPy' and sys_platform == 'linux') or (python_full_version == '3.11.*' and platform_python_implementation == 'PyPy' and sys_platform != 'darwin' and sys_platform != 'linux')", + "python_full_version < '3.11' and platform_python_implementation == 'PyPy' and sys_platform == 'darwin'", + "python_full_version < '3.11' and platform_machine == 'aarch64' and platform_python_implementation == 'PyPy' and sys_platform == 'linux'", + "(python_full_version < '3.11' and platform_machine != 'aarch64' and platform_python_implementation == 'PyPy' and sys_platform == 'linux') or (python_full_version < '3.11' and platform_python_implementation == 'PyPy' and sys_platform != 'darwin' and sys_platform != 'linux')", +] +dependencies = [ + { name = "types-urllib3", marker = "platform_python_implementation == 'PyPy'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/f9/b8/c1e8d39996b4929b918aba10dba5de07a8b3f4c8487bb61bb79882544e69/types-requests-2.31.0.6.tar.gz", hash = "sha256:cd74ce3b53c461f1228a9b783929ac73a666658f223e28ed29753771477b3bd0", size = 15535, upload-time = "2023-09-27T06:19:38.443Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl", hash = "sha256:f0fa19c6845758ab08074a0cfa8b7aecb71c999ca73d62883bc25cc018c4e548", size = 44614, upload-time = "2025-08-25T13:49:24.86Z" }, + { url = "https://files.pythonhosted.org/packages/5c/a1/6f8dc74d9069e790d604ddae70cb46dcbac668f1bb08136e7b0f2f5cd3bf/types_requests-2.31.0.6-py3-none-any.whl", hash = "sha256:a2db9cb228a81da8348b49ad6db3f5519452dd20a9c1e1a868c83c5fe88fd1a9", size = 14516, upload-time = "2023-09-27T06:19:36.373Z" }, +] + +[[package]] +name = "types-requests" +version = "2.31.0.20240406" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.13' and platform_python_implementation != 'PyPy' and sys_platform == 'darwin'", + "python_full_version >= '3.13' and platform_machine == 'aarch64' and platform_python_implementation != 'PyPy' and sys_platform == 'linux'", + "(python_full_version >= '3.13' and platform_machine != 'aarch64' and platform_python_implementation != 'PyPy' and sys_platform == 'linux') or (python_full_version >= '3.13' and platform_python_implementation != 'PyPy' and sys_platform != 'darwin' and sys_platform != 'linux')", + "python_full_version == '3.12.*' and platform_python_implementation != 'PyPy' and sys_platform == 'darwin'", + "python_full_version == '3.12.*' and platform_machine == 'aarch64' and platform_python_implementation != 'PyPy' and sys_platform == 'linux'", + "(python_full_version == '3.12.*' and platform_machine != 'aarch64' and platform_python_implementation != 'PyPy' and sys_platform == 'linux') or (python_full_version == '3.12.*' and platform_python_implementation != 'PyPy' and sys_platform != 'darwin' and sys_platform != 'linux')", + "python_full_version == '3.11.*' and platform_python_implementation != 'PyPy' and sys_platform == 'darwin'", + "python_full_version == '3.11.*' and platform_machine == 'aarch64' and platform_python_implementation != 'PyPy' and sys_platform == 'linux'", + "(python_full_version == '3.11.*' and platform_machine != 'aarch64' and platform_python_implementation != 'PyPy' and sys_platform == 'linux') or (python_full_version == '3.11.*' and platform_python_implementation != 'PyPy' and sys_platform != 'darwin' and sys_platform != 'linux')", + "python_full_version < '3.11' and platform_python_implementation != 'PyPy' and sys_platform == 'darwin'", + "python_full_version < '3.11' and platform_machine == 'aarch64' and platform_python_implementation != 'PyPy' and sys_platform == 'linux'", + "(python_full_version < '3.11' and platform_machine != 'aarch64' and platform_python_implementation != 'PyPy' and sys_platform == 'linux') or (python_full_version < '3.11' and platform_python_implementation != 'PyPy' and sys_platform != 'darwin' and sys_platform != 'linux')", +] +dependencies = [ + { name = "urllib3", version = "2.5.0", source = { registry = "https://pypi.org/simple" }, marker = "platform_python_implementation != 'PyPy'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b4/40/66afbb030f4a800c08a9312a0653a7aec06ce0bd633d83215eb0f83c0f46/types-requests-2.31.0.20240406.tar.gz", hash = "sha256:4428df33c5503945c74b3f42e82b181e86ec7b724620419a2966e2de604ce1a1", size = 17134, upload-time = "2024-04-06T02:13:39.267Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8b/ea/91b718b8c0b88e4f61cdd61357cc4a1f8767b32be691fb388299003a3ae3/types_requests-2.31.0.20240406-py3-none-any.whl", hash = "sha256:6216cdac377c6b9a040ac1c0404f7284bd13199c0e1bb235f4324627e8898cf5", size = 15347, upload-time = "2024-04-06T02:13:37.412Z" }, +] + +[[package]] +name = "types-urllib3" +version = "1.26.25.14" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/73/de/b9d7a68ad39092368fb21dd6194b362b98a1daeea5dcfef5e1adb5031c7e/types-urllib3-1.26.25.14.tar.gz", hash = "sha256:229b7f577c951b8c1b92c1bc2b2fdb0b49847bd2af6d1cc2a2e3dd340f3bda8f", size = 11239, upload-time = "2023-07-20T15:19:31.307Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/11/7b/3fc711b2efea5e85a7a0bbfe269ea944aa767bbba5ec52f9ee45d362ccf3/types_urllib3-1.26.25.14-py3-none-any.whl", hash = "sha256:9683bbb7fb72e32bfe9d2be6e04875fbe1b3eeec3cbb4ea231435aa7fd6b4f0e", size = 15377, upload-time = "2023-07-20T15:19:30.379Z" }, +] + +[[package]] +name = "typing-extensions" +version = "4.14.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/98/5a/da40306b885cc8c09109dc2e1abd358d5684b1425678151cdaed4731c822/typing_extensions-4.14.1.tar.gz", hash = "sha256:38b39f4aeeab64884ce9f74c94263ef78f3c22467c8724005483154c26648d36", size = 107673, upload-time = "2025-07-04T13:28:34.16Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b5/00/d631e67a838026495268c2f6884f3711a15a9a2a96cd244fdaea53b823fb/typing_extensions-4.14.1-py3-none-any.whl", hash = "sha256:d1e1e3b58374dc93031d6eda2420a48ea44a36c2b4766a4fdeb3710755731d76", size = 43906, upload-time = "2025-07-04T13:28:32.743Z" }, ] [[package]] @@ -8090,14 +8197,14 @@ wheels = [ [[package]] name = "typing-inspection" -version = "0.4.1" +version = "0.4.2" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/f8/b1/0c11f5058406b3af7609f121aaa6b609744687f1d158b3c3a5bf4cc94238/typing_inspection-0.4.1.tar.gz", hash = "sha256:6ae134cc0203c33377d43188d4064e9b357dba58cff3185f22924610e70a9d28", size = 75726, upload-time = "2025-05-21T18:55:23.885Z" } +sdist = { url = "https://files.pythonhosted.org/packages/55/e3/70399cb7dd41c10ac53367ae42139cf4b1ca5f36bb3dc6c9d33acdb43655/typing_inspection-0.4.2.tar.gz", hash = "sha256:ba561c48a67c5958007083d386c3295464928b01faa735ab8547c5692e87f464", size = 75949, upload-time = "2025-10-01T02:14:41.687Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/17/69/cd203477f944c353c31bade965f880aa1061fd6bf05ded0726ca845b6ff7/typing_inspection-0.4.1-py3-none-any.whl", hash = "sha256:389055682238f53b04f7badcb49b989835495a96700ced5dab2d8feae4b26f51", size = 14552, upload-time = "2025-05-21T18:55:22.152Z" }, + { url = "https://files.pythonhosted.org/packages/dc/9b/47798a6c91d8bdb567fe2698fe81e0c6b7cb7ef4d13da4114b41d239f65d/typing_inspection-0.4.2-py3-none-any.whl", hash = "sha256:4ed1cacbdc298c220f1bd249ed5287caa16f34d44ef4e9c3d0cbad5b521545e7", size = 14611, upload-time = "2025-10-01T02:14:40.154Z" }, ] [[package]]

%-NimU9ZY>8MvfGm&z^C|Z<1Oyxy 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