修复: checkpoint 参数化 + 压缩 permit 死锁降级 + 密钥归一化 + SSE CRLF/多字节

This commit is contained in:
lxy
2026-08-01 11:30:05 +08:00
parent c4ba920cf5
commit 20ec571dbb
9 changed files with 232 additions and 42 deletions
+18 -1
View File
@@ -98,7 +98,24 @@ pub(crate) async fn compress_via_llm(
// LLM 并发限流(压缩属独立调用,纳入双层 Semaphore)
// F-09 B 批5: per_conv 改 HashMap<conv_id>,压缩在 loop 内针对本对话,用 conv_id 共享限流槽。
let _global_permit = llm_concurrency.acquire_global().await;
let _per_conv_permit = llm_concurrency.acquire_per_conv(conv_id).await;
// compress-permit-try: per_conv 改非阻塞 try。loop 入口已持 1 个 per_conv permit,
// set_per_conv(1) 后 per_conv Semaphore 仅 1 permit 被入口占满,此处阻塞 acquire 将永久等待
// → is_compressing 永真 → 卡死。改 try_acquire_per_conv:拿不到(None)提前返 Err 降级
// (maybe_auto_compress 走失败兜底分支:关键词摘要 + set_compressing(false),下轮再试),非崩溃。
let _per_conv_permit = match llm_concurrency.try_acquire_per_conv(conv_id).await {
Some(p) => p,
None => {
tracing::warn!(
conv_id = %conv_id,
active_count,
"[ai] 压缩 per_conv permit 已耗尽(loop 入口占用),降级返回走兜底分支,下轮再试"
);
return Err(format!(
"压缩 per_conv 并发限流槽已耗尽(active {} 条,loop 入口占用;降级走兜底,下轮再试)",
active_count
));
}
};
// F-15 卡死根治(2026-06-21 诊断):provider.complete 原无超时,LLM hang → agentic loop
// (agentic/mod.rs:780)await 永不返 → run_agentic_loop 永挂 → generating 卡死