diff --git a/edenai_apis/apis/winstonai/config.py b/edenai_apis/apis/winstonai/config.py index 3cde3e5ea..27bd78606 100644 --- a/edenai_apis/apis/winstonai/config.py +++ b/edenai_apis/apis/winstonai/config.py @@ -1 +1 @@ -WINSTON_AI_API_URL = "https://api.gowinston.ai/functions/v1" +WINSTON_AI_API_URL = "https://api.gowinston.ai" diff --git a/edenai_apis/apis/winstonai/winstonai_api.py b/edenai_apis/apis/winstonai/winstonai_api.py index 3aa3b9910..3fb8d44d2 100644 --- a/edenai_apis/apis/winstonai/winstonai_api.py +++ b/edenai_apis/apis/winstonai/winstonai_api.py @@ -1,9 +1,6 @@ import json from http import HTTPStatus -from typing import Any, Dict, Optional, Sequence -from uuid import uuid4 - -import httpx +from typing import Dict, Sequence, Any, Optional import requests from edenai_apis.apis.winstonai.config import WINSTON_AI_API_URL @@ -24,7 +21,7 @@ from edenai_apis.loaders.loaders import load_provider from edenai_apis.utils.exception import ProviderException from edenai_apis.utils.types import ResponseType -from edenai_apis.utils.upload_s3 import aupload_file_bytes_to_s3, upload_file_to_s3 +from edenai_apis.utils.upload_s3 import upload_file_to_s3 class WinstonaiApi(ProviderInterface, TextInterface, ImageInterface): @@ -48,11 +45,11 @@ def image__ai_detection( if not file_url and not file: raise ProviderException("file or file_url required") - payload = json.dumps({"url": file_url or upload_file_to_s3(file, file)}) + payload = json.dumps({"url": file_url or upload_file_to_s3(file, file), "version": "latest"}) response = requests.request( "POST", - f"{self.api_url}/image-detection", + f"{self.api_url}/v2/image-detection", headers=self.headers, data=payload, ) @@ -77,67 +74,27 @@ def image__ai_detection( standardized_response=standardized_response, ) - async def image__aai_detection( - self, file: Optional[str] = None, file_url: Optional[str] = None, **kwargs - ) -> ResponseType[ImageAiDetectionDataclass]: - if not file_url and not file: - raise ProviderException("file or file_url required") - - if file and not file_url: - from io import BytesIO - - with open(file, "rb") as f: - file_bytes = BytesIO(f.read()) - url = await aupload_file_bytes_to_s3(file_bytes, file) - else: - url = file_url - - payload = json.dumps({"url": url}) - - async with httpx.AsyncClient(timeout=httpx.Timeout(10.0, read=120.0)) as client: - response = await client.request( - "POST", - f"{self.api_url}/image-detection", - headers=self.headers, - data=payload, - ) - - if response.status_code != 200: - raise ProviderException(response.json(), code=response.status_code) - - original_response = response.json() - - score = 1 - original_response.get("score") / 100 - prediction = ImageAiDetectionDataclass.set_label_based_on_score(score) - if score is None: - raise ProviderException(response.json()) - - standardized_response = ImageAiDetectionDataclass( - ai_score=score, - prediction=prediction, - ) - - return ResponseType[ImageAiDetectionDataclass]( - original_response=original_response, - standardized_response=standardized_response, - ) - def text__ai_detection( self, text: str, provider_params: Optional[Dict[str, Any]] = None, **kwargs ) -> ResponseType[AiDetectionDataClass]: if provider_params is None: provider_params = {} + + # WinstonAI has a minimum characters limit of 300 characters for his API + if len(text) < 300: + raise ProviderException("Make sure the text is at least 300 characters long before sending a detection request") + payload = json.dumps( { "text": text, "sentences": True, - "language": provider_params.get("language", "en"), - "version": provider_params.get("version", "2.0"), + "language": provider_params.get("language", "auto"), + "version": provider_params.get("version", "latest"), } ) response = requests.request( - "POST", f"{self.api_url}/predict", headers=self.headers, data=payload + "POST", f"{self.api_url}/v2/ai-content-detection", headers=self.headers, data=payload ) if response.status_code >= HTTPStatus.INTERNAL_SERVER_ERROR: @@ -171,54 +128,6 @@ def text__ai_detection( standardized_response=standardized_response, ) - async def text__aai_detection( - self, text: str, provider_params: Optional[Dict[str, Any]] = None, **kwargs - ) -> ResponseType[AiDetectionDataClass]: - if provider_params is None: - provider_params = {} - payload = { - "text": text, - "sentences": True, - "language": provider_params.get("language", "en"), - "version": provider_params.get("version", "2.0"), - } - - async with httpx.AsyncClient(timeout=60) as client: - response = await client.post( - f"{self.api_url}/predict", headers=self.headers, data=payload - ) - - if response.status_code >= HTTPStatus.INTERNAL_SERVER_ERROR: - raise ProviderException("Internal Server Error") - - if response.status_code != 200: - raise ProviderException(response.json(), code=response.status_code) - - original_response = response.json() - score = original_response.get("score") / 100 - sentences = original_response.get("sentences") - - if score is None or sentences is None: - raise ProviderException(response.json()) - - items: Sequence[AiDetectionItem] = [ - AiDetectionItem( - text=sentence["text"], - ai_score=1 - (sentence["score"] / 100), - prediction=AiDetectionItem.set_label_based_on_score( - 1 - (sentence["score"] / 100) - ), - ) - for sentence in sentences - ] - - standardized_response = AiDetectionDataClass(ai_score=1 - score, items=items) - - return ResponseType[AiDetectionDataClass]( - original_response=original_response, - standardized_response=standardized_response, - ) - def text__plagia_detection( self, text: str, @@ -232,70 +141,12 @@ def text__plagia_detection( { "text": text, "language": provider_params.get("language", "en"), - "version": provider_params.get("version", "2.0"), } ) response = requests.request( - "POST", f"{self.api_url}/plagiarism", headers=self.headers, data=payload - ) - - if response.status_code != 200: - raise ProviderException(response.json(), code=response.status_code) - - original_response = response.json() - results = original_response.get("results") - - if results is None: - raise ProviderException(response.json()) - - standardized_response = PlagiaDetectionDataClass( - plagia_score=original_response["score"], - items=[ - PlagiaDetectionItem( - text=result["title"], - candidates=[ - PlagiaDetectionCandidate( - url=result["url"], - plagia_score=1, - prediction="plagiarized", - plagiarized_text=excerpt, - ) - for excerpt in result["excerpts"] - ], - ) - for result in results - ], - ) - - return ResponseType[PlagiaDetectionDataClass]( - original_response=original_response, - standardized_response=standardized_response, - ) - - async def text__aplagia_detection( - self, - text: str, - title: str = "", - provider_params: Optional[Dict[str, Any]] = None, - **kwargs, - ) -> ResponseType[PlagiaDetectionDataClass]: - if provider_params is None: - provider_params = {} - payload = json.dumps( - { - "text": text, - "language": provider_params.get("language", "en"), - "version": provider_params.get("version", "2.0"), - } + "POST", f"{self.api_url}/v1/plagiarism", headers=self.headers, data=payload ) - async with httpx.AsyncClient(timeout=60) as client: - response = await client.post( - f"{self.api_url}/plagiarism", headers=self.headers, data=payload - ) - - if response.status_code >= HTTPStatus.INTERNAL_SERVER_ERROR: - raise ProviderException("Internal Server Error") if response.status_code != 200: raise ProviderException(response.json(), code=response.status_code) @@ -328,4 +179,4 @@ async def text__aplagia_detection( return ResponseType[PlagiaDetectionDataClass]( original_response=original_response, standardized_response=standardized_response, - ) + ) \ No newline at end of file