Skip to content

Commit e649a7d

Browse files
committed
feature: add average chat rating
1 parent 7fbf58d commit e649a7d

11 files changed

Lines changed: 261 additions & 55 deletions

File tree

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
import { useQuery } from "@tanstack/react-query";
2+
import { useTrieve } from "app/context/trieveContext";
3+
import { RAGAnalyticsFilter } from "trieve-ts-sdk";
4+
import { Granularity } from "trieve-ts-sdk";
5+
import { GraphComponent } from "../GraphComponent";
6+
import { chatAverageRatingQuery } from "app/queries/analytics/chat";
7+
8+
export const ChatAverageRating = ({
9+
filters,
10+
granularity,
11+
}: {
12+
filters: RAGAnalyticsFilter;
13+
granularity: Granularity;
14+
}) => {
15+
const { trieve } = useTrieve();
16+
const { data, isLoading } = useQuery(
17+
chatAverageRatingQuery(trieve, filters, granularity),
18+
);
19+
20+
return (
21+
<GraphComponent
22+
loading={isLoading}
23+
topLevelMetric={data?.avg_chat_rating}
24+
graphData={data?.points}
25+
granularity={granularity}
26+
date_range={filters.date_range}
27+
xAxis={"time_stamp"}
28+
yAxis={"point"}
29+
label="Average Chat Rating"
30+
tooltipContent="The average rating that users give to the chat."
31+
/>
32+
);
33+
};

clients/trieve-shopify-extension/app/queries/analytics/chat.ts

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import {
1010
SortOrder,
1111
RagQueryResponse,
1212
TopicQueriesResponse,
13+
ChatAverageRatingResponse,
1314
} from "trieve-ts-sdk";
1415

1516
export const topicsUsageQuery = (
@@ -91,4 +92,22 @@ export const allChatsQuery = (
9192
return result as TopicQueriesResponse;
9293
},
9394
} satisfies QueryOptions;
94-
};
95+
};
96+
97+
export const chatAverageRatingQuery = (
98+
trieve: TrieveSDK,
99+
filters: RAGAnalyticsFilter,
100+
granularity: Granularity,
101+
) => {
102+
return {
103+
queryKey: ["chatAverageRating", filters, granularity],
104+
queryFn: async () => {
105+
const result = await trieve.getRagAnalytics({
106+
filter: filters,
107+
type: "chat_average_rating",
108+
granularity: granularity,
109+
});
110+
return result as ChatAverageRatingResponse;
111+
},
112+
} satisfies QueryOptions;
113+
};

