Text Generation
Transformers
Safetensors
qwen2
godot
gdscript
qlora
game-development
conversational
text-generation-inference
Instructions to use khursheed/VibeGame-8B with libraries, inference providers, notebooks, and local apps. Follow these links to get started.
- Libraries
- Transformers
How to use khursheed/VibeGame-8B with Transformers:
# Use a pipeline as a high-level helper from transformers import pipeline pipe = pipeline("text-generation", model="khursheed/VibeGame-8B") messages = [ {"role": "user", "content": "Who are you?"}, ] pipe(messages)# pip install -U transformers accelerate # Load model directly from transformers import AutoTokenizer, AutoModelForCausalLM tokenizer = AutoTokenizer.from_pretrained("khursheed/VibeGame-8B") model = AutoModelForCausalLM.from_pretrained("khursheed/VibeGame-8B", device_map="auto") messages = [ {"role": "user", "content": "Who are you?"}, ] inputs = tokenizer.apply_chat_template( messages, add_generation_prompt=True, tokenize=True, return_dict=True, return_tensors="pt", ).to(model.device) outputs = model.generate(**inputs, max_new_tokens=256) print(tokenizer.decode(outputs[0][inputs["input_ids"].shape[-1]:])) - Notebooks
- Google Colab
- Kaggle
- Local Apps Settings
- vLLM
How to use khursheed/VibeGame-8B with vLLM:
Install from pip and serve model
# Install vLLM from pip: pip install vllm # Start the vLLM server: vllm serve "khursheed/VibeGame-8B" # Call the server using curl (OpenAI-compatible API): curl -X POST "http://localhost:8000/v1/chat/completions" \ -H "Content-Type: application/json" \ --data '{ "model": "khursheed/VibeGame-8B", "messages": [ { "role": "user", "content": "What is the capital of France?" } ] }'Use Docker
docker model run hf.co/khursheed/VibeGame-8B
- SGLang
How to use khursheed/VibeGame-8B with SGLang:
Install from pip and serve model
# Install SGLang from pip: pip install sglang # Start the SGLang server: python3 -m sglang.launch_server \ --model-path "khursheed/VibeGame-8B" \ --host 0.0.0.0 \ --port 30000 # Call the server using curl (OpenAI-compatible API): curl -X POST "http://localhost:30000/v1/chat/completions" \ -H "Content-Type: application/json" \ --data '{ "model": "khursheed/VibeGame-8B", "messages": [ { "role": "user", "content": "What is the capital of France?" } ] }'Use Docker images
docker run --gpus all \ --shm-size 32g \ -p 30000:30000 \ -v ~/.cache/huggingface:/root/.cache/huggingface \ --env "HF_TOKEN=<secret>" \ --ipc=host \ lmsysorg/sglang:latest \ python3 -m sglang.launch_server \ --model-path "khursheed/VibeGame-8B" \ --host 0.0.0.0 \ --port 30000 # Call the server using curl (OpenAI-compatible API): curl -X POST "http://localhost:30000/v1/chat/completions" \ -H "Content-Type: application/json" \ --data '{ "model": "khursheed/VibeGame-8B", "messages": [ { "role": "user", "content": "What is the capital of France?" } ] }' - Docker Model Runner
How to use khursheed/VibeGame-8B with Docker Model Runner:
docker model run hf.co/khursheed/VibeGame-8B
File size: 15,298 Bytes
ae36cfb | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 | # Data: what is here, and what is allowed into training
This is a small, auditable bootstrap collection. Downloaded GDScript is reference
material, not a set of completed games and not supervised training data. A row
becomes a training example only after it contains a complete project and passes
the validation and duplicate checks below. No quantity of reference scripts is
reported as a quantity of playable-game examples.
## Inventory
| File | Contents | Training use |
| --- | --- | --- |
| `data/reference_gd.jsonl` | 180 permissively licensed `.gd` files from two pinned public GitHub repositories | Optional teacher reference; not passed directly to SFT |
| `data/reference_manifest.json` | Commits, full notice paths, accepted/rejected counts, and filter reasons | Provenance |
| `data/licenses/` | Unmodified complete root license texts, including original copyright notices | Keep with any redistribution of the reference corpus |
| `data/teacher_prompts.jsonl` | 100 original, mechanically diverse teacher instructions | Teacher input; these are not generated or validated projects |
| `data/teacher_prompt_manifest.json` | Prompt count, digest, origin, and duplicate policy | Provenance |
| `data/codex_teacher_batch_root.jsonl` | 8 original Codex-teacher projects for instruction IDs 001β008 | Candidates; Linux admission required |
| `data/codex_teacher_batch_a.jsonl` | 32 original Codex-teacher projects for IDs 009β020 and 045β064 | Candidates; Linux admission required |
| `data/codex_teacher_batch_b.jsonl` | 32 original Codex-teacher projects for IDs 021β032 and 065β084 | Candidates; Linux admission required |
| `data/codex_teacher_batch_c.jsonl` | 28 original Codex-teacher projects for IDs 033β044 and 085β100 | Candidates; Linux admission required |
| `data/synthetic_candidates.jsonl` | Nine additional original seed projects written by the in-session assistant | Candidates; Linux admission required |
| `data/teacher_provenance.json` | Origin of the nine initial seeds | Provenance; these are not outputs of the separate Qwen teacher pilot |
| `data/train.jsonl` / `data/dev.jsonl` | Generated in the Linux runtime from accepted, deduplicated complete projects | Training / development loss only |
| `data/eval_prompts.jsonl` | 500 frozen prompts with no target outputs | Blind generation benchmark only |
| `data/eval_manifest.json` | Benchmark design, policy, and SHA-256 digest | Split integrity |
| `data/validation_manifest.jsonl` | Generated by Linux admission: per-candidate engine results and output fingerprints | Admission evidence, not an authored pass claim |
| `data/rejected_candidates.jsonl` | Generated by admission: rejections with reasons | Audit |
| `data/dataset_manifest.json` | Generated after a successful build: exact accepted train/dev counts and file digests | Current admitted dataset inventory |
The four Codex batches now contain **100 distinct complete-project candidates**,
one for every teacher instruction. The nine earlier seeds are separate, giving
109 authored candidates before validation and deduplication. This is still a
bootstrap collection, not evidence that a useful game generator has been trained.
Linux import and full 60-second runtime admission accepted 108 and rejected one:
97 training examples and 11 development examples. The produced dataset manifest
records the exact file hashes; these are teacher-data checks, not student evaluation. Attempts, static-contract passes, and
rejected candidates are not training rows or student evaluation results.
The earlier macOS startup-failure logs were moved to
[`artifacts/macos-startup-failure-evidence/`](../artifacts/macos-startup-failure-evidence/).
They describe sandbox/runtime startup failures, not successful admission or model
evaluation. There is no macOS validation manifest left in the source `data/`
directory. The Linux admission files listed above are generated outputs, not
prewritten evidence bundled to imply checks have passed.
## GitHub collection and attribution
The checked-in collection uses these exact revisions:
| Repository | Commit | Kept files | License |
| --- | --- | ---: | --- |
| [Godot demo projects](https://github.com/godotengine/godot-demo-projects/tree/3e08537616661a5883831628decab4c526260289) | `3e08537616661a5883831628decab4c526260289` | 160 | [Full MIT notice](../data/licenses/godotengine__godot-demo-projects/3e08537616661a5883831628decab4c526260289/LICENSE.md) |
| [Godot Dialogue Manager](https://github.com/nathanhoad/godot_dialogue_manager/tree/8ffe461f2a69180a35b2f00f31b563bfe6231da8) | `8ffe461f2a69180a35b2f00f31b563bfe6231da8` | 20 | [Full MIT notice](../data/licenses/nathanhoad__godot_dialogue_manager/8ffe461f2a69180a35b2f00f31b563bfe6231da8/LICENSE) |
Each row records repository, pinned commit, original path, direct source URL,
source text, SHA-256 digest, Git blob identifier, license identifier, and paths
to the complete notices. The dialogue-manager addon has its own nested notice,
so this conservative collector excluded that subtree; the kept files are outside
that boundary. The demos are code references and may use a different Godot minor
version from the training runtime. They are not claimed to compile independently.
Only ordinary `.gd` text blobs are downloaded. No source archive, textures, models,
music, sounds, fonts, or scene assets are fetched. Public availability is never
treated as a license. A repository must have an unambiguous full MIT,
Apache-2.0, or CC0-1.0 root grant. This snapshot happens to contain MIT only.
GPL, LGPL, AGPL, other copyleft, noncommercial, unknown, and mixed root grants
are refused. Files under any nested license/notice boundary are excluded, even
when that nested grant might be permissible. Relevant README and CREDITS files
are scanned for restrictive licenses, and their affected subtrees are excluded.
Conflicting file comment headers and SPDX expressions are also excluded.
These checks deliberately prefer false exclusions to guessing. They do not prove
that every upstream contributor had the right to license every line. Report any
suspect file with its row ID, and remove it and derived data while investigating.
Do not add a repository by merely trusting GitHub's license badge.
Reproduce the exact reference corpus with:
```bash
python scripts/collect_github.py \
--repo godotengine/godot-demo-projects@3e08537616661a5883831628decab4c526260289 \
--repo nathanhoad/godot_dialogue_manager@8ffe461f2a69180a35b2f00f31b563bfe6231da8 \
--max-files-per-repo 180
```
The cap samples eligible paths evenly across each repository's sorted file tree;
license exclusions and duplicate removal reduce the final count. API access is
unauthenticated and uses no paid service. GitHub rate limiting may require waiting
and retrying; the script does not bypass limits.
## The Stack v2: GDScript exists, but this build does not use it
The official [dataset card](https://huggingface.co/datasets/bigcode/the-stack-v2)
and its [configuration list](https://huggingface.co/datasets/bigcode/the-stack-v2/blob/main/README.md)
include GDScript. Access is gated by terms. The card requires honoring original
source licenses and Software Heritage training principles, and it says bulk
download requires an agreement with Software Heritage/INRIA. Its permissive
license set is also broader than this project's MIT / Apache / CC0 allowlist.
That is a licensing/access dependency, not permission to scrape around the gate.
No Stack v2 rows were downloaded, no terms were accepted on the user's behalf,
and no blanket relicensing is claimed. If these conditions are resolved later,
an importer still needs original-license filtering, source identifiers, notices,
removal-request handling, and the same duplicate and validation gates. The direct
GitHub corpus lets development continue without assuming those conditions away.
## Teacher references and synthetic provenance
`teacher_prompts.jsonl` has exactly `id` and `instruction` per row. Its 100 prompts
ask for distinct interactions and combinations rather than 100 differently named
versions of one project. They contain no frozen eval IDs or answers. Every prompt
is checked against the 500 held-out instructions and other teacher instructions
with normalized token 3-gram Jaccard similarity; values at or above 0.78 are refused.
This is a documented lexical check, not a claim to eliminate all semantic overlap.
A teacher generator may select relevant `code` strings from `reference_gd.jsonl`.
For every attempt, save the teacher model ID and revision, generation parameters,
input prompt digest, output digest, selected reference row IDs, complete license
notice paths, and validation outcome in a sidecar provenance file. Keep source
copyright notices in any copied or adapted snippets and redistribute their full
licenses with the dataset. Do not label unvalidated attempts as accepted examples.
Do not supply the blind eval prompts to the teacher to create training targets.
All 100 main candidates were written directly by the in-session Codex assistant,
with varied mechanics and original geometric visuals. They were not generated by
Qwen2.5-Coder-14B. Their instructions remain exactly those in the train-only prompt
file. The original project, scene, and UI shell comes from
[`src/vibegame/seeds.py`](../src/vibegame/seeds.py); the batch game logic is authored
separately. Original project code uses the repository's Apache-2.0 license. The
180 downloaded MIT reference scripts retain their own notices and are never
loaded directly as SFT rows.
The exact candidate, authoring-source, and provenance files are:
| IDs | Candidates | Reproducible authoring source | Provenance |
| --- | --- | --- | --- |
| 001β008 | [Root batch](../data/codex_teacher_batch_root.jsonl) | [create_teacher_batch_root.py](../scripts/create_teacher_batch_root.py) | [Root provenance](../data/codex_teacher_batch_root_provenance.json) |
| 009β020, 045β064 | [Batch A](../data/codex_teacher_batch_a.jsonl) | [create_teacher_batch_a.py](../scripts/create_teacher_batch_a.py) | [Batch A provenance](../data/codex_teacher_batch_a_provenance.json) |
| 021β032, 065β084 | [Batch B](../data/codex_teacher_batch_b.jsonl) | [create_teacher_batch_b.py](../scripts/create_teacher_batch_b.py) | [Batch B provenance](../data/codex_teacher_batch_b_provenance.json) |
| 033β044, 085β100 | [Batch C](../data/codex_teacher_batch_c.jsonl) | [create_teacher_batch_c.py](../scripts/create_teacher_batch_c.py) | [Batch C provenance](../data/codex_teacher_batch_c.provenance.json) |
| Nine earlier seeds | [Seed candidates](../data/synthetic_candidates.jsonl) | [seeds.py](../src/vibegame/seeds.py) | [Seed provenance](../data/teacher_provenance.json) |
These sidecars record authorship and content fingerprints. A static contract pass
in a sidecar means the project bundle passed local schema/API checks; it does not
mean the game imported or survived a run. Engine admission evidence is produced
separately on Linux. The authoring scripts do not create fake runtime-pass records.
An optional free-T4 Qwen2.5-Coder-14B teacher pilot was also attempted through
[`scripts/synthesize.py`](../scripts/synthesize.py). The initial pilot completed
two attempts, both rejected. A revised pilot completed four attempts: two passed
the teacher admission checks and two failed, then that pilot was stopped. These
six attempts are not the source of the 100 Codex-authored candidates. The two
pilot passes are teacher-candidate validation results, not evaluation results for
the fine-tuned student and not two extra automatically admitted training rows.
The training build gives the Codex batches priority for duplicate instructions.
If a pilot output answers an instruction already represented by a Codex candidate,
it is excluded by deduplication rather than substituted for the authored answer.
Future Qwen expansion is optional; any genuinely new prompt/output pair must pass
the same license, validation, and duplicate gates. Keep the pilot attempt logs and
source references with its own provenance rather than attributing those outputs
to Codex or attributing Codex work to Qwen.
## Exact training format and admission gate
Each SFT line has exactly two keys:
```json
{"instruction":"Build a small playable game...","output":"{\"files\":{\"project.godot\":\"...\",\"main.tscn\":\"...\",\"main.gd\":\"...\"}}"}
```
`output` is a string containing strict JSON with a `files` map. Complete source
files are represented by their paths and contents. The shared project validator
enforces safe relative paths, a Godot 4 project, required scene/script files, local
resource references, size limits, and restricted APIs before executing anything.
Build the frozen prompt set, then admit candidates with:
```bash
python scripts/build_dataset.py --freeze-eval-only
python scripts/build_dataset.py \
--input data/codex_teacher_batch_root.jsonl \
--input data/codex_teacher_batch_a.jsonl \
--input data/codex_teacher_batch_b.jsonl \
--input data/codex_teacher_batch_c.jsonl \
--input data/synthetic_candidates.jsonl \
--godot /absolute/path/to/Godot \
--workers 4
```
`--input` may be repeated for additional teacher-candidate JSONL files. There is
no skip-validation switch. Each accepted project must import without errors and
complete a full 60-second sandboxed headless run. Static policy failures, malformed
JSON, parse/import failures, script errors, and early exit are rejected. An OS
sandbox startup problem is also a failure, never a successful game check.
Successful evidence can be reused only for the same project content, exact Godot
binary digest, at least the requested runtime duration, intact original import
and runtime logs, and unchanged source files. Failed or mismatched attempts use
new work directories so previous diagnostics remain available.
Exact and near duplicate instructions are removed against both the blind set and
previous candidates. Project outputs are deduplicated independently using token
5-gram Jaccard similarity at 0.85. This occurs before the stable train/dev split,
so near-identical accepted outputs cannot enter both splits. The default dev split
is 10 percent, with at least one example in each split. A build with fewer than two
accepted unique projects fails rather than fabricating a development example.
## What the 500 prompts do and do not measure
The benchmark crosses 25 gameplay families with 20 explicit rule modifiers. It
has 500 unique instructions, but those instructions are related compositional
variants, not 500 independent task families. The manifest makes this limitation
explicit. It is a bootstrap engineering benchmark, not a validated measure of
fun, originality, or general game-development ability.
The frozen file refuses silent replacement when its contents differ. Never put
these 500 rows in train/dev data, use them for loss or checkpoint selection, or
generate teacher targets for them. A separate labeled dev split supplies eval
loss. Final compile and clean-run rates must use all 500 prompts, include failures
and timeouts in the denominator, and identify any incomplete run as partial.
Run data contract tests without launching an engine:
```bash
python -m unittest discover -s tests -p test_data.py -v
```
|