mirror of
https://github.com/infiniflow/ragflow.git
synced 2026-08-04 23:00:30 +08:00
feat(api): add unified index API and dataset management endpoints (#14222)
### What problem does this PR solve?
## Summary
Refactor the dataset API layer into a clean service/REST separation
pattern, add a unified `/index` API for graph/raptor/mindmap operations,
and introduce several new dataset management endpoints with full test
coverage.
## Changes
### Service Layer (`dataset_api_service.py`)
- Added `trace_index(dataset_id, tenant_id, index_type)` — unified trace
function for all index types
- Added `run_index`, `delete_index` service functions
- Added `get_dataset`, `get_ingestion_summary`, `list_ingestion_logs`,
`get_ingestion_log`
- Added `run_embedding`, `list_tags`, `aggregate_tags`, `delete_tags`,
`rename_tag`
- Added `get_flattened_metadata`, `get_auto_metadata`,
`update_auto_metadata`
### REST API Layer (`dataset_api.py`)
**New unified routes:**
| Method | Route | Description |
|--------|-------|-------------|
| POST | `/datasets/<id>/index?type=graph\|raptor\|mindmap` | Run index
task |
| GET | `/datasets/<id>/index?type=graph\|raptor\|mindmap` | Trace index
task |
| DELETE | `/datasets/<id>/<index_type>` | Delete index |
| GET | `/datasets/<id>` | Get dataset details |
| GET | `/datasets/<id>/ingestions/summary` | Ingestion summary |
| GET | `/datasets/<id>/ingestions` | List ingestion logs |
| GET | `/datasets/<id>/ingestions/<log_id>` | Get single ingestion log
|
| POST | `/datasets/<id>/embedding` | Run embedding |
| GET | `/datasets/<id>/tags` | List tags |
| GET | `/datasets/tags/aggregation` | Aggregate tags across datasets |
| DELETE | `/datasets/<id>/tags` | Delete tags |
| PUT | `/datasets/<id>/tags` | Rename tag |
| GET | `/datasets/metadata/flattened` | Get flattened metadata |
| GET/PUT | `/datasets/<id>/metadata/config` | New metadata config path
|
**Removed routes (replaced by unified `/index`):**
- `POST /datasets/<id>/mindmap`
- `GET /datasets/<id>/mindmap`
**Preserved legacy routes (backward compatibility):**
- `/run_graphrag`, `/trace_graphrag`, `/run_raptor`, `/trace_raptor`
- `/auto_metadata` GET/PUT
### Test Suite
- Updated `common.py` helpers: added `trace_index`, removed
`run_mindmap`/`trace_mindmap`
- Added 7 new test files with 39 test cases total:
| Test File | Cases |
|-----------|-------|
| `test_get_dataset.py` | 4 |
| `test_ingestion_summary.py` | 2 |
| `test_ingestion_logs.py` | 5 |
| `test_index_api.py` | 14 |
| `test_embedding.py` | 2 |
| `test_tags.py` | 8 |
| `test_flattened_metadata.py` | 4 |
- Deleted `test_mindmap_tasks.py` (covered by unified index tests)
## Design Decisions
1. **Unified `/index?type=...`** — single endpoint replaces 3 separate
route pairs for graph/raptor/mindmap
2. **Backward compatibility** — old routes (`/run_graphrag`,
`/run_raptor`, `/auto_metadata`) preserved alongside new paths
3. **`_VALID_INDEX_TYPES = {"graph", "raptor", "mindmap"}`** — input
validation via constant set
4. **`_INDEX_TYPE_TO_TASK_ID_FIELD`** — maps index type to KB model task
ID field for clean dispatch
## Files Changed
- `api/apps/restful_apis/dataset_api.py`
- `api/apps/services/dataset_api_service.py`
- `sdk/python/ragflow_sdk/modules/dataset.py`
- `test/testcases/test_http_api/common.py`
- `test/testcases/test_http_api/test_dataset_management/` (7 new files)
### Type of change
- [x] New Feature (non-breaking change which adds functionality)
- [x] Refactoring
---------
Signed-off-by: noob <yixiao121314@outlook.com>
This commit is contained in:
@@ -57,46 +57,50 @@ export default {
|
||||
|
||||
// knowledge base
|
||||
|
||||
checkEmbedding: `${webAPI}/kb/check_embedding`,
|
||||
checkEmbedding: (datasetId: string) =>
|
||||
`${restAPIv1}/datasets/${datasetId}/embedding`,
|
||||
kbList: `${restAPIv1}/datasets`,
|
||||
createKb: `${restAPIv1}/datasets`,
|
||||
updateKb: (datasetId: string) => `${restAPIv1}/datasets/${datasetId}`,
|
||||
rmKb: `${restAPIv1}/datasets`,
|
||||
getKbDetail: `${webAPI}/kb/detail`,
|
||||
getKbDetail: (datasetId: string) => `${restAPIv1}/datasets/${datasetId}`,
|
||||
getKnowledgeGraph: (knowledgeId: string) =>
|
||||
`${restAPIv1}/datasets/${knowledgeId}/knowledge_graph`,
|
||||
`${restAPIv1}/datasets/${knowledgeId}/graph/search`,
|
||||
deleteKnowledgeGraph: (knowledgeId: string) =>
|
||||
`${restAPIv1}/datasets/${knowledgeId}/knowledge_graph`,
|
||||
getMeta: `${webAPI}/kb/get_meta`,
|
||||
getKnowledgeBasicInfo: `${webAPI}/kb/basic_info`,
|
||||
`${restAPIv1}/datasets/${knowledgeId}/graph`,
|
||||
getMeta: `${restAPIv1}/datasets/metadata/flattened`,
|
||||
getKnowledgeBasicInfo: (datasetId: string) =>
|
||||
`${restAPIv1}/datasets/${datasetId}/ingestions/summary`,
|
||||
// data pipeline log
|
||||
fetchDataPipelineLog: `${webAPI}/kb/list_pipeline_logs`,
|
||||
getPipelineDetail: `${webAPI}/kb/pipeline_log_detail`,
|
||||
fetchPipelineDatasetLogs: `${webAPI}/kb/list_pipeline_dataset_logs`,
|
||||
runGraphRag: (datasetId: string) =>
|
||||
`${restAPIv1}/datasets/${datasetId}/run_graphrag`,
|
||||
traceGraphRag: (datasetId: string) =>
|
||||
`${restAPIv1}/datasets/${datasetId}/trace_graphrag`,
|
||||
runRaptor: (datasetId: string) =>
|
||||
`${restAPIv1}/datasets/${datasetId}/run_raptor`,
|
||||
traceRaptor: (datasetId: string) =>
|
||||
`${restAPIv1}/datasets/${datasetId}/trace_raptor`,
|
||||
unbindPipelineTask: ({ kb_id, type }: { kb_id: string; type: string }) =>
|
||||
`${webAPI}/kb/unbind_task?kb_id=${kb_id}&pipeline_task_type=${type}`,
|
||||
pipelineRerun: `${restAPIv1}/agents/rerun`,
|
||||
fetchDataPipelineLog: (datasetId: string) =>
|
||||
`${restAPIv1}/datasets/${datasetId}/ingestions`,
|
||||
getPipelineDetail: (datasetId: string, logId: string) =>
|
||||
`${restAPIv1}/datasets/${datasetId}/ingestions/${logId}`,
|
||||
fetchPipelineDatasetLogs: (datasetId: string) =>
|
||||
`${restAPIv1}/datasets/${datasetId}/ingestions`,
|
||||
runIndex: (datasetId: string, indexType: string) =>
|
||||
`${restAPIv1}/datasets/${datasetId}/index?type=${indexType}`,
|
||||
traceIndex: (datasetId: string, indexType: string) =>
|
||||
`${restAPIv1}/datasets/${datasetId}/index?type=${indexType}`,
|
||||
unbindPipelineTask: (datasetId: string, indexType: string) =>
|
||||
`${restAPIv1}/datasets/${datasetId}/${indexType}`,
|
||||
pipelineRerun: `${webAPI}/canvas/rerun`,
|
||||
getMetaData: (datasetId: string) =>
|
||||
`${restAPIv1}/datasets/${datasetId}/metadata/summary`,
|
||||
updateDocumentsMetadata: (datasetId: string) =>
|
||||
`${restAPIv1}/datasets/${datasetId}/documents/metadatas`,
|
||||
kbUpdateMetaData: `${webAPI}/kb/update_metadata_setting`,
|
||||
kbUpdateMetaData: (datasetId: string) =>
|
||||
`${restAPIv1}/datasets/${datasetId}/metadata/config`,
|
||||
documentUpdateMetaDataConfig: (datasetId: string, documentId: string) =>
|
||||
`${restAPIv1}/datasets/${datasetId}/documents/${documentId}/metadata/config`,
|
||||
|
||||
// tags
|
||||
listTag: (knowledgeId: string) => `${webAPI}/kb/${knowledgeId}/tags`,
|
||||
listTagByKnowledgeIds: `${webAPI}/kb/tags`,
|
||||
removeTag: (knowledgeId: string) => `${webAPI}/kb/${knowledgeId}/rm_tags`,
|
||||
renameTag: (knowledgeId: string) => `${webAPI}/kb/${knowledgeId}/rename_tag`,
|
||||
listTag: (knowledgeId: string) => `${restAPIv1}/datasets/${knowledgeId}/tags`,
|
||||
listTagByKnowledgeIds: `${restAPIv1}/datasets/tags/aggregation`,
|
||||
removeTag: (knowledgeId: string) =>
|
||||
`${restAPIv1}/datasets/${knowledgeId}/tags`,
|
||||
renameTag: (knowledgeId: string) =>
|
||||
`${restAPIv1}/datasets/${knowledgeId}/tags`,
|
||||
|
||||
// chunk
|
||||
chunkList: (datasetId: string, documentId: string) =>
|
||||
|
||||
@@ -84,8 +84,7 @@ const API_WHITELIST = [
|
||||
'/v1/canvas/setting',
|
||||
'/api/v1/searches/',
|
||||
'/api/v1/memories',
|
||||
'/v1/kb/create',
|
||||
'/v1/kb/update',
|
||||
'/api/v1/datasets',
|
||||
'/v1/dataflow/set',
|
||||
];
|
||||
|
||||
|
||||
Reference in New Issue
Block a user