/** * Eval Dataset List Page (Feature 15 — Story 13) * * Route: /eval/datasets * * Features: * - Table of datasets: Name, Agent, Version, Test Cases, Created * - "New Dataset" button → create dialog * - Row click → /eval/datasets/:id * - Filter by agent dropdown */ import React, { useState, useCallback } from 'react'; import { useNavigate } from 'react-router-dom'; import { useApi } from '../../hooks/useApi'; import { getEvalDatasets, createEvalDataset } from '../../api/eval'; import { getAgents } from '../../api/client'; import type { EvalDataset } from '../../api/eval'; import type { Agent } from '@agentkitai/agentlens-core'; const PAGE_SIZE = 20; function formatDate(iso: string): string { try { return new Date(iso).toLocaleDateString(undefined, { year: 'numeric', month: 'short', day: 'numeric', }); } catch { return iso; } } export function EvalDatasets(): React.ReactElement { const navigate = useNavigate(); const [agentFilter, setAgentFilter] = useState(''); const [page, setPage] = useState(0); const [showCreate, setShowCreate] = useState(false); const [newName, setNewName] = useState(''); const [newDesc, setNewDesc] = useState(''); const [newAgentId, setNewAgentId] = useState(''); const [creating, setCreating] = useState(false); const { data, loading, error, refetch } = useApi( () => getEvalDatasets({ agentId: agentFilter || undefined, limit: PAGE_SIZE, offset: page * PAGE_SIZE, }), [agentFilter, page], ); const { data: agents } = useApi(() => getAgents(), []); const handleCreate = useCallback(async () => { if (!newName.trim()) return; setCreating(true); try { const dataset = await createEvalDataset({ name: newName.trim(), description: newDesc.trim() || undefined, agentId: newAgentId || undefined, }); setShowCreate(false); setNewName(''); setNewDesc(''); setNewAgentId(''); navigate(`/eval/datasets/${dataset.id}`); } catch { // Error handled by UI } finally { setCreating(false); } }, [newName, newDesc, newAgentId, navigate]); const datasets = data?.datasets ?? []; const total = data?.total ?? 0; const hasMore = data?.hasMore ?? false; return (
{/* Header */}

Eval Datasets

Manage evaluation datasets and test cases for quality testing.

{/* Filter */}
{agentFilter && ( )}
{/* Error */} {error && (
Error loading datasets: {error}
)} {/* Create Dialog */} {showCreate && (

Create New Dataset

setNewName(e.target.value)} placeholder="e.g., Customer Support QA v1" className="w-full rounded border border-gray-300 px-3 py-2 text-sm" />