From a58d695f13bcfff099fe07f5726e32d096f33549 Mon Sep 17 00:00:00 2001 From: JOJO <1498581755@qq.com> Date: Fri, 14 Nov 2025 22:59:51 +0800 Subject: [PATCH] fix: improve modify_file failure hints --- web_server.py | 46 +++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 45 insertions(+), 1 deletion(-) diff --git a/web_server.py b/web_server.py index 7334dda..25d19d1 100644 --- a/web_server.py +++ b/web_server.py @@ -2128,6 +2128,22 @@ async def handle_task_with_sender(terminal: WebTerminal, message, sender, client block_reports = {} detected_indices = set() block_pattern = re.compile(r"\[replace:(\d+)\](.*?)\[/replace\]", re.DOTALL) + structure_warnings: List[str] = [] + structure_detail_entries: List[Dict] = [] + + def record_structure_warning(message: str, hint: Optional[str] = None): + """记录结构性缺陷,便于给出更具体的反馈。""" + if message in structure_warnings: + return + structure_warnings.append(message) + structure_detail_entries.append({ + "index": 0, + "status": "failed", + "reason": message, + "removed_lines": 0, + "added_lines": 0, + "hint": hint or "请严格按照模板输出:[replace:n] + <>/<> + [/replace],并使用 <<>> 收尾。" + }) def extract_segment(body: str, tag: str): marker = f"<<{tag}>>" @@ -2176,6 +2192,30 @@ async def handle_task_with_sender(terminal: WebTerminal, message, sender, client "error": old_error or new_error }) + if not blocks_info: + has_replace_start = bool(re.search(r"\[replace:\s*\d+\]", apply_text)) + has_replace_end = "[/replace]" in apply_text + has_old_tag = "<>" in apply_text + has_new_tag = "<>" in apply_text + + if has_replace_start and not has_replace_end: + record_structure_warning("检测到 [replace:n] 标记但缺少对应的 [/replace] 结束标记。") + if has_replace_end and not has_replace_start: + record_structure_warning("检测到 [/replace] 结束标记但缺少对应的 [replace:n] 起始标记。") + + old_tags = len(re.findall(r"<>", apply_text)) + completed_old_tags = len(re.findall(r"<>[\s\S]*?<>", apply_text)) + if old_tags and completed_old_tags < old_tags: + record_structure_warning("检测到 <> 段落但未看到对应的 <> 结束标记。") + + new_tags = len(re.findall(r"<>", apply_text)) + completed_new_tags = len(re.findall(r"<>[\s\S]*?<>", apply_text)) + if new_tags and completed_new_tags < new_tags: + record_structure_warning("检测到 <> 段落但未看到对应的 <> 结束标记。") + + if (has_replace_start or has_replace_end or has_old_tag or has_new_tag) and not structure_warnings: + record_structure_warning("检测到部分补丁标记,但整体结构不完整,请严格按照模板填写所有标记。") + total_blocks = len(blocks_info) result["total_blocks"] = total_blocks if forced: @@ -2240,11 +2280,15 @@ async def handle_task_with_sender(terminal: WebTerminal, message, sender, client result["completed_blocks"] = completed_blocks result["failed_blocks"] = failed_blocks - result["details"] = sorted(block_reports.values(), key=lambda x: x["index"]) + details = sorted(block_reports.values(), key=lambda x: x["index"]) + if structure_detail_entries: + details = structure_detail_entries + details + result["details"] = details summary_parts = [] if total_blocks == 0: summary_parts.append("未检测到有效的修改块,未执行任何修改。") + summary_parts.extend(structure_warnings) else: if not completed_blocks and failed_blocks: summary_parts.append(f"共检测到 {total_blocks} 个修改块,全部未执行。")