feat: AI Agents management page with per-agent performance tracking

New Agents tab in the sidebar (Ops group) for viewing, editing, and
creating AI agent configurations:

Database (migration 026):
- ai_agents table: editable configs for each LLM agent (model, prompts,
  temperature, tokens, retries). source='system' for built-in,
  source='user' for custom. Seeds 3 system agents (Document Extractor,
  Event Classifier, Thesis Rewriter) using WHERE NOT EXISTS to never
  overwrite user edits across reinstalls.
- agent_performance_log table: per-invocation metrics (duration,
  confidence, retries, tokens, errors) linked to agent config.

API endpoints:
- GET/POST /api/agents — list and create agents
- GET/PUT/DELETE /api/agents/{id} — view, edit, delete (system agents
  can be edited but not deleted)
- GET /api/agents/{id}/performance — aggregated metrics (success rate,
  avg/p95 latency, confidence, token usage)
- GET /api/agents/{id}/performance/history — hourly time series

Frontend:
- AgentsPage with sidebar list + detail panel
- Agent detail: config display, system prompt viewer, performance
  dashboard with metrics cards and time-series chart
- Edit form: all config fields editable including system prompt,
  model, temperature, tokens, retries
- Create form: new user-defined agents with auto-slug generation
- System agents show blue badge, user agents show green badge
This commit is contained in:
Celes Renata
2026-04-17 01:24:35 +00:00
parent 86b549e5e1
commit 45752b9a29
5 changed files with 742 additions and 0 deletions
+8
View File
@@ -29,6 +29,7 @@ import { DashboardsPage } from './pages/Dashboards';
import { HomePage } from './pages/Home';
import { GlobalEventsPage } from './pages/GlobalEvents';
import { GlobalEventDetailPage } from './pages/GlobalEventDetail';
import { AgentsPage } from './pages/Agents';
// Root route wraps everything in the app shell layout
const rootRoute = createRootRoute({
@@ -157,6 +158,12 @@ const globalEventDetailRoute = createRoute({
component: GlobalEventDetailPage,
});
const agentsRoute = createRoute({
getParentRoute: () => rootRoute,
path: '/agents',
component: AgentsPage,
});
const routeTree = rootRoute.addChildren([
indexRoute,
companiesRoute,
@@ -181,6 +188,7 @@ const routeTree = rootRoute.addChildren([
analyticsDashboardsRoute,
globalEventsRoute,
globalEventDetailRoute,
agentsRoute,
]);
export const router = createRouter({ routeTree });