From cd0ce4d9b0ec6a1e594eab55561a89c156bd07f9 Mon Sep 17 00:00:00 2001 From: Liang Jiaqing Date: Sun, 26 Apr 2026 00:01:42 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20summary=E6=8F=90=E5=8F=96=E4=B8=8Efold?= =?UTF-8?q?=5Fturns=E9=98=B2=E8=AF=AF=E5=88=87=EF=BC=8C=E5=BC=BA=E5=8C=96t?= =?UTF-8?q?hinking=E6=A8=A1=E5=9E=8Bsummary=E8=BE=93=E5=87=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- assets/sys_prompt.txt | 2 +- assets/sys_prompt_en.txt | 2 +- frontends/stapp.py | 8 ++++++-- llmcore.py | 2 +- 4 files changed, 9 insertions(+), 5 deletions(-) diff --git a/assets/sys_prompt.txt b/assets/sys_prompt.txt index def4a57..c010b96 100644 --- a/assets/sys_prompt.txt +++ b/assets/sys_prompt.txt @@ -1,6 +1,6 @@ # Role: 物理级全能执行者 你拥有文件读写、脚本执行、用户浏览器JS注入、系统级干预的物理操作权限。禁止推诿"无法操作"——不空想,用工具探测。 ## 行动原则 -调用工具前在内推演:当前阶段、上步结果是否符合预期、下步策略;内输出极简总结。 +调用工具前先推演:当前阶段、上步结果是否符合预期、下步策略;回复文本中用输出极简总结。 - 探测优先:失败时先充分获取信息(日志/状态/上下文),关键信息存入工作记忆,再决定重试或换方案。不可逆操作先询问用户。 - 失败升级:1次→读错误理解原因,2次→探测环境状态,3次→深度分析后换方案或问用户。禁止无新信息的重复操作。 diff --git a/assets/sys_prompt_en.txt b/assets/sys_prompt_en.txt index 9110c2e..c0411ab 100644 --- a/assets/sys_prompt_en.txt +++ b/assets/sys_prompt_en.txt @@ -2,6 +2,6 @@ You have full physical access: file I/O, script execution, browser JS injection, and system-level intervention. Never deflect with "can't do it" — don't speculate, use tools to probe. Summarize and reply in user's language or follow user's prompt. ## Action Principles -Before each tool call, reason inside : current phase, whether the last result met expectations, and next strategy. +Before each tool call, reason: current phase, whether the last result met expectations, and next strategy and in reply text of each turn. - Probe first: on failure, gather sufficient info (logs/status/context), store key findings in working memory, then decide to retry or pivot. Ask the user before irreversible operations. - Failure escalation: 1st fail → read error and understand cause; 2nd → probe environment state; 3rd → deep analysis then switch approach or ask user. Never repeat an action without new information. \ No newline at end of file diff --git a/frontends/stapp.py b/frontends/stapp.py index e5ee194..85cf63b 100644 --- a/frontends/stapp.py +++ b/frontends/stapp.py @@ -92,7 +92,11 @@ with st.sidebar: render_sidebar() def fold_turns(text): """Return list of segments: [{'type':'text','content':...}, {'type':'fold','title':...,'content':...}]""" - parts = re.split(r'(\**LLM Running \(Turn \d+\) \.\.\.\*\**)', text) + # 先把4+反引号块替换为占位符,避免误切子agent嵌套的 LLM Running + _ph = [] + safe = re.sub(r'`{4,}.*?`{4,}', lambda m: (_ph.append(m.group(0)), f'\x00PH{len(_ph)-1}\x00')[1], text, flags=re.DOTALL) + parts = re.split(r'(\**LLM Running \(Turn \d+\) \.\.\.\*\**)', safe) + parts = [re.sub(r'\x00PH(\d+)\x00', lambda m: _ph[int(m.group(1))], p) for p in parts] if len(parts) < 4: return [{'type': 'text', 'content': text}] segments = [] if parts[0].strip(): segments.append({'type': 'text', 'content': parts[0]}) @@ -103,7 +107,7 @@ def fold_turns(text): turns.append((marker, content)) for idx, (marker, content) in enumerate(turns): if idx < len(turns) - 1: - _c = re.sub(r'```.*?```|.*?', '', content, flags=re.DOTALL) + _c = re.sub(r'`{3,}.*?`{3,}|.*?', '', content, flags=re.DOTALL) matches = re.findall(r'\s*((?:(?!).)*?)\s*', _c, re.DOTALL) if matches: title = matches[0].strip() diff --git a/llmcore.py b/llmcore.py index 2cd5e4d..c979846 100644 --- a/llmcore.py +++ b/llmcore.py @@ -944,7 +944,7 @@ class MixinSession: THINKING_PROMPT_ZH = """ ### 行动规范(持续有效) -每次回复请先在回复文字中包含一个 中输出极简单行(<30字)物理快照:上次结果新信息+本次意图。此内容进入长期工作记忆。 +每次回复(含工具调用轮)都先在回复文字中包含一个 中输出极简单行(<30字)物理快照:上次结果新信息+本次意图。此内容进入长期工作记忆。 \n**若用户需求未完成,必须进行工具调用!** """.strip() THINKING_PROMPT_EN = """