优化: F-09 batch5调整 删global会话级限流(用户决策不设并发会话上限)
- agentic.rs: 删loop入口acquire_global(会话数不限) + per_conv保留(单对话内限流permits=2) - state.rs: global回归LLM调用并发限流原义(5处单次调用点+stream_llm防provider429),非会话数上限 用户决策"不设并发会话上限",token暴增接受;主代兜底cargo 0+test98+grep印证
This commit is contained in:
@@ -509,15 +509,15 @@ pub(crate) async fn run_agentic_loop(
|
||||
// 其 token 估算在 loop 外算一次缓存复用,避免每轮/每次重试重复 estimate_text(低收益优化,行为不变)。
|
||||
let sys_tokens = TokenEstimator::default().estimate_text(&system_prompt);
|
||||
|
||||
// F-260616-09 B 批5 / 决策 c-1:global 改「并发会话数上限」,每 loop 入口拿 1 permit 持整个 loop
|
||||
// 生命周期(含工具执行/审批等待/重试)。同一时刻最多 N 个对话并发跑 loop(N=global permits,默认 3),
|
||||
// 第 N+1 个对话的 acquire_global await 阻塞排队。permit 绑 guard(函数返回)Drop 自动释放——
|
||||
// 各 return 点(save_conversation/stop/conv 删除/收敛/达 MAX)退出即释放槽位。
|
||||
// per_conv 同样整 loop 持有:同一对话内主循环 stream_llm + 后台标题/压缩/提炼共享该 conv 的 permits=2,
|
||||
// 防单对话内并发 LLM 调用失控。**F-260616-12 核验**:retry 同 loop 内,持 per_conv 合理;
|
||||
// global 是会话级,retry 不再阻塞他对话(原每轮 acquire/drop 语义下 global 短暂释放,
|
||||
// 现整 loop 持有更贴合"会话级并发上限"语义)。
|
||||
let _conv_global_permit = llm_concurrency.acquire_global().await;
|
||||
// F-09 batch5 修正(用户决策「不设并发会话上限」):删除 loop 入口 acquire_global。
|
||||
// 原决策 c-1 把 global 改「会话数上限」(loop 入口持整 loop,N=3 排队第 4 个),
|
||||
// 现用户取消会话数上限 → 多对话 loop 并发不限,第 N+1 个不再 await 阻塞。
|
||||
// global 字段回归原义「LLM 调用并发限流」:仅由 stream_llm 每轮 + 标题/压缩/提炼/项目分析
|
||||
// 等单次 LLM 调用点 acquire/drop(防 provider 429),不再绑 loop 生命周期。
|
||||
// per_conv(每对话 permits=2)保留 — 单对话内主循环 stream_llm + 后台标题/压缩/提炼共享该 conv 的
|
||||
// permits=2,防单对话内并发 LLM 调用失控(单对话内限流,非会话数限制,符合「不设上限」)。
|
||||
// permit 绑 guard(函数返回)Drop 自动释放——各 return 点退出即释放槽位。
|
||||
// retry 同 loop 内,持 per_conv 合理(F-260616-12 核验)。
|
||||
let _conv_per_conv_permit = llm_concurrency.acquire_per_conv(&conv_id).await;
|
||||
|
||||
for iteration in start_iteration..max_iterations {
|
||||
@@ -732,19 +732,19 @@ pub(crate) async fn run_agentic_loop(
|
||||
messages.iter().map(|m| est.estimate_message(m)).sum()
|
||||
};
|
||||
|
||||
// LLM 并发限流(global + per_conv 双层)— F-260616-09 B 批5 已上移到 loop 入口
|
||||
// (L520-521 _conv_global_permit/_conv_per_conv_permit),整 loop 持有(含工具执行/审批等待/重试)。
|
||||
// 原每轮 acquire + stream 后 drop(L747-748 acquire / L914-915 drop)已移除——会话级并发语义下,
|
||||
// permit 应绑 loop 生命周期而非单次 stream。工具执行期间占槽是决策 c 的有意行为
|
||||
// (会话级并发上限含全部 LLM 相关工作,非仅 stream 调用)。
|
||||
// LLM 并发限流 — F-09 batch5 修正后:
|
||||
// per_conv 由 loop 入口(L521 _conv_per_conv_permit)整 loop 持有(含工具执行/审批等待/重试),
|
||||
// 防单对话内并发 LLM 调用失控(单对话内 permits=2,非会话数限制)。
|
||||
// global 已不再由 loop 入口持有(用户决策「不设并发会话上限」),回归原义「LLM 调用并发限流」:
|
||||
// 由各单次 LLM 调用点(stream_llm 重试循环内/标题/压缩/提炼/项目分析)各自 acquire/drop 防 429。
|
||||
//
|
||||
// CR-30-1 / F-260616-07 / 决策 a1: 流前失败(Init Err)重试,流中途失败(MidStream
|
||||
// Partial)不重试保文。重试退避复用 retry::backoff_delay(1s→2s→4s±20% jitter) +
|
||||
// retry::is_status_retryable Fatal 分类(stream_recv classify_status_or_class 镜像,
|
||||
// 4xx 非429 立即放弃) + 30s 总挂钟预算。重试期间持有 permit 不释放(防新请求挤占)。
|
||||
// 4xx 非429 立即放弃) + 30s 总挂钟预算。重试期间持有 per_conv permit 不释放(防新请求挤占)。
|
||||
//
|
||||
// F-260614-04 / F-260614-04b: per-provider permit 仍在 candidate 循环内取
|
||||
// (切换 candidate 时释放旧取新,避免占用未用 provider 的槽);global/per_conv 由 loop 入口持有。
|
||||
// (切换 candidate 时释放旧取新,避免占用未用 provider 的槽);per_conv 由 loop 入口持有。
|
||||
|
||||
// 重试总预算(挂钟,含 sleep + 各次请求耗时),对齐 retry::MAX_TOTAL_BUDGET 30s。
|
||||
// F-260614-04b:本轮各 candidate 共享一个 30s 预算(切换 provider 不重置预算,
|
||||
|
||||
Reference in New Issue
Block a user