返回 JoyAI-Echo
events.py
1 """Event types for the message bus."""
2
3 from dataclasses import dataclass, field
4 from datetime import datetime
5 from typing import Any
6
7
8 @dataclass
9 class InboundMessage:
10 """Message received from a chat channel."""
11
12 channel: str # telegram, discord, slack, whatsapp
13 sender_id: str # User identifier
14 chat_id: str # Chat/channel identifier
15 content: str # Message text
16 timestamp: datetime = field(default_factory=datetime.now)
17 media: list[str] = field(default_factory=list) # Media URLs
18 metadata: dict[str, Any] = field(default_factory=dict) # Channel-specific data
19 session_key_override: str | None = None # Optional override for thread-scoped sessions
20
21 @property
22 def session_key(self) -> str:
23 """Unique key for session identification."""
24 return self.session_key_override or f"{self.channel}:{self.chat_id}"
25
26
27 @dataclass
28 class OutboundMessage:
29 """Message to send to a chat channel."""
30
31 channel: str
32 chat_id: str
33 content: str
34 reply_to: str | None = None
35 media: list[str] = field(default_factory=list)
36 metadata: dict[str, Any] = field(default_factory=dict)
37 buttons: list[list[str]] = field(default_factory=list)
38
39
40 @dataclass
41 class RuntimeEvent:
42 """Internal runtime event that should not be projected into the LLM prompt."""
43
44 kind: str
45 source: str
46 timestamp: datetime = field(default_factory=datetime.now)
47 session_key: str | None = None
48 channel: str | None = None
49 chat_id: str | None = None
50 payload: dict[str, Any] = field(default_factory=dict)
51
51 lines PYTHON