跳转至

配置参考

网关只读一个 YAML 文件,默认是 ./config.yaml;用 JEV_GATEWAY_CONFIG 环境变量可以改路径。

server:
  host: 0.0.0.0
  port: 8000

backend:
  type: openai
  base_url: http://127.0.0.1:8080
  model: null
  api_key: null
  timeout_seconds: 30.0
  max_concurrency: 32
  top_logprobs: 128
  supports_images: null
  extra_headers: {}
  extra_body: {}

request:
  max_questions: 64
  total_timeout_seconds: 60.0
  prompt_layout: fused

multimodal:
  enabled: true
  max_images: 4
  max_image_bytes: 5242880
  allow_remote_urls: false
  allowed_mime_prefixes: ["image/"]

logging:
  level: INFO

未知键直接报错,拼写错误在启动时失败而不是被忽略。

完整对照

段 键 默认值 说明
server host / port 0.0.0.0 / 8000
backend type openai 唯一支持的协议
backend base_url / model / api_key — / null / null model: null 时用后端自报模型名
backend timeout_seconds 30.0 单问题超时
backend max_concurrency 32 单网关实例并发上限
backend top_logprobs 128 16 – 4096;窗口外候选按下界截断
backend supports_images null(自动) true / false 强制指定
backend extra_headers / extra_body {} 云 API key、租户标识;见「推理模型」
request max_questions 64 单次请求 1 – 64 个问题
request total_timeout_seconds 60.0 整次请求预算
request prompt_layout fused fused | split
multimodal enabled / max_images / max_image_bytes true / 4 / 5242880 allow_remote_urls: false
logging level INFO

base_url 末尾的斜杠会被去掉,所以 http://127.0.0.1:8080/ 和 http://127.0.0.1:8080 等价。

各段说明

server

监听地址。默认 0.0.0.0:8000,容器镜像和 Docker Compose 模板用的就是这个。

backend

type 恒为 openai——网关只说一种协议。不同服务之间只有 base_url 会变,见 后端。

model: null 表示自动探测:网关会问服务的 /v1/models 并取它报告的第一个模型。会报出 多个模型的服务,或要求客户端指明用哪个的服务(vLLM、开了多个 served model 的 SGLang), 应显式固定。

top_logprobs 是 next-token 窗口的大小。两到四个候选时默认的 128 已经相当宽裕;看到 诊断里的 truncated: true 就上调,服务端拒绝大窗口时才下调。取值范围 16 – 4096。

supports_images: null 即「自动」:假定后端能接收图片,图片缺失时就不投递。模型没有 视觉塔时显式设为 false,图片请求会以 BACKEND_CAPABILITY_UNSUPPORTED 快速失败,而 不会打到后端。

extra_headers 会作为 HTTP 头合并进每个请求——云 API key、租户 id、项目名。extra_body 会合并进 JSON body;服务端「关思考」的开关就写在这里。两者都无法覆盖 messages、 max_tokens、logprobs 和 top_logprobs。

request

max_questions 限制单次请求能带多少问题(1 – 64)。超出的请求以 INVALID_REQUEST 拒绝。

total_timeout_seconds 是整次请求的总预算,所有问题加起来。由于问题并发执行,一个 64 问题、60 秒预算的请求,耗时大致仍等于最慢的那一个问题——除非后端已经饱和。

prompt_layout 可选 fused(默认,与参考网关逐字节兼容)或 split(对缓存友好)。 两者都在工作方式里有说明。

multimodal

键 默认值 含义
enabled true 为 false 时任何 images 都报 400
max_images 4 单次请求的图片数
max_image_bytes 5242880(5 MiB) 单图,base64 解码后计算
allow_remote_urls false 开启后才接受 https:// 图片引用
allowed_mime_prefixes ["image/"] 接受的媒体类型

allow_remote_urls 默认为 false,因为远程 URL 会让网关去取调用方指定的任意地址——这是 一个服务端请求伪造面。只有两端都归你所有时才应该打开。

logging

level 接受标准 Python 日志级别:DEBUG、INFO、WARNING、ERROR。默认 INFO。 每个响应本来就带 x-request-id,日志用的也是同一个 id,排查时直接 grep 它即可。

Prompt 布局一句话版

  • fused——单条 user message 含 {evidence, criterion, options},与参考网关逐字节兼容, 在托管 API 上测出的校准结论可以直接迁移。
  • split——证据(及图片)放第一条 user message,指令与选项放第二条。第一条在同一次请求 的所有问题之间完全相同,llama.cpp 可复用视觉编码和状态 prefill。延迟优先于字节兼容时用。