llama.cpp b11077修复router模式API key传递:子实例不再收到 --api-key-file
在router模式下,认证归router管;此前子实例会重新用文件密钥校验,导致使用 --api-key的客户端在chat completions上收到 401,router内部的无鉴权流调用也被静默拒绝。
AI解读:这次修复解决的是llama.cpp在router模式下的一处认证错位:密钥本该只由router校验,但router启动的子实例也拿到了 --api-key-file,于是子实例自己拿文件里的密钥再校验一次。后果很具体——用 --api-key传密钥的客户端在chat completions上被挡回 401(issue #28820)。
更隐蔽的一处是router自己的内部调用。像POST /v1/streams/lookup和DELETE /v1/stream这类不带鉴权头的请求,也被子实例静默判成 401,用户侧可能只看到流相关的操作莫名其妙失败。
patch的做法是在unset_reserved_args() 里一并unset LLAMA_ARG_API_KEY_FILE。此前该函数已经清掉了LLAMA_API_KEY,却漏了这个文件变量,于是子实例只认文件密钥。现在所有API key都不再进入子实例的argv。
对用router模式跑多实例的人来说,直接变化是:router接受的任何密钥形式都能端到端走通,内部流调用不再 401,而且密钥也不会通过子进程命令行暴露。这属于行为修正,不是新功能。用户升级到b11077或更新构建即可,没有需要额外配置的开关。
llama.cpp发布b11077构建,其中一项服务器端修复(PR #28938)针对router模式下的API key传递:不再把 --api-key-file转发给router启动的子实例。
背景是router模式中认证应由router统一负责。unset_reserved_args() 已经会unset LLAMA_API_KEY,但遗漏了LLAMA_ARG_API_KEY_FILE,所以当用户传入 --api-key-file时,子实例只按文件内的密钥重新校验。结果是使用 --api-key的客户端在chat completions上收到 401,对应issue #28820。
同一遗漏还影响router内部调用:不带鉴权头的请求,例如POST /v1/streams/lookup和DELETE /v1/stream,被静默拒绝并返回 401。修复方式是在unset_reserved_args() 中unset LLAMA_ARG_API_KEY_FILE,使任何API key都不再抵达子实例。
据发布说明,这样做的效果是:密钥不再出现在子进程的argv中;router接受的所有密钥都能端到端工作;router内部流调用不再返回 401。该改动关闭issue #28820。
b11077附带的构建产物
b11077作为一次常规发布,同时提供多平台二进制包。发布说明列出macOS/iOS、Linux、Android、Windows以及openEuler的产物;其中macOS的KleidiAI启用版本和openEuler相关构建标记为DISABLED。另有UI包一并发布。
- macOS:Apple Silicon(arm64)、Intel(x64)、iOS XCFramework;KleidiAI启用版标记为DISABLED
- Linux:Ubuntu x64/arm64/s390x(CPU),以及Vulkan、CUDA 12.8、CUDA 13.4、ROCm 10.0、OpenVINO、SYCL FP32/FP16版本,附CUDA 12.8、CUDA 13.4运行库
- Android:arm64(CPU)
- Windows:x64/arm64(CPU)、arm64(OpenCL Adreno),以及CUDA 12.4、CUDA 13.4、Vulkan、OpenVINO、SYCL、ROCm 10.0版本,附CUDA 12.4、CUDA 13.4 DLL
- openEuler:x86 310p/910b与aarch64 310p/910b均标记为DISABLED
- 另有UI包