From 9712d4c39eea860f813e86a5e2ffc14db6d3a655 Mon Sep 17 00:00:00 2001 From: PeriniM Date: Thu, 5 Dec 2024 11:23:38 +0100 Subject: [PATCH 1/7] fix: logger working properly now --- .../examples/async_smartscraper_example.py | 4 +- .../examples/feedback_credits_example.py | 4 +- .../examples/smartscraper_example.py | 4 +- scrapegraph-py/scrapegraph_py/logger.py | 145 ++++++++++++------ 4 files changed, 101 insertions(+), 56 deletions(-) diff --git a/scrapegraph-py/examples/async_smartscraper_example.py b/scrapegraph-py/examples/async_smartscraper_example.py index 3158ae8..ca17f01 100644 --- a/scrapegraph-py/examples/async_smartscraper_example.py +++ b/scrapegraph-py/examples/async_smartscraper_example.py @@ -1,9 +1,9 @@ import asyncio from scrapegraph_py import AsyncClient -from scrapegraph_py.logger import get_logger +from scrapegraph_py.logger import sgai_logger -get_logger(level="DEBUG") +sgai_logger.set_logging(level="INFO") async def main(): diff --git a/scrapegraph-py/examples/feedback_credits_example.py b/scrapegraph-py/examples/feedback_credits_example.py index 0dcbc64..c5c192c 100644 --- a/scrapegraph-py/examples/feedback_credits_example.py +++ b/scrapegraph-py/examples/feedback_credits_example.py @@ -1,7 +1,7 @@ from scrapegraph_py import SyncClient -from scrapegraph_py.logger import get_logger +from scrapegraph_py.logger import sgai_logger -get_logger(level="DEBUG") +sgai_logger.set_logging(level="INFO") # Initialize the client sgai_client = SyncClient(api_key="your-api-key-here") diff --git a/scrapegraph-py/examples/smartscraper_example.py b/scrapegraph-py/examples/smartscraper_example.py index 5d44348..70f772d 100644 --- a/scrapegraph-py/examples/smartscraper_example.py +++ b/scrapegraph-py/examples/smartscraper_example.py @@ -1,7 +1,7 @@ from scrapegraph_py import SyncClient -from scrapegraph_py.logger import get_logger +from scrapegraph_py.logger import sgai_logger -get_logger(level="DEBUG") +sgai_logger.set_logging(level="INFO") # Initialize the client sgai_client = SyncClient(api_key="your-api-key-here") diff --git a/scrapegraph-py/scrapegraph_py/logger.py b/scrapegraph-py/scrapegraph_py/logger.py index a1a6ba2..bd2e4dc 100644 --- a/scrapegraph-py/scrapegraph_py/logger.py +++ b/scrapegraph-py/scrapegraph_py/logger.py @@ -22,53 +22,98 @@ def format(self, record: logging.LogRecord) -> str: return super().format(record) -def get_logger( - name: str = "scrapegraph", - level: str = "INFO", - log_file: Optional[str] = None, - log_format: Optional[str] = None, -) -> logging.Logger: - """ - Get a configured logger instance with emoji support. - - Args: - name: Name of the logger (default: 'scrapegraph') - level: Logging level (default: 'INFO') - log_file: Optional file path to write logs to - log_format: Optional custom log format string - - Returns: - logging.Logger: Configured logger instance - """ - logger = logging.getLogger(name) - - # Return existing logger if already configured - if logger.handlers: - return logger - - # Set log level - level = getattr(logging, level.upper(), logging.INFO) - logger.setLevel(level) - - # Default format if none provided - if not log_format: - log_format = "%(levelname)-6s %(asctime)-15s %(message)s" - - formatter = EmojiFormatter(log_format) - - # Console handler - console_handler = logging.StreamHandler() - console_handler.setFormatter(formatter) - logger.addHandler(console_handler) - - # File handler if log_file specified - if log_file: - file_handler = logging.FileHandler(log_file) - file_handler.setFormatter(formatter) - logger.addHandler(file_handler) - - return logger - - -# Default sgai logger instance -sgai_logger = get_logger() +class ScrapegraphLogger: + """Class to manage Scrapegraph logging configuration""" + + _instance = None + _initialized = False + + def __new__(cls): + if cls._instance is None: + cls._instance = super(ScrapegraphLogger, cls).__new__(cls) + return cls._instance + + def __init__(self): + if not self._initialized: + self.logger = logging.getLogger("scrapegraph") + self.logger.setLevel(logging.INFO) + self.enabled = False + self._initialized = True + + def set_logging( + self, + level: Optional[str] = None, + log_file: Optional[str] = None, + log_format: Optional[str] = None, + ) -> None: + """ + Configure logging settings. If level is None, logging will be disabled. + + Args: + level: Logging level (e.g., 'DEBUG', 'INFO'). None to disable logging. + log_file: Optional file path to write logs to + log_format: Optional custom log format string + """ + # Clear existing handlers + self.logger.handlers.clear() + + if level is None: + # Disable logging + self.enabled = False + return + + # Enable logging with specified level + self.enabled = True + level = getattr(logging, level.upper(), logging.INFO) + self.logger.setLevel(level) + + # Default format if none provided + if not log_format: + log_format = "%(emoji)s %(asctime)-15s %(message)s" + + formatter = EmojiFormatter(log_format) + + # Console handler + console_handler = logging.StreamHandler() + console_handler.setFormatter(formatter) + self.logger.addHandler(console_handler) + + # File handler if log_file specified + if log_file: + file_handler = logging.FileHandler(log_file) + file_handler.setFormatter(formatter) + self.logger.addHandler(file_handler) + + def disable(self) -> None: + """Disable all logging""" + self.logger.handlers.clear() + self.enabled = False + + def debug(self, message: str) -> None: + """Log debug message if logging is enabled""" + if self.enabled: + self.logger.debug(message) + + def info(self, message: str) -> None: + """Log info message if logging is enabled""" + if self.enabled: + self.logger.info(message) + + def warning(self, message: str) -> None: + """Log warning message if logging is enabled""" + if self.enabled: + self.logger.warning(message) + + def error(self, message: str) -> None: + """Log error message if logging is enabled""" + if self.enabled: + self.logger.error(message) + + def critical(self, message: str) -> None: + """Log critical message if logging is enabled""" + if self.enabled: + self.logger.critical(message) + + +# Default logger instance +sgai_logger = ScrapegraphLogger() From 8ab61476b6763b936e2e7d423b04bb51983fb8ea Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Thu, 5 Dec 2024 10:24:49 +0000 Subject: [PATCH 2/7] ci(release): 1.4.3-beta.2 [skip ci] ## [1.4.3-beta.2](https://github.com/ScrapeGraphAI/scrapegraph-sdk/compare/v1.4.3-beta.1...v1.4.3-beta.2) (2024-12-05) ### Bug Fixes * logger working properly now ([9712d4c](https://github.com/ScrapeGraphAI/scrapegraph-sdk/commit/9712d4c39eea860f813e86a5e2ffc14db6d3a655)) --- scrapegraph-py/CHANGELOG.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/scrapegraph-py/CHANGELOG.md b/scrapegraph-py/CHANGELOG.md index f5ab38f..1ac5b39 100644 --- a/scrapegraph-py/CHANGELOG.md +++ b/scrapegraph-py/CHANGELOG.md @@ -1,3 +1,10 @@ +## [1.4.3-beta.2](https://github.com/ScrapeGraphAI/scrapegraph-sdk/compare/v1.4.3-beta.1...v1.4.3-beta.2) (2024-12-05) + + +### Bug Fixes + +* logger working properly now ([9712d4c](https://github.com/ScrapeGraphAI/scrapegraph-sdk/commit/9712d4c39eea860f813e86a5e2ffc14db6d3a655)) + ## [1.4.3-beta.1](https://github.com/ScrapeGraphAI/scrapegraph-sdk/compare/v1.4.2...v1.4.3-beta.1) (2024-12-03) From 2643f11c968f0daab26529d513f08c2817763b50 Mon Sep 17 00:00:00 2001 From: PeriniM Date: Thu, 5 Dec 2024 11:59:33 +0100 Subject: [PATCH 3/7] fix: updated env variable loading --- scrapegraph-py/examples/smartscraper_example.py | 2 +- scrapegraph-py/scrapegraph_py/async_client.py | 15 +++++++++++++-- scrapegraph-py/scrapegraph_py/client.py | 16 ++++++++++++++-- 3 files changed, 28 insertions(+), 5 deletions(-) diff --git a/scrapegraph-py/examples/smartscraper_example.py b/scrapegraph-py/examples/smartscraper_example.py index 70f772d..928ae71 100644 --- a/scrapegraph-py/examples/smartscraper_example.py +++ b/scrapegraph-py/examples/smartscraper_example.py @@ -3,7 +3,7 @@ sgai_logger.set_logging(level="INFO") -# Initialize the client +# Initialize the client with explicit API key sgai_client = SyncClient(api_key="your-api-key-here") # SmartScraper request diff --git a/scrapegraph-py/scrapegraph_py/async_client.py b/scrapegraph-py/scrapegraph_py/async_client.py index 2246736..e0bd2a5 100644 --- a/scrapegraph-py/scrapegraph_py/async_client.py +++ b/scrapegraph-py/scrapegraph_py/async_client.py @@ -49,7 +49,7 @@ def from_env( def __init__( self, - api_key: str, + api_key: str = None, verify_ssl: bool = True, timeout: float = 120, max_retries: int = 3, @@ -58,13 +58,24 @@ def __init__( """Initialize AsyncClient with configurable parameters. Args: - api_key: API key for authentication + api_key: API key for authentication. If None, will try to load from environment verify_ssl: Whether to verify SSL certificates timeout: Request timeout in seconds max_retries: Maximum number of retry attempts retry_delay: Delay between retries in seconds """ logger.info("🔑 Initializing AsyncClient") + + # Try to get API key from environment if not provided + if api_key is None: + from os import getenv + + api_key = getenv("SGAI_API_KEY") + if not api_key: + raise ValueError( + "SGAI_API_KEY not provided and not found in environment" + ) + validate_api_key(api_key) logger.debug( f"🛠️ Configuration: verify_ssl={verify_ssl}, timeout={timeout}, max_retries={max_retries}" diff --git a/scrapegraph-py/scrapegraph_py/client.py b/scrapegraph-py/scrapegraph_py/client.py index 30ce15c..340767c 100644 --- a/scrapegraph-py/scrapegraph_py/client.py +++ b/scrapegraph-py/scrapegraph_py/client.py @@ -35,6 +35,7 @@ def from_env( retry_delay: Delay between retries in seconds """ from os import getenv + api_key = getenv("SGAI_API_KEY") if not api_key: raise ValueError("SGAI_API_KEY environment variable not set") @@ -48,7 +49,7 @@ def from_env( def __init__( self, - api_key: str, + api_key: str = None, verify_ssl: bool = True, timeout: float = 120, max_retries: int = 3, @@ -57,13 +58,24 @@ def __init__( """Initialize SyncClient with configurable parameters. Args: - api_key: API key for authentication + api_key: API key for authentication. If None, will try to load from environment verify_ssl: Whether to verify SSL certificates timeout: Request timeout in seconds max_retries: Maximum number of retry attempts retry_delay: Delay between retries in seconds """ logger.info("🔑 Initializing SyncClient") + + # Try to get API key from environment if not provided + if api_key is None: + from os import getenv + + api_key = getenv("SGAI_API_KEY") + if not api_key: + raise ValueError( + "SGAI_API_KEY not provided and not found in environment" + ) + validate_api_key(api_key) logger.debug( f"🛠️ Configuration: verify_ssl={verify_ssl}, timeout={timeout}, max_retries={max_retries}" From 1bc26c738443f7f52492a7b2cbe7c9f335315797 Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Thu, 5 Dec 2024 11:01:02 +0000 Subject: [PATCH 4/7] ci(release): 1.4.3-beta.3 [skip ci] ## [1.4.3-beta.3](https://github.com/ScrapeGraphAI/scrapegraph-sdk/compare/v1.4.3-beta.2...v1.4.3-beta.3) (2024-12-05) ### Bug Fixes * updated env variable loading ([2643f11](https://github.com/ScrapeGraphAI/scrapegraph-sdk/commit/2643f11c968f0daab26529d513f08c2817763b50)) --- scrapegraph-py/CHANGELOG.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/scrapegraph-py/CHANGELOG.md b/scrapegraph-py/CHANGELOG.md index 1ac5b39..0d7596f 100644 --- a/scrapegraph-py/CHANGELOG.md +++ b/scrapegraph-py/CHANGELOG.md @@ -1,3 +1,10 @@ +## [1.4.3-beta.3](https://github.com/ScrapeGraphAI/scrapegraph-sdk/compare/v1.4.3-beta.2...v1.4.3-beta.3) (2024-12-05) + + +### Bug Fixes + +* updated env variable loading ([2643f11](https://github.com/ScrapeGraphAI/scrapegraph-sdk/commit/2643f11c968f0daab26529d513f08c2817763b50)) + ## [1.4.3-beta.2](https://github.com/ScrapeGraphAI/scrapegraph-sdk/compare/v1.4.3-beta.1...v1.4.3-beta.2) (2024-12-05) From 9e1e496059cd24810a96b818da1811830586f94b Mon Sep 17 00:00:00 2001 From: PeriniM Date: Thu, 5 Dec 2024 15:03:50 +0100 Subject: [PATCH 5/7] feat: changed SyncClient to Client --- .../examples/feedback_credits_example.py | 4 ++-- scrapegraph-py/examples/smartscraper_example.py | 4 ++-- .../examples/smartscraper_schema_example.py | 4 ++-- scrapegraph-py/scrapegraph_py/__init__.py | 4 ++-- scrapegraph-py/scrapegraph_py/client.py | 14 +++++++------- scrapegraph-py/tests/test_client.py | 12 ++++++------ 6 files changed, 21 insertions(+), 21 deletions(-) diff --git a/scrapegraph-py/examples/feedback_credits_example.py b/scrapegraph-py/examples/feedback_credits_example.py index c5c192c..dc20ae2 100644 --- a/scrapegraph-py/examples/feedback_credits_example.py +++ b/scrapegraph-py/examples/feedback_credits_example.py @@ -1,10 +1,10 @@ -from scrapegraph_py import SyncClient +from scrapegraph_py import Client from scrapegraph_py.logger import sgai_logger sgai_logger.set_logging(level="INFO") # Initialize the client -sgai_client = SyncClient(api_key="your-api-key-here") +sgai_client = Client(api_key="your-api-key-here") # Example request_id (replace with an actual request_id from a previous request) request_id = "your-request-id-here" diff --git a/scrapegraph-py/examples/smartscraper_example.py b/scrapegraph-py/examples/smartscraper_example.py index 928ae71..37e4542 100644 --- a/scrapegraph-py/examples/smartscraper_example.py +++ b/scrapegraph-py/examples/smartscraper_example.py @@ -1,10 +1,10 @@ -from scrapegraph_py import SyncClient +from scrapegraph_py import Client from scrapegraph_py.logger import sgai_logger sgai_logger.set_logging(level="INFO") # Initialize the client with explicit API key -sgai_client = SyncClient(api_key="your-api-key-here") +sgai_client = Client(api_key="your-api-key-here") # SmartScraper request response = sgai_client.smartscraper( diff --git a/scrapegraph-py/examples/smartscraper_schema_example.py b/scrapegraph-py/examples/smartscraper_schema_example.py index fcc17c0..3553a22 100644 --- a/scrapegraph-py/examples/smartscraper_schema_example.py +++ b/scrapegraph-py/examples/smartscraper_schema_example.py @@ -1,6 +1,6 @@ from pydantic import BaseModel, Field -from scrapegraph_py import SyncClient +from scrapegraph_py import Client # Define a Pydantic model for the output schema @@ -11,7 +11,7 @@ class WebpageSchema(BaseModel): # Initialize the client -sgai_client = SyncClient(api_key="your-api-key-here") +sgai_client = Client(api_key="your-api-key-here") # SmartScraper request with output schema response = sgai_client.smartscraper( diff --git a/scrapegraph-py/scrapegraph_py/__init__.py b/scrapegraph-py/scrapegraph_py/__init__.py index 4a07e84..7ab2178 100644 --- a/scrapegraph-py/scrapegraph_py/__init__.py +++ b/scrapegraph-py/scrapegraph_py/__init__.py @@ -1,4 +1,4 @@ from .async_client import AsyncClient -from .client import SyncClient +from .client import Client -__all__ = ["SyncClient", "AsyncClient"] +__all__ = ["Client", "AsyncClient"] diff --git a/scrapegraph-py/scrapegraph_py/client.py b/scrapegraph-py/scrapegraph_py/client.py index 340767c..df4c133 100644 --- a/scrapegraph-py/scrapegraph_py/client.py +++ b/scrapegraph-py/scrapegraph_py/client.py @@ -1,4 +1,4 @@ -# Sync client implementation goes here +# Client implementation goes here from typing import Any, Optional import requests @@ -17,7 +17,7 @@ from scrapegraph_py.utils.helpers import handle_sync_response, validate_api_key -class SyncClient: +class Client: @classmethod def from_env( cls, @@ -26,7 +26,7 @@ def from_env( max_retries: int = 3, retry_delay: float = 1.0, ): - """Initialize SyncClient using API key from environment variable. + """Initialize Client using API key from environment variable. Args: verify_ssl: Whether to verify SSL certificates @@ -55,7 +55,7 @@ def __init__( max_retries: int = 3, retry_delay: float = 1.0, ): - """Initialize SyncClient with configurable parameters. + """Initialize Client with configurable parameters. Args: api_key: API key for authentication. If None, will try to load from environment @@ -64,7 +64,7 @@ def __init__( max_retries: Maximum number of retry attempts retry_delay: Delay between retries in seconds """ - logger.info("🔑 Initializing SyncClient") + logger.info("🔑 Initializing Client") # Try to get API key from environment if not provided if api_key is None: @@ -107,7 +107,7 @@ def __init__( if not verify_ssl: urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning) - logger.info("✅ SyncClient initialized successfully") + logger.info("✅ Client initialized successfully") def _make_request(self, method: str, url: str, **kwargs) -> Any: """Make HTTP request with error handling.""" @@ -211,7 +211,7 @@ def submit_feedback( def close(self): """Close the session to free up resources""" - logger.info("🔒 Closing SyncClient session") + logger.info("🔒 Closing Client session") self.session.close() logger.debug("✅ Session closed successfully") diff --git a/scrapegraph-py/tests/test_client.py b/scrapegraph-py/tests/test_client.py index b4d944f..6163a6d 100644 --- a/scrapegraph-py/tests/test_client.py +++ b/scrapegraph-py/tests/test_client.py @@ -3,7 +3,7 @@ import pytest import responses -from scrapegraph_py.client import SyncClient +from scrapegraph_py.client import Client from tests.utils import generate_mock_api_key @@ -30,7 +30,7 @@ def test_smartscraper(mock_api_key): }, ) - with SyncClient(api_key=mock_api_key) as client: + with Client(api_key=mock_api_key) as client: response = client.smartscraper( website_url="https://example.com", user_prompt="Describe this page." ) @@ -49,7 +49,7 @@ def test_get_smartscraper(mock_api_key, mock_uuid): }, ) - with SyncClient(api_key=mock_api_key) as client: + with Client(api_key=mock_api_key) as client: response = client.get_smartscraper(mock_uuid) assert response["status"] == "completed" assert response["request_id"] == mock_uuid @@ -63,7 +63,7 @@ def test_get_credits(mock_api_key): json={"remaining_credits": 100, "total_credits_used": 50}, ) - with SyncClient(api_key=mock_api_key) as client: + with Client(api_key=mock_api_key) as client: response = client.get_credits() assert response["remaining_credits"] == 100 assert response["total_credits_used"] == 50 @@ -77,7 +77,7 @@ def test_submit_feedback(mock_api_key): json={"status": "success"}, ) - with SyncClient(api_key=mock_api_key) as client: + with Client(api_key=mock_api_key) as client: response = client.submit_feedback( request_id=str(uuid4()), rating=5, feedback_text="Great service!" ) @@ -92,7 +92,7 @@ def test_network_error(mock_api_key): body=ConnectionError("Network error"), ) - with SyncClient(api_key=mock_api_key) as client: + with Client(api_key=mock_api_key) as client: with pytest.raises(ConnectionError): client.smartscraper( website_url="https://example.com", user_prompt="Describe this page." From 8900f7bf53239b6a73fb41196f5327d05763bae4 Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Thu, 5 Dec 2024 14:05:14 +0000 Subject: [PATCH 6/7] ci(release): 1.5.0-beta.1 [skip ci] ## [1.5.0-beta.1](https://github.com/ScrapeGraphAI/scrapegraph-sdk/compare/v1.4.3-beta.3...v1.5.0-beta.1) (2024-12-05) ### Features * changed SyncClient to Client ([9e1e496](https://github.com/ScrapeGraphAI/scrapegraph-sdk/commit/9e1e496059cd24810a96b818da1811830586f94b)) --- scrapegraph-py/CHANGELOG.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/scrapegraph-py/CHANGELOG.md b/scrapegraph-py/CHANGELOG.md index 0d7596f..2edd358 100644 --- a/scrapegraph-py/CHANGELOG.md +++ b/scrapegraph-py/CHANGELOG.md @@ -1,3 +1,10 @@ +## [1.5.0-beta.1](https://github.com/ScrapeGraphAI/scrapegraph-sdk/compare/v1.4.3-beta.3...v1.5.0-beta.1) (2024-12-05) + + +### Features + +* changed SyncClient to Client ([9e1e496](https://github.com/ScrapeGraphAI/scrapegraph-sdk/commit/9e1e496059cd24810a96b818da1811830586f94b)) + ## [1.4.3-beta.3](https://github.com/ScrapeGraphAI/scrapegraph-sdk/compare/v1.4.3-beta.2...v1.4.3-beta.3) (2024-12-05) From 636db26649dfac76503b556d5f724faf32e3522c Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Thu, 5 Dec 2024 14:30:18 +0000 Subject: [PATCH 7/7] ci(release): 1.6.0-beta.1 [skip ci] ## [1.6.0-beta.1](https://github.com/ScrapeGraphAI/scrapegraph-sdk/compare/v1.5.0...v1.6.0-beta.1) (2024-12-05) ### Features * changed SyncClient to Client ([9e1e496](https://github.com/ScrapeGraphAI/scrapegraph-sdk/commit/9e1e496059cd24810a96b818da1811830586f94b)) ### Bug Fixes * logger working properly now ([9712d4c](https://github.com/ScrapeGraphAI/scrapegraph-sdk/commit/9712d4c39eea860f813e86a5e2ffc14db6d3a655)) * updated env variable loading ([2643f11](https://github.com/ScrapeGraphAI/scrapegraph-sdk/commit/2643f11c968f0daab26529d513f08c2817763b50)) ### CI * **release:** 1.4.3-beta.2 [skip ci] ([8ab6147](https://github.com/ScrapeGraphAI/scrapegraph-sdk/commit/8ab61476b6763b936e2e7d423b04bb51983fb8ea)) * **release:** 1.4.3-beta.3 [skip ci] ([1bc26c7](https://github.com/ScrapeGraphAI/scrapegraph-sdk/commit/1bc26c738443f7f52492a7b2cbe7c9f335315797)) * **release:** 1.5.0-beta.1 [skip ci] ([8900f7b](https://github.com/ScrapeGraphAI/scrapegraph-sdk/commit/8900f7bf53239b6a73fb41196f5327d05763bae4)) --- scrapegraph-py/CHANGELOG.md | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/scrapegraph-py/CHANGELOG.md b/scrapegraph-py/CHANGELOG.md index f765c8f..07f3688 100644 --- a/scrapegraph-py/CHANGELOG.md +++ b/scrapegraph-py/CHANGELOG.md @@ -1,3 +1,23 @@ +## [1.6.0-beta.1](https://github.com/ScrapeGraphAI/scrapegraph-sdk/compare/v1.5.0...v1.6.0-beta.1) (2024-12-05) + + +### Features + +* changed SyncClient to Client ([9e1e496](https://github.com/ScrapeGraphAI/scrapegraph-sdk/commit/9e1e496059cd24810a96b818da1811830586f94b)) + + +### Bug Fixes + +* logger working properly now ([9712d4c](https://github.com/ScrapeGraphAI/scrapegraph-sdk/commit/9712d4c39eea860f813e86a5e2ffc14db6d3a655)) +* updated env variable loading ([2643f11](https://github.com/ScrapeGraphAI/scrapegraph-sdk/commit/2643f11c968f0daab26529d513f08c2817763b50)) + + +### CI + +* **release:** 1.4.3-beta.2 [skip ci] ([8ab6147](https://github.com/ScrapeGraphAI/scrapegraph-sdk/commit/8ab61476b6763b936e2e7d423b04bb51983fb8ea)) +* **release:** 1.4.3-beta.3 [skip ci] ([1bc26c7](https://github.com/ScrapeGraphAI/scrapegraph-sdk/commit/1bc26c738443f7f52492a7b2cbe7c9f335315797)) +* **release:** 1.5.0-beta.1 [skip ci] ([8900f7b](https://github.com/ScrapeGraphAI/scrapegraph-sdk/commit/8900f7bf53239b6a73fb41196f5327d05763bae4)) + ## [1.5.0-beta.1](https://github.com/ScrapeGraphAI/scrapegraph-sdk/compare/v1.4.3-beta.3...v1.5.0-beta.1) (2024-12-05)