# app/main.py from fastapi import FastAPI, HTTPException from pydantic import BaseModel import numpy as np from services.sms_service import classify_sms, load_trained_model from schemas.input_schemas import CosineSimilarityInput, CosineSimilarityOutput from schemas.input_schemas import EmbeddingInput, EmbeddingOutput # Initialize FastAPI app = FastAPI() # Load the models from the 'models' folder model, vectorizer = load_trained_model() # Function to compute cosine similarity def cosine_similarity(vec1, vec2): """ Compute cosine similarity between two vectors. """ norm1 = np.linalg.norm(vec1) norm2 = np.linalg.norm(vec2) if norm1 == 0 or norm2 == 0: return 0.0 # Prevent division by zero return np.dot(vec1, vec2) / (norm1 * norm2) # 🚀 1️⃣ Homepage Endpoint @app.get("/") async def home(): return {"message": "Welcome to SMS Classification API"} # 📩 2️⃣ SMS Classification Endpoint class MessageInput(BaseModel): message: str @app.post("/predict_label/") async def classify_sms_endpoint(input_data: MessageInput): """ Classify an SMS as either 'Transaction' or 'Offer'. """ try: return classify_sms(input_data.message, model, vectorizer) except Exception as e: raise HTTPException(status_code=500, detail=f"Unexpected error: {str(e)}") # 🔢 3️⃣ Cosine Similarity Endpoint @app.post("/cosine_similarity/", response_model=CosineSimilarityOutput) async def compute_similarity(input_data: CosineSimilarityInput): """ Compute cosine similarity between two input texts. """ try: # Transform the input texts using the TF-IDF vectorizer text1_vectorized = vectorizer.transform([input_data.text1]) text2_vectorized = vectorizer.transform([input_data.text2]) # Compute the cosine similarity between the two text embeddings similarity = cosine_similarity(text1_vectorized.toarray(), text2_vectorized.toarray()) return CosineSimilarityOutput(cosine_similarity=round(float(similarity), 4)) except Exception as e: raise HTTPException(status_code=500, detail=f"Error computing similarity: {str(e)}") # 🧠 4️⃣ Get Embedding of Text Message @app.post("/get_embedding/", response_model=EmbeddingOutput) async def get_embedding(input_data: EmbeddingInput): """ Get the embedding (vector representation) of an input text message. """ try: # Transform the input text using the TF-IDF vectorizer text_embedding = vectorizer.transform([input_data.message]).toarray().tolist() return EmbeddingOutput(embedding=text_embedding[0]) except Exception as e: raise HTTPException(status_code=500, detail=f"Error generating embedding: {str(e)}")