Prhub

#46582 [Rust Frontend] Raise frontend JSON body limit

原始 PR 作者 esmeetu 合并时间 2026-06-24 20:15 文件变更 2 提交数 1 评论 0 代码增减 +44 / -0

执行摘要

提高 Rust 前端请求体大小限制

支持 1M 上下文长度模型时,有效请求可能超过 Axum 默认的 2 MiB 限制,导致 "Failed to buffer the request body: length limit exceeded" 错误。

值得合并。该修复解决了实际用户问题,改动清晰且经过测试。

讨论亮点

仅有 BugenZhao 的批准评论 "Good catch. Thanks!",无其他讨论。

实现拆解

  1. 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))
  2. 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

关键符号

chat_completions_accepts_request_body_larger_than_axum_default

关键源码片段

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

未识别关联 Issue

当前没有检测到明确关联的 Issue 链接,后续同步到相关引用后会出现在这里。

完整报告

参与讨论