ragflow/web/src/pages/agent/gobal-variable-sheet/index.tsx
chanx 87e69868c0
Fixes: Added session variable types and modified configuration (#11269)
### What problem does this PR solve?

Fixes: Added session variable types and modified configuration

- Added more types of session variables
- Modified the embedding model switching logic in the knowledge base
configuration

### Type of change

- [x] Bug Fix (non-breaking change which fixes an issue)
2025-11-14 13:56:56 +08:00

167 lines
5.9 KiB
TypeScript

import { ConfirmDeleteDialog } from '@/components/confirm-delete-dialog';
import { FormFieldConfig } from '@/components/dynamic-form';
import { BlockButton, Button } from '@/components/ui/button';
import {
Sheet,
SheetContent,
SheetHeader,
SheetTitle,
} from '@/components/ui/sheet';
import { useSetModalState } from '@/hooks/common-hooks';
import { useFetchAgent } from '@/hooks/use-agent-request';
import { GlobalVariableType } from '@/interfaces/database/agent';
import { cn } from '@/lib/utils';
import { t } from 'i18next';
import { Trash2 } from 'lucide-react';
import { useState } from 'react';
import { FieldValues } from 'react-hook-form';
import { useSaveGraph } from '../hooks/use-save-graph';
import { AddVariableModal } from './component/add-variable-modal';
import {
GlobalFormFields,
GlobalVariableFormDefaultValues,
TypeMaps,
TypesWithArray,
} from './constant';
import { useObjectFields } from './hooks/use-object-fields';
export type IGlobalParamModalProps = {
data: any;
hideModal: (open: boolean) => void;
};
export const GlobalParamSheet = (props: IGlobalParamModalProps) => {
const { hideModal } = props;
const { data, refetch } = useFetchAgent();
const { visible, showModal, hideModal: hideAddModal } = useSetModalState();
const [fields, setFields] = useState<FormFieldConfig[]>(GlobalFormFields);
const [defaultValues, setDefaultValues] = useState<FieldValues>(
GlobalVariableFormDefaultValues,
);
const { handleCustomValidate, handleCustomSchema, handleRender } =
useObjectFields();
const { saveGraph } = useSaveGraph();
const handleDeleteGlobalVariable = async (key: string) => {
const param = {
...(data.dsl?.variables || {}),
} as Record<string, GlobalVariableType>;
delete param[key];
const res = await saveGraph(undefined, {
globalVariables: param,
});
if (res.code === 0) {
refetch();
}
};
const handleEditGlobalVariable = (item: FieldValues) => {
const newFields = fields.map((field) => {
let newField = field;
newField.render = undefined;
newField.schema = undefined;
newField.customValidate = undefined;
if (newField.name === 'value') {
newField = {
...newField,
type: TypeMaps[item.type as keyof typeof TypeMaps],
render: handleRender(item.type),
customValidate: handleCustomValidate(item.type),
schema: handleCustomSchema(item.type),
};
}
return newField;
});
setFields(newFields);
setDefaultValues(item);
showModal();
};
return (
<>
<Sheet open onOpenChange={hideModal} modal={false}>
<SheetContent
className={cn('top-20 h-auto flex flex-col p-0 gap-0')}
onInteractOutside={(e) => e.preventDefault()}
>
<SheetHeader className="p-5">
<SheetTitle className="flex items-center gap-2.5">
{t('flow.conversationVariable')}
</SheetTitle>
</SheetHeader>
<div className="px-5 pb-5">
<BlockButton
onClick={() => {
setFields(GlobalFormFields);
setDefaultValues(GlobalVariableFormDefaultValues);
showModal();
}}
>
{t('flow.add')}
</BlockButton>
</div>
<div className="flex flex-col gap-2 px-5 ">
{data?.dsl?.variables &&
Object.keys(data.dsl.variables).map((key) => {
const item = data.dsl.variables[key];
return (
<div
key={key}
className="flex items-center gap-3 min-h-14 justify-between px-5 py-3 border border-border-default rounded-lg hover:bg-bg-card group"
onClick={() => {
handleEditGlobalVariable(item);
}}
>
<div className="flex flex-col">
<div className="flex items-center gap-2">
<span className=" font-medium">{item.name}</span>
<span className="text-sm font-medium text-text-secondary">
{item.type}
</span>
</div>
{![
TypesWithArray.Object,
TypesWithArray.ArrayObject,
TypesWithArray.ArrayString,
TypesWithArray.ArrayNumber,
TypesWithArray.ArrayBoolean,
].includes(item.type as TypesWithArray) && (
<div>
<span className="text-text-primary">
{item.value}
</span>
</div>
)}
</div>
<div>
<ConfirmDeleteDialog
onOk={() => handleDeleteGlobalVariable(key)}
>
<Button
variant={'secondary'}
className="bg-transparent hidden text-text-secondary border-none group-hover:bg-bg-card group-hover:text-text-primary group-hover:border group-hover:block"
onClick={(e) => {
e.stopPropagation();
}}
>
<Trash2 className="w-4 h-4" />
</Button>
</ConfirmDeleteDialog>
</div>
</div>
);
})}
</div>
</SheetContent>
<AddVariableModal
visible={visible}
hideModal={hideAddModal}
fields={fields}
setFields={setFields}
defaultValues={defaultValues}
setDefaultValues={setDefaultValues}
/>
</Sheet>
</>
);
};