优化: 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:
@@ -81,22 +81,24 @@ impl Default for KnowledgeConfig {
|
||||
// LLM 调用并发控制(双层 Semaphore + 可选 per-provider 层)
|
||||
// ============================================================
|
||||
|
||||
/// LLM 调用并发控制 — 会话级 global + 单对话内 per_conv 双层 Semaphore + 可选 per-provider 层
|
||||
/// LLM 调用并发控制 — 全局 LLM 调用限流 global + 单对话内 per_conv 双层 Semaphore + 可选 per-provider 层
|
||||
///
|
||||
/// 限流对象:所有真实 LLM 调用(主循环 stream_llm / 标题生成 / 知识提炼)。
|
||||
/// 不限流本地工具执行(tools.execute)——本地操作无外部成本、不受 RPM 约束。
|
||||
///
|
||||
/// ## F-260616-09 B 批5 / 决策 c-1:global 改「并发会话数上限」
|
||||
/// `global` permits 默认 3(`new(3, 2)`),语义从「全局 LLM 调用并发上限」改为
|
||||
/// 「并发会话数上限」:`run_agentic_loop` 入口 `acquire_global()` 拿 1 permit,持有整个 loop
|
||||
/// 生命周期(含工具执行/审批等待/重试)。同一时刻最多 3 个对话并发跑 loop,第 4 个排队。
|
||||
/// 收益:token 暴增护栏(决策 c 原意)。
|
||||
/// ## global(permits 默认 3,「LLM 调用并发限流」原义)
|
||||
/// F-09 batch5 曾把 global 改「并发会话数上限」(loop 入口持整 loop),用户决策修正「不设并发会话上限」后
|
||||
/// 已删除 loop 入口 acquire。global 回归原义:由各单次 LLM 调用点(stream_llm 重试循环 / 标题 / 压缩 /
|
||||
/// 提炼 / 项目分析扫描)各自 `acquire_global()` 拿 permit、调用结束 Drop 释放,防 provider 429。
|
||||
/// 多对话 loop 并发不限数(用户接受 token 暴增)。
|
||||
///
|
||||
/// ## per_conv 改 HashMap<conv_id, Semaphore>
|
||||
/// 原应用级单信号量(AiSession 单例 + generating 互斥下退化)改为
|
||||
/// `HashMap<String, Arc<Semaphore>>`:每对话一份(permits=2,主循环 + 标题 + 提炼各自限流)。
|
||||
/// `run_agentic_loop` 入口 `acquire_per_conv(conv_id)` 拿 1 permit 持整个 loop 生命周期(含工具执行/审批
|
||||
/// 等待/重试),防单对话内并发 LLM 调用失控。这是单对话内限流,非会话数限制,符合用户「不设上限」。
|
||||
/// `acquire_per_conv(conv_id)`:lock HashMap → 无则建(permits=2)→ clone Arc → 释放 lock → acquire_owned。
|
||||
/// conv 退出清理(`release_conv(conv_id)`):loop 结束 + 无 pending 审批时 remove 条目(防 HashMap 无限增长)。
|
||||
/// conv 退出清理(`release_conv(conv_id)`):conv 删除时 remove 条目(防 HashMap 无限增长)。
|
||||
///
|
||||
/// 运行时调整:tokio Semaphore 的 permits 数构造时固定、不可增减,
|
||||
/// 故 `global` 用 `Arc<Mutex<Arc<Semaphore>>>` 双层包装——替换内层 Arc 即重建 Semaphore。
|
||||
@@ -113,7 +115,8 @@ impl Default for KnowledgeConfig {
|
||||
/// (set_provider_caps 传 min(sum, global_cap)),非运行时强约束。
|
||||
#[derive(Clone)]
|
||||
pub struct LlmConcurrency {
|
||||
/// 会话级并发上限(F--09 B 批5/决策 c-1):permits=默认 3,run_agentic_loop 入口拿 1 持整 loop。
|
||||
/// 全局 LLM 调用并发上限(permits 默认 3):F-09 batch5 修正后回归原义,由各单次 LLM 调用点
|
||||
/// (stream_llm/标题/压缩/提炼/项目分析)各自 acquire/drop 防 429,不再由 loop 入口持整 loop。
|
||||
global: Arc<Mutex<Arc<Semaphore>>>,
|
||||
/// 单对话内并发上限(F-09 B 批5):HashMap<conv_id, Semaphore>,每对话 permits=2。
|
||||
/// acquire 时按 conv_id 取/建;release_conv 在 loop 结束 + 无 pending 时 remove。
|
||||
@@ -138,7 +141,8 @@ impl LlmConcurrency {
|
||||
}
|
||||
}
|
||||
|
||||
/// 取会话级并发 permit(F-09 B 批5/决策 c-1):run_agentic_loop 入口拿 1 持整个 loop 生命周期。
|
||||
/// 取全局 LLM 调用并发 permit:由各单次 LLM 调用点(stream_llm/标题/压缩/提炼/项目分析)
|
||||
/// 各自调用、调用结束 Drop 释放。F-09 batch5 修正后不再由 run_agentic_loop 入口持整 loop。
|
||||
/// 重建后(set_global)新请求自动走最新 Semaphore。
|
||||
pub async fn acquire_global(&self) -> tokio::sync::OwnedSemaphorePermit {
|
||||
let sema = self.global.lock().await.clone();
|
||||
|
||||
Reference in New Issue
Block a user