Amazon logo

Strands Decider

Strands Deciderv2B Hobson v19Current
byAmazonAmazon(enterprise)
Released October 5, 2026
Context4.1K tokens
Training CutoffNot disclosed
CategoryDecision Model

About Strands Decider

Strands Decider v19 is an Apache-2.0, open-weight 1.9B decision model for agentic workflows. It selects among options or rates inputs and returns calibrated confidence scores without generating text.

Capabilities

textclassificationscoringroutingconfidence

Input Modalities

text

Output Modalities

scorelabelconfidence

Technical Details

API Identifier
StrandsAgents/strands-decider-2B-hobson-v19
Category
Decision Model
Context Window
4,096 tokens

Tags

decision-modelagentic-aiclassificationconfidenceroutingopen-source

Run this model yourself

Local and cloud setup for Strands Decider, with exact configurations, sources and clear evidence limits.

Find a model for your hardware
Local hardwareDocumented setupSources checked Oct 16, 2026

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.

Official artifact · License

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.

  • 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. 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.

    Command
    sudo 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.txt

    Expected result: Source checkout is exactly pinned; installation succeeds and installed-packages.txt records resolved dependencies. No inference has run yet.

Download the model

  1. 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.

    Command
    cd "$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 ./checkpoint

    Expected result: Complete checkpoint files match MANIFEST.sha256. Base cache resolves the explicit revision. Stop on missing adapter/head/config/tokenizer or verification failure.

  2. 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.

    Command
    cd "$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')
    PYBASE

    Expected result: Adapter and head report OK; pinned base weight SHA256 OK. This verifies bytes, not runtime fit or accuracy.

Configure

  1. 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.

    Command
    cd "$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')
    PYCHECK

    Expected 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. 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.

    Command
    cd "$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-cache

    Expected 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. 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.

    Command
    cd "$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.json

    Expected 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. 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. 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.

    Command
    rm -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

Related guides

Compare this configuration
Cloud serverDocumented setupSources checked Oct 16, 2026

Self-host Strands Decider v19 typed decisions on AWS CPU

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 AWS r7i.xlarge. 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
AWS r7i.xlarge, 32 GiB RAM, Ubuntu x86_64
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 AWS r7i.xlarge in us-east-1 with Ubuntu 24.04 x86_64, four vCPUs, 32 GiB RAM and a 40 GiB gp3 root disk. Confirm current quote, quota and capacity before launching; resource creation incurs charges. Use existing SSH access, allow SSH only from your client IP, and keep port 8000 closed.
  • 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.

Official artifact · License

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.

  • 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
Not applicable — AWS hardware acquisition is included in compute rental; no purchased GPU required. Any separate hardware cost is not applicable.
AWS hardware acquisition is included in compute rental; no purchased GPU required. Any separate hardware cost is not applicable. 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

compute
$0.26 / hour
AWS public us-east-1 Linux On-Demand rate USD 0.2646 per billed instance-hour, no paid preinstalled software. Eight hours USD 2.1168; 24 hours USD 6.3504 compute. Idle running hours bill. Storage, egress, tax and administration separate; no Spot/reservation/discount assumed. Capacity/quota unverified. Region: us-east-1. SKU: r7i.xlarge Linux On-Demand. Tax: excluded. Price dated Oct 15, 2026. Price source
storage
$0.08 / GB month
US East (N. Virginia) gp3 USD 0.08 per GB-month; AWS defines GB as 1024^3 bytes. Selected 40 GiB root volume is USD 3.20 per full month, prorated by provisioned duration. Baseline 3000 IOPS / 125 MB/s; no extras assumed. Retained snapshots/resources separate; storage persists after instance stop. Tax excluded. Region: us-east-1. SKU: EBS gp3 baseline 3000 IOPS / 125 MB/s. Tax: excluded. Price dated Oct 16, 2026. Price source
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. 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.

    Command
    sudo 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.txt

    Expected result: Source checkout is exactly pinned; installation succeeds and installed-packages.txt records resolved dependencies. No inference has run yet.

