claims-env / client.py
pramodmisra's picture
Insurance Claims RL Environment - OpenEnv Hackathon
1c423d3
"""
Insurance Claims Environment Client
Client for connecting to the Claims Processing environment.
Supports both async and sync usage patterns.
"""
from typing import Optional, Dict, Any
from dataclasses import asdict
from openenv.core import EnvClient
from openenv.core.env_client import StepResult
from .models import ClaimsAction, ClaimsObservation, ClaimsState
class ClaimsEnv(EnvClient[ClaimsAction, ClaimsObservation, ClaimsState]):
"""
Client for the Insurance Claims Processing environment.
Example usage (async):
async with ClaimsEnv(base_url="https://your-space.hf.space") as env:
obs = await env.reset()
result = await env.step(ClaimsAction(action_type="query_policy"))
Example usage (sync):
with ClaimsEnv(base_url="https://your-space.hf.space").sync() as env:
obs = env.reset()
result = env.step(ClaimsAction(action_type="query_policy"))
"""
def _step_payload(self, action: ClaimsAction) -> Dict[str, Any]:
"""Convert action to API payload."""
return {
"action_type": action.action_type,
"claim_id": action.claim_id,
"parameters": action.parameters,
}
def _parse_result(self, payload: Dict[str, Any]) -> StepResult[ClaimsObservation]:
"""Parse API response into StepResult."""
obs_data = payload.get("observation", payload)
observation = ClaimsObservation(
claim_id=obs_data.get("claim_id", ""),
claim_type=obs_data.get("claim_type", ""),
claim_amount_requested=obs_data.get("claim_amount_requested", 0.0),
claimant_name=obs_data.get("claimant_name", ""),
incident_date=obs_data.get("incident_date", ""),
description=obs_data.get("description", ""),
system_response=obs_data.get("system_response", ""),
action_success=obs_data.get("action_success", True),
revealed_info=obs_data.get("revealed_info", {}),
available_actions=obs_data.get("available_actions", []),
time_elapsed_minutes=obs_data.get("time_elapsed_minutes", 0),
queries_made=obs_data.get("queries_made", 0),
is_terminal=obs_data.get("is_terminal", False),
terminal_reason=obs_data.get("terminal_reason", ""),
)
return StepResult(
observation=observation,
reward=payload.get("reward", 0.0),
done=observation.is_terminal,
)
def _parse_state(self, payload: Dict[str, Any]) -> ClaimsState:
"""Parse state from API response."""
return ClaimsState(
episode_id=payload.get("episode_id", ""),
claim_id=payload.get("claim_id", ""),
claim_type=payload.get("claim_type", ""),
claim_amount_requested=payload.get("claim_amount_requested", 0.0),
actions_taken=payload.get("actions_taken", 0),
queries_made=payload.get("queries_made", 0),
time_elapsed_minutes=payload.get("time_elapsed_minutes", 0),
total_reward=payload.get("total_reward", 0.0),
)
# Convenience functions for common actions
def query_policy(claim_id: str = "") -> ClaimsAction:
"""Create a query_policy action."""
return ClaimsAction(action_type="query_policy", claim_id=claim_id)
def query_claim_history(claim_id: str = "") -> ClaimsAction:
"""Create a query_claim_history action."""
return ClaimsAction(action_type="query_claim_history", claim_id=claim_id)
def check_fraud(claim_id: str = "") -> ClaimsAction:
"""Create a check_fraud action."""
return ClaimsAction(action_type="check_fraud", claim_id=claim_id)
def request_documents(doc_types: list, claim_id: str = "") -> ClaimsAction:
"""Create a request_documents action."""
return ClaimsAction(
action_type="request_documents",
claim_id=claim_id,
parameters={"doc_types": doc_types}
)
def verify_coverage(damage_type: str, claim_id: str = "") -> ClaimsAction:
"""Create a verify_coverage action."""
return ClaimsAction(
action_type="verify_coverage",
claim_id=claim_id,
parameters={"damage_type": damage_type}
)
def calculate_payout(amount: float, claim_id: str = "") -> ClaimsAction:
"""Create a calculate_payout action."""
return ClaimsAction(
action_type="calculate_payout",
claim_id=claim_id,
parameters={"amount": amount}
)
def approve(payout: float, reason: str = "Claim approved", claim_id: str = "") -> ClaimsAction:
"""Create an approve action."""
return ClaimsAction(
action_type="approve",
claim_id=claim_id,
parameters={"payout": payout, "reason": reason}
)
def deny(reason: str = "Claim denied", claim_id: str = "") -> ClaimsAction:
"""Create a deny action."""
return ClaimsAction(
action_type="deny",
claim_id=claim_id,
parameters={"reason": reason}
)
def escalate(reason: str = "Requires senior review", claim_id: str = "") -> ClaimsAction:
"""Create an escalate action."""
return ClaimsAction(
action_type="escalate",
claim_id=claim_id,
parameters={"reason": reason}
)