diff --git a/examples/submit_feedback_tool.py b/examples/submit_feedback_tool.py deleted file mode 100644 index 4a17f54..0000000 --- a/examples/submit_feedback_tool.py +++ /dev/null @@ -1,16 +0,0 @@ -from langchain_scrapegraph.tools import SubmitFeedbackTool - -# Will automatically get SGAI_API_KEY from environment, or set it manually -tool = SubmitFeedbackTool() -feedback = tool.run( - { - "request_id": "5c7be764-2406-4ce0-b346-88f8825e6cb3", - "rating": 5, - "feedback_text": "Great result!", - } -) - -print("\nFeedback Submission Result:") -print(f"Feedback ID: {feedback['feedback_id']}") -print(f"Message: {feedback['message']}") -print(f"Timestamp: {feedback['feedback_timestamp']}") diff --git a/langchain_scrapegraph/tools/__init__.py b/langchain_scrapegraph/tools/__init__.py index e6be878..76c0b8e 100644 --- a/langchain_scrapegraph/tools/__init__.py +++ b/langchain_scrapegraph/tools/__init__.py @@ -1,5 +1,4 @@ from .credits import GetCreditsTool -from .feedback import SubmitFeedbackTool from .smartscraper import SmartscraperTool -__all__ = ["SmartscraperTool", "GetCreditsTool", "SubmitFeedbackTool"] +__all__ = ["SmartscraperTool", "GetCreditsTool"] diff --git a/langchain_scrapegraph/tools/feedback.py b/langchain_scrapegraph/tools/feedback.py deleted file mode 100644 index 1d6766f..0000000 --- a/langchain_scrapegraph/tools/feedback.py +++ /dev/null @@ -1,66 +0,0 @@ -from typing import Any, Dict, Optional, Type - -from langchain_core.callbacks import ( - AsyncCallbackManagerForToolRun, - CallbackManagerForToolRun, -) -from langchain_core.tools import BaseTool -from langchain_core.utils import get_from_dict_or_env -from pydantic import BaseModel, Field, model_validator -from scrapegraph_py import SyncClient - - -class SubmitFeedbackInput(BaseModel): - request_id: str = Field(description="The ID of the request to provide feedback for") - rating: int = Field(description="Rating from 1-5", ge=1, le=5) - feedback_text: str = Field(description="Detailed feedback text") - - -class SubmitFeedbackTool(BaseTool): - name: str = "SubmitFeedback" - description: str = "Submit feedback for a previous ScrapeGraph AI request" - args_schema: Type[SubmitFeedbackInput] = SubmitFeedbackInput - return_direct: bool = True - client: Optional[SyncClient] = None - api_key: str - testing: bool = False - - @model_validator(mode="before") - @classmethod - def validate_environment(cls, values: Dict) -> Dict: - """Validate that api key exists in environment.""" - values["api_key"] = get_from_dict_or_env(values, "api_key", "SGAI_API_KEY") - values["client"] = SyncClient(api_key=values["api_key"]) - return values - - def __init__(self, **data: Any): - super().__init__(**data) - - def _run( - self, - request_id: str, - rating: int, - feedback_text: str, - run_manager: Optional[CallbackManagerForToolRun] = None, - ) -> dict: - """Submit feedback for a request.""" - if not self.client: - raise ValueError("Client not initialized") - return self.client.submit_feedback( - request_id=request_id, rating=rating, feedback_text=feedback_text - ) - - async def _arun( - self, - request_id: str, - rating: int, - feedback_text: str, - run_manager: Optional[AsyncCallbackManagerForToolRun] = None, - ) -> dict: - """Submit feedback asynchronously.""" - return self._run( - request_id=request_id, - rating=rating, - feedback_text=feedback_text, - run_manager=run_manager.get_sync() if run_manager else None, - ) diff --git a/tests/integration_tests/test_tools.py b/tests/integration_tests/test_tools.py index ab688fe..97a89e6 100644 --- a/tests/integration_tests/test_tools.py +++ b/tests/integration_tests/test_tools.py @@ -1,31 +1,25 @@ """Integration tests for ScrapeGraph AI tools. -To run these tests, you need a ScrapeGraph AI API key. +To run these tests, you need a ScrapeGraphAI API key. You can get a test key from https://scrapegraphai.com Set the SGAI_API_KEY environment variable to run these tests. """ import os -from typing import ClassVar, Type +from typing import Type import pytest from dotenv import load_dotenv from langchain_tests.integration_tests import ToolsIntegrationTests -from langchain_scrapegraph.tools import ( - GetCreditsTool, - SmartscraperTool, - SubmitFeedbackTool, -) +from langchain_scrapegraph.tools import GetCreditsTool, SmartscraperTool # Load environment variables from .env file load_dotenv() class TestSmartscraperToolIntegration(ToolsIntegrationTests): - request_id: ClassVar[str] = "" # Class variable to store request_id - @property def tool_constructor(self) -> Type[SmartscraperTool]: return SmartscraperTool @@ -40,19 +34,10 @@ def tool_constructor_params(self) -> dict: @property def tool_invoke_params_example(self) -> dict: return { - "user_prompt": "TEST. Extract the main heading.", + "user_prompt": "Extract the main heading.", "website_url": "https://example.com", } - @pytest.mark.xfail(reason="Overridden to capture request_id for feedback test") - def test_invoke_matches_output_schema(self) -> None: - """Override to capture request_id""" - tool = self.get_tool() - result = tool._run(**self.tool_invoke_params_example) - # Store the request_id for use in feedback test - TestSmartscraperToolIntegration.request_id = result.get("request_id", "") - assert isinstance(result, dict) - class TestGetCreditsToolIntegration(ToolsIntegrationTests): @property @@ -69,26 +54,3 @@ def tool_constructor_params(self) -> dict: @property def tool_invoke_params_example(self) -> dict: return {} # GetCredits doesn't require any parameters - - -class TestSubmitFeedbackToolIntegration(ToolsIntegrationTests): - @property - def tool_constructor(self) -> Type[SubmitFeedbackTool]: - return SubmitFeedbackTool - - @property - def tool_constructor_params(self) -> dict: - api_key = os.getenv("SGAI_API_KEY") - if not api_key: - pytest.skip("SGAI_API_KEY environment variable not set") - return {"api_key": api_key} - - @property - def tool_invoke_params_example(self) -> dict: - if not TestSmartscraperToolIntegration.request_id: - pytest.skip("No request_id available from smartscraper test") - return { - "request_id": TestSmartscraperToolIntegration.request_id, - "rating": 5, - "feedback_text": "Test feedback", - } diff --git a/tests/unit_tests/mocks.py b/tests/unit_tests/mocks.py index 667d4b0..2da0174 100644 --- a/tests/unit_tests/mocks.py +++ b/tests/unit_tests/mocks.py @@ -1,6 +1,4 @@ -from datetime import datetime from typing import Any, Dict, Optional -from uuid import uuid4 from langchain_core.tools import BaseTool from pydantic import BaseModel, Field @@ -10,12 +8,11 @@ class MockSyncClient: def __init__(self, api_key: str = None, *args, **kwargs): """Initialize with mock methods that return proper response structures""" self._api_key = api_key - self._request_id = str(uuid4()) # Generate a consistent request_id for tests def smartscraper(self, website_url: str, user_prompt: str) -> dict: """Mock smartscraper method""" return { - "request_id": self._request_id, + "request_id": "test-id", "status": "completed", "website_url": website_url, "user_prompt": user_prompt, @@ -30,15 +27,6 @@ def get_credits(self) -> dict: """Mock get_credits method""" return {"remaining_credits": 50, "total_credits_used": 543} - def submit_feedback(self, request_id: str, rating: int, feedback_text: str) -> dict: - """Mock submit_feedback method""" - return { - "feedback_id": str(uuid4()), - "request_id": request_id, - "message": "Feedback submitted successfully", - "feedback_timestamp": datetime.now().isoformat(), - } - def close(self) -> None: """Mock close method""" pass @@ -68,24 +56,3 @@ class MockGetCreditsTool(BaseTool): def _run(self, **kwargs: Any) -> Dict: return {"remaining_credits": 50, "total_credits_used": 543} - - -class MockSubmitFeedbackInput(BaseModel): - request_id: str = Field(description="Test request ID") - rating: int = Field(description="Test rating") - feedback_text: str = Field(description="Test feedback") - - -class MockSubmitFeedbackTool(BaseTool): - name: str = "SubmitFeedback" - description: str = "Test description" - args_schema: type[BaseModel] = MockSubmitFeedbackInput - client: Optional[MockSyncClient] = None - api_key: str - - def _run(self, **kwargs: Any) -> Dict: - return { - "feedback_id": "test-id", - "message": "Success", - "feedback_timestamp": "2024-01-01T00:00:00", - } diff --git a/tests/unit_tests/test_tools.py b/tests/unit_tests/test_tools.py index c3cdd99..fe434e3 100644 --- a/tests/unit_tests/test_tools.py +++ b/tests/unit_tests/test_tools.py @@ -3,15 +3,10 @@ from langchain_tests.unit_tests import ToolsUnitTests -from langchain_scrapegraph.tools import ( - GetCreditsTool, - SmartscraperTool, - SubmitFeedbackTool, -) +from langchain_scrapegraph.tools import GetCreditsTool, SmartscraperTool from tests.unit_tests.mocks import ( MockGetCreditsTool, MockSmartscraperTool, - MockSubmitFeedbackTool, MockSyncClient, ) @@ -49,22 +44,3 @@ def tool_constructor_params(self) -> dict: @property def tool_invoke_params_example(self) -> dict: return {} - - -class TestSubmitFeedbackToolUnit(ToolsUnitTests): - @property - def tool_constructor(self) -> Type[SubmitFeedbackTool]: - return MockSubmitFeedbackTool - - @property - def tool_constructor_params(self) -> dict: - with patch("langchain_scrapegraph.tools.feedback.SyncClient", MockSyncClient): - return {"api_key": "sgai-test-api-key"} - - @property - def tool_invoke_params_example(self) -> dict: - return { - "request_id": "test-request-id", - "rating": 5, - "feedback_text": "Test feedback", - }