Download the model

  1. 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.

    Command
    cd "$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 ./checkpoint

    Expected result: Complete checkpoint files match MANIFEST.sha256. Base cache resolves the explicit revision. Stop on missing adapter/head/config/tokenizer or verification failure.

  2. 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.

    Command
    cd "$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')
    PYBASE

    Expected result: Adapter and head report OK; pinned base weight SHA256 OK. This verifies bytes, not runtime fit or accuracy.

Configure

  1. 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.

    Command
    cd "$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')
    PYCHECK

    Expected 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. 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.

    Command
    cd "$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-cache

    Expected 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

Server loopback only. From your client, run ssh -N -L 8000:127.0.0.1:8000 USER@VM_IP using existing SSH access, then call localhost:8000 on the client. Leave EC2 port 8000 closed.

Access: loopback. The native Strands server has no authentication. Other local users can call it. Use a trusted single-user host; SSH authenticates the remote tunnel. A public/shared deployment needs separately designed TLS and authenticated access.

Verify the setup

  1. 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.

    Command
    cd "$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.json

    Expected 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. Verify the SSH tunnel to the intended VM; do not expose the unauthenticated port.

Stop the model

  1. 1. Stop the server and release the model

    Press Ctrl+C in the foreground server terminal. Close the SSH tunnel with Ctrl+C; stopping only this process does not stop EC2 billing.

    Expected result: Server stops; loopback endpoint no longer responds.

Uninstall

  1. 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.

    Command
    rm -r -- "$HOME/strands-v19-hosting"

    Expected result: Dedicated runtime/venv/checkpoint files removed. Shared Hub cache and system packages are not blindly deleted.

Shut down cloud resources

  1. 1. End cloud billing resources

    In EC2 us-east-1, stop for later reuse or terminate this exact VM. Review Delete on termination for its root volume. Delete unwanted detached EBS volumes, snapshots and reserved/Elastic/public IP resources. Stopped VM storage and retained resources may still bill. Check Bills/Cost Explorer later for final usage.

    Expected result: Exact instance is stopped/terminated as intended; no unwanted attached/retained billed resources remain. Instance compute stops only after its lifecycle transition, not when llama-server stops.

Sources and verification

Sources checked Oct 16, 2026. Verification source

Related guides

Compare this configuration
Local hardwareDocumented setupSources checked Oct 16, 2026

Run Strands Decider v19 typed decisions on a Linux desktop with native vision

Classify a newspaper image with frozen Strands Decider v19 using its native image plus typed-decision endpoint on CPU. Full Qwen3.5-2B-Base multimodal torso runs in fp32; same frozen v19 LoRA and pointer head. One image, one question per forward, strict4096-token window, trusted loopback without native authentication. Full memory fit, speed, tokens and visual quality remain unmeasured.

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.
  • Native vision requires transformers>=5.18,<6 and Pillow. Same frozen v19 checkpoint and base pin; no separate projector, chat template or image-specific trained adapter. Base revision is inferred by published provenance, not proven training identity.

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 cache and recurrent state. Native vision path uses a prefix/suffix cache; exact state/cache precision and peak bytes are not separately measured.
Workload:
4,096 token context; Unknown; Not applicable; concurrency 1; batch 1; cache unknown; repetitions Unknown.
Tokenizer:
Exact v19 exported tokenizer · bb282d786bc251fd4e3068de3ada9ddbb38127cd
Sampling / reasoning:
No generative sampler. Frozen per-kind calibration temperatures from v19 config; typed noul/choice/score readouts. No generated thinking or prose. Native vision prefix/suffix path uses a cache unconditionally; --max-batch1 re-encodes the image for each question chunk. Request contains image plus typed questions.
Runtime prerequisites:
Ubuntu 24.04 x86_64; See prerequisites above.

