"""Quick API test for Sakhi — hits the running Gradio app via HTTP.""" import json import requests import time BASE = "http://localhost:7860" TESTS = { "ANC Normal": { "transcript": "ASHA: \u0928\u092e\u0938\u094d\u0924\u0947, \u0915\u0948\u0938\u0947 \u0939\u0948\u0902 \u0906\u092a?\nPatient: \u0928\u092e\u0938\u094d\u0924\u0947 \u0926\u0940\u0926\u0940, \u092e\u0948\u0902 \u0920\u0940\u0915 \u0939\u0942\u0901\u0964\nASHA: \u0905\u091a\u094d\u091b\u093e \u0939\u0948\u0964 \u092e\u0948\u0902 \u0906\u092a\u0915\u093e \u091a\u0947\u0915\u0905\u092a \u0915\u0930\u0928\u0947 \u0906\u0908 \u0939\u0942\u0901\u0964 \u091a\u0932\u093f\u090f, \u092a\u0939\u0932\u0947 \u0906\u092a\u0915\u093e BP \u091a\u0947\u0915 \u0915\u0930 \u0932\u0947\u0924\u0940 \u0939\u0942\u0901\u0964\nPatient: \u0920\u0940\u0915 \u0939\u0948\u0964\nASHA: \u0906\u092a\u0915\u093e BP 110/70 \u0939\u0948, \u092c\u093f\u0932\u094d\u0915\u0941\u0932 \u0920\u0940\u0915 \u0939\u0948\u0964 \u0905\u092c \u0935\u091c\u0928 \u0926\u0947\u0916\u0924\u0940 \u0939\u0942\u0901... 58 kg \u0939\u0948\u0964 \u092a\u093f\u091b\u0932\u0940 \u092c\u093e\u0930 56 \u0925\u093e, \u0924\u094b \u0905\u091a\u094d\u091b\u093e \u092c\u0922\u093c \u0930\u0939\u093e \u0939\u0948\u0964\nPatient: \u0939\u093e\u0901, \u092e\u0948\u0902 \u0905\u091a\u094d\u091b\u093e \u0916\u093e \u0930\u0939\u0940 \u0939\u0942\u0901\u0964\nASHA: \u092c\u0939\u0941\u0924 \u0905\u091a\u094d\u091b\u093e! Hb \u0915\u093f\u0924\u0928\u093e \u0906\u092f\u093e \u0925\u093e \u092a\u093f\u091b\u0932\u0940 \u092c\u093e\u0930?\nPatient: \u0921\u0949\u0915\u094d\u091f\u0930 \u0928\u0947 \u0915\u0939\u093e \u0925\u093e 11.5 \u0939\u0948\u0964\nASHA: \u092f\u0947 \u0924\u094b \u092c\u0939\u0941\u0924 \u0905\u091a\u094d\u091b\u093e \u0939\u0948\u0964 IFA \u0915\u0940 \u0917\u094b\u0932\u093f\u092f\u093e\u0901 \u0932\u0947 \u0930\u0939\u0940 \u0939\u0948\u0902?\nPatient: \u0939\u093e\u0901, \u0930\u094b\u091c\u093c \u0932\u0947\u0924\u0940 \u0939\u0942\u0901\u0964\nASHA: TT \u0915\u093e \u091f\u0940\u0915\u093e \u0932\u0917\u093e?\nPatient: \u0939\u093e\u0901, \u092a\u0939\u0932\u093e \u0932\u0917 \u0917\u092f\u093e \u0939\u0948\u0964\nASHA: \u092c\u091a\u094d\u091a\u0947 \u0915\u0940 \u0939\u0932\u091a\u0932 \u0915\u0948\u0938\u0940 \u0939\u0948?\nPatient: \u092c\u0939\u0941\u0924 \u0939\u093f\u0932\u0924\u093e-\u0921\u0941\u0932\u0924\u093e \u0939\u0948, \u0920\u0940\u0915 \u0939\u0948\u0964\nASHA: \u092c\u0939\u0941\u0924 \u0905\u091a\u094d\u091b\u093e\u0964 \u0906\u092a \u0932\u0917\u092d\u0917 24 \u0939\u092b\u093c\u094d\u0924\u0947 \u0915\u0940 \u0939\u0948\u0902\u0964 \u0921\u093f\u0932\u0940\u0935\u0930\u0940 \u0915\u0947 \u0932\u093f\u090f \u0915\u0939\u093e\u0901 \u091c\u093e\u090f\u0901\u0917\u0940?\nPatient: PHC \u092e\u0947\u0902\u0964\nASHA: \u0917\u093e\u0921\u093c\u0940 \u0915\u093e \u0907\u0902\u0924\u091c\u093c\u093e\u092e \u0939\u0948?\nPatient: \u0939\u093e\u0901, \u092a\u0924\u093f \u0915\u0940 \u0917\u093e\u0921\u093c\u0940 \u0939\u0948\u0964\nASHA: \u0920\u0940\u0915 \u0939\u0948\u0964 \u0905\u0917\u0932\u0940 \u092c\u093e\u0930 2 \u0939\u092b\u093c\u094d\u0924\u0947 \u092c\u093e\u0926 \u0906\u0930\u0942\u0901\u0917\u0940\u0964 \u0915\u094b\u0908 \u0924\u0915\u0932\u0940\u092b\u093c \u0939\u094b \u0924\u094b \u092b\u093c\u094b\u0928 \u0915\u0930 \u0926\u0940\u091c\u093f\u090f\u0964\nPatient: \u0920\u0940\u0915 \u0939\u0948 \u0926\u0940\u0926\u0940, \u0927\u0928\u094d\u092f\u0935\u093e\u0926\u0964", "visit_type": "Auto-detect", "expect_danger": False, "expect_fields": ["110", "70", "58.0", "11.5"], }, "ANC Preeclampsia DANGER": { "transcript": "ASHA: \u0928\u092e\u0938\u094d\u0924\u0947 \u0926\u0940\u0926\u0940, \u0915\u0948\u0938\u0947 \u0939\u0948\u0902?\nPatient: \u0926\u0940\u0926\u0940, \u092e\u0941\u091d\u0947 \u092c\u0939\u0941\u0924 \u0938\u093f\u0930\u0926\u0930\u094d\u0926 \u0939\u094b \u0930\u0939\u093e \u0939\u0948 \u0915\u0932 \u0938\u0947\u0964\nASHA: \u0905\u091a\u094d\u091b\u093e, \u0914\u0930 \u0915\u094b\u0908 \u0924\u0915\u0932\u0940\u092b\u093c?\nPatient: \u0939\u093e\u0901, \u0906\u0901\u0916\u094b\u0902 \u0915\u0947 \u0938\u093e\u092e\u0928\u0947 \u0927\u0941\u0902\u0927\u0932\u093e \u0926\u093f\u0916\u0924\u093e \u0939\u0948 \u0915\u092d\u0940-\u0915\u092d\u0940\u0964 \u0914\u0930 \u091a\u0947\u0939\u0930\u0947 \u092a\u0930 \u0938\u0942\u091c\u0928 \u092d\u0940 \u0906 \u0917\u0908 \u0939\u0948\u0964\nASHA: \u092f\u0947 \u0924\u094b \u0920\u0940\u0915 \u0928\u0939\u0940\u0902 \u0939\u0948\u0964 \u092e\u0948\u0902 BP \u091a\u0947\u0915 \u0915\u0930\u0924\u0940 \u0939\u0942\u0901... \u0906\u092a\u0915\u093e BP 155/100 \u0906 \u0930\u0939\u093e \u0939\u0948\u0964 \u092f\u0947 \u092c\u0939\u0941\u0924 \u091c\u093c\u094d\u092f\u093e\u0926\u093e \u0939\u0948\u0964\nPatient: \u0915\u094d\u092f\u093e \u0915\u0930\u0947\u0902 \u0926\u0940\u0926\u0940?\nASHA: \u0906\u092a\u0915\u094b \u0924\u0941\u0930\u0902\u0924 PHC \u091c\u093e\u0928\u093e \u0939\u094b\u0917\u093e\u0964 \u092f\u0947 \u0917\u0902\u092d\u0940\u0930 \u0939\u094b \u0938\u0915\u0924\u093e \u0939\u0948\u0964 \u0906\u092a \u0915\u093f\u0924\u0928\u0947 \u092e\u0939\u0940\u0928\u0947 \u0915\u0940 \u0939\u0948\u0902?\nPatient: \u0932\u0917\u092d\u0917 8 \u092e\u0939\u0940\u0928\u0947\u0964\nASHA: \u092a\u0948\u0930\u094b\u0902 \u092e\u0947\u0902 \u0938\u0942\u091c\u0928 \u0939\u0948?\nPatient: \u0939\u093e\u0901, \u0915\u093e\u092b\u093c\u0940 \u0938\u0942\u091c\u0928 \u0939\u0948\u0964\nASHA: \u092e\u0948\u0902 \u0905\u092d\u0940 \u0917\u093e\u0921\u093c\u0940 \u0915\u093e \u0907\u0902\u0924\u091c\u093c\u093e\u092e \u0915\u0930\u0924\u0940 \u0939\u0942\u0901\u0964 \u0906\u092a\u0915\u094b \u0906\u091c \u0939\u0940 PHC \u0932\u0947 \u091a\u0932\u0924\u0940 \u0939\u0942\u0901\u0964", "visit_type": "Auto-detect", "expect_danger": True, "expect_fields": ["155", "100"], }, "PNC Newborn DANGER": { "transcript": "ASHA: \u0928\u092e\u0938\u094d\u0924\u0947, \u0915\u0948\u0938\u0947 \u0939\u0948\u0902? \u092c\u091a\u094d\u091a\u093e \u0915\u0948\u0938\u093e \u0939\u0948?\nMother: \u0926\u0940\u0926\u0940, \u092c\u091a\u094d\u091a\u093e \u092c\u0939\u0941\u0924 \u0938\u094b\u0924\u093e \u0930\u0939\u0924\u093e \u0939\u0948\u0964 \u0926\u0942\u0927 \u092d\u0940 \u0920\u0940\u0915 \u0938\u0947 \u0928\u0939\u0940\u0902 \u092a\u0940\u0924\u093e\u0964\nASHA: \u0915\u092c \u0938\u0947 \u0910\u0938\u093e \u0939\u0948?\nMother: \u0915\u0932 \u0938\u0947\u0964 \u092a\u0939\u0932\u0947 \u0920\u0940\u0915 \u0925\u093e, \u0905\u092c \u0932\u0917\u092d\u0917 12 \u0918\u0902\u091f\u0947 \u0938\u0947 \u0926\u0942\u0927 \u0928\u0939\u0940\u0902 \u092a\u093f\u092f\u093e\u0964\nASHA: \u092c\u091a\u094d\u091a\u0947 \u0915\u093e \u0930\u094b\u0928\u093e \u0915\u0948\u0938\u093e \u0939\u0948?\nMother: \u092c\u0939\u0941\u0924 \u0915\u092e\u091c\u093c\u094b\u0930 \u0906\u0935\u093e\u091c\u093c \u092e\u0947\u0902 \u0930\u094b\u0924\u093e \u0939\u0948\u0964\nASHA: \u0924\u093e\u092a\u092e\u093e\u0928 \u091a\u0947\u0915 \u0915\u0930\u0924\u0940 \u0939\u0942\u0901... 100.5 \u0921\u093f\u0917\u094d\u0930\u0940 \u0939\u0948\u0964 \u092c\u0941\u0916\u093e\u0930 \u0939\u0948\u0964 \u0914\u0930 \u092c\u091a\u094d\u091a\u093e \u0938\u0941\u0938\u094d\u0924 \u0932\u0917 \u0930\u0939\u093e \u0939\u0948\u0964\nMother: \u0915\u094d\u092f\u093e \u0915\u0930\u0947\u0902?\nASHA: \u092f\u0947 IMNCI \u0915\u0947 danger signs \u0939\u0948\u0902\u0964 \u092c\u091a\u094d\u091a\u0947 \u0915\u094b \u0924\u0941\u0930\u0902\u0924 PHC \u0932\u0947 \u091c\u093e\u0928\u093e \u0939\u094b\u0917\u093e\u0964 \u092e\u0948\u0902 \u0917\u093e\u0921\u093c\u0940 \u092c\u0941\u0932\u093e\u0924\u0940 \u0939\u0942\u0901\u0964", "visit_type": "Auto-detect", "expect_danger": True, "expect_fields": [], }, "Child Health Routine": { "transcript": "ASHA: \u0928\u092e\u0938\u094d\u0924\u0947, \u092c\u091a\u094d\u091a\u093e \u0915\u0948\u0938\u093e \u0939\u0948?\nMother: \u092c\u093f\u0932\u094d\u0915\u0941\u0932 \u0920\u0940\u0915 \u0939\u0948 \u0926\u0940\u0926\u0940\u0964 \u0916\u0942\u092c \u0916\u093e\u0924\u093e \u0939\u0948, \u0916\u0947\u0932\u0924\u093e \u0939\u0948\u0964\nASHA: \u092c\u0939\u0941\u0924 \u0905\u091a\u094d\u091b\u093e! \u0935\u091c\u0928 \u0926\u0947\u0916\u0924\u0940 \u0939\u0942\u0901... 8.5 kg \u0939\u0948\u0964 9 \u092e\u0939\u0940\u0928\u0947 \u0915\u0947 \u0932\u093f\u090f \u0905\u091a\u094d\u091b\u093e \u0939\u0948\u0964\nMother: \u0939\u093e\u0901, \u0926\u093e\u0932-\u091a\u093e\u0935\u0932, \u0915\u0947\u0932\u093e \u0938\u092c \u0916\u093e\u0924\u093e \u0939\u0948 \u0905\u092c\u0964\nASHA: Vitamin A \u0915\u0940 \u0926\u0935\u093e\u0908 \u0926\u0940 \u0925\u0940 \u092a\u093f\u091b\u0932\u0940 \u092c\u093e\u0930?\nMother: \u0939\u093e\u0901, 6 \u092e\u0939\u0940\u0928\u0947 \u092e\u0947\u0902 \u0926\u0940 \u0925\u0940\u0964\nASHA: \u0905\u091a\u094d\u091b\u093e\u0964 \u0905\u092c deworming \u092d\u0940 \u0926\u0947\u0928\u0940 \u0939\u0948\u0964 \u0914\u0930 \u091f\u0940\u0915\u0947 \u0938\u092c \u0932\u0917\u0947 \u0939\u0948\u0902?\nMother: \u0939\u093e\u0901, \u0938\u092c \u0938\u092e\u092f \u092a\u0930 \u0932\u0917\u0947 \u0939\u0948\u0902\u0964\nASHA: \u092c\u0939\u0941\u0924 \u0905\u091a\u094d\u091b\u093e\u0964 \u092c\u091a\u094d\u091a\u093e \u092c\u0948\u0920\u0924\u093e \u0939\u0948, \u0918\u0941\u091f\u0928\u094b\u0902 \u092a\u0930 \u091a\u0932\u0924\u093e \u0939\u0948?\nMother: \u0939\u093e\u0901, \u0938\u092c \u0915\u0930\u0924\u093e \u0939\u0948\u0964 \u092c\u094b\u0932\u0928\u0947 \u092d\u0940 \u0932\u0917\u093e \u0939\u0948 \u0925\u094b\u0921\u093c\u093e\u0964\nASHA: \u092c\u0922\u093c\u093f\u092f\u093e \u0939\u0948\u0964 \u0905\u0917\u0932\u0940 \u092c\u093e\u0930 3 \u092e\u0939\u0940\u0928\u0947 \u092c\u093e\u0926 \u0906\u0930\u0942\u0901\u0917\u0940\u0964", "visit_type": "Auto-detect", "expect_danger": False, "expect_fields": ["8.5"], }, } def run_tests(): print("=" * 60) print("SAKHI API TEST SUITE") print("=" * 60) try: from gradio_client import Client except ImportError: import subprocess subprocess.run(["pip", "install", "gradio_client", "-q"]) from gradio_client import Client client = Client(BASE, verbose=False) passed = 0 failed = 0 for name, test in TESTS.items(): print(f"\n--- {name} ---") try: result = client.predict( transcript=test["transcript"], visit_type_override=test["visit_type"], api_name="/process_transcript" ) status_html, form_html, danger_html, time_str = result has_form = "result-card" in form_html and "error" not in form_html has_danger_signs = "Danger Signs Detected" in danger_html is_referral = "REFERRAL" in danger_html print(f" Form: {'OK' if has_form else 'FAIL'}") print(f" Danger: {'YES' if has_danger_signs else 'none'}") print(f" Referral: {'YES' if is_referral else 'no'}") print(f" Time: {time_str}") ok = True if test["expect_danger"] and not has_danger_signs: print(f" FAIL: expected danger signs") ok = False if not test["expect_danger"] and has_danger_signs: print(f" FAIL: unexpected danger signs") ok = False if not has_form: print(f" FAIL: no form") ok = False for val in test["expect_fields"]: if val in form_html: print(f" Field {val}: OK") else: print(f" FAIL: {val} not found") ok = False print(f" {'PASSED' if ok else 'FAILED'}") if ok: passed += 1 else: failed += 1 except Exception as e: print(f" ERROR: {type(e).__name__}: {str(e)[:80]}") failed += 1 print(f"\n{'=' * 60}") print(f"RESULTS: {passed}/{len(TESTS)} passed") print(f"{'=' * 60}") if __name__ == "__main__": run_tests()