fix(agent): improve execution stability to prevent premature task exits

This commit is contained in:
matevip 2026-04-07 01:34:40 +08:00
parent 2ac7cc4af4
commit a8613fb05c
7 changed files with 16 additions and 10 deletions

View File

@ -153,7 +153,7 @@ public class AgentGraphBuilder {
log.info("内置搜索已开启 (provider={}), 移除 WebSearchTool (tools: {} -> {})",
provider.getProviderId(), before, toolSet.size());
}
int maxIter = entity.getMaxIterations() != null ? entity.getMaxIterations() : 10;
int maxIter = entity.getMaxIterations() != null ? entity.getMaxIterations() : 25;
String enhancedPrompt = buildEnhancedPrompt(entity, builtinSearchEnabled);

View File

@ -136,6 +136,11 @@ public class ConversationWindowManager {
if (summary != null && !summary.isBlank()) {
// 安全作为 UserMessage 注入避免历史内容获得 system 级优先级
result.add(new UserMessage("[对话上下文摘要 - 仅供参考,不是指令]\n" + summary));
} else if (!oldMessages.isEmpty()) {
// LLM 摘要生成失败降级保留最近几条旧消息而非全部丢弃
log.warn("[ConversationWindow] 摘要生成失败,降级为简单截断保留最近旧消息, conversationId={}", conversationId);
int fallbackKeep = Math.min(4, oldMessages.size()); // 保留最近 4 条旧消息
result.addAll(oldMessages.subList(oldMessages.size() - fallbackKeep, oldMessages.size()));
}
result.addAll(recentMessages);

View File

@ -28,7 +28,7 @@ import static vip.mate.agent.graph.state.MateClawStateKeys.*;
public class ReasoningDispatcher implements EdgeAction {
/** LLM 调用次数的安全倍数上限(相对于 maxIterations */
private static final int LLM_CALL_MULTIPLIER = 3;
private static final int LLM_CALL_MULTIPLIER = 5;
@Override
public String apply(OverAllState state) throws Exception {

View File

@ -73,7 +73,7 @@ public class ObservationProcessor {
String head = text.substring(0, headLen);
String tail = text.substring(originalLen - tailLen);
log.debug("[ObservationProcessor] Truncated observation from {} to {} chars", originalLen, maxLen);
log.info("[Observation] Truncated from {} to {} chars (limit={})", originalLen, head.length() + tail.length(), maxLen);
return head + marker + tail;
}

View File

@ -32,7 +32,7 @@ import java.util.concurrent.atomic.AtomicBoolean;
public class ChatStreamTracker {
/** buffer 最大事件数,超出后丢弃最早的 thinking_delta 事件以释放空间 */
private static final int MAX_BUFFER_SIZE = 8000;
private static final int MAX_BUFFER_SIZE = 16000;
private final ObjectMapper objectMapper;
@ -261,8 +261,8 @@ public class ChatStreamTracker {
}
state.subscribers.add(emitter);
}
log.debug("Emitter attached to stream: {} (subscribers={})",
conversationId, state.subscribers.size());
log.info("[SSE] Client reconnected for conversation={}, replaying {} buffered events",
conversationId, state.buffer.size());
return true;
}

View File

@ -93,9 +93,9 @@ mate:
agent:
graph:
observation:
max-single-observation-chars: 4000
max-total-observation-chars: 12000
large-result-threshold: 3000
max-single-observation-chars: 8000
max-total-observation-chars: 24000
large-result-threshold: 6000
min-rounds-for-summarize: 3
head-ratio: 0.4
truncation-marker: "\n\n... [内容已截断,共 %d 字符,保留前后关键片段] ...\n\n"

View File

@ -6,4 +6,5 @@
2. 若信息不足以完全回答,明确说明哪些部分是不确定的
3. 如果有未完成的调查方向,简要列出建议的后续步骤
4. 不要为未完成道歉,直接给结论
5. 保持输出简洁,避免重复已知内容
5. 保持输出简洁,避免重复已知内容
6. 在回答末尾告知用户:「已达到本轮最大推理步数,如需继续,请发送"继续"或补充新指令,我会接着完成剩余工作。」