第58批:自动互动日志静默,只在状态变化时记录
Check Source / check (push) Successful in 2s
Auto Release / build (push) Successful in 2m24s
Simple Test / test (push) Successful in 1s
Test Env / test (push) Successful in 2s

- 移除每次触发的调试块(请求体/响应体/响应头)
- 正常触发零日志,失败只一行简要(HTTP码或超时)
- 新增prevAutoChatFailed状态追踪,失败→成功时记恢复
- 有变化在叫,没变化闭嘴
This commit is contained in:
youpaishidifu
2026-10-28 17:07:43 +08:00
parent b6dfad4aed
commit d2835dd272
+32 -26
View File
@@ -40,6 +40,10 @@ public class AIChatManager {
// ★ 互动指标跳过日志静默:首次跳过记一条,之后只在状态变化(从≥→<)时再记 // ★ 互动指标跳过日志静默:首次跳过记一条,之后只在状态变化(从≥→<)时再记
private boolean prevOnlineSufficient = true; private boolean prevOnlineSufficient = true;
// ★ 自动互动日志静默:只在状态变化(成功→失败 或 失败→成功)时记一条
// 正常触发不打印,失败只一行简要错误,避免日志被刷屏
private boolean prevAutoChatFailed = false;
// 默认模型 // 默认模型
private String defaultModelFull = ""; private String defaultModelFull = "";
@@ -801,23 +805,17 @@ public class AIChatManager {
String recentChat = compressChatBuffer(endpoint.maxToken); String recentChat = compressChatBuffer(endpoint.maxToken);
String prompt = "以下是服务器最近的聊天记录:\n" + recentChat + "\n\n请根据聊天内容,自然地抛出一个话题或问题,引导大家参与讨论,带动服务器的活跃气氛。不要直接点名任何玩家,而是抛出一个开放性的话题让大家都能参与。"; String prompt = "以下是服务器最近的聊天记录:\n" + recentChat + "\n\n请根据聊天内容,自然地抛出一个话题或问题,引导大家参与讨论,带动服务器的活跃气氛。不要直接点名任何玩家,而是抛出一个开放性的话题让大家都能参与。";
plugin.getLogger().info("[AI聊天] 触发自动互动");
// ★ 死循环防护:触发前先更新时间戳,请求挂起/超时/失败都不会被下一秒重复触发 // ★ 死循环防护:触发前先更新时间戳,请求挂起/超时/失败都不会被下一秒重复触发
lastAiReplyTime = System.currentTimeMillis(); lastAiReplyTime = System.currentTimeMillis();
// ★ 日志静默:正常触发不打印"触发自动互动",只在失败时记一条简要错误
// 状态变化(失败→成功 或 成功→失败)时记一条恢复/告警
// 异步发送 // 异步发送
String systemPrompt = buildSystemPrompt(); String systemPrompt = buildSystemPrompt();
String jsonBody = buildChatRequest(defaultModelFull, systemPrompt, prompt, endpoint.maxToken); String jsonBody = buildChatRequest(defaultModelFull, systemPrompt, prompt, endpoint.maxToken);
String requestUrl = buildRequestUrl(endpoint); String requestUrl = buildRequestUrl(endpoint);
// ★ 400调试日志:自动互动请求
plugin.getLogger().info("[AI聊天-调试] === 自动互动请求开始 ===");
plugin.getLogger().info("[AI聊天-调试] 模型全名: " + defaultModelFull);
plugin.getLogger().info("[AI聊天-调试] 请求URL: " + requestUrl);
plugin.getLogger().info("[AI聊天-调试] 自定义供应商: " + endpoint.isCustom);
plugin.getLogger().info("[AI聊天-调试] 请求体JSON: " + jsonBody);
plugin.getLogger().info("[AI聊天-调试] === 自动互动请求结束 ===");
CompletableFuture.supplyAsync(() -> { CompletableFuture.supplyAsync(() -> {
try { try {
HttpRequest request = HttpRequest.newBuilder() HttpRequest request = HttpRequest.newBuilder()
@@ -830,33 +828,41 @@ public class AIChatManager {
return httpClient.send(request, HttpResponse.BodyHandlers.ofString(StandardCharsets.UTF_8)); return httpClient.send(request, HttpResponse.BodyHandlers.ofString(StandardCharsets.UTF_8));
} catch (Exception e) { } catch (Exception e) {
plugin.getLogger().warning("[AI聊天] 自动互动请求异常: " + e.getMessage());
return null; return null;
} }
}).thenAccept(response -> { }).thenAccept(response -> {
if (response == null || response.statusCode() != 200) { if (response == null) {
// ★ 400调试日志:自动互动失败 // ★ 日志静默:异常只记一行,不刷屏
if (response != null) { plugin.getLogger().warning("[AI聊天] 自动互动请求异常(网络超时)");
plugin.getLogger().warning("[AI聊天-调试] === 自动互动请求失败 ==="); handleRequestFailure("[自动] " + prompt.substring(0, Math.min(100, prompt.length())), "自动互动失败: 请求异常");
plugin.getLogger().warning("[AI聊天-调试] HTTP状态码: " + response.statusCode()); prevAutoChatFailed = true;
plugin.getLogger().warning("[AI聊天-调试] 模型全名: " + defaultModelFull);
plugin.getLogger().warning("[AI聊天-调试] 请求URL: " + requestUrl);
plugin.getLogger().warning("[AI聊天-调试] 请求体JSON: " + jsonBody);
response.headers().map().forEach((name, values) -> {
plugin.getLogger().warning("[AI聊天-调试] 响应头 " + name + ": " + String.join(", ", values));
});
plugin.getLogger().warning("[AI聊天-调试] 响应体: " + response.body());
plugin.getLogger().warning("[AI聊天-调试] === 自动互动请求失败结束 ===");
}
handleRequestFailure("[自动] " + prompt.substring(0, Math.min(100, prompt.length())),
"自动互动失败: HTTP " + (response != null ? response.statusCode() : "N/A"));
return; return;
} }
if (response.statusCode() != 200) {
// ★ 日志静默:非200只记一行状态码,不打印完整响应体
plugin.getLogger().warning("[AI聊天] 自动互动失败: HTTP " + response.statusCode());
handleRequestFailure("[自动] " + prompt.substring(0, Math.min(100, prompt.length())),
"自动互动失败: HTTP " + response.statusCode());
prevAutoChatFailed = true;
return;
}
String reply = parseChatResponse(response.body()); String reply = parseChatResponse(response.body());
if (reply != null) { if (reply != null) {
Bukkit.broadcastMessage("§d§l[AI] §f" + reply); Bukkit.broadcastMessage("§d§l[AI] §f" + reply);
recordIssue("[自动] " + prompt.substring(0, Math.min(100, prompt.length())), reply); recordIssue("[自动] " + prompt.substring(0, Math.min(100, prompt.length())), reply);
lastAiReplyTime = System.currentTimeMillis(); lastAiReplyTime = System.currentTimeMillis();
// ★ 状态变化:失败→成功,记一条恢复日志
if (prevAutoChatFailed) {
plugin.getLogger().info("[AI聊天] 自动互动恢复正常");
prevAutoChatFailed = false;
}
} else {
plugin.getLogger().warning("[AI聊天] 自动互动响应解析失败");
handleRequestFailure("[自动] " + prompt.substring(0, Math.min(100, prompt.length())),
"自动互动失败: 响应解析失败");
prevAutoChatFailed = true;
} }
}); });
} finally { } finally {