VaneshDev commited on
Commit
27ab826
·
verified ·
1 Parent(s): 3cdd4e1

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +112 -127
app.py CHANGED
@@ -1,20 +1,26 @@
1
- import pandas as pd
 
 
2
  import requests
3
  import gradio as gr
4
- import logging
5
- from uuid import uuid4
6
  from simple_salesforce import Salesforce
7
 
8
- # Salesforce credentials - replace with yours securely
 
 
 
 
 
 
 
 
9
  SALESFORCE_USERNAME = "vaneshdevarapalli866@agentforce.com"
10
  SALESFORCE_PASSWORD = "vanesh@331"
11
  SALESFORCE_SECURITY_TOKEN = "VRUVbBOdG0s9Q4xy0W6DB1Y6b"
12
 
13
- # Configure logging
14
- logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
15
- logger = logging.getLogger(__name__)
16
 
17
- # Connect to Salesforce
18
  def connect_to_salesforce():
19
  try:
20
  sf_instance = Salesforce(
@@ -26,136 +32,115 @@ def connect_to_salesforce():
26
  logger.info("Connected to Salesforce successfully.")
27
  return sf_instance
28
  except Exception as e:
29
- logger.error(f"Salesforce connection failed: {e}")
30
  raise
31
 
32
  sf = connect_to_salesforce()
33
 
34
- # Load dataset
35
- def load_dataset(file_path="equipment_data.csv"):
36
  try:
37
- df = pd.read_csv(file_path)
38
- required_columns = ["Equipment_ID__c", "Equipment_Type__c", "Usage_Hours__c", "Idle_Hours__c"]
39
- optional_columns = ["Movement_Frequency__c", "Cost_Per_Hour__c"]
40
- missing_required = [col for col in required_columns if col not in df.columns]
41
- if missing_required:
42
- logger.error(f"Missing required columns: {missing_required}")
43
- return None
44
-
45
- # Convert numeric columns properly
46
- numeric_cols = [col for col in required_columns + optional_columns if col in df.columns and col not in ["Equipment_ID__c", "Equipment_Type__c"]]
47
- for col in numeric_cols:
48
- df[col] = pd.to_numeric(df[col], errors='coerce')
49
-
50
- # Fill NaNs with 0 for numeric columns
51
- if df[numeric_cols].isnull().any().any():
52
- logger.warning("NaN detected in numeric columns, filling with 0")
53
- df[numeric_cols] = df[numeric_cols].fillna(0)
54
-
55
- # Add missing optional columns
56
- for col in optional_columns:
57
- if col not in df.columns:
58
- df[col] = 0.0
59
- return df
60
  except Exception as e:
61
- logger.error(f"Failed to load dataset: {e}")
62
- return None
63
-
64
- df = load_dataset()
65
- equipment_types = sorted(df["Equipment_Type__c"].dropna().unique().tolist()) if df is not None and not df.empty else ["No Equipment Types"]
66
- suggestion_types = ["Move", "Pause Rent", "Repair", "Replace"]
67
-
68
- # Dummy AI suggestion function (Replace with your actual AI integration)
69
- def call_model(row):
70
- # Example logic for AI suggestion (random or based on usage hours)
71
- usage = float(row.get("Usage_Hours__c", 0))
72
- if usage > 8:
73
- return "Pause Rent", 0.9
74
- elif usage > 4:
75
- return "Move", 0.8
76
- else:
77
- return "Repair", 0.7
78
-
79
- # Filter equipment by type and suggestion
80
- def filter_equipment(equipment_type, suggestion):
81
- if not equipment_type or not suggestion or df is None or df.empty:
82
- return "No data available or invalid filters selected.", ""
 
 
 
 
83
  try:
84
- filtered = df[df["Equipment_Type__c"].str.lower() == equipment_type.lower()].copy()
85
- if filtered.empty:
86
- return f"No equipment found for type: {equipment_type}.", ""
87
-
88
- # Apply dummy AI model predictions
89
- filtered["AI_Suggestion__c"] = None
90
- filtered["Suggestion_Confidence__c"] = 0.0
91
- for idx, row in filtered.iterrows():
92
- s, conf = call_model(row)
93
- filtered.at[idx, "AI_Suggestion__c"] = s
94
- filtered.at[idx, "Suggestion_Confidence__c"] = conf
95
-
96
- # Filter by suggestion
97
- filtered = filtered[filtered["AI_Suggestion__c"].str.lower() == suggestion.lower()]
98
- if filtered.empty:
99
- return f"No equipment with suggestion '{suggestion}' for type '{equipment_type}'.", ""
100
-
101
- # Generate display text for equipment and confidence
102
- cards = [
103
- f"ID: {row['Equipment_ID__c']} | Usage: {row['Usage_Hours__c']:.2f} hrs | "
104
- f"Idle: {row['Idle_Hours__c']:.2f} hrs | AI Suggestion: {row['AI_Suggestion__c']} "
105
- f"({row['Suggestion_Confidence__c']:.2%})"
106
- for _, row in filtered.iterrows()
107
- ]
108
- confidences = [f"{row['Equipment_ID__c']}: {row['Suggestion_Confidence__c']:.2%}" for _, row in filtered.iterrows()]
109
- return "\n\n".join(cards), "\n".join(confidences)
110
  except Exception as e:
111
- logger.error(f"Error filtering equipment: {e}")
112
- return "An error occurred while filtering equipment.", ""
113
 
114
- # Export filtered results to CSV file
115
- def export_csv(equipment_type, suggestion):
116
- if not equipment_type or not suggestion or df is None or df.empty:
117
- return None
118
  try:
119
- filtered = df[df["Equipment_Type__c"].str.lower() == equipment_type.lower()].copy()
120
- if filtered.empty:
121
- return None
122
- filtered["AI_Suggestion__c"] = None
123
- filtered["Suggestion_Confidence__c"] = 0.0
124
- for idx, row in filtered.iterrows():
125
- s, conf = call_model(row)
126
- filtered.at[idx, "AI_Suggestion__c"] = s
127
- filtered.at[idx, "Suggestion_Confidence__c"] = conf
128
- filtered = filtered[filtered["AI_Suggestion__c"].str.lower() == suggestion.lower()]
129
- if filtered.empty:
130
- return None
131
- filename = f"filtered_equipment_{uuid4().hex[:8]}.csv"
132
- filtered.to_csv(filename, index=False)
133
- return filename
134
  except Exception as e:
135
- logger.error(f"Error exporting CSV: {e}")
136
- return None
137
 
138
- # Build Gradio UI without theme to avoid errors
139
- with gr.Blocks() as app:
140
- gr.Markdown("# Equipment Utilization Dashboard")
141
- gr.Markdown("Filter equipment by type and AI suggestion to optimize utilization.")
142
-
143
- with gr.Row():
144
- etype = gr.Dropdown(choices=equipment_types, label="Equipment Type",
145
- value=equipment_types[0] if equipment_types else None)
146
- suggestion = gr.Dropdown(choices=suggestion_types, label="Suggestion Type",
147
- value=suggestion_types[0])
148
-
149
- details = gr.Textbox(label="Equipment Details", lines=8, placeholder="Select equipment type and suggestion...")
150
- confidence = gr.Textbox(label="Confidence Scores", lines=5, placeholder="Confidence scores will appear here...")
151
-
152
- export_btn = gr.Button("Export to CSV", variant="primary")
153
- csv_file = gr.File(label="Download CSV")
154
-
155
- # Define interactions
156
- etype.change(fn=filter_equipment, inputs=[etype, suggestion], outputs=[details, confidence])
157
- suggestion.change(fn=filter_equipment, inputs=[etype, suggestion], outputs=[details, confidence])
158
- export_btn.click(fn=export_csv, inputs=[etype, suggestion], outputs=csv_file)
 
 
 
 
 
 
 
 
 
 
 
 
159
 
160
  if __name__ == "__main__":
161
- app.launch(share=False)
 
1
+ import datetime
2
+ import logging
3
+ import sys
4
  import requests
5
  import gradio as gr
 
 
6
  from simple_salesforce import Salesforce
7
 
8
+ # Setup logging
9
+ logging.basicConfig(
10
+ level=logging.INFO,
11
+ format="%(asctime)s - %(levelname)s - %(message)s",
12
+ handlers=[logging.StreamHandler(sys.stdout), logging.FileHandler("app_log.txt")]
13
+ )
14
+ logger = logging.getLogger(__name__)
15
+
16
+ # Salesforce credentials — replace with your actual Salesforce credentials
17
  SALESFORCE_USERNAME = "vaneshdevarapalli866@agentforce.com"
18
  SALESFORCE_PASSWORD = "vanesh@331"
19
  SALESFORCE_SECURITY_TOKEN = "VRUVbBOdG0s9Q4xy0W6DB1Y6b"
20
 
21
+ # Hugging Face model endpoint URL — replace with your real endpoint URL
22
+ HUGGINGFACE_API_URL = "https://your-huggingface-model-endpoint"
 
23
 
 
24
  def connect_to_salesforce():
25
  try:
26
  sf_instance = Salesforce(
 
32
  logger.info("Connected to Salesforce successfully.")
33
  return sf_instance
34
  except Exception as e:
35
+ logger.error(f"Failed to connect to Salesforce: {e}")
36
  raise
37
 
38
  sf = connect_to_salesforce()
39
 
40
+ def get_ai_suggestion(usage_hours, idle_hours, movement_frequency, cost_per_hour, last_maintenance_str):
 
41
  try:
42
+ payload = {
43
+ "usage_hours": usage_hours,
44
+ "idle_hours": idle_hours,
45
+ "movement_frequency": movement_frequency,
46
+ "cost_per_hour": cost_per_hour,
47
+ "last_maintenance": last_maintenance_str or ""
48
+ }
49
+ logger.info(f"Calling AI model with payload: {payload}")
50
+ response = requests.post(HUGGINGFACE_API_URL, json=payload, timeout=15)
51
+ response.raise_for_status()
52
+ data = response.json()
53
+ logger.info(f"Received AI response: {data}")
54
+
55
+ suggestion = data.get("suggestion", "No Action")
56
+ confidence = float(data.get("confidence", 0))
57
+ utilization_score = float(data.get("utilization_score", 0))
58
+ return suggestion, confidence, utilization_score
 
 
 
 
 
 
59
  except Exception as e:
60
+ logger.error(f"Error while calling AI model: {e}")
61
+ # Return fallback default values
62
+ return "No Action", 0, 0
63
+
64
+ def process_equipment_utilization(equipment_id, project_id, usage_hours, idle_hours,
65
+ movement_frequency, cost_per_hour, report_link, last_maintenance):
66
+ last_maintenance_str = last_maintenance.strftime("%Y-%m-%d") if last_maintenance else None
67
+
68
+ # Get AI outputs
69
+ ai_suggestion, suggestion_confidence, utilization_score = get_ai_suggestion(
70
+ usage_hours, idle_hours, movement_frequency, cost_per_hour, last_maintenance_str
71
+ )
72
+
73
+ salesforce_record = {
74
+ "Equipment_ID__c": equipment_id,
75
+ "Project_ID__c": project_id,
76
+ "Usage_Hours__c": usage_hours,
77
+ "Idle_Hours__c": idle_hours,
78
+ "AI_Suggestion__c": ai_suggestion,
79
+ "Suggestion_Confidence__c": suggestion_confidence,
80
+ "Utilization_Score__c": utilization_score,
81
+ "Report_Link__c": report_link,
82
+ "Last_Maintenance__c": last_maintenance_str,
83
+ "Dashboard_Flag__c": False
84
+ }
85
+
86
  try:
87
+ response = sf.Equipment_Utilization_Record__c.create(salesforce_record)
88
+ logger.info(f"Record created in Salesforce: {response}")
89
+ return {
90
+ "Salesforce_Record_Id": response.get("id"),
91
+ "status": "Success",
92
+ "AI_Suggestion": ai_suggestion,
93
+ "Suggestion_Confidence": suggestion_confidence,
94
+ "Utilization_Score": utilization_score
95
+ }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
96
  except Exception as e:
97
+ logger.error(f"Salesforce create record error: {e}")
98
+ return {"error": str(e)}
99
 
100
+ def gradio_interface(equipment_id, project_id, usage_hours, idle_hours,
101
+ movement_frequency, cost_per_hour, report_link, last_maintenance):
102
+ # Validate numeric inputs
 
103
  try:
104
+ usage_hours = float(usage_hours)
105
+ idle_hours = float(idle_hours)
106
+ movement_frequency = float(movement_frequency)
107
+ cost_per_hour = float(cost_per_hour)
 
 
 
 
 
 
 
 
 
 
 
108
  except Exception as e:
109
+ return {"error": f"Invalid numeric input: {e}"}
 
110
 
111
+ # Validate last maintenance date format
112
+ try:
113
+ last_maintenance_dt = datetime.datetime.strptime(last_maintenance, "%Y-%m-%d") if last_maintenance else None
114
+ except Exception as e:
115
+ return {"error": f"Invalid date format for Last Maintenance (expected YYYY-MM-DD): {e}"}
116
+
117
+ return process_equipment_utilization(
118
+ equipment_id,
119
+ project_id,
120
+ usage_hours,
121
+ idle_hours,
122
+ movement_frequency,
123
+ cost_per_hour,
124
+ report_link,
125
+ last_maintenance_dt
126
+ )
127
+
128
+ iface = gr.Interface(
129
+ fn=gradio_interface,
130
+ inputs=[
131
+ gr.Textbox(label="Equipment ID (Salesforce Record ID)"),
132
+ gr.Textbox(label="Project ID (Salesforce Record ID)"),
133
+ gr.Number(label="Usage Hours", value=0, minimum=0),
134
+ gr.Number(label="Idle Hours", value=0, minimum=0),
135
+ gr.Number(label="Movement Frequency", value=0, minimum=0),
136
+ gr.Number(label="Cost per Hour", value=0, minimum=0),
137
+ gr.Textbox(label="Report Link (URL)"),
138
+ gr.Textbox(label="Last Maintenance Date (YYYY-MM-DD)")
139
+ ],
140
+ outputs=gr.JSON(label="Salesforce Record Creation Result"),
141
+ title="Equipment Utilization AI Integration",
142
+ description="Input equipment data to get AI suggestions and save the record to Salesforce."
143
+ )
144
 
145
  if __name__ == "__main__":
146
+ iface.launch(share=False)