From 0c2b3e0d51c1a117d5cd49eeee32ad7e757fee3d Mon Sep 17 00:00:00 2001 From: Liang Jiaqing Date: Thu, 6 Aug 2026 16:45:49 +0800 Subject: [PATCH] tune prompt tags, raise context_win defaults, simplify code_run schema desc - ga: blank/incomplete/max_tokens retries use [ERROR]; summary tip [TIPS]; turn checkpoints [DANGER] - llmcore: default context_win 30k->35k, deepseek 70k->80k - tools_schema: shorten code_run.script description --- assets/tools_schema.json | 2 +- ga.py | 12 ++++++------ llmcore.py | 4 ++-- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/assets/tools_schema.json b/assets/tools_schema.json index 279eebc7..81c52437 100644 --- a/assets/tools_schema.json +++ b/assets/tools_schema.json @@ -3,7 +3,7 @@ "name": "code_run", "description": "Code executor. Prefer python. Multi-call OK, use script param. Reply code block is executed if no script arg; prefer for single call to avoid escaping. No hardcoding bulk data", "parameters": {"type": "object", "properties": { - "script": {"type": "string", "description": "[Mutually exclusive] NEVER use this param when use reply code block."}, + "script": {"type": "string", "description": "script"}, "type": {"type": "string", "enum": ["python", "powershell"], "description": "Code type", "default": "python"}, "timeout": {"type": "integer", "description": "in seconds", "default": 60}, "cwd": {"type": "string", "description": "Working directory, defaults to cwd"}, diff --git a/ga.py b/ga.py index c56db03f..d7ab8649 100644 --- a/ga.py +++ b/ga.py @@ -482,11 +482,11 @@ class GenericAgentHandler(BaseHandler): thinking = getattr(response, 'thinking', '') or "" if not response or (not content.strip() and not thinking.strip()): yield "[Warn] LLM returned an empty response. Retrying...\n" - return self._retry_or_exit("[System] Blank response, regenerate and tooluse") + return self._retry_or_exit("[ERROR] Blank response, regenerate and tooluse") if '[!!! 流异常中断' in content[-100:] or '!!!Error:' in content[-100:] or content.endswith(''): - return self._retry_or_exit("[System] Incomplete response. Regenerate and tooluse.") + return self._retry_or_exit("[ERROR] Incomplete response. Regenerate and tooluse.") if 'max_tokens !!!]' in content[-100:]: - return self._retry_or_exit("[System] max_tokens limit reached. Use multi small steps to do it.") + return self._retry_or_exit("[ERROR] max_tokens limit reached. Use multi small steps to do it.") if self._in_plan_mode() and any(kw in content for kw in ['任务完成', '全部完成', '已完成所有', '🏁']): if 'VERDICT' not in content and '[VERIFY]' not in content and '验证subagent' not in content: @@ -575,7 +575,7 @@ class GenericAgentHandler(BaseHandler): else: tc = tool_calls[0]; clean_args = {k: v for k, v in tc['args'].items() if not k.startswith('_')} # at least one because no_tool summary = _c.strip() or smart_format("直接回答了用户问题" if tc['tool_name'] == 'no_tool' else f"{tc['tool_name']}, args: {clean_args}", max_str_len=40) - next_prompt += "\n\n\n[SYSTEM] 必须在回复文本中包含!\n\n" + next_prompt += "\n\n\n[TIPS] 必须在回复文本中包含!\n\n" summary = smart_format(summary.replace('\n', ''), max_str_len=80) self.history_info.append(f'[Agent] {summary}') _plan = self._in_plan_mode() @@ -583,9 +583,9 @@ class GenericAgentHandler(BaseHandler): if turn % 175 == 0 and (not _plan): next_prompt += f"\n\n[DANGER] Turn {turn}. Must call ask_user to summarize progress and get direction. No more blind retries." elif turn % 13 == 0: - next_prompt += f"\n\n[SYSTEM] Turn {turn}. Call update_working_checkpoint to save key context. Stop ineffective retries; if no progress, switch strategy: 1) Probe physical boundaries 2) **Re-read relevant SOPs**" + next_prompt += f"\n\n[DANGER] Turn {turn}. Call update_working_checkpoint to save key context. Stop ineffective retries; if no progress, switch strategy: 1) Probe physical boundaries 2) **Re-read relevant SOPs**" elif turn % 31 == 0: - next_prompt += f"\n\n[SYSTEM] Turn {turn}. Write checkpoints/key findings/tried approaches to a **file** for future reference (not only working_checkpoint!). Avoid losing critical info." + next_prompt += f"\n\n[DANGER] Turn {turn}. Write checkpoints/key findings/tried approaches to a **file** for future reference (not only working_checkpoint!). Avoid losing critical info." elif turn % 10 == 0: next_prompt += get_global_memory() if _plan and turn >= 10 and turn % 5 == 0: diff --git a/llmcore.py b/llmcore.py index 17403b47..ac74c2ef 100644 --- a/llmcore.py +++ b/llmcore.py @@ -599,9 +599,9 @@ class BaseSession: self.api_key = cfg['apikey'] self.api_base = cfg['apibase'].rstrip('/') self.model = cfg.get('model', '') - default_context_win = 30000; default_cut_msg_interval = 5 + default_context_win = 35000; default_cut_msg_interval = 5 if 'deepseek' in self.model.lower(): - default_context_win = 70000; default_cut_msg_interval = 25; self.trim_keep_rate = 0.3 + default_context_win = 80000; default_cut_msg_interval = 25; self.trim_keep_rate = 0.3 self.context_win = cfg.get('context_win', default_context_win) self.maxlen_multiplier = min(max(self.context_win / default_context_win * 0.75, 1.0), 3.0) self.cut_msg_interval = int(default_cut_msg_interval * self.maxlen_multiplier)