devpro / app.py
abinivas8's picture
Update app.py
1334733 verified
import gradio as gr
import joblib
import numpy as np
import pandas as pd
from sklearn.preprocessing import StandardScaler
from fastapi import FastAPI, HTTPException
from pydantic import BaseModel
import uvicorn
import os
# Create FastAPI app
app = FastAPI(title="Developer Productivity Prediction API", version="1.0.0")
# Load the trained model and scaler
model = joblib.load('developer_productivity_model.joblib')
scaler = joblib.load('scaler.joblib')
# Pydantic model for API request
class ProductivityRequest(BaseModel):
daily_coding_hours: float
commits_per_day: int
pull_requests_per_week: int
issues_closed_per_week: int
active_repos: int
code_reviews_per_week: int
class ProductivityResponse(BaseModel):
predicted_score: float
status: str
def predict_productivity_core(daily_coding_hours, commits_per_day, pull_requests_per_week,
issues_closed_per_week, active_repos, code_reviews_per_week):
"""
Core prediction function used by both API and Gradio interface.
"""
try:
# Create feature array
features = np.array([[
daily_coding_hours,
commits_per_day,
pull_requests_per_week,
issues_closed_per_week,
active_repos,
code_reviews_per_week
]])
# Scale features
features_scaled = scaler.transform(features)
# Make prediction
prediction = model.predict(features_scaled)[0]
return round(prediction, 2)
except Exception as e:
raise HTTPException(status_code=500, detail=f"Prediction error: {str(e)}")
# FastAPI endpoints
@app.get("/")
def read_root():
return {"message": "Developer Productivity Prediction API", "status": "active"}
@app.post("/predict", response_model=ProductivityResponse)
def predict_productivity_api(request: ProductivityRequest):
"""
API endpoint to predict developer productivity score.
"""
try:
prediction = predict_productivity_core(
request.daily_coding_hours,
request.commits_per_day,
request.pull_requests_per_week,
request.issues_closed_per_week,
request.active_repos,
request.code_reviews_per_week
)
return ProductivityResponse(
predicted_score=prediction,
status="success"
)
except Exception as e:
raise HTTPException(status_code=500, detail=str(e))
@app.get("/health")
def health_check():
return {"status": "healthy", "model_loaded": True}
# Gradio interface for web UI
def predict_productivity_gradio(daily_coding_hours, commits_per_day, pull_requests_per_week,
issues_closed_per_week, active_repos, code_reviews_per_week):
"""
Gradio wrapper for the prediction function.
"""
try:
prediction = predict_productivity_core(
daily_coding_hours,
commits_per_day,
pull_requests_per_week,
issues_closed_per_week,
active_repos,
code_reviews_per_week
)
return f"Predicted Productivity Score: {prediction}"
except Exception as e:
return f"Error: {str(e)}"
# Create Gradio interface
iface = gr.Interface(
fn=predict_productivity_gradio,
inputs=[
gr.Slider(minimum=1, maximum=12, value=4.0, step=0.1, label="Daily Coding Hours"),
gr.Slider(minimum=0, maximum=20, value=5, step=1, label="Commits per Day"),
gr.Slider(minimum=0, maximum=15, value=4, step=1, label="Pull Requests per Week"),
gr.Slider(minimum=0, maximum=15, value=3, step=1, label="Issues Closed per Week"),
gr.Slider(minimum=1, maximum=20, value=5, step=1, label="Active Repositories"),
gr.Slider(minimum=0, maximum=15, value=3, step=1, label="Code Reviews per Week")
],
outputs=gr.Textbox(label="Prediction Result"),
title="๐Ÿš€ Developer Productivity Predictor",
description="""
### Predict Developer Productivity Score
This model predicts developer productivity based on 6 key metrics:
- **Daily Coding Hours**: Time spent actively coding
- **Commits per Day**: Average daily code commits
- **Pull Requests per Week**: Weekly pull requests created
- **Issues Closed per Week**: Weekly issues resolved
- **Active Repositories**: Number of repositories worked on
- **Code Reviews per Week**: Weekly code reviews performed
**API Endpoint**: Use `/predict` with POST request for programmatic access.
""",
examples=[
[4.0, 5, 4, 3, 5, 3], # Your specified values
[6.0, 10, 8, 6, 8, 5], # High productivity example
[3.0, 2, 2, 1, 2, 1], # Beginner example
],
theme=gr.themes.Soft()
)
# Mount Gradio app with FastAPI
app = gr.mount_gradio_app(app, iface, path="/")
if __name__ == "__main__":
port = int(os.environ.get("PORT", 7860))
uvicorn.run(app, host="0.0.0.0", port=port)