Spaces:
Runtime error
Runtime error
import openai | |
import logging | |
import asyncio | |
from tenacity import retry, stop_after_attempt, wait_exponential, retry_if_exception_type | |
from app.core.config import settings, APP_NAME | |
from app.core.exceptions import ServiceError | |
logger = logging.getLogger(f"{APP_NAME}.services.gpt4_rewrite") | |
class GPT4Rewriter: | |
async def rewrite(self, text: str, user_api_key: str, instruction: str) -> dict: | |
try: | |
if not user_api_key: | |
raise ServiceError(status_code=401, detail="OpenAI API key is missing. Please provide your key to use this feature.") | |
text = text.strip() | |
instruction = instruction.strip() | |
if not text: | |
raise ServiceError(status_code=400, detail="Input text is empty for rewriting.") | |
if not instruction: | |
raise ServiceError(status_code=400, detail="Rewrite instruction is missing.") | |
messages = [ | |
{"role": "system", "content": instruction}, | |
{"role": "user", "content": text}, | |
] | |
def _call_openai_api(): | |
client = openai.OpenAI(api_key=user_api_key) | |
response = client.chat.completions.create( | |
model=settings.OPENAI_MODEL, | |
messages=messages, | |
temperature=settings.OPENAI_TEMPERATURE, | |
max_tokens=settings.OPENAI_MAX_TOKENS | |
) | |
return response.choices[0].message.content.strip() | |
result = await asyncio.to_thread(_call_openai_api) | |
return {"rewritten_text": result} | |
except openai.APIStatusError as e: | |
logger.error(f"OpenAI API status error: {e.status_code} - {e.response}", exc_info=True) | |
detail_message = "An OpenAI API error occurred." | |
if e.status_code == 401: | |
detail_message = "Invalid OpenAI API key. Please check your key." | |
elif e.status_code == 429: | |
detail_message = "OpenAI API rate limit exceeded or quota exhausted. Please try again later." | |
elif e.status_code == 400: | |
detail_message = f"OpenAI API request error: {e.response.json().get('detail', e.message)}" | |
raise ServiceError(status_code=e.status_code, detail=detail_message) from e | |
except openai.APITimeoutError as e: | |
logger.error(f"OpenAI API timeout error: {e}", exc_info=True) | |
raise ServiceError(status_code=504, detail="OpenAI API request timed out. Please try again.") from e | |
except openai.APIConnectionError as e: | |
logger.error(f"OpenAI API connection error: {e}", exc_info=True) | |
raise ServiceError(status_code=503, detail="Could not connect to OpenAI API. Please check your internet connection.") from e | |
except openai.APIError as e: | |
logger.error(f"OpenAI API error: {e}", exc_info=True) | |
raise ServiceError(status_code=500, detail=f"An unexpected OpenAI API error occurred: {str(e)}") from e | |
except ServiceError as e: | |
raise e | |
except Exception as e: | |
logger.error(f"Unexpected error in GPT-4 rewrite for text: '{text[:50]}...'", exc_info=True) | |
raise ServiceError(status_code=500, detail="An unexpected error occurred during rewriting.") from e | |