Repository navigation
BaseRT engine 0.2.3
BaseRT 0.2.3
Model pulls that finish. basert pull downloads over many connections at
once and resumes where it stopped — a 20 GB bundle interrupted at 90% picks
up at 90%, including after the process has exited. The 19.8 GB
Qwen3.5-35B-A3B Q4 bundle measured 17.6 MiB/s before and 54–84 MiB/s
after on the same link, roughly 19 minutes down to 5. A transfer that stalls
without closing is cut off and retried instead of hanging, and a short transfer
is caught rather than installed. Tool calling is fixed on two fronts as well: Muse Glimmer's
dialect is parsed rather than printed, and templates that use is undefined
(Qwen 3.8 among them) render instead of silently falling back.
Added
Xet transfers
-
Xet is supported, behind
BASERT_HF_XET=1. Its advantage is
deduplication across models: chunks shared with something already fetched
never cross the wire. It cannot resume, though — an interrupted transfer
starts over — so it is not whatbasert pullreaches for by default.basert pull basecompute/Qwen3.5-35B-A3B # resumable (default) BASERT_HF_XET=1 basert pull basecompute/Qwen3.5-35B-A3B # dedup, no resume
Parallel, resumable downloads
-
Files are fetched over many connections at once, in fixed chunks,
instead of through one stream. -
An interrupted pull resumes where it stopped, per chunk: completion is
recorded next to the partial file as each chunk lands and fsynced, so a
crash, a^C, or a link that drops overnight continues from what is on disk,
across process restarts. Just re-run the samebasert pull. -
A stalled transfer fails instead of hanging. Connections that stop
delivering bytes without closing are now cut off and retried, and a transfer
shorter than the size the Hub advertised is reported as an error rather than
installed as a truncated model that fails later at load time. -
Tunable when the defaults do not suit a link:
Variable Default Meaning BASERT_HF_CONNECTIONS24 Concurrent range requests BASERT_HF_CHUNK_MB16 Bytes per range request BASERT_HF_READ_TIMEOUT_SECS60 Stall timeout for a single read BASERT_HF_MAX_RETRIES5 Retries per chunk ( 0disables)BASERT_HF_XETunset Use Xet's CAS path for large files (dedup, no resume) Peak memory is
connections × chunk— 384 MB at the defaults, since each
worker holds one chunk in flight. Lower either knob on a constrained
machine.
Fixed
-
Muse Glimmer's tool calls are parsed, not printed. The model frames a
call as a message addressed to the tool:<|start|>assistant to=fn<|message|><atem:function_calls> <atem:invoke name="fn">…</atem:invoke></atem:function_calls><|eot|>which matched none of the dialects the parser knew (Gemma-native, ChatML
JSON, Qwen XML), so it fell through to content and the raw markup was
streamed to the user — the reported symptom was a reply that read
<atem:invoke name="bash">. The dialect is now recognized and emitted as a
proper tool call. -
--kquant-passthroughembeddings on non-Glimmer models. Every model but
Muse Glimmer handed k-quant embedding lookups the slab parameter struct,
whose second field is the vocabulary size where the k-quant kernels expect
the row width. Rows were read at the wrong stride, and the output was
incoherent — Qwen3-0.6B was the reported case. -
developerandfunctionroles no longer break the native template.
A model's chat template accepts the roles it was written for — Qwen 3.8's
takessystem,user,assistant,tooland raises on anything else — and
a raise drops the whole request into the generic ChatML fallback, quietly
costing the model its think prefill and tool-call dialect.developer(which
supersededsystemin the newer OpenAI API, and is what agent clients send)
andfunction(the deprecated spelling oftool) are now resolved before
rendering. When a template does reject a role, the warning names the roles
the request carried instead of suggesting a re-convert that would not help. -
Chat templates using
is undefinedno longer fall back to ChatML.
Qwen 3.8's template gates its reasoning-effort block on
enable_thinking is undefined, a standard Jinja2 test the bundled template
engine did not implement. Rendering threw on every request and the server
quietly fell back to generic ChatML — which still looked right for
ChatML-shaped models while silently dropping the reasoning-effort system
block, the think prefill, and the model's entire tool-call dialect. Tool
calling on affected models works again.
Changed
- Building
tools/base-convertnow requires Rust 1.85+ (was 1.80).