From 4218814385a01643ad0edcc5479f445a07009597 Mon Sep 17 00:00:00 2001
From: Chris Weaver <25087905+Weves@users.noreply.github.com>
Date: Wed, 18 Sep 2024 07:23:56 -0700
Subject: [PATCH] Add flow to query history CSV (#2492)
---
backend/danswer/configs/constants.py | 6 +++++
.../ee/danswer/server/query_history/api.py | 22 +++++++++++++++++++
.../performance/query-history/[id]/page.tsx | 3 ++-
.../app/ee/admin/performance/usage/types.ts | 4 +++-
web/src/lib/types.ts | 1 +
5 files changed, 34 insertions(+), 2 deletions(-)
diff --git a/backend/danswer/configs/constants.py b/backend/danswer/configs/constants.py
index e807f381e877..7a7ca77baa08 100644
--- a/backend/danswer/configs/constants.py
+++ b/backend/danswer/configs/constants.py
@@ -133,6 +133,12 @@ class AuthType(str, Enum):
SAML = "saml"
+class SessionType(str, Enum):
+ CHAT = "Chat"
+ SEARCH = "Search"
+ SLACK = "Slack"
+
+
class QAFeedbackType(str, Enum):
LIKE = "like" # User likes the answer, used for metrics
DISLIKE = "dislike" # User dislikes the answer, used for metrics
diff --git a/backend/ee/danswer/server/query_history/api.py b/backend/ee/danswer/server/query_history/api.py
index dbdf3d8bc406..3fc0a98153a6 100644
--- a/backend/ee/danswer/server/query_history/api.py
+++ b/backend/ee/danswer/server/query_history/api.py
@@ -17,6 +17,7 @@ from danswer.auth.users import get_display_email
from danswer.chat.chat_utils import create_chat_chain
from danswer.configs.constants import MessageType
from danswer.configs.constants import QAFeedbackType
+from danswer.configs.constants import SessionType
from danswer.db.chat import get_chat_session_by_id
from danswer.db.engine import get_session
from danswer.db.models import ChatMessage
@@ -90,6 +91,7 @@ class ChatSessionMinimal(BaseModel):
persona_name: str | None
time_created: datetime
feedback_type: QAFeedbackType | Literal["mixed"] | None
+ flow_type: SessionType
class ChatSessionSnapshot(BaseModel):
@@ -99,6 +101,7 @@ class ChatSessionSnapshot(BaseModel):
messages: list[MessageSnapshot]
persona_name: str | None
time_created: datetime
+ flow_type: SessionType
class QuestionAnswerPairSnapshot(BaseModel):
@@ -114,6 +117,7 @@ class QuestionAnswerPairSnapshot(BaseModel):
persona_name: str | None
user_email: str
time_created: datetime
+ flow_type: SessionType
@classmethod
def from_chat_session_snapshot(
@@ -141,6 +145,7 @@ class QuestionAnswerPairSnapshot(BaseModel):
persona_name=chat_session_snapshot.persona_name,
user_email=get_display_email(chat_session_snapshot.user_email),
time_created=user_message.time_created,
+ flow_type=chat_session_snapshot.flow_type,
)
for ind, (user_message, ai_message) in enumerate(message_pairs)
]
@@ -162,9 +167,20 @@ class QuestionAnswerPairSnapshot(BaseModel):
"persona_name": self.persona_name,
"user_email": self.user_email,
"time_created": str(self.time_created),
+ "flow_type": self.flow_type,
}
+def determine_flow_type(chat_session: ChatSession) -> SessionType:
+ return (
+ SessionType.SLACK
+ if chat_session.danswerbot_flow
+ else SessionType.SEARCH
+ if chat_session.one_shot
+ else SessionType.CHAT
+ )
+
+
def fetch_and_process_chat_session_history_minimal(
db_session: Session,
start: datetime,
@@ -226,6 +242,8 @@ def fetch_and_process_chat_session_history_minimal(
if feedback_filter == QAFeedbackType.DISLIKE and not has_negative_feedback:
continue
+ flow_type = determine_flow_type(chat_session)
+
minimal_sessions.append(
ChatSessionMinimal(
id=chat_session.id,
@@ -240,6 +258,7 @@ def fetch_and_process_chat_session_history_minimal(
else None,
time_created=chat_session.time_created,
feedback_type=feedback_type,
+ flow_type=flow_type,
)
)
@@ -291,6 +310,8 @@ def snapshot_from_chat_session(
except RuntimeError:
return None
+ flow_type = determine_flow_type(chat_session)
+
return ChatSessionSnapshot(
id=chat_session.id,
user_email=get_display_email(
@@ -304,6 +325,7 @@ def snapshot_from_chat_session(
],
persona_name=chat_session.persona.name if chat_session.persona else None,
time_created=chat_session.time_created,
+ flow_type=flow_type,
)
diff --git a/web/src/app/ee/admin/performance/query-history/[id]/page.tsx b/web/src/app/ee/admin/performance/query-history/[id]/page.tsx
index 044030f5c1a5..cdbde57a3fcc 100644
--- a/web/src/app/ee/admin/performance/query-history/[id]/page.tsx
+++ b/web/src/app/ee/admin/performance/query-history/[id]/page.tsx
@@ -85,7 +85,8 @@ export default function QueryPage({ params }: { params: { id: string } }) {
{chatSessionSnapshot.user_email || "-"},{" "}
- {timestampToReadableDate(chatSessionSnapshot.time_created)}
+ {timestampToReadableDate(chatSessionSnapshot.time_created)},{" "}
+ {chatSessionSnapshot.flow_type}
diff --git a/web/src/app/ee/admin/performance/usage/types.ts b/web/src/app/ee/admin/performance/usage/types.ts
index 73c6323f4619..3805d2c5c97f 100644
--- a/web/src/app/ee/admin/performance/usage/types.ts
+++ b/web/src/app/ee/admin/performance/usage/types.ts
@@ -1,4 +1,4 @@
-import { Feedback } from "@/lib/types";
+import { Feedback, SessionType } from "@/lib/types";
export interface QueryAnalytics {
total_queries: number;
@@ -40,6 +40,7 @@ export interface ChatSessionSnapshot {
messages: MessageSnapshot[];
persona_name: string | null;
time_created: string;
+ flow_type: SessionType;
}
export interface ChatSessionMinimal {
@@ -51,6 +52,7 @@ export interface ChatSessionMinimal {
persona_name: string | null;
time_created: string;
feedback_type: Feedback | "mixed" | null;
+ flow_type: SessionType;
}
export interface UsageReport {
diff --git a/web/src/lib/types.ts b/web/src/lib/types.ts
index 612e8f2ee672..936e4e6c84cb 100644
--- a/web/src/lib/types.ts
+++ b/web/src/lib/types.ts
@@ -49,6 +49,7 @@ export type ValidStatuses =
| "not_started";
export type TaskStatus = "PENDING" | "STARTED" | "SUCCESS" | "FAILURE";
export type Feedback = "like" | "dislike";
+export type SessionType = "Chat" | "Search" | "Slack";
export interface DocumentBoostStatus {
document_id: string;