import { SidebarCreateItem } from "@/components/sidebar/items/all/sidebar-create-item" import { ChatSettingsForm } from "@/components/ui/chat-settings-form" import ImagePicker from "@/components/ui/image-picker" import { Input } from "@/components/ui/input" import { Label } from "@/components/ui/label" import { ChatbotUIContext } from "@/context/context" import { ASSISTANT_DESCRIPTION_MAX, ASSISTANT_NAME_MAX } from "@/db/limits" import { Tables, TablesInsert } from "@/supabase/types" import { FC, useContext, useEffect, useState } from "react" import { AssistantRetrievalSelect } from "./assistant-retrieval-select" import { AssistantToolSelect } from "./assistant-tool-select" interface CreateAssistantProps { isOpen: boolean onOpenChange: (isOpen: boolean) => void } export const CreateAssistant: FC = ({ isOpen, onOpenChange }) => { const { profile, selectedWorkspace } = useContext(ChatbotUIContext) const [name, setName] = useState("") const [isTyping, setIsTyping] = useState(false) const [description, setDescription] = useState("") const [assistantChatSettings, setAssistantChatSettings] = useState({ model: selectedWorkspace?.default_model, prompt: selectedWorkspace?.default_prompt, temperature: selectedWorkspace?.default_temperature, contextLength: selectedWorkspace?.default_context_length, includeProfileContext: false, includeWorkspaceInstructions: false, embeddingsProvider: selectedWorkspace?.embeddings_provider }) const [selectedImage, setSelectedImage] = useState(null) const [imageLink, setImageLink] = useState("") const [selectedAssistantRetrievalItems, setSelectedAssistantRetrievalItems] = useState[] | Tables<"collections">[]>([]) const [selectedAssistantToolItems, setSelectedAssistantToolItems] = useState< Tables<"tools">[] >([]) useEffect(() => { setAssistantChatSettings(prevSettings => { const previousPrompt = prevSettings.prompt || "" const previousPromptParts = previousPrompt.split(". ") previousPromptParts[0] = name ? `You are ${name}` : "" return { ...prevSettings, prompt: previousPromptParts.join(". ") } }) }, [name]) const handleRetrievalItemSelect = ( item: Tables<"files"> | Tables<"collections"> ) => { setSelectedAssistantRetrievalItems(prevState => { const isItemAlreadySelected = prevState.find( selectedItem => selectedItem.id === item.id ) if (isItemAlreadySelected) { return prevState.filter(selectedItem => selectedItem.id !== item.id) } else { return [...prevState, item] } }) } const handleToolSelect = (item: Tables<"tools">) => { setSelectedAssistantToolItems(prevState => { const isItemAlreadySelected = prevState.find( selectedItem => selectedItem.id === item.id ) if (isItemAlreadySelected) { return prevState.filter(selectedItem => selectedItem.id !== item.id) } else { return [...prevState, item] } }) } const checkIfModelIsToolCompatible = () => { if (!assistantChatSettings.model) return false const compatibleModels = [ "gpt-4-turbo-preview", "gpt-4-vision-preview", "gpt-3.5-turbo-1106", "gpt-4" ] const isModelCompatible = compatibleModels.includes( assistantChatSettings.model ) return isModelCompatible } if (!profile) return null if (!selectedWorkspace) return null return ( item.hasOwnProperty("type") ) as Tables<"files">[], collections: selectedAssistantRetrievalItems.filter( item => !item.hasOwnProperty("type") ) as Tables<"collections">[], tools: selectedAssistantToolItems } as TablesInsert<"assistants"> } isOpen={isOpen} isTyping={isTyping} renderInputs={() => ( <>
setName(e.target.value)} maxLength={ASSISTANT_NAME_MAX} />
setDescription(e.target.value)} maxLength={ASSISTANT_DESCRIPTION_MAX} />
{checkIfModelIsToolCompatible() ? (
) : (
Model is not compatible with tools.
)} )} onOpenChange={onOpenChange} /> ) }