From ebff3cbb6f2de0098adb6c2deda079d04db273a0 Mon Sep 17 00:00:00 2001 From: ArslanSaleem Date: Fri, 25 Oct 2024 12:44:11 +0200 Subject: [PATCH 1/2] fix[Field_description]: handle error in ai fields when credit limit reached --- backend/app/api/v1/extract.py | 6 ++++++ backend/app/requests/__init__.py | 24 ++++++++++++++++++------ frontend/src/services/extract.tsx | 8 ++++++-- 3 files changed, 30 insertions(+), 8 deletions(-) diff --git a/backend/app/api/v1/extract.py b/backend/app/api/v1/extract.py index 71bddaf..b312e32 100644 --- a/backend/app/api/v1/extract.py +++ b/backend/app/api/v1/extract.py @@ -1,4 +1,5 @@ from typing import List +from app.exceptions import CreditLimitExceededException from fastapi import APIRouter, Depends, HTTPException from pydantic import BaseModel from sqlalchemy.orm import Session @@ -99,6 +100,11 @@ async def get_field_descriptions( "data": data, } + except CreditLimitExceededException: + raise HTTPException( + status_code=400, detail="Credit limit Reached, Wait next month or upgrade your Plan!" + ) + except Exception as e: logger.error(e) logger.log("Retrying AI field description generation.") diff --git a/backend/app/requests/__init__.py b/backend/app/requests/__init__.py index 3c2f833..3494454 100644 --- a/backend/app/requests/__init__.py +++ b/backend/app/requests/__init__.py @@ -1,6 +1,7 @@ import json import os from app.exceptions import CreditLimitExceededException +from fastapi import HTTPException from .schemas import ExtractFieldsResponse, TextExtractionResponse import requests from app.config import settings @@ -124,6 +125,17 @@ def extract_field_descriptions(api_token, fields): headers=headers, timeout=360, ) + if response.status_code not in [200, 201]: + logger.error( + f"Failed to field description. It returned {response.status_code} code: {response.text}" + ) + if response.status_code == 402: + raise CreditLimitExceededException( + response.json().get("detail", "Credit limit exceeded!") + ) + + raise HTTPException(response.json().get("detail", "Failed to fetch field description")) + # Check the response status code if response.status_code == 201 or response.status_code == 200: return response.json() @@ -203,13 +215,13 @@ def get_user_usage_data(api_token: str): response = requests.post(url, headers=headers) - if response.status_code not in [200, 201]: - logger.error( - f"Failed to fetch usage data. It returned {response.status_code} code: {response.text}" - ) - raise Exception("Failed to fetch usage data") - try: + if response.status_code not in [200, 201]: + logger.error( + f"Failed to fetch usage data. It returned {response.status_code} code: {response.text}" + ) + raise Exception(response.text) + return response.json() except requests.exceptions.JSONDecodeError: logger.error(f"Invalid JSON response from API server: {response.text}") diff --git a/frontend/src/services/extract.tsx b/frontend/src/services/extract.tsx index d974f6f..4c2f53e 100644 --- a/frontend/src/services/extract.tsx +++ b/frontend/src/services/extract.tsx @@ -39,8 +39,12 @@ export const GetAIFieldDescriptions = async ( ); return response; } catch (error) { - if (axios.isAxiosError(error) && error.response?.data?.error) { - throw new Error(error.response.data.error); + if (axios.isAxiosError(error)) { + if (error.response?.data) { + throw new Error(error.response.data.detail); + } else { + throw new Error("Failed to extract data. Please try again."); + } } else { throw new Error("Failed to extract data. Please try again."); } From c232ddfd082074198f68602ab0224dbaa7a3da4b Mon Sep 17 00:00:00 2001 From: ArslanSaleem Date: Fri, 25 Oct 2024 14:41:19 +0200 Subject: [PATCH 2/2] refactor[code]: improve error handling message and exception handling --- backend/app/api/v1/extract.py | 2 +- backend/app/requests/__init__.py | 8 +------- frontend/src/services/extract.tsx | 8 ++++++-- 3 files changed, 8 insertions(+), 10 deletions(-) diff --git a/backend/app/api/v1/extract.py b/backend/app/api/v1/extract.py index b312e32..8c3508d 100644 --- a/backend/app/api/v1/extract.py +++ b/backend/app/api/v1/extract.py @@ -102,7 +102,7 @@ async def get_field_descriptions( except CreditLimitExceededException: raise HTTPException( - status_code=400, detail="Credit limit Reached, Wait next month or upgrade your Plan!" + status_code=402, detail="Credit limit Reached, Wait next month or upgrade your Plan!" ) except Exception as e: diff --git a/backend/app/requests/__init__.py b/backend/app/requests/__init__.py index 3494454..12b917a 100644 --- a/backend/app/requests/__init__.py +++ b/backend/app/requests/__init__.py @@ -137,13 +137,7 @@ def extract_field_descriptions(api_token, fields): raise HTTPException(response.json().get("detail", "Failed to fetch field description")) # Check the response status code - if response.status_code == 201 or response.status_code == 200: - return response.json() - else: - logger.error( - f"Unable to process file during field description generation. It returned {response.status_code} code: {response.text}" - ) - raise Exception("Unable to process file!") + return response.json() def highlight_sentences_in_pdf(api_token, sentences, file_path, output_path): diff --git a/frontend/src/services/extract.tsx b/frontend/src/services/extract.tsx index 4c2f53e..45e85b8 100644 --- a/frontend/src/services/extract.tsx +++ b/frontend/src/services/extract.tsx @@ -43,10 +43,14 @@ export const GetAIFieldDescriptions = async ( if (error.response?.data) { throw new Error(error.response.data.detail); } else { - throw new Error("Failed to extract data. Please try again."); + throw new Error( + "Failed to generate AI field descriptions. Please try again." + ); } } else { - throw new Error("Failed to extract data. Please try again."); + throw new Error( + "Failed to generate AI field descriptions. Please try again." + ); } } };