feat: 添加对话应用选择和知识库切换功能
- 新增对话应用管理模块(dify-chat-apps),支持获取和切换对话应用 - 优化对话应用切换后自动刷新会话列表功能 - 知识库管理页面新增下拉选择器,支持切换不同知识库 - API 层支持 app_id 参数传递,实现多应用会话隔离 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
@@ -4,6 +4,7 @@ import type { Dataset } from '~/api/dify-dataset/type/datasetTypes';
|
||||
import type { Document } from '~/api/dify-dataset/type/documentTypes';
|
||||
import { fetchDatasets, fetchDataset } from '~/api/dify-dataset/api/datasetApi';
|
||||
import { fetchDocuments } from '~/api/dify-dataset/api/documentApi';
|
||||
import { getMyDatasets, type AreaDataset } from '~/api/v3/dify/area-datasets';
|
||||
import type { MenuTab } from '~/types/dify-dataset-manager/layout';
|
||||
import { DEFAULT_DOCUMENT_PAGE_SIZE } from '~/types/dify-dataset-manager/index';
|
||||
|
||||
@@ -15,6 +16,10 @@ export function useDatasetManager() {
|
||||
const [dataset, setDataset] = useState<Dataset | null>(null);
|
||||
const [loadingDataset, setLoadingDataset] = useState(true);
|
||||
|
||||
// 用户可访问的知识库列表(基于权限)
|
||||
const [availableDatasets, setAvailableDatasets] = useState<AreaDataset[]>([]);
|
||||
const [loadingAvailableDatasets, setLoadingAvailableDatasets] = useState(true);
|
||||
|
||||
// 文档状态
|
||||
const [documents, setDocuments] = useState<Document[]>([]);
|
||||
const [loadingDocuments, setLoadingDocuments] = useState(false);
|
||||
@@ -57,6 +62,56 @@ export function useDatasetManager() {
|
||||
}
|
||||
}, [documentPageSize]);
|
||||
|
||||
/**
|
||||
* 加载用户可访问的知识库列表(基于权限)
|
||||
*/
|
||||
const loadAvailableDatasets = useCallback(async () => {
|
||||
setLoadingAvailableDatasets(true);
|
||||
try {
|
||||
console.log('[DatasetManager] 加载用户可访问的知识库列表...');
|
||||
const response = await getMyDatasets();
|
||||
console.log('[DatasetManager] 用户知识库列表响应:', response);
|
||||
|
||||
if (response && response.code === 0 && response.data) {
|
||||
const dataList = Array.isArray(response.data.data) ? response.data.data : [];
|
||||
setAvailableDatasets(dataList);
|
||||
return dataList;
|
||||
} else {
|
||||
console.error('[DatasetManager] 获取用户知识库列表失败:', response);
|
||||
setAvailableDatasets([]);
|
||||
return [];
|
||||
}
|
||||
} catch (err: any) {
|
||||
console.error('[DatasetManager] 加载用户知识库列表失败:', err);
|
||||
setAvailableDatasets([]);
|
||||
return [];
|
||||
} finally {
|
||||
setLoadingAvailableDatasets(false);
|
||||
}
|
||||
}, []);
|
||||
|
||||
/**
|
||||
* 根据 dataset_id 加载知识库详情
|
||||
*/
|
||||
const loadDatasetById = useCallback(async (datasetId: string) => {
|
||||
setLoadingDataset(true);
|
||||
try {
|
||||
console.log('[DatasetManager] 加载知识库详情:', datasetId);
|
||||
const fullDataset = await fetchDataset(datasetId);
|
||||
console.log('[DatasetManager] 知识库详情响应:', fullDataset);
|
||||
|
||||
setDataset(fullDataset);
|
||||
// 立即加载文档
|
||||
await loadDocuments(datasetId, 1);
|
||||
} catch (err: any) {
|
||||
console.error('[DatasetManager] 加载知识库详情失败:', err);
|
||||
setError(err.message || '加载知识库失败');
|
||||
message.error('加载知识库失败');
|
||||
} finally {
|
||||
setLoadingDataset(false);
|
||||
}
|
||||
}, [loadDocuments]);
|
||||
|
||||
/**
|
||||
* 加载知识库(获取第一个知识库,再获取详情以包含 retrieval_model)
|
||||
*/
|
||||
@@ -64,22 +119,40 @@ export function useDatasetManager() {
|
||||
setLoadingDataset(true);
|
||||
try {
|
||||
console.log('[DatasetManager] 加载知识库...');
|
||||
// 先获取列表,找到第一个知识库的 ID
|
||||
const response = await fetchDatasets(1, 1);
|
||||
console.log('[DatasetManager] 知识库列表响应:', response);
|
||||
|
||||
if (response && response.data && response.data.length > 0) {
|
||||
const firstDatasetId = response.data[0].id;
|
||||
// 先加载用户可访问的知识库列表
|
||||
const userDatasets = await loadAvailableDatasets();
|
||||
|
||||
// 再获取详情,包含完整的 retrieval_model 等字段
|
||||
const fullDataset = await fetchDataset(firstDatasetId);
|
||||
if (userDatasets.length > 0) {
|
||||
// 找到默认知识库或第一个知识库
|
||||
const defaultDataset = userDatasets.find(ds => ds.is_default) || userDatasets[0];
|
||||
const datasetId = defaultDataset.dataset_id;
|
||||
|
||||
console.log('[DatasetManager] 使用知识库:', defaultDataset.dataset_name, datasetId);
|
||||
|
||||
// 获取知识库详情
|
||||
const fullDataset = await fetchDataset(datasetId);
|
||||
console.log('[DatasetManager] 知识库详情响应:', fullDataset);
|
||||
|
||||
setDataset(fullDataset);
|
||||
// 立即加载文档
|
||||
await loadDocuments(firstDatasetId, 1);
|
||||
await loadDocuments(datasetId, 1);
|
||||
} else {
|
||||
setError('未找到知识库,请先在Dify中创建知识库');
|
||||
// 回退到原有逻辑:直接从 Dify 获取
|
||||
console.log('[DatasetManager] 用户无绑定知识库,使用默认逻辑...');
|
||||
const response = await fetchDatasets(1, 1);
|
||||
console.log('[DatasetManager] Dify知识库列表响应:', response);
|
||||
|
||||
if (response && response.data && response.data.length > 0) {
|
||||
const firstDatasetId = response.data[0].id;
|
||||
const fullDataset = await fetchDataset(firstDatasetId);
|
||||
console.log('[DatasetManager] 知识库详情响应:', fullDataset);
|
||||
|
||||
setDataset(fullDataset);
|
||||
await loadDocuments(firstDatasetId, 1);
|
||||
} else {
|
||||
setError('未找到知识库,请先在Dify中创建知识库');
|
||||
}
|
||||
}
|
||||
} catch (err: any) {
|
||||
console.error('[DatasetManager] 加载知识库失败:', err);
|
||||
@@ -89,7 +162,19 @@ export function useDatasetManager() {
|
||||
setLoadingDataset(false);
|
||||
setInited(true);
|
||||
}
|
||||
}, [loadDocuments]);
|
||||
}, [loadDocuments, loadAvailableDatasets]);
|
||||
|
||||
/**
|
||||
* 切换知识库
|
||||
*/
|
||||
const handleDatasetChange = useCallback(async (datasetId: string) => {
|
||||
console.log('[DatasetManager] 切换知识库:', datasetId);
|
||||
// 重置状态
|
||||
setSelectedDocument(null);
|
||||
setActiveTab('documents');
|
||||
// 加载新知识库
|
||||
await loadDatasetById(datasetId);
|
||||
}, [loadDatasetById]);
|
||||
|
||||
/**
|
||||
* 处理文档页码变化
|
||||
@@ -190,7 +275,11 @@ export function useDatasetManager() {
|
||||
error,
|
||||
activeTab,
|
||||
selectedDocument,
|
||||
|
||||
|
||||
// 知识库列表(基于权限)
|
||||
availableDatasets,
|
||||
loadingAvailableDatasets,
|
||||
|
||||
// 方法
|
||||
loadDataset,
|
||||
loadDocuments,
|
||||
@@ -202,6 +291,7 @@ export function useDatasetManager() {
|
||||
handleBackToDocuments,
|
||||
handleTabChange,
|
||||
handleDatasetUpdated,
|
||||
handleDatasetChange,
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user