> For the complete documentation index, see [llms.txt](https://docs.roboflow.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.roboflow.com/workflows/blocks/blocks/run-a-model/qwen-vl.md).

# Qwen-VL

Run any Qwen vision-language model - natively on Roboflow infrastructure or via OpenRouter.

You can specify arbitrary text prompts or predefined ones, the block supports the following types of prompt:

* **Open Prompt** (`unconstrained`) - Use any prompt to generate a raw response
* **Text Recognition (OCR)** (`ocr`) - Model recognizes text in the image
* **Visual Question Answering** (`visual-question-answering`) - Model answers the question you submit in the prompt
* **Captioning (short)** (`caption`) - Model provides a short description of the image
* **Captioning** (`detailed-caption`) - Model provides a long description of the image
* **Single-Label Classification** (`classification`) - Model classifies the image content as one of the provided classes
* **Multi-Label Classification** (`multi-label-classification`) - Model classifies the image content as one or more of the provided classes
* **Unprompted Object Detection** (`object-detection`) - Model detects and returns the bounding boxes for prominent objects in the image
* **Structured Output Generation** (`structured-answering`) - Model returns a JSON response with the specified fields

#### 🛠️ Backend selection

* **Native (Roboflow)** - small Qwen-VL models (0.8B–7B) run on the same infrastructure as your other Roboflow models. Lower latency. Recommended for tasks like OCR, captioning, and visual question answering.
* **OpenRouter** - large hosted Qwen models (9B–397B) reached via [OpenRouter](https://openrouter.ai/). Defaults to a Roboflow-managed API key and bills your Roboflow credits. Paste your own `sk-or-...` key in the `api_key` field to bypass Roboflow billing. Recommended for structured tasks that benefit from larger models (classification, object-detection, structured-answering).

The `model_version` dropdown lists every supported variant; each is bound to one backend. A validator catches mismatches between your selected backend and model.

#### 🔒 Privacy filter (OpenRouter only)

* **No data collection** *(default)* – providers may not train on your inputs.
* **Allow data collection** – broader provider pool.
* **Zero data retention** – strictest, restricts to providers that retain nothing.

### Type identifier

Use the following identifier in step `"type"` field: `roboflow_core/qwen_vlm@v1` to add the block as a step in your workflow.

### Properties

| **Name**                   | **Type**         | **Description**                                                                                                                                                                                                                                                                                | Refs |
| -------------------------- | ---------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---- |
| `name`                     | `str`            | Enter a unique identifier for this step..                                                                                                                                                                                                                                                      | ❌    |
| `api_key`                  | `str`            | OpenRouter API key (only used when backend=openrouter). Defaults to Roboflow's managed key. Provide your own `sk-or-...` key to call OpenRouter directly without Roboflow billing..                                                                                                            | ✅    |
| `privacy_level`            | `str`            | Provider privacy filter (only used when backend=openrouter). Stricter levels reduce the pool of providers and may increase per-call cost on the managed key..                                                                                                                                  | ❌    |
| `max_tokens`               | `int`            | Maximum number of tokens the model can generate in its response..                                                                                                                                                                                                                              | ❌    |
| `temperature`              | `float`          | Sampling temperature (only used when backend=openrouter). The native Qwen-VL runtime doesn't accept a temperature knob. Range 0.0-2.0 - higher = more random / "creative" generations..                                                                                                        | ✅    |
| `max_concurrent_requests`  | `int`            | Maximum number of OpenRouter requests to run in parallel for a batch of images (only used when backend=openrouter). The native backend processes images sequentially. If unset, falls back to the global Workflows Execution Engine default. Restrict this if you hit OpenRouter rate limits.. | ❌    |
| `backend`                  | `str`            | Where to run inference. Native = Roboflow infrastructure. OpenRouter = large hosted Qwen models via OpenRouter..                                                                                                                                                                               | ❌    |
| `model_version`            | `str`            | Native Qwen-VL variant. Pick a pre-trained model or `Fine-tuned model` to use a Qwen3 fine-tune from your workspace..                                                                                                                                                                          | ✅    |
| `fine_tuned_model_id`      | `str`            | Fine-tuned Qwen3-VL model from your workspace, in `workspace/version` form..                                                                                                                                                                                                                   | ✅    |
| `openrouter_model_version` | `str`            | OpenRouter-hosted Qwen variant..                                                                                                                                                                                                                                                               | ✅    |
| `task_type`                | `str`            | Task type to be performed by model. Value determines required parameters and output response..                                                                                                                                                                                                 | ❌    |
| `prompt`                   | `str`            | Text prompt to the Qwen model.                                                                                                                                                                                                                                                                 | ✅    |
| `enable_thinking`          | `bool`           | Enable Qwen3.5-VL's reasoning mode, where the model emits thinking tokens before its answer. The reasoning trace is returned in the `thinking` output. Only the Qwen 3.5 VL 2B checkpoint (and Qwen3-VL fine-tunes derived from it) supports this; ignored elsewhere..                         | ❌    |
| `output_structure`         | `Dict[str, str]` | Dictionary with structure of expected JSON response.                                                                                                                                                                                                                                           | ❌    |
| `classes`                  | `List[str]`      | List of classes to be used.                                                                                                                                                                                                                                                                    | ✅    |

The **Refs** column marks possibility to parametrise the property with dynamic values available in `workflow` runtime. See *Bindings* for more info.

### Runtime compatibility

`requires_internet` - air-gapped / offline deployments : This block depends on a service that is not reachable from fully offline / air-gapped deployments.

### Input and Output Bindings

The available connections depend on its binding kinds. Check what binding kinds `Qwen-VL` in version `v1` has.

<details>

<summary>Input and output bindings</summary>

* input
  * `api_key` (*Union\[*[*`ROBOFLOW_MANAGED_KEY`*](/workflows/developer-guide/developer-guide/kinds/roboflow-managed-key.md)*,* [*`secret`*](/workflows/developer-guide/developer-guide/kinds/secret.md)*,* [*`string`*](/workflows/developer-guide/developer-guide/kinds/string.md)*]*): OpenRouter API key (only used when backend=openrouter). Defaults to Roboflow's managed key. Provide your own `sk-or-...` key to call OpenRouter directly without Roboflow billing..
  * `temperature` ([*`float`*](/workflows/developer-guide/developer-guide/kinds/float.md)): Sampling temperature (only used when backend=openrouter). The native Qwen-VL runtime doesn't accept a temperature knob. Range 0.0-2.0 - higher = more random / "creative" generations..
  * `images` ([*`image`*](/workflows/developer-guide/developer-guide/kinds/image.md)): The image to infer on..
  * `model_version` ([*`string`*](/workflows/developer-guide/developer-guide/kinds/string.md)): Native Qwen-VL variant. Pick a pre-trained model or `Fine-tuned model` to use a Qwen3 fine-tune from your workspace..
  * `fine_tuned_model_id` (*Union\[*[*`roboflow_model_id`*](/workflows/developer-guide/developer-guide/kinds/roboflow-model-id.md)*,* [*`string`*](/workflows/developer-guide/developer-guide/kinds/string.md)*]*): Fine-tuned Qwen3-VL model from your workspace, in `workspace/version` form..
  * `openrouter_model_version` ([*`string`*](/workflows/developer-guide/developer-guide/kinds/string.md)): OpenRouter-hosted Qwen variant..
  * `prompt` ([*`string`*](/workflows/developer-guide/developer-guide/kinds/string.md)): Text prompt to the Qwen model.
  * `classes` ([*`list_of_values`*](/workflows/developer-guide/developer-guide/kinds/list-of-values.md)): List of classes to be used.
* output
  * `output` (*Union\[*[*`string`*](/workflows/developer-guide/developer-guide/kinds/string.md)*,* [*`language_model_output`*](/workflows/developer-guide/developer-guide/kinds/language-model-output.md)*]*): String value if `string` or LLM / VLM output if `language_model_output`.
  * `classes` ([`list_of_values`](/workflows/developer-guide/developer-guide/kinds/list-of-values.md)): List of values of any type.
  * `thinking` ([`string`](/workflows/developer-guide/developer-guide/kinds/string.md)): String value.

</details>

<details>

<summary>Example JSON definition</summary>

```json
{
	    "name": "<your_step_name_here>",
	    "type": "roboflow_core/qwen_vlm@v1",
	    "api_key": "rf_key:account",
	    "privacy_level": "<block_does_not_provide_example>",
	    "max_tokens": "<block_does_not_provide_example>",
	    "temperature": "<block_does_not_provide_example>",
	    "max_concurrent_requests": "<block_does_not_provide_example>",
	    "images": "$inputs.image",
	    "backend": "<block_does_not_provide_example>",
	    "model_version": "Qwen 3.5 VL 2B",
	    "fine_tuned_model_id": "your-workspace/3",
	    "openrouter_model_version": "Qwen 3.6 27B",
	    "task_type": "<block_does_not_provide_example>",
	    "prompt": "my prompt",
	    "enable_thinking": "<block_does_not_provide_example>",
	    "output_structure": {
	        "my_key": "description"
	    },
	    "classes": [
	        "class-a",
	        "class-b"
	    ]
	}
```

</details>
