Files
serverAppConfigs/serverAppConfigs-docs/LLM/FreeToken Builds.md
T
Frank 33eae71d33 docs: distill the managed skill library into the vault (waves 1-7)
All ~173 managed skills read in full and merged, one polished reference
page per skill-cluster:

- LLM cross-cutting (17 pages): GGUF Compatibility, Llama Cpp Serving
  Sizing, Llama Cpp Multi-Device Splits, PCIe Link and Atomics, RDNA4
  Container Serving, RDNA4 MoE Expert Offload VRAM Budget, vLLM Boot
  Forensics, vLLM Porting and Compile Triage, LLM Bench Windows, LLM
  Performance Diagnosis, Model Swap and Rollback, Tcclaviger Fork Ops,
  Heterogeneous Split Triage, FreeToken Builds + deltas folded into the
  retired runbooks (GLM DFlash2 port laws, Lucebox dual-R9700, R9V
  qualification pipeline, FLM pack registration, ik hybrid envelope,
  frank-medium split rebalance, llama.cpp GGUF preflight, batch-ubatch
  split section, bench-window D-state/stale-read notes, second-endpoint
  bring-up).
- Architecture (3): Stale Signal Audit, Quadlet Lifecycle, Deploy State
  Triage.
- Operations (6 + index): Remote Job Runner, Payload and Disk Reclaim,
  Container Host Reachability, Fleet Ops Playbook, Fleet Audit and
  Posture, SSH and Remote Access.
- Infrastructure: Observability Provisioning + Homepage Status Probes;
  updates to Authentik, Anubis, LAN-DNS (per-client DoH bypass, Porkbun
  zone ops), Swap Configuration, OpenWebUI, Hermes (pre-existing page
  preserved and extended).
- FrankBook-Pro: ARR-Stack filled (API split, schema-first probing,
  auth-posture, auth-config trap); qBittorrent E2E verification.
- Desktop/Agent/Research: Noctalia and Niri, OMP Harness, Agent Docs and
  Edits, Command Center Dotfiles, PICO-8 Asset Standards.
- Indexes: LLM Cross-Cutting References section, Operations/ and Agent/
  index pages, root-index Skill Distillation section, AGENTS.md pointer.
- log.md carries the wave plan.

check-vault-links.py 0 unresolved (185 pages); ./tests/run.sh 366/366.
2026-10-05 21:19:15 -07:00

4.4 KiB

type, title, description, tags, timestamp
type title description tags timestamp
reference FreeToken Builds Building FreeToken (the official franksdank fork of FreeTok Tokenworks' freetoken vLLM-MTP runtime) on Dankclaw — the CUDA vLLM venv build and the ROCm build, with the dependency traps each one hit.
freetoken
build
dankclaw
vllm
mtp
2026-10-05T00:00:00-07:00

FreeToken Builds

FreeToken = the official franksdank fork of FreeTok Tokenworks' freetoken vLLM-MTP runtime. Two build paths exist, both on Dankclaw, with different dependency traps. Both were verified end-to-end 2026-09-11/12.

Common verification (do not skip)

Verify the build by real completion, not by version string. A version bump alone does not move data through the model — a build can print a new version and still not have completed a real token. Before declaring a FreeToken build deployable, run an actual completion (any tiny prompt) and read the returned content:

import json, urllib.request
req = urllib.request.Request("http://<host>:<port>/v1/chat/completions",
    json.dumps({"model": "frank-small", "messages": [{"role": "user",
    "content": "Hi"}]}).encode(), {"Content-Type": "application/json"})
print(json.load(urllib.request.urlopen(req, timeout=600)))

A 200 with a real choices[0].message.content is the only build green.

CUDA build (the torch/vLLM dependency trap)

Both paths build on Dankclaw with the same preinstall state: Python 3.12.10 in the system venv and Torch 2.10.0.dev (nightly, repo download.pytorch.org/whl/nightly/cu130, installed with uv pip install --index-strategy unsafe-best-match "torch==2.10.0.dev<date>+cu130" --index-url https://download.pytorch.org/whl/nightly/cu130 — use --index-strategy unsafe-best-match, uv otherwise refuses the dev version). Verify the exact pair first; mismatched preinstalled deps are the #1 build-failure cause.

Then install the matching vllm dev wheel:

uv pip install --index-strategy unsafe-best-match \
  --index-url https://wheels.vllm.ai/<commit-sha>/vllm-0.6.6.dev0+g<shortsha>.cu130-cp312-cp312-linux_x86_64.whl \
  --extra-index-url https://wheels.vllm.ai/nightly/cu130

The wheel URL pattern is fixed: https://wheels.vllm.ai/<full-commit>/vllm-0.6.6.dev0+g<8-char>.cu130-cp312-cp312-linux_x86_64.whl — read it back from vLLM's CI-run page (run details → build_and_install_package job, "install the vllm wheel" step). The trap: vLLM refuses versions < its install_requires floor at runtime, so the wheel version must be ≥ the runtime's floor. A wheel built at a lower base (0.5.x) downloads but import vllm fails with a version constraint error — that failure looks like a build failure and is not one; upgrade the wheel, not the code.

If uv pip install -e . --no-deps refuses (some repos pin the --no-deps branch off), fall back to python3 setup.py inside the venv, after python -m venv --copies .venv && source .venv/bin/activate and uv pip install --no-build-isolation "torch==…" — the venv must NOT re-resolve torch (a second torch from PyPI d1 breaks the CUDA extension ABI).

ROCm build (gfx1151 via TheRock nightly)

Same venv discipline, ROCm wheels from TheRock's nightly index:

uv pip install --index-strategy unsafe-best-match \
  --index-url https://rocm.nightlies.amd.com/v2/gfx1151-dcgpu-supports_fbsgens_split_0717-rc1/ \
  "torch==2.10.0.dev<date>+rocm" "triton==3.6.0" "pytorch-triton==3.6.0"

Then vllm itself (uv pip install -e . --no-build-isolation --no-deps, repo branch specs-mtp-dev, commit 2ee440d), after copying the two prebuilt extension wheels into the tree (the repo's setup.py skips compiling them when found). The ROCm build also needs install-fastrak-gfx1151.sh from the repo's scripts and FASTRACK_HOME=/home/dank/FastTrack-runtime in the unit env. FreeToken's x86_64-gfx1151 prebuilt extension (freetoken-ops) ships on HF hub franksdank/freetoken-ops-gfx1151 — fetch it once and point FREETOKEN_OPS_HOME at it; never rebuild the extension from source unless the extension API changed.

--index-strategy unsafe-best-match is load-bearing on both paths: the nightly indexes carry version pairs that uv's strict resolver otherwise rejects, and the error (No candidate found for pytorch-triton) reads like a missing package.