// limits.go - HTTP 响应体大小限制常量 (wire 包导出). // // L1330 (2026-04-13): 原先 internal/wire/openai.go:50-51 和 internal/transport/client.go:41-42 // 分别定义了同名同值的 maxErrorBodyBytes / maxStreamingBodyBytes, 两份独立声明意味着 // 未来 bump 时只改一边会产生 "wire 接受 100MB 但 transport 拒绝 50MB" 之类的静默漂移. // 提取到 wire 包单一源头: wire 不依赖 transport, 而 transport 已依赖 wire (ParseAnthropicStream), // 所以放 wire 是唯一不破坏包依赖方向的选择. // // 升华改进(ELEVATED): 早期方案无任何响应体大小限制--恶意 API 服务端可发送 GB 级响应导致 OOM. // error body 限 1MB (足以承载任何 API 错误消息); streaming body 限 100MB (足以承载正常对话轮次). // 超限后 io.LimitReader 触发 EOF, consumeSSE goroutine 正常退出, 不会死锁或泄漏. // 替代方案: 不限制 - 否决, OOM 风险, 单次恶意请求可崩溃进程. package wire const ( // MaxErrorBodyBytes 是 HTTP 错误响应体 (非 2xx) 的最大读取字节数. // 1MB 足以承载 Anthropic/OpenAI/Gemini 任意 API 错误 JSON (实际通常 < 10KB). MaxErrorBodyBytes = 1 << 20 // 1 MiB // MaxStreamingBodyBytes 是 SSE 流式响应体的最大读取字节数. // 100MB 足以承载正常对话轮次 (包括 prompt cache 大上下文的 chunk 回放). // 触发上限后 io.LimitReader 返回 EOF, 流式解析器优雅终止. MaxStreamingBodyBytes = 100 << 20 // 100 MiB )