import React, { useState, useEffect } from "react"; import { Table, TableBody, TableCell, TableHead, TableHeaderCell, TableRow, Card, Text, } from "@tremor/react"; import { getGuardrailsList } from "./networking"; interface GuardrailsPanelProps { accessToken: string | null; } interface GuardrailsResponse { guardrails: GuardrailItem[]; } interface GuardrailItem { guardrail_name: string | null; litellm_params: { guardrail: string; mode: string; default_on: boolean; }; guardrail_info: Record<string, any> | null; } const GuardrailsPanel: React.FC<GuardrailsPanelProps> = ({ accessToken }) => { const [guardrailsList, setGuardrailsList] = useState<GuardrailItem[]>([]); useEffect(() => { if (!accessToken) { return; } const fetchGuardrails = async () => { try { const response: GuardrailsResponse = await getGuardrailsList(accessToken); console.log(`guardrails: ${JSON.stringify(response)}`); setGuardrailsList(response.guardrails); } catch (error) { console.error('Error fetching guardrails:', error); } }; fetchGuardrails(); }, [accessToken]); return ( <div className="w-full mx-auto flex-auto overflow-y-auto m-8 p-2"> <Text className="mb-4"> Configured guardrails and their current status. Setup guardrails in config.yaml.{" "} <a href="https://docs.litellm.ai/docs/proxy/guardrails/quick_start" target="_blank" rel="noopener noreferrer" className="text-blue-500 hover:text-blue-700 underline" > Docs </a> </Text> <Card> <Table> <TableHead> <TableRow> <TableHeaderCell>Guardrail Name</TableHeaderCell> <TableHeaderCell>Mode</TableHeaderCell> <TableHeaderCell>Status</TableHeaderCell> </TableRow> </TableHead> <TableBody> { (!guardrailsList || guardrailsList.length === 0) ? ( <TableRow> <TableCell colSpan={3} className="mt-4 text-gray-500 text-center py-4">No guardrails configured</TableCell> </TableRow> ) : ( guardrailsList?.map((guardrail: GuardrailItem, index: number) => ( <TableRow key={index}> <TableCell>{guardrail.guardrail_name}</TableCell> <TableCell>{guardrail.litellm_params.mode}</TableCell> <TableCell> <div className={`inline-flex rounded-full px-2 py-1 text-xs font-medium ${guardrail.litellm_params.default_on ? 'bg-green-100 text-green-800' // Always On styling : 'bg-gray-100 text-gray-800' // Per Request styling }`}> {guardrail.litellm_params.default_on ? 'Always On' : 'Per Request'} </div> </TableCell> </TableRow> )) )} </TableBody> </Table> </Card> </div> ); }; export default GuardrailsPanel;