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;