llama.cpp stops handing the API key file to child servers in router mode
Build b11077, published on September 21, 2026, fixes an authentication bug in llama.cpp's router mode. When a server was started with both a key on the command line and a file of keys, the child instances it spawned validated against the file only, so a client using the command-line key could list models but got 401 on every chat request. The same change stops the key file path from reaching a child process at all. It is one line in one file, and it is the difference between a working deployment and one that looks healthy while refusing work.
Router mode in llama.cpp puts one server in front of several model instances, and authentication belongs to the front. That was not what the code did. Until build b11077, published on September 21, 2026, a router started with both --api-key and --api-key-file passed the file through to the instances it spawned, and those instances then accepted only the keys in that file.
What went wrong
The bug was reported on September 12, 2026 by an operator running a router on a Mac with both key sources configured. Requests to list models were accepted with every key, router key and file keys alike. Chat completion requests, which the router proxies to a child instance, accepted the file keys and answered the command-line key with 401 and an invalid-key message. A client that could see the model list could not use a single model.
The cause was one missing entry. The routine that strips reserved arguments before a child is started unset the environment variable holding the key, but not the variable holding the path to the key file, so only that second source survived into the child's arguments. The reporter also noticed the file flag sitting in the child's process arguments, where anyone able to list processes on that machine can read it. Router-internal calls that carry no authentication header were rejected with 401 as well, silently.
- Reported on September 12, 2026; merged and released on September 21, 2026.
- Symptom: the model list answers every key, chat completions answer only the file keys.
- Side effect: the key file path appeared in the child process arguments.
- The fix is one added line in one file.
What the fix changes
The change adds the key-file variable to the list of arguments that are unset before a child is spawned. No API key of either kind now reaches a child instance, every key the router accepts works through the whole request, and the router's own internal stream calls stop returning 401. The reasoning in the pull request is a single sentence of policy: in router mode, authentication belongs to the router.
The maintainers state the security half plainly as well, that the change keeps keys out of child argv. Process arguments are not a secret store. On a shared machine they are readable by other accounts, and they end up in process listings, crash reports and monitoring agents that were never meant to hold credentials.
What to do about it
If you run llama.cpp in router mode with a key file, update to b11077 or later. The failure mode is worth recognising even after the upgrade, because it is the kind that wastes an afternoon: the server starts, the health endpoints answer, the model list answers, and only the requests that do work come back rejected.
One possible explanation for how long it survived is that the two key sources look interchangeable from the outside. Both simply add keys to the accepted list, so nobody would expect one of them to also decide what the child process validates against. The bug had been in place since the preset refactor the reporter names, which is the other reason to read this kind of fix: it tells you which configurations nobody was testing.
„This keeps keys out of child argv“
Sources
Related
llama.cpp now runs PrismML's ternary Bonsai 2 27B without the company's fork
Build b11556 adds the weight rotation step that Bonsai 2 27B was missing in stock llama.cpp. The 7.63 GB Q2_0 file now gives correct output there, while PrismML's smaller PQ2_0 and PTQ1_0 packs still require the company's own build.
llama.cppverified

Google open-sources ML Drift, the GPU engine inside LiteRT, and stops adding features to the TFLite GPU delegate
Google's AI Edge team released ML Drift under the Apache 2.0 license on October 8, 2026. It is the engine that runs on-device models on the GPU in LiteRT, and it also ships as a standalone library. The older TFLite GPU delegate gets no new features from now on, so apps built on it face a migration.
Google Developers Blogverified
llama.cpp 0.6.0 adds GLM-5.3-Flash support and a server API for decision models
The llama.cpp project released version 0.6.0 on October 5, 2026. It adds support for GLM-5.3-Flash, a model for text and images with 320 billion parameters, and a new server endpoint for decision models. Two changes to speculative decoding come with measurements from their authors, one on Nvidia's DGX Spark and one on Apple GPUs. The release also changes the C API and raises the version of the saved session format, so programs built on the library need a check before you upgrade.
llama.cppverified
