소스 검색

fix: enhance chunk list management with new invalidation keys and imp… (#12396)

ok
tags/0.15.0
Wu Tianwei 9 달 전
부모
커밋
34519de3b7
No account linked to committer's email address
3개의 변경된 파일60개의 추가작업 그리고 25개의 파일을 삭제
  1. 50
    20
      web/app/components/datasets/documents/detail/completed/index.tsx
  2. 6
    3
      web/service/knowledge/use-segment.ts
  3. 4
    2
      web/service/use-base.ts

+ 50
- 20
web/app/components/datasets/documents/detail/completed/index.tsx 파일 보기

import { import {
useChildSegmentList, useChildSegmentList,
useChildSegmentListKey, useChildSegmentListKey,
useChunkListAllKey,
useChunkListDisabledKey,
useChunkListEnabledKey,
useDeleteChildSegment, useDeleteChildSegment,
useDeleteSegment, useDeleteSegment,
useDisableSegment, useDisableSegment,
page: isFullDocMode ? 1 : currentPage, page: isFullDocMode ? 1 : currentPage,
limit: isFullDocMode ? 10 : limit, limit: isFullDocMode ? 10 : limit,
keyword: isFullDocMode ? '' : searchValue, keyword: isFullDocMode ? '' : searchValue,
enabled: selectedStatus === 'all' ? 'all' : !!selectedStatus,
enabled: selectedStatus,
}, },
}, },
currentPage === 0,
) )
const invalidSegmentList = useInvalid(useSegmentListKey) const invalidSegmentList = useInvalid(useSegmentListKey)


useEffect(() => { useEffect(() => {
if (segmentListData) { if (segmentListData) {
setSegments(segmentListData.data || []) setSegments(segmentListData.data || [])
if (segmentListData.total_pages < currentPage)
setCurrentPage(segmentListData.total_pages)
const totalPages = segmentListData.total_pages
if (totalPages < currentPage)
setCurrentPage(totalPages === 0 ? 1 : totalPages)
} }
// eslint-disable-next-line react-hooks/exhaustive-deps // eslint-disable-next-line react-hooks/exhaustive-deps
}, [segmentListData]) }, [segmentListData])
documentId, documentId,
segmentId: segments[0]?.id || '', segmentId: segments[0]?.id || '',
params: { params: {
page: currentPage,
page: currentPage === 0 ? 1 : currentPage,
limit, limit,
keyword: searchValue, keyword: searchValue,
}, },
}, },
!isFullDocMode || segments.length === 0 || currentPage === 0,
!isFullDocMode || segments.length === 0,
) )
const invalidChildSegmentList = useInvalid(useChildSegmentListKey) const invalidChildSegmentList = useInvalid(useChildSegmentListKey)


useEffect(() => { useEffect(() => {
if (childChunkListData) { if (childChunkListData) {
setChildSegments(childChunkListData.data || []) setChildSegments(childChunkListData.data || [])
if (childChunkListData.total_pages < currentPage)
setCurrentPage(childChunkListData.total_pages)
const totalPages = childChunkListData.total_pages
if (totalPages < currentPage)
setCurrentPage(totalPages === 0 ? 1 : totalPages)
} }
// eslint-disable-next-line react-hooks/exhaustive-deps // eslint-disable-next-line react-hooks/exhaustive-deps
}, [childChunkListData]) }, [childChunkListData])


const resetList = useCallback(() => { const resetList = useCallback(() => {
setSegments([])
setSelectedSegmentIds([]) setSelectedSegmentIds([])
invalidSegmentList() invalidSegmentList()
// eslint-disable-next-line react-hooks/exhaustive-deps // eslint-disable-next-line react-hooks/exhaustive-deps
}, []) }, [])


const resetChildList = useCallback(() => { const resetChildList = useCallback(() => {
setChildSegments([])
invalidChildSegmentList() invalidChildSegmentList()
// eslint-disable-next-line react-hooks/exhaustive-deps // eslint-disable-next-line react-hooks/exhaustive-deps
}, []) }, [])


const { mutateAsync: enableSegment } = useEnableSegment() const { mutateAsync: enableSegment } = useEnableSegment()
const { mutateAsync: disableSegment } = useDisableSegment() const { mutateAsync: disableSegment } = useDisableSegment()
const invalidChunkListAll = useInvalid(useChunkListAllKey)
const invalidChunkListEnabled = useInvalid(useChunkListEnabledKey)
const invalidChunkListDisabled = useInvalid(useChunkListDisabledKey)

const refreshChunkListWithStatusChanged = () => {
switch (selectedStatus) {
case 'all':
invalidChunkListDisabled()
invalidChunkListEnabled()
break
default:
invalidSegmentList()
}
}


