diff --git a/web/components/templates/dashboard/useDashboardPage.tsx b/web/components/templates/dashboard/useDashboardPage.tsx index 067a9cbf5a..cad9ba739e 100644 --- a/web/components/templates/dashboard/useDashboardPage.tsx +++ b/web/components/templates/dashboard/useDashboardPage.tsx @@ -87,7 +87,12 @@ export const useDashboardPage = ({ DASHBOARD_PAGE_TABLE_FILTERS as SingleFilterDef[] ).concat(propertyFilters); - const { isLoading: isModelsLoading, models } = useModels(timeFilter, 1000); + const userFilters = filterUIToFilterLeafs(filterMap, uiFilters); + const { isLoading: isModelsLoading, models } = useModels( + timeFilter, + 1000, + userFilters + ); const topModels = models?.data ?.sort((a, b) => (a.total_requests > b.total_requests ? -1 : 1)) @@ -114,8 +119,6 @@ export const useDashboardPage = ({ }; } - const userFilters = filterUIToFilterLeafs(filterMap, uiFilters); - const params: BackendMetricsCall["params"] = { timeFilter, userFilters, diff --git a/web/services/hooks/models.tsx b/web/services/hooks/models.tsx index dc00eacd78..ea4e9a254d 100644 --- a/web/services/hooks/models.tsx +++ b/web/services/hooks/models.tsx @@ -2,10 +2,15 @@ import { useQuery } from "@tanstack/react-query"; import { TimeFilter } from "../../components/templates/dashboard/dashboardPage"; import { Result } from "../../lib/result"; import { ModelMetric } from "../../lib/api/models/models"; +import { FilterLeaf, filterListToTree } from "../lib/filters/filterDefs"; -const useModels = (timeFilter: TimeFilter, limit: number) => { +const useModels = ( + timeFilter: TimeFilter, + limit: number, + userFilters?: FilterLeaf[] +) => { const { data: models, isLoading } = useQuery({ - queryKey: ["modelMetrics", timeFilter], + queryKey: ["modelMetrics", timeFilter, userFilters], queryFn: async (query) => { return await fetch("/api/models", { method: "POST", @@ -13,7 +18,7 @@ const useModels = (timeFilter: TimeFilter, limit: number) => { "Content-Type": "application/json", }, body: JSON.stringify({ - filter: "all", + filter: userFilters ? filterListToTree(userFilters, "and") : "all", offset: 0, limit, timeFilter, diff --git a/web/services/lib/filters/filters.ts b/web/services/lib/filters/filters.ts index ec44b8d6e6..db563fc8b5 100644 --- a/web/services/lib/filters/filters.ts +++ b/web/services/lib/filters/filters.ts @@ -235,7 +235,42 @@ const havingKeyMappings: KeyMappings = { response: NOT_IMPLEMENTED, properties_table: NOT_IMPLEMENTED, request_response_log: NOT_IMPLEMENTED, - request_response_versioned: NOT_IMPLEMENTED, + request_response_versioned: (filter, placeValueSafely) => { + if ("properties" in filter && filter.properties) { + const key = Object.keys(filter.properties)[0]; + const { operator, value } = extractOperatorAndValueFromAnOperator( + filter.properties[key as keyof typeof filter.properties] + ); + return { + column: `properties[${placeValueSafely(key)}]`, + operator: operator, + value: placeValueSafely(value), + }; + } + if ("search_properties" in filter && filter.search_properties) { + const key = Object.keys(filter.search_properties)[0]; + const { operator, value } = extractOperatorAndValueFromAnOperator( + filter.search_properties[key as keyof typeof filter.search_properties] + ); + return { + column: `key`, + operator: operator, + value: placeValueSafely(value), + }; + } + return easyKeyMappings<"request_response_versioned">({ + latency: "request_response_versioned.latency", + status: "request_response_versioned.status", + request_created_at: "request_response_versioned.request_created_at", + response_created_at: "request_response_versioned.response_created_at", + model: "request_response_versioned.model", + user_id: "request_response_versioned.user_id", + organization_id: "request_response_versioned.organization_id", + node_id: "request_response_versioned.node_id", + job_id: "request_response_versioned.job_id", + threat: "request_response_versioned.threat", + })(filter, placeValueSafely); + }, properties_v3: NOT_IMPLEMENTED, property_with_response_v1: NOT_IMPLEMENTED, feedback: NOT_IMPLEMENTED,