refactor matching algo
Browse files- app.py +7 -116
- utils/oneclick.py +24 -14
app.py
CHANGED
|
@@ -4,9 +4,9 @@ import os
|
|
| 4 |
import logging
|
| 5 |
from utils.meldrx import MeldRxAPI
|
| 6 |
from utils.oneclick import generate_discharge_paper_one_click
|
| 7 |
-
from
|
| 8 |
|
| 9 |
-
logging.basicConfig(level=logging.
|
| 10 |
logger = logging.getLogger(__name__)
|
| 11 |
|
| 12 |
app = Flask(__name__)
|
|
@@ -24,12 +24,7 @@ meldrx_api = MeldRxAPI(
|
|
| 24 |
redirect_uri=REDIRECT_URI
|
| 25 |
)
|
| 26 |
|
| 27 |
-
|
| 28 |
-
HF_TOKEN = os.getenv("HF_TOKEN")
|
| 29 |
-
if not HF_TOKEN:
|
| 30 |
-
raise ValueError("HF_TOKEN environment variable not set.")
|
| 31 |
-
client = InferenceClient(api_key=HF_TOKEN)
|
| 32 |
-
MODEL_NAME = "meta-llama/Llama-3.3-70B-Instruct"
|
| 33 |
|
| 34 |
@app.route('/')
|
| 35 |
def index():
|
|
@@ -57,8 +52,10 @@ def dashboard():
|
|
| 57 |
return redirect(url_for('auth'))
|
| 58 |
patients_data = meldrx_api.get_patients()
|
| 59 |
if not patients_data or "entry" not in patients_data:
|
|
|
|
| 60 |
return render_template('dashboard.html', error="Failed to fetch patient data")
|
| 61 |
patients = [entry['resource'] for entry in patients_data.get('entry', [])]
|
|
|
|
| 62 |
return render_template('dashboard.html', patients=patients, authenticated=True)
|
| 63 |
|
| 64 |
@app.route('/oneclick', methods=['GET', 'POST'])
|
|
@@ -75,7 +72,7 @@ def one_click():
|
|
| 75 |
logger.info(f"One-click request - ID: {patient_id}, First: {first_name}, Last: {last_name}, Action: {action}")
|
| 76 |
|
| 77 |
pdf_path, status, basic_summary, ai_summary = generate_discharge_paper_one_click(
|
| 78 |
-
meldrx_api,
|
| 79 |
)
|
| 80 |
|
| 81 |
if action == "Display Summary":
|
|
@@ -102,110 +99,4 @@ def one_click():
|
|
| 102 |
|
| 103 |
if __name__ == '__main__':
|
| 104 |
port = int(os.getenv("PORT", 7860))
|
| 105 |
-
app.run(debug=False, host='0.0.0.0', port=port)
|
| 106 |
-
|
| 107 |
-
|
| 108 |
-
|
| 109 |
-
# # app.py
|
| 110 |
-
# from flask import Flask, render_template, request, send_file, redirect, url_for
|
| 111 |
-
# import os
|
| 112 |
-
# import logging
|
| 113 |
-
# from utils.meldrx import MeldRxAPI
|
| 114 |
-
# from utils.oneclick import generate_discharge_paper_one_click
|
| 115 |
-
# from xai import Grok # Adjust import based on actual xAI SDK
|
| 116 |
-
|
| 117 |
-
# logging.basicConfig(level=logging.DEBUG) # Changed to DEBUG for more detailed logs
|
| 118 |
-
# logger = logging.getLogger(__name__)
|
| 119 |
-
|
| 120 |
-
# app = Flask(__name__)
|
| 121 |
-
|
| 122 |
-
# CLIENT_ID = os.getenv("MELDRX_CLIENT_ID", "04bdc9f9a23d488a868b93d594ee5a4a")
|
| 123 |
-
# CLIENT_SECRET = os.getenv("MELDRX_CLIENT_SECRET", None)
|
| 124 |
-
# WORKSPACE_ID = os.getenv("MELDRX_WORKSPACE_ID", "09ed4f76-b5ac-42bf-92d5-496933203dbe")
|
| 125 |
-
# SPACE_URL = os.getenv("SPACE_URL", "https://multitransformer-tonic-discharge-guard.hf.space")
|
| 126 |
-
# REDIRECT_URI = f"{SPACE_URL}/auth/callback"
|
| 127 |
-
|
| 128 |
-
# meldrx_api = MeldRxAPI(
|
| 129 |
-
# client_id=CLIENT_ID,
|
| 130 |
-
# client_secret=CLIENT_SECRET,
|
| 131 |
-
# workspace_id=WORKSPACE_ID,
|
| 132 |
-
# redirect_uri=REDIRECT_URI
|
| 133 |
-
# )
|
| 134 |
-
|
| 135 |
-
# # Initialize xAI client
|
| 136 |
-
# grok_client = Grok() # Adjust initialization as needed
|
| 137 |
-
|
| 138 |
-
# @app.route('/')
|
| 139 |
-
# def index():
|
| 140 |
-
# return render_template('index.html')
|
| 141 |
-
|
| 142 |
-
# @app.route('/auth', methods=['GET', 'POST'])
|
| 143 |
-
# def auth():
|
| 144 |
-
# if request.method == 'POST':
|
| 145 |
-
# auth_code = request.form.get('auth_code')
|
| 146 |
-
# if auth_code and meldrx_api.authenticate_with_code(auth_code):
|
| 147 |
-
# return redirect(url_for('dashboard'))
|
| 148 |
-
# return render_template('auth.html', auth_url=meldrx_api.get_authorization_url(), auth_result="Authentication failed")
|
| 149 |
-
# return render_template('auth.html', auth_url=meldrx_api.get_authorization_url())
|
| 150 |
-
|
| 151 |
-
# @app.route('/auth/callback', methods=['GET'])
|
| 152 |
-
# def auth_callback():
|
| 153 |
-
# auth_code = request.args.get('code')
|
| 154 |
-
# if auth_code and meldrx_api.authenticate_with_code(auth_code):
|
| 155 |
-
# return redirect(url_for('dashboard'))
|
| 156 |
-
# return render_template('auth.html', auth_url=meldrx_api.get_authorization_url(), auth_result="Callback failed")
|
| 157 |
-
|
| 158 |
-
# @app.route('/dashboard', methods=['GET'])
|
| 159 |
-
# def dashboard():
|
| 160 |
-
# if not meldrx_api.access_token:
|
| 161 |
-
# return redirect(url_for('auth'))
|
| 162 |
-
# patients_data = meldrx_api.get_patients()
|
| 163 |
-
# if not patients_data or "entry" not in patients_data:
|
| 164 |
-
# logger.error("Failed to fetch patient data for dashboard")
|
| 165 |
-
# return render_template('dashboard.html', error="Failed to fetch patient data")
|
| 166 |
-
# patients = [entry['resource'] for entry in patients_data.get('entry', [])]
|
| 167 |
-
# logger.debug(f"Patients for dashboard: {patients}")
|
| 168 |
-
# return render_template('dashboard.html', patients=patients, authenticated=True)
|
| 169 |
-
|
| 170 |
-
# @app.route('/oneclick', methods=['GET', 'POST'])
|
| 171 |
-
# def one_click():
|
| 172 |
-
# if not meldrx_api.access_token:
|
| 173 |
-
# return redirect(url_for('auth'))
|
| 174 |
-
|
| 175 |
-
# if request.method == 'POST':
|
| 176 |
-
# patient_id = request.form.get('patient_id', '').strip()
|
| 177 |
-
# first_name = request.form.get('first_name', '').strip()
|
| 178 |
-
# last_name = request.form.get('last_name', '').strip()
|
| 179 |
-
# action = request.form.get('action', '')
|
| 180 |
-
|
| 181 |
-
# logger.info(f"One-click request - ID: {patient_id}, First: {first_name}, Last: {last_name}, Action: {action}")
|
| 182 |
-
|
| 183 |
-
# pdf_path, status, basic_summary, ai_summary = generate_discharge_paper_one_click(
|
| 184 |
-
# meldrx_api, grok_client, patient_id, first_name, last_name
|
| 185 |
-
# )
|
| 186 |
-
|
| 187 |
-
# if action == "Display Summary":
|
| 188 |
-
# return render_template('oneclick.html',
|
| 189 |
-
# status=status,
|
| 190 |
-
# basic_summary=basic_summary.replace('\n', '<br>') if basic_summary else None,
|
| 191 |
-
# ai_summary=ai_summary.replace('\n', '<br>') if ai_summary else None,
|
| 192 |
-
# patient_id=patient_id,
|
| 193 |
-
# first_name=first_name,
|
| 194 |
-
# last_name=last_name)
|
| 195 |
-
# elif action == "Generate PDF" and pdf_path:
|
| 196 |
-
# return send_file(pdf_path,
|
| 197 |
-
# as_attachment=True,
|
| 198 |
-
# download_name=f"discharge_summary_{patient_id or 'patient'}.pdf")
|
| 199 |
-
# return render_template('oneclick.html',
|
| 200 |
-
# status=status,
|
| 201 |
-
# basic_summary=basic_summary.replace('\n', '<br>') if basic_summary else None,
|
| 202 |
-
# ai_summary=ai_summary.replace('\n', '<br>') if ai_summary else None,
|
| 203 |
-
# patient_id=patient_id,
|
| 204 |
-
# first_name=first_name,
|
| 205 |
-
# last_name=last_name)
|
| 206 |
-
|
| 207 |
-
# return render_template('oneclick.html')
|
| 208 |
-
|
| 209 |
-
# if __name__ == '__main__':
|
| 210 |
-
# port = int(os.getenv("PORT", 7860))
|
| 211 |
-
# app.run(debug=False, host='0.0.0.0', port=port)
|
|
|
|
| 4 |
import logging
|
| 5 |
from utils.meldrx import MeldRxAPI
|
| 6 |
from utils.oneclick import generate_discharge_paper_one_click
|
| 7 |
+
from xai import Grok # Adjust import based on actual xAI SDK
|
| 8 |
|
| 9 |
+
logging.basicConfig(level=logging.DEBUG)
|
| 10 |
logger = logging.getLogger(__name__)
|
| 11 |
|
| 12 |
app = Flask(__name__)
|
|
|
|
| 24 |
redirect_uri=REDIRECT_URI
|
| 25 |
)
|
| 26 |
|
| 27 |
+
grok_client = Grok() # Adjust initialization as needed
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 28 |
|
| 29 |
@app.route('/')
|
| 30 |
def index():
|
|
|
|
| 52 |
return redirect(url_for('auth'))
|
| 53 |
patients_data = meldrx_api.get_patients()
|
| 54 |
if not patients_data or "entry" not in patients_data:
|
| 55 |
+
logger.error("Failed to fetch patient data for dashboard")
|
| 56 |
return render_template('dashboard.html', error="Failed to fetch patient data")
|
| 57 |
patients = [entry['resource'] for entry in patients_data.get('entry', [])]
|
| 58 |
+
logger.debug(f"Patients for dashboard: {patients}")
|
| 59 |
return render_template('dashboard.html', patients=patients, authenticated=True)
|
| 60 |
|
| 61 |
@app.route('/oneclick', methods=['GET', 'POST'])
|
|
|
|
| 72 |
logger.info(f"One-click request - ID: {patient_id}, First: {first_name}, Last: {last_name}, Action: {action}")
|
| 73 |
|
| 74 |
pdf_path, status, basic_summary, ai_summary = generate_discharge_paper_one_click(
|
| 75 |
+
meldrx_api, grok_client, patient_id, first_name, last_name
|
| 76 |
)
|
| 77 |
|
| 78 |
if action == "Display Summary":
|
|
|
|
| 99 |
|
| 100 |
if __name__ == '__main__':
|
| 101 |
port = int(os.getenv("PORT", 7860))
|
| 102 |
+
app.run(debug=False, host='0.0.0.0', port=port)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
utils/oneclick.py
CHANGED
|
@@ -77,38 +77,48 @@ def generate_discharge_paper_one_click(
|
|
| 77 |
logger.info(f"Found {len(extractor.patients)} patients in the data")
|
| 78 |
|
| 79 |
matching_patients = []
|
|
|
|
|
|
|
|
|
|
| 80 |
for i in range(len(extractor.patients)):
|
| 81 |
extractor.set_patient_by_index(i)
|
| 82 |
patient_data = extractor.get_patient_dict()
|
| 83 |
|
| 84 |
-
patient_id_from_data = patient_data.get('id', '').strip().lower()
|
| 85 |
-
first_name_from_data = patient_data.get('first_name', '').strip().lower()
|
| 86 |
-
last_name_from_data = patient_data.get('last_name', '').strip().lower()
|
|
|
|
|
|
|
|
|
|
| 87 |
|
| 88 |
-
patient_id_input = patient_id.strip().lower()
|
| 89 |
-
first_name_input = first_name.strip().lower()
|
| 90 |
-
last_name_input = last_name.strip().lower()
|
| 91 |
|
| 92 |
-
logger.debug(f"
|
| 93 |
-
|
| 94 |
-
f"Last: {last_name_input} vs {last_name_from_data}")
|
| 95 |
|
| 96 |
matches = True
|
| 97 |
-
if patient_id_input and
|
| 98 |
matches = False
|
| 99 |
-
if first_name_input and
|
| 100 |
matches = False
|
| 101 |
-
if last_name_input and
|
| 102 |
matches = False
|
| 103 |
|
| 104 |
if matches:
|
| 105 |
matching_patients.append(patient_data)
|
| 106 |
-
logger.info(f"Found matching patient: {
|
|
|
|
| 107 |
|
| 108 |
if not matching_patients:
|
| 109 |
search_criteria = f"ID: {patient_id or 'N/A'}, First: {first_name or 'N/A'}, Last: {last_name or 'N/A'}"
|
| 110 |
logger.warning(f"No patients matched criteria: {search_criteria}")
|
| 111 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
| 112 |
|
| 113 |
patient_data = matching_patients[0]
|
| 114 |
logger.info(f"Selected patient data: {patient_data}")
|
|
|
|
| 77 |
logger.info(f"Found {len(extractor.patients)} patients in the data")
|
| 78 |
|
| 79 |
matching_patients = []
|
| 80 |
+
all_patient_ids = []
|
| 81 |
+
all_patient_names = []
|
| 82 |
+
|
| 83 |
for i in range(len(extractor.patients)):
|
| 84 |
extractor.set_patient_by_index(i)
|
| 85 |
patient_data = extractor.get_patient_dict()
|
| 86 |
|
| 87 |
+
patient_id_from_data = str(patient_data.get('id', '')).strip().lower()
|
| 88 |
+
first_name_from_data = str(patient_data.get('first_name', '')).strip().lower()
|
| 89 |
+
last_name_from_data = str(patient_data.get('last_name', '')).strip().lower()
|
| 90 |
+
|
| 91 |
+
all_patient_ids.append(patient_id_from_data)
|
| 92 |
+
all_patient_names.append(f"{first_name_from_data} {last_name_from_data}")
|
| 93 |
|
| 94 |
+
patient_id_input = str(patient_id).strip().lower()
|
| 95 |
+
first_name_input = str(first_name).strip().lower()
|
| 96 |
+
last_name_input = str(last_name).strip().lower()
|
| 97 |
|
| 98 |
+
logger.debug(f"Patient {i}: ID={patient_id_from_data}, Name={first_name_from_data} {last_name_from_data}")
|
| 99 |
+
logger.debug(f"Comparing - Input: ID={patient_id_input}, First={first_name_input}, Last={last_name_input}")
|
|
|
|
| 100 |
|
| 101 |
matches = True
|
| 102 |
+
if patient_id_input and patient_id_input != patient_id_from_data:
|
| 103 |
matches = False
|
| 104 |
+
if first_name_input and first_name_input not in first_name_from_data:
|
| 105 |
matches = False
|
| 106 |
+
if last_name_input and last_name_input not in last_name_from_data:
|
| 107 |
matches = False
|
| 108 |
|
| 109 |
if matches:
|
| 110 |
matching_patients.append(patient_data)
|
| 111 |
+
logger.info(f"Found matching patient: ID={patient_id_from_data}, "
|
| 112 |
+
f"Name={first_name_from_data} {last_name_from_data}")
|
| 113 |
|
| 114 |
if not matching_patients:
|
| 115 |
search_criteria = f"ID: {patient_id or 'N/A'}, First: {first_name or 'N/A'}, Last: {last_name or 'N/A'}"
|
| 116 |
logger.warning(f"No patients matched criteria: {search_criteria}")
|
| 117 |
+
logger.info(f"Available patient IDs: {all_patient_ids}")
|
| 118 |
+
logger.info(f"Available patient names: {all_patient_names}")
|
| 119 |
+
return None, (f"No patients found matching criteria: {search_criteria}\n"
|
| 120 |
+
f"Available IDs: {', '.join(all_patient_ids)}\n"
|
| 121 |
+
f"Available Names: {', '.join(all_patient_names)}"), None, None
|
| 122 |
|
| 123 |
patient_data = matching_patients[0]
|
| 124 |
logger.info(f"Selected patient data: {patient_data}")
|