Spaces:
Paused
Paused
| # SentinelRx Model Integration Notes | |
| Use this file when your teammate is ready to plug in the final models. | |
| ## Current placeholder functions | |
| The app currently has two placeholder functions: | |
| ```python | |
| def run_severity_model(text: str) -> Dict: | |
| ... | |
| def run_medical_extraction_model(text: str) -> Dict: | |
| ... | |
| ``` | |
| ## Expected severity model return format | |
| The app expects the severity model function to return: | |
| ```python | |
| { | |
| "label": "Mild" | "Moderate" | "Severe", | |
| "probability": 0.0 to 1.0, | |
| "drivers": ["important phrase 1", "important phrase 2"], | |
| "note": "short explanation" | |
| } | |
| ``` | |
| ## Expected extraction model return format | |
| The app expects the extraction model function to return: | |
| ```python | |
| { | |
| "medications": ["Risedronate"], | |
| "symptoms": ["nausea", "headache"], | |
| "timing": ["two days ago"], | |
| "patient_context": ["Osteoporosis"] | |
| } | |
| ``` | |
| ## Example: replacing the severity function with a Transformers pipeline | |
| ```python | |
| from transformers import pipeline | |
| severity_pipeline = pipeline( | |
| "text-classification", | |
| model="YOUR_TEAM/YOUR_SEVERITY_MODEL", | |
| return_all_scores=True | |
| ) | |
| def run_severity_model(text: str) -> Dict: | |
| raw = severity_pipeline(text)[0] | |
| best = max(raw, key=lambda x: x["score"]) | |
| label_map = { | |
| "LABEL_0": "Mild", | |
| "LABEL_1": "Severe" | |
| } | |
| return { | |
| "label": label_map.get(best["label"], best["label"]), | |
| "probability": float(best["score"]), | |
| "drivers": [], | |
| "note": "Output from trained severity model." | |
| } | |
| ``` | |
| ## Example: replacing the extraction function with an NER pipeline | |
| ```python | |
| from transformers import pipeline | |
| ner_pipeline = pipeline( | |
| "token-classification", | |
| model="YOUR_NER_MODEL", | |
| aggregation_strategy="simple" | |
| ) | |
| def run_medical_extraction_model(text: str) -> Dict: | |
| entities = ner_pipeline(text) | |
| medications = [] | |
| symptoms = [] | |
| timing = [] | |
| patient_context = [] | |
| for ent in entities: | |
| group = ent["entity_group"].lower() | |
| word = ent["word"] | |
| if "drug" in group or "medication" in group: | |
| medications.append(word) | |
| elif "symptom" in group or "disease" in group: | |
| symptoms.append(word) | |
| elif "date" in group or "time" in group: | |
| timing.append(word) | |
| else: | |
| patient_context.append(word) | |
| return { | |
| "medications": sorted(set(medications)) or ["Not detected"], | |
| "symptoms": sorted(set(symptoms)) or ["Not detected"], | |
| "timing": sorted(set(timing)) or ["Not detected"], | |
| "patient_context": sorted(set(patient_context)) or ["Not detected"] | |
| } | |
| ``` | |
| ## Where the agentic part happens | |
| The agent-like workflow is handled by: | |
| ```python | |
| triage_agent(severity, extraction, case) | |
| ``` | |
| This function does not diagnose. It uses model outputs plus SentinelRx profile data to: | |
| 1. Prioritize the case | |
| 2. Summarize why it was prioritized | |
| 3. Identify missing fields | |
| 4. Recommend a next human review step | |
| 5. Prepare report content | |
| ``` | |