Compare commits

..

2 Commits

Author SHA1 Message Date
owusu 34ddbd50dd Merge pull request 'updated eployment script' (#2) from dev into main
Reviewed-on: #2
2025-06-11 20:29:14 +00:00
owusu bf2379e39d Merge pull request 'prod deploy version' (#1) from dev into main
Reviewed-on: #1
2025-06-11 16:58:47 +00:00
6 changed files with 10 additions and 108 deletions
+3 -52
View File
@@ -1,6 +1,6 @@
import os
from typing import Optional
from fastapi import FastAPI, HTTPException, Security, Depends, Request
from fastapi import FastAPI, HTTPException, Security, Depends
from fastapi.security import APIKeyHeader
from fastapi.middleware.cors import CORSMiddleware
from fastapi.responses import JSONResponse
@@ -27,23 +27,9 @@ import os
from PyPDF2 import PdfReader
from config import QUIZ_TYPES
from config import Config
import logging
import time
# Load environment variables
load_dotenv()
from config import Config
API_KEY = Config.API_KEY_ACCESS
# Configure logging
logging.basicConfig(
level=logging.INFO,
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s'
)
logger = logging.getLogger(__name__)
# Also configure uvicorn logger
uvicorn_logger = logging.getLogger("uvicorn.access")
uvicorn_logger.setLevel(logging.INFO)
API_KEY = os.getenv("API_KEY_ACCESS")
base_path = os.path.join("data", "config_files")
QUESTIONS_PATH = os.path.join(base_path, "questions.json")
@@ -60,40 +46,6 @@ app = FastAPI(
version="1.0.0"
)
# Add request logging middleware
@app.middleware("http")
async def log_requests(request: Request, call_next):
start_time = time.time()
# Log incoming request (using both logger and print for visibility)
log_msg = f"🔥 INCOMING REQUEST: {request.method} {request.url}"
logger.info(log_msg)
print(log_msg)
# Get request body for POST requests
if request.method == "POST":
body = await request.body()
body_msg = f"🔥 Request Body: {body.decode('utf-8') if body else 'Empty'}"
logger.info(body_msg)
print(body_msg)
# Re-create request with body for downstream processing
async def receive():
return {"type": "http.request", "body": body}
request._receive = receive
response = await call_next(request)
# Log response
process_time = time.time() - start_time
response_msg = f"🔥 RESPONSE: {response.status_code} - Time: {process_time:.4f}s"
logger.info(response_msg)
print(response_msg)
return response
# Add CORS middleware
app.add_middleware(
CORSMiddleware,
@@ -116,7 +68,6 @@ async def get_api_key(api_key_header: str = Security(api_key_header)) -> str:
)
token = api_key_header.split(' ')[1]
print(f"Token : {token}")
if token != API_KEY:
raise HTTPException(
status_code=401,
@@ -337,7 +288,7 @@ async def generate_pdf_endpoint(
if request.form_id:
print(f"Fetching form response for form_id: {request.form_id}") # Debugging print
try:
x_api_key = Config.BACKEND_XAPI_KEY
x_api_key = os.getenv("BACKEND_XAPI_KEY")
url = f"{backend_base_url}/v3/api/custom/theme-document/answer/{request.form_id}?x-project={x_api_key}"
result = requests.get(url)
result.raise_for_status() # Ensure we raise an error for bad responses
-3
View File
@@ -1,7 +1,4 @@
import os
from dotenv import load_dotenv
load_dotenv()
QUIZ_TYPES = {
1: {
"name": "Single Line Text Inputs",
+1
View File
@@ -0,0 +1 @@
18759
-4
View File
@@ -25,7 +25,3 @@ reportlab==4.3.1
python-docx==1.1.2
unstructured==0.17.2
pypdf==5.4.0
gunicorn==23.0.0
python-dotenv
+6 -46
View File
@@ -62,8 +62,6 @@ def setup_prompt_template(theme: int, resume: str,full_history=None,form_respons
("system", chat_prompt(theme, resume,full_history,form_response,generate_theme)),
MessagesPlaceholder(variable_name="messages")
])
def fetch_conversation_history(conversation_id: str) -> List[Message]:
"""
Fetch conversation history from the API using the conversation ID.
@@ -76,54 +74,18 @@ def fetch_conversation_history(conversation_id: str) -> List[Message]:
response = requests.get(url)
response.raise_for_status() # Raise an error for bad responses
data = response.json()["data"] # First JSON parse
if isinstance(data, str):
print("Data is a string, parsing as JSON...")
data = json.loads(data)
data = json.loads(json.loads(data))
# Parse the API response into Message objects
messages = []
# Check if data exists and is a list
if data and isinstance(data, list):
for item in data:
# Check if item is a dictionary
if isinstance(item, dict):
role = item.get("role", "unknown")
content = item.get("content", "")
timestamp = datetime.now().isoformat() # Use current timestamp if not provided
messages.append(Message(role=role, content=content))
elif isinstance(item, str):
# If item is a string, it might be JSON that needs parsing
try:
parsed_item = json.loads(item)
if isinstance(parsed_item, dict):
role = parsed_item.get("role", "unknown")
content = parsed_item.get("content", "")
messages.append(Message(role=role, content=content))
else:
print(f"Parsed item is not a dict: {parsed_item}")
except json.JSONDecodeError as json_err:
print(f"Failed to parse JSON string: {item}, error: {json_err}")
else:
print(f"Unexpected item type: {type(item)} for item: {item}")
else:
print(f"No data or data is not a list. Data: {data}")
for item in data:
role = item.get("role", "unknown")
content = item.get("content", "")
timestamp = datetime.now().isoformat() # Use current timestamp if not provided
messages.append(Message(role=role, content=content))
return messages
except requests.RequestException as e:
print(f"Error fetching conversation history: {e}")
return []
except KeyError as e:
print(f"Expected key not found in response: {e}")
return []
except Exception as e:
print(f"Unexpected error: {e}")
return []
def convert_to_langchain_messages(messages: List[Message]) -> List[HumanMessage | AIMessage]:
@@ -168,8 +130,6 @@ def ai_chat(query: str, conversation_id: str, theme_id: int, resume: str, full_h
# Fetch conversation history from the API
history = fetch_conversation_history(conversation_id)
print(history)
config = {"configurable": {"thread_id": conversation_id}}
language = "English"
-3
View File
@@ -3,8 +3,5 @@
# Create logs directory if it doesn't exist
mkdir -p logs
# Activate virtual environment
source venv/bin/activate
# Start Gunicorn with the configuration
gunicorn -c gunicorn_config.py app:app