Official artifact · License

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.

  • Base download includes the original multimodal checkpoint shard. This vision configuration retains the visual encoder, merger and 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.
  • Vision loads the complete frozen visual encoder and merger plus language decoder, then CPU engine upcasts the torso to fp32. The docs0.66GB bf16 vision-tower increment is not a CPU required-memory measurement. Full peak/fit remains unknown.

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. 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 for baseline text support, 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. Vision explicitly requires transformers>=5.18,<6 and Pillow; the final freeze records these resolved versions.

    Command
    sudo apt-get update
    sudo apt-get install -y python3 python3-venv python3-pip git curl ca-certificates
    mkdir -p "$HOME/strands-v19-vision-hosting"
    cd "$HOME/strands-v19-vision-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,vision]'
    python -m pip install "transformers>=5.18,<6" "pillow>=10"
    python -m pip freeze > installed-packages.txt

    Expected result: Source checkout is exactly pinned; installation succeeds and installed-packages.txt records resolved dependencies. No inference has run yet.

Download the model

  1. 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.

    Command
    cd "$HOME/strands-v19-vision-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 ./checkpoint

    Expected result: Complete checkpoint files match MANIFEST.sha256. Base cache resolves the explicit revision. Stop on missing adapter/head/config/tokenizer or verification failure.

  2. 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.

    Command
    cd "$HOME/strands-v19-vision-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')
    PYBASE

    Expected result: Adapter and head report OK; pinned base weight SHA256 OK. This verifies bytes, not runtime fit or accuracy.

  3. 3. Fetch exact tiny visual smoke fixture

    Download the pinned official llama.cpp test image solely as a private test input; no photograph redistribution rights asserted. This is independent of the Strands model/runtime pins. Stop on mismatch.

    Command
    cd "$HOME/strands-v19-vision-hosting"
    curl --fail --location --output fixture.jpg 'https://raw.githubusercontent.com/ggml-org/llama.cpp/620d2225cc436ab0b001e3200e590e3b286ef9ab/tools/mtmd/test-1.jpeg'
    sha256sum --check <<'SHA256'
    2dff664c0c8aaea18aff8cbe7e868845b775e90cdd7a0bac98df709b131deaa3  fixture.jpg
    SHA256

    Expected result: fixture.jpg: OK;124071 bytes. Image visibly shows The New York Times front page and MEN WALK ON MOON headline.

Configure

  1. 1. Check base resolution and CPU settings

    The vision loader reads hobson_config.json for this legacy v19 export, resolves config.base_revision first or matching provenance.base_model_revision, and passes that revision to AutoConfig and Qwen3_5ForConditionalGeneration. It retains .model (visual encoder/merger and language_model), remaps the decoder-trained LoRA keys under language_model, restores the pointer head and freezes the vision tower. On CPU the engine upcasts the multimodal torso to FP32; readout is FP32. Confirm model/checkpoint/base identities before starting. Config num_slots=24 is metadata, not a pointer-head choice ceiling. OMP/MKL four-thread settings are allocations; use one client request at a time.

    Command
    cd "$HOME/strands-v19-vision-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')
    PYCHECK

    Expected result: Config window 4096, num_slots metadata 24 and published inferred base revision match. This metadata check does not load model weights into inference.

