File size: 2,853 Bytes
ce673e5
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
"""
Chat Session Models for OpenTriage Mentorship.
"""
from pydantic import BaseModel, Field
from typing import Optional, List
from datetime import datetime, timezone
from enum import Enum
import uuid


class SessionType(str, Enum):
    ONE_ON_ONE = "one_on_one"
    GROUP = "group"
    ISSUE_HELP = "issue_help"


class SessionStatus(str, Enum):
    ACTIVE = "active"
    PAUSED = "paused"
    COMPLETED = "completed"
    CANCELLED = "cancelled"


class ChatSession(BaseModel):
    """A mentorship chat session."""
    id: str = Field(default_factory=lambda: str(uuid.uuid4()))
    
    # Participants
    mentor_id: str
    mentor_username: str
    mentee_ids: List[str] = []  # Can have multiple for group sessions
    mentee_usernames: List[str] = []
    
    # Type and context
    session_type: SessionType = SessionType.ONE_ON_ONE
    issue_id: Optional[str] = None
    repo_name: Optional[str] = None
    topic: Optional[str] = None
    
    # Status
    status: SessionStatus = SessionStatus.ACTIVE
    
    # Timestamps
    started_at: datetime = Field(default_factory=lambda: datetime.now(timezone.utc))
    ended_at: Optional[datetime] = None
    last_activity_at: datetime = Field(default_factory=lambda: datetime.now(timezone.utc))
    
    # Summary (AI-generated)
    summary: Optional[str] = None
    key_points: List[str] = []
    resources_shared: List[str] = []  # Resource IDs
    
    # Stats
    message_count: int = 0
    duration_minutes: int = 0


class ChatMessage(BaseModel):
    """A message in a chat session."""
    id: str = Field(default_factory=lambda: str(uuid.uuid4()))
    session_id: str
    
    # Sender
    sender_id: str
    sender_username: str
    is_mentor: bool = False
    
    # Content
    content: str
    message_type: str = "text"  # text, code, link, file
    
    # Metadata
    language: Optional[str] = None  # For code blocks
    attachments: List[str] = []
    
    # Reactions
    reactions: dict = {}  # {emoji: [user_ids]}
    
    # AI features
    is_ai_generated: bool = False
    contains_resource: bool = False
    extracted_resource_id: Optional[str] = None
    
    timestamp: datetime = Field(default_factory=lambda: datetime.now(timezone.utc))
    edited_at: Optional[datetime] = None


class SessionSummary(BaseModel):
    """AI-generated summary of a chat session."""
    session_id: str
    
    # Summary content
    overview: str
    topics_discussed: List[str] = []
    key_takeaways: List[str] = []
    action_items: List[str] = []
    
    # Resources
    resources_shared: List[str] = []
    code_snippets_count: int = 0
    links_shared: int = 0
    
    # Metrics
    total_messages: int = 0
    mentor_messages: int = 0
    mentee_messages: int = 0
    duration_minutes: int = 0
    
    generated_at: datetime = Field(default_factory=lambda: datetime.now(timezone.utc))