Instructions to use expedient-ai/CTRL-2B with libraries, inference providers, notebooks, and local apps. Follow these links to get started.
- Libraries
- PEFT
How to use expedient-ai/CTRL-2B with PEFT:
Task type is invalid.
- Notebooks
- Google Colab
- Kaggle
- Local Apps Settings
- llama.cpp
How to use expedient-ai/CTRL-2B with llama.cpp:
Install (macOS, Linux)
curl -LsSf https://llama.app/install.sh | sh # Start a local OpenAI-compatible server with a web UI: llama serve -hf expedient-ai/CTRL-2B:Q4_K_M # Run inference directly in the terminal: llama cli -hf expedient-ai/CTRL-2B:Q4_K_M
Install from WinGet (Windows)
winget install llama.cpp # Start a local OpenAI-compatible server with a web UI: llama serve -hf expedient-ai/CTRL-2B:Q4_K_M # Run inference directly in the terminal: llama cli -hf expedient-ai/CTRL-2B:Q4_K_M
Build from source code
git clone https://github.com/ggml-org/llama.cpp.git cd llama.cpp cmake -B build cmake --build build -j --target llama-app # Start a local OpenAI-compatible server with a web UI: ./build/bin/llama serve -hf expedient-ai/CTRL-2B:Q4_K_M # Run inference directly in the terminal: ./build/bin/llama cli -hf expedient-ai/CTRL-2B:Q4_K_M
Use Docker
docker model run hf.co/expedient-ai/CTRL-2B:Q4_K_M
- Llama new
- LM Studio
- Jan
- vLLM
How to use expedient-ai/CTRL-2B with vLLM:
Install from pip and serve model
# Install vLLM from pip: pip install vllm # Start the vLLM server: vllm serve "expedient-ai/CTRL-2B" # Call the server using curl (OpenAI-compatible API): curl -X POST "http://localhost:8000/v1/chat/completions" \ -H "Content-Type: application/json" \ --data '{ "model": "expedient-ai/CTRL-2B", "messages": [ { "role": "user", "content": "What is the capital of France?" } ] }'Use Docker
docker model run hf.co/expedient-ai/CTRL-2B:Q4_K_M
- Ollama
How to use expedient-ai/CTRL-2B with Ollama:
ollama run hf.co/expedient-ai/CTRL-2B:Q4_K_M
- Unsloth Desktop
- Pi
How to use expedient-ai/CTRL-2B with Pi:
Start the llama.cpp server
# Install llama.cpp: brew install llama.cpp # Start a local OpenAI-compatible server: llama serve -hf expedient-ai/CTRL-2B:Q4_K_M
Configure the model in Pi
# Install Pi: npm install -g @earendil-works/pi-coding-agent # Add to ~/.pi/agent/models.json: { "providers": { "llama-cpp": { "baseUrl": "http://localhost:8080/v1", "api": "openai-completions", "apiKey": "none", "models": [ { "id": "expedient-ai/CTRL-2B:Q4_K_M" } ] } } }Run Pi
# Start Pi in your project directory: pi
- Docker Model Runner
How to use expedient-ai/CTRL-2B with Docker Model Runner:
docker model run hf.co/expedient-ai/CTRL-2B:Q4_K_M
- Lemonade
How to use expedient-ai/CTRL-2B with Lemonade:
Pull the model
# Download Lemonade from https://lemonade-server.ai/ lemonade pull expedient-ai/CTRL-2B:Q4_K_M
Run and chat with the model
lemonade run user.CTRL-2B-Q4_K_M
List all available models
lemonade list
- Hermes Agent
How to use expedient-ai/CTRL-2B with Hermes Agent:
Start the llama.cpp server
# Install llama.cpp: brew install llama.cpp # Start a local OpenAI-compatible server: llama serve -hf expedient-ai/CTRL-2B:Q4_K_M
Configure Hermes
# Install Hermes: curl -fsSL https://hermes-agent.nousresearch.com/install.sh | bash hermes setup # Point Hermes at the local server: hermes config set model.provider custom hermes config set model.base_url http://127.0.0.1:8080/v1 hermes config set model.default expedient-ai/CTRL-2B:Q4_K_M
Run Hermes
hermes
- Atomic Chat
- OpenClaw
How to use expedient-ai/CTRL-2B with OpenClaw:
Start the llama.cpp server
# Install llama.cpp: brew install llama.cpp # Start a local OpenAI-compatible server: llama serve -hf expedient-ai/CTRL-2B:Q4_K_M
Configure OpenClaw
# Install OpenClaw: npm install -g openclaw@latest # Register the local server and set it as the default model: openclaw onboard --non-interactive --mode local \ --auth-choice custom-api-key \ --custom-base-url http://127.0.0.1:8080/v1 \ --custom-model-id "expedient-ai/CTRL-2B:Q4_K_M" \ --custom-provider-id llama-cpp \ --custom-compatibility openai \ --custom-text-input \ --accept-risk \ --skip-health
Run OpenClaw
openclaw agent --local --agent main --message "Hello from Hugging Face"
CTRL-2B
Try it out: the CTRL-2B demo Space runs the sample questions below as one-click buttons. This card also exists as an interactive page on the CTRL-2B card Space.
CTRL-2B, the Expedient agent model. A retrieval-grounded support agent for Expedient's cloud-infrastructure knowledge base, built on a QLoRA adapter of openbmb/MiniCPM5-2B (LlamaForCausalLM, Apache-2.0), trained on first-party and source-verified KB question/answer pairs.
Codename lineage: trained as
expedient-agent-minicpm5-2b-v2; shipped as CTRL-2B to match the AI CTRL product family.
Design: the adapter supplies voice, retrieval supplies truth. Closed-book answers are not a supported mode; every deployment pairs the adapter with excerpts from the KB index (bge-small-en-v1.5 โ cross-encoder rerank โ top-3 injected) and an abstention gate at the measured lens threshold.
Measured results
All numbers come from on-disk eval summaries (see LINEAGE.json and
MEASUREMENTS.md; instruments pinned in INSTRUMENTS.sha256). Metrics:
number-fact recall (gold numbers present in the answer) and precision
(answer numbers present in gold, so invented numbers are the hallucination
signal).
Closed-book, held-out questions (26 rows):
| Arm | Recall | Precision |
|---|---|---|
| Base MiniCPM5-2B | 0.692 | โ |
| This adapter | 0.772 | 0.865 |
Open-book (adapter + retrieved excerpts), the supported posture:
| Eval | Rows | Index | Hit@3 | Recall | Precision |
|---|---|---|---|---|---|
| Held-out val | 26 | 257 | 26/26 (rank 0.0) | 0.962 | 0.962 |
| Production shape | 94 | 939 | 94/94 (rank 0.0) | 0.943 | 0.945 |
GGUF Q8_0 engine parity (llama-server, 26 rows): open-book 1.000 / 0.981, overall 0.889. The export reproduces adapter behavior.
Corpus
Five sources feed the v2 corpus. The belt shows rows collected before review; the gate decides what ships.
| Source | Type | Rows |
|---|---|---|
| Nutanix | Vendor docs | 522 |
| VMware VCF9 | Vendor docs | 504 |
| Expedient KB | First-party | 218 |
| Zerto | Vendor docs | 71 |
| Cohesity | Vendor docs | 62 |
| Five source sets | 1,377 |
The v2 corpus holds 939 rows (845 train / 94 val) after review and
dedupe: 258 first-party reviewed rows plus 681 promoted through automated
source-page verification (review_status agent-assisted-review-2026-11-03).
The 1,005 unreviewed vendor rows triaged: 682 accepted, 207 rejected, 116
held for human review.
Robustness and the gate
Paraphrased questions (hand-rewritten): recall 0.962, precision 0.962, hit@3 26/26. Out-of-domain questions (general knowledge, competitor platforms): the composite abstention gate (lens 0.74, measured for this vehicle) catches 15/15. Prompted-only abstention does not work (20%); the gate is required.
Training
- QLoRA: r16 / ฮฑ32, lr 2e-4 cosine, eff. batch 16, 4 epochs, 211 steps (~54 min on an RTX 4050 Laptop 6 GB), bf16 compute, NF4 double-quant base
- Assistant-only supervision via fail-loud string-prefix masking
- A 4B control run bought no clear quality gain for twice the size, at 19.9 seconds per step versus 15.4. 2B ships.
Sibling model โ CTRL-0.6B
For demos that must run inside a browser tab, use CTRL-0.6B: the same corpus and recipe on Qwen3-0.6B, shipped as a 378 MB Q4_K_M GGUF that llama.cpp WASM can load client-side.
CTRL-2B is the model to use when quality matters (0.772 closed-book recall / 0.865 precision vs 0.692 / 0.846 for the 0.6B). CTRL-0.6B is the model that fits on a web page. Both reach ~0.96 recall with retrieval.
Try it: sample questions
An interactive version of this card runs as a Hugging Face Space: the working theme toggle, the Hold-Ctrl gate demo, and the corpus conveyor.
Curated test questions with the key facts a good answer contains. Answers are retrieval-grounded: pair the adapter with these KB excerpts and the abstention instruction.
Core KB facts
| Question | A good answer contains |
|---|---|
| What types of PII can AI CTRL's prompt filter detect and redact? | email ยท phone ยท SSN ยท credit card ยท IP addresses |
| What is AI CTRL, and how is customer data handled? | multi-model AI gateway ยท dedicated private environment ยท data not used to train models |
| How do I submit a remote hands request? | ticket required ยท OSC/SMC ticket ยท Project Change Request via account manager |
| What RPO settings does Expedient recommend for Nutanix DR? | Async 1-hour RPO ยท NearSync 1โ15 min ยท synchronous unsupported |
Exact numbers and versions
| Question | A good answer contains |
|---|---|
| What is Expedient's aggregate data center footprint? | 35 MW ยท 472K sq ft ยท 247K raised floor |
| How many vCPUs per Kubernetes worker node for a CSE cluster? | two per node ยท deployment fails below two |
| When does a standard connector sync content, and how long does setup take? | โค50,000 docs ยท five business days ยท daily incremental sync |
| Can a new deployment go directly to VCF 9.0.2? | Yes โ no 9.0.0/9.0.1 upgrade path needed |
Procedures and navigation
| Question | A good answer contains |
|---|---|
| Where do I change CPU, memory, disk, or NIC resources for an EEC VM? | VM Details โ Hardware section ยท guest reboot required |
| If we use our own Active Directory for GlobalProtect, who manages it? | OneLogin default ยท client-supplied = client's responsibility |
| Which markets does Expedient operate data centers in? | Columbus ยท Cleveland ยท Indianapolis ยท Kansas City ยท Pittsburgh ยท Toledo |
Beyond the KB (should abstain, not invent)
| Question | Expected |
|---|---|
| How much does Expedient charge for bandwidth overages? | KB doesn't cover pricing |
| Does Expedient support IPv6 on dedicated internet access? | KB doesn't state |
| How do I deploy a container to Azure Kubernetes Service? | competitor platform โ out of scope |
Usage
Runtime (adapter + retrieval + gate):
# see agent_runtime.py in the training repo; loads this adapter,
# retrieves top-3 excerpts per question, generates greedily, and
# abstains when the lens gate (geo-mean answer-token prob < 0.74) fires
GGUF Q8_0 (merged) included for llama.cpp serving โ mainline conversion, MiniCPM5-2B reports model_type "llama".
Governance
- Base model: Apache-2.0; this adapter ships under Apache-2.0.
- Corpus sources: Expedient first-party KB drafts plus vendor documentation (Nutanix, Broadcom/VMware) paraphrased and source-verified against the live pages (hash-pinned in the lineage record). Rights for the underlying vendor content remain with the respective publishers; this release is intended for Expedient-internal support use pending the corpus owner's final rights call.
- Known limits: facts live in retrieval, not in weights. Closed-book mode confabulates specifics (precision 0.865, not 1.0); the abstention gate is mandatory in production.
Reproducibility
LINEAGE.json pins the adapter, corpus, and export hashes;
MEASUREMENTS.md lists every published number and its source summary;
INSTRUMENTS.sha256 pins the eval instruments (val split, paraphrase and
OOD probe sets).
- Downloads last month
- 16
4-bit
8-bit




