Imsachin010's picture
first commit
b77d3c5
# salespath_env/server/task_bank.py
import random
from dataclasses import dataclass
@dataclass
class ProspectProfile:
company_name: str
company_size: str # small / medium / enterprise
industry: str
budget_signal: str # high / medium / low / unknown
pain_points: list[str]
decision_maker: bool
# Hidden values β€” never exposed directly to agent
true_budget: float # 0.0 β†’ 1.0
close_threshold: float
stall_probability: float
# -------------------------
# LEVEL 1 β€” Easy
# budget known
# decision maker present
# close is usually possible
# -------------------------
PROFILES_L1 = [
ProspectProfile(
company_name="Meridian Retail",
company_size="medium",
industry="retail",
budget_signal="high",
pain_points=[
"manual inventory tracking",
"slow reporting",
],
decision_maker=True,
true_budget=0.8,
close_threshold=0.5,
stall_probability=0.0,
),
ProspectProfile(
company_name="Northline Foods",
company_size="small",
industry="food distribution",
budget_signal="medium",
pain_points=[
"supplier delays",
"inventory mismatch",
],
decision_maker=True,
true_budget=0.6,
close_threshold=0.5,
stall_probability=0.0,
),
]
# -------------------------
# LEVEL 2 β€” Medium
# budget hidden initially
# one objection expected
# -------------------------
PROFILES_L2 = [
ProspectProfile(
company_name="Apex Logistics",
company_size="enterprise",
industry="logistics",
budget_signal="unknown",
pain_points=[
"route optimization",
"driver coordination",
"fuel tracking",
],
decision_maker=True,
true_budget=0.7,
close_threshold=0.5,
stall_probability=0.0,
),
ProspectProfile(
company_name="Vertex Supply",
company_size="medium",
industry="manufacturing",
budget_signal="unknown",
pain_points=[
"vendor visibility",
"purchase delays",
],
decision_maker=True,
true_budget=0.55,
close_threshold=0.5,
stall_probability=0.0,
),
]
# -------------------------
# LEVEL 3 β€” Hard
# budget hidden
# 2 objections
# possible stalling
# decision maker may be absent
# -------------------------
PROFILES_L3 = [
ProspectProfile(
company_name="Nova Financial",
company_size="enterprise",
industry="finance",
budget_signal="unknown",
pain_points=[
"compliance reporting",
"audit trails",
"data silos",
],
decision_maker=False,
true_budget=0.6,
close_threshold=0.55,
stall_probability=0.3,
),
ProspectProfile(
company_name="Atlas Health",
company_size="enterprise",
industry="healthcare",
budget_signal="unknown",
pain_points=[
"patient workflow delays",
"reporting compliance",
],
decision_maker=False,
true_budget=0.65,
close_threshold=0.55,
stall_probability=0.25,
),
]
# -------------------------
# LEVEL 4 β€” Trap cases
# misleading signals
# correct action may be DISQUALIFY
# -------------------------
PROFILES_L4 = [
ProspectProfile(
company_name="Cipher Tech",
company_size="small",
industry="technology",
budget_signal="high", # misleading
pain_points=[
"security",
"compliance",
],
decision_maker=True,
true_budget=0.2,
close_threshold=0.5,
stall_probability=0.5,
),
ProspectProfile(
company_name="BluePeak Studio",
company_size="small",
industry="creative agency",
budget_signal="high", # misleading
pain_points=[
"project visibility",
"client reporting",
],
decision_maker=True,
true_budget=0.25,
close_threshold=0.5,
stall_probability=0.4,
),
]
ALL_PROFILES = {
1: PROFILES_L1,
2: PROFILES_L2,
3: PROFILES_L3,
4: PROFILES_L4,
}
def sample_profile(difficulty: int) -> ProspectProfile:
"""
Returns one sampled profile for the selected difficulty.
"""
if difficulty not in ALL_PROFILES:
difficulty = 1
return random.choice(ALL_PROFILES[difficulty])