Files
bifrost/ui/lib/store/apis/mcpLogsApi.ts
Beyhan Oğur 880f412e2c first commit
2026-04-26 21:52:23 +03:00

189 lines
6.1 KiB
TypeScript

import {
MCPToolLogEntry,
MCPToolLogFilters,
MCPToolLogStats,
MCPToolLogFilterData,
MCPHistogramResponse,
MCPCostHistogramResponse,
MCPTopToolsResponse,
Pagination,
} from "@/lib/types/logs";
import { baseApi } from "./baseApi";
// Helper function to build MCP histogram filter params
function buildMCPFilterParams(filters: MCPToolLogFilters): Record<string, string | number> {
const params: Record<string, string | number> = {};
if (filters.tool_names && filters.tool_names.length > 0) {
params.tool_names = filters.tool_names.join(",");
}
if (filters.server_labels && filters.server_labels.length > 0) {
params.server_labels = filters.server_labels.join(",");
}
if (filters.status && filters.status.length > 0) {
params.status = filters.status.join(",");
}
if (filters.virtual_key_ids && filters.virtual_key_ids.length > 0) {
params.virtual_key_ids = filters.virtual_key_ids.join(",");
}
if (filters.llm_request_ids && filters.llm_request_ids.length > 0) {
params.llm_request_ids = filters.llm_request_ids.join(",");
}
if (filters.start_time) params.start_time = filters.start_time;
if (filters.end_time) params.end_time = filters.end_time;
if (filters.min_latency !== undefined) params.min_latency = filters.min_latency;
if (filters.max_latency !== undefined) params.max_latency = filters.max_latency;
if (filters.content_search) params.content_search = filters.content_search;
return params;
}
export const mcpLogsApi = baseApi.injectEndpoints({
endpoints: (builder) => ({
// Get MCP tool logs with filters and pagination
getMCPLogs: builder.query<
{
logs: MCPToolLogEntry[];
pagination: Pagination;
stats: MCPToolLogStats;
has_logs: boolean;
},
{
filters: MCPToolLogFilters;
pagination: Pagination;
}
>({
query: ({ filters, pagination }) => {
const params: Record<string, string | number> = {
limit: pagination.limit,
offset: pagination.offset,
sort_by: pagination.sort_by,
order: pagination.order,
};
// Add filters to params if they exist
if (filters.tool_names && filters.tool_names.length > 0) {
params.tool_names = filters.tool_names.join(",");
}
if (filters.server_labels && filters.server_labels.length > 0) {
params.server_labels = filters.server_labels.join(",");
}
if (filters.status && filters.status.length > 0) {
params.status = filters.status.join(",");
}
if (filters.virtual_key_ids && filters.virtual_key_ids.length > 0) {
params.virtual_key_ids = filters.virtual_key_ids.join(",");
}
if (filters.llm_request_ids && filters.llm_request_ids.length > 0) {
params.llm_request_ids = filters.llm_request_ids.join(",");
}
if (filters.start_time) params.start_time = filters.start_time;
if (filters.end_time) params.end_time = filters.end_time;
if (filters.min_latency) params.min_latency = filters.min_latency;
if (filters.max_latency) params.max_latency = filters.max_latency;
if (filters.content_search) params.content_search = filters.content_search;
return {
url: "/mcp-logs",
params,
};
},
providesTags: ["MCPLogs"],
}),
// Get MCP tool logs statistics with filters
getMCPLogsStats: builder.query<
MCPToolLogStats,
{
filters: MCPToolLogFilters;
}
>({
query: ({ filters }) => {
const params: Record<string, string | number> = {};
// Add filters to params if they exist
if (filters.tool_names && filters.tool_names.length > 0) {
params.tool_names = filters.tool_names.join(",");
}
if (filters.server_labels && filters.server_labels.length > 0) {
params.server_labels = filters.server_labels.join(",");
}
if (filters.status && filters.status.length > 0) {
params.status = filters.status.join(",");
}
if (filters.virtual_key_ids && filters.virtual_key_ids.length > 0) {
params.virtual_key_ids = filters.virtual_key_ids.join(",");
}
if (filters.llm_request_ids && filters.llm_request_ids.length > 0) {
params.llm_request_ids = filters.llm_request_ids.join(",");
}
if (filters.start_time) params.start_time = filters.start_time;
if (filters.end_time) params.end_time = filters.end_time;
if (filters.min_latency) params.min_latency = filters.min_latency;
if (filters.max_latency) params.max_latency = filters.max_latency;
if (filters.content_search) params.content_search = filters.content_search;
return {
url: "/mcp-logs/stats",
params,
};
},
providesTags: ["MCPLogs"],
}),
// Get available filter data (tool names, server labels)
getMCPAvailableFilterData: builder.query<MCPToolLogFilterData, void>({
query: () => "/mcp-logs/filterdata",
providesTags: ["MCPLogs"],
}),
// Get MCP tool call volume histogram
getMCPHistogram: builder.query<MCPHistogramResponse, { filters: MCPToolLogFilters }>({
query: ({ filters }) => ({
url: "/mcp-logs/histogram",
params: buildMCPFilterParams(filters),
}),
providesTags: ["MCPLogs"],
}),
// Get MCP cost histogram
getMCPCostHistogram: builder.query<MCPCostHistogramResponse, { filters: MCPToolLogFilters }>({
query: ({ filters }) => ({
url: "/mcp-logs/histogram/cost",
params: buildMCPFilterParams(filters),
}),
providesTags: ["MCPLogs"],
}),
// Get top MCP tools by call count
getMCPTopTools: builder.query<MCPTopToolsResponse, { filters: MCPToolLogFilters }>({
query: ({ filters }) => ({
url: "/mcp-logs/histogram/top-tools",
params: buildMCPFilterParams(filters),
}),
providesTags: ["MCPLogs"],
}),
// Delete MCP tool logs by their IDs
deleteMCPLogs: builder.mutation<void, { ids: string[] }>({
query: ({ ids }) => ({
url: "/mcp-logs",
method: "DELETE",
body: { ids },
}),
invalidatesTags: ["MCPLogs"],
}),
}),
});
export const {
useGetMCPLogsQuery,
useGetMCPLogsStatsQuery,
useGetMCPAvailableFilterDataQuery,
useGetMCPAvailableFilterDataQuery: useGetMCPLogsFilterDataQuery,
useLazyGetMCPLogsQuery,
useLazyGetMCPLogsStatsQuery,
useLazyGetMCPAvailableFilterDataQuery,
useLazyGetMCPHistogramQuery,
useLazyGetMCPCostHistogramQuery,
useLazyGetMCPTopToolsQuery,
useDeleteMCPLogsMutation,
} = mcpLogsApi;