diff --git a/README.md b/README.md index c5478b8..0820749 100644 --- a/README.md +++ b/README.md @@ -1,14 +1,14 @@ # Personal AI Assistant -A client-server web application for managing personal health and life areas with AI-powered assistance. Upload documents, chat with AI specialists, receive proactive health reminders, and track critical information across multiple life domains. +A client-server web application for managing different areas of personal life with AI-powered assistance. Upload documents, chat with AI specialists, receive proactive reminders, and track critical information across multiple life domains (health, finance, personal, work, etc.). ## Key Features -- **AI Chat with Specialists** — create chats using configurable skills (e.g., cardiologist, nutritionist). Each skill shapes the AI's behavior as a domain expert. -- **Document Management** — upload health records, lab results, prescriptions, and consultation notes. AI extracts and indexes content for intelligent retrieval. -- **Proactive Notifications** — AI analyzes your health profile and schedules reminders (checkups, medication reviews) via in-app, email, or Telegram. -- **PDF Compilation** — request AI-generated health summaries as downloadable PDF documents. -- **Global Memory** — AI maintains a shared memory of critical health information across all your chats. +- **AI Chat with Specialists** — create chats using configurable skills (e.g., doctor, financial advisor, personal coach). Each skill shapes the AI's behavior as a domain expert. +- **Document Management** — upload documents (records, reports, contracts, notes, etc.). AI extracts and indexes content for intelligent retrieval. +- **Proactive Notifications** — AI analyzes your stored data and schedules reminders (deadlines, follow-ups, recurring events) via in-app, email, or Telegram. +- **PDF Compilation** — request AI-generated summaries and reports as downloadable PDF documents. +- **Global Memory** — AI maintains a shared memory of critical information across all your chats. - **Multi-language** — English and Russian support. ## Tech Stack diff --git a/backend/app/api/v1/pdf.py b/backend/app/api/v1/pdf.py index 9a68164..40653d1 100644 --- a/backend/app/api/v1/pdf.py +++ b/backend/app/api/v1/pdf.py @@ -21,7 +21,7 @@ async def compile_pdf( user: Annotated[User, Depends(get_current_user)], db: Annotated[AsyncSession, Depends(get_db)], ): - pdf = await pdf_service.generate_health_pdf( + pdf = await pdf_service.generate_pdf_report( db, user.id, data.title, data.document_ids or None, data.chat_id, ) return PdfResponse.model_validate(pdf) diff --git a/backend/app/main.py b/backend/app/main.py index 67f6b12..10550fb 100644 --- a/backend/app/main.py +++ b/backend/app/main.py @@ -32,7 +32,7 @@ async def lifespan(app: FastAPI): def create_app() -> FastAPI: app = FastAPI( title="AI Assistant API", - description="Personal AI health assistant with document management, chat, and notifications.", + description="Personal AI assistant with document management, chat, memory, and notifications.", version="0.1.0", lifespan=lifespan, docs_url="/api/docs" if settings.DOCS_ENABLED else None, @@ -41,8 +41,8 @@ def create_app() -> FastAPI: openapi_tags=[ {"name": "auth", "description": "Authentication and registration"}, {"name": "chats", "description": "AI chat conversations"}, - {"name": "documents", "description": "Health document management"}, - {"name": "memory", "description": "Health memory entries"}, + {"name": "documents", "description": "Document management"}, + {"name": "memory", "description": "Memory entries"}, {"name": "skills", "description": "AI specialist skills"}, {"name": "notifications", "description": "User notifications"}, {"name": "pdf", "description": "PDF report generation"}, diff --git a/backend/app/schemas/memory.py b/backend/app/schemas/memory.py index 8df5612..4fea985 100644 --- a/backend/app/schemas/memory.py +++ b/backend/app/schemas/memory.py @@ -4,7 +4,7 @@ from typing import Literal from pydantic import BaseModel, Field -CategoryType = Literal["condition", "medication", "allergy", "vital", "document_summary", "other"] +CategoryType = Literal["health", "finance", "personal", "work", "document_summary", "other"] ImportanceType = Literal["critical", "high", "medium", "low"] diff --git a/backend/app/services/ai_service.py b/backend/app/services/ai_service.py index 7d45cdd..bcb7659 100644 --- a/backend/app/services/ai_service.py +++ b/backend/app/services/ai_service.py @@ -24,13 +24,13 @@ client = AsyncAnthropic(api_key=settings.ANTHROPIC_API_KEY) AI_TOOLS = [ { "name": "save_memory", - "description": "Save important health information to the user's memory. Use this when the user shares critical health data like conditions, medications, allergies, or important health facts.", + "description": "Save important information to the user's memory. Use this when the user shares critical personal data, facts, preferences, or key details they want to remember across conversations.", "input_schema": { "type": "object", "properties": { "category": { "type": "string", - "enum": ["condition", "medication", "allergy", "vital", "document_summary", "other"], + "enum": ["health", "finance", "personal", "work", "document_summary", "other"], "description": "Category of the memory entry", }, "title": {"type": "string", "description": "Short title for the memory entry"}, @@ -46,7 +46,7 @@ AI_TOOLS = [ }, { "name": "search_documents", - "description": "Search the user's uploaded health documents for relevant information. Use this when you need to find specific health records, lab results, or consultation notes.", + "description": "Search the user's uploaded documents for relevant information. Use this when you need to find specific records, files, or notes the user has uploaded.", "input_schema": { "type": "object", "properties": { @@ -57,13 +57,13 @@ AI_TOOLS = [ }, { "name": "get_memory", - "description": "Retrieve the user's stored health memories filtered by category. Use this to recall previously saved health information.", + "description": "Retrieve the user's stored memories filtered by category. Use this to recall previously saved information.", "input_schema": { "type": "object", "properties": { "category": { "type": "string", - "enum": ["condition", "medication", "allergy", "vital", "document_summary", "other"], + "enum": ["health", "finance", "personal", "work", "document_summary", "other"], "description": "Optional category filter. Omit to get all memories.", }, }, @@ -94,7 +94,7 @@ AI_TOOLS = [ }, { "name": "generate_pdf", - "description": "Generate a PDF health report compilation from the user's data. Use this when the user asks for a document or summary of their health information.", + "description": "Generate a PDF report compilation from the user's data. Use this when the user asks for a document or summary of their stored information.", "input_schema": { "type": "object", "properties": { @@ -173,8 +173,8 @@ async def _execute_tool( }) elif tool_name == "generate_pdf": - from app.services.pdf_service import generate_health_pdf - pdf = await generate_health_pdf(db, user_id, title=tool_input["title"]) + from app.services.pdf_service import generate_pdf_report + pdf = await generate_pdf_report(db, user_id, title=tool_input["title"]) await db.commit() return json.dumps({ "status": "generated", @@ -213,7 +213,7 @@ async def assemble_context( memories = await get_critical_memories(db, user_id) if memories: memory_lines = [f"- [{m.category}] {m.title}: {m.content}" for m in memories] - system_parts.append(f"---\nUser Health Profile:\n" + "\n".join(memory_lines)) + system_parts.append(f"---\nUser Profile (Key Information):\n" + "\n".join(memory_lines)) # 5. Relevant document excerpts (based on user message keywords) if user_message.strip(): diff --git a/backend/app/services/context_service.py b/backend/app/services/context_service.py index e052370..bdd3f5d 100644 --- a/backend/app/services/context_service.py +++ b/backend/app/services/context_service.py @@ -5,14 +5,14 @@ from sqlalchemy.ext.asyncio import AsyncSession from app.models.context_file import ContextFile -DEFAULT_SYSTEM_PROMPT = """You are a personal AI health assistant. Your role is to: -- Help users understand their health data and medical documents -- Provide health-related recommendations based on uploaded information -- Schedule reminders for checkups, medications, and health-related activities -- Compile health summaries when requested -- Answer health questions clearly and compassionately +DEFAULT_SYSTEM_PROMPT = """You are a personal AI assistant helping users manage different areas of their life. Your role is to: +- Help users organize and understand their uploaded documents and data +- Provide recommendations and insights based on stored information +- Schedule reminders for important events, deadlines, and recurring activities +- Compile summaries and reports when requested +- Answer questions clearly and helpfully -Always be empathetic, accurate, and clear. When uncertain, recommend consulting a healthcare professional. +Always be empathetic, accurate, and clear. When uncertain about specialized topics, recommend consulting a relevant professional. You can communicate in English and Russian based on the user's preference.""" diff --git a/backend/app/services/pdf_service.py b/backend/app/services/pdf_service.py index e85d815..8b96176 100644 --- a/backend/app/services/pdf_service.py +++ b/backend/app/services/pdf_service.py @@ -19,7 +19,7 @@ jinja_env = Environment( ) -async def generate_health_pdf( +async def generate_pdf_report( db: AsyncSession, user_id: uuid.UUID, title: str, @@ -53,7 +53,7 @@ async def generate_health_pdf( }) # Render HTML - template = jinja_env.get_template("health_report.html") + template = jinja_env.get_template("report.html") html = template.render( title=title, user_name=user.full_name or user.username, diff --git a/backend/app/services/scheduler_service.py b/backend/app/services/scheduler_service.py index 5b0c9e4..ee04a5a 100644 --- a/backend/app/services/scheduler_service.py +++ b/backend/app/services/scheduler_service.py @@ -16,11 +16,11 @@ def start_scheduler(): replace_existing=True, ) - from app.workers.health_review import run_daily_health_review + from app.workers.health_review import run_daily_review scheduler.add_job( - run_daily_health_review, + run_daily_review, trigger=CronTrigger(hour=8, minute=0), - id="daily_health_review", + id="daily_review", replace_existing=True, ) diff --git a/backend/app/templates/pdf/health_report.html b/backend/app/templates/pdf/report.html similarity index 97% rename from backend/app/templates/pdf/health_report.html rename to backend/app/templates/pdf/report.html index b307288..2efe70a 100644 --- a/backend/app/templates/pdf/health_report.html +++ b/backend/app/templates/pdf/report.html @@ -26,13 +26,13 @@
Patient: {{ user_name }}
+Prepared for: {{ user_name }}
Generated: {{ generated_at }}