File size: 5,042 Bytes
1334733
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
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)