mirror of
https://github.com/infiniflow/ragflow.git
synced 2026-08-12 03:33:33 +08:00
Feat: full optimization on connector dashboard (#14979)
### What problem does this PR solve? This PR improves the connector dashboard task management experience and adds better visibility into connector execution logs. ### Overview: #### Before <img width="700" alt="image" src="https://github.com/user-attachments/assets/e4a8ed6f-2e18-4f0f-8528-41a514550052" /> #### Now: <img width="700" alt="Screenshot from 2026-05-18 16-31-30" src="https://github.com/user-attachments/assets/d4ca193b-847a-49ae-9e4f-5fbca60ea627" /> ### 1. Add a new logging page to the connector dashboard A new logging page has been added so users can view connector task execution logs directly from the connector dashboard. ### 2. Merge the Resume button into Confirm The separate **Resume** button has been removed. The **Confirm** button now represents different actions depending on the current task state: - **Save**: Save form changes and reschedule tasks. - **Stop**: Cancel currently scheduled or running tasks. - **Resume**: Create new scheduled tasks after the previous tasks have been stopped. - **Start**: Start tasks when no task has been started yet. ### 3. Separate syncing and pruning tasks Connector tasks are now separated into **syncing** and **pruning**. Pruning is controlled by the **Sync deleted files** option: - When **Sync deleted files** is disabled, only syncing tasks are shown. - When **Sync deleted files** is enabled, both syncing and pruning tasks are shown. **Now: Sync deleted files disabled** <img width="700" alt="Sync deleted files disabled" src="https://github.com/user-attachments/assets/dbd9232e-614a-407f-a0b1-c109e5fa567d" /> **Now: Sync deleted files enabled** <img width="700" alt="Sync deleted files enabled" src="https://github.com/user-attachments/assets/1f527f48-ccb3-4ee8-97ca-086891489296" /> ### 4. Update logs in backend <img width="700" alt="image" src="https://github.com/user-attachments/assets/10a95a3f-98c1-4e67-8afa-ddf6cda5b0b2" /> ### 5. Remove connector resume API - Removed: `POST /v1/connectors/<connector_id>/resume` - Replaced by: `PATCH /v1/connectors/<connector_id>` ### Type of change - [x] New Feature (non-breaking change which adds functionality)
This commit is contained in:
@@ -53,17 +53,34 @@ async def update_connector(connector_id):
|
||||
return _connector_auth_error(connector_id, current_user.id)
|
||||
|
||||
req = await get_request_json()
|
||||
if isinstance(req, dict) and isinstance(req.get("data"), dict):
|
||||
req = req["data"]
|
||||
|
||||
e, conn = ConnectorService.get_by_id(connector_id)
|
||||
if not e:
|
||||
return get_data_error_result(message="Can't find this Connector!")
|
||||
|
||||
should_sleep = False
|
||||
if req:
|
||||
conn = {fld: req[fld] for fld in ["prune_freq", "refresh_freq", "config", "timeout_secs"] if fld in req}
|
||||
conn["id"] = connector_id
|
||||
ConnectorService.update_by_id(connector_id, conn)
|
||||
update_fields = {fld: req[fld] for fld in ["prune_freq", "refresh_freq", "config", "timeout_secs"] if fld in req}
|
||||
if update_fields:
|
||||
update_fields["id"] = connector_id
|
||||
ConnectorService.update_by_id(connector_id, update_fields)
|
||||
should_sleep = True
|
||||
|
||||
await asyncio.sleep(1)
|
||||
if req.get("reschedule"):
|
||||
ConnectorService.cancel_tasks(connector_id)
|
||||
ConnectorService.schedule_tasks(connector_id)
|
||||
elif req.get("status") in [TaskStatus.CANCEL, "CANCEL"]:
|
||||
ConnectorService.cancel_tasks(connector_id)
|
||||
elif req.get("status") in [TaskStatus.SCHEDULE, "SCHEDULE"]:
|
||||
ConnectorService.schedule_tasks(connector_id)
|
||||
|
||||
if should_sleep:
|
||||
await asyncio.sleep(1)
|
||||
e, conn = ConnectorService.get_by_id(connector_id)
|
||||
if not e:
|
||||
return get_data_error_result(message="Can't find this Connector!")
|
||||
|
||||
return get_json_result(data=conn.to_dict())
|
||||
|
||||
@@ -83,9 +100,9 @@ async def create_connector():
|
||||
"input_type": InputType.POLL,
|
||||
"config": req["config"],
|
||||
"refresh_freq": int(req.get("refresh_freq", 5)),
|
||||
"prune_freq": int(req.get("prune_freq", 720)),
|
||||
"prune_freq": int(req.get("prune_freq", 5)),
|
||||
"timeout_secs": int(req.get("timeout_secs", 60 * 29)),
|
||||
"status": TaskStatus.SCHEDULE,
|
||||
"status": TaskStatus.UNSTART,
|
||||
}
|
||||
ConnectorService.save(**conn)
|
||||
|
||||
@@ -127,21 +144,6 @@ def list_logs(connector_id):
|
||||
return get_json_result(data={"total": total, "logs": arr})
|
||||
|
||||
|
||||
@manager.route("/connectors/<connector_id>/resume", methods=["POST"]) # noqa: F821
|
||||
@login_required
|
||||
async def resume(connector_id):
|
||||
"""Resume or cancel sync for an accessible connector."""
|
||||
if not ConnectorService.accessible(connector_id, current_user.id):
|
||||
return _connector_auth_error(connector_id, current_user.id)
|
||||
|
||||
req = await get_request_json()
|
||||
if req.get("resume"):
|
||||
ConnectorService.resume(connector_id, TaskStatus.SCHEDULE)
|
||||
else:
|
||||
ConnectorService.resume(connector_id, TaskStatus.CANCEL)
|
||||
return get_json_result(data=True)
|
||||
|
||||
|
||||
@manager.route("/connectors/<connector_id>/rebuild", methods=["POST"]) # noqa: F821
|
||||
@login_required
|
||||
async def rebuild(connector_id):
|
||||
@@ -166,7 +168,7 @@ def rm_connector(connector_id):
|
||||
if not ConnectorService.accessible(connector_id, current_user.id):
|
||||
return _connector_auth_error(connector_id, current_user.id)
|
||||
|
||||
ConnectorService.resume(connector_id, TaskStatus.CANCEL)
|
||||
ConnectorService.cancel_tasks(connector_id)
|
||||
ConnectorService.delete_by_id(connector_id)
|
||||
return get_json_result(data=True)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user