Start the model

  1. 1. Serve native image and typed text decisions on CPU

    Serve frozen v19 on CPU with native vision and strict4096-token window. CPU upcasts complete multimodal torso to fp32; readout already fp32. Native image path always uses prefix/suffix cache; --max-batch1 evaluates one question at a time and re-encodes image per chunk. Trusted loopback only; no authentication provided by this runtime.

    Command
    cd "$HOME/strands-v19-vision-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  --vision

    Expected 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. 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 true and prefix_cache true. The example checks an obvious billing triage case; probabilities/confidence are not guaranteed to equal the old model-card example.

    Command
    cd "$HOME/strands-v19-vision-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.json

    Expected 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.

  2. 2. Check grounded image typed decisions

    Run on server host or its SSH shell. The raw JPEG is base64 encoded in images, not OpenAI content parts. Health must report vision:true. Expected grounded choice is moon_landing and newspaper noul P(true)>0.5, based on visual inspection of the fixture. These are author smoke-check criteria, not predicted numeric outputs. Legibility score is subjective: check its typed range/distribution, do not prescribe a score/confidence. No output prose is expected.

    Command
    cd "$HOME/strands-v19-vision-hosting"
    source .venv/bin/activate
    python - <<'PYREQUEST'
    import pathlib,json,base64
    request={'state': 'Inspect the supplied newspaper front page. Classify only what the image visibly supports.', 'images': ['REPLACE_WITH_BASE64_FIXTURE'], 'questions': {'topic': {'type': 'choice', 'instructions': 'What is the main front-page topic?', 'criteria': {'moon_landing': 'Astronauts walking on the Moon', 'mars_landing': 'Astronauts walking on Mars', 'sports': 'A sports championship'}}, 'newspaper': {'type': 'noul', 'instructions': 'Is this a newspaper front page?'}, 'headline_legibility': {'type': 'score', 'instructions': 'How readable is the largest headline?', 'criteria': ['not readable', 'partly readable', 'clearly readable']}}}
    request['images']=[base64.b64encode(pathlib.Path('fixture.jpg').read_bytes()).decode()]
    pathlib.Path('image-request.json').write_text(json.dumps(request))
    PYREQUEST
    curl --fail http://127.0.0.1:8000/health
    curl --fail http://127.0.0.1:8000/v1/systemone -H 'Content-Type: application/json' --data-binary @image-request.json --output image-response.json
    python - <<'PYCHECK'
    import json,math
    r=json.load(open('image-response.json'));a=r['answers']
    assert a['topic']['type']=='choice' and a['topic']['choice']=='moon_landing'
    assert 0<=a['newspaper']['noul']<=1 and a['newspaper']['noul']>0.5
    assert a['headline_legibility']['type']=='score' and 0<=a['headline_legibility']['score']<=2
    for key in ['topic','headline_legibility']:
     p=a[key]['probabilities'];assert all(math.isfinite(v) and 0<=v<=1 for v in p.values())
     assert abs(sum(p.values())-1)<5e-4
    print('Grounded image smoke check passed; inspect full distributions in image-response.json')
    PYCHECK

    Expected result: Health HTTP200 with vision:true; successful native typed answers and passing assertions. Image rejection422, wrong topic, low newspaper probability or invalid schema fails the smoke check. Exact probability/confidence not promised.

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. Config num_slots=24 is retained metadata; this pointer-head checkpoint does not impose that fixed-slot choice ceiling. Public choice schema permits up to255 labels, while tokenized options/questions must fit the strict context window. Score rubrics use2–10 ascending levels. No different vision-specific option ceiling appears in the pinned vision path; strict-window overflow returns HTTP422.
  • 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.
  • 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.
  • At most4 PNG/JPEG/WebP/GIF images. Source checks total pixel area width*height<=16777216 before decode; docs4096x4096 is shorthand and does not imply individual dimension limits. EXIF rotation, white transparency composition, RGB and bicubic downscale-only longest side448 precede pinned PIL image processing. A448px square is documented196 tokens; actual fixture count remains unknown.
  • Images/state/questions share4096 window; strict-window rejects overflow422 rather than truncating. The image path always uses prefix cache regardless text-only no-prefix control. Full memory fit, CPU speed and vision accuracy are unknown; native probabilities cannot guarantee an image was read correctly.
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 public schema limit of 255 choice labels, score 2–10 ordered levels, and tokenized image/state/questions within the strict 4096-token window. This pointer-head checkpoint does not impose its config num_slots=24 as a fixed-slot choice cap. Process one request at a time; free/provision resources or shorten input and 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. 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. 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.

    Command
    rm -r -- "$HOME/strands-v19-vision-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

Related guides

Compare this configuration
Cloud serverDocumented setupSources checked Oct 16, 2026

Self-host Strands Decider v19 typed decisions on AWS CPU with native vision

Classify a newspaper image with frozen Strands Decider v19 using its native image plus typed-decision endpoint on CPU. Full Qwen3.5-2B-Base multimodal torso runs in fp32; same frozen v19 LoRA and pointer head. One image, one question per forward, strict4096-token window, trusted loopback without native authentication. Full memory fit, speed, tokens and visual quality remain unmeasured.

