Bug Fix: Fix workflow knowledge retrieval cache bug (#23597)

Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: crazywoola <100913391+crazywoola@users.noreply.github.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
This commit is contained in:
yunqiqiliang
2025-08-08 11:42:20 +08:00
committed by GitHub
parent 1c60b7f070
commit f73ec60311
3 changed files with 26 additions and 17 deletions

View File

@@ -5,6 +5,7 @@ import { useRouter } from 'next/navigation'
import { useCallback, useEffect, useState } from 'react' import { useCallback, useEffect, useState } from 'react'
import { useTranslation } from 'react-i18next' import { useTranslation } from 'react-i18next'
import { RiMoreFill } from '@remixicon/react' import { RiMoreFill } from '@remixicon/react'
import { mutate } from 'swr'
import cn from '@/utils/classnames' import cn from '@/utils/classnames'
import Confirm from '@/app/components/base/confirm' import Confirm from '@/app/components/base/confirm'
import { ToastContext } from '@/app/components/base/toast' import { ToastContext } from '@/app/components/base/toast'
@@ -57,6 +58,19 @@ const DatasetCard = ({
const onConfirmDelete = useCallback(async () => { const onConfirmDelete = useCallback(async () => {
try { try {
await deleteDataset(dataset.id) await deleteDataset(dataset.id)
// Clear SWR cache to prevent stale data in knowledge retrieval nodes
mutate(
(key) => {
if (typeof key === 'string') return key.includes('/datasets')
if (typeof key === 'object' && key !== null)
return key.url === '/datasets' || key.url?.includes('/datasets')
return false
},
undefined,
{ revalidate: true },
)
notify({ type: 'success', message: t('dataset.datasetDeleted') }) notify({ type: 'success', message: t('dataset.datasetDeleted') })
if (onSuccess) if (onSuccess)
onSuccess() onSuccess()

View File

@@ -4,7 +4,6 @@ import React, { useRef, useState } from 'react'
import { useGetState, useInfiniteScroll } from 'ahooks' import { useGetState, useInfiniteScroll } from 'ahooks'
import { useTranslation } from 'react-i18next' import { useTranslation } from 'react-i18next'
import Link from 'next/link' import Link from 'next/link'
import produce from 'immer'
import TypeIcon from '../type-icon' import TypeIcon from '../type-icon'
import Modal from '@/app/components/base/modal' import Modal from '@/app/components/base/modal'
import type { DataSet } from '@/models/datasets' import type { DataSet } from '@/models/datasets'
@@ -29,9 +28,10 @@ const SelectDataSet: FC<ISelectDataSetProps> = ({
onSelect, onSelect,
}) => { }) => {
const { t } = useTranslation() const { t } = useTranslation()
const [selected, setSelected] = React.useState<DataSet[]>(selectedIds.map(id => ({ id }) as any)) const [selected, setSelected] = React.useState<DataSet[]>([])
const [loaded, setLoaded] = React.useState(false) const [loaded, setLoaded] = React.useState(false)
const [datasets, setDataSets] = React.useState<DataSet[] | null>(null) const [datasets, setDataSets] = React.useState<DataSet[] | null>(null)
const [hasInitialized, setHasInitialized] = React.useState(false)
const hasNoData = !datasets || datasets?.length === 0 const hasNoData = !datasets || datasets?.length === 0
const canSelectMulti = true const canSelectMulti = true
@@ -49,19 +49,17 @@ const SelectDataSet: FC<ISelectDataSetProps> = ({
const newList = [...(datasets || []), ...data.filter(item => item.indexing_technique || item.provider === 'external')] const newList = [...(datasets || []), ...data.filter(item => item.indexing_technique || item.provider === 'external')]
setDataSets(newList) setDataSets(newList)
setLoaded(true) setLoaded(true)
if (!selected.find(item => !item.name))
return { list: [] }
const newSelected = produce(selected, (draft) => { // Initialize selected datasets based on selectedIds and available datasets
selected.forEach((item, index) => { if (!hasInitialized) {
if (!item.name) { // not fetched database if (selectedIds.length > 0) {
const newItem = newList.find(i => i.id === item.id) const validSelectedDatasets = selectedIds
if (newItem) .map(id => newList.find(item => item.id === id))
draft[index] = newItem .filter(Boolean) as DataSet[]
setSelected(validSelectedDatasets)
}
setHasInitialized(true)
} }
})
})
setSelected(newSelected)
} }
return { list: [] } return { list: [] }
}, },

View File

@@ -3,9 +3,6 @@ const translation = {
welcome: 'आपका स्वागत है', welcome: 'आपका स्वागत है',
appUnavailable: 'ऐप उपलब्ध नहीं है', appUnavailable: 'ऐप उपलब्ध नहीं है',
appUnknownError: 'अज्ञात त्रुटि, कृपया पुनः प्रयास करें', appUnknownError: 'अज्ञात त्रुटि, कृपया पुनः प्रयास करें',
// @ts-expect-error TODO: fix this
appUnknownError: 'ऐप अनुपलब्ध है',
}, },
chat: { chat: {
newChat: 'नया चैट', newChat: 'नया चैट',