clients/trieve-shopify-extension/app/routes/app._dashboard.chat.tsx

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import { Grid, Tabs } from "@shopify/polaris";
22
import { AllChatsTable } from "app/components/analytics/chat/AllChatsTable";
3+
import { ChatAverageRating } from "app/components/analytics/chat/ChatAverageRating";
34
import { MessagesPerUser } from "app/components/analytics/chat/MessagesPerUser";
45
import { TopicCTRRate } from "app/components/analytics/chat/TopicCTRRate";
56
import { TopicsUsage } from "app/components/analytics/chat/TopicsGraph";
@@ -46,7 +47,10 @@ export default function ChatAnalyticsPage() {
4647
</div>
4748
</Grid.Cell>
4849
<Grid.Cell columnSpan={{ xs: 6, sm: 6, md: 6, lg: 6, xl: 6 }}>
49-
<TopicCTRRate filters={filters} granularity={granularity} />
50+
<div className="flex flex-col gap-4">
51+
<TopicCTRRate filters={filters} granularity={granularity} />
52+
<ChatAverageRating filters={filters} granularity={granularity} />
53+
</div>
5054
</Grid.Cell>
5155
</Grid>
5256
</>

clients/trieve-shopify-extension/app/routes/app._dashboard.recommendations.tsx

Lines changed: 20 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -46,26 +46,28 @@ export default function SearchAnalyticsPage() {
4646
/>
4747
<Grid>
4848
<Grid.Cell columnSpan={{ xs: 6, sm: 6, md: 6, lg: 6, xl: 6 }}>
49-
<RecommendationsUsageChart
50-
filters={filters}
51-
granularity={granularity}
52-
/>
53-
<div className="py-3"></div>
54-
<RecommendationsPerUser
55-
filters={filters}
56-
granularity={granularity}
57-
/>
49+
<div className="flex flex-col gap-4">
50+
<RecommendationsUsageChart
51+
filters={filters}
52+
granularity={granularity}
53+
/>
54+
<RecommendationsPerUser
55+
filters={filters}
56+
granularity={granularity}
57+
/>
58+
</div>
5859
</Grid.Cell>
5960
<Grid.Cell columnSpan={{ xs: 6, sm: 6, md: 6, lg: 6, xl: 6 }}>
60-
<RecommendationsCTRRate
61-
filters={filters}
62-
granularity={granularity}
63-
/>
64-
<div className="py-3"></div>
65-
<RecommendationConversionRate
66-
filters={filters}
67-
granularity={granularity}
68-
/>
61+
<div className="flex flex-col gap-4">
62+
<RecommendationsCTRRate
63+
filters={filters}
64+
granularity={granularity}
65+
/>
66+
<RecommendationConversionRate
67+
filters={filters}
68+
granularity={granularity}
69+
/>
70+
</div>
6971
</Grid.Cell>
7072
</Grid>
7173
</>

clients/trieve-shopify-extension/app/routes/app._dashboard.search.tsx

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -43,24 +43,24 @@ export default function SearchAnalyticsPage() {
4343
/>
4444
<Grid>
4545
<Grid.Cell columnSpan={{ xs: 6, sm: 6, md: 6, lg: 6, xl: 6 }}>
46-
<SearchUsageChart filters={filters} granularity={granularity} />
47-
<div className="py-3"></div>
48-
<SearchConversionRate
46+
<div className="flex flex-col gap-4">
47+
<SearchUsageChart filters={filters} granularity={granularity} />
48+
<SearchConversionRate
4949
filters={filters}
5050
granularity={granularity}
51-
/>
52-
<div className="py-3"></div>
53-
<NoResultQueriesTable filters={filters} />
51+
/>
52+
<NoResultQueriesTable filters={filters} />
53+
</div>
5454
</Grid.Cell>
5555
<Grid.Cell columnSpan={{ xs: 6, sm: 6, md: 6, lg: 6, xl: 6 }}>
56-
<SearchCTRChart filters={filters} granularity={granularity} />
57-
<div className="py-3"></div>
58-
<SearchesPerUser
56+
<div className="flex flex-col gap-4">
57+
<SearchCTRChart filters={filters} granularity={granularity} />
58+
<SearchesPerUser
5959
filters={filters}
6060
granularity={granularity}
61-
/>
62-
<div className="py-3"></div>
63-
<HeadQueriesTable filters={filters} />
61+
/>
62+
<HeadQueriesTable filters={filters} />
63+
</div>
6464
</Grid.Cell>
6565
</Grid>
6666
</>

clients/ts-sdk/openapi.json

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7790,6 +7790,25 @@
77907790
"recommendation"
77917791
]
77927792
},
7793+
"ChatAverageRatingResponse": {
7794+
"type": "object",
7795+
"required": [
7796+
"avg_chat_rating",
7797+
"points"
7798+
],
7799+
"properties": {
7800+
"avg_chat_rating": {
7801+
"type": "number",
7802+
"format": "double"
7803+
},
7804+
"points": {
7805+
"type": "array",
7806+
"items": {
7807+
"$ref": "#/components/schemas/FloatTimePoint"
7808+
}
7809+
}
7810+
}
7811+
},
77937812
"ChatMessageProxy": {
77947813
"type": "object",
77957814
"required": [
@@ -14504,6 +14523,36 @@
1450414523
]
1450514524
}
1450614525
}
14526+
},
14527+
{
14528+
"type": "object",
14529+
"required": [
14530+
"type"
14531+
],
14532+
"properties": {
14533+
"filter": {
14534+
"allOf": [
14535+
{
14536+
"$ref": "#/components/schemas/RAGAnalyticsFilter"
14537+
}
14538+
],
14539+
"nullable": true
14540+
},
14541+
"granularity": {
14542+
"allOf": [
14543+
{
14544+
"$ref": "#/components/schemas/Granularity"
14545+
}
14546+
],
14547+
"nullable": true
14548+
},
14549+
"type": {
14550+
"type": "string",
14551+
"enum": [
14552+
"chat_average_rating"
14553+
]
14554+
}
14555+
}
1450714556
}
1450814557
],
1450914558
"discriminator": {
@@ -14578,6 +14627,9 @@
1457814627
},
1457914628
{
1458014629
"$ref": "#/components/schemas/MessagesPerUserResponse"
14630+
},
14631+
{
14632+
"$ref": "#/components/schemas/ChatAverageRatingResponse"
1458114633
}
1458214634
]
1458314635
},

