File size: 3,184 Bytes
c40c75a
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
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;