Hacktoberfest 2026:维护者为十月标记出来的 issue,仍然开放、适合新手。 浏览 Hacktoberfest issue

File tools (upload/create folder/move/copy/delete) always report success, even when the WebDAV request fails

未关闭 适合新手
#242 0 条评论 0 个 reaction 已指派 0 人 在 GitHub 查看

还没有人认领这个 Issue。

评估

难度
2/5
预计耗时
1-3 小时
新手友好度
85/100
Issue 类型
缺陷
描述清晰度
描述清楚
活跃度
活跃
技术栈
python
领域
backend

调研方向

从 ex_app/lib/all_tools/files.py 开始,检查 upload_file、create_folder、move_file、copy_file 和 delete_file 以及它们的 WebDAV 响应。重现缺少父文件夹的情况,或者先检查现有的请求处理逻辑。完成标准是:每个非 2xx 响应都被报告为错误,并且成功的操作仍然报告成功。

由索引模型根据 Issue 内容生成。

描述

Version: context_agent 2.8.0

Steps to reproduce

  1. Ask the agent: "Create a file named test.md in folder /does-not-exist with content: hello", approve the action.
  2. The agent answers "I have successfully created the file…" but no file exists (the WebDAV PUT returned an error because the parent folder is missing).

Cause: ex_app/lib/all_tools/files.py — upload_file, create_folder, move_file, copy_file, delete_file send the request and
return {"status": "success", ...} without looking at response.status_code. The model then tells the user the action succeeded.

Impact: users are told work was done when it was not (silent data loss / false confirmation).

Fix (tested): check the status code and return an error object for non-2xx so the model reports the failure. Patch below.

Patch (tested on a test instance):

--- a/ex_app/lib/all_tools/files.py
+++ b/ex_app/lib/all_tools/files.py
@@ -21,6 +21,14 @@
 	return path
 
 
+def _dav_error(response):
+	"""Return an error dict if the WebDAV request did not succeed (non-2xx), otherwise None."""
+	code = getattr(response, 'status_code', None)
+	if code is None or code >= 300:
+		return {"status": "error", "http_status": code, "message": "The WebDAV request failed. Nothing was changed. Tell the user it did not work."}
+	return None
+
+
 async def get_tools(nc: AsyncNextcloudApp):
 
 	@tool
@@ -160,6 +168,9 @@
 			"Content-Type": "text/plain",
 		}, data=content)
 
+		err = _dav_error(response)
+		if err:
+			return err
 		return {"status": "success", "path": path}
 
 	@tool
@@ -177,6 +188,9 @@
 			"Content-Type": "application/json",
 		})
 
+		err = _dav_error(response)
+		if err:
+			return err
 		return {"status": "success", "path": path}
 
 	@tool
@@ -196,6 +210,9 @@
 			"Destination": f"{nc.app_cfg.endpoint}/remote.php/dav/files/{user_id}/{destination_path}",
 		})
 
+		err = _dav_error(response)
+		if err:
+			return err
 		return {"status": "success", "from": source_path, "to": destination_path}
 
 	@tool
@@ -215,6 +232,9 @@
 			"Destination": f"{nc.app_cfg.endpoint}/remote.php/dav/files/{user_id}/{destination_path}",
 		})
 
+		err = _dav_error(response)
+		if err:
+			return err
 		return {"status": "success", "from": source_path, "to": destination_path}
 
 	@tool
@@ -348,6 +368,9 @@
 			"Content-Type": "application/json",
 		})
 
+		err = _dav_error(response)
+		if err:
+			return err
 		return {"status": "success", "deleted": path}
 
 	return [
主要语言
Python
星标
24
派生
16
平均合并
7 天 15 小时
30 天内合并 PR
4

环境准备

从这里开始

  1. 先读完整个 Issue,再读项目的贡献指南。
  2. 在 Issue 下留言说明你要接手 —— 这能避免两个人做同样的事。
  3. Fork 仓库,在一个分支上完成修改。
  4. 提交 Pull Request,并在描述里引用这个 Issue 编号。

nextcloud/context_agent 的其他 Issue

查看 nextcloud/context_agent 的全部 Issue

相似的 Issue

更多 Python Issue

把新 issue 发到你的邮箱

精选适合新手参与的 GitHub issue 摘要。