From 1c17565931e13588a34526248058ed34b3a9f8bb Mon Sep 17 00:00:00 2001 From: liut Date: Fri, 13 Mar 2026 14:20:28 +0800 Subject: [PATCH] feat: add max loop iterations limit to prevent infinite tool call loops - Add MaxLoopIterations config (default: 5) - Add iteration check in chatStreamResponseLoop - Environment variable: MAX_LOOP_ITERATIONS --- pkg/settings/config.go | 3 +++ pkg/web/api/handle_convo.go | 14 ++++++++++++-- 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/pkg/settings/config.go b/pkg/settings/config.go index 8ef0689..c73ecfa 100644 --- a/pkg/settings/config.go +++ b/pkg/settings/config.go @@ -50,6 +50,9 @@ type Config struct { // 相似度匹配数量 VectorLimit int `envconfig:"Vector_Limit" default:"5"` + // LLM调用循环次数限制,防止无限循环 + MaxLoopIterations int `envconfig:"MAX_LOOP_ITERATIONS" default:"5"` + Embedding Provider Interact Provider Summarize Provider diff --git a/pkg/web/api/handle_convo.go b/pkg/web/api/handle_convo.go index 9909107..50ff8d1 100644 --- a/pkg/web/api/handle_convo.go +++ b/pkg/web/api/handle_convo.go @@ -283,12 +283,22 @@ func (a *api) chatStreamResponseLoop(ccr *chatRequest, w http.ResponseWriter, r w.Header().Add("Conversation-ID", ccr.cs.GetID()) var iter int + maxLoopIterations := settings.Current.MaxLoopIterations + if maxLoopIterations <= 0 { + maxLoopIterations = 5 + } for { iter++ + // 达到迭代次数限制,跳出循环 + if iter > maxLoopIterations { + logger().Infow("chat loop iteration limit reached", "maxIter", maxLoopIterations) + break + } + // 调用流式响应处理 streamRes := a.doChatStream(ccr, w, r) - logger().Infow("stream round done", "iter", iter, "answer_len", len(streamRes.answer), - "toolCalls_len", len(streamRes.toolCalls)) + logger().Infow("stream round done", "iter", iter, "maxIter", maxLoopIterations, + "answer_len", len(streamRes.answer), "toolCalls_len", len(streamRes.toolCalls)) // 累积答案 res.answer += streamRes.answer