from logging import getLogger from typing import Dict, Optional from httpx import AsyncClient from ielts_be.services import IAIDetectorService class GPTZero(IAIDetectorService): _GPT_ZERO_ENDPOINT = 'https://api.gptzero.me/v2/predict/text' def __init__(self, client: AsyncClient, gpt_zero_key: str): self._header = { 'x-api-key': gpt_zero_key } self._http_client = client self._logger = getLogger(__name__) async def run_detection(self, text: str): data = { 'document': text, 'version': '', 'multilingual': False } response = await self._http_client.post(self._GPT_ZERO_ENDPOINT, headers=self._header, json=data) if response.status_code != 200: return None return self._parse_detection(response.json()) def _parse_detection(self, response: Dict) -> Optional[Dict]: try: text_scan = response["documents"][0] filtered_sentences = [ { "sentence": item["sentence"], "highlight_sentence_for_ai": item["highlight_sentence_for_ai"] } for item in text_scan["sentences"] ] return { "class_probabilities": text_scan["class_probabilities"], "confidence_category": text_scan["confidence_category"], "predicted_class": text_scan["predicted_class"], "sentences": filtered_sentences } except Exception as e: self._logger.error(f'Failed to parse GPT\'s Zero response: {str(e)}') return None