"""Stub AI adapter for HAD Digital MVP.
Echoes messages back with context-aware formatting.
Used for offline demo and development.
"""
from adapters.base import BaseAdapter
class StubAdapter(BaseAdapter):
"""Stub adapter that echoes messages with helpful context-aware responses."""
def chat(self, message: str, context: dict = None) -> dict:
"""Generate a stub response based on the message content."""
context = context or {}
patient_id = context.get("patient_id")
user_role = context.get("user_role", "unknown")
symptoms = context.get("symptoms", [])
history = context.get("history", [])
# Simple keyword-based response logic for demo
message_lower = message.lower()
if any(word in message_lower for word in ["nausee", "nausea", "vomissement", "vomiting"]):
response = (
"D'apres les symptomes decrits, il s'agit probablement d'effets secondaires "
"gastro-intestinaux du traitement. Je recommande:\n\n"
"1. Antiemetiques selon le protocole prescrit\n"
"2. Hydratation adequate (minimum 1.5L/jour)\n"
"3. Repas fractionnes (petites portions frequentes)\n"
"4. Surveillance de la deshydratation\n\n"
"Si les symptomes persistent plus de 48h ou s'aggravent, "
"contactez l'equipe soignante."
)
actions = [
{"type": "check_symptom", "symptom": "nausea", "label": "Evaluer la nausee"},
{"type": "check_symptom", "symptom": "vomiting", "label": "Evaluer les vomissements"},
]
elif any(word in message_lower for word in ["fievre", "fever", "temperature", "fieber"]):
response = (
"La fievre pendant une chimiotherapie peut etre un signe de neutropenie febrile, "
"ce qui est une URGENCE MEDICALE.\n\n"
"Actions immediates:\n"
"1. Prendre la temperature\n"
"2. Si >= 38.3C: contacter immediatement le 15 ou les urgences\n"
"3. Si 38.0-38.3C: contacter l'equipe soignante dans l'heure\n\n"
"Ne prenez pas d'antibiotiques sans avis medical."
)
actions = [
{"type": "check_symptom", "symptom": "fever", "label": "Evaluer la fievre"},
{"type": "emergency", "label": "Contacter les urgences"},
]
elif any(word in message_lower for word in ["fatigue", "fatigue", "fatigue"]):
response = (
"La fatigue est un effet secondaire tres frequent de la chimiotherapie. "
"Voici quelques recommandations:\n\n"
"1. Maintenir une activite physique moderee (marche quotidienne)\n"
"2. Planifier des periodes de repos\n"
"3. Maintenir une alimentation equilibree\n"
"4. Dormir 7-8 heures par nuit\n\n"
"Si la fatigue empeche les activites quotidiennes, "
"une evaluation medicale est recommandee."
)
actions = [
{"type": "check_symptom", "symptom": "fatigue", "label": "Evaluer la fatigue"},
]
elif any(word in message_lower for word in ["douleur", "pain", "douleur"]):
response = (
"La douleur pendant le traitement peut avoir plusieurs causes. "
"Il est important de:\n\n"
"1. Decrire l'intensite (echelle 0-10)\n"
"2. Localiser la douleur\n"
"3. Noter les facteurs aggravants/soulageants\n\n"
"Les antalgiques doivent etre pris selon la prescription. "
"Si la douleur est mal controlee, contactez l'equipe soignante."
)
actions = [
{"type": "assess_pain", "label": "Evaluer la douleur"},
]
elif any(word in message_lower for word in ["medicament", "medication", "drug", "traitement"]):
response = (
"Pour toute question sur vos medicaments:\n\n"
"1. Respectez les horaires de prise\n"
"2. Ne modifiez jamais la dose sans avis medical\n"
"3. Signalez tout effet indesirable\n"
"4. Gardez une liste de vos medicaments a jour\n\n"
"Votre pharmacien peut aussi vous conseiller sur les interactions."
)
actions = [
{"type": "view_medications", "label": "Voir mes medicaments"},
]
else:
response = (
f"Je suis l'assistant virtuel HAD Digital. "
f"Je peux vous aider avec:\n\n"
f"- La gestion des effets secondaires\n"
f"- Les questions sur votre traitement\n"
f"- Les symptomes a surveiller\n"
f"- Les contacts d'urgence\n\n"
f"Posez-moi votre question ou choisissez un sujet."
)
actions = [
{"type": "check_symptom", "symptom": "nausea", "label": "Nausee"},
{"type": "check_symptom", "symptom": "fatigue", "label": "Fatigue"},
{"type": "check_symptom", "symptom": "fever", "label": "Fievre"},
{"type": "view_guidance", "label": "Guidance patient"},
]
# Add patient context if available
if patient_id:
response = f"[Patient #{patient_id}] {response}"
return {
"response": response,
"sources": ["HAD Digital - Guide patient"],
"confidence": 0.8,
"actions": actions,
"adapter": "stub",
}
def get_name(self) -> str:
return "stub"
def is_available(self) -> bool:
return True