File tools (upload/create folder/move/copy/delete) always report success, even when the WebDAV request fails
まだ誰も着手していません。
評価
調査の方向性
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
- Ask the agent: "Create a file named test.md in folder /does-not-exist with content: hello", approve the action.
- 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時間
- マージ済み PR(30日)
- 4
環境構築
はじめの一歩
- issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
- 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
- リポジトリをフォークし、ブランチを切って変更します。
- issue 番号を参照したプルリクエストを送ります。
nextcloud/context_agent のほかの issue
-
enhancement
難易度 2/5 1〜3時間 初心者へのやさしさ 70/100
nextcloud/context_agent#240 ·
-
find_person_in_contacts fails with Niquests content argument and cannot serialize vCard Addressオープンbug
難易度 2/5 半日 初心者へのやさしさ 76/100
nextcloud/context_agent#217 · コメント 3 件 ·
-
enhancement
難易度 3/5 1〜2日 初心者へのやさしさ 72/100
nextcloud/context_agent#241 ·
-
list skills toolオープンenhancement priority normal
難易度 5/5 1週間以上 初心者へのやさしさ 35/100
nextcloud/context_agent#239 · コメント 2 件 · リアクション 1 件 ·
-
bug
難易度 3/5 1〜2日 初心者へのやさしさ 67/100
nextcloud/context_agent#231 · コメント 2 件 ·
nextcloud/context_agent の issue をすべて見る
似ている issue
-
難易度 2/5 1〜3時間 初心者へのやさしさ 86/100
メンテナーはふだん 1 日以内に返信
-
難易度 2/5 1〜2日 初心者へのやさしさ 70/100
-
FingerprintSplitter raises ZeroDivisionError when int(frac_train * len(dataset)) floors to zeroオープン
難易度 2/5 1〜3時間 初心者へのやさしさ 88/100
メンテナーはふだん 7 日以内に返信
-
難易度 2/5 1〜3時間 初心者へのやさしさ 70/100
lmstudio-ai/mlx-engine#376 ·
-
難易度 2/5 1〜3時間 初心者へのやさしさ 72/100
pyiron/bagofholding#166 ·