--- language: - en pipeline_tag: image-text-to-text tags: - gaming - agent - reinforcement-learning - computer-use - vision-language-action - qwen base_model: Qwen/Qwen3.5-9B license: apache-2.0 ---
# Player-1-9B [![Project Page](https://img.shields.io/badge/🌐_Project_Page-6366F1?style=for-the-badge)](https://player-1-project.github.io/) [![Paper](https://img.shields.io/badge/📄_Paper-EF4444?style=for-the-badge)](https://arxiv.org/abs/2610.20584) [![Code](https://img.shields.io/badge/GitHub-Code-black?style=for-the-badge&logo=github)](https://github.com/TencentARC/Player-1) [![Dataset](https://img.shields.io/badge/🤗_Dataset-Player--1--Data-F59E0B?style=for-the-badge)](https://huggingface.co/datasets/yyyang/Player-1-Data)
**Player-1-9B** is an open-weights vision-language-action model trained for generalist game control. Built on top of **Qwen3.5-9B**, Player-1-9B learns to perceive gameplay through screenshots, generate step-by-step reasoning, and execute keyboard and mouse actions. The model is part of [Player-1: Learning to Play from Synthetic Experience](https://player-1-project.github.io/); see the [paper](https://arxiv.org/abs/2610.20584) and the [GitHub repository](https://github.com/TencentARC/Player-1) for complete training, evaluation, and environment code. --- ## 🎮 Model Overview - **Base Architecture**: `Qwen/Qwen3.5-9B` (Dense Vision-Language Model) - **Parameters**: 9.6B - **Post-Training Pipeline**: 1. **Supervised Fine-Tuning (SFT)** on **[Player-1-Data](https://huggingface.co/datasets/yyyang/Player-1-Data)** (6,044 trajectories from 172 games) with action-balanced sampling. 2. **Reinforcement Learning (RL)** with PPO in **Player-1-Gym** across 16 synthetic 2D/3D environments with verifiable game-state rewards. - **Action Space**: Normalized canonical game actions: - Relative mouse movement: `dx, dy` in `[-1000, 1000]` - Absolute mouse position: `x, y` in `[0, 1000]` - Mouse clicks: `left`, `right`, `middle` - Keyboard keys: `KeyW`, `Space`, `ShiftLeft`, etc. - Duration: 200ms per step --- ## ⚡ Quick Start: Serving with vLLM We recommend serving Player-1-9B via **vLLM** with auto tool choice and reasoning parser enabled: ```bash vllm serve yyyang/Player-1-9B \ --served-model-name Player-1-9B \ --port 8000 \ --chat-template https://raw.githubusercontent.com/TencentARC/Player-1/main/player1/agents/chat_template/qwen3_5_player1_full_history.jinja \ --enable-auto-tool-choice \ --tool-call-parser qwen3_coder \ --reasoning-parser qwen3 \ --max-model-len 16384 \ --limit-mm-per-prompt image=5 ``` --- ## đŸ•šī¸ Python Inference Example Interact with Player-1-9B using standard OpenAI-compatible client libraries: ```python import base64 from io import BytesIO from openai import OpenAI from PIL import Image client = OpenAI(base_url="http://127.0.0.1:8000/v1", api_key="EMPTY") # Encode observation screenshot def encode_image(image: Image.Image) -> str: buffered = BytesIO() image.save(buffered, format="JPEG", quality=85) return base64.b64encode(buffered.getvalue()).decode("utf-8") # Sample inference screenshot = Image.open("screenshot.png").resize((640, 360)) b64_image = encode_image(screenshot) response = client.chat.completions.create( model="Player-1-9B", messages=[ { "role": "user", "content": [ {"type": "image_url", "image_url": {"url": f"data:image/jpeg;base64,{b64_image}"}}, {"type": "text", "text": "Task: Aim at the target and shoot."} ] } ], temperature=0.0, max_tokens=512, ) # The model outputs reasoning thought and function/tool call actions message = response.choices[0].message if hasattr(message, "reasoning_content") and message.reasoning_content: print("Reasoning:", message.reasoning_content) if message.tool_calls: for tool_call in message.tool_calls: print("Action:", tool_call.function.name, tool_call.function.arguments) ``` See [examples/inference/play_game.py](https://github.com/TencentARC/Player-1/blob/main/examples/inference/play_game.py) in the code repository to run the policy in interactive Gym environments. --- ## 📊 Evaluation Benchmarks We evaluate generalist game-playing capabilities across four diverse benchmarks spanning synthetic environments and out-of-domain games: - **Player-1-Gym** (16 environments): Evaluates core 2D and 3D gameplay primitives, including aiming, combat, driving, and navigation, under procedural variations. - **MineDojo-300** (300 tasks): Evaluates open-ended, goal-directed survival and crafting tasks in Minecraft 1.16.5. - **ViZDoom-10** (10 maps): Evaluates first-person 3D navigation, aiming, and combat in classic shooter environments. - **GameWorld** (170 tasks across 34 games): Evaluates zero-shot transfer across diverse 2D browser and arcade games with varied mechanics. --- ## 📑 Citation ```bibtex @misc{ouyang2026player1learningplaysynthetic, title={Player-1: Learning to Play from Synthetic Experience}, author={Mingyu Ouyang and Yiran Wang and Siyuan Hu and Xingyilang Yin and Huiqiang Sun and Guangzhi Wang and Junfu Pu and Cheng Cheng and Honghao Chen and Ying Shan and Mike Zheng Shou and Hwee Tou Ng}, year={2026}, eprint={2610.20584}, archivePrefix={arXiv}, primaryClass={cs.CV}, url={https://arxiv.org/abs/2610.20584} } ```