import React, { useState, useEffect } from "react"; import { Table, TableBody, TableCell, TableHead, TableHeaderCell, TableRow, Card, Text, Badge, Button } from "@tremor/react"; import { InformationCircleIcon, PencilAltIcon, PencilIcon, RefreshIcon, StatusOnlineIcon, TrashIcon, } from "@heroicons/react/outline"; import { UploadProps } from "antd/es/upload"; import { PlusIcon } from "@heroicons/react/solid"; import { credentialListCall, credentialCreateCall, credentialDeleteCall, CredentialItem, CredentialsResponse } from "@/components/networking"; // Assume this is your networking function import AddCredentialsTab from "./add_credentials_tab"; import { Form, message } from "antd"; interface CredentialsPanelProps { accessToken: string | null; uploadProps: UploadProps; credentialList: CredentialItem[]; fetchCredentials: (accessToken: string) => Promise; } const CredentialsPanel: React.FC = ({ accessToken, uploadProps, credentialList, fetchCredentials }) => { const [isAddModalOpen, setIsAddModalOpen] = useState(false); const [form] = Form.useForm(); const handleAddCredential = async (values: any) => { if (!accessToken) { console.error('No access token found'); return; } const filter_credential_values = Object.entries(values) .filter(([key]) => !['credential_name', 'custom_llm_provider'].includes(key)) .reduce((acc, [key, value]) => ({ ...acc, [key]: value }), {}); // Transform form values into credential structure const newCredential = { credential_name: values.credential_name, credential_values: filter_credential_values, credential_info: { custom_llm_provider: values.custom_llm_provider, } }; // Add to list and close modal const response = await credentialCreateCall(accessToken, newCredential); message.success('Credential added successfully'); console.log(`response: ${JSON.stringify(response)}`); setIsAddModalOpen(false); fetchCredentials(accessToken); }; useEffect(() => { if (!accessToken) { return; } fetchCredentials(accessToken); }, [accessToken]); const renderProviderBadge = (provider: string) => { const providerColors: Record = { 'openai': 'blue', 'azure': 'indigo', 'anthropic': 'purple', 'default': 'gray' }; const color = providerColors[provider.toLowerCase()] || providerColors['default']; return ( {provider} ); }; const handleDeleteCredential = async (credentialName: string) => { if (!accessToken) { console.error('No access token found'); return; } const response = await credentialDeleteCall(accessToken, credentialName); console.log(`response: ${JSON.stringify(response)}`); message.success('Credential deleted successfully'); fetchCredentials(accessToken); }; return (
Configured credentials for different AI providers. Add and manage your API credentials.{" "} Docs
Credential Name Provider Description {(!credentialList || credentialList.length === 0) ? ( No credentials configured ) : ( credentialList.map((credential: CredentialItem, index: number) => ( {credential.credential_name} {renderProviderBadge(credential.credential_info?.custom_llm_provider as string || '-')} {credential.credential_info?.description || '-'}
{isAddModalOpen && ( setIsAddModalOpen(false)} uploadProps={uploadProps} /> )}
); }; export default CredentialsPanel;