chatbot-ui/components/sidebar/items/presets/create-preset.tsx

85 lines
2.8 KiB
TypeScript

import { SidebarCreateItem } from "@/components/sidebar/items/all/sidebar-create-item"
import { ChatSettingsForm } from "@/components/ui/chat-settings-form"
import { Input } from "@/components/ui/input"
import { Label } from "@/components/ui/label"
import { ChatbotUIContext } from "@/context/context"
import { PRESET_NAME_MAX } from "@/db/limits"
import { TablesInsert } from "@/supabase/types"
import { FC, useContext, useState } from "react"
import { useTranslation } from 'react-i18next'
interface CreatePresetProps {
isOpen: boolean
onOpenChange: (isOpen: boolean) => void
}
export const CreatePreset: FC<CreatePresetProps> = ({
isOpen,
onOpenChange
}) => {
const { t } = useTranslation()
const { profile, selectedWorkspace } = useContext(ChatbotUIContext)
const [name, setName] = useState("")
const [isTyping, setIsTyping] = useState(false)
const [description, setDescription] = useState("")
const [presetChatSettings, setPresetChatSettings] = useState({
model: selectedWorkspace?.default_model,
prompt: selectedWorkspace?.default_prompt,
temperature: selectedWorkspace?.default_temperature,
contextLength: selectedWorkspace?.default_context_length,
includeProfileContext: selectedWorkspace?.include_profile_context,
includeWorkspaceInstructions:
selectedWorkspace?.include_workspace_instructions,
embeddingsProvider: selectedWorkspace?.embeddings_provider
})
if (!profile) return null
if (!selectedWorkspace) return null
return (
<SidebarCreateItem
contentType="presets"
isOpen={isOpen}
isTyping={isTyping}
onOpenChange={onOpenChange}
createState={
{
user_id: profile.user_id,
name,
description,
include_profile_context: presetChatSettings.includeProfileContext,
include_workspace_instructions:
presetChatSettings.includeWorkspaceInstructions,
context_length: presetChatSettings.contextLength,
model: presetChatSettings.model,
prompt: presetChatSettings.prompt,
temperature: presetChatSettings.temperature,
embeddings_provider: presetChatSettings.embeddingsProvider
} as TablesInsert<"presets">
}
renderInputs={() => (
<>
<div className="space-y-1">
<Label>{t("side.name")}</Label>
<Input
placeholder={t("side.presetNamePlaceholder")}
value={name}
onChange={e => setName(e.target.value)}
maxLength={PRESET_NAME_MAX}
/>
</div>
<ChatSettingsForm
chatSettings={presetChatSettings as any}
onChangeChatSettings={setPresetChatSettings}
useAdvancedDropdown={true}
/>
</>
)}
/>
)
}