Hardware
AWS r7i.xlarge, 32 GiB RAM, Ubuntu x86_64
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 AWS r7i.xlarge in us-east-1 with Ubuntu 24.04 x86_64, four vCPUs, 32 GiB RAM and a 40 GiB gp3 root disk. Confirm current quote, quota and capacity before launching; resource creation incurs charges. Use existing SSH access, allow SSH only from your client IP, and keep port 8000 closed.
  • 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.
  • Native vision requires transformers>=5.18,<6 and Pillow. Same frozen v19 checkpoint and base pin; no separate projector, chat template or image-specific trained adapter. Base revision is inferred by published provenance, not proven training identity.

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 cache and recurrent state. Native vision path uses a prefix/suffix cache; exact state/cache precision and peak bytes are not separately measured.
Workload:
4,096 token context; Unknown; Not applicable; concurrency 1; batch 1; cache unknown; repetitions Unknown.
Tokenizer:
Exact v19 exported tokenizer · bb282d786bc251fd4e3068de3ada9ddbb38127cd
Sampling / reasoning:
No generative sampler. Frozen per-kind calibration temperatures from v19 config; typed noul/choice/score readouts. No generated thinking or prose. Native vision prefix/suffix path uses a cache unconditionally; --max-batch1 re-encodes the image for each question chunk. Request contains image plus typed questions.
Runtime prerequisites:
Ubuntu 24.04 x86_64; See prerequisites above.

Official artifact · License

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.

  • Base download includes the original multimodal checkpoint shard. This vision configuration retains the visual encoder, merger and 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.
  • Vision loads the complete frozen visual encoder and merger plus language decoder, then CPU engine upcasts the torso to fp32. The docs0.66GB bf16 vision-tower increment is not a CPU required-memory measurement. Full peak/fit remains unknown.

One-time setup and hardware

hardware
Not applicable — AWS hardware acquisition is included in compute rental; no purchased GPU required. Any separate hardware cost is not applicable.
AWS hardware acquisition is included in compute rental; no purchased GPU required. Any separate hardware cost is not applicable. 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

compute
$0.26 / hour
AWS public us-east-1 Linux On-Demand rate USD 0.2646 per billed instance-hour, no paid preinstalled software. Eight hours USD 2.1168; 24 hours USD 6.3504 compute. Idle running hours bill. Storage, egress, tax and administration separate; no Spot/reservation/discount assumed. Capacity/quota unverified. Region: us-east-1. SKU: r7i.xlarge Linux On-Demand. Tax: excluded. Price dated Oct 15, 2026. Price source
storage
$0.08 / GB month
US East (N. Virginia) gp3 USD 0.08 per GB-month; AWS defines GB as 1024^3 bytes. Selected 40 GiB root volume is USD 3.20 per full month, prorated by provisioned duration. Baseline 3000 IOPS / 125 MB/s; no extras assumed. Retained snapshots/resources separate; storage persists after instance stop. Tax excluded. Region: us-east-1. SKU: EBS gp3 baseline 3000 IOPS / 125 MB/s. Tax: excluded. Price dated Oct 16, 2026. Price source
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. 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 for baseline text support, 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. Vision explicitly requires transformers>=5.18,<6 and Pillow; the final freeze records these resolved versions.

    Command
    sudo apt-get update
    sudo apt-get install -y python3 python3-venv python3-pip git curl ca-certificates
    mkdir -p "$HOME/strands-v19-vision-hosting"
    cd "$HOME/strands-v19-vision-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,vision]'
    python -m pip install "transformers>=5.18,<6" "pillow>=10"
    python -m pip freeze > installed-packages.txt

    Expected result: Source checkout is exactly pinned; installation succeeds and installed-packages.txt records resolved dependencies. No inference has run yet.

