Spaces:
Runtime error
Runtime error
Update app.py
Browse files
app.py
CHANGED
@@ -11,9 +11,9 @@ logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(
|
|
11 |
logger = logging.getLogger(__name__)
|
12 |
|
13 |
# Salesforce credentials (use environment variables for security)
|
14 |
-
SF_USERNAME = os.getenv('
|
15 |
-
SF_PASSWORD = os.getenv('
|
16 |
-
SF_SECURITY_TOKEN = os.getenv('
|
17 |
SF_DOMAIN = os.getenv('SF_DOMAIN', 'login') # Default to 'login' if not set
|
18 |
HUGGINGFACE_API_KEY = os.getenv('HUGGINGFACE_API_KEY')
|
19 |
|
@@ -184,7 +184,7 @@ def generate_outputs(role, project_id, milestones, reflection):
|
|
184 |
quote = generated_text[quote_start:].strip()
|
185 |
except Exception as e:
|
186 |
logger.error(f"Error parsing output: {e}")
|
187 |
-
|
188 |
|
189 |
return checklist, suggestions, quote
|
190 |
|
@@ -227,6 +227,42 @@ def store_in_salesforce(project, role, project_id, milestones, reflection, check
|
|
227 |
logger.error(f"Error storing data in Salesforce: {e}")
|
228 |
return f"Error storing data in Salesforce: {e}"
|
229 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
230 |
def on_role_change(role):
|
231 |
"""Handle role selection change, fetch Salesforce data, generate outputs, and store in Salesforce."""
|
232 |
# Fetch data from Salesforce based on the selected role
|
@@ -248,7 +284,7 @@ def create_interface():
|
|
248 |
gr.Markdown("### Construction Supervisor AI Coach")
|
249 |
with gr.Row():
|
250 |
role = gr.Dropdown(choices=["Supervisor", "Foreman", "Project Manager"], label="Role", value="Supervisor")
|
251 |
-
|
252 |
milestones = gr.Textbox(
|
253 |
label="Milestones (comma-separated)",
|
254 |
placeholder="e.g., Foundation complete, Framing started, Roof installed"
|
@@ -258,6 +294,10 @@ def create_interface():
|
|
258 |
lines=3,
|
259 |
placeholder="e.g., Facing delays due to weather and equipment issues."
|
260 |
)
|
|
|
|
|
|
|
|
|
261 |
checklist_output = gr.Textbox(label="Checklist", lines=4)
|
262 |
suggestions_output = gr.Textbox(label="Suggestions", lines=4)
|
263 |
quote_output = gr.Textbox(label="Quote", lines=2)
|
@@ -270,6 +310,22 @@ def create_interface():
|
|
270 |
outputs=[checklist_output, suggestions_output, quote_output, sf_output, project_id, milestones, reflection]
|
271 |
)
|
272 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
273 |
return demo
|
274 |
|
275 |
if __name__ == "__main__":
|
|
|
11 |
logger = logging.getLogger(__name__)
|
12 |
|
13 |
# Salesforce credentials (use environment variables for security)
|
14 |
+
SF_USERNAME = os.getenv('SF_USERNAME')
|
15 |
+
SF_PASSWORD = os.getenv('SF_PASSWORD')
|
16 |
+
SF_SECURITY_TOKEN = os.getenv('SF_SECURITY_TOKEN')
|
17 |
SF_DOMAIN = os.getenv('SF_DOMAIN', 'login') # Default to 'login' if not set
|
18 |
HUGGINGFACE_API_KEY = os.getenv('HUGGINGFACE_API_KEY')
|
19 |
|
|
|
184 |
quote = generated_text[quote_start:].strip()
|
185 |
except Exception as e:
|
186 |
logger.error(f"Error parsing output: {e}")
|
187 |
+
return f"Error parsing output: {e}", "", ""
|
188 |
|
189 |
return checklist, suggestions, quote
|
190 |
|
|
|
227 |
logger.error(f"Error storing data in Salesforce: {e}")
|
228 |
return f"Error storing data in Salesforce: {e}"
|
229 |
|
230 |
+
def fetch_and_process_salesforce_data():
|
231 |
+
"""Fetch Project__c records from Salesforce and generate AI outputs."""
|
232 |
+
if sf is None:
|
233 |
+
logger.error("Salesforce connection not initialized")
|
234 |
+
return "Error: Salesforce connection not initialized"
|
235 |
+
|
236 |
+
try:
|
237 |
+
# Query Project__c records
|
238 |
+
query = """
|
239 |
+
SELECT Id, Name, Project_Name__c, Milestones__c, Weather_Log__c,
|
240 |
+
Supervisor__r.Role__c, Supervisor__r.Name, Supervisor__c
|
241 |
+
FROM Project__c
|
242 |
+
WHERE Milestones__c != null
|
243 |
+
LIMIT 10
|
244 |
+
"""
|
245 |
+
projects = sf.query(query)['records']
|
246 |
+
logger.info(f"Fetched {len(projects)} Project__c records")
|
247 |
+
|
248 |
+
for project in projects:
|
249 |
+
role = project['Supervisor__r']['Role__c'] if project['Supervisor__r'] is not None else 'Supervisor'
|
250 |
+
project_id = project['Name']
|
251 |
+
milestones = project['Milestones__c'] or 'No milestones'
|
252 |
+
reflection = f"Weather: {project['Weather_Log__c'] or 'Sunny, 25°C'}"
|
253 |
+
|
254 |
+
# Generate AI outputs
|
255 |
+
checklist, suggestions, quote = generate_outputs(role, project_id, milestones, reflection)
|
256 |
+
logger.info(f"Generated outputs for Project {project_id}")
|
257 |
+
|
258 |
+
# Store in Salesforce
|
259 |
+
store_in_salesforce(project, role, project_id, milestones, reflection, checklist, suggestions, quote)
|
260 |
+
|
261 |
+
return f"Processed {len(projects)} projects successfully"
|
262 |
+
except Exception as e:
|
263 |
+
logger.error(f"Error processing Salesforce data: {e}")
|
264 |
+
return f"Error processing Salesforce data: {e}"
|
265 |
+
|
266 |
def on_role_change(role):
|
267 |
"""Handle role selection change, fetch Salesforce data, generate outputs, and store in Salesforce."""
|
268 |
# Fetch data from Salesforce based on the selected role
|
|
|
284 |
gr.Markdown("### Construction Supervisor AI Coach")
|
285 |
with gr.Row():
|
286 |
role = gr.Dropdown(choices=["Supervisor", "Foreman", "Project Manager"], label="Role", value="Supervisor")
|
287 |
+
project_id = gr.Textbox(label="Project ID", placeholder="e.g., PROJ-123")
|
288 |
milestones = gr.Textbox(
|
289 |
label="Milestones (comma-separated)",
|
290 |
placeholder="e.g., Foundation complete, Framing started, Roof installed"
|
|
|
294 |
lines=3,
|
295 |
placeholder="e.g., Facing delays due to weather and equipment issues."
|
296 |
)
|
297 |
+
with gr.Row():
|
298 |
+
submit = gr.Button("Generate")
|
299 |
+
clear = gr.Button("Clear")
|
300 |
+
sf_button = gr.Button("Process Salesforce Data")
|
301 |
checklist_output = gr.Textbox(label="Checklist", lines=4)
|
302 |
suggestions_output = gr.Textbox(label="Suggestions", lines=4)
|
303 |
quote_output = gr.Textbox(label="Quote", lines=2)
|
|
|
310 |
outputs=[checklist_output, suggestions_output, quote_output, sf_output, project_id, milestones, reflection]
|
311 |
)
|
312 |
|
313 |
+
submit.click(
|
314 |
+
fn=generate_outputs,
|
315 |
+
inputs=[role, project_id, milestones, reflection],
|
316 |
+
outputs=[checklist_output, suggestions_output, quote_output]
|
317 |
+
)
|
318 |
+
clear.click(
|
319 |
+
fn=lambda: ("Supervisor", "", "", ""),
|
320 |
+
inputs=None,
|
321 |
+
outputs=[role, project_id, milestones, reflection]
|
322 |
+
)
|
323 |
+
sf_button.click(
|
324 |
+
fn=fetch_and_process_salesforce_data,
|
325 |
+
inputs=None,
|
326 |
+
outputs=sf_output
|
327 |
+
)
|
328 |
+
|
329 |
return demo
|
330 |
|
331 |
if __name__ == "__main__":
|