# Model And Alignment Notes ## Current Runtime Decision Start with a deterministic action policy and an OpenAI-compatible endpoint hook. This prevents the app from feeling broken when no GPU model is attached. ## Preferred Small Model Path Use two models instead of one giant pet brain: - MiniCPM-V 4.6 as a sparse visual cortex for rendered camera frames. - MiniCPM5-1B or a distilled 1-bit/BitNet-style text model as the fast action policy. This keeps touch and mouse interactions snappy while still letting the pet "see" the room. Nemotron 3 Nano remains useful for: - text/personality reasoning - NVIDIA-friendly story - agentic JSON action planning But the multimodal Nemotron Omni parameter count should be confirmed before relying on it for submission because model cards and metadata can be interpreted differently. MiniCPM-o 4.5 is a strong later demo path for full-duplex video/audio/speech, but it is too heavy for the first mobile-style pet loop. The 1-bit plan should target the action policy first. Native 1.58-bit models such as BitNet are more plausible than post-training 1-bit quantizing a multimodal MiniCPM-V stack. ## Multimodal I/O Decision The app should treat multimodality as a modular contract: - Inputs: text, pointer/touch, room state, forces, detected objects, optional camera frame, optional microphone transcript. - Perception output: compact visual/audio facts and blendshape hints. - Action output: the strict PET-LLM JSON schema that drives speech text, emotion, animation, blendshape, powers, and symbolic sound IDs. - Audio output: start with local pet sounds for reliability; later add MiniCPM-o speech or a TTS model as a replaceable sound module. MiniCPM-o 4.5 can support simultaneous video/audio input and text/speech output, but movement still needs our renderer-facing action schema. The model can choose `animation`, `blendshape`, and `power`; Three.js executes them. ## Inference Efficiency Checklist - Keep `TOYBOX_LLM_NUM_CTX` small for action JSON. - Keep `TOYBOX_LLM_NUM_PREDICT` small enough that invalid rambling is impossible. - Use deterministic fallback reactions immediately for petting, poking, and hover. - Let the model refine behavior asynchronously. - Re-run `uv run python scripts/measure_runtime.py --samples 5` after every model/runtime swap. - Use `--power` only when macOS `powermetrics` has sudo access. ## Reward Function Draft Reward a pet action when it: - references a real object or recent event - uses the pet's signature power - creates visible motion or visible state change - keeps speech under 18 words - remains cute, playful, and non-mean - does not repeat the same action more than twice in a row - chooses an action that can be executed by the renderer Penalize when it: - produces invalid JSON - chooses an unavailable power - talks abstractly without acting - writes long explanations - ignores collisions or user interaction - makes the room too chaotic to read ## Dataset Shape ```json { "input": { "pet": "squeaky", "user_message": "make the cube stop", "scene": { "objects": [ {"id": "cube-1", "kind": "cube", "speed": 2.5, "distanceToPet": 1.2} ], "recentForces": [ {"kind": "collision", "objectId": "cube-1", "impact": 0.7} ] } }, "output": { "speech": "Hold still, noisy cube.", "emotion": "focused", "animation": "trunk_wiggle", "power": {"name": "time_freeze", "targetId": "cube-1", "durationMs": 1800} }, "rating": 5 } ```