78 lines
2.6 KiB
Markdown
78 lines
2.6 KiB
Markdown
# Diffusion Chat Completions API
|
|||
|
|
|
||
|
|
vLLM-Omni supports generating and editing images via the `/v1/chat/completions`
|
||
|
|
endpoint using diffusion models. This page explains how to pass generation
|
||
|
|
parameters (such as `num_inference_steps`, `height`, `width`) to diffusion
|
||
|
|
models through this endpoint.
|
||
|
|
|
||
|
|
!!! tip
|
||
|
|
For dedicated endpoints that accept generation parameters as top-level
|
||
|
|
fields, see [Image Generation API](image_generation_api.md) and
|
||
|
|
[Image Edit API](image_edit_api.md).
|
||
|
|
|
||
|
|
## Passing Generation Parameters
|
||
|
|
|
||
|
|
The `/v1/chat/completions` endpoint follows the OpenAI Chat API schema, which
|
||
|
|
does not natively include diffusion-specific fields like `num_inference_steps`
|
||
|
|
or `height`. How you pass these extra fields depends on your client.
|
||
|
|
|
||
|
|
### curl / Python `requests`
|
||
|
|
|
||
|
|
Wrap generation parameters inside an `"extra_body"` key in the JSON body:
|
||
|
|
|
||
|
|
```bash
|
||
|
|
curl -s http://localhost:8091/v1/chat/completions \
|
||
|
|
-H "Content-Type: application/json" \
|
||
|
|
-d '{
|
||
|
|
"messages": [
|
||
|
|
{"role": "user", "content": "A beautiful landscape painting"}
|
||
|
|
],
|
||
|
|
"extra_body": {
|
||
|
|
"num_inference_steps": 50,
|
||
|
|
"seed": 42
|
||
|
|
}
|
||
|
|
}'
|
||
|
|
```
|
||
|
|
|
||
|
|
### OpenAI Python SDK
|
||
|
|
|
||
|
|
Use the `extra_body` **keyword argument**. The SDK automatically merges these
|
||
|
|
fields into the top-level request body:
|
||
|
|
|
||
|
|
```python
|
||
|
|
response = client.chat.completions.create(
|
||
|
|
model="Qwen/Qwen-Image",
|
||
|
|
messages=[{"role": "user", "content": "A beautiful landscape painting"}],
|
||
|
|
extra_body={
|
||
|
|
"num_inference_steps": 50,
|
||
|
|
"seed": 42,
|
||
|
|
},
|
||
|
|
)
|
||
|
|
```
|
||
|
|
|
||
|
|
!!! note "SDK `extra_body` vs. JSON `extra_body`"
|
||
|
|
These two `extra_body` usages look similar but work differently under the
|
||
|
|
hood. The SDK flattens the dict into the top-level request JSON, while the
|
||
|
|
curl/requests approach sends it as a nested `"extra_body"` key. Both are
|
||
|
|
handled correctly by the server.
|
||
|
|
|
||
|
|
!!! note "About the `ignored fields` warning"
|
||
|
|
You may see a log message like:
|
||
|
|
|
||
|
|
```
|
||
|
|
WARNING: The following fields were present in the request but ignored: {'height', 'width', ...}
|
||
|
|
```
|
||
|
|
|
||
|
|
This is **harmless**. It is emitted by vLLM's request validation layer
|
||
|
|
because these fields are not part of the standard OpenAI
|
||
|
|
`ChatCompletionRequest` schema. The fields are still stored internally
|
||
|
|
and correctly forwarded to the diffusion pipeline.
|
||
|
|
|
||
|
|
## Model-Specific Examples
|
||
|
|
|
||
|
|
For complete examples with full request/response details, see the model-specific
|
||
|
|
guides:
|
||
|
|
|
||
|
|
- [Text-to-Image (Qwen-Image)](../user_guide/examples/online_serving/text_to_image.md)
|
||
|
|
- [Image-to-Image (Qwen-Image-Edit, Qwen-Image-Layered)](../user_guide/examples/online_serving/image_to_image.md)
|
||
|
|
- [GLM-Image](../user_guide/examples/online_serving/glm_image.md)
|