agentscope-ai/agentscope-java

[Bug]:SSE流式请求首次/闲置后超时 + HttpTransportException#getStatusCode() NPE 异常

Open

#1302 opened on Apr 26, 2026

View on GitHub
 (0 comments) (1 reaction) (0 assignees)Java (3,253 stars) (693 forks)user submission
bughelp wanted

Description

问题描述

项目使用 io.agentscope.core 调用大模型流式(SSE/NDJSON)接口时,出现偶现必现规律异常

  1. 首次建立连接 → 必现超时 + NPE
  2. 第二次及后续请求 → 完全正常,无任何异常
  3. 闲置一段时间(几分钟) → 再次复现首次超时+NPE
  4. Postman 直接调用相同接口 → 永不超时,无任何问题

异常堆栈(核心)

java.lang.NullPointerException: Cannot invoke "java.lang.Integer.intValue()" because the return value of "io.agentscope.core.model.transport.HttpTransportException.getStatusCode()" is null
	at io.agentscope.core.model.OpenAIClient.lambda$stream$2(OpenAIClient.java:443)
	Suppressed: io.agentscope.core.model.transport.HttpTransportException: SSE/NDJSON stream failed: Operation timed out
	Caused by: java.io.IOException: Operation timed out

根因定位(已排查仓库代码)

1. NPE 空指针直接原因

OpenAIClient.java 第443行: 未对 HttpTransportException.getStatusCode()判空处理,直接调用 .intValue()网络超时/连接失败场景statusCode = null,触发 NPE。

2. 超时根本原因(首次/闲置后才出现)

JdkHttpTransport.java 中使用 HttpClient.newBuilder().timeout(...) 设置了全局总超时

  • 首次请求 = 冷连接(TCP+TLS握手)→ 耗时高于热连接 → 触发超时
  • 后续请求 = 热连接(复用连接)→ 不触发超时
  • 闲置后连接被回收 → 重新走冷连接 → 再次超时
  • Postman 无全局超时配置 → 不会触发

3. 异常类设计问题

HttpTransportException 存在两个构造器:

  • 网络异常(超时/IO)→ statusCode = null
  • HTTP状态码异常 → 赋值 statusCode 调用方未做判空,直接导致 NPE。

必改代码位置

  1. 修复 NPE 文件路径:io/agentscope/core/model/OpenAIClient.java 报错行:第443行 修改:getStatusCode() 增加判空,默认返回 504

  2. 修复超时 文件路径:io/agentscope/core/model/transport/JdkHttpTransport.java 修改:删除 .timeout(Duration.ofSeconds(xx)) 全局超时配置 说明:SSE/流式请求严禁设置全局总超时

复现条件

  1. 调用流式(SSE/NDJSON)接口
  2. 应用启动后第一次请求 / 闲置一段时间后第一次请求
  3. 使用 JDK HttpClient 作为底层传输客户端

预期行为

  1. 首次请求/闲置后请求不超时
  2. 网络异常场景不抛出 NPE
  3. 流式请求与 Postman 行为保持一致

环境信息

  • JDK 版本:11+
  • 框架:Spring Boot
  • 客户端:io.agentscope.core
  • 请求类型:SSE / NDJSON 流式响应

Contributor guide