import React, { useState } from "react"; import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, } from "@/components/ui/dialog"; import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; import { Label } from "@/components/ui/label"; import { Badge } from "@/components/ui/badge"; import { Checkbox } from "@/components/ui/checkbox"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from "@/components/ui/select"; import { Accordion, AccordionContent, AccordionItem, AccordionTrigger, } from "@/components/ui/accordion"; import { Shield, Users, Settings, Play, X, Plus, Trash2 } from "lucide-react"; import { PerturbationConfig, Demographic } from "@/types"; interface PerturbationTestConfigProps { open: boolean; onOpenChange: (open: boolean) => void; onRun: (config: PerturbationConfig) => void; } const DEFAULT_DEMOGRAPHICS: Demographic[] = [ { gender: "male", race: "White" }, { gender: "female", race: "White" }, { gender: "male", race: "Black" }, { gender: "female", race: "Black" }, ]; const GENDER_OPTIONS = ["male", "female", "non-binary"]; const RACE_OPTIONS = ["White", "Black", "Asian", "Hispanic", "Middle Eastern", "Indigenous"]; const PRESET_CONFIGS = { quick: { name: "Quick", description: "Fast testing with minimal coverage", config: { model: "gpt-4o-mini", judge_model: "gpt-4o-mini", max_relations: 3, jailbreak: { enabled: true, num_techniques: 3, prompt_source: "standard" }, counterfactual_bias: { enabled: true, demographics: [ { gender: "male", race: "White" }, { gender: "female", race: "Black" }, ], include_baseline: true, comparison_mode: "vs_baseline" as const, }, }, }, standard: { name: "Standard", description: "Balanced testing with good coverage", config: { model: "gpt-4o-mini", judge_model: "gpt-4o-mini", max_relations: 10, jailbreak: { enabled: true, num_techniques: 10, prompt_source: "standard" }, counterfactual_bias: { enabled: true, demographics: DEFAULT_DEMOGRAPHICS, include_baseline: true, comparison_mode: "both" as const, }, }, }, comprehensive: { name: "Comprehensive", description: "Thorough testing with full coverage", config: { model: "gpt-4o-mini", judge_model: "gpt-4o-mini", max_relations: null, jailbreak: { enabled: true, num_techniques: 20, prompt_source: "standard" }, counterfactual_bias: { enabled: true, demographics: [ ...DEFAULT_DEMOGRAPHICS, { gender: "male", race: "Asian" }, { gender: "female", race: "Asian" }, { gender: "male", race: "Hispanic" }, { gender: "female", race: "Hispanic" }, ], include_baseline: true, comparison_mode: "both" as const, }, }, }, }; export function PerturbationTestConfig({ open, onOpenChange, onRun, }: PerturbationTestConfigProps) { const [config, setConfig] = useState( PRESET_CONFIGS.standard.config ); const [selectedPreset, setSelectedPreset] = useState("standard"); const applyPreset = (presetKey: string) => { const preset = PRESET_CONFIGS[presetKey as keyof typeof PRESET_CONFIGS]; if (preset) { setConfig(preset.config); setSelectedPreset(presetKey); } }; const updateJailbreak = (updates: Partial>) => { setConfig((prev) => ({ ...prev, jailbreak: { ...prev.jailbreak!, ...updates }, })); setSelectedPreset(""); }; const updateBias = ( updates: Partial> ) => { setConfig((prev) => ({ ...prev, counterfactual_bias: { ...prev.counterfactual_bias!, ...updates }, })); setSelectedPreset(""); }; const addDemographic = () => { const newDemo: Demographic = { gender: "male", race: "White" }; updateBias({ demographics: [...(config.counterfactual_bias?.demographics || []), newDemo], }); }; const removeDemographic = (index: number) => { const demographics = [...(config.counterfactual_bias?.demographics || [])]; demographics.splice(index, 1); updateBias({ demographics }); }; const updateDemographic = (index: number, field: keyof Demographic, value: string) => { const demographics = [...(config.counterfactual_bias?.demographics || [])]; const current = demographics[index]; demographics[index] = { gender: current?.gender || "", race: current?.race || "", [field]: value, }; updateBias({ demographics }); }; const handleRun = () => { onRun(config); onOpenChange(false); }; return ( Perturbation Test Configuration Configure which tests to run and their parameters. Choose a preset or customize settings.
{/* Preset Selection */}
{Object.entries(PRESET_CONFIGS).map(([key, preset]) => ( ))}
{selectedPreset && (

{PRESET_CONFIGS[selectedPreset as keyof typeof PRESET_CONFIGS].description}

)}
{/* General Settings */}
{ const val = e.target.value ? parseInt(e.target.value) : null; setConfig((prev) => ({ ...prev, max_relations: val })); setSelectedPreset(""); }} />
{/* Jailbreak Settings */}
Jailbreak Testing {config.jailbreak?.enabled ? "Enabled" : "Disabled"}
updateJailbreak({ enabled: v })} />
{config.jailbreak?.enabled && ( <>
updateJailbreak({ num_techniques: parseInt(e.target.value) || 10 }) } />

Number of jailbreak techniques to test per relation (1-50)

)}
{/* Counterfactual Bias Settings */}
Counterfactual Bias Testing {config.counterfactual_bias?.enabled ? "Enabled" : "Disabled"}
updateBias({ enabled: v })} />
{config.counterfactual_bias?.enabled && ( <>
updateBias({ include_baseline: v })} />
{config.counterfactual_bias?.demographics.map((demo, index) => (
))}
)}
); }