inferctl compared with InferFlux
Research date: 2026-09-07
inferctl baseline: v0.3.0, commit c50c21c
InferFlux baseline: v0.1.1, commit c4a8a7f
Decision
Use inferctl to inspect and select across existing inference backends. It does not serve models or pass inference traffic.
Use InferFlux to serve configured model runtimes through OpenAI-compatible
HTTP APIs. Its server binary is inferfluxd. It receives and processes
inference requests.
InferFlux can be one backend that inferctl inspects. They are complementary, not interchangeable.
Current inferctl update, 2026-09-08: This comparison records its detailed command research against inferctl v0.3.0. The current
mainbaseline is86ef4c2. It adds typed credential references, model aliases and capability evidence, requirement-aware selection, configuration fingerprints, and redacted execution handoffs. These additions do not change the request-path boundary in this article. See the preparation contract.
Important: InferFlux also ships a CLI named
inferctl. It is not this project. Both executables have the same name. Install them in separate paths or use absolute paths in scripts.
Main differences
| Area | inferctl | InferFlux |
|---|---|---|
| Main job | Read-only control plane for configured backends | Inference server and operator surface |
| Inference traffic | Never passes through it | Receives and serves requests |
| Primary executable | inferctl |
inferfluxd; the repository also has an unrelated inferctl client CLI |
| Model execution | Does not execute models | Serves configured models through its runtime backends |
| HTTP API | No inference API; emits command output | OpenAI-compatible completions, chat completions, model, and embeddings APIs; also health, metrics, and admin endpoints |
| Runtime scope | Inspects Ollama, llama.cpp, LM Studio, MLX, and generic OpenAI-compatible endpoints | CPU plus optional CUDA, ROCm, MPS, Vulkan, and MLX runtime options |
| Routing | Static task routes and fallback chains from inferctl configuration | A server scheduler and admin routing surface manage live request handling |
| Observability | Doctor reports, status frames, events, snapshots, and diffs | /livez, /readyz, /healthz, /metrics, optional UI, and admin APIs |
| Security and policy | Can use configured headers for OpenAI-compatible backends; redacts header values in diagnostics | Own API-key, RBAC, guardrail, audit, rate-limit, and admin surfaces |
| Model lifecycle | Does not load, unload, warm, release, proxy, or retry models | Runs the configured model service and exposes model/cache administration |
Architecture boundary
inferctl is out of the request path. It checks the configured endpoint, model inventory, and routing policy, then reports a route. The program that owns the request connects to the selected backend.
InferFlux is in the request path. Clients call its OpenAI-compatible endpoint;
the InferFlux server schedules the work, uses a selected runtime backend, and
returns the model result. Its published API includes /v1/completions,
/v1/chat/completions, /v1/models, /v1/models/{id}, and /v1/embeddings.
This difference matters for failures:
- inferctl can report that an InferFlux endpoint is reachable and that a model is listed. It cannot prove an inference response is good.
- InferFlux can receive a request, load and execute the configured runtime, apply its server policy, and return a response. It is the component that can add request latency or fail while serving traffic.
Best fit
| Need | Choose |
|---|---|
| Route one named task across several existing local backends | inferctl |
| Check a local-model job before it starts, without sending a prompt | inferctl |
| Detect control-plane change over time | inferctl |
| Serve a local GGUF model through an OpenAI-compatible API | InferFlux |
| Run concurrent requests through a shared server scheduler | InferFlux |
| Require server-side health endpoints, metrics, API keys, RBAC, guardrails, or rate limits | InferFlux |
| Use InferFlux as one member of a larger local backend fleet | Both |
Recommended composition
Configure inferfluxd as an openai_compat backend in inferctl. Then use
inferctl for selection and readiness, while the application sends inference
requests directly to InferFlux.
Example shape:
[backends.inferflux]
kind = "openai_compat"
base_url = "http://127.0.0.1:<port>/v1"
default = false
[routing.code]
backend = "inferflux"
model = "<model-id>"
Run inferctl doctor --json, inferctl models --json, and
inferctl route code --json to inspect that configuration. Your application
then calls the InferFlux OpenAI-compatible API at the configured base_url.
For a non-loopback InferFlux endpoint, set remote_allowed = true in the
inferctl backend configuration. Add the required authentication header through
inferctl configuration when InferFlux API-key policy requires it. inferctl
redacts configured header values in diagnostic output.
Command mapping
| Need | inferctl project | InferFlux project |
|---|---|---|
| Start the server | Not supported | InferFlux inferctl serve --config <path> starts inferfluxd |
| Send a completion | Not supported | InferFlux inferctl completion ... or an OpenAI-compatible client |
| Send chat completion | Not supported | InferFlux inferctl chat ... or POST /v1/chat/completions |
| List configured backend health | inferctl backends --json |
Server health endpoints report service health, not an inferctl backend fleet |
| List models across backends | inferctl models --json |
GET /v1/models returns InferFlux model service data |
| Select a task route | inferctl route <task> --json |
InferFlux has server routing administration, but not inferctl task-route explanations |
| Check automation readiness without inference | inferctl preflight <task> --json |
No equivalent inferctl control-plane preflight command |
| Watch and compare control-plane state | inferctl status --watch --events, snapshot, and diff |
/metrics and health endpoints provide service observation; they do not replace inferctl snapshots/diffs |
| Set runtime guardrails or rate limits | Not supported | InferFlux admin APIs and its own CLI |
| Download a GGUF model or create starter configuration | Not supported | InferFlux inferctl pull ... and inferctl quickstart ... |
Performance and production status
InferFlux publishes a concurrent GGUF benchmark for an RTX 4000 Ada and
Qwen2.5-3B Q4_K_M. Its April 2026 README benchmark reports that
inferflux_cuda has higher throughput than Ollama and LM Studio at concurrency
8, but that llama_cpp_cuda is faster in that test.
Do not treat the benchmark as a general production claim. That README says
native CUDA numerical precision caused about 60 percent of responses to differ
from the reference in its benchmark, and recommends llama_cpp_cuda for
production in that result. Other v0.1.1 native-runtime documentation reports
accuracy parity. The published documents are not fully consistent. Validate
your model, hardware, prompt set, correctness requirements, and concurrency
level before production use.
Limits and operational notes
- inferctl cannot start
inferfluxd, load a model, or correct a failed InferFlux request. It reports the configured control-plane facts only. - InferFlux does not replace inferctl when one workflow needs a single route explanation across Ollama, llama.cpp, LM Studio, MLX, and other configured OpenAI-compatible endpoints.
- The two projects use different configuration and command contracts. Do not send an inferctl-project TOML file to InferFlux or use InferFlux CLI commands as if they were inferctl-project commands.
- The executable name collision can cause a script to call the wrong tool.
Verify with
inferctl version --jsonand use an explicit binary path in CI. - inferctl has no packaged releases at this baseline; it is installed with the
Go toolchain or built from source. InferFlux documents a source build with
./scripts/build.sh.