# 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: # The provider NAMES are historical (they were llama.cpp endpoints when the # fleet ran llama.cpp): frank-medium is vllm-radiance now, and frank-large is # halogen-flash-server again. Renaming is deliberately avoided because every # modelRoles entry in config.yml embeds the provider name, and a partial # rename fails at call time — the label is cosmetic, the references are not. # 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-medium name: "frank-medium (dankserver)" # Dankserver: both Radeon AI PRO R9700 (gfx1201) serving one model — # mainline llama.cpp, `--split-mode layer`, on # ajgazin/Swift-Qwen3.8-27B-Uncensored-Dynamic-MTP at UD-Q8_K_XL with # the z-lab DFlash2 Q8_0 drafter. Tensor parallelism is impossible on # this host (the second card's chipset path has no PCIe atomic routing, # so it cannot dispatch an RCCL collective — and vLLM's pipeline # parallelism needs the same p2p primitive), which is why one process # layer-splits across both cards instead. Since 2026-09-16 this is the # box's only LLM runtime; the vllm-radiance replica pair is retired. contextWindow: 196608 # The KV pool is 393216 positions over TWO slots, so one conversation # carries 196608 -- the house rule (see frank-large) is to declare the # per-conversation window, not the pool. The checkpoint's trained # window is 262144 and the GGUF has no rope scaling, so the top 131k # of a conversation extrapolates on the base rope. 32768 keeps prompt # + budget comfortably inside it; thinking counts against the budget. maxTokens: 32768 reasoning: true input: [text, image] compat: # Qwen3.8's chat template accepts ONLY xhigh, medium and low for # reasoning_effort and RAISES on anything else — verified against this # endpoint on 2026-09-16: low/medium/xhigh answer 200, `high` returns # a 500 from the template. The harness's levels must therefore be # folded onto that set, exactly as the sibling frank-small entry does, # or any role whose level is unmapped fails on its first request # (subagents run at `high`). reasoningEffortMap: minimal: low low: low medium: medium high: xhigh max: xhigh "llamacpp (dankclaw)": baseUrl: http://192.168.0.143:7770/v1 api: openai-completions auth: none models: - id: frank-large name: "frank-large (dankclaw-gpu)" # Server-side compaction always runs on frank-medium (see # compaction.remoteEndpoint in config.yml); this steers the # compaction model candidate so the wire model id stays valid # on the frank-medium endpoint even from a frank-large session. compactionModel: llamacpp (dankserver)/frank-medium # halogen-flash-server. The model's native window is 262,144, but this # deployment caps a conversation at 200,192 — exactly half of its # 400,384-position KV pool, so two 200k conversations are resident at # once. Declaring the half rather than the native window is what keeps # prompt + budget inside one conversation's region of the pool. contextWindow: 200192 # HALOGEN_MAX_TOKENS_CAP: above this a request is a 400 rather than a # silent truncation, and thinking counts against the budget. # maxTokens must also survive the harness compaction gap: OMP compacts at # 70% of contextWindow = 140,134, so a pre-compaction prompt can legally # reach that height. 140,134 + 57,344 = 197,478 <= 200,192, which closes # the dead zone that 400'd a request on 2026-09-17 (prompt 138,898 + # budget 64,000 = 202,898 > 200,192: above the server's fit check, below # the compaction trigger). Any budget > 60,058 reopens the zone. maxTokens: 57344 reasoning: true # Text only as of 2026-09-16: the vision tower moved to frank-small and # this server refuses image content parts. input: [text] compat: reasoningEffortMap: max: xhigh # Qwen3.8-Flash-Next recommended sampling. Halogen has no server-side # sampler defaults (a request that sends no temperature decodes # greedily), so this override is what makes ordinary calls sample. # extraBody is merged last (after compat policy) and wins. extraBody: temperature: 1.0 top_p: 0.95 top_k: 20 min_p: 0.0 presence_penalty: 0.0 repetition_penalty: 1.0 # Keep prior thinking blocks in the rendered prompt across turns; # halogen honours this key top-level (verified: 275-token prompt # delta with it false). preserve_thinking: true "llamacpp (dankclaw-3090)": baseUrl: http://192.168.0.143:7771/v1 api: openai-completions auth: none models: - id: frank-small name: "frank-small (dankclaw-3090)" # See frank-large: server-side compaction always runs on # frank-medium, so the wire model id stays valid from a # frank-small session. compactionModel: llamacpp (dankserver)/frank-medium # Dankclaw's RTX 3090: mainline llama.cpp serving # HauhauCS/Gemma4-12B-QAT-Uncensored-HauhauCS-Balanced at Q4_K_M. # The MTP head ships as a separate assistant sidecar # (mtp-gemma-4-12B-it.gguf) loaded via --model-draft and chained # behind the draftless ngram-mod matcher; q8_0 KV with the model's # sliding-window pattern keeps each full 262144-token window cheap, # and the explicit CTX_SIZE=1048576 / PARALLEL=4 gives FOUR full # windows (measured 22.3 GiB of the 24 GiB card at load; a 5th slot # does not fit). The BF16 projector (with audio encoder) is loaded # too, so this stays multimodal (frank-medium gained vision on # 2026-09-17 as well; frank-large has no vision tower). contextWindow: 262144 # Each slot IS the full trained window: prompt + budget must fit # inside it, and thinking counts against the budget. maxTokens: 32768 reasoning: true input: [text, image] compat: # Gemma4's chat template accepts every reasoning_effort level as of # 2026-09-17 (all seven probed: 200), so this map is inert. Kept # anyway: it cost nothing, and it is the safety net if the template # ever gates again the way Qwen3.8's did (subagents run at `high`). reasoningEffortMap: minimal: low low: low medium: medium high: xhigh max: xhigh # Gemma's reference local-recipe sampling (temp 1.0 / top_p 0.95); # the server's own default is greedy for clients that stay silent. # Thinking is already retained across turns by the server's # --reasoning-preserve default, and the key below is accepted # top-level (verified 200, not a 400), so it is passed to pin the # behaviour at the request rather than rely on a server default. extraBody: temperature: 1.0 top_p: 0.95 preserve_thinking: true