99 lines
2.8 KiB
Python

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)}