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

153 lines
4.6 KiB
Python

from __future__ import annotations
import argparse
import asyncio
import json
import sys
from pathlib import Path
from typing import Any
if __package__ is None or __package__ == "":
_DEMO_DIR = Path(__file__).resolve().parent
sys.path.insert(0, str(_DEMO_DIR.parents[2]))
sys.path.insert(0, str(_DEMO_DIR))
from examples.auto_mode import confirm_with_fallback, input_with_fallback # noqa: E402
from examples.sandbox.healthcare_support.data import ( # noqa: E402
HealthcareSupportDataStore,
load_root_env,
)
from examples.sandbox.healthcare_support.models import ScenarioCase # noqa: E402
from examples.sandbox.healthcare_support.tools import HealthcareSupportContext # noqa: E402
from examples.sandbox.healthcare_support.workflow import ( # noqa: E402
CACHE_ROOT,
DEFAULT_SESSION_ID,
SESSION_DB_PATH,
build_context,
run_healthcare_support_workflow,
)
DEFAULT_SCENARIO_ID = "eligibility_verification_basic"
def _build_parser() -> argparse.ArgumentParser:
parser = argparse.ArgumentParser(
description="Run the healthcare support Agents SDK demo from the command line.",
)
parser.add_argument(
"--scenario",
dest="scenario_id",
default=None,
help="Scenario ID to run. If omitted, the CLI asks interactively.",
)
parser.add_argument(
"--list-scenarios",
action="store_true",
help="Print the built-in scenario IDs and exit.",
)
parser.add_argument(
"--reset-memory",
action="store_true",
help="Delete the shared SQLite session database before running.",
)
return parser
def _print_scenarios(store: HealthcareSupportDataStore) -> None:
print("Available scenarios:\n")
for scenario_id in store.list_scenario_ids():
scenario = store.get_scenario(scenario_id)
print(f"- {scenario.scenario_id}")
print(f" {scenario.description}")
def _pick_scenario(store: HealthcareSupportDataStore, requested_id: str | None) -> ScenarioCase:
if requested_id:
return store.get_scenario(requested_id)
scenario_id = input_with_fallback(
"Enter a scenario ID: ",
DEFAULT_SCENARIO_ID,
).strip()
if not scenario_id:
scenario_id = DEFAULT_SCENARIO_ID
return store.get_scenario(scenario_id)
async def _approval_handler(request: dict[str, Any]) -> bool:
print("\nHuman approval requested")
print(f"Agent: {request.get('agent', 'unknown')}")
print(f"Tool: {request.get('tool', 'route_to_human_queue')}")
print(json.dumps(request.get("arguments", {}), indent=2))
return confirm_with_fallback("Approve handoff to a human queue? [y/N]: ", True)
def _print_run_header(*, scenario: ScenarioCase, context: HealthcareSupportContext) -> None:
print("\n" + "=" * 80)
print("Healthcare Support Agents SDK Demo")
print(f"Scenario: {scenario.scenario_id}")
print(f"Description: {scenario.description}")
print(f"SQLite memory session: {context.session_id}")
print("\nCustomer transcript:\n")
print(scenario.transcript)
def _print_run_result(payload: dict[str, Any]) -> None:
print("\nTrace URL:")
print(payload["trace_url"])
print("\nPatient-facing response:\n")
print(payload["resolution"]["patient_facing_response"])
print("\nInternal summary:")
print(payload["resolution"]["internal_summary"])
print("\nNext step:")
print(payload["resolution"]["next_step"])
if payload["resolution"].get("handoff_id"):
print("\nHuman handoff:")
print(payload["resolution"]["handoff_id"])
print("\nGenerated sandbox artifacts:")
for artifact in payload.get("artifacts", []):
print(f"- {artifact['path']}")
print("\nMemory recap:")
print(json.dumps(payload["memory_recap"], indent=2))
print(f"\nSession memory items: {payload['session_memory_items']}")
async def main() -> None:
load_root_env()
args = _build_parser().parse_args()
store = HealthcareSupportDataStore.load()
if args.list_scenarios:
_print_scenarios(store)
return
if args.reset_memory and SESSION_DB_PATH.exists():
SESSION_DB_PATH.unlink()
scenario = _pick_scenario(store, args.scenario_id)
context = build_context(
store=store,
scenario_id=scenario.scenario_id,
session_id=DEFAULT_SESSION_ID,
)
CACHE_ROOT.mkdir(parents=True, exist_ok=True)
_print_run_header(scenario=scenario, context=context)
payload = await run_healthcare_support_workflow(
context=context,
scenario_id=scenario.scenario_id,
approval_handler=_approval_handler,
)
_print_run_result(payload)
if __name__ == "__main__":
asyncio.run(main())