| """Quick repro: load the goblinV1 GGUF vision model and cast on a doodle. |
| |
| Usage: uv run --extra gguf python scripts/test_vision_cast.py |
| Env knobs: RG_GGUF_CTX, RG_GGUF_GPU_LAYERS, RG_GGUF_N_BATCH |
| """ |
|
|
| import os |
| import sys |
| from pathlib import Path |
|
|
| ROOT = Path(__file__).resolve().parent.parent |
| sys.path.insert(0, str(ROOT / "src")) |
|
|
| os.environ.setdefault("RG_USE_MODEL", "1") |
| os.environ.setdefault( |
| "RG_VISION_MODEL", str(ROOT / "models/goblinV1-gguf/gguf/rune-goblin-v46-Q4_K_M.gguf")) |
| os.environ.setdefault( |
| "RG_VISION_MMPROJ", str(ROOT / "models/goblinV1-gguf/gguf/rune-goblin-v46-mmproj-f16.gguf")) |
|
|
| from PIL import Image, ImageDraw |
|
|
| from rune_goblin.engine import GameState |
| from rune_goblin.vision_inference import cast_vision_spell |
|
|
|
|
| def doodle() -> Image.Image: |
| img = Image.new("RGB", (320, 320), "#efe1bd") |
| d = ImageDraw.Draw(img) |
| |
| import math |
| pts = [(160 + math.cos(a / 4) * (5 + a * 1.4), 160 + math.sin(a / 4) * (5 + a * 1.4)) |
| for a in range(80)] |
| d.line(pts, fill="#17120b", width=6) |
| return img |
|
|
|
|
| state = GameState(player_hp=12, player_max_hp=12, enemy_name="Mirror Fungus", |
| enemy_hp=5, enemy_max_hp=5, room_mood="damp", inventory=("wet candle",), |
| courage=5) |
| res = cast_vision_spell(state, doodle(), room_name="Goblin Toll Road", use_model=True) |
| print("DETECTED:", res.visual_reading.detected_runes) |
| print("NOTES:", res.visual_reading.notes) |
| print("SPELL:", res.spell.spell_name, "|", res.spell.effect) |
|
|