import { useState } from "react"; import { useMutation, useQuery } from "@tanstack/react-query"; import { Button } from "@/components/ui/button"; import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card"; import { Input } from "@/components/ui/input"; import { Label } from "@/components/ui/label"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select"; import { Textarea } from "@/components/ui/textarea"; import { Badge } from "@/components/ui/badge"; import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs"; import { Alert, AlertDescription } from "@/components/ui/alert"; import { Database, Play, TestTube, Settings, BarChart3 } from "lucide-react"; import { apiClient } from "@/lib/api"; import type { SamplingResponse, DatasetCreateResponse } from "@/types/api"; interface SamplingConfig { strategy: string; limit?: number; } export function SamplingPanel() { const [samplingConfig, setSamplingConfig] = useState({ strategy: "all", limit: undefined, }); const [embeddingModel, setEmbeddingModel] = useState(""); const [description, setDescription] = useState(""); // Test sampling mutation const testSamplingMutation = useMutation({ mutationFn: (config: SamplingConfig) => apiClient.sampleDataset(config), onSuccess: (data: SamplingResponse) => { console.log("Sampling test successful:", data); }, onError: (error: Error) => { console.error("Sampling test failed:", error); } }); // Create dataset with sampling mutation const createDatasetMutation = useMutation({ mutationFn: (config: { sampling: SamplingConfig; embedding_model: string; description?: string; }) => apiClient.createDatasetWithSampling(config), onSuccess: (data: DatasetCreateResponse) => { console.log("Dataset created successfully:", data); }, onError: (error: Error) => { console.error("Dataset creation failed:", error); } }); const handleStrategyChange = (strategy: string) => { setSamplingConfig((prev) => ({ ...prev, strategy })); }; const handleLimitChange = (limit: string) => { setSamplingConfig((prev) => ({ ...prev, limit: limit ? parseInt(limit) : undefined })); }; const handleTestSampling = () => { testSamplingMutation.mutate(samplingConfig); }; const handleCreateDataset = () => { if (!embeddingModel) { alert("Please select an embedding model"); return; } createDatasetMutation.mutate({ sampling: samplingConfig, embedding_model: embeddingModel, description: description || undefined }); }; const getStrategyDescription = (strategy: string) => { switch (strategy) { case "all": return "Sample all labeled videos"; case "random": return "Randomly sample specified number of labeled videos"; default: return "Unknown strategy"; } }; return (
Configure Sampling Test Sampling Sampling Strategy Configuration Select data sampling strategy and parameters

{getStrategyDescription(samplingConfig.strategy)}

{samplingConfig.strategy === "random" && (
handleLimitChange(e.target.value)} />
)}
Test Sampling Test sampling strategy and view data statistics for sampling
{testSamplingMutation.isSuccess && testSamplingMutation.data && (
Total available data: {( testSamplingMutation.data as SamplingResponse ).total_available.toLocaleString()}
Will sample: {( testSamplingMutation.data as SamplingResponse ).sampled_count.toLocaleString()}
Sampling ratio: {( (( testSamplingMutation.data as SamplingResponse ).sampled_count / ( testSamplingMutation.data as SamplingResponse ).total_available) * 100 ).toFixed(1)} %
)} {testSamplingMutation.isError && ( Test failed: {(testSamplingMutation.error as Error).message} )}
); }