add rag; fix estimation service
This commit is contained in:
parent
ada7788516
commit
47cc1541ed
8 changed files with 226 additions and 39 deletions
74
rag/equitable_dental_plan_class_1.txt
Normal file
74
rag/equitable_dental_plan_class_1.txt
Normal file
|
|
@ -0,0 +1,74 @@
|
||||||
|
PLAN: Equitable Dental Plan - Class 1
|
||||||
|
UID: Equitable Dental Plan - Class 1
|
||||||
|
Category: Dental
|
||||||
|
Type: None
|
||||||
|
Marketing Name: Equitable Dental - Class 1
|
||||||
|
Average Price: $65.64
|
||||||
|
Short Description: Essential dental coverage for preventive care including exams, cleanings, and X-rays. Great for maintaining a healthy smile on a budget.
|
||||||
|
|
||||||
|
Long Description: The Class I dental plan offers essential preventive coverage designed to help you maintain good oral health. This includes 100% coverage (in-network) for routine exams, cleanings, and bitewing X-rays twice per year, with no deductible. It’s an affordable way to stay proactive with your dental care and avoid unexpected issues.
|
||||||
|
|
||||||
|
|
||||||
|
PRICING:
|
||||||
|
Coverage 1: $28.11
|
||||||
|
Coverage 2: $55.68
|
||||||
|
Coverage 3: $75.62
|
||||||
|
Coverage 4: $103.18
|
||||||
|
|
||||||
|
DETAILS:
|
||||||
|
|
||||||
|
COVERAGE:
|
||||||
|
Coinsurance - In Network: 100% – Preventive care (like cleanings, exams, and X-rays).80% – Basic care (like fillings and simple extractions).50% – Major care (like crowns, dentures, and root canals).
|
||||||
|
Coinsurance - Out of Network: 100% – Preventive care (like cleanings, exams, and X-rays). 80% – Basic care (like fillings and simple extractions). 50% – Major care (like crowns, dentures, and root canals).
|
||||||
|
Missing Tooth Clause - In Network: Pre-existing missing teeth not covered
|
||||||
|
Missing Tooth Clause - Out ofNetwork: Pre-existing missing teeth not covered
|
||||||
|
Annual Individual Maxium Benefit - In Network: 1000
|
||||||
|
Annual Individual Maxium Benefit - Out of Network: 1000
|
||||||
|
Annual Individual / Family Deductible - In Network: $50 deductible per person For a family, you only have to pay it for 3 people max (so $150 total), even if more are covered and preventive services are free.
|
||||||
|
Annual Individual / Family Deductible - Out of Network: $50 deductible per person For a family, you only have to pay it for 3 people max (so $150 total), even if more are covered and preventive services are free.
|
||||||
|
Reimbursement (how much the insurance company pays thef or care) - In Network: Agreed Rate
|
||||||
|
Reimbursement (how much the insurance company pays thef or care) - Out of Network: Fixed Coverage Amount
|
||||||
|
Alternative Benefit (If two treatments would fix the problem, the plan pays for the less expensive one) - In Network: Included
|
||||||
|
Alternative Benefit (If two treatments would fix the problem, the plan pays for the less expensive one) - Out of Network: Included
|
||||||
|
|
||||||
|
BASICSERVICES:
|
||||||
|
Simple Extractions - In Network: 80%
|
||||||
|
Simple Extractions - Out of Network: 80%
|
||||||
|
Periodontal Maintenance - In Network: 80%
|
||||||
|
Periodontal Maintenance - Out of Network: 80%
|
||||||
|
Emergency Palliative Treatment - In Network: 80%
|
||||||
|
Complete Series/ Panoramic X-Rays - In Network: 80%
|
||||||
|
Emergency Palliative Treatment - Out of Network: 80%
|
||||||
|
Complete Series/ Panoramic X-Rays - Out of Network: 80%
|
||||||
|
Basic Restorative Services (amalgam, composite resin, acrylic, synthetic or plastic fillings) - In Network: 80%
|
||||||
|
Basic Restorative Services (amalgam, composite resin, acrylic, synthetic or plastic fillings) - Out of Network: 80%
|
||||||
|
|
||||||
|
MAJORSERVICES:
|
||||||
|
Bridges - In Network: 50%
|
||||||
|
Bridges - Out of Network: 50%
|
||||||
|
Oral Surgery - In Network: 50%
|
||||||
|
Bitewing X-Rays - In Network: 50%
|
||||||
|
Oral Surgery - Out of Network: 50%
|
||||||
|
Bitewing X-Rays - Out of Network: 50%
|
||||||
|
Periodontal Surgery - In Network: 50%
|
||||||
|
Inlays/Onlays/Crowns - In Network: 50%
|
||||||
|
Surgical Endodontics - In Network: 50%
|
||||||
|
Periodontal Surgery - Out of Network: 50%
|
||||||
|
Inlays/Onlays/Crowns - Out of Network: 50%
|
||||||
|
Non-Surgical Endodontics - In Network: 50%
|
||||||
|
Non-Surgical Periodontal - In Network: 50%
|
||||||
|
Surgical Endodontics - Out of Network: 50%
|
||||||
|
Non-Surgical Endodontics - Out of Network: 50%
|
||||||
|
Non-Surgical Periodontal - Out of Network: 50%
|
||||||
|
Surgical Extractions and Removal of Impacted Teeth - In Network: 80%
|
||||||
|
Surgical Extractions and Removal of Impacted Teeth - Out of Network: 50%
|
||||||
|
Dentures – complete, partial, overdenture (upper and lower) - In Network: 50%
|
||||||
|
Dentures – complete, partial, overdenture (upper and lower) - Out of Network: 50%
|
||||||
|
|
||||||
|
PREVENTIVESERVICES:
|
||||||
|
Periodic Oral Evaluation - In Network: 100%
|
||||||
|
Periodic Oral Evaluation - Out of Network: 100%
|
||||||
|
Comprehensive Oral Evaluation - In Network: 100%
|
||||||
|
Comprehensive Oral Evaluation - Out of Network: 100%
|
||||||
|
Limited Oral Evaluation (problem focused) - In Network: 100%
|
||||||
|
Limited Oral Evaluation (problem focused) - Out of Network: 100%
|
||||||
72
rag/equitable_dental_plan_class_2.txt
Normal file
72
rag/equitable_dental_plan_class_2.txt
Normal file
|
|
@ -0,0 +1,72 @@
|
||||||
|
PLAN: Equitable Dental Plan - Class 2
|
||||||
|
UID: Equitable Dental Plan - Class 2
|
||||||
|
Category: Dental
|
||||||
|
Type: None
|
||||||
|
Marketing Name: Equitable Dental - Class2
|
||||||
|
Average Price: $77.90
|
||||||
|
Short Description: Expanded dental coverage including preventive and basic restorative services like fillings and extractions.
|
||||||
|
Long Description: The Class II dental plan builds on the preventive care of Class I and adds basic restorative services such as fillings, simple extractions, and emergency treatment for pain relief. Preventive services are covered at 100% in-network, and basic services are covered at 80% after a $50 annual deductible. This plan is ideal if you want broader protection and help managing more than just routine dental care.
|
||||||
|
|
||||||
|
PRICING:
|
||||||
|
Coverage 1: $32.87
|
||||||
|
Coverage 2: $65.12
|
||||||
|
Coverage 3: $90.68
|
||||||
|
Coverage 4: $122.93
|
||||||
|
|
||||||
|
DETAILS:
|
||||||
|
|
||||||
|
COVERAGE:
|
||||||
|
Coinsurance - In Network: 100% – Preventive care (like cleanings, exams, and X-rays).80% – Basic care (like fillings and simple extractions).50% – Major care (like crowns, dentures, and root canals).
|
||||||
|
Coinsurance - Out of Network: 100% – Preventive care (like cleanings, exams, and X-rays). 80% – Basic care (like fillings and simple extractions). 50% – Major care (like crowns, dentures, and root canals).
|
||||||
|
Missing Tooth Clause - In Network: Pre-existing missing teeth not covered
|
||||||
|
Missing Tooth Clause - Out ofNetwork: Pre-existing missing teeth not covered
|
||||||
|
Annual Individual Maxium Benefit - In Network: 2000
|
||||||
|
Annual Individual Maxium Benefit - Out of Network: 2000
|
||||||
|
Annual Individual / Family Deductible - In Network: $50 deductible per person For a family, you only have to pay it for 3 people max (so $150 total), even if more are covered and preventive services are free.
|
||||||
|
Annual Individual / Family Deductible - Out of Network: $50 deductible per person For a family, you only have to pay it for 3 people max (so $150 total), even if more are covered and preventive services are free.
|
||||||
|
Reimbursement (how much the insurance company pays thef or care) - In Network: Agreed Rate
|
||||||
|
Reimbursement (how much the insurance company pays thef or care) - Out of Network: Fixed Coverage Amount
|
||||||
|
Alternative Benefit (If two treatments would fix the problem, the plan pays for the less expensive one) - In Network: Included
|
||||||
|
Alternative Benefit (If two treatments would fix the problem, the plan pays for the less expensive one) - Out of Network: Included
|
||||||
|
|
||||||
|
BASICSERVICES:
|
||||||
|
Simple Extractions - In Network: 80%
|
||||||
|
Simple Extractions - Out of Network: 80%
|
||||||
|
Periodontal Maintenance - In Network: 80%
|
||||||
|
Periodontal Maintenance - Out of Network: 80%
|
||||||
|
Emergency Palliative Treatment - In Network: 80%
|
||||||
|
Complete Series/ Panoramic X-Rays - In Network: 80%
|
||||||
|
Emergency Palliative Treatment - Out of Network: 80%
|
||||||
|
Complete Series/ Panoramic X-Rays - Out of Network: 80%
|
||||||
|
Basic Restorative Services (amalgam, composite resin, acrylic, synthetic or plastic fillings) - In Network: 80%
|
||||||
|
Basic Restorative Services (amalgam, composite resin, acrylic, synthetic or plastic fillings) - Out of Network: 80%
|
||||||
|
|
||||||
|
MAJORSERVICES:
|
||||||
|
Bridges - In Network: 50%
|
||||||
|
Bridges - Out of Network: 50%
|
||||||
|
Oral Surgery - In Network: 50%
|
||||||
|
Bitewing X-Rays - In Network: 50%
|
||||||
|
Oral Surgery - Out of Network: 50%
|
||||||
|
Bitewing X-Rays - Out of Network: 50%
|
||||||
|
Periodontal Surgery - In Network: 50%
|
||||||
|
Inlays/Onlays/Crowns - In Network: 50%
|
||||||
|
Surgical Endodontics - In Network: 50%
|
||||||
|
Periodontal Surgery - Out of Network: 50%
|
||||||
|
Inlays/Onlays/Crowns - Out of Network: 50%
|
||||||
|
Non-Surgical Endodontics - In Network: 50%
|
||||||
|
Non-Surgical Periodontal - In Network: 50%
|
||||||
|
Surgical Endodontics - Out of Network: 50%
|
||||||
|
Non-Surgical Endodontics - Out of Network: 50%
|
||||||
|
Non-Surgical Periodontal - Out of Network: 50%
|
||||||
|
Surgical Extractions and Removal of Impacted Teeth - In Network: 80%
|
||||||
|
Surgical Extractions and Removal of Impacted Teeth - Out of Network: 50%
|
||||||
|
Dentures – complete, partial, overdenture (upper and lower) - In Network: 50%
|
||||||
|
Dentures – complete, partial, overdenture (upper and lower) - Out of Network: 50%
|
||||||
|
|
||||||
|
PREVENTIVESERVICES:
|
||||||
|
Periodic Oral Evaluation - In Network: 100%
|
||||||
|
Periodic Oral Evaluation - Out of Network: 100%
|
||||||
|
Comprehensive Oral Evaluation - In Network: 100%
|
||||||
|
Comprehensive Oral Evaluation - Out of Network: 100%
|
||||||
|
Limited Oral Evaluation (problem focused) - In Network: 100%
|
||||||
|
Limited Oral Evaluation (problem focused) - Out of Network: 100%
|
||||||
29
rag/equitable_hospital_indemnity_high_plan.txt
Normal file
29
rag/equitable_hospital_indemnity_high_plan.txt
Normal file
|
|
@ -0,0 +1,29 @@
|
||||||
|
PLAN: Equitable Hospital Indemnity - High Plan
|
||||||
|
UID: Equitable Hospital Indemnity - High Plan
|
||||||
|
Category: Hospital Indemnity
|
||||||
|
Type: None
|
||||||
|
Marketing Name: Equitable Hospital Indemnity Benefit - High Plan
|
||||||
|
Average Price: $87.01
|
||||||
|
Short Description: Enhanced coverage with higher daily payments and stronger support for ICU stays, emergencies, and family-related travel.
|
||||||
|
Long Description: The High Hospital Indemnity Plan offers more robust protection for serious medical events. It pays $2,000 for the first day in the hospital, $300 per day for regular stays, and $500 per day in the ICU—plus enhanced benefits for maternity, rehabilitation, wellness screenings, accident-related ER visits, and well-baby nursery care. It also includes increased reimbursements for family lodging, transportation, and caregiving expenses. This plan is ideal for those seeking greater peace of mind when facing potential hospital-related costs.
|
||||||
|
|
||||||
|
PRICING:
|
||||||
|
Coverage 1: $45.65
|
||||||
|
Coverage 2: $96.54
|
||||||
|
Coverage 3: $77.48
|
||||||
|
Coverage 4: $128.37
|
||||||
|
|
||||||
|
DETAILS:
|
||||||
|
|
||||||
|
BENEFITS:
|
||||||
|
Daily Lodging - Benefit Amount: $200, up to 5 days per year
|
||||||
|
Daily Family Care - Benefit Amount: $200, up to 5 days per year
|
||||||
|
First Day Hospital - Benefit Amount: $2,000, once a per year
|
||||||
|
Daily Transportation - Benefit Amount: $200, up to 5 days per year
|
||||||
|
Annual Wellness Screening - Benefit Amount: $50, once per year per insured
|
||||||
|
Daily Hospital Confinement - Benefit Amount: $300, up to 31 days per year
|
||||||
|
Daily Hospital ICU Confinement - Benefit Amount: $500, up to 10 days per year
|
||||||
|
Daily Hospital Rehabilitation Unit - Benefit Amount: $100, up to 60 days per year
|
||||||
|
Daily Well Baby Nursery Confinement - Benefit Amount: $200, up to 60 days per year
|
||||||
|
Emergency Room Treatment (accident only) - Benefit Amount: 200
|
||||||
|
First Day Hospital Intensive Care Unit (ICU) Confinement - Benefit Amount: $4,000, once a per year
|
||||||
31
rag/equitable_hospital_indemnity_low_plan.txt
Normal file
31
rag/equitable_hospital_indemnity_low_plan.txt
Normal file
|
|
@ -0,0 +1,31 @@
|
||||||
|
PLAN: Equitable Hospital Indemnity - Low Plan
|
||||||
|
UID: Equitable Hospital Indemnity - Low Plan
|
||||||
|
Category: Hospital Indemnity
|
||||||
|
Type: None
|
||||||
|
Marketing Name: Equitable Hospital Indemnity Benefit - Low Plan
|
||||||
|
Average Price: $46.06
|
||||||
|
Short Description: Helps cover basic out-of-pocket costs during a hospital stay, including daily payments, wellness screenings, and accident-related ER visits.
|
||||||
|
|
||||||
|
|
||||||
|
Long Description: The Low Hospital Indemnity Plan provides essential financial protection in the event of a hospital stay. It pays you a fixed amount per day you’re hospitalized—including $1,000 for your first hospital day, $200 per day for regular stays, and $400 per day for ICU stays. Additional benefits include wellness screening payouts, emergency accident coverage, and limited support for lodging, transportation, and family care. This plan offers a straightforward safety net for medical-related interruptions without deductibles or networks.
|
||||||
|
|
||||||
|
PRICING:
|
||||||
|
Coverage 1: $22.44
|
||||||
|
Coverage 2: $51.51
|
||||||
|
Coverage 3: $41.62
|
||||||
|
Coverage 4: $68.69
|
||||||
|
|
||||||
|
DETAILS:
|
||||||
|
|
||||||
|
BENEFITS:
|
||||||
|
Daily Lodging - Benefit Amount: $100, up to 5 days per year
|
||||||
|
Daily Family Care - Benefit Amount: $100, up to 5 days per year
|
||||||
|
First Day Hospital - Benefit Amount: $1,000, once a per year
|
||||||
|
Daily Transportation - Benefit Amount: $100, up to 5 days per year
|
||||||
|
Annual Wellness Screening - Benefit Amount: $50, once per year per insured
|
||||||
|
Daily Hospital Confinement - Benefit Amount: $200, up to 31 days per year
|
||||||
|
Daily Hospital ICU Confinement - Benefit Amount: $400, up to 10 days per year
|
||||||
|
Daily Hospital Rehabilitation Unit - Benefit Amount: $50, up to 60 days per year
|
||||||
|
Daily Well Baby Nursery Confinement - Benefit Amount: $100, up to 60 days per year
|
||||||
|
Emergency Room Treatment (accident only) - Benefit Amount: 100
|
||||||
|
First Day Hospital Intensive Care Unit (ICU) Confinement - Benefit Amount: $2,000, once a per year
|
||||||
|
|
@ -26,8 +26,8 @@ class Applicant(BaseModel):
|
||||||
applicant: int
|
applicant: int
|
||||||
firstName: str
|
firstName: str
|
||||||
lastName: str
|
lastName: str
|
||||||
midName: str
|
midName: Optional[str] = Field("", description="Middle name")
|
||||||
phone: str
|
phone: Optional[str] = Field("", description="Phone number")
|
||||||
gender: str
|
gender: str
|
||||||
dob: date
|
dob: date
|
||||||
nicotine: bool
|
nicotine: bool
|
||||||
|
|
@ -38,7 +38,7 @@ class Applicant(BaseModel):
|
||||||
class Plan(BaseModel):
|
class Plan(BaseModel):
|
||||||
id: int
|
id: int
|
||||||
coverage: int
|
coverage: int
|
||||||
tier: str
|
tier: Optional[str] = Field(None, description="Tier assignment")
|
||||||
|
|
||||||
class Medication(BaseModel):
|
class Medication(BaseModel):
|
||||||
applicant: int
|
applicant: int
|
||||||
|
|
@ -72,14 +72,14 @@ class PHQ(BaseModel):
|
||||||
conditions: List[Condition]
|
conditions: List[Condition]
|
||||||
|
|
||||||
class Address(BaseModel):
|
class Address(BaseModel):
|
||||||
address1: str
|
address1: Optional[str] = Field("", description="Address line 1")
|
||||||
address2: str
|
address2: Optional[str] = Field("", description="Address line 2")
|
||||||
city: str
|
city: Optional[str] = Field("", description="City")
|
||||||
state: str
|
state: Optional[str] = Field("", description="State")
|
||||||
zipcode: str
|
zipcode: Optional[str] = Field("", description="Zip code")
|
||||||
|
|
||||||
class EstimationRequest(BaseModel):
|
class EstimationRequest(BaseModel):
|
||||||
uid: str
|
uid: Optional[str] = Field(None, description="Unique identifier")
|
||||||
applicants: List[Applicant]
|
applicants: List[Applicant]
|
||||||
plans: List[Plan]
|
plans: List[Plan]
|
||||||
phq: PHQ
|
phq: PHQ
|
||||||
|
|
|
||||||
|
|
@ -106,7 +106,8 @@ async def estimate(request: models.EstimationRequest):
|
||||||
# Step 2: Check if DTQ → reject application
|
# Step 2: Check if DTQ → reject application
|
||||||
if underwriting_result["combined"].get("dtq"):
|
if underwriting_result["combined"].get("dtq"):
|
||||||
# For DTQ cases, call external reject API and return rejected status
|
# For DTQ cases, call external reject API and return rejected status
|
||||||
reject_response = await reject_application(request.uid)
|
if request.uid:
|
||||||
|
reject_response = await reject_application(request.uid)
|
||||||
return models.EstimationResponse(
|
return models.EstimationResponse(
|
||||||
status="rejected",
|
status="rejected",
|
||||||
details=models.EstimationDetails(
|
details=models.EstimationDetails(
|
||||||
|
|
|
||||||
|
|
@ -100,22 +100,15 @@ class ChatService:
|
||||||
async def process_insurance_chat(self, message: str, session_id: Optional[str] = None) -> Dict[str, Any]:
|
async def process_insurance_chat(self, message: str, session_id: Optional[str] = None) -> Dict[str, Any]:
|
||||||
"""Process an insurance chat request"""
|
"""Process an insurance chat request"""
|
||||||
try:
|
try:
|
||||||
# Create session if not provided
|
|
||||||
if not session_id:
|
if not session_id:
|
||||||
session_id = await session_service.create_session()
|
session_id = await session_service.create_session()
|
||||||
|
|
||||||
# Validate session if provided
|
|
||||||
elif not await session_service.validate_session(session_id):
|
elif not await session_service.validate_session(session_id):
|
||||||
# Create new session if invalid
|
|
||||||
session_id = await session_service.create_session()
|
session_id = await session_service.create_session()
|
||||||
|
|
||||||
# Send message to talestorm-ai
|
|
||||||
chat_response = await self.send_message(session_id, message)
|
chat_response = await self.send_message(session_id, message)
|
||||||
|
|
||||||
# Get chat history
|
|
||||||
history = await self.get_chat_history(session_id)
|
history = await self.get_chat_history(session_id)
|
||||||
|
|
||||||
# Extract sources from the response (placeholder for RAG implementation)
|
|
||||||
sources = self._extract_sources_from_response(chat_response.get("message", ""))
|
sources = self._extract_sources_from_response(chat_response.get("message", ""))
|
||||||
|
|
||||||
return {
|
return {
|
||||||
|
|
|
||||||
|
|
@ -56,29 +56,16 @@ class SessionService:
|
||||||
async def create_session(self, agent_id: Optional[str] = None) -> Optional[str]:
|
async def create_session(self, agent_id: Optional[str] = None) -> Optional[str]:
|
||||||
"""Create a new chat session in talestorm-ai"""
|
"""Create a new chat session in talestorm-ai"""
|
||||||
async with await self.get_client() as client:
|
async with await self.get_client() as client:
|
||||||
try:
|
if not agent_id:
|
||||||
# Use provided agent_id, then configured agent_id, then fallback to default
|
if self.agent_id:
|
||||||
if not agent_id:
|
agent_id = self.agent_id
|
||||||
if self.agent_id:
|
|
||||||
agent_id = self.agent_id
|
|
||||||
else:
|
|
||||||
default_agent = await self.get_default_agent()
|
|
||||||
if not default_agent:
|
|
||||||
# Create a simple session ID for now
|
|
||||||
return str(uuid.uuid4())
|
|
||||||
agent_id = str(default_agent["id"])
|
|
||||||
|
|
||||||
# Create session with talestorm-ai
|
|
||||||
response = await client.post("/sessions/", params={"agent_id": agent_id})
|
|
||||||
if response.status_code == 200:
|
|
||||||
session_data = response.json()
|
|
||||||
return str(session_data["id"])
|
|
||||||
else:
|
else:
|
||||||
# Fallback to local session ID
|
agent_id = settings.TALESTORM_AGENT_ID
|
||||||
return str(uuid.uuid4())
|
|
||||||
except Exception:
|
response = await client.post("/sessions/", params={"agent_id": agent_id})
|
||||||
# Fallback to local session ID
|
session_data = response.json()
|
||||||
return str(uuid.uuid4())
|
return str(session_data["id"])
|
||||||
|
|
||||||
|
|
||||||
async def get_session(self, session_id: str) -> Optional[Dict[str, Any]]:
|
async def get_session(self, session_id: str) -> Optional[Dict[str, Any]]:
|
||||||
"""Get session details from talestorm-ai"""
|
"""Get session details from talestorm-ai"""
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue