Spaces:
Running
Running
from fastapi import FastAPI, UploadFile, Form, HTTPException | |
from pydantic import BaseModel | |
import uvicorn | |
from fastapi.responses import JSONResponse | |
from typing import Dict | |
import hashlib | |
from openai import OpenAI | |
from dotenv import load_dotenv | |
import os | |
load_dotenv() | |
client = OpenAI(api_key=os.getenv('OPENAI_API_KEY')) | |
# from pathlib import Path | |
# from langchain_community.document_loaders import WebBaseLoade as genai | |
import os | |
import re | |
import pandas as pd | |
from fastapi.middleware.cors import CORSMiddleware | |
from firebase_admin import firestore | |
import json | |
import google.generativeai as genai | |
from google.generativeai import GenerativeModel | |
# Initialize Gemini LLM | |
# load_dotenv() | |
# Google_key = os.getenv("GOOGLE_API_KEY") | |
# print(str(Google_key)) | |
genai.configure(api_key=os.getenv("GOOGLE_API_KEY")) | |
model = genai.GenerativeModel("gemini-2.0-flash") | |
import firebase_admin | |
from firebase_admin import credentials | |
cred_dict = { | |
"type": "service_account", | |
"project_id": os.environ.get("FIREBASE_PROJECT_ID", "fir-502e5"), | |
"private_key_id": os.environ.get("FIREBASE_PRIVATE_KEY_ID"), | |
"private_key": os.environ.get("FIREBASE_PRIVATE_KEY", "").replace("\\n", "\n"), | |
"client_email": os.environ.get("FIREBASE_CLIENT_EMAIL"), | |
"client_id": os.environ.get("FIREBASE_CLIENT_ID"), | |
"auth_uri": "https://accounts.google.com/o/oauth2/auth", | |
"token_uri": "https://oauth2.googleapis.com/token", | |
"auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs", | |
"client_x509_cert_url": os.environ.get("FIREBASE_CLIENT_X509_CERT_URL"), | |
"universe_domain": "googleapis.com" | |
} | |
# cred = credentials.Certificate("/content/ir-502e5-firebase-adminsdk-3der0-0145a61d7a.json") | |
# firebase_admin.initialize_app(cred) | |
app = FastAPI() | |
app.add_middleware( | |
CORSMiddleware, | |
allow_origins=["*"], | |
allow_credentials=True, | |
allow_methods=["*"], | |
allow_headers=["*"], | |
) | |
def generate_df(): | |
data = [] | |
cred = credentials.Certificate(cred_dict) | |
firebase_admin.initialize_app(cred) | |
db = firestore.client() | |
docs = db.collection("test_results").get() | |
for doc in docs: | |
doc_data = doc.to_dict() | |
doc_data['id'] = doc.id | |
data.append(doc_data) | |
df = pd.DataFrame(data) | |
return df | |
def generate_feedback(email, test_id): | |
df = generate_df() | |
df_email = df[df['email'] == email] | |
df_test_id = df_email[df_email['id'] == test_id] | |
if not df_test_id.empty: | |
response = df_test_id['responses'].values[0] | |
feedback = model.generate_content(f"""You are an experienced tutor analyzing a student's test responses to provide constructive feedback. Below is the student's test history in JSON format. Your task is to: | |
Identify Strengths: Highlight areas where the student performed well, demonstrating a strong understanding of the concepts. | |
Identify Weaknesses: Point out areas where the student struggled or made consistent errors, indicating gaps in understanding. | |
Provide Actionable Suggestions: Offer specific advice on how the student can improve their performance in future tests. | |
Encourage and Motivate: End with positive reinforcement to keep the student motivated. | |
Test History:{str(response)} """) | |
return feedback.text | |
else: | |
print("No test results found for this id") | |
def generate_overall_feedback(email): | |
df = generate_df() | |
df_email = df[df['email'] == email] | |
if not df_email.empty: | |
response = df_email['responses'].values | |
feedback = model.generate_content(f"""You are an experienced tutor analyzing a student's test responses to provide constructive feedback. Below is the student's test history in list format. Your task is to: | |
Identify Strengths: Highlight areas where the student performed well, demonstrating a strong understanding of the concepts. | |
Identify Weaknesses: Point out areas where the student struggled or made consistent errors, indicating gaps in understanding. | |
Provide Actionable Suggestions: Offer specific advice on how the student can improve their performance in future tests. | |
Encourage and Motivate: End with positive reinforcement to keep the student motivated. | |
Test History:{str(response)} """) | |
return feedback.text | |
else: | |
print("Please try again with a valid email") | |
async def get_single_feedback(email: str, test_id: str): | |
feedback = generate_feedback(email, test_id) | |
return JSONResponse(content={"feedback": feedback}) | |
async def get_overall_feedback(email: str): | |
feedback = generate_overall_feedback(email) | |
return JSONResponse(content={"feedback": feedback}) | |
async def get_strong_weak_topics(email: str): | |
df = generate_df() | |
df_email = df[df['email'] == email] | |
if not df_email.empty: | |
response = df_email['responses'].values | |
# Assuming response is a list of responses | |
formatted_data = str(response) # Convert response to a string format suitable for the API call | |
section_info = { | |
'filename': 'student_performance', | |
'schema': { | |
'weak_topics': ['Topic#1', 'Topic#2', '...'], | |
'strong_topics': ['Topic#1', 'Topic#2', '...'] | |
} | |
} | |
# Generate response using the client | |
completion = client.chat.completions.create( | |
model="gpt-4o", | |
response_format={"type": "json_object"}, | |
messages=[ | |
{ | |
"role": "system", | |
"content": f"""You are an Educational Performance Analyst focusing on {section_info['filename'].replace('_', ' ')}. | |
Analyze the provided student responses to identify and categorize topics into 'weak' and 'strong' based on their performance. Try to give | |
high level topics like algebra, trignometry, geometry etc in your response. | |
Do not add any explanations, introduction, or comments - return ONLY valid JSON. | |
""" | |
}, | |
{ | |
"role": "user", | |
"content": f""" | |
Here is the raw data for {section_info['filename']}: | |
{formatted_data} | |
Convert this data into JSON that matches this schema: | |
{json.dumps(section_info['schema'], indent=2)} | |
""" | |
} | |
], | |
temperature=0.0 | |
) | |
# Extract the JSON content from the completion object | |
strong_weak_topics = completion.choices[0].message.content # Access the content attribute directly | |
return JSONResponse(content=json.loads(strong_weak_topics)) | |
else: | |
return JSONResponse(content={"error": "No test results found for this email"}) | |
if __name__ == "__main__": | |
uvicorn.run(app, host="0.0.0.0", port=7860) |