v2.53.0 (2026-10-01)
Pydantic AI 发布 v2.53.0(2026-10-01),修复 ConcurrencyLimitedModel 的一个高危安全问题 GHSA-6fqq-452j-qhrp:流式请求在提前退出(消费者停止迭代、抛异常或被取消)以及以默认 debouncing 完整消费 stream_text() 后,可能未释放并发槽位,导致共享同一 limiter 的请求被反复阻塞。Agent 级 max_concurrency 与非流式请求不受影响。修复同时改变 limiter 共享方式:模型包装器与发起请求的 agent 或外层包装器共享 limiter 时抛 UserError,ConcurrencyLimiter.acquire() 每次调用都占槽(即使同一 task),自定义 AbstractConcurrencyLimiter 必须允许跨 task release()。v1 不受影响。
发展脉络
- 首次出现v2.53.0 (2026-10-01)Pydantic AI
- 当前判断这属于 Agent 框架在并发控制这一基础设施层的成熟度问题:流式输出与取消语义是 agent 运行时的常态,槽位泄漏会以「偶发全局限流」的形式表现为线上稳定性事故,而非显式报错。框架选择把 limiter 共享从隐式允许改为显式报错,说明生态开始用更严格的约束换取可预测性。可验证下一信号:其他 agent 框架是否跟进类似的 limiter 所有权校验或发布同类 advisory。Agent Pulse · 分析
Pydantic AI 在 v2.53.0 中修复了 ConcurrencyLimitedModel 的并发槽位泄漏问题(GHSA-6fqq-452j-qhrp,高危)。触发路径是流式请求:当消费者提前停止迭代、抛异常或被取消,或以默认 debouncing 完整消费 stream_text() 后,槽位可能在不同于获取它的 task 上被释放,从而未真正归还;重复流式调用会耗尽共享 limiter 的容量,阻塞所有共享该 limiter 的请求。Agent 级 max_concurrency 与非流式请求不受影响,v1 也不受影响。修复还收紧了 limiter 共享语义:模型包装器与发起请求的 agent 或外层包装器共享 limiter 时抛 UserError,acquire() 每次调用都占槽,自定义 AbstractConcurrencyLimiter 必须支持跨 task release()。
问题本质是并发信号量的所有权与生命周期绑定在 task 上,而流式消费的取消/提前退出会跨 task 释放,导致计数不守恒。修复把 acquire() 改为每次调用都占槽、并要求自定义 limiter 支持跨 task release(),等于把语义从「task 级重入」改为「调用级计数」,同时用 UserError 禁止嵌套共享 limiter 的隐式重入。可验证下一信号:官方 advisory 中受影响版本区间与 2.53.0 的补丁 diff,以及自定义 AbstractConcurrencyLimiter 实现是否需要同步改造。
这属于 Agent 框架在并发控制这一基础设施层的成熟度问题:流式输出与取消语义是 agent 运行时的常态,槽位泄漏会以「偶发全局限流」的形式表现为线上稳定性事故,而非显式报错。框架选择把 limiter 共享从隐式允许改为显式报错,说明生态开始用更严格的约束换取可预测性。可验证下一信号:其他 agent 框架是否跟进类似的 limiter 所有权校验或发布同类 advisory。
对使用 Pydantic AI 构建流式 agent 服务的团队,这是一次需要尽快升级的稳定性修复:不升级则共享 limiter 的请求可能被静默阻塞,表现为吞吐骤降而非明确错误,排查成本高。升级前应确认自定义 AbstractConcurrencyLimiter 是否支持跨 task release(),并检查是否存在模型包装器与 agent 共享 limiter 的配置,否则会触发 UserError。
若跨 task release() 成为自定义 limiter 的硬性要求,依赖旧语义的第三方实现会在升级后暴露问题。可验证下一信号:2.53.0 之后的小版本是否出现针对 AbstractConcurrencyLimiter 兼容性的补充说明或迁移指南。