This commit is contained in:
@@ -7,6 +7,7 @@ import type {
|
||||
AnalyticsOverviewDto,
|
||||
LeagueTierDto,
|
||||
LeagueTierStatsDto,
|
||||
ModelPerformanceDto,
|
||||
RetrainStatusDto,
|
||||
SettingDto,
|
||||
UpdateLeagueTierDto,
|
||||
@@ -30,6 +31,16 @@ const getAnalyticsOverview = () => {
|
||||
});
|
||||
};
|
||||
|
||||
// Model Performance (forward-test)
|
||||
const getModelPerformance = (days?: number) => {
|
||||
return apiRequest<ApiResponse<ModelPerformanceDto>>({
|
||||
url: "/admin/model-performance",
|
||||
client: "admin",
|
||||
method: "get",
|
||||
params: days ? { days: String(days) } : undefined,
|
||||
});
|
||||
};
|
||||
|
||||
// Settings
|
||||
const getAllSettings = () => {
|
||||
return apiRequest<ApiResponse<Record<string, string>>>({
|
||||
@@ -204,6 +215,7 @@ const getRetrainStatus = () => {
|
||||
|
||||
export const adminService = {
|
||||
getAnalyticsOverview,
|
||||
getModelPerformance,
|
||||
getAllSettings,
|
||||
updateSetting,
|
||||
getAllUsageLimits,
|
||||
|
||||
@@ -134,3 +134,30 @@ export interface AnalyticsOverviewDto {
|
||||
aiHealth?: Record<string, unknown>;
|
||||
[key: string]: unknown;
|
||||
}
|
||||
|
||||
// ========================
|
||||
// Model Performance (Forward-Test)
|
||||
// ========================
|
||||
|
||||
export interface ModelPerformanceMarketDto {
|
||||
market: string;
|
||||
samples: number;
|
||||
shown_pct: number;
|
||||
actual_pct: number;
|
||||
gap: number;
|
||||
ece: number;
|
||||
calibration: "good" | "overconfident" | "underconfident";
|
||||
bet_count: number;
|
||||
bet_hit_pct: number;
|
||||
bet_roi_pct: number;
|
||||
actions: Record<string, number>;
|
||||
tiers: Record<string, number>;
|
||||
}
|
||||
|
||||
export interface ModelPerformanceDto {
|
||||
window_days: number;
|
||||
settled_runs: number;
|
||||
settled_markets: number;
|
||||
generated_at: string;
|
||||
markets: ModelPerformanceMarketDto[];
|
||||
}
|
||||
|
||||
@@ -12,6 +12,8 @@ import type {
|
||||
export const AdminQueryKeys = {
|
||||
all: ["admin"] as const,
|
||||
analytics: () => [...AdminQueryKeys.all, "analytics"] as const,
|
||||
modelPerformance: (days?: number) =>
|
||||
[...AdminQueryKeys.all, "modelPerformance", days] as const,
|
||||
settings: () => [...AdminQueryKeys.all, "settings"] as const,
|
||||
usageLimits: (params?: AdminPaginationParams) =>
|
||||
[...AdminQueryKeys.all, "usageLimits", params] as const,
|
||||
@@ -32,6 +34,15 @@ export const useAdminAnalytics = (enabled = true) => {
|
||||
});
|
||||
};
|
||||
|
||||
// Model Performance (forward-test)
|
||||
export const useModelPerformance = (days = 90, enabled = true) => {
|
||||
return useQuery({
|
||||
queryKey: AdminQueryKeys.modelPerformance(days),
|
||||
queryFn: () => adminService.getModelPerformance(days),
|
||||
enabled,
|
||||
});
|
||||
};
|
||||
|
||||
// Settings
|
||||
export const useAdminSettings = () => {
|
||||
return useQuery({
|
||||
|
||||
@@ -13,6 +13,13 @@ export interface MatchInfoDto {
|
||||
match_date_ms: number;
|
||||
league_id?: string | null;
|
||||
is_top_league?: boolean;
|
||||
// Backtest-derived per-league confidence (ROI + sample size). null = too little data.
|
||||
league_confidence?: {
|
||||
label: "high" | "medium" | "low";
|
||||
bet_roi: number;
|
||||
bet_n: number;
|
||||
hit: number;
|
||||
} | null;
|
||||
sport?: SportType;
|
||||
// Live snapshot — set when the match is in play (used to detect stale predictions)
|
||||
status?: string | null;
|
||||
|
||||
Reference in New Issue
Block a user