/** * The `OpenAIApp` component is the main entry point for the OpenAI configuration management functionality in the application. * It provides a user interface for adding, editing, deleting, and refetching OpenAI configurations. * The component uses React Query to manage the state and perform CRUD operations on the OpenAI configurations. * It also includes a modal for fetching the available models from the selected OpenAI configuration. */ import { Form, Input, Modal, Table, message, Tooltip, Select } from "antd" import { useState } from "react" import { useTranslation } from "react-i18next" import { addOpenAICofig, getAllOpenAIConfig, deleteOpenAIConfig, updateOpenAIConfig } from "@/db/openai" import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query" import { Pencil, Trash2, RotateCwIcon, DownloadIcon, AlertTriangle } from "lucide-react" import { OpenAIFetchModel } from "./openai-fetch-model" import { OAI_API_PROVIDERS } from "@/utils/oai-api-providers" const noPopupProvider = ["lmstudio", "llamafile", "ollama2"] export const OpenAIApp = () => { const { t } = useTranslation("openai") const [open, setOpen] = useState(false) const [editingConfig, setEditingConfig] = useState(null) const queryClient = useQueryClient() const [form] = Form.useForm() const [openaiId, setOpenaiId] = useState(null) const [openModelModal, setOpenModelModal] = useState(false) const [provider, setProvider] = useState("custom") const { data: configs, isLoading } = useQuery({ queryKey: ["openAIConfigs"], queryFn: getAllOpenAIConfig }) const addMutation = useMutation({ mutationFn: addOpenAICofig, onSuccess: (data) => { queryClient.invalidateQueries({ queryKey: ["openAIConfigs"] }) setOpen(false) message.success(t("addSuccess")) if (!noPopupProvider.includes(provider)) { setOpenaiId(data) setOpenModelModal(true) } setProvider("custom") } }) const updateMutation = useMutation({ mutationFn: updateOpenAIConfig, onSuccess: () => { queryClient.invalidateQueries({ queryKey: ["openAIConfigs"] }) setOpen(false) message.success(t("updateSuccess")) } }) const deleteMutation = useMutation({ mutationFn: deleteOpenAIConfig, onSuccess: () => { queryClient.invalidateQueries({ queryKey: ["openAIConfigs"] }) message.success(t("deleteSuccess")) } }) const handleSubmit = (values: { id?: string name: string baseUrl: string apiKey: string }) => { if (editingConfig) { updateMutation.mutate({ id: editingConfig.id, ...values }) } else { addMutation.mutate({ ...values, provider }) } } const handleEdit = (record: any) => { setEditingConfig(record) setOpen(true) form.setFieldsValue(record) } const handleDelete = (id: string) => { deleteMutation.mutate(id) } return (

{t("heading")}

{t("subheading")}

(
) } ]} dataSource={configs} loading={isLoading} rowKey="id" /> { setOpen(false) setEditingConfig(null) setProvider("custom") form.resetFields() }} footer={null}> {!editingConfig && ( {provider === "lmstudio" && (
{t("modal.tipLMStudio")}
)}
setOpenModelModal(false)}> {openaiId ? ( ) : null} ) }