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
Download code/scripts/showcase.py from khursheed/VibeGame-8B: direct link, hf CLI and curl.
- Browser
- Download file 9.49 kB
-
https://huggingface.co/khursheed/VibeGame-8B/resolve/main/code/scripts/showcase.py
- Command line
-
hf download hf://khursheed/VibeGame-8B/code/scripts/showcase.py
-
curl -L -o showcase.py https://huggingface.co/khursheed/VibeGame-8B/resolve/main/code/scripts/showcase.py
9.49 kB
| #!/usr/bin/env python3 | |
| """Freeze a success-only showcase after the full benchmark; never generate games.""" | |
| from __future__ import annotations | |
| import argparse | |
| import hashlib | |
| import json | |
| import math | |
| import re | |
| import statistics | |
| import sys | |
| from pathlib import Path | |
| ROOT = Path(__file__).resolve().parents[1] | |
| sys.path.insert(0, str(ROOT / 'src')) | |
| from vibegame.project import parse_project, project_sha256 | |
| POLICY = 'first_three_clean_by_frozen_index_v1' | |
| POLICY_DECLARED_UTC = '2026-10-04T14:31:55Z' | |
| DISCLOSURE = 'Selected successes — not representative' | |
| FIXED_INDICES = [0, 200, 400] | |
| def sha256(path): | |
| digest = hashlib.sha256() | |
| with path.open('rb') as handle: | |
| for block in iter(lambda: handle.read(8 * 1024 * 1024), b''): | |
| digest.update(block) | |
| return digest.hexdigest() | |
| def safe_file(root, path): | |
| if not path.is_file() or not path.resolve().is_relative_to(root.resolve()): | |
| raise ValueError('Showcase evidence is missing or outside this evaluation') | |
| for part in (path, *path.parents): | |
| if part.is_symlink(): | |
| raise ValueError('Showcase evidence cannot use symlinks') | |
| if part == root: | |
| break | |
| return path | |
| def read_json(path): | |
| return json.loads(path.read_text()) | |
| def finite_time(value): | |
| return type(value) in (float, int) and math.isfinite(value) and value >= 0 | |
| def selection_for(evaluation): | |
| """Recompute selection and bind all 500 result/attempt inputs before captures.""" | |
| evaluation = Path(evaluation).resolve() | |
| hashes = {} | |
| def read(relative): | |
| path = safe_file(evaluation, evaluation / relative) | |
| hashes[relative] = sha256(path) | |
| return read_json(path) | |
| manifest, summary = read('manifest.json'), read('summary.json') | |
| if (manifest.get('expected_count') != 500 or manifest.get('run_seconds') != 60 | |
| or manifest.get('smoke_test') is not False or manifest.get('sample_indices') != FIXED_INDICES | |
| or summary.get('status') != 'complete' or summary.get('expected_prompts') != 500 | |
| or summary.get('recorded_prompts') != 500 or summary.get('infrastructure_failures') != 0 | |
| or summary.get('run_seconds') != 60 or summary.get('pass_k') != 1 or summary.get('retries') != 0 | |
| or summary.get('sample_indices') != FIXED_INDICES): | |
| raise ValueError('Showcase requires the complete unchanged 500-prompt pass@1 benchmark') | |
| expected_paths = [evaluation / 'items' / f'{index:04d}' / 'result.json' for index in range(500)] | |
| if sorted((evaluation / 'items').glob('*/result.json')) != expected_paths: | |
| raise ValueError('Showcase requires exactly all 500 result files') | |
| results, attempts = [], [] | |
| for index in range(500): | |
| result = read(f'items/{index:04d}/result.json') | |
| attempt = read(f'items/{index:04d}/attempt.json') | |
| if (result.get('index') != index or attempt.get('index') != index | |
| or any(type(result.get(key)) is not bool for key in ('compile_success', 'clean_run_60s')) | |
| or result.get('infrastructure_failure') | |
| or not isinstance(attempt.get('instruction'), str) or not attempt['instruction'].strip() | |
| or not attempt.get('prompt_id') or result.get('prompt_id') != attempt['prompt_id'] | |
| or (result['clean_run_60s'] and (not result['compile_success'] or result.get('run_seconds', 0) < 60))): | |
| raise ValueError('Showcase result evidence is inconsistent or incomplete') | |
| results.append(result) | |
| attempts.append(attempt) | |
| if len({row['instruction'] for row in attempts}) != 500 or len({row['prompt_id'] for row in attempts}) != 500: | |
| raise ValueError('Showcase benchmark has duplicate prompts') | |
| compiled = sum(row['compile_success'] for row in results) | |
| clean_indices = [index for index, row in enumerate(results) if row['clean_run_60s']] | |
| for key, count in [('compile_success', compiled), ('clean_run_60s', len(clean_indices))]: | |
| if summary.get(key + '_count') != count or not math.isclose(summary.get(key + '_rate', -1), count / 500, abs_tol=1e-12): | |
| raise ValueError('Showcase summary disagrees with all 500 results') | |
| if len(clean_indices) < 3: | |
| raise ValueError('Fewer than three clean results; three genuine showcase captures are unavailable') | |
| latencies = [row['prompt_to_launch_seconds'] for row in results | |
| if row['compile_success'] and finite_time(row.get('prompt_to_launch_seconds'))] | |
| metrics = {'denominator': 500, 'compile_success_count': compiled, 'compile_success_rate': compiled / 500, | |
| 'clean_run_60s_count': len(clean_indices), 'clean_run_60s_rate': len(clean_indices) / 500, | |
| 'timed_successful_launches': len(latencies), | |
| 'prompt_to_launch_median_seconds': statistics.median(latencies) if latencies else None, | |
| 'under_60s_launch_count': sum(value <= 60 for value in latencies)} | |
| for key in ('prompt_to_launch_median_seconds', 'under_60s_launch_count'): | |
| if summary.get(key) != metrics[key]: | |
| raise ValueError('Showcase timing summary disagrees with all 500 results') | |
| selected = [] | |
| for index in clean_indices[:3]: | |
| result, attempt = results[index], attempts[index] | |
| base = f'items/{index:04d}' | |
| generation = read(base + '/generation.json') | |
| output = generation.get('output') | |
| if not isinstance(output, str) or hashlib.sha256(output.encode()).hexdigest() != generation.get('output_sha256'): | |
| raise ValueError('Selected showcase generation hash differs') | |
| files = parse_project(output) | |
| project_hash = project_sha256(files) | |
| if result.get('project_sha256') != project_hash: | |
| raise ValueError('Selected showcase project differs from its original generation') | |
| check_name = result.get('validation_evidence', 'check') | |
| if not isinstance(check_name, str) or not re.fullmatch(r'check(?:-resume-[0-9]{3,})?', check_name): | |
| raise ValueError('Unsafe showcase validation evidence pointer') | |
| check = read(base + '/' + check_name + '/validation.json') | |
| if (check.get('compile_success') is not True or check.get('clean_run_60s') is not True | |
| or check.get('project_sha256') != project_hash or check.get('run_seconds') != 60 | |
| or check.get('godot_binary_sha256') != manifest.get('runtime_sha256') | |
| or check.get('runtime', {}).get('wall_seconds', 0) < 60): | |
| raise ValueError('Selected showcase lacks a matching full clean-run validation') | |
| for phase in ('import', 'runtime'): | |
| relative = base + '/' + check_name + '/' + phase + '.log' | |
| log = safe_file(evaluation, evaluation / relative) | |
| hashes[relative] = sha256(log) | |
| if check.get(phase, {}).get('log_sha256') != hashes[relative]: | |
| raise ValueError('Selected showcase validation log hash differs') | |
| selected.append({'index': index, 'prompt_id': attempt['prompt_id'], 'project_sha256': project_hash, | |
| 'generation_sha256': hashes[base + '/generation.json']}) | |
| return {'schema_version': 1, 'kind': 'model-success-showcase-selection', 'policy': POLICY, | |
| 'policy_declared_utc': POLICY_DECLARED_UTC, | |
| 'policy_timing': 'Declared after the A100 experiment began; display selection only, no benchmark changes.', | |
| 'disclosure': DISCLOSURE, 'benchmark_sample_indices': FIXED_INDICES, | |
| 'showcase_indices': clean_indices[:3], 'metrics': metrics, 'samples': selected, | |
| 'evaluation_manifest_sha256': hashes['manifest.json'], 'summary_sha256': hashes['summary.json'], | |
| 'evidence_hashes': hashes, 'repairs': 0, 'replacement_of_failed_captures': False, | |
| 'timing_disclosure': '60-second edited video, not generation time. Full-batch timings, no division by batch size.'} | |
| def selection_path(evaluation): | |
| return Path(evaluation) / 'showcase' / 'selection.json' | |
| def load_selection(evaluation, path): | |
| path = Path(path) | |
| if path.is_symlink(): | |
| raise ValueError('Showcase selection cannot use a symlink') | |
| if path.resolve() != selection_path(evaluation).resolve(): | |
| raise ValueError('Showcase must use this evaluation\'s showcase/selection.json') | |
| safe_file(Path(evaluation).resolve(), selection_path(Path(evaluation).resolve())) | |
| expected = selection_for(evaluation) | |
| if read_json(path) != expected: | |
| raise ValueError('Showcase selection or its frozen inputs changed') | |
| return expected | |
| def ensure_selection(evaluation): | |
| path = selection_path(evaluation) | |
| expected = selection_for(evaluation) | |
| if path.exists(): | |
| load_selection(evaluation, path) | |
| else: | |
| path.parent.mkdir(parents=True, exist_ok=True) | |
| if path.parent.is_symlink(): | |
| raise ValueError('Showcase directory cannot be a symlink') | |
| with path.open('x') as handle: | |
| json.dump(expected, handle, sort_keys=True, indent=2) | |
| handle.write('\n') | |
| return path | |
| def main(): | |
| parser = argparse.ArgumentParser(description=__doc__) | |
| parser.add_argument('--evaluation', type=Path, required=True) | |
| args = parser.parse_args() | |
| path = ensure_selection(args.evaluation) | |
| print(json.dumps({'selection': str(path), 'indices': read_json(path)['showcase_indices'], 'disclosure': DISCLOSURE})) | |
| if __name__ == '__main__': | |
| main() | |