Download the model

  1. 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.

    Command
    cd "$HOME/strands-v19-vision-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 ./checkpoint

    Expected result: Complete checkpoint files match MANIFEST.sha256. Base cache resolves the explicit revision. Stop on missing adapter/head/config/tokenizer or verification failure.

  2. 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.

    Command
    cd "$HOME/strands-v19-vision-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')
    PYBASE

    Expected result: Adapter and head report OK; pinned base weight SHA256 OK. This verifies bytes, not runtime fit or accuracy.

  3. 3. Fetch exact tiny visual smoke fixture

    Download the pinned official llama.cpp test image solely as a private test input; no photograph redistribution rights asserted. This is independent of the Strands model/runtime pins. Stop on mismatch.

    Command
    cd "$HOME/strands-v19-vision-hosting"
    curl --fail --location --output fixture.jpg 'https://raw.githubusercontent.com/ggml-org/llama.cpp/620d2225cc436ab0b001e3200e590e3b286ef9ab/tools/mtmd/test-1.jpeg'
    sha256sum --check <<'SHA256'
    2dff664c0c8aaea18aff8cbe7e868845b775e90cdd7a0bac98df709b131deaa3  fixture.jpg
    SHA256

    Expected result: fixture.jpg: OK;124071 bytes. Image visibly shows The New York Times front page and MEN WALK ON MOON headline.

Configure

  1. 1. Check base resolution and CPU settings

    The vision loader reads hobson_config.json for this legacy v19 export, resolves config.base_revision first or matching provenance.base_model_revision, and passes that revision to AutoConfig and Qwen3_5ForConditionalGeneration. It retains .model (visual encoder/merger and language_model), remaps the decoder-trained LoRA keys under language_model, restores the pointer head and freezes the vision tower. On CPU the engine upcasts the multimodal torso to FP32; readout is FP32. Confirm model/checkpoint/base identities before starting. Config num_slots=24 is metadata, not a pointer-head choice ceiling. OMP/MKL four-thread settings are allocations; use one client request at a time.

    Command
    cd "$HOME/strands-v19-vision-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')
    PYCHECK

    Expected result: Config window 4096, num_slots metadata 24 and published inferred base revision match. This metadata check does not load model weights into inference.

Start the model

  1. 1. Serve native image and typed text decisions on CPU

    Serve frozen v19 on CPU with native vision and strict4096-token window. CPU upcasts complete multimodal torso to fp32; readout already fp32. Native image path always uses prefix/suffix cache; --max-batch1 evaluates one question at a time and re-encodes image per chunk. Trusted loopback only; no authentication provided by this runtime.

    Command
    cd "$HOME/strands-v19-vision-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  --vision

    Expected 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

Server loopback only. From your client, run ssh -N -L 8000:127.0.0.1:8000 USER@VM_IP using existing SSH access, then call localhost:8000 on the client. Leave EC2 port 8000 closed.

Access: loopback. The native Strands server has no authentication. Other local users can call it. Use a trusted single-user host; SSH authenticates the remote tunnel. A public/shared deployment needs separately designed TLS and authenticated access.

