from fastapi import FastAPI, HTTPException from fastapi.middleware.cors import CORSMiddleware from pydantic import BaseModel from typing import List from groq import Groq import pandas as pd import os from dotenv import load_dotenv load_dotenv() # Initialize FastAPI app app = FastAPI() app.add_middleware( CORSMiddleware, allow_origins=[ "https://askalquran.com", "https://www.askalquran.com", "http://localhost:3000", "http://127.0.0.1:3000", "http://0.0.0.0:3000" ], allow_credentials=True, allow_methods=["*"], allow_headers=["*"], # ... other parameters ) # Load Groq API key api_key = os.getenv("GROQ_API_KEY") if not api_key: raise EnvironmentError("GROQ_API_KEY environment variable not set.") client = Groq(api_key=api_key) # Load Quran data try: data = pd.read_csv('quran_arabic.csv', encoding='utf-8') new_data = data[['verse_key', 'text_uthmani']] verse_dict = dict(zip(new_data['verse_key'], new_data['text_uthmani'])) except FileNotFoundError: raise FileNotFoundError("CSV file 'quran_arabic.csv' not found. Please check the path.") class VerseItem(BaseModel): surahNo: int verseNo: int verseText: str class TafsirRequest(BaseModel): verses: List[VerseItem] # Prompt builder def build_arabic_prompt(text: str) -> str: return ( "أنت عالم متخصص في تفسير القرآن الكريم.\n" "يرجى تقديم تفسير مختصر ومبسط للآية التالية:\n\n" f"{text}\n\n" " اكتب التفسير باللغة العربية الفصحى وبأسلوب مختصر و واضح وميسر للقارئ العام." ) # Call Groq LLM def query_llm_arabic(prompt: str) -> str: try: response = client.chat.completions.create( model="llama3-70b-8192", messages=[{"role": "user", "content": prompt}], temperature=0.3 ) return response.choices[0].message.content except Exception as e: raise HTTPException(status_code=500, detail=f"LLM Error: {str(e)}") # Tafsir logic for list of verses def get_tafsir_for_verses(verses: List[VerseItem]) -> List[dict]: results = {} final_prompts = "" for verse in verses: prompt = str(verse.surahNo) + ":" + str(verse.verseNo) + "\t" + verse.verseText final_prompts += prompt + "\n" results = build_arabic_prompt(final_prompts) tafsir = query_llm_arabic(results) results = { "verseText": final_prompts, "tafsir": tafsir } return results # API endpoint @app.post("/tafsir") async def get_tafsir(request: TafsirRequest): return get_tafsir_for_verses(request.verses) # Health check @app.get("/health") def health_check(): return {"status": "ok", "quran_verses_loaded": len(verse_dict)}