feat: Add ModelSelect component to SidepanelForm

This commit is contained in:
n4ze3m 2024-05-08 10:44:51 +05:30
parent f630addefc
commit 88ad1fcab7
3 changed files with 70 additions and 2 deletions

View File

@ -0,0 +1,63 @@
import { useQuery } from "@tanstack/react-query"
import { Dropdown, Tooltip } from "antd"
import { LucideBrain } from "lucide-react"
import React from "react"
import { useTranslation } from "react-i18next"
import { OllamaIcon } from "../Icons/Ollama"
import { fetchChatModels } from "@/services/ollama"
import { useMessage } from "@/hooks/useMessage"
export const ModelSelect: React.FC = () => {
const { t } = useTranslation("common")
const { setSelectedModel, selectedModel } = useMessage()
const { data } = useQuery({
queryKey: ["getAllModelsForSelect"],
queryFn: async () => {
const models = await fetchChatModels({ returnEmpty: false })
return models
}
})
return (
<>
{data && data.length > 0 && (
<Dropdown
menu={{
items:
data?.map((d) => ({
key: d.name,
label: (
<div className="w-52 gap-2 text-lg truncate inline-flex line-clamp-3 items-center dark:border-gray-700">
<div>
<OllamaIcon className="h-6 w-6 text-gray-400" />
</div>
{d.name}
</div>
),
onClick: () => {
if (selectedModel === d.name) {
setSelectedModel(null)
} else {
setSelectedModel(d.name)
}
}
})) || [],
style: {
maxHeight: 500,
overflowY: "scroll"
},
className: "no-scrollbar",
activeKey: selectedModel
}}
placement={"topLeft"}
trigger={["click"]}>
<Tooltip title={t("selectAModel")}>
<button type="button" className="dark:text-gray-300">
<LucideBrain className="h-5 w-5"/>
</button>
</Tooltip>
</Dropdown>
)}
</>
)
}

View File

@ -1,4 +1,4 @@
import { useQuery } from "@tanstack/react-query" import { useQuery, useQueryClient } from "@tanstack/react-query"
import { Select } from "antd" import { Select } from "antd"
import { RotateCcw } from "lucide-react" import { RotateCcw } from "lucide-react"
import { useEffect, useState } from "react" import { useEffect, useState } from "react"
@ -15,6 +15,7 @@ import {
export const EmptySidePanel = () => { export const EmptySidePanel = () => {
const [ollamaURL, setOllamaURL] = useState<string>("") const [ollamaURL, setOllamaURL] = useState<string>("")
const { t } = useTranslation(["playground", "common"]) const { t } = useTranslation(["playground", "common"])
const queryClient = useQueryClient()
const { const {
data: ollamaInfo, data: ollamaInfo,
status: ollamaStatus, status: ollamaStatus,
@ -26,7 +27,9 @@ export const EmptySidePanel = () => {
const ollamaURL = await getOllamaURL() const ollamaURL = await getOllamaURL()
const isOk = await isOllamaRunning() const isOk = await isOllamaRunning()
const models = await fetchChatModels({ returnEmpty: false }) const models = await fetchChatModels({ returnEmpty: false })
queryClient.invalidateQueries({
queryKey: ["getAllModelsForSelect"]
})
return { return {
isOk, isOk,
models, models,

View File

@ -10,6 +10,7 @@ import { useWebUI } from "~/store/webui"
import { defaultEmbeddingModelForRag } from "~/services/ollama" import { defaultEmbeddingModelForRag } from "~/services/ollama"
import { ImageIcon, MicIcon, StopCircleIcon, X } from "lucide-react" import { ImageIcon, MicIcon, StopCircleIcon, X } from "lucide-react"
import { useTranslation } from "react-i18next" import { useTranslation } from "react-i18next"
import { ModelSelect } from "@/components/Common/ModelSelect"
type Props = { type Props = {
dropedFile: File | undefined dropedFile: File | undefined
@ -186,6 +187,7 @@ export const SidepanelForm = ({ dropedFile }: Props) => {
{...form.getInputProps("message")} {...form.getInputProps("message")}
/> />
<div className="flex mt-4 justify-end gap-3"> <div className="flex mt-4 justify-end gap-3">
<ModelSelect />
<Tooltip title={t("tooltip.speechToText")}> <Tooltip title={t("tooltip.speechToText")}>
<button <button
type="button" type="button"