MohitGupta41
Commiting Final Complete Project
e51c241
# src/agent/tools.py
from langchain.tools import tool
from ..services.patient_service import register_patient, get_patient_full_case
from ..services.doctor_service import confirm_assigned_doctor
from ..services.medicine_service import check_medicine_availability
from ..services.summarizer import summarize_patient_case
from ..rag.rag_pipeline import rag_query_multimodal
# -------------------------------
# Register Patient Tool
# -------------------------------
@tool("register_patient", return_direct=True)
def register_patient_tool(name: str, age: int, reason: str) -> str:
"""Register a new patient with their details and reason for visit."""
patient = register_patient({"name": name, "age": age, "reason": reason})
return (
f"Patient {patient['name']}, {patient['age']} years old, "
f"registered successfully with a complaint of {patient['reason']}. "
f"Patient ID: {patient['id']}."
)
# -------------------------------
# Confirm Appointment Tool
# -------------------------------
@tool("confirm_appointment", return_direct=True)
def confirm_appointment_tool(name: str) -> str:
"""
Confirm appointment with the doctor already assigned to this patient.
If no assigned doctor is found, notify the user.
"""
doctor = confirm_assigned_doctor(name)
if doctor:
return (
f"Appointment confirmed with {doctor['name']} "
f"({doctor['specialization']}) for patient {name}."
)
else:
return f"No assigned doctor found for patient {name}. Please register first."
# -------------------------------
# Medicine Availability Tool
# -------------------------------
@tool("medicine_availability", return_direct=True)
def medicine_availability_tool(medicine_name: str) -> str:
"""Check if a specific medicine is available in stock."""
return check_medicine_availability(medicine_name)
# -------------------------------
# Summarize Case Tool
# -------------------------------
@tool("summarize_case", return_direct=True)
def summarize_case_tool(patient_id: int, hf_token: str = None) -> str:
"""
Summarize a patient's case using stored data and LLM.
Provide patient_id as input.
"""
patient_data = get_patient_full_case(patient_id)
summary = summarize_patient_case(patient_data, hf_token=hf_token)
return summary
# -------------------------------
# RAG Medical Knowledge Tool (Optional if used separately)
# -------------------------------
@tool("medical_rag", return_direct=True)
def medical_rag_tool(query: str, hf_token: str = None) -> str:
"""Answer medical questions from the PDF knowledge base using RAG."""
answer, refs = rag_query_multimodal(query, k=5, hf_token=hf_token)
refs_str = "\n".join([f"Page {r['page']}: {r['link']}" for r in refs])
return f"{answer}\n\nReferences:\n{refs_str}"