# OMP agent model registry — single source of truth (OMP is the primary # harness; there is no second copy to keep in sync). # Conversion notes from the pi-era import: # - apiKey "EMPTY" -> auth: none (keyless local endpoint) # - thinkingLevelMap {max: xhigh} -> compat.reasoningEffortMap providers: # Provider NAMES are labels, and every reference to them lives in config.yml # (modelRoles, agentModelOverrides) or in another model's compactionModel — # rename one and a missed reference fails at call time. So each label is # migrated with its model in the same edit. One provider per HOST:PORT, so # Dankclaw's second endpoint (:7771) is a separate block rather than a second # model inside the :7770 one. "llamacpp (dankserver)": baseUrl: http://192.168.0.235:7770/v1 api: openai-completions auth: none models: - id: frank-archon # Model id renamed from frank-archon on 2026-10-08 (official # unit-name scheme; the systemd service, scripts and runbooks keep # the frank-archon name — service names are unchanged). # Server-side compaction routes to compaction.remoteEndpoint in # config.yml (192.168.0.143:7771 — frank-zealot's 3090); the # compactionModel candidate keeps the wire model id valid there. compactionModel: llamacpp (dankclaw-3090)/frank-zealot name: "frank-archon" # Dankserver: BOTH Radeon AI PRO R9700s (gfx1201, TP=2 over the # 2026-09-20 board swap's root ports, wht6 wire). Engine: # radiance (StillDeadcode, Apache-2.0) from the digest-pinned # stilldeadcode/radiance image (index digest sha256:4c3f4845..., 287 # MiB, kernels prebuilt for gfx1201), plain `podman run` through # scripts/serve-frank-archon.sh, root unit (User=dank, dank's # rootless podman storage). Serving the OFFICIAL # Qwen/Qwen3.8-Flash-Next-FP8 at NATIVE modelopt block-FP8 # precision — a rad-convert no-recipe pure copy into # qwen4exp-fp8-native.rad (172.76 GiB measured by plan-only), built by # scripts/build-frank-archon-rad.sh against a staging dir whose # config.json drops quantization_config so the shipped qwen4exp # plugin's (qwen4exp, "") selection key matches; per-weight # encodings are untouched. Experts stream from a 40 GiB/rank # pinned host pool; the 47.7 GiB PLE ngram table is pinned in RAM # (Frank's call); KV fp8; MTP depth 3 (the checkpoint's own mtp.* # head); prefix cache 4 GiB host + 64 GiB disk. Chat template: # froggeric's fixed qwen3.8 v22.5 # (scripts/qwen38-froggeric-v22.5.jinja) via # --override-chat-template. Rollback: git tag # frank-archon-freetoken-pr587-20261005 (FreeToken, one card). contextWindow: 200000 # maxTokens must survive the harness compaction gap AND the chars/4 # token-estimate under-run on code-heavy prompts. The clamp is # max_tokens = min(maxTokens, contextWindow − estimate − 4096); the # estimate under-runs by ~3 % on code. Compaction fires at 85 % of # the window = 170,000 est; worst-case prompt + budget ≈ # 170,000 × 1.03 + 16,384 ≈ 191,500 ≤ 200,000 — the engine # refuses a longer request, never truncates. maxTokens: 16384 reasoning: true # Text + image: the official FP8 checkpoint carries the vision # tower (vision_config depth 27; the first blocks stay bf16 in # modules_to_not_convert) and the plugin declares it # (arch/common/rad_block_vit.h). Video preprocessing configs ship # too; images are the contract that matters here. input: [text, image] compat: # radiance's --reasoning-format defaults to auto: thinking # comes back in `reasoning_content` (config.cpp). No parser # flags exist or are needed. reasoningContentField: "reasoning_content" # The froggeric template does not gate reasoning_effort the way # Qwen's shipped template did, and radiance special-cases only # none/minimal (core/server/oai.cpp:609). The map stays as the # zero-cost safety net, same as frank-zealot's. reasoningEffortMap: minimal: low low: low medium: medium high: xhigh max: xhigh # Qwen recommended sampling. extraBody is merged last and wins. # Every key is inside radiance's known-parameter list # (core/server/oai.cpp:194-205); unknown keys are refused 400. extraBody: temperature: 1.0 top_p: 0.95 top_k: 20 min_p: 0.0 presence_penalty: 0.0 repetition_penalty: 1.0 chat_template_kwargs: enable_thinking: true preserve_thinking: true "llamacpp (dankclaw)": baseUrl: http://192.168.0.143:7770/v1 api: openai-completions auth: none models: - id: frank-dragoon # Model id renamed from frank-dragoon on 2026-10-08 (official # unit-name scheme; the service/unit/scripts keep the frank-dragoon # name — service names are unchanged). name: "frank-dragoon (dankclaw-gpu)" # Server-side compaction runs on the compaction.remoteEndpoint in # config.yml (192.168.0.143:7771 — frank-zealot's 3090); this steers the # compaction model candidate so the wire model id stays valid # there even from a frank-dragoon session. compactionModel: llamacpp (dankclaw-3090)/frank-zealot # halogen-flash-server 0.16.2 (ghcr.io/peonist-ai/ # halogen-flash-server@sha256:0c61bf84, digest-pinned) serving the # Quat3rnion NATIVE v2 ABLITERATED conversion of orcarouter's pinned # BF16 Qwen3.8-Flash-Next (qwen38-flash-next-v2-abliterated.hgn, # ~62 GiB resident, + REQUIRED n-gram table + vision tower, both # hardlinked from the swift15 dir) on the Strix Halo iGPU: TWO slots # over ONE 401,408-position KV pool (= 2 x ctx, raised 2026-10-18) at # HALOGEN_CTX=200704 (the ceiling lowered from the card's 262,144 on # 2026-10-17; ~10.8 GiB reserved where 200,704 cost 5.5, 262,144 cost # 7.2 and 524,288 measured 14.6), with the MTP head ALWAYS ON # (HALOGEN_SPEC_ADAPT=0 — the default adaptive policy halves # decode). Measured 2026-10-17: 50 t/s greedy decode, 1,604 t/s # cold prefill at 59k, NIAH 18/18. ABLITERATED base (no refusals: # 0/5 on the hostile census) and VISION ON (OpenAI image_url # parts; >=256 px images or it answers "video"). Runbook: # serverAppConfigs-docs/LLM/frank-dragoon-flash-server-v2-native.md. # Window the harness may fill — deliberately BELOW the engine # ceiling (HALOGEN_CTX=200704, lowered from 262,144 on 2026-10-17): # the clamp below leaves the 45k gap that absorbs the estimate error. # Both slots SHARE one 401,408-position KV pool — exactly two full # windows — so TWO maximum-length conversations can be resident at the # same time (at the old pool == ctx 200,704 only two of <=100k could). # The per-request ceiling is unchanged, so this window is unchanged. contextWindow: 155648 # The clamp is max_tokens = min(maxTokens, contextWindow − est − # 4096); the chars/4 est UNDER-counts the rendered prompt by ~3 % # on code/agent traffic (measured 2026-10-07: est 152,938 -> # server 157,388). Worst-case request = window − 4096 + 3 % est # error ≈ 156.2k, inside the 200,704 engine ceiling with ~44k # margin (robust to a ~25 % under-count). Compaction fires at 85 % # of the window = 132,300 est ≈ 136k measured — the 180k target of # the 262,144 era is unreachable now (the window itself is 155,648) # — and rides on frank-zealot: input ≈ threshold − keepRecent(20k) # ≈ 112k, inside its 200,704 slot. # HALOGEN_MAX_TOKENS_CAP in frank-dragoon.env must stay >= this. maxTokens: 45056 reasoning: true # VISION ON as of 2026-10-06: the v2 vision tower loads beside the # checkpoint (HALOGEN_VISION_TOWER; red-PNG probe verified on the # card). image_url content parts only — the legacy top-level # images field is the frank-zealot trap, do not repeat it here. input: [text, image] compat: # flash-server emits thinking as `reasoning_content` — same # field as every engine this endpoint has run, no harness # change needed. reasoningContentField: "reasoning_content" # Same Qwen3.8 template family (it ships inside the tokenizer # bundle): any reasoning_effort outside {xhigh, medium, low} is # rejected, not clamped — the fold stays mandatory. reasoningEffortMap: minimal: low low: low medium: medium high: xhigh max: xhigh # The card's thinking recipe, on the wire. The flash-server # engine HAS a server-side sampler (HALOGEN_TEMPERATURE/TOP_P/ # TOP_K = 1.0 / 0.95 / 20 in frank-dragoon.env) — these match it, # so per-request values are consistent, not load-bearing. extraBody: temperature: 1.0 top_p: 0.95 "llamacpp (dankclaw-3090)": baseUrl: http://192.168.0.143:7771/v1 api: openai-completions auth: none models: - id: frank-zealot # Model id renamed from frank-zealot on 2026-10-08 (official # unit-name scheme; the service/unit/scripts keep the # frank-zealot name — service names are unchanged). name: "frank-zealot (dankclaw-3090)" # Server-side compaction routes to compaction.remoteEndpoint in # config.yml (192.168.0.143:7771 — this endpoint); the # compactionModel candidate keeps the wire model id valid there. compactionModel: llamacpp (dankclaw-3090)/frank-zealot # Dankclaw's RTX 3090: llama.cpp PrismML fork build (vendor 10777, # commit e3de71522 — the ONLY loader for this payload's custom tensor # type 142 + prism.hadamard.* metadata, and the minimum build that # pairs MTP with a quantized V cache) serving # prism-ml/Ternary-Bonsai-2-9B-gguf at PQ2_0 (2,675,410,720 B) WITH the # MTP head in the file — qwen35 hybrid, 32 layers (8 full-attention + # 24 Gated DeltaNet), 4 KV heads x 256 dim, native 262,144 — in THREE # conversations (--ctx-size 786432 / --parallel 3), each slot at the # model's TRAINED window. # KV is q8_0 K + q8_0 V (17 KiB/token over the 8 full layers = # 13,056 MiB pool, ledger-exact); f16 KV would bill 26,112 MiB and # cannot boot this card. Boot ledger 17,876 used / 6,249 free. Vision # through the publisher's Q8_0 mmproj (624,229,664 B — Q8_0 is the # publisher's requirement for concurrent image requests), whose # worst-case lands outside the engine's fit projection. **MTP OFF — # measured, not assumed**: the draft context bills its own f16 KV over # the WHOLE pool (3,072 MiB) and at ubatch 2048 that squeeze halves # decode (167.2 → 109.2 t/s); SPEC_TYPE=draft-mtp + UBATCH_SIZE=1024 is # the 213.5 t/s arm if the card ever has room. 2026-10-18 swap from # Ternary-Bonsai-2-27B PQ2_0 at 2 × 200,704. Measured: 167.2 t/s # single-stream greedy decode, 280.2 t/s across three concurrent # streams, 2,877 t/s prefill at 106,418. Base-alignment: censored base # lineage; unlike the 27B there is NO CRACK re-export matching this # file. Runbook: # serverAppConfigs-docs/LLM/frank-zealot-llama-prism-bonsai9-mtp.md. # contextWindow is the PER-SLOT window (= the native 262,144): a longer # prompt needs compaction — llama.cpp answers a 400, never truncates. contextWindow: 262144 # Prompt + budget must fit inside the slot window; thinking counts # against the budget. Compaction fires at 85 % of the window = # 222,822 est; worst-case prompt + budget ≈ 222,822 × 1.03 + # 16,384 ≈ 245,891 ≤ 262,144. This endpoint is the fleet's # compaction hub: the widest window in the fleet. maxTokens: 16384 reasoning: true input: [text, image] compat: # llama.cpp --reasoning-format deepseek emits thinking as # `reasoning_content` — the same field the MiMo/Ornith eras used; # harness reads unchanged. reasoningContentField: "reasoning_content" # Bonsai-2's template DOES read reasoning_effort (the Qwen3.5-9B # template did not — the map used to be inert here): it accepts ONLY # xhigh (default), medium, low and calls raise_exception on anything # else, so an unmapped harness level is a hard HTTP 500 on the role's # first request, naming Jinja and not the model. The fold below is # therefore load-bearing, identical to the frank-archon/dragoon law. # llama.cpp passes chat_template_kwargs through to Jinja. reasoningEffortMap: minimal: low low: low medium: medium high: xhigh max: xhigh # The payload's OWN sampling metadata (general.sampling.* in the # GGUF): temperature 1.0 / top_p 0.95 / top_k 20 — thinking-mode # recipe, the same trio the other Qwen3.8-family endpoints carry. # (The old 0.6 was the Qwen3.5-9B publisher's card, not this file.) # extraBody is merged last and wins over the harness default. extraBody: temperature: 1.0 top_p: 0.95 top_k: 20 min_p: 0.0 presence_penalty: 0.0 chat_template_kwargs: enable_thinking: true # The template DOES read preserve_thinking: when false it drops # prior assistants' blocks from history. Keep them — # multi-turn tool traffic on this endpoint is the majority. preserve_thinking: true