diff --git a/frontend/app/src/api/chat-engines.ts b/frontend/app/src/api/chat-engines.ts index e1724750..aa1f66f7 100644 --- a/frontend/app/src/api/chat-engines.ts +++ b/frontend/app/src/api/chat-engines.ts @@ -24,6 +24,7 @@ export interface ChatEngineKnowledgeGraphOptions { enabled: boolean; include_meta: boolean; with_degree: boolean; + using_intent_search: boolean; } export type ChatEngineLLMOptions = { @@ -34,9 +35,9 @@ export type ChatEngineLLMOptions = { intent_graph_knowledge: string normal_graph_knowledge: string - provider: string; - reranker_provider: string; - reranker_top_k: number; + // provider: string; + // reranker_provider: string; + // reranker_top_k: number; } & Record<`${string}_chat_model`, string | undefined> const kgOptionsSchema = z.object({ @@ -44,6 +45,7 @@ const kgOptionsSchema = z.object({ enabled: z.boolean(), include_meta: z.boolean(), with_degree: z.boolean(), + using_intent_search: z.boolean(), }) satisfies ZodType; const llmOptionsSchema = @@ -53,9 +55,9 @@ const llmOptionsSchema = refine_prompt: z.string(), intent_graph_knowledge: z.string(), normal_graph_knowledge: z.string(), - provider: z.string(), - reranker_provider: z.string(), - reranker_top_k: z.number(), + // provider: z.string(), + // reranker_provider: z.string(), + // reranker_top_k: z.number(), }).passthrough() as ZodType; const chatEngineOptionsSchema = z.object({ diff --git a/frontend/app/src/app/(main)/(admin)/chat-engines/[id]/page.tsx b/frontend/app/src/app/(main)/(admin)/chat-engines/[id]/page.tsx index d122b7f2..4841c394 100644 --- a/frontend/app/src/app/(main)/(admin)/chat-engines/[id]/page.tsx +++ b/frontend/app/src/app/(main)/(admin)/chat-engines/[id]/page.tsx @@ -1,7 +1,7 @@ import { getChatEngine } from '@/api/chat-engines'; import { AdminPageHeading } from '@/components/admin-page-heading'; import { ChatEngineDetails } from '@/components/chat-engine/chat-engine-details'; -import { Card, CardContent, CardTitle } from '@/components/ui/card'; +import { Card, CardContent } from '@/components/ui/card'; import { requireAuth } from '@/lib/auth'; export default async function ChatEnginePage ({ params }: { params: { id: string } }) { @@ -14,7 +14,7 @@ export default async function ChatEnginePage ({ params }: { params: { id: string
- + diff --git a/frontend/app/src/components/chat-engine/chat-engine-options-details.tsx b/frontend/app/src/components/chat-engine/chat-engine-options-details.tsx index 9125a4a3..f59868a5 100644 --- a/frontend/app/src/components/chat-engine/chat-engine-options-details.tsx +++ b/frontend/app/src/components/chat-engine/chat-engine-options-details.tsx @@ -17,7 +17,7 @@ export function ChatEngineOptionsDetails ({
Knowledge Graph
- +
diff --git a/frontend/app/src/components/chat-engine/edit-boolean-form.tsx b/frontend/app/src/components/chat-engine/edit-boolean-form.tsx new file mode 100644 index 00000000..b3b1696e --- /dev/null +++ b/frontend/app/src/components/chat-engine/edit-boolean-form.tsx @@ -0,0 +1,110 @@ +'use client'; + +import { type ChatEngine, type ChatEngineOptions, updateChatEngine } from '@/api/chat-engines'; +import { useManagedDialog } from '@/components/managed-dialog'; +import { Button } from '@/components/ui/button'; +import { DialogFooter, DialogHeader, DialogTitle } from '@/components/ui/dialog'; +import { Form, FormControl, FormField, FormItem, FormMessage } from '@/components/ui/form'; +import { Switch } from '@/components/ui/switch'; +import { zodResolver } from '@hookform/resolvers/zod'; +import { useRouter } from 'next/navigation'; +import { useTransition } from 'react'; +import { useForm } from 'react-hook-form'; +import { toast } from 'sonner'; +import { z } from 'zod'; + +const schema = z.object({ + enabled: z.boolean(), +}); + +type BooleanOptionConfig = { + name: string + get: (options: ChatEngineOptions) => boolean + set: (options: ChatEngineOptions, newValue: boolean) => void +} + +const config = { + 'kg.enabled': { + name: 'Enable KnowledgeGraph', + get: opt => opt.knowledge_graph.enabled, + set: (opt, nv) => opt.knowledge_graph.enabled = nv, + }, + 'kg.include_meta': { + name: 'KnowledgeGraph Include Meta', + get: opt => opt.knowledge_graph.include_meta, + set: (opt, nv) => opt.knowledge_graph.include_meta = nv, + }, + 'kg.with_degree': { + name: 'KnowledgeGraph With Degree', + get: opt => opt.knowledge_graph.with_degree, + set: (opt, nv) => opt.knowledge_graph.with_degree = nv, + }, + 'kg.using_intent_search': { + name: 'KnowledgeGraph Using Intent Search', + get: opt => opt.knowledge_graph.using_intent_search, + set: (opt, nv) => opt.knowledge_graph.using_intent_search = nv, + }, +} satisfies Record; + +export interface EditBooleanFormProps { + chatEngine: ChatEngine; + type: keyof typeof config; +} + +export function EditBooleanForm ({ type, chatEngine }: EditBooleanFormProps) { + const router = useRouter(); + const [transitioning, startTransition] = useTransition(); + const { setOpen } = useManagedDialog(); + const { name, get, set } = config[type]; + + const form = useForm<{ enabled: boolean }>({ + resolver: zodResolver(schema), + defaultValues: { + enabled: get(chatEngine.engine_options), + }, + }); + + const handleSubmit = form.handleSubmit(async (data) => { + const options: ChatEngineOptions = { + knowledge_graph: { ...chatEngine.engine_options.knowledge_graph }, + llm: { ...chatEngine.engine_options.llm }, + }; + set(options, data.enabled); + await updateChatEngine(chatEngine.id, { engine_options: options }); + startTransition(() => { + router.refresh(); + }); + toast(`ChatEngine's ${name} successfully updated.`); + setOpen(false); + }); + + return ( + <> + + {name} + +
+ + ( + + + + + + + + + )} + /> + + + + + + + ); +} diff --git a/frontend/app/src/components/chat-engine/edit-integer-form.tsx b/frontend/app/src/components/chat-engine/edit-integer-form.tsx new file mode 100644 index 00000000..960f8d3a --- /dev/null +++ b/frontend/app/src/components/chat-engine/edit-integer-form.tsx @@ -0,0 +1,113 @@ +'use client'; + +import { type ChatEngine, type ChatEngineOptions, updateChatEngine } from '@/api/chat-engines'; +import { useManagedDialog } from '@/components/managed-dialog'; +import { Button } from '@/components/ui/button'; +import { DialogFooter, DialogHeader, DialogTitle } from '@/components/ui/dialog'; +import { Form, FormControl, FormField, FormItem, FormMessage } from '@/components/ui/form'; +import { Slider } from '@/components/ui/slider'; +import { zodResolver } from '@hookform/resolvers/zod'; +import { useRouter } from 'next/navigation'; +import { useTransition } from 'react'; +import { useForm } from 'react-hook-form'; +import { toast } from 'sonner'; +import { z } from 'zod'; + +const schema = z.object({ + value: z.coerce.number().int(), +}); + +type BooleanOptionConfig = { + name: string + get: (options: ChatEngineOptions) => number + set: (options: ChatEngineOptions, newValue: number) => void + min: number + max: number +} + +const config = { + 'kg.depth': { + name: 'KnowledgeGraph Depth', + get: opt => opt.knowledge_graph.depth, + set: (opt, nv) => opt.knowledge_graph.depth = nv, + min: 0, + max: 20, + }, +} satisfies Record; + +export interface EditIntFormProps { + chatEngine: ChatEngine; + type: keyof typeof config; +} + +export function EditIntForm ({ type, chatEngine }: EditIntFormProps) { + const router = useRouter(); + const [transitioning, startTransition] = useTransition(); + const { setOpen } = useManagedDialog(); + const { name, min, max, get, set } = config[type]; + + const form = useForm<{ value: number }>({ + resolver: zodResolver(schema), + defaultValues: { + value: get(chatEngine.engine_options), + }, + }); + + const handleSubmit = form.handleSubmit(async (data) => { + const options: ChatEngineOptions = { + knowledge_graph: { ...chatEngine.engine_options.knowledge_graph }, + llm: { ...chatEngine.engine_options.llm }, + }; + set(options, data.value); + await updateChatEngine(chatEngine.id, { engine_options: options }); + startTransition(() => { + router.refresh(); + }); + toast(`ChatEngine's ${name} successfully updated.`); + setOpen(false); + }); + + return ( + <> + + {name} + +
+ + ( + + + +
+ field.onChange(value)} + disabled={field.disabled} + /> + + {field.value} + +
+
+
+ +
+ )} + /> + + + + + + + ); +} diff --git a/frontend/app/src/components/chat-engine/edit-name-form.tsx b/frontend/app/src/components/chat-engine/edit-name-form.tsx index 1d2e52bc..f9205f65 100644 --- a/frontend/app/src/components/chat-engine/edit-name-form.tsx +++ b/frontend/app/src/components/chat-engine/edit-name-form.tsx @@ -64,7 +64,7 @@ export function EditNameForm ({ chatEngine }: EditNameFormProps) { - diff --git a/frontend/app/src/components/chat-engine/edit-options-llm-prompt-form.tsx b/frontend/app/src/components/chat-engine/edit-options-llm-prompt-form.tsx index d5bc87fc..ae778b7e 100644 --- a/frontend/app/src/components/chat-engine/edit-options-llm-prompt-form.tsx +++ b/frontend/app/src/components/chat-engine/edit-options-llm-prompt-form.tsx @@ -5,7 +5,6 @@ import { useManagedDialog } from '@/components/managed-dialog'; import { Button } from '@/components/ui/button'; import { DialogFooter, DialogHeader, DialogTitle } from '@/components/ui/dialog'; import { Form, FormControl, FormField, FormItem, FormLabel, FormMessage } from '@/components/ui/form'; -import { Input } from '@/components/ui/input'; import { Textarea } from '@/components/ui/textarea'; import { zodResolver } from '@hookform/resolvers/zod'; import { useRouter } from 'next/navigation'; @@ -68,7 +67,7 @@ export function EditOptionsLlmPromptForm ({ chatEngine, type }: EditOptionsLlmPr {type} -