94057c3d3e
PR Test (NPU) / check-changes (push) Has been cancelled
PR Test (NPU) / pr-gate (push) Has been cancelled
PR Test (NPU) / set-image-config (push) Has been cancelled
PR Test (NPU) / stage-b-test-1-npu-a2 (0) (push) Has been cancelled
PR Test (NPU) / stage-b-test-1-npu-a2 (1) (push) Has been cancelled
PR Test (NPU) / stage-b-test-2-npu-a2 (0) (push) Has been cancelled
PR Test (NPU) / stage-b-test-2-npu-a2 (1) (push) Has been cancelled
PR Test (NPU) / stage-b-test-4-npu-a3 (push) Has been cancelled
PR Test (NPU) / stage-b-test-16-npu-a3 (push) Has been cancelled
PR Test (NPU) / multimodal-gen-test-1-npu-a3 (push) Has been cancelled
PR Test (NPU) / multimodal-gen-test-2-npu-a3 (push) Has been cancelled
PR Test (Arm64) / pr-gate (push) Has been cancelled
PR Test (Arm64) / check-changes (push) Has been cancelled
PR Test (Arm64) / build-test (push) Has been cancelled
PR Test (sgl-router) / gate (push) Has been cancelled
PR Test (sgl-router) / tier-1 — lint (push) Has been cancelled
PR Test (sgl-router) / tier-2 — build + test (push) Has been cancelled
PR Test (sgl-router) / tier-3 — docker (placeholder) (push) Has been cancelled
PR Test (sgl-router) / tier-3 — k8s integration (push) Has been cancelled
PR Test (sgl-router) / tier-3 — e2e (push) Has been cancelled
PR Test (sgl-router) / finish (push) Has been cancelled
PR Test (NPU) / single-node-poc (map[name:qwen3_6_27b_w8a8_1p_in64k_out1k_50ms runner:linux-aarch64-a3-2 test_case:test/registered/ascend/performance/qwen3_6_27b/test_npu_qwen3_6_27b_w8a8_1p_in64k_out1k_50ms.py test_type:perf]) (push) Has been cancelled
PR Test (NPU) / pr-test-npu-finish (push) Has been cancelled
PR Test (Xeon) / pr-gate (push) Has been cancelled
PR Test (Xeon) / check-changes (push) Has been cancelled
PR Test (Xeon) / build-test (, xeon-gnr, base-b-test-cpu) (push) Has been cancelled
PR Test (XPU) / check-changes (push) Has been cancelled
PR Test (XPU) / pr-gate (push) Has been cancelled
PR Test (XPU) / stage-a-test-1-gpu-xpu (push) Has been cancelled
PR Test (XPU) / wait-for-stage-a (push) Has been cancelled
PR Test (XPU) / stage-b-test-1-gpu-xpu (push) Has been cancelled
PR Test (XPU) / finish (push) Has been cancelled
CI Model Inventory / build-inventory (push) Has been cancelled
Lint / lint (push) Has been cancelled
PR Benchmark (SMG Components) / Benchmark Compilation Check (push) Has been cancelled
PR Benchmark (SMG Components) / Benchmark - Manual Policy (push) Has been cancelled
PR Benchmark (SMG Components) / Benchmark - Request Processing (push) Has been cancelled
PR Benchmark (SMG Components) / Benchmark Summary (push) Has been cancelled
PR Test (SMG) / build-wheel (push) Has been cancelled
Release SGLang Model Gateway to PyPI / build on windows (x86_64 - auto) (push) Has been cancelled
Release SGLang Model Gateway to PyPI / build on macos (x86_64 - auto) (push) Has been cancelled
PR Test (SMG) / python-unit-tests (push) Has been cancelled
PR Test (SMG) / unit-tests (push) Has been cancelled
PR Test (SMG) / benchmarks (push) Has been cancelled
PR Test (SMG) / chat-completions (push) Has been cancelled
PR Test (SMG) / chat-completions-4gpu (push) Has been cancelled
PR Test (SMG) / e2e (push) Has been cancelled
PR Test (SMG) / docker-build-test (push) Has been cancelled
PR Test (SMG) / k8s-integration (push) Has been cancelled
PR Test (SMG) / finish (push) Has been cancelled
PR Test (SMG) / summarize-benchmarks (push) Has been cancelled
Release SGLang Model Gateway Docker Image / publish (push) Has been cancelled
Release SGLang Model Gateway to PyPI / build on macos (aarch64 - auto) (push) Has been cancelled
Release SGLang Model Gateway to PyPI / build on linux (aarch64 - auto) (push) Has been cancelled
Release SGLang Model Gateway to PyPI / build on linux (x86_64 - auto) (push) Has been cancelled
Release SGLang Model Gateway to PyPI / build on linux (aarch64 - musllinux_1_1) (push) Has been cancelled
Release SGLang Model Gateway to PyPI / build on linux (x86_64 - musllinux_1_1) (push) Has been cancelled
Release SGLang Model Gateway to PyPI / Build SDist (push) Has been cancelled
Release SGLang Model Gateway to PyPI / Upload to PyPI (push) Has been cancelled
Release SGLang Kernels / build-cu129-matrix (aarch64, 12.9, 3.10, arm-kernel-build-node) (push) Has been cancelled
Release SGLang Kernels / build-cu129-matrix (x86_64, 12.9, 3.10, x64-kernel-build-node) (push) Has been cancelled
Release SGLang Kernels / release-cu129 (push) Has been cancelled
Release SGLang Kernels / build-cu130-matrix (aarch64, 13.0, 3.10, arm-kernel-build-node) (push) Has been cancelled
Release SGLang Kernels / build-cu130-matrix (x86_64, 13.0, 3.10, x64-kernel-build-node) (push) Has been cancelled
Release SGLang Kernels / release-cu130 (push) Has been cancelled
Release SGLang Kernels / build-rocm-matrix (3.10, 700) (push) Has been cancelled
Release SGLang Kernels / build-rocm-matrix (3.10, 720) (push) Has been cancelled
Release SGLang Kernels / release-rocm700 (push) Has been cancelled
Release SGLang Kernels / release-rocm720 (push) Has been cancelled
Release SGLang Kernels / build-musa43 (43, 3.10) (push) Has been cancelled
Release SGLang Kernels / release-musa43 (push) Has been cancelled
177 lines
4.7 KiB
Plaintext
177 lines
4.7 KiB
Plaintext
---
|
||
title: "OpenAI APIs - Vision"
|
||
metatags:
|
||
description: "This tutorial covers the vision APIs for vision language models."
|
||
---
|
||
SGLang provides OpenAI-compatible APIs to enable a smooth transition from OpenAI services to self-hosted local models.
|
||
A complete reference for the API is available in the [OpenAI API Reference](https://platform.openai.com/docs/guides/vision).
|
||
This tutorial covers the vision APIs for vision language models.
|
||
|
||
SGLang supports various vision language models such as Llama 3.2, LLaVA-OneVision, Qwen2.5-VL, Gemma3 and [more](../supported-models/multimodal_language_models).
|
||
|
||
As an alternative to the OpenAI API, you can also use the [SGLang offline engine](https://github.com/sgl-project/sglang/blob/main/examples/runtime/engine/offline_batch_inference_vlm.py).
|
||
|
||
## Launch A Server
|
||
|
||
Launch the server in your terminal and wait for it to initialize.
|
||
|
||
```python Example
|
||
from sglang.test.doc_patch import launch_server_cmd
|
||
from sglang.utils import wait_for_server, print_highlight, terminate_process
|
||
|
||
example_image_url = "https://raw.githubusercontent.com/sgl-project/sglang/main/examples/assets/example_image.png"
|
||
logo_image_url = (
|
||
"https://raw.githubusercontent.com/sgl-project/sglang/main/assets/logo.png"
|
||
)
|
||
|
||
vision_process, port = launch_server_cmd("""
|
||
python3 -m sglang.launch_server --model-path Qwen/Qwen2.5-VL-7B-Instruct --log-level warning
|
||
""")
|
||
|
||
wait_for_server(f"http://localhost:{port}", process=vision_process)
|
||
```
|
||
|
||
## Using cURL
|
||
|
||
Once the server is up, you can send test requests using curl or requests.
|
||
|
||
```python Example
|
||
import subprocess
|
||
|
||
curl_command = f"""
|
||
curl -s http://localhost:{port}/v1/chat/completions \\
|
||
-H "Content-Type: application/json" \\
|
||
-d '{{
|
||
"model": "Qwen/Qwen2.5-VL-7B-Instruct",
|
||
"messages": [
|
||
{{
|
||
"role": "user",
|
||
"content": [
|
||
{{
|
||
"type": "text",
|
||
"text": "What’s in this image?"
|
||
}},
|
||
{{
|
||
"type": "image_url",
|
||
"image_url": {{
|
||
"url": "{example_image_url}"
|
||
}}
|
||
}}
|
||
]
|
||
}}
|
||
],
|
||
"max_tokens": 300
|
||
}}'
|
||
"""
|
||
|
||
response = subprocess.check_output(curl_command, shell=True).decode()
|
||
print_highlight(response)
|
||
|
||
|
||
response = subprocess.check_output(curl_command, shell=True).decode()
|
||
print_highlight(response)
|
||
```
|
||
|
||
## Using Python Requests
|
||
|
||
```python Example
|
||
import requests
|
||
|
||
url = f"http://localhost:{port}/v1/chat/completions"
|
||
|
||
data = {
|
||
"model": "Qwen/Qwen2.5-VL-7B-Instruct",
|
||
"messages": [
|
||
{
|
||
"role": "user",
|
||
"content": [
|
||
{"type": "text", "text": "What’s in this image?"},
|
||
{
|
||
"type": "image_url",
|
||
"image_url": {"url": example_image_url},
|
||
},
|
||
],
|
||
}
|
||
],
|
||
"max_tokens": 300,
|
||
}
|
||
|
||
response = requests.post(url, json=data)
|
||
print_highlight(response.text)
|
||
```
|
||
|
||
## Using OpenAI Python Client
|
||
|
||
```python Example
|
||
from openai import OpenAI
|
||
|
||
client = OpenAI(base_url=f"http://localhost:{port}/v1", api_key="None")
|
||
|
||
response = client.chat.completions.create(
|
||
model="Qwen/Qwen2.5-VL-7B-Instruct",
|
||
messages=[
|
||
{
|
||
"role": "user",
|
||
"content": [
|
||
{
|
||
"type": "text",
|
||
"text": "What is in this image?",
|
||
},
|
||
{
|
||
"type": "image_url",
|
||
"image_url": {"url": example_image_url},
|
||
},
|
||
],
|
||
}
|
||
],
|
||
max_tokens=300,
|
||
)
|
||
|
||
print_highlight(response.choices[0].message.content)
|
||
```
|
||
|
||
## Multiple-Image Inputs
|
||
|
||
The server also supports multiple images and interleaved text and images if the model supports it.
|
||
|
||
```python Example
|
||
from openai import OpenAI
|
||
|
||
client = OpenAI(base_url=f"http://localhost:{port}/v1", api_key="None")
|
||
|
||
response = client.chat.completions.create(
|
||
model="Qwen/Qwen2.5-VL-7B-Instruct",
|
||
messages=[
|
||
{
|
||
"role": "user",
|
||
"content": [
|
||
{
|
||
"type": "image_url",
|
||
"image_url": {
|
||
"url": example_image_url,
|
||
},
|
||
},
|
||
{
|
||
"type": "image_url",
|
||
"image_url": {
|
||
"url": logo_image_url,
|
||
},
|
||
},
|
||
{
|
||
"type": "text",
|
||
"text": "I have two very different images. They are not related at all. "
|
||
"Please describe the first image in one sentence, and then describe the second image in another sentence.",
|
||
},
|
||
],
|
||
}
|
||
],
|
||
temperature=0,
|
||
)
|
||
|
||
print_highlight(response.choices[0].message.content)
|
||
```
|
||
|
||
```python Example
|
||
terminate_process(vision_process)
|
||
```
|