Skip to content

Commit

Permalink
ui(frontend): refine chat engine editor
Browse files Browse the repository at this point in the history
  • Loading branch information
634750802 committed Aug 8, 2024
1 parent 6fc7af1 commit 0846b00
Show file tree
Hide file tree
Showing 20 changed files with 444 additions and 552 deletions.
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import type { ChatEngine } from '@/api/chat-engines';
import { ChatEngineOptionsDetails } from '@/components/chat-engine/chat-engine-options-details';
import { EditIsDefaultForm } from '@/components/chat-engine/edit-is-default-form';
import { EditBooleanForm } from '@/components/chat-engine/edit-boolean-form';
import { EditLlmForm } from '@/components/chat-engine/edit-llm-form';
import { EditNameForm } from '@/components/chat-engine/edit-name-form';
import { EditRerankerForm } from '@/components/chat-engine/edit-reranker-form';
Expand All @@ -16,12 +16,12 @@ export function ChatEngineDetails ({ chatEngine }: { chatEngine: ChatEngine }) {
<div className="space-y-2 text-sm">
<OptionDetail title="ID" value={chatEngine.id} />
<OptionDetail title="Name" value={chatEngine.name} editPanel={<EditNameForm chatEngine={chatEngine} />} />
<OptionDetail title="LLM" value={<LlmInfo id={chatEngine.llm_id} />} editPanel={<EditLlmForm chatEngine={chatEngine} type="llm" />} />
<OptionDetail title="Fast LLM" value={<LlmInfo id={chatEngine.fast_llm_id} />} editPanel={<EditLlmForm chatEngine={chatEngine} type="fast_llm" />} />
<OptionDetail title="LLM" value={<LlmInfo id={chatEngine.llm_id} />} editPanel={<EditLlmForm chatEngine={chatEngine} type="llm_id" />} />
<OptionDetail title="Fast LLM" value={<LlmInfo id={chatEngine.fast_llm_id} />} editPanel={<EditLlmForm chatEngine={chatEngine} type="fast_llm_id" />} />
<OptionDetail title="Reranker Model" value={<RerankerInfo id={chatEngine.reranker_id} />} editPanel={<EditRerankerForm chatEngine={chatEngine} />} />
<OptionDetail title="Created at" value={format(chatEngine.created_at, 'yyyy-MM-dd HH:mm:ss')} />
<OptionDetail title="Updated at" value={format(chatEngine.updated_at, 'yyyy-MM-dd HH:mm:ss')} />
<OptionDetail title="Is default" value={chatEngine.is_default ? 'Yes' : 'No'} editPanel={<EditIsDefaultForm chatEngine={chatEngine} />} />
<OptionDetail title="Is default" value={chatEngine.is_default ? 'Yes' : 'No'} editPanel={<EditBooleanForm type="is_default" chatEngine={chatEngine} />} />
</div>
<Separator />
<ChatEngineOptionsDetails options={chatEngine.engine_options} editable={chatEngine} />
Expand Down
110 changes: 22 additions & 88 deletions frontend/app/src/components/chat-engine/edit-boolean-form.tsx
Original file line number Diff line number Diff line change
@@ -1,110 +1,44 @@
'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 { type ChatEngine, updateChatEngine } from '@/api/chat-engines';
import { EditPropertyForm } from '@/components/chat-engine/edit-property-form';
import { FormSwitch } from '@/components/form/control-widget';
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(),
});
const booleanSchema = 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<string, BooleanOptionConfig>;
type KeyOfType<T, Value> = keyof { [P in keyof T as T[P] extends Value ? P : never]: any }

export interface EditBooleanFormProps {
chatEngine: ChatEngine;
type: keyof typeof config;
type: KeyOfType<ChatEngine, boolean>;
}

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 (
<>
<DialogHeader>
<DialogTitle>{name}</DialogTitle>
</DialogHeader>
<Form {...form}>
<form id="update-form" className="space-y-4" onSubmit={handleSubmit}>
<FormField
name="enabled"
render={({ field }) => (
<FormItem>
<FormControl>
<FormControl>
<Switch name={field.name} onBlur={field.onBlur} checked={field.value} onCheckedChange={field.onChange} disabled={field.disabled} />
</FormControl>
</FormControl>
<FormMessage />
</FormItem>
)}
/>
</form>
</Form>
<DialogFooter>
<Button type="submit" form="update-form" disabled={form.formState.disabled || form.formState.isSubmitting || transitioning}>
Update
</Button>
</DialogFooter>
<EditPropertyForm
inline
object={chatEngine}
property={type}
schema={booleanSchema}
onSubmit={async (data) => {
await updateChatEngine(chatEngine.id, data);
startTransition(() => {
router.refresh();
});
toast('ChatEngine successfully updated.');
}}
disabled={transitioning}
>
<FormSwitch />
</EditPropertyForm>
</>
);
}
113 changes: 0 additions & 113 deletions frontend/app/src/components/chat-engine/edit-integer-form.tsx

This file was deleted.

76 changes: 0 additions & 76 deletions frontend/app/src/components/chat-engine/edit-is-default-form.tsx

This file was deleted.

Loading

0 comments on commit 0846b00

Please sign in to comment.