Skip to content

Commit 9a8b5bb

Browse files
Message Tracking Improvements (#191)
* message init * log message summary * deletion by * improvements logging summaries * primary key id * cascade org delete * PR comments
1 parent 2a506ef commit 9a8b5bb

File tree

6 files changed

+138
-0
lines changed

6 files changed

+138
-0
lines changed
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
from datetime import date
2+
from submodules.model.business_objects import general
3+
from submodules.model.models import AdminQueryMessageSummary
4+
from ..session import session
5+
6+
7+
def get_admin_query_message_summary(
8+
org_id: str,
9+
project_id: str,
10+
day: date,
11+
) -> AdminQueryMessageSummary | None:
12+
return (
13+
session.query(AdminQueryMessageSummary)
14+
.filter(
15+
AdminQueryMessageSummary.organization_id == org_id,
16+
AdminQueryMessageSummary.project_id == project_id,
17+
AdminQueryMessageSummary.day == day,
18+
)
19+
.first()
20+
)
21+
22+
23+
def log_admin_query_message_summary(
24+
org_id: str,
25+
project_id: str,
26+
day: date,
27+
counters: dict, # {"total_messages": 5, "messages_via_api": 2, ....},
28+
with_commit: bool = True,
29+
):
30+
31+
message_summary = get_admin_query_message_summary(org_id, project_id, day)
32+
33+
if message_summary:
34+
for col, value in counters.items():
35+
if not hasattr(message_summary, col):
36+
continue
37+
current_value = getattr(message_summary, col, 0) or 0
38+
setattr(message_summary, col, current_value + value)
39+
else:
40+
message_summary = AdminQueryMessageSummary(
41+
organization_id=org_id, project_id=project_id, day=day
42+
)
43+
for col, value in counters.items():
44+
if hasattr(message_summary, col):
45+
setattr(message_summary, col, value)
46+
general.add(message_summary, with_commit)
47+
return message_summary
48+
49+
if with_commit:
50+
general.flush_or_commit(True)
51+
return message_summary

cognition_objects/conversation.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -364,13 +364,15 @@ def add_message(
364364
conversation_id: str,
365365
user_id: str,
366366
question: str,
367+
initiated_via: str,
367368
with_commit: bool = True,
368369
) -> CognitionConversation:
369370
message_entity = message.create(
370371
conversation_id=conversation_id,
371372
project_id=project_id,
372373
user_id=user_id,
373374
question=question,
375+
initiated_via=initiated_via,
374376
with_commit=with_commit,
375377
)
376378

cognition_objects/message.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -273,6 +273,7 @@ def create(
273273
project_id: str,
274274
user_id: str,
275275
question: str,
276+
initiated_via: str,
276277
with_commit: bool = True,
277278
created_at: Optional[datetime] = None,
278279
) -> CognitionMessage:
@@ -288,6 +289,7 @@ def create(
288289
question=question,
289290
facts=[],
290291
version_id=version_id,
292+
initiated_via=initiated_via,
291293
)
292294

293295
general.add(message, with_commit)
@@ -532,3 +534,13 @@ def update_version_id_for_messages(
532534
)
533535
if with_commit:
534536
general.commit()
537+
538+
539+
def get_count_by_project_id(project_id: str) -> int:
540+
return (
541+
session.query(CognitionMessage)
542+
.filter(
543+
CognitionMessage.project_id == project_id,
544+
)
545+
.count()
546+
)

enums.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -175,6 +175,7 @@ class Tablenames(Enum):
175175
"conversation_tag_association" # association between conversation and tags
176176
)
177177
SUMS_TABLE = "sums_table"
178+
ADMIN_QUERY_MESSAGE_SUMMARY = "admin_query_message_summary"
178179

179180
def snake_case_to_pascal_case(self):
180181
# the type name (written in PascalCase) of a table is needed to create backrefs
@@ -955,3 +956,9 @@ class SharepointPropertySyncState(Enum):
955956
RUNNING = "RUNNING"
956957
COMPLETED = "COMPLETED"
957958
FAILED = "FAILED"
959+
960+
961+
class MessageInitiationType(Enum):
962+
UI = "UI"
963+
API = "API"
964+
MACRO = "MACRO"

listeners.py

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
from sqlalchemy import event
2+
from datetime import datetime, timezone
3+
from submodules.model.models import CognitionConversation, CognitionMessage
4+
from submodules.model.session_wrapper import with_session
5+
import traceback
6+
7+
from src.controller.admin_query_message_summary import (
8+
manager as admin_query_message_summary_manager,
9+
)
10+
11+
12+
@event.listens_for(CognitionConversation, "after_insert")
13+
@with_session()
14+
def after_insert(mapper, connection, conversation_entity: CognitionConversation):
15+
try:
16+
admin_query_message_summary_manager.log_conversation_summary(
17+
conversation_entity, 1
18+
)
19+
except Exception:
20+
print("Error in after_insert listener of CognitionConversation", flush=True)
21+
print(traceback.format_exc(), flush=True)
22+
23+
24+
@event.listens_for(CognitionMessage, "after_insert")
25+
@with_session()
26+
def after_insert(mapper, connection, message_entity: CognitionMessage):
27+
try:
28+
admin_query_message_summary_manager.log_message_summary(message_entity)
29+
except Exception:
30+
print("Error in after_insert listener of CognitionMessage", flush=True)
31+
print(traceback.format_exc(), flush=True)

models.py

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1286,6 +1286,7 @@ class CognitionMessage(Base):
12861286
),
12871287
index=True,
12881288
)
1289+
initiated_via = Column(String) # of type enums.MessageInitiationType.*.value
12891290

12901291

12911292
class CognitionPipelineLogs(Base):
@@ -2453,3 +2454,37 @@ class SumsTable(Base):
24532454
sum_key = Column(String, index=True) # e.g. enums.AdminQueries
24542455
created_at = Column(DateTime, default=sql.func.now())
24552456
data = Column(JSON)
2457+
2458+
2459+
class AdminQueryMessageSummary(Base):
2460+
__tablename__ = Tablenames.ADMIN_QUERY_MESSAGE_SUMMARY.value
2461+
__table_args__ = (
2462+
UniqueConstraint(
2463+
"organization_id",
2464+
"project_id",
2465+
"day",
2466+
name="unique_admin_query_msg_activity_summary",
2467+
),
2468+
{"schema": "cognition"},
2469+
)
2470+
id = Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4)
2471+
day = Column(Date, nullable=False)
2472+
organization_id = Column(
2473+
UUID(as_uuid=True),
2474+
ForeignKey(f"{Tablenames.ORGANIZATION.value}.id", ondelete="CASCADE"),
2475+
)
2476+
project_id = Column(
2477+
UUID(as_uuid=True),
2478+
ForeignKey(f"cognition.{Tablenames.PROJECT.value}.id", ondelete="SET NULL"),
2479+
)
2480+
2481+
total_conversations = Column(Integer, default=0)
2482+
total_messages = Column(Integer, default=0)
2483+
messages_via_api = Column(Integer, default=0)
2484+
messages_via_ui = Column(Integer, default=0)
2485+
messages_via_macro = Column(Integer, default=0)
2486+
confidential_messages = Column(Integer, default=0)
2487+
kern_user_messages = Column(Integer, default=0)
2488+
deleted_messages_by_user = Column(Integer, default=0)
2489+
deleted_messages_by_system = Column(Integer, default=0)
2490+
incognito_messages = Column(Integer, default=0)

0 commit comments

Comments
 (0)