Instructions to use bunny127/EviRover with libraries, inference providers, notebooks, and local apps. Follow these links to get started.
- Libraries
- Transformers
How to use bunny127/EviRover with Transformers:
# Use a pipeline as a high-level helper from transformers import pipeline pipe = pipeline("image-text-to-text", model="bunny127/EviRover") messages = [ { "role": "user", "content": [ {"type": "image", "url": "https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/p-blog/candy.JPG"}, {"type": "text", "text": "What animal is on the candy?"} ] }, ] pipe(text=messages)# pip install -U transformers accelerate # Load model directly from transformers import AutoProcessor, AutoModelForMultimodalLM processor = AutoProcessor.from_pretrained("bunny127/EviRover") model = AutoModelForMultimodalLM.from_pretrained("bunny127/EviRover", device_map="auto") messages = [ { "role": "user", "content": [ {"type": "image", "url": "https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/p-blog/candy.JPG"}, {"type": "text", "text": "What animal is on the candy?"} ] }, ] inputs = processor.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(processor.decode(outputs[0][inputs["input_ids"].shape[-1]:])) - Notebooks
- Google Colab
- Kaggle
- Local Apps Settings
- vLLM
How to use bunny127/EviRover with vLLM:
Install from pip and serve model
# Install vLLM from pip: pip install vllm # Start the vLLM server: vllm serve "bunny127/EviRover" # Call the server using curl (OpenAI-compatible API): curl -X POST "http://localhost:8000/v1/chat/completions" \ -H "Content-Type: application/json" \ --data '{ "model": "bunny127/EviRover", "messages": [ { "role": "user", "content": [ { "type": "text", "text": "Describe this image in one sentence." }, { "type": "image_url", "image_url": { "url": "https://cdn.britannica.com/61/93061-050-99147DCE/Statue-of-Liberty-Island-New-York-Bay.jpg" } } ] } ] }'Use Docker
docker model run hf.co/bunny127/EviRover
- SGLang
How to use bunny127/EviRover 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 "bunny127/EviRover" \ --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": "bunny127/EviRover", "messages": [ { "role": "user", "content": [ { "type": "text", "text": "Describe this image in one sentence." }, { "type": "image_url", "image_url": { "url": "https://cdn.britannica.com/61/93061-050-99147DCE/Statue-of-Liberty-Island-New-York-Bay.jpg" } } ] } ] }'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 "bunny127/EviRover" \ --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": "bunny127/EviRover", "messages": [ { "role": "user", "content": [ { "type": "text", "text": "Describe this image in one sentence." }, { "type": "image_url", "image_url": { "url": "https://cdn.britannica.com/61/93061-050-99147DCE/Statue-of-Liberty-Island-New-York-Bay.jpg" } } ] } ] }' - Docker Model Runner
How to use bunny127/EviRover with Docker Model Runner:
docker model run hf.co/bunny127/EviRover
EviRover-4B
The model from EviRover: Reinforcing Agentic Perception Beyond a Glance. A 4B vision-language model trained to gather the evidence it is missing before it answers a perceptual question, rather than answering from a single look at the image.
The task it is trained for is perception under insufficient evidence: the target may be far too small to resolve at the resolution a single forward pass sees, it may only be findable by comparing or scanning several regions, or identifying it at all may require information that is not in the image. In all of those cases the model is still required to commit to a concrete output — a box, a mask, or a count. EviRover handles them by running a tool loop: it crops and re-inspects the image at a finer scale, verifies candidate regions, compares panels, searches the web, browses pages, and executes code, and only then emits an answer.
The benchmark it is evaluated on, EviLens, together with the evaluation
harness that supplies the system prompt and the ten tools, is released
separately: bunny127/EviLens.
Model
| Architecture | Qwen3VLForConditionalGeneration (model_type: qwen3_vl) |
| Parameters | ~4B |
| Weights | bfloat16, 2 safetensors shards, 9.1 GB |
| Base | Qwen3-VL-4B-Instruct |
| Processor | Qwen3VLProcessor, max_pixels 2,160,000 |
| Context | 262144 positions; trained with an 8192-token prompt and 16384-token response budget per turn |
| Tokenizer / chat template | unchanged from the base model |
Conventions it was trained under
These are part of the model, not of the harness — a different convention will cost accuracy.
- Coordinates.
xyxy, normalized to 0–1000. Boxes are emitted inside<answer>tags. - Sampling.
temperature0.7 /top_p0.8 /top_k20, as recorded ingeneration_config.json. Greedy decoding is not recommended for the agentic loop. - Tool feedback. The strings the model sees on tool success and tool failure
are byte-identical to the ones used during training; they ship with the
EviLens harness (
eval/agent/tools/messages.py). Paraphrasing them changes what the model is reacting to. - Image scale. High-resolution inputs are passed through at full resolution
and the model zooms in via
crop. Downscaling the input image up front removes the evidence the loop exists to recover.
The tool set is the same ten tools on the training and evaluation sides:
crop, verify, verify_part, verify_mask, compare_lr, python,
text_search, text_search_image, image_search, browse. Masks are produced
by handing the predicted box to SAM3; the model itself outputs boxes.
Usage
Serve it like any Qwen3-VL checkpoint and talk to it over an OpenAI-compatible endpoint:
vllm serve bunny127/EviRover \
--served-model-name evirover \
--dtype bfloat16 \
--max-model-len 131072 \
--limit-mm-per-prompt '{"image": 128}'
To reproduce the agentic setting, drive it with the EviLens harness, which supplies the system prompt, the ten tools and the parsing:
MODEL_NAME=evirover BASE_URL=http://127.0.0.1:8000/v1 API_KEY=EMPTY \
./run_eval.sh evirover_run
run_eval.sh can also start vLLM itself from a local path
(MODEL_PATH=/path/to/EviRover SERVE_GPU=0 ./run_eval.sh evirover_run). See
the EviLens README for the tool credentials the loop needs, the SAM3 setup for
the segmentation category, and the evaluation protocol.
Loading it directly in transformers:
from transformers import AutoProcessor, Qwen3VLForConditionalGeneration
model = Qwen3VLForConditionalGeneration.from_pretrained(
"bunny127/EviRover", dtype="bfloat16", device_map="auto"
)
processor = AutoProcessor.from_pretrained("bunny127/EviRover")
Requires transformers >= 4.57.1.
Evaluation
EviRover is evaluated agentically on EviLens: 688 human-verified instances across localization, recognition, spot-the-difference, segmentation and counting, all of them cases where one glance at the image is not enough. Each category reports its own domain-standard metrics; they are deliberately not folded into a single score.
| Model | Loc IoU | Loc R@.5 | Rec IoU | Rec R@.5 | SD F1_mi | SD F1_ma | Seg gIoU | Seg cIoU | Cnt Acc (%) |
|---|---|---|---|---|---|---|---|---|---|
| Qwen3-VL-4B-Instruct | 0.276 | 0.251 | 0.265 | 0.231 | 0.005 | 0.008 | 0.203 | 0.279 | 19.2 |
| OneThinker-8B | 0.110 | 0.086 | 0.353 | 0.357 | 0.065 | 0.106 | 0.409 | 0.387 | 25.6 |
| InternVL-3.5-8B | 0.020 | 0.007 | 0.093 | 0.033 | 0.000 | 0.000 | 0.081 | 0.081 | 20.5 |
| EviRover (4B) | 0.444 | 0.500 | 0.648 | 0.687 | 0.171 | 0.266 | 0.686 | 0.708 | 50.0 |
Loc and Rec are the localization and recognition grounding categories; SD is spot-the-difference, where micro-F1 is the primary metric. Counting accuracy is shown as a percentage. Every model in the table is run through the same agentic harness with the same protocol:
--mode agent --max-tool-calls 35 (--max-turns 39, automatic)
--text-search-backend serper --serper-per-sample 10-15
--temperature 0.7 --top-p 0.8 --top-k 20
spot_diff: --repeat 8 --repeat-tasks spot_diff (averaged per question; n stays 15)
browse summarizer: an OpenAI-compatible LLM; page retrieval via Jina
segmentation: predicted box -> mask with SAM3
served with vLLM 0.24.0+cu129 / torch 2.11
License
Apache-2.0 (LICENSE). The base model, Qwen3-VL-4B-Instruct, carries its own
license from Qwen. The EviLens benchmark data is licensed separately (CC BY-NC
4.0) in its own release.
Citation
@article{fan2026evirover,
title={EviRover: Reinforcing Agentic Perception Beyond a Glance},
author={Fan, Kaixuan and Feng, Kaituo and Peng, Tianshuo and Jiang, Yilei and Zhang, Manyuan and Wang, Junke and Yue, Xiangyu},
journal={arXiv preprint arXiv:2609.40230},
year={2026}
}
- Downloads last month
- 15
Model tree for bunny127/EviRover
Base model
Qwen/Qwen3-VL-4B-Instruct