Spaces:
Sleeping
Sleeping
File size: 7,283 Bytes
c4d9410 87caeae 6ec8c25 87caeae 6ec8c25 87caeae 6ec8c25 bcbda00 87caeae 7263f0a 87caeae 47c609d 87caeae 63233e1 87caeae 63233e1 87caeae aff2361 87caeae 6ec8c25 87caeae 63233e1 87caeae 6ec8c25 2ba9b24 6ec8c25 eccf433 87caeae 2a4c77b 577c50a 7263f0a 577c50a 7263f0a 2a4c77b eccf433 6ec8c25 2a4c77b eccf433 577c50a eccf433 577c50a eccf433 577c50a eccf433 577c50a eccf433 bc9aa7d eccf433 bc9aa7d eccf433 577c50a eccf433 bc9aa7d eccf433 2a4c77b eccf433 bc9aa7d 577c50a 7263f0a 577c50a bc9aa7d 87caeae |
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 151 152 153 154 155 156 157 158 159 160 161 162 |
import gradio as gr
import logging
import os
import numpy as np
from simple_salesforce import Salesforce
from dotenv import load_dotenv
# Setup logging
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)
# Load environment variables from .env file
load_dotenv() # Load the .env file
# Get the Salesforce credentials from environment variables
sf_username = os.getenv("SF_USERNAME")
sf_password = os.getenv("SF_PASSWORD")
sf_security_token = os.getenv("SF_SECURITY_TOKEN")
sf_instance_url = os.getenv("SF_INSTANCE_URL")
# Check if the environment variables are correctly set
if not sf_username or not sf_password or not sf_security_token or not sf_instance_url:
logger.error("β Salesforce credentials are missing from environment variables!")
raise ValueError("Salesforce credentials are not properly set.")
# Salesforce connection
try:
sf = Salesforce(
username=sf_username,
password=sf_password,
security_token=sf_security_token,
instance_url=sf_instance_url
)
logger.info("β
Connected to Salesforce")
except Exception as e:
logger.error(f"β Salesforce connection failed: {str(e)}")
raise
# --- AI functions (These should be implemented in your project) ---
def get_lead_score(stage, emails, meetings, close_gap, amount):
# Example logic for lead score calculation
return 0.8 * amount + 0.1 * emails + 0.1 * meetings
def calculate_score(lead_score, emails, meetings, close_gap, amount):
# Example AI score calculation
return lead_score * 0.5 + 0.3 * emails + 0.2 * meetings
def calculate_confidence(ai_score):
# Ensure confidence is between 0 and 100
confidence = ai_score * 100
return min(max(confidence, 0), 100) # Clamp the value between 0 and 100
def calculate_risk(ai_score, confidence, emails, meetings):
# Make sure to map the value to the Salesforce picklist options
if ai_score > 0.75 and confidence > 75:
return "Low" # Update to match Salesforce picklist value
elif ai_score > 0.5:
return "Medium" # Assuming "Medium" is another valid value
else:
return "High" # Update to match Salesforce picklist value
def generate_recommendation(stage, emails, meetings, risk):
# Example recommendation generation
return "Proceed with caution" if risk == "High" else "Proceed"
def explain_score(lead_score, ai_score, confidence, risk, stage, close_gap, emails, meetings):
# Example explanation generation
return f"Lead score based on {emails} emails and {meetings} meetings is {lead_score}. AI score is {ai_score}, confidence is {confidence}%. Risk: {risk}."
# --- Push to Salesforce ---
def push_to_salesforce(data: dict) -> str:
try:
response = sf.qualification_engine__c.create({
"Deal_Amount__c": data.get("amount"),
"Stage__c": data.get("stage"),
"Industry__c": data.get("industry"),
"Emails_7_Days__c": data.get("emails"),
"Meetings_30_Days__c": data.get("meetings"),
"Days_Until_Close__c": data.get("gap"),
"Rep_Feedback__c": data.get("feedback"),
"Lead_Score__c": data.get("lead_score"),
"AI_Score__c": data.get("score"),
"Confidence__c": data.get("confidence"),
"Risk_Level__c": data.get("risk"),
"AI_Recommendation__c": data.get("recommendation"),
"Explanation__c": data.get("explanation")
})
return f"β
Pushed to Salesforce with ID: {response['id']}"
except Exception as e:
return f"β Salesforce Error: {str(e)}"
# --- Run Engine (Calculate and Push to Salesforce) ---
def run_engine(amount, stage, industry, emails, meetings, close_gap, feedback=""):
try:
lead_score = get_lead_score(stage, emails, meetings, close_gap, amount)
ai_score = calculate_score(lead_score, emails, meetings, close_gap, amount)
confidence = calculate_confidence(ai_score)
risk = calculate_risk(ai_score, confidence, emails, meetings)
recommendation = generate_recommendation(stage, emails, meetings, risk)
explanation = explain_score(lead_score, ai_score, confidence, risk, stage, close_gap, emails, meetings)
sf_status = push_to_salesforce({
"amount": amount, "stage": stage, "industry": industry,
"emails": emails, "meetings": meetings, "gap": close_gap,
"feedback": feedback, "lead_score": lead_score, "score": ai_score,
"confidence": confidence, "risk": risk,
"recommendation": recommendation, "explanation": explanation
})
return lead_score, ai_score, confidence, risk, recommendation, explanation, sf_status
except Exception as e:
return 0, 0, 0.0, "Error", "N/A", f"Error occurred: {str(e)}", f"β Error: {str(e)}"
# Gradio UI
with gr.Blocks(title="AI Deal Qualification Engine") as app:
gr.Markdown("""
<h1 style="text-align:center;">π€ AI-Powered Deal Qualification Engine</h1>
<p style="text-align:center;">Intelligently qualify sales deals using engagement and pipeline signals.</p>
""", elem_id="header")
with gr.Tab("π₯ Input", elem_id="input-tab"):
with gr.Row():
amount = gr.Number(label="π° Deal Amount (USD)", value=50000, elem_id="deal-amount")
stage = gr.Dropdown(
["Prospecting", "Proposal/Price Quote", "Negotiation", "Closed Won", "Closed Lost"],
label="π Stage",
elem_id="deal-stage"
)
industry = gr.Textbox(label="π Industry", value="Software", elem_id="industry")
with gr.Row():
emails = gr.Number(label="βοΈ Emails (Last 7 Days)", value=3, elem_id="emails")
meetings = gr.Number(label="π
Meetings (Last 30 Days)", value=2, elem_id="meetings")
close_gap = gr.Number(label="π Days Until Close", value=14, elem_id="days-until-close")
feedback = gr.Textbox(label="π¬ Optional: Rep Feedback", placeholder="Add any qualitative insights...", elem_id="feedback")
submit = gr.Button("π Run AI Scoring", elem_id="submit-btn")
with gr.Tab("π Results", elem_id="result-tab"):
with gr.Accordion("AI Scoring Output", open=True):
lead_score_out = gr.Number(label="π’ Lead Score", interactive=False, elem_id="lead-score")
ai_score_out = gr.Number(label="π AI Score (0β100)", interactive=False, elem_id="ai-score")
confidence_out = gr.Number(label="π Confidence", interactive=False, elem_id="confidence")
risk_out = gr.Textbox(label="β οΈ Risk Level", lines=1, interactive=False, elem_id="risk-level")
reco_out = gr.Textbox(label="π‘ AI Recommendation", lines=2, interactive=False, elem_id="ai-recommendation")
explain_out = gr.Textbox(label="π§ Explanation", lines=5, interactive=False, elem_id="explanation")
status = gr.Markdown("", elem_id="status")
submit.click(
fn=run_engine,
inputs=[amount, stage, industry, emails, meetings, close_gap, feedback],
outputs=[lead_score_out, ai_score_out, confidence_out, risk_out, reco_out, explain_out, status]
)
app.launch(share=True)
|