Spaces:
Sleeping
Sleeping
| """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() | |