File size: 3,506 Bytes
8e36df7
d7ef02f
 
8e36df7
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
from fastapi import APIRouter, Depends, HTTPException, BackgroundTasks
from app.services.auth_service import get_current_user
from app.models.user import User
from app.models.task import Task
from app.services.llm_service import llm_service
from app.services.memory_service import memory_service
from typing import List
from datetime import datetime

router = APIRouter()

@router.post("/tasks/generate", response_model=List[Task])
async def generate_tasks(patient_id: str, num_messages: int = 20, current_user: User = Depends(get_current_user)):
    """
    Analyze recent chat history of the patient to generate caregiver tasks.
    """
    if current_user.role != "caregiver":
        raise HTTPException(status_code=403, detail="Only caregivers can generate tasks")
        
    # Fetch chat history from Qdrant session
    # Note: Assuming session_id matches patient_id or is retrieved via user lookup
    # For now, we'll try to get the 'latest' session or a specific session if provided.
    # Simplifying: We'll search session collection for this patient's ID if stored, 
    # OR we just rely on the frontend passing the session_id.
    
    # Since we don't have a direct 'get_chat_history(patient_id)' yet, we will mock this 
    # OR use the 'sessions' collection if we indexed it by patient_id.
    
    # improved approach: The chat endpoint stores sessions by session_id. 
    # We need a way to link patient -> session.
    # For this prototype, we will accept `history` in body OR just fetch the last known session from Qdrant if posssible.
    
    # FALLBACK: We will assume the Frontend sends the chat history for analysis 
    # OR we just use a dummy history for testing if not connected.
    
    # Let's try to fetch the session from Qdrant using the patient_id as key (if we used that).
    session_data = memory_service.get_session(patient_id) 
    history = session_data.get("history", [])
    
    if not history:
        return []

    tasks_data = llm_service.analyze_conversation_for_tasks(history[-num_messages:])
    
    created_tasks = []
    for t in tasks_data:
        task = Task(
            patient_id=patient_id,
            description=t.get("description"),
            source_message=t.get("source_message"),
            urgency=t.get("urgency", "medium").lower(),
            category=t.get("category", "other").lower(),
            status="pending"
        )
        await task.insert()
        created_tasks.append(task)
        
    return created_tasks

@router.get("/tasks", response_model=List[Task])
async def get_tasks(patient_id: str = None, current_user: User = Depends(get_current_user)):
    """Get all tasks for a patient (or all if admin)."""
    if patient_id:
        return await Task.find(Task.patient_id == patient_id).sort("-created_at").to_list()
    return await Task.find_all().sort("-created_at").to_list()

@router.patch("/tasks/{task_id}")
async def update_task_status(task_id: str, status: str, current_user: User = Depends(get_current_user)):
    task = await Task.get(task_id)
    if not task:
        raise HTTPException(status_code=404, detail="Task not found")
    
    task.status = status
    await task.save()
    return task

@router.delete("/tasks/{task_id}")
async def delete_task(task_id: str, current_user: User = Depends(get_current_user)):
    task = await Task.get(task_id)
    if not task:
        raise HTTPException(status_code=404, detail="Task not found")
    await task.delete()
    return {"status": "deleted"}