Run Strands Decider v19 typed decisions on a Linux desktop
Load the exact v19 LoRA adapter and pointer head over its published, inferred Qwen3.5-2B-Base revision. Serve yes/no probabilities, named choices and ordered scores through /v1/systemone on a trusted CPU-only Intel i5-12400 desktop. This recipe uses a 4,096-token strict window, one question per forward, four-thread allocation and no shared-prefix cache. It is documented, not an executed fit or performance claim.
- Hardware
- Intel Core i5-12400 desktop, 4 inference threads, 32 GiB RAM
- Runtime
- Strands Decider source runtime source commit 6039cf8b64c6074e75804000c07ac3d4cce795f7 · CPU
- Model format
- safetensors+PEFT · Configured BF16 loading, then CPU engine upcasts half-precision torso/adapter to FP32; readout FP32. · No GGUF quantization; native PEFT adapter, readout and Qwen base files
- Workload
- 4,096 token context · 1 concurrent
Based on source documentation; this setup has not been executed by OpenTools. Memory: unknown. No compatible measurement available.
Read the complete setup guide
Before you start
- Use an owned Intel Core i5-12400 desktop with Ubuntu 24.04 x86_64. Allocate four inference threads, 32 GiB installed RAM and 40 GiB free disk. Build/install on this host and verify motherboard/DIMM support before any RAM upgrade.
- These are author resource allocations, not measured minimums or full-fit guarantees. CPU engine upcasts the configured half-precision torso, including its attached adapter, to FP32; the head is FP32. Exact total peak RAM, latency and throughput remain unknown.
- Use Python 3.10 or later. Pin the source runtime commit; its CPU extra exists in that source, and must not be assumed to exist in the older released PyPI package. Standard package dependencies will resolve at install time; save pip freeze.
- Read Apache License 2.0 for both the v19 checkpoint and Qwen base. Downloading requires network access and disk, but no provider inference API key or GPU rental.
Exact model and requirements
- Artifact:
- Strands Agents; Qwen base model / Strands Decider 2B hobson v19 base + LoRA + pointer head · checkpoint StrandsAgents/strands-decider-2B-hobson-v19
- Publisher revision:
- bb282d786bc251fd4e3068de3ada9ddbb38127cd
- Artifact digest:
- Composite checkpoint and separately pinned base have multiple hashes; exact component SHA256 values are pinned in auxiliary artifacts and recipe.
- Download size:
- 4.3 GiB
- Memory requirement (unknown):
- Unknown — No exact full-process CPU peak for pinned base/adapter/head workload.
- System RAM / disk:
- Unknown / Unknown
- Placement:
- single device. One CPU host; no model sharding. CPU-only torch execution; no accelerator or disk offload configured.
- KV cache:
- Torch runtime manages attention and recurrent state. Prefix cache disabled; exact state/cache precision and peak bytes not separately measured.
- Workload:
- 4,096 token context; Unknown; Not applicable; concurrency 1; batch 1; cache cold; repetitions Unknown.
- Tokenizer:
- Exact v19 exported tokenizer · bb282d786bc251fd4e3068de3ada9ddbb38127cd
- Sampling / reasoning:
- No autoregressive generation sampler. v19 per-kind calibration: noul 0.9107136998460428; choice 0.734189596436441; score 1.32780942142348. No text reasoning trace or decode loop. Typed classification/readout over a state and explicit question options.
- Runtime prerequisites:
- Ubuntu 24.04 x86_64; See prerequisites above.
Strands v19 and its runtime declare Apache License 2.0; the pinned Qwen base is also Apache 2.0. Read and retain applicable license, copyright, attribution and modification notices when distributing covered work. Dataset attribution in the v19 license does not make unrelated dataset uses automatically permitted.
- Qwen base weight shard · 4.24 GiB · revision b1485b2fa6dfa1287294f269f5fb618e03d52d7c
- Qwen base config · 0 GiB · revision b1485b2fa6dfa1287294f269f5fb618e03d52d7c
- lora/adapter_model.safetensors · 0.06 GiB · revision bb282d786bc251fd4e3068de3ada9ddbb38127cd
- lora/adapter_config.json · 0 GiB · revision bb282d786bc251fd4e3068de3ada9ddbb38127cd
- head.safetensors · 0 GiB · revision bb282d786bc251fd4e3068de3ada9ddbb38127cd
- hobson_config.json · 0 GiB · revision bb282d786bc251fd4e3068de3ada9ddbb38127cd
- provenance.json · 0 GiB · revision bb282d786bc251fd4e3068de3ada9ddbb38127cd
- tokenizer.json · 0.02 GiB · revision bb282d786bc251fd4e3068de3ada9ddbb38127cd
- tokenizer_config.json · 0 GiB · revision bb282d786bc251fd4e3068de3ada9ddbb38127cd
- Base download includes the original multimodal checkpoint shard, while text loader keeps only its decoder. Download bytes do not establish runtime working memory.
- FP32 CPU torso plus head, adapter, tokenizer, recurrent/attention state, packages and OS require more than just on-disk weight size. No generic token throughput claim is applicable.
One-time setup and hardware
- hardware
- Unknown — Existing desktop purchase price and incremental hardware cost depend on the reader; unknown.
- Existing desktop purchase price and incremental hardware cost depend on the reader; unknown. Tax: unknown.
- setup
- Unknown — Initial provisioning/build time and labor cost are unknown.
- Initial provisioning/build time and labor cost are unknown. Tax: unknown.
Recurring costs
- electricity
- Unknown — Actual wall power, electricity rate and powered hours are unknown; no TDP-to-wall-power conversion.
- Actual wall power, electricity rate and powered hours are unknown; no TDP-to-wall-power conversion. Tax: unknown.
- storage
- Unknown — Incremental cost of local disk capacity is unknown. The 40 GiB free-disk walkthrough allocation is an author choice, not a measured requirement.
- Incremental cost of local disk capacity is unknown. The 40 GiB free-disk walkthrough allocation is an author choice, not a measured requirement. Tax: unknown.
- egress
- Unknown — Data transfer price, allowances and traffic volume are unknown.
- Data transfer price, allowances and traffic volume are unknown. Tax: unknown.
- administration
- Unknown — Maintenance labor rate and hours are unknown.
- Maintenance labor rate and hours are unknown. Tax: unknown.
Install the runtime
1. Install the exact CPU source runtime
Create a dedicated virtual environment and install the pinned source tree. Its pyproject declares torch >=2.7, transformers >=5.15,<6, PEFT >=0.21 and related dependencies. No CUDA-specific extra is selected. Dependency versions are not a fully locked environment; retain the resolved freeze with any execution evidence.
Commandsudo apt-get update sudo apt-get install -y python3 python3-venv python3-pip git curl ca-certificates mkdir -p "$HOME/strands-v19-hosting" cd "$HOME/strands-v19-hosting" python3 -m venv .venv source .venv/bin/activate python -m pip install --upgrade pip git clone https://github.com/strands-labs/strands-decider.git runtime git -C runtime checkout --detach 6039cf8b64c6074e75804000c07ac3d4cce795f7 python -m pip install -e './runtime[cpu]' python -m pip freeze > installed-packages.txtExpected result: Source checkout is exactly pinned; installation succeeds and installed-packages.txt records resolved dependencies. No inference has run yet.
Download the model
1. Freeze the complete v19 export and its documented base revision
Download the full v19 snapshot into a local folder so the server never resolves checkpoint main. Prefetch the published base revision into the normal Hub cache. The base pin is explicitly inferred in provenance, not proof of the exact historical training revision. Keeping the full snapshot allows the publisher manifest verification.
Commandcd "$HOME/strands-v19-hosting" source .venv/bin/activate python - <<'PYDOWNLOAD' from huggingface_hub import snapshot_download snapshot_download(repo_id='StrandsAgents/strands-decider-2B-hobson-v19', revision='bb282d786bc251fd4e3068de3ada9ddbb38127cd', local_dir='./checkpoint') snapshot_download(repo_id='Qwen/Qwen3.5-2B-Base', revision='b1485b2fa6dfa1287294f269f5fb618e03d52d7c') PYDOWNLOAD python -m strands_decider.hf_export verify ./checkpointExpected result: Complete checkpoint files match MANIFEST.sha256. Base cache resolves the explicit revision. Stop on missing adapter/head/config/tokenizer or verification failure.
2. Verify critical adapter, head and base weight bytes
The checkpoint manifest and explicit hashes bind the v19 adapter/head; verify the single base shard in the pinned Hub cache as well. No file is modified to substitute a different base.
Commandcd "$HOME/strands-v19-hosting" sha256sum --check <<'SHACHECK' 701bdb895887097f7954ec7eb06f7937d3b790035b5462195eb26abd80a4aebc checkpoint/lora/adapter_model.safetensors daad0727152b6185447cee36f78230c144312feb7b19f02749b19645238b5287 checkpoint/head.safetensors SHACHECK source .venv/bin/activate python - <<'PYBASE' from huggingface_hub import hf_hub_download import hashlib f=hf_hub_download(repo_id='Qwen/Qwen3.5-2B-Base',filename='model.safetensors-00001-of-00001.safetensors',revision='b1485b2fa6dfa1287294f269f5fb618e03d52d7c') h=hashlib.sha256() with open(f,'rb') as stream: for chunk in iter(lambda: stream.read(8*1024*1024), b''): h.update(chunk) assert h.hexdigest() == '928acbf11878c32185bbd863514d191769285065ab9ea14fbfe431303f5fdf2d', 'Base weight mismatch' print('Pinned base weight SHA256 OK') PYBASEExpected result: Adapter and head report OK; pinned base weight SHA256 OK. This verifies bytes, not runtime fit or accuracy.
Configure
1. Check base resolution and CPU settings
The pinned loader reads hobson_config.json for this legacy export. It takes config.base_revision first, otherwise matching provenance.base_model_revision, then passes that revision to AutoConfig and Qwen3_5ForCausalLM. It attaches PEFT from lora/ and restores head.safetensors. Confirm those identities before starting. OMP/MKL four-thread values are a runtime allocation; use one client request at a time for this walkthrough.
Commandcd "$HOME/strands-v19-hosting" source .venv/bin/activate python - <<'PYCHECK' import json from strands_decider.modeling import StrandsDeciderConfig,base_revision,config_path p='./checkpoint' c=StrandsDeciderConfig.from_json(config_path(p)) assert c.base_model == 'Qwen/Qwen3.5-2B-Base' assert base_revision(p,c) == 'b1485b2fa6dfa1287294f269f5fb618e03d52d7c' assert c.max_length == 4096 and c.num_slots == 24 and c.use_lora print('v19 config and published inferred base revision match') PYCHECKExpected result: Config window 4096, slots 24 and published inferred base revision match. This check does not load model weights into inference.
Start the model
1. Serve typed text decisions on CPU
Run in a foreground terminal. --strict-window rejects overlong input instead of truncating its end. --max-batch 1 processes one question per forward; three questions still receive three typed answers. Prefix caching is explicitly disabled for this basic configuration. This setting does not enforce a global one-client limit; keep the walkthrough at one request at a time. No text-generation sampler or API credential is used.
Commandcd "$HOME/strands-v19-hosting" source .venv/bin/activate export OMP_NUM_THREADS=4 MKL_NUM_THREADS=4 strands-decider serve ./checkpoint --host 127.0.0.1 --port 8000 --device cpu --model-name strands-v19 --strict-window --max-batch 1 --no-prefix-cacheExpected result: Weights, adapter and head load; health becomes available on loopback. Stop if files, base identity or loading fail.
Connect to your endpoint
http://127.0.0.1:8000/v1/systemone
Same trusted desktop loopback only; run the client on this machine.
Access: loopback. The native Strands server has no authentication. Other local users can call it. Use a trusted single-user host; A public/shared deployment needs separately designed TLS and authenticated access.
Verify the setup
1. Verify health and all three decision primitives
Use a second terminal on the server. No API key is required because the native server has no authentication. Do not expose it publicly. Health must identify this v19 setup, CPU, max_length 4096, vision false and prefix_cache false. The example checks an obvious billing triage case; probabilities/confidence are not guaranteed to equal the old model-card example.
Commandcd "$HOME/strands-v19-hosting" curl --fail http://127.0.0.1:8000/health cat > decision-request.json <<'REQUEST' { "state": "Help! My payouts have been failing for 3 days!", "questions": { "urgent": { "type": "noul", "instructions": "Does this convey urgency?" }, "team": { "type": "choice", "instructions": "Which team should handle this?", "criteria": { "billing": "payout and payment problems", "sales": "buying a product", "retail": "physical store requests" } }, "frustration": { "type": "score", "instructions": "How frustrated is the writer?", "criteria": [ "calm", "frustrated", "very frustrated" ] } } } REQUEST curl --fail http://127.0.0.1:8000/v1/systemone -H 'Content-Type: application/json' --data-binary @decision-request.json --output decision-response.json cat decision-response.jsonExpected result: HTTP 200 response with model strands-v19 and answers.urgent.noul in [0,1], answers.team.choice naming a declared team with probabilities/confidence, and answers.frustration.score in [0,2] with level legend/probabilities/confidence. The obvious team should be billing; inspect it. No choices[0].message.content or generated-token claim is expected. Wrong labels require task validation, not blind automation.
Performance evidence
No compatible measurement available. Documented support and estimated memory do not establish response speed.
Limits and troubleshooting
- This is a typed decision model, not a general text-chat or token-generation endpoint. noul gives P(true); choice gives a named option; score gives an expectation over ordered level indices. Generated output tokens are not applicable.
- The frozen v19 export is a LoRA adapter plus pointer head over Qwen3.5-2B-Base. All three are required. The source loader preserves v19’s legacy config and reads the published inferred base pin; training hosts did not pin that base, so this is a reproducible published inference choice, not certain historical training provenance.
- Checkpoint max_length is 4096. Its metadata num_slots is 24, but v19 uses a pointer head, so num_slots does not impose a choice-option ceiling. The request schema permits 2–255 choice options, still subject to the rendered context window. Score rubrics use 2–10 ascending levels. Strict-window overflow returns HTTP 422; verify the intended labels and token budget.
- CPU execution upcasts its half-precision torso to FP32 and uses CPU-specific kernels; the head is FP32. No full process memory, per-request latency, throughput or cost was measured. Do not infer peak RAM from download bytes or transfer another version/device benchmark.
- Per-kind calibration temperatures are from v19 config (noul 0.9107136998460428, choice 0.734189596436441, score 1.32780942142348), not generation sampling settings. Calibration was fitted to held-out short tasks; measure your own traffic before trusting a confidence threshold.
- Publisher warns question wording is read less than state/options, long multi-step documents are weak, and score/noul transfer poorly to unfamiliar rubrics. Do not equate a high returned confidence with safety or correctness. Validate the intended task and failure handling.
- This item is text-only. Requests carrying images are rejected when the server is not started with --vision. Supported v19 visual typed-decision jobs are a separate required guide scope; this item does not claim to complete them.
- The current pinned source is newer than the original v19 card. No newer v1 benchmark/calibration results or exact old example probabilities are transferred. Dependency ranges are declared but not fully locked; preserve installed-packages.txt with actual run evidence.
- Missing adapter/head, bad checksum or unexpected base model
- Stop. Restore the complete exact v19 snapshot and manifest, including lora/, head, config, tokenizer and provenance. Verify critical SHA256 values and the inferred base revision. Do not serve just the adapter or silently fall back to main.
- Import error or unknown Qwen3.5 class
- Confirm pinned source checkout, active virtual environment and declared dependency constraints. Avoid assuming PyPI 0.1.0 includes current device extras. Keep the resolver log and pip freeze; do not substitute a generative chat runtime.
- HTTP 422 or slow/out-of-memory request
- Check the request schema: 2–255 named choice options and 2–10 ordered score levels. v19’s pointer head is not capped by metadata num_slots 24. Keep rendered state/questions/options inside the strict 4096 window and process one request at a time. Free/provision resources or shorten input; record changes. No measured fit or speed is promised.
- High-confidence wrong choice or unsuitable score
- Check that state/options express the intended decision, simplify long multi-step documents and validate on representative labeled traffic. Adjust task design or train/calibrate separately; do not enable automatic action based solely on confidence.
- Connection refused
- Check foreground server logs, CPU health and loopback port 8000. Run the client on the same trusted desktop.
Stop the model
1. Stop the server and release the model
Press Ctrl+C in the foreground server terminal. Confirm localhost:8000 no longer serves decisions.
Expected result: Server stops; loopback endpoint no longer responds.
Uninstall
1. Remove only dedicated walkthrough files
Back up wanted request/results and installed-packages.txt. Remove the dedicated folder after confirming its path. The shared Hugging Face base cache remains; list/manage it separately with the installed Hub CLI and remove only unwanted exact repositories/revisions, as other workloads may share it.
Commandrm -r -- "$HOME/strands-v19-hosting"Expected result: Dedicated runtime/venv/checkpoint files removed. Shared Hub cache and system packages are not blindly deleted.
Sources and verification
Sources checked Oct 16, 2026. Verification source
- https://huggingface.co/StrandsAgents/strands-decider-2B-hobson-v19/raw/bb282d786bc251fd4e3068de3ada9ddbb38127cd/README.mdpublisher · retrieved Oct 16, 2026 · revision bb282d786bc251fd4e3068de3ada9ddbb38127cd
- https://huggingface.co/StrandsAgents/strands-decider-2B-hobson-v19/raw/bb282d786bc251fd4e3068de3ada9ddbb38127cd/hobson_config.jsonpublisher · retrieved Oct 16, 2026 · revision bb282d786bc251fd4e3068de3ada9ddbb38127cd
- https://huggingface.co/StrandsAgents/strands-decider-2B-hobson-v19/raw/bb282d786bc251fd4e3068de3ada9ddbb38127cd/provenance.jsonpublisher · retrieved Oct 16, 2026 · revision bb282d786bc251fd4e3068de3ada9ddbb38127cd
- https://raw.githubusercontent.com/strands-labs/strands-decider/6039cf8b64c6074e75804000c07ac3d4cce795f7/src/strands_decider/modeling.pyruntime maintainer · retrieved Oct 16, 2026
- https://raw.githubusercontent.com/strands-labs/strands-decider/6039cf8b64c6074e75804000c07ac3d4cce795f7/src/strands_decider/infer.pyruntime maintainer · retrieved Oct 16, 2026
- https://raw.githubusercontent.com/strands-labs/strands-decider/6039cf8b64c6074e75804000c07ac3d4cce795f7/src/strands_decider/schema.pyruntime maintainer · retrieved Oct 16, 2026
- https://huggingface.co/StrandsAgents/strands-decider-2B-hobson-v19/raw/bb282d786bc251fd4e3068de3ada9ddbb38127cd/lora/adapter_config.jsonpublisher · retrieved Oct 16, 2026 · revision bb282d786bc251fd4e3068de3ada9ddbb38127cd
- https://huggingface.co/StrandsAgents/strands-decider-2B-hobson-v19/raw/bb282d786bc251fd4e3068de3ada9ddbb38127cd/LICENSE.mdpublisher · retrieved Oct 16, 2026 · revision bb282d786bc251fd4e3068de3ada9ddbb38127cd
- https://huggingface.co/api/models/StrandsAgents/strands-decider-2B-hobson-v19/tree/bb282d786bc251fd4e3068de3ada9ddbb38127cd?recursive=true&expand=falsepublisher · retrieved Oct 16, 2026
- https://huggingface.co/api/models/Qwen/Qwen3.5-2B-Base/revision/b1485b2fa6dfa1287294f269f5fb618e03d52d7cpublisher · retrieved Oct 16, 2026
- https://huggingface.co/Qwen/Qwen3.5-2B-Base/raw/b1485b2fa6dfa1287294f269f5fb618e03d52d7c/config.jsonpublisher · retrieved Oct 16, 2026 · revision b1485b2fa6dfa1287294f269f5fb618e03d52d7c
- https://huggingface.co/api/models/Qwen/Qwen3.5-2B-Base/tree/b1485b2fa6dfa1287294f269f5fb618e03d52d7c?recursive=true&expand=falsepublisher · retrieved Oct 16, 2026
- https://huggingface.co/Qwen/Qwen3.5-2B-Base/raw/b1485b2fa6dfa1287294f269f5fb618e03d52d7c/LICENSEpublisher · retrieved Oct 16, 2026 · revision b1485b2fa6dfa1287294f269f5fb618e03d52d7c
- https://raw.githubusercontent.com/strands-labs/strands-decider/6039cf8b64c6074e75804000c07ac3d4cce795f7/pyproject.tomlruntime maintainer · retrieved Oct 16, 2026
- https://huggingface.co/api/models/LiquidAI/LFM2-24B-A2Bpublisher · retrieved Oct 16, 2026
- https://huggingface.co/LiquidAI/LFM2-24B-A2B/raw/a3bbacd91a678b97712f0e323e52f8c24ba29542/README.mdpublisher · retrieved Oct 16, 2026 · revision a3bbacd91a678b97712f0e323e52f8c24ba29542
- https://huggingface.co/LiquidAI/LFM2-24B-A2B-GGUF/raw/6247d03b87c27c05a258feb5acdfb4d5efbf0bd8/README.mdpublisher · retrieved Oct 16, 2026 · revision 6247d03b87c27c05a258feb5acdfb4d5efbf0bd8
- https://huggingface.co/LiquidAI/LFM2-24B-A2B/raw/a3bbacd91a678b97712f0e323e52f8c24ba29542/config.jsonpublisher · retrieved Oct 16, 2026 · revision a3bbacd91a678b97712f0e323e52f8c24ba29542
- https://huggingface.co/LiquidAI/LFM2-24B-A2B/raw/a3bbacd91a678b97712f0e323e52f8c24ba29542/chat_template.jinjapublisher · retrieved Oct 16, 2026 · revision a3bbacd91a678b97712f0e323e52f8c24ba29542
- https://huggingface.co/LiquidAI/LFM2-24B-A2B/raw/a3bbacd91a678b97712f0e323e52f8c24ba29542/LICENSEpublisher · retrieved Oct 16, 2026 · revision a3bbacd91a678b97712f0e323e52f8c24ba29542
- https://huggingface.co/api/models/LiquidAI/LFM2-24B-A2B-GGUF/tree/6247d03b87c27c05a258feb5acdfb4d5efbf0bd8?recursive=false&expand=falsepublisher · retrieved Oct 16, 2026
- https://docs.liquid.ai/lfm/inference/llama-cppruntime maintainer · retrieved Oct 16, 2026
- https://raw.githubusercontent.com/ggml-org/llama.cpp/620d2225cc436ab0b001e3200e590e3b286ef9ab/docs/build.mdruntime maintainer · retrieved Oct 16, 2026 · revision 620d2225cc436ab0b001e3200e590e3b286ef9ab
- https://www.intel.com/content/www/us/en/products/sku/134586/intel-core-i512400-processor-18m-cache-up-to-4-40-ghz/specifications.htmlmanufacturer · retrieved Oct 16, 2026
- https://raw.githubusercontent.com/strands-labs/strands-decider/6039cf8b64c6074e75804000c07ac3d4cce795f7/src/strands_decider/cli.pyruntime maintainer · retrieved Oct 16, 2026
- https://raw.githubusercontent.com/strands-labs/strands-decider/6039cf8b64c6074e75804000c07ac3d4cce795f7/src/strands_decider/server.pyruntime maintainer · retrieved Oct 16, 2026
- https://raw.githubusercontent.com/strands-labs/strands-decider/6039cf8b64c6074e75804000c07ac3d4cce795f7/src/strands_decider/hf_export.pyruntime maintainer · retrieved Oct 16, 2026
- https://raw.githubusercontent.com/ggml-org/llama.cpp/620d2225cc436ab0b001e3200e590e3b286ef9ab/ggml/src/ggml-cpu/CMakeLists.txtruntime maintainer · retrieved Oct 16, 2026 · revision 620d2225cc436ab0b001e3200e590e3b286ef9ab
- https://raw.githubusercontent.com/strands-labs/strands-decider/6039cf8b64c6074e75804000c07ac3d4cce795f7/src/strands_decider/cpu_kernels.pyruntime maintainer · retrieved Oct 16, 2026
- https://raw.githubusercontent.com/strands-labs/strands-decider/6039cf8b64c6074e75804000c07ac3d4cce795f7/docs/inference.mdruntime maintainer · retrieved Oct 16, 2026