From acadb2b7479b66727e7c82d0b43b8125aab14846 Mon Sep 17 00:00:00 2001 From: xgopilot Date: Thu, 16 Apr 2026 00:17:41 +0000 Subject: [PATCH] =?UTF-8?q?fix(runtime):=20=E6=B8=85=E7=90=86=E5=86=B2?= =?UTF-8?q?=E7=AA=81=E6=A0=87=E8=AE=B0=E5=B9=B6=E6=81=A2=E5=A4=8D=E6=8F=90?= =?UTF-8?q?=E9=86=92=E4=BC=98=E5=85=88=E7=BA=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Generated with [codeagent](https://github.com/qbox/codeagent) Co-authored-by: Yumiue <188874804+Yumiue@users.noreply.github.com> --- internal/runtime/run.go | 35 +++++++++++++++-------------------- 1 file changed, 15 insertions(+), 20 deletions(-) diff --git a/internal/runtime/run.go b/internal/runtime/run.go index ea3930c5..00a9ead9 100644 --- a/internal/runtime/run.go +++ b/internal/runtime/run.go @@ -253,28 +253,11 @@ func (s *Service) prepareTurnSnapshot(ctx context.Context, state *runState) (tur state.mu.Unlock() limit := resolveNoProgressStreakLimit(cfg.Runtime) -<<<<<<< codex/issue-294-auto-compact-threshold - systemPrompt := withSelfHealingReminder(builtContext.SystemPrompt, streak, limit) -======= repeatLimit := resolveRepeatCycleStreakLimit(cfg.Runtime) - systemPrompt := builtContext.SystemPrompt - - if repeatStreak == repeatLimit-1 { - trimmed := strings.TrimSpace(systemPrompt) - if trimmed == "" { - systemPrompt = selfHealingRepeatReminder - } else { - systemPrompt = trimmed + "\n\n" + selfHealingRepeatReminder - } - } else if streak == limit-1 { - trimmed := strings.TrimSpace(systemPrompt) - if trimmed == "" { - systemPrompt = selfHealingReminder - } else { - systemPrompt = trimmed + "\n\n" + selfHealingReminder - } + systemPrompt, repeatInjected := withSelfHealingRepeatReminder(builtContext.SystemPrompt, repeatStreak, repeatLimit) + if !repeatInjected { + systemPrompt = withSelfHealingReminder(systemPrompt, streak, limit) } ->>>>>>> main model := strings.TrimSpace(cfg.CurrentModel) return turnSnapshot{ @@ -483,6 +466,18 @@ func withSelfHealingReminder(systemPrompt string, streak int, limit int) string return trimmed + "\n\n" + selfHealingReminder } +// withSelfHealingRepeatReminder 在重复循环临界轮次注入循环自愈提醒,避免模型继续相同工具调用。 +func withSelfHealingRepeatReminder(systemPrompt string, repeatStreak int, repeatLimit int) (string, bool) { + if repeatStreak != repeatLimit-1 { + return systemPrompt, false + } + trimmed := strings.TrimSpace(systemPrompt) + if trimmed == "" { + return selfHealingRepeatReminder, true + } + return trimmed + "\n\n" + selfHealingRepeatReminder, true +} + // autoCompactCacheKeyFromConfig 提取会影响自动压缩阈值解析的配置维度,用于 run 内缓存命中判断。 func autoCompactCacheKeyFromConfig(cfg config.Config) autoCompactThresholdCacheKey { return autoCompactThresholdCacheKey{