import React, {useEffect, useRef, useState} from "react"; import {removeTab, openNewTab, createInternalId, getUserClick} from "@/utils/utils"; import Image from "next/image"; import {fetchApiKey, storeModel, testModel, verifyEndPoint} from "@/pages/api/DashboardService"; import {BeatLoader, ClipLoader} from "react-spinners"; import {ToastContainer, toast} from 'react-toastify'; export default function ModelForm({internalId, getModels, sendModelData, env}){ const models = env === 'DEV' ? ['OpenAI', 'Replicate', 'Hugging Face', 'Google Palm', 'Local LLM'] : ['OpenAI', 'Replicate', 'Hugging Face', 'Google Palm']; const [selectedModel, setSelectedModel] = useState('Select a Model'); const [modelName, setModelName] = useState(''); const [modelDescription, setModelDescription] = useState(''); const [modelTokenLimit, setModelTokenLimit] = useState(4096); const [modelEndpoint, setModelEndpoint] = useState(''); const [modelDropdown, setModelDropdown] = useState(false); const [modelVersion, setModelVersion] = useState(''); const [modelContextLength, setContextLength] = useState(4096); const [tokenError, setTokenError] = useState(false); const [lockAddition, setLockAddition] = useState(true); const [isLoading, setIsLoading] = useState(false) const [modelStatus, setModelStatus] = useState(null); const [createClickable, setCreateClickable] = useState(true); const modelRef = useRef(null); useEffect(() => { function handleClickOutside(event) { if (modelRef.current && !modelRef.current.contains(event.target)) { setModelDropdown(false) } } },[]); useEffect(() => { const fetchMyAPI = async () => { const error = await checkModelProvider(selectedModel) if(selectedModel !== 'Select a Model' && !error) setLockAddition(false) else setLockAddition(true) } fetchMyAPI(); },[selectedModel]) const handleModelSelect = async (index) => { setSelectedModel(models[index]) setModelDropdown(false); } const checkModelProvider = async (model_provider) => { const response = await fetchApiKey(model_provider); console.log(response.data) if(selectedModel !== 'Select a Model'){ if(response.data.length === 0) { setTokenError(true) return true } else { setTokenError(false) return false } } } const handleAddModel = () =>{ setIsLoading(true) fetchApiKey(selectedModel).then((response) =>{ if(response.data.length > 0) { const modelProviderId = response.data[0].id verifyEndPoint(response.data[0].api_key, modelEndpoint, selectedModel).then((response) =>{ if(response.data.success) storeModelDetails(modelProviderId) else{ toast.error("The Endpoint is not Valid",{autoClose: 1800}); setIsLoading(false); } }).catch((error) => { console.log("Error Message:: " + error) }) } }) } const handleModelStatus = async () => { try { setCreateClickable(false); const response = await testModel(); if(response.status === 200) { setModelStatus(true); setCreateClickable(true); } else { setModelStatus(false); setCreateClickable(true); } } catch(error) { console.log("Error Message:: " + error); setModelStatus(false); setCreateClickable(true); } } const handleModelSuccess = (model) => { model.contentType = 'Model' sendModelData(model) } const storeModelDetails = (modelProviderId) => { storeModel(modelName,modelDescription, modelEndpoint, modelProviderId, modelTokenLimit, "Custom", modelVersion, modelContextLength).then((response) =>{ setIsLoading(false) let data = response.data if (data.error) { toast.error(data.error,{autoClose: 1800}); } else if (data.success) { toast.success(data.success,{autoClose: 1800}); getModels() handleModelSuccess({id: data.model_id, name: modelName}) } }).catch((error) => { console.log("SORRY, There was an error storing the model details:", error); setIsLoading(false) }); } return(
Add new model
Name setModelName(event.target.value)}/> Description