clients/ts-sdk/src/types.gen.ts

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -208,6 +208,11 @@ export type CTRSearchQueryWithoutClicksResponse = {
208208

209209
export type CTRType = 'search' | 'rag' | 'recommendation';
210210

211+
export type ChatAverageRatingResponse = {
212+
avg_chat_rating: number;
213+
points: Array<FloatTimePoint>;
214+
};
215+
211216
export type ChatMessageProxy = {
212217
content: string;
213218
role: RoleProxy;
@@ -2587,6 +2592,10 @@ export type RAGAnalytics = {
25872592
filter?: ((RAGAnalyticsFilter) | null);
25882593
granularity?: ((Granularity) | null);
25892594
type: 'messages_per_user';
2595+
} | {
2596+
filter?: ((RAGAnalyticsFilter) | null);
2597+
granularity?: ((Granularity) | null);
2598+
type: 'chat_average_rating';
25902599
};
25912600

25922601
export type type4 = 'rag_queries';
@@ -2599,7 +2608,7 @@ export type RAGAnalyticsFilter = {
25992608
rag_type?: ((RagTypes) | null);
26002609
};
26012610

2602-
export type RAGAnalyticsResponse = RagQueryResponse | RAGUsageResponse | RAGUsageGraphResponse | RagQueryEvent | RagQueryRatingsResponse | TopicQueriesResponse | TopicDetailsResponse | TopicsOverTimeResponse | CTRMetricsOverTimeResponse | MessagesPerUserResponse;
2611+
export type RAGAnalyticsResponse = RagQueryResponse | RAGUsageResponse | RAGUsageGraphResponse | RagQueryEvent | RagQueryRatingsResponse | TopicQueriesResponse | TopicDetailsResponse | TopicsOverTimeResponse | CTRMetricsOverTimeResponse | MessagesPerUserResponse | ChatAverageRatingResponse;
26032612

26042613
export type RAGSortBy = 'hallucination_score' | 'top_score' | 'created_at';
26052614

server/src/data/models.rs

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7308,6 +7308,11 @@ pub enum RAGAnalytics {
73087308
filter: Option<RAGAnalyticsFilter>,
73097309
granularity: Option<Granularity>,
73107310
},
7311+
#[serde(rename = "chat_average_rating")]
7312+
ChatAverageRating {
7313+
filter: Option<RAGAnalyticsFilter>,
7314+
granularity: Option<Granularity>,
7315+
},
73117316
}
73127317

73137318
#[derive(Debug, Serialize, Deserialize, ToSchema)]
@@ -7472,6 +7477,14 @@ pub enum RAGAnalyticsResponse {
74727477
CTRMetricsOverTime(CTRMetricsOverTimeResponse),
74737478
#[schema(title = "MessagesPerUser")]
74747479
MessagesPerUser(MessagesPerUserResponse),
7480+
#[schema(title = "ChatAverageRating")]
7481+
ChatAverageRating(ChatAverageRatingResponse),
7482+
}
7483+
7484+
#[derive(Debug, Row, Serialize, Deserialize, ToSchema)]
7485+
pub struct ChatAverageRatingResponse {
7486+
pub avg_chat_rating: f64,
7487+
pub points: Vec<FloatTimePoint>,
74757488
}
74767489

74777490
#[derive(Debug, Row, Serialize, Deserialize, ToSchema)]

server/src/handlers/analytics_handler.rs

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -500,6 +500,19 @@ pub async fn get_rag_analytics(
500500
.await?;
501501
RAGAnalyticsResponse::MessagesPerUser(messages_per_user)
502502
}
503+
RAGAnalytics::ChatAverageRating {
504+
filter,
505+
granularity,
506+
} => {
507+
let chat_average_rating = get_chat_average_rating_query(
508+
dataset_org_plan_sub.dataset.id,
509+
filter,
510+
granularity,
511+
clickhouse_client.get_ref(),
512+
)
513+
.await?;
514+
RAGAnalyticsResponse::ChatAverageRating(chat_average_rating)
515+
}
503516
};
504517

505518
Ok(HttpResponse::Ok().json(response))

server/src/lib.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -595,6 +595,7 @@ impl Modify for SecurityAddon {
595595
data::models::TopComponentsResponse,
596596
data::models::MessagesPerUserResponse,
597597
data::models::SearchesPerUserResponse,
598+
data::models::ChatAverageRatingResponse,
598599
errors::ErrorResponseBody,
599600
middleware::api_version::APIVersion,
600601
)

0 commit comments

Comments
 (0)