import os import json import streamlit as st import faiss import numpy as np from sentence_transformers import SentenceTransformer from transformers import pipeline from reportlab.lib.pagesizes import A4 from reportlab.platypus import Paragraph, SimpleDocTemplate, Spacer from reportlab.lib.styles import getSampleStyleSheet # Load milestones data with open('milestones.json', 'r') as f: milestones = json.load(f) # Age categories for dropdown selection age_categories = { "Up to 2 months": 2, "Up to 4 months": 4, "Up to 6 months": 6, "Up to 9 months": 9, "Up to 1 year": 12, "Up to 15 months": 15, "Up to 18 months": 18, "Up to 2 years": 24, "Up to 30 months": 30, "Up to 3 years": 36, "Up to 4 years": 48, "Up to 5 years": 60 } # Initialize FAISS and Sentence Transformer model = SentenceTransformer('all-MiniLM-L6-v2') def create_faiss_index(data): descriptions = [] age_keys = [] for age, categories in data.items(): for entry in categories: descriptions.append(entry['description']) age_keys.append(int(age)) embeddings = model.encode(descriptions, convert_to_numpy=True) index = faiss.IndexFlatL2(embeddings.shape[1]) index.add(embeddings) return index, descriptions, age_keys index, descriptions, age_keys = create_faiss_index(milestones) # Function to retrieve the closest milestone def retrieve_milestone(user_input): user_embedding = model.encode([user_input], convert_to_numpy=True) _, indices = index.search(user_embedding, 1) return descriptions[indices[0][0]] if indices[0][0] < len(descriptions) else "No relevant milestone found." # Initialize IBM Granite Model ibm_model = pipeline("text-generation", model="ibm-granite", max_length=512) def generate_response(user_input, child_age): relevant_milestone = retrieve_milestone(user_input) prompt = (f"The child is {child_age} months old. Based on the given traits: {user_input}, " f"determine whether the child is meeting expected milestones. " f"Relevant milestone: {relevant_milestone}. " "If there are any concerns, suggest steps the parents can take. ") response = ibm_model(prompt) return response[0]['generated_text'] # Streamlit UI Styling st.set_page_config(page_title="Tiny Triumphs Tracker", page_icon="👶", layout="wide") st.markdown(""" """, unsafe_allow_html=True) st.markdown("