townlet / game /models.py
Budlee's picture
All characters on nemotron-4b; one cold-load per fork
76ce26a verified
Raw
History Blame Contribute Delete
3.07 kB
"""The Townlet model roster.
Each character carries a `model_id` that names one entry below. Adding a
model is a single dict edit — no code change elsewhere. Keep every entry ≤4B
params so the Tiny Titan badge stays in reach and multiple models can sit in
Zero-GPU memory simultaneously.
Model card URLs are cited per CLAUDE.md so a future reader can re-verify
filenames and quantisations without leaving the codebase.
"""
from __future__ import annotations
from dataclasses import dataclass
@dataclass(frozen=True)
class ModelSpec:
model_id: str
display_name: str
repo_id: str
gguf_filename: str
params_b: float
family: str
mock_style: str # "deliberate" | "terse" | "verbose" | "chaotic"
card_url: str
DEFAULT_MODEL_ID = "nemotron-4b"
ROSTER: dict[str, ModelSpec] = {
"smollm2-360m": ModelSpec(
model_id="smollm2-360m",
display_name="SmolLM2 360M (local-friendly)",
repo_id="HuggingFaceTB/SmolLM2-360M-Instruct-GGUF",
gguf_filename="smollm2-360m-instruct-q8_0.gguf",
params_b=0.36,
family="smollm",
mock_style="terse",
card_url="https://huggingface.co/HuggingFaceTB/SmolLM2-360M-Instruct-GGUF",
),
"nemotron-4b": ModelSpec(
model_id="nemotron-4b",
display_name="Nemotron 3 Nano 4B",
repo_id="nvidia/NVIDIA-Nemotron-3-Nano-4B-GGUF",
gguf_filename="NVIDIA-Nemotron3-Nano-4B-Q4_K_M.gguf",
params_b=4.0,
family="nemotron",
mock_style="deliberate",
card_url="https://huggingface.co/nvidia/NVIDIA-Nemotron-3-Nano-4B-GGUF",
),
"qwen-coder-3b": ModelSpec(
model_id="qwen-coder-3b",
display_name="Qwen2.5 Coder 3B",
repo_id="Qwen/Qwen2.5-Coder-3B-Instruct-GGUF",
gguf_filename="qwen2.5-coder-3b-instruct-q4_k_m.gguf",
params_b=3.0,
family="qwen",
mock_style="terse",
card_url="https://huggingface.co/Qwen/Qwen2.5-Coder-3B-Instruct-GGUF",
),
"minicpm-4b": ModelSpec(
model_id="minicpm-4b",
display_name="MiniCPM 4B",
repo_id="openbmb/MiniCPM3-4B-GGUF",
gguf_filename="ggml-model-Q4_K_M.gguf",
params_b=4.0,
family="minicpm",
mock_style="verbose",
card_url="https://huggingface.co/openbmb/MiniCPM3-4B-GGUF",
),
"llama-3b": ModelSpec(
model_id="llama-3b",
display_name="Llama 3.2 3B",
repo_id="bartowski/Llama-3.2-3B-Instruct-GGUF",
gguf_filename="Llama-3.2-3B-Instruct-Q4_K_M.gguf",
params_b=3.0,
family="llama",
mock_style="chaotic",
card_url="https://huggingface.co/bartowski/Llama-3.2-3B-Instruct-GGUF",
),
}
def get_spec(model_id: str) -> ModelSpec:
if model_id not in ROSTER:
raise KeyError(f"unknown model_id {model_id!r}; known: {list(ROSTER)}")
return ROSTER[model_id]
def roster_for_ui() -> list[dict]:
return [
{"model_id": s.model_id, "display_name": s.display_name, "params_b": s.params_b}
for s in ROSTER.values()
]