Verify the setup

  1. 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 true and prefix_cache true. The example checks an obvious billing triage case; probabilities/confidence are not guaranteed to equal the old model-card example.

    Command
    cd "$HOME/strands-v19-vision-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.json

    Expected 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.

  2. 2. Check grounded image typed decisions

    Run on server host or its SSH shell. The raw JPEG is base64 encoded in images, not OpenAI content parts. Health must report vision:true. Expected grounded choice is moon_landing and newspaper noul P(true)>0.5, based on visual inspection of the fixture. These are author smoke-check criteria, not predicted numeric outputs. Legibility score is subjective: check its typed range/distribution, do not prescribe a score/confidence. No output prose is expected.

    Command
    cd "$HOME/strands-v19-vision-hosting"
    source .venv/bin/activate
    python - <<'PYREQUEST'
    import pathlib,json,base64
    request={'state': 'Inspect the supplied newspaper front page. Classify only what the image visibly supports.', 'images': ['REPLACE_WITH_BASE64_FIXTURE'], 'questions': {'topic': {'type': 'choice', 'instructions': 'What is the main front-page topic?', 'criteria': {'moon_landing': 'Astronauts walking on the Moon', 'mars_landing': 'Astronauts walking on Mars', 'sports': 'A sports championship'}}, 'newspaper': {'type': 'noul', 'instructions': 'Is this a newspaper front page?'}, 'headline_legibility': {'type': 'score', 'instructions': 'How readable is the largest headline?', 'criteria': ['not readable', 'partly readable', 'clearly readable']}}}
    request['images']=[base64.b64encode(pathlib.Path('fixture.jpg').read_bytes()).decode()]
    pathlib.Path('image-request.json').write_text(json.dumps(request))
    PYREQUEST
    curl --fail http://127.0.0.1:8000/health
    curl --fail http://127.0.0.1:8000/v1/systemone -H 'Content-Type: application/json' --data-binary @image-request.json --output image-response.json
    python - <<'PYCHECK'
    import json,math
    r=json.load(open('image-response.json'));a=r['answers']
    assert a['topic']['type']=='choice' and a['topic']['choice']=='moon_landing'
    assert 0<=a['newspaper']['noul']<=1 and a['newspaper']['noul']>0.5
    assert a['headline_legibility']['type']=='score' and 0<=a['headline_legibility']['score']<=2
    for key in ['topic','headline_legibility']:
     p=a[key]['probabilities'];assert all(math.isfinite(v) and 0<=v<=1 for v in p.values())
     assert abs(sum(p.values())-1)<5e-4
    print('Grounded image smoke check passed; inspect full distributions in image-response.json')
    PYCHECK

    Expected result: Health HTTP200 with vision:true; successful native typed answers and passing assertions. Image rejection422, wrong topic, low newspaper probability or invalid schema fails the smoke check. Exact probability/confidence not promised.

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. Config num_slots=24 is retained metadata; this pointer-head checkpoint does not impose that fixed-slot choice ceiling. Public choice schema permits up to255 labels, while tokenized options/questions must fit the strict context window. Score rubrics use2–10 ascending levels. No different vision-specific option ceiling appears in the pinned vision path; strict-window overflow returns HTTP422.
  • 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.
  • 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.
  • At most4 PNG/JPEG/WebP/GIF images. Source checks total pixel area width*height<=16777216 before decode; docs4096x4096 is shorthand and does not imply individual dimension limits. EXIF rotation, white transparency composition, RGB and bicubic downscale-only longest side448 precede pinned PIL image processing. A448px square is documented196 tokens; actual fixture count remains unknown.
  • Images/state/questions share4096 window; strict-window rejects overflow422 rather than truncating. The image path always uses prefix cache regardless text-only no-prefix control. Full memory fit, CPU speed and vision accuracy are unknown; native probabilities cannot guarantee an image was read correctly.
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 public schema limit of 255 choice labels, score 2–10 ordered levels, and tokenized image/state/questions within the strict 4096-token window. This pointer-head checkpoint does not impose its config num_slots=24 as a fixed-slot choice cap. Process one request at a time; free/provision resources or shorten input and 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. Verify the SSH tunnel to the intended VM; do not expose the unauthenticated port.

Stop the model

  1. 1. Stop the server and release the model

    Press Ctrl+C in the foreground server terminal. Close the SSH tunnel with Ctrl+C; stopping only this process does not stop EC2 billing.

    Expected result: Server stops; loopback endpoint no longer responds.

Uninstall

  1. 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.

    Command
    rm -r -- "$HOME/strands-v19-vision-hosting"

    Expected result: Dedicated runtime/venv/checkpoint files removed. Shared Hub cache and system packages are not blindly deleted.

Shut down cloud resources

  1. 1. End cloud billing resources

    In EC2 us-east-1, stop for later reuse or terminate this exact VM. Review Delete on termination for its root volume. Delete unwanted detached EBS volumes, snapshots and reserved/Elastic/public IP resources. Stopped VM storage and retained resources may still bill. Check Bills/Cost Explorer later for final usage.

    Expected result: Exact instance is stopped/terminated as intended; no unwanted attached/retained billed resources remain. Instance compute stops only after its lifecycle transition, not when llama-server stops.

Sources and verification

Sources checked Oct 16, 2026. Verification source

Related guides

Compare this configuration

Benchmarks

Performance scores for Strands Decider across standard benchmarks.

JevBench public-set accuracyofficial-readme · Oct 2026
72.3%

Pricing and access

Open-source/self-hosted model distributed through the strands-decider package and StrandsAgents model identifier; local infrastructure costs apply.