执行摘要
提高 Rust 前端请求体大小限制
支持 1M 上下文长度模型时,有效请求可能超过 Axum 默认的 2 MiB 限制,导致 "Failed to buffer the request body: length limit exceeded" 错误。
值得合并。该修复解决了实际用户问题,改动清晰且经过测试。
仅有 BugenZhao 的批准评论 "Good catch. Thanks!",无其他讨论。
支持 1M 上下文长度模型时,有效请求可能超过 Axum 默认的 2 MiB 限制,导致 "Failed to buffer the request body: length limit exceeded" 错误。
值得合并。该修复解决了实际用户问题,改动清晰且经过测试。
仅有 BugenZhao 的批准评论 "Good catch. Thanks!",无其他讨论。
rust/src/server/src/routes.rs 中导入 axum::extract::DefaultBodyLimit,定义常量 DEFAULT_JSON_BODY_LIMIT_BYTES = 32 * 1024 * 1024,并在路由器上添加 .layer(DefaultBodyLimit::max(DEFAULT_JSON_BODY_LIMIT_BYTES))。rust/src/server/src/routes/tests.rs 中新增测试 chat_completions_accepts_request_body_larger_than_axum_default,发送超过 2 MiB 的请求体(通过 chat_template_kwargs 注入大字符串),验证返回 200 OK。| 文件 | 模块 | 状态 | 重要度 |
|---|---|---|---|
rust/src/server/src/routes.rs |
路由层 | modified | 6.04 |
rust/src/server/src/routes/tests.rs |
路由层 | modified | 6.76 |
rust/src/server/src/routes.rs
entrypoint
核心变更:提升请求体限制。
// 增加请求体限制,避免大上下文请求被拒绝
use axum::extract::DefaultBodyLimit;
// 32 MiB,可覆盖 1M 上下文模型的请求
const DEFAULT_JSON_BODY_LIMIT_BYTES: usize = 32 * 1024 * 1024;
// 在构建路由器时添加限制层
let mut router = router
.with_state(state.clone())
.layer(DefaultBodyLimit::max(DEFAULT_JSON_BODY_LIMIT_BYTES)) // 关键新增
.layer(middleware::request_runtime_layer(state.clone()))
// ... 后续中间件
rust/src/server/src/routes/tests.rs
test-coverage
回归测试验证大请求体可通过。
#[tokio::test(flavor = "multi_thread", worker_threads = 2)]
#[serial]
async fn chat_completions_accepts_request_body_larger_than_axum_default() {
let (chat, engine_task) = test_chat_with_engine_outputs(
b"engine-openai-chat-large-body",
default_stream_output_specs(),
)
.await;
let mut app = build_router(Arc::new(AppState::new(
vec!["Qwen/Qwen1.5-0.5B-Chat".to_string()],
chat,
)));
// 构造超过 2 MiB 的请求体
let large_template_arg = "a".repeat(2 * 1024 * 1024); // 正好 2 MiB
let response = app
.call(
Request::builder()
.method("POST")
.uri("/v1/chat/completions")
.header("content-type", "application/json")
.body(Body::from(
json!({
"model": "Qwen/Qwen1.5-0.5B-Chat",
"stream": false,
"messages": [{"role": "user", "content": "hello"}],
"chat_template_kwargs": {"large": large_template_arg} // 注入大字段
})
.to_string(),
))
.expect("build request"),
)
.await
.expect("call app");
let status = response.status();
let body = to_bytes(response.into_body(), usize::MAX).await.expect("read body");
// 断言状态码为 200,否则打印响应体
assert_eq!(status, StatusCode::OK, "{}", String::from_utf8_lossy(&body));
engine_task.await.expect("mock engine task");
}
当前评论区没有形成足够清晰的争议点或结论,后续有更多讨论时会体现在这里。
风险低。仅增加请求体限制,不改变解析逻辑;32 MiB 限制仍合理,可防止无限制消耗内存。
正面影响:使 vLLM 能够处理更大上下文(如 1M)的请求,避免可用请求被错误拒绝。影响范围:仅 Rust 前端 OpenAI 路由。
当前没有检测到明确关联的 Issue 链接,后续同步到相关引用后会出现在这里。
参与讨论