You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

retrieval-node.tsx 2.8KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. import { useFetchKnowledgeList } from '@/hooks/knowledge-hooks';
  2. import { IRetrievalNode } from '@/interfaces/database/flow';
  3. import { UserOutlined } from '@ant-design/icons';
  4. import { NodeProps, Position } from '@xyflow/react';
  5. import { Avatar, Flex } from 'antd';
  6. import classNames from 'classnames';
  7. import { get } from 'lodash';
  8. import { memo, useMemo } from 'react';
  9. import { NodeHandleId } from '../../constant';
  10. import { CommonHandle } from './handle';
  11. import { LeftHandleStyle, RightHandleStyle } from './handle-icon';
  12. import styles from './index.less';
  13. import NodeHeader from './node-header';
  14. import { NodeWrapper } from './node-wrapper';
  15. import { ToolBar } from './toolbar';
  16. function InnerRetrievalNode({
  17. id,
  18. data,
  19. isConnectable = true,
  20. selected,
  21. }: NodeProps<IRetrievalNode>) {
  22. const knowledgeBaseIds: string[] = get(data, 'form.kb_ids', []);
  23. const { list: knowledgeList } = useFetchKnowledgeList(true);
  24. const knowledgeBases = useMemo(() => {
  25. return knowledgeBaseIds.map((x) => {
  26. const item = knowledgeList.find((y) => x === y.id);
  27. return {
  28. name: item?.name,
  29. avatar: item?.avatar,
  30. id: x,
  31. };
  32. });
  33. }, [knowledgeList, knowledgeBaseIds]);
  34. return (
  35. <ToolBar selected={selected} id={id} label={data.label}>
  36. <NodeWrapper selected={selected}>
  37. <CommonHandle
  38. id={NodeHandleId.End}
  39. type="target"
  40. position={Position.Left}
  41. isConnectable={isConnectable}
  42. className={styles.handle}
  43. style={LeftHandleStyle}
  44. nodeId={id}
  45. ></CommonHandle>
  46. <CommonHandle
  47. id={NodeHandleId.Start}
  48. type="source"
  49. position={Position.Right}
  50. isConnectable={isConnectable}
  51. className={styles.handle}
  52. style={RightHandleStyle}
  53. nodeId={id}
  54. isConnectableEnd={false}
  55. ></CommonHandle>
  56. <NodeHeader
  57. id={id}
  58. name={data.name}
  59. label={data.label}
  60. className={classNames({
  61. [styles.nodeHeader]: knowledgeBaseIds.length > 0,
  62. })}
  63. ></NodeHeader>
  64. <Flex vertical gap={8}>
  65. {knowledgeBases.map((knowledge) => {
  66. return (
  67. <div className={styles.nodeText} key={knowledge.id}>
  68. <Flex align={'center'} gap={6}>
  69. <Avatar
  70. size={26}
  71. icon={<UserOutlined />}
  72. src={knowledge.avatar}
  73. />
  74. <Flex className={styles.knowledgeNodeName} flex={1}>
  75. {knowledge.name}
  76. </Flex>
  77. </Flex>
  78. </div>
  79. );
  80. })}
  81. </Flex>
  82. </NodeWrapper>
  83. </ToolBar>
  84. );
  85. }
  86. export const RetrievalNode = memo(InnerRetrievalNode);