您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

knowledge-base-item.tsx 2.8KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. import { DocumentParserType } from '@/constants/knowledge';
  2. import { useTranslate } from '@/hooks/common-hooks';
  3. import { useFetchKnowledgeList } from '@/hooks/knowledge-hooks';
  4. import { UserOutlined } from '@ant-design/icons';
  5. import { Avatar as AntAvatar, Form, Select, Space } from 'antd';
  6. import { useFormContext } from 'react-hook-form';
  7. import { RAGFlowAvatar } from './ragflow-avatar';
  8. import { FormControl, FormField, FormItem, FormLabel } from './ui/form';
  9. import { MultiSelect } from './ui/multi-select';
  10. interface KnowledgeBaseItemProps {
  11. label?: string;
  12. tooltipText?: string;
  13. name?: string;
  14. required?: boolean;
  15. onChange?(): void;
  16. }
  17. const KnowledgeBaseItem = ({
  18. label,
  19. tooltipText,
  20. name,
  21. required = true,
  22. onChange,
  23. }: KnowledgeBaseItemProps) => {
  24. const { t } = useTranslate('chat');
  25. const { list: knowledgeList } = useFetchKnowledgeList(true);
  26. const filteredKnowledgeList = knowledgeList.filter(
  27. (x) => x.parser_id !== DocumentParserType.Tag,
  28. );
  29. const knowledgeOptions = filteredKnowledgeList.map((x) => ({
  30. label: (
  31. <Space>
  32. <AntAvatar size={20} icon={<UserOutlined />} src={x.avatar} />
  33. {x.name}
  34. </Space>
  35. ),
  36. value: x.id,
  37. }));
  38. return (
  39. <Form.Item
  40. label={label || t('knowledgeBases')}
  41. name={name || 'kb_ids'}
  42. tooltip={tooltipText || t('knowledgeBasesTip')}
  43. rules={[
  44. {
  45. required,
  46. message: t('knowledgeBasesMessage'),
  47. type: 'array',
  48. },
  49. ]}
  50. >
  51. <Select
  52. mode="multiple"
  53. options={knowledgeOptions}
  54. placeholder={t('knowledgeBasesMessage')}
  55. onChange={onChange}
  56. ></Select>
  57. </Form.Item>
  58. );
  59. };
  60. export default KnowledgeBaseItem;
  61. export function KnowledgeBaseFormField() {
  62. const form = useFormContext();
  63. const { t } = useTranslate('chat');
  64. const { list: knowledgeList } = useFetchKnowledgeList(true);
  65. const filteredKnowledgeList = knowledgeList.filter(
  66. (x) => x.parser_id !== DocumentParserType.Tag,
  67. );
  68. const knowledgeOptions = filteredKnowledgeList.map((x) => ({
  69. label: x.name,
  70. value: x.id,
  71. icon: () => (
  72. <RAGFlowAvatar className="size-4 mr-2" avatar={x.avatar} name={x.name} />
  73. ),
  74. }));
  75. return (
  76. <FormField
  77. control={form.control}
  78. name="kb_ids"
  79. render={({ field }) => (
  80. <FormItem>
  81. <FormLabel>{t('knowledgeBases')}</FormLabel>
  82. <FormControl>
  83. <MultiSelect
  84. options={knowledgeOptions}
  85. onValueChange={field.onChange}
  86. placeholder={t('knowledgeBasesMessage')}
  87. variant="inverted"
  88. maxCount={100}
  89. defaultValue={field.value}
  90. {...field}
  91. />
  92. </FormControl>
  93. </FormItem>
  94. )}
  95. />
  96. );
  97. }