const onChangeSwitch = useCallback(async (enable: boolean, segId?: string) => { const onChangeSwitch = useCallback(async (enable: boolean, segId?: string) => {
const operationApi = enable ? enableSegment : disableSegment const operationApi = enable ? enableSegment : disableSegment
seg.enabled = enable seg.enabled = enable
} }
setSegments([...segments]) setSegments([...segments])
refreshChunkListWithStatusChanged()
}, },
onError: () => { onError: () => {
notify({ type: 'error', message: t('common.actionMsg.modifiedUnsuccessfully') }) notify({ type: 'error', message: t('common.actionMsg.modifiedUnsuccessfully') })


const { mutateAsync: updateSegment } = useUpdateSegment() const { mutateAsync: updateSegment } = useUpdateSegment()


const refreshChunkListDataWithDetailChanged = () => {
switch (selectedStatus) {
case 'all':
invalidChunkListDisabled()
invalidChunkListEnabled()
break
case true:
invalidChunkListAll()
invalidChunkListDisabled()
break
case false:
invalidChunkListAll()
invalidChunkListEnabled()
break
}
}

const handleUpdateSegment = useCallback(async ( const handleUpdateSegment = useCallback(async (
segmentId: string, segmentId: string,
question: string, question: string,
} }
} }
setSegments([...segments]) setSegments([...segments])
refreshChunkListDataWithDetailChanged()
eventEmitter?.emit('update-segment-success') eventEmitter?.emit('update-segment-success')
}, },
onSettled() { onSettled() {
seg.child_chunks?.push(newChildChunk!) seg.child_chunks?.push(newChildChunk!)
} }
setSegments([...segments]) setSegments([...segments])
refreshChunkListDataWithDetailChanged()
} }
else { else {
resetChildList() resetChildList()
} }
} }
setSegments([...segments]) setSegments([...segments])
refreshChunkListDataWithDetailChanged()
} }
else { else {
for (const childSeg of childSegments) {
if (childSeg.id === childChunkId) {
childSeg.content = res.data.content
childSeg.type = res.data.type
childSeg.word_count = res.data.word_count
childSeg.updated_at = res.data.updated_at
}
}
setChildSegments([...childSegments])
resetChildList()
} }
}, },
onSettled: () => { onSettled: () => {
<SimpleSelect <SimpleSelect
onSelect={onChangeStatus} onSelect={onChangeStatus}
items={statusList.current} items={statusList.current}
defaultValue={'all'}
defaultValue={selectedStatus === 'all' ? 'all' : selectedStatus ? 1 : 0}
className={s.select} className={s.select}
wrapperClassName='h-fit mr-2' wrapperClassName='h-fit mr-2'
optionWrapClassName='w-[160px]' optionWrapClassName='w-[160px]'
optionClassName='p-0' optionClassName='p-0'
renderOption={({ item, selected }) => <StatusItem item={item} selected={selected} />} renderOption={({ item, selected }) => <StatusItem item={item} selected={selected} />}
notClearable
/> />
<Input <Input
showLeftIcon showLeftIcon

+ 6
- 3
web/service/knowledge/use-segment.ts 파일 보기

const NAME_SPACE = 'segment' const NAME_SPACE = 'segment'


export const useSegmentListKey = [NAME_SPACE, 'chunkList'] export const useSegmentListKey = [NAME_SPACE, 'chunkList']
export const useChunkListEnabledKey = [NAME_SPACE, 'chunkList', { enabled: true }]
export const useChunkListDisabledKey = [NAME_SPACE, 'chunkList', { enabled: false }]
export const useChunkListAllKey = [NAME_SPACE, 'chunkList', { enabled: 'all' }]


export const useSegmentList = ( export const useSegmentList = (
payload: { payload: {
page: number page: number
limit: number limit: number
keyword: string keyword: string
enabled: boolean | 'all'
enabled: boolean | 'all' | ''
} }
}, },
disable?: boolean, disable?: boolean,
const { datasetId, documentId, params } = payload const { datasetId, documentId, params } = payload
const { page, limit, keyword, enabled } = params const { page, limit, keyword, enabled } = params
return useQuery<SegmentsResponse>({ return useQuery<SegmentsResponse>({
queryKey: [...useSegmentListKey, datasetId, documentId, page, limit, keyword, enabled],
queryKey: [...useSegmentListKey, { datasetId, documentId, page, limit, keyword, enabled }],
queryFn: () => { queryFn: () => {
return get<SegmentsResponse>(`/datasets/${datasetId}/documents/${documentId}/segments`, { params }) return get<SegmentsResponse>(`/datasets/${datasetId}/documents/${documentId}/segments`, { params })
}, },
const { datasetId, documentId, segmentId, params } = payload const { datasetId, documentId, segmentId, params } = payload
const { page, limit, keyword } = params const { page, limit, keyword } = params
return useQuery({ return useQuery({
queryKey: [...useChildSegmentListKey, datasetId, documentId, segmentId, page, limit, keyword],
queryKey: [...useChildSegmentListKey, { datasetId, documentId, segmentId, page, limit, keyword }],
queryFn: () => { queryFn: () => {
return get<ChildSegmentsResponse>(`/datasets/${datasetId}/documents/${documentId}/segments/${segmentId}/child_chunks`, { params }) return get<ChildSegmentsResponse>(`/datasets/${datasetId}/documents/${documentId}/segments/${segmentId}/child_chunks`, { params })
}, },

+ 4
- 2
web/service/use-base.ts 파일 보기

import { import {
type QueryKey,
useQueryClient, useQueryClient,
} from '@tanstack/react-query' } from '@tanstack/react-query'


export const useInvalid = (key: string[]) => {
export const useInvalid = (key: QueryKey) => {
const queryClient = useQueryClient() const queryClient = useQueryClient()
return () => { return () => {
queryClient.invalidateQueries( queryClient.invalidateQueries(
{ {
queryKey: key, queryKey: key,
})
},
)
} }
} }

Loading…
취소
저장