Files
2026-07-13 12:39:17 +08:00

113 lines
3.4 KiB
Python

from __future__ import annotations
import hashlib
import json
from collections.abc import Awaitable, Callable
from dataclasses import dataclass, field
from typing import Any
from agents import RunContextWrapper, function_tool
from examples.sandbox.healthcare_support.data import HealthcareSupportDataStore
from examples.sandbox.healthcare_support.models import ScenarioCase
@dataclass
class HealthcareSupportContext:
store: HealthcareSupportDataStore
scenario: ScenarioCase
session_id: str = ""
human_handoffs: list[dict[str, Any]] = field(default_factory=list)
human_handoff_approved: bool = False
emit_event: Callable[[dict[str, Any]], Awaitable[None]] | None = None
async def emit(self, event_name: str, **payload: Any) -> None:
if self.emit_event is None:
return
await self.emit_event(
{
"type": "workflow_event",
"event": event_name,
**payload,
}
)
@function_tool(name_override="patient_info_lookup")
def lookup_patient(
context: RunContextWrapper[HealthcareSupportContext],
patient_id: str | None = None,
phone: str | None = None,
name: str | None = None,
) -> dict[str, Any]:
"""Look up a synthetic patient profile by patient ID, phone, or name."""
return context.context.store.lookup_patient(
patient_id=patient_id,
phone=phone,
name=name,
)
@function_tool(name_override="insurance_eligibility_lookup")
def lookup_insurance_eligibility(
context: RunContextWrapper[HealthcareSupportContext],
payer: str | None = None,
member_id: str | None = None,
dob: str | None = None,
) -> dict[str, Any]:
"""Look up synthetic insurance eligibility by payer, member ID, and DOB."""
return context.context.store.lookup_eligibility(
payer=payer,
member_id=member_id,
dob=dob,
)
@function_tool(name_override="appointment_referral_status_lookup")
def lookup_referral_status(
context: RunContextWrapper[HealthcareSupportContext],
referral_id: str | None = None,
patient_id: str | None = None,
) -> dict[str, Any]:
"""Look up synthetic referral status by referral ID or patient ID."""
return context.context.store.lookup_referral(
referral_id=referral_id,
patient_id=patient_id,
)
async def _needs_human_approval(
context: RunContextWrapper[HealthcareSupportContext],
_params: dict[str, Any],
_call_id: str,
) -> bool:
return not context.context.human_handoff_approved
@function_tool(name_override="route_to_human_queue", needs_approval=_needs_human_approval)
def route_to_human_queue(
context: RunContextWrapper[HealthcareSupportContext],
queue: str,
priority: str,
reason: str,
summary: str,
) -> dict[str, Any]:
"""Route a synthetic case to a human queue after explicit approval."""
payload = {
"queue": queue,
"priority": priority,
"reason": reason,
"summary": summary,
"scenario_id": context.context.scenario.scenario_id,
}
digest = hashlib.sha256(json.dumps(payload, sort_keys=True).encode("utf-8")).hexdigest()[:12]
result = {
"status": "queued",
"handoff_id": f"HUMAN-{digest.upper()}",
"queue": queue,
"priority": priority,
"reason": reason,
"summary": summary,
}
context.context.human_handoffs.append({"payload": payload, "result": result})
return result