import React, { useState, useEffect } from "react"; import { Card, Title, Subtitle, Table, TableHead, TableRow, Badge, TableHeaderCell, TableCell, TableBody, Metric, Text, Grid, Button, TextInput, Col, } from "@tremor/react"; import { getCallbacksCall, setCallbacksCall, serviceHealthCheck } from "./networking"; import { Modal, Form, Input, Select, Button as Button2, message } from "antd"; import StaticGenerationSearchParamsBailoutProvider from "next/dist/client/components/static-generation-searchparams-bailout-provider"; interface SettingsPageProps { accessToken: string | null; userRole: string | null; userID: string | null; } const Settings: React.FC = ({ accessToken, userRole, userID, }) => { const [callbacks, setCallbacks] = useState([]); const [isModalVisible, setIsModalVisible] = useState(false); const [form] = Form.useForm(); const [selectedCallback, setSelectedCallback] = useState(null); const [selectedAlertValues, setSelectedAlertValues] = useState([]); useEffect(() => { if (!accessToken || !userRole || !userID) { return; } getCallbacksCall(accessToken, userID, userRole).then((data) => { console.log("callbacks", data); let callbacks_data = data.data; setCallbacks(callbacks_data); }); }, [accessToken, userRole, userID]); const handleAddCallback = () => { console.log("Add callback clicked"); setIsModalVisible(true); }; const handleCancel = () => { setIsModalVisible(false); form.resetFields(); setSelectedCallback(null); }; const handleChange = (values: any) => { setSelectedAlertValues(values); // Here, you can perform any additional logic with the selected values console.log('Selected values:', values); }; const handleSaveChanges = (callback: any) => { if (!accessToken) { return; } const updatedVariables = Object.fromEntries( Object.entries(callback.variables).map(([key, value]) => [key, (document.querySelector(`input[name="${key}"]`) as HTMLInputElement)?.value || value]) ); console.log("updatedVariables", updatedVariables); console.log("updateAlertTypes", selectedAlertValues); const payload = { environment_variables: updatedVariables, general_settings: { alert_types: selectedAlertValues } }; try { setCallbacksCall(accessToken, payload); } catch (error) { message.error("Failed to update callback: " + error, 20); } message.success("Callback updated successfully"); }; const handleOk = () => { if (!accessToken) { return; } // Handle form submission form.validateFields().then((values) => { // Call API to add the callback console.log("Form values:", values); let payload; if (values.callback === 'langfuse') { payload = { environment_variables: { LANGFUSE_PUBLIC_KEY: values.langfusePublicKey, LANGFUSE_SECRET_KEY: values.langfusePrivateKey }, litellm_settings: { success_callback: [values.callback] } }; setCallbacksCall(accessToken, payload); // add langfuse to callbacks setCallbacks(callbacks ? [...callbacks, values.callback] : [values.callback]); } else if (values.callback === 'slack') { payload = { general_settings: { alerting: ["slack"], alerting_threshold: 300 }, environment_variables: { SLACK_WEBHOOK_URL: values.slackWebhookUrl } }; setCallbacksCall(accessToken, payload); // add slack to callbacks setCallbacks(callbacks ? [...callbacks, values.callback] : [values.callback]); } else { payload = { error: 'Invalid callback value' }; } setIsModalVisible(false); form.resetFields(); setSelectedCallback(null); }); }; const handleCallbackChange = (value: string) => { setSelectedCallback(value); }; if (!accessToken) { return null; } return (
Logging Callbacks Callback Callback Env Vars {callbacks.map((callback, index) => ( {callback.name}
    {Object.entries(callback.variables).map(([key, value]) => (
  • {key} {key === "LANGFUSE_HOST" ? (

    default value=https://cloud.langfuse.com

    ) : (
    )}
  • ))}
{callback.all_alert_types && (
Alerting Types
)}
))}
{selectedCallback === 'langfuse' && ( <> )} {selectedCallback === 'slack' && ( )}
Save
); }; export default Settings;