from fastapi import FastAPI, HTTPException from pydantic import BaseModel, Field app = FastAPI() class Conversation(BaseModel): arch_messages: list class PolicyCoverageRequest(BaseModel): policy_type: str = Field(..., description="The type of a policy held by the customer For, e.g. car, boat, house, motorcycle)") class PolicyInitiateRequest(PolicyCoverageRequest): deductible: float = Field(..., description="The deductible amount set of the policy") class ClaimUpdate(BaseModel): claim_id: str notes: str # Status or details of the claim class DeductibleUpdate(BaseModel): policy_id: str deductible: float class CoverageResponse(BaseModel): policy_type: str coverage: str # Description of coverage premium: float # The premium cost # Get information about policy coverage @app.post("/policy/coverage", response_model=CoverageResponse) async def get_policy_coverage(req: PolicyCoverageRequest): """ Retrieve the coverage details for a given policy type (car, boat, house, motorcycle). """ policy_coverage = { "car": {"coverage": "Full car coverage with collision, liability", "premium": 500.0}, "boat": {"coverage": "Full boat coverage including theft and storm damage", "premium": 700.0}, "house": {"coverage": "Full house coverage including fire, theft, flood", "premium": 1000.0}, "motorcycle": {"coverage": "Full motorcycle coverage with liability", "premium": 400.0}, } if req.policy_type not in policy_coverage: raise HTTPException(status_code=404, detail="Policy type not found") return CoverageResponse( policy_type=req.policy_type, coverage=policy_coverage[req.policy_type]["coverage"], premium=policy_coverage[req.policy_type]["premium"] ) # Initiate policy coverage @app.post("/policy/initiate") async def initiate_policy(policy_request: PolicyInitiateRequest): """ Initiate policy coverage for a car, boat, house, or motorcycle. """ if policy_request.policy_type not in ["car", "boat", "house", "motorcycle"]: raise HTTPException(status_code=400, detail="Invalid policy type") return {"message": f"Policy initiated for {policy_request.policy_type}", "deductible": policy_request.deductible} # Update claim details @app.post("/policy/claim") async def update_claim(req: ClaimUpdate): """ Update the status or details of a claim. """ # For simplicity, this is a mock update response return {"message": f"Claim {claim_update.claim_id} for policy {claim_update.claim_id} has been updated", "update": claim_update.notes} # Update deductible amount @app.post("/policy/deductible") async def update_deductible(deductible_update: DeductibleUpdate): """ Update the deductible amount for a specific policy. """ # For simplicity, this is a mock update response return {"message": f"Deductible for policy {deductible_update.policy_id} has been updated", "new_deductible": deductible_update.deductible} # Post method for policy Q/A @app.post("/policy/qa") async def policy_qa(conversation: Conversation): """ This method handles Q/A related to general issues in insurance. It forwards the conversation to the OpenAI client via a local proxy and returns the response. """ return { "choices": [ { "message": { "role": "assistant", "content": "I am a helpful insurance agent, and can only help with insurance things" }, "finish_reason": "completed", "index": 0 } ], "model": "insurance_agent", "usage": { "completion_tokens": 0 } } # Run the app using: # uvicorn main:app --reload