This spec defines Lemonade's implementation of the OpenAI API.
| Method | Endpoint | Description | Modality |
|---|---|---|---|
POST |
/v1/chat/completions |
Chat Completions | messages -> completion |
POST |
/v1/completions |
Text Completions | prompt -> completion |
POST |
/v1/embeddings |
Embeddings | text -> vector representations |
POST |
/v1/responses |
Responses API | prompt/messages -> event |
POST |
/v1/audio/transcriptions |
Audio Transcription | audio file -> text |
POST |
/v1/audio/speech |
Text to speech | text -> audio |
WS |
/realtime |
Realtime Audio Transcription, OpenAI SDK compatible | streaming audio -> text |
POST |
/v1/images/generations |
Image Generation | prompt -> image |
POST |
/v1/images/edits |
Image Editing | image + prompt -> edited image |
POST |
/v1/images/variations |
Image Variations | image -> varied image |
POST |
/v1/images/upscale |
Image Upscaling | image + ESRGAN model -> upscaled image |
GET |
/v1/models |
List models available locally | n/a |
GET |
/v1/models/{model_id} |
Retrieve a specific model by ID | n/a |
Chat Completions API. You provide a list of messages and receive a completion. This API will also load the model if it is not already loaded.
=== "PowerShell"
```powershell
Invoke-WebRequest `
-Uri "http://localhost:13305/v1/chat/completions" `
-Method POST `
-Headers @{ "Content-Type" = "application/json" } `
-Body '{
"model": "Qwen3-0.6B-GGUF",
"messages": [
{
"role": "user",
"content": "What is the population of Paris?"
}
],
"stream": false
}'
```
=== "Bash"
```bash
curl -X POST http://localhost:13305/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{
"model": "Qwen3-0.6B-GGUF",
"messages": [
{"role": "user", "content": "What is the population of Paris?"}
],
"stream": false
}'
```
=== "Non-streaming responses"
```json
{
"id": "0",
"object": "chat.completion",
"created": 1742927481,
"model": "Qwen3-0.6B-GGUF",
"choices": [{
"index": 0,
"message": {
"role": "assistant",
"content": "Paris has a population of approximately 2.2 million people in the city proper."
},
"finish_reason": "stop"
}]
}
```
=== "Streaming responses" For streaming responses, the API returns a stream of server-sent events (however, Open AI recommends using their streaming libraries for parsing streaming responses):
```json
{
"id": "0",
"object": "chat.completion.chunk",
"created": 1742927481,
"model": "Qwen3-0.6B-GGUF",
"choices": [{
"index": 0,
"delta": {
"role": "assistant",
"content": "Paris"
}
}]
}
```
To send images to chat/completions, pass a messages[*].content array that mixes text and image_url items. The image can be provided as a base64 data URL (for example, from FileReader.readAsDataURL(...) in web apps).
curl -X POST http://localhost:13305/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{
"model": "Qwen2.5-VL-7B-Instruct",
"messages": [
{
"role": "user",
"content": [
{"type": "text", "text": "What is in this image?"},
{"type": "image_url", "image_url": {"url": "data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD..."}}
]
}
],
"stream": false
}'{
"id": "0",
"object": "chat.completion",
"created": 1742927481,
"model": "Qwen2.5-VL-7B-Instruct",
"choices": [{
"index": 0,
"message": {
"role": "assistant",
"content": "The image shows a red apple resting on a wooden table."
},
"finish_reason": "stop"
}]
}Note: Omni collection orchestration is a Lemonade-specific extension to the Chat Completions API; it is not part of the OpenAI specification. Requests that target ordinary (non-collection) models are unaffected and are fully OpenAI-compatible.
When model names an Omni collection model (recipe: "collection.omni", e.g., LMX-Omni-52B-Halo), this endpoint runs an internal tool-calling loop instead of a plain completion. The server injects the reference system prompt and tools, routes to the collection's chat component, executes the omni tools (image generation/editing, text-to-speech) against the matching components, and returns one OpenAI-compatible response. Generated media is embedded in the assistant content:
- images → markdown
 - speech →
<audio>data:audio/mpeg;base64,…</audio>
Both non-streaming and stream: true are supported. In streaming mode the media arrives as a content delta on a chat.completion.chunk frame the moment its tool finishes.
Merge semantics. A client-provided system prompt is prepended by the built-in omni system prompt. Client-provided tools are merged with the built-in omni tools. The server resolves omni tool calls internally; calls to client-provided tools are returned in a finish_reason: "tool_calls" response for the client to execute and resume. Targeting a collection name invokes the server-side loop; targeting a component LLM name bypasses it and returns a plain completion. See Lemonade Omni Models for details.
curl -X POST http://localhost:13305/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{
"model": "LMX-Omni-52B-Halo",
"messages": [{"role": "user", "content": "Draw a red apple on a table."}],
"stream": false
}'The image tool runs during the loop and its output is embedded as a markdown image in the assistant content:
{
"id": "0",
"object": "chat.completion",
"created": 1742927481,
"model": "LMX-Omni-52B-Halo",
"choices": [{
"index": 0,
"message": {
"role": "assistant",
"content": "Here is a red apple on a table.\n\n"
},
"finish_reason": "stop"
}]
}Text Completions API. You provide a prompt and receive a completion. This API will also load the model if it is not already loaded.
=== "PowerShell"
```powershell
Invoke-WebRequest -Uri "http://localhost:13305/v1/completions" `
-Method POST `
-Headers @{ "Content-Type" = "application/json" } `
-Body '{
"model": "Qwen3-0.6B-GGUF",
"prompt": "What is the population of Paris?",
"stream": false
}'
```
=== "Bash"
```bash
curl -X POST http://localhost:13305/v1/completions \
-H "Content-Type: application/json" \
-d '{
"model": "Qwen3-0.6B-GGUF",
"prompt": "What is the population of Paris?",
"stream": false
}'
```
The following format is used for both streaming and non-streaming responses:
{
"id": "0",
"object": "text_completion",
"created": 1742927481,
"model": "Qwen3-0.6B-GGUF",
"choices": [{
"index": 0,
"text": "Paris has a population of approximately 2.2 million people in the city proper.",
"finish_reason": "stop"
}],
}Embeddings API. You provide input text and receive vector representations (embeddings) that can be used for semantic search, clustering, and similarity comparisons. This API will also load the model if it is not already loaded.
Note: This endpoint is only available for models using the
llamacpporflmrecipes. ONNX models (OGA recipes) do not support embeddings.
=== "PowerShell"
```powershell
Invoke-WebRequest `
-Uri "http://localhost:13305/v1/embeddings" `
-Method POST `
-Headers @{ "Content-Type" = "application/json" } `
-Body '{
"model": "nomic-embed-text-v1-GGUF",
"input": ["Hello, world!", "How are you?"],
"encoding_format": "float"
}'
```
=== "Bash"
```bash
curl -X POST http://localhost:13305/v1/embeddings \
-H "Content-Type: application/json" \
-d '{
"model": "nomic-embed-text-v1-GGUF",
"input": ["Hello, world!", "How are you?"],
"encoding_format": "float"
}'
```
{
"object": "list",
"data": [
{
"object": "embedding",
"index": 0,
"embedding": [0.0234, -0.0567, 0.0891, ...]
},
{
"object": "embedding",
"index": 1,
"embedding": [0.0456, -0.0678, 0.1234, ...]
}
],
"model": "nomic-embed-text-v1-GGUF",
"usage": {
"prompt_tokens": 12,
"total_tokens": 12
}
}Field Descriptions:
object- Type of response object, always"list"data- Array of embedding objectsobject- Type of embedding object, always"embedding"index- Index position of the input text in the requestembedding- Vector representation as an array of floats
model- Model identifier used to generate the embeddingsusage- Token usage statisticsprompt_tokens- Number of tokens in the inputtotal_tokens- Total tokens processed
Responses API. You provide an input and receive a response. This API will also load the model if it is not already loaded.
The Responses API uses semantic events for streaming. Each event is typed with a predefined schema, so you can listen for events you care about. Our initial implementation only offers support to:
response.createdresponse.output_text.deltaresponse.completed
For a full list of event types, see the API reference for streaming.
=== "PowerShell"
```powershell
Invoke-WebRequest -Uri "http://localhost:13305/v1/responses" `
-Method POST `
-Headers @{ "Content-Type" = "application/json" } `
-Body '{
"model": "Llama-3.2-1B-Instruct-Hybrid",
"input": "What is the population of Paris?",
"stream": false
}'
```
=== "Bash"
```bash
curl -X POST http://localhost:13305/v1/responses \
-H "Content-Type: application/json" \
-d '{
"model": "Llama-3.2-1B-Instruct-Hybrid",
"input": "What is the population of Paris?",
"stream": false
}'
```
=== "Non-streaming responses"
```json
{
"id": "0",
"created_at": 1746225832.0,
"model": "Llama-3.2-1B-Instruct-Hybrid",
"object": "response",
"output": [{
"id": "0",
"content": [{
"annotations": [],
"text": "Paris has a population of approximately 2.2 million people in the city proper."
}]
}]
}
```
=== "Streaming Responses" For streaming responses, the API returns a series of events. Refer to OpenAI streaming guide for details.
Audio Transcription API. You provide an audio file and receive a text transcription. This API will also load the model if it is not already loaded.
Note: This endpoint uses whisper.cpp as the backend. Whisper models are automatically downloaded when first used.
Limitations: Only
wavaudio format andjsonresponse format are currently supported.
=== "Windows"
```bash
curl -X POST http://localhost:13305/v1/audio/transcriptions ^
-F "file=@C:\path\to\audio.wav" ^
-F "model=Whisper-Tiny"
```
=== "Linux"
```bash
curl -X POST http://localhost:13305/v1/audio/transcriptions \
-F "file=@/path/to/audio.wav" \
-F "model=Whisper-Tiny"
```
{
"text": "Hello, this is a sample transcription of the audio file."
}Field Descriptions:
text- The transcribed text from the audio file
Realtime Audio Transcription API via WebSocket (OpenAI SDK compatible). Stream audio from a microphone and receive transcriptions in real-time with Voice Activity Detection (VAD).
Limitations: Only 16kHz mono PCM16 audio format is supported. Uses the same Whisper models as the HTTP transcription endpoint.
WebSocket upgrades are accepted directly on the main HTTP port (default 13305) — the same port as all REST endpoints. Connect with the model name:
ws://localhost:13305/v1/realtime?model=Whisper-Tiny
Accepted paths are /realtime and /logs/stream, bare or under any of the standard prefixes (/v1, /v0, /api/v1, /api/v0), so OpenAI Realtime SDK clients (/v1/realtime) connect as-is. When LEMONADE_API_KEY is set, pass ?api_key=KEY as a query parameter.
A dedicated WebSocket port also remains for backward compatibility; it is OS-assigned and reported by the /v1/health endpoint (websocket_port field). New clients should prefer the main port:
ws://localhost:<websocket_port>/realtime?model=Whisper-Tiny
Upon connection, the server sends a session.created message with a session ID.
| Message Type | Description |
|---|---|
session.update |
Configure the session (set model, VAD settings, or disable turn detection) |
input_audio_buffer.append |
Send audio data (base64-encoded PCM16) |
input_audio_buffer.commit |
Force transcription of buffered audio |
input_audio_buffer.clear |
Clear audio buffer without transcribing |
| Message Type | Description |
|---|---|
session.created |
Session established, contains session ID |
session.updated |
Session configuration updated |
input_audio_buffer.speech_started |
VAD detected speech start |
input_audio_buffer.speech_stopped |
VAD detected speech end, transcription triggered |
input_audio_buffer.committed |
Audio buffer committed for transcription |
input_audio_buffer.cleared |
Audio buffer cleared |
conversation.item.input_audio_transcription.delta |
Interim/partial transcription (replaceable) |
conversation.item.input_audio_transcription.completed |
Final transcription result |
error |
Error message |
{
"type": "session.update",
"session": {
"model": "Whisper-Tiny"
}
}{
"type": "input_audio_buffer.append",
"audio": "<base64-encoded PCM16 audio>"
}Audio should be:
- 16kHz sample rate
- Mono (single channel)
- 16-bit signed integer (PCM16)
- Base64 encoded
- Sent in chunks (~85ms recommended)
{
"type": "conversation.item.input_audio_transcription.completed",
"transcript": "Hello, this is a test transcription."
}VAD settings can be configured via session.update:
{
"type": "session.update",
"session": {
"model": "Whisper-Tiny",
"turn_detection": {
"threshold": 0.01,
"silence_duration_ms": 800,
"prefix_padding_ms": 250
}
}
}| Parameter | Default | Description |
|---|---|---|
threshold |
0.01 | RMS energy threshold for speech detection |
silence_duration_ms |
800 | Silence duration to trigger speech end |
prefix_padding_ms |
250 | Minimum speech duration before triggering |
Set turn_detection to null to disable server-side VAD and use explicit commits instead:
{
"type": "session.update",
"session": {
"model": "Whisper-Tiny",
"turn_detection": null
}
}A complete, runnable example:
realtime_transcription.py- Python CLI for microphone streaming
# Stream from microphone
python examples/realtime_transcription.py --model Whisper-Tiny- Audio Format: Server expects 16kHz mono PCM16. Higher sample rates must be downsampled client-side.
- Chunk Size: Send audio in ~85-256ms chunks for optimal latency/efficiency.
- VAD Behavior: Server automatically detects speech boundaries and triggers transcription on speech end.
- Manual Commit: Set
turn_detectiontonull, then useinput_audio_buffer.committo force transcription. In this mode the server buffers audio but does not emit VAD or interim transcription events. - Clear Buffer: Use
input_audio_buffer.clearto discard audio without transcribing. - Chunking: We are still tuning the chunking to balance latency vs. accuracy.
- Migrating off the dedicated port: Clients that discover
websocket_portvia/v1/healthand connect there can switch tows://HOST:13305/v1/realtime?model=...— the protocol (events, audio format, auth) is identical on both ports, so it is a URL change only. This also simplifies remote setups (one port to expose) and works through reverse proxies that passUpgrade: websocket. Keep thewebsocket_portfallback only if you must support servers older than this release.
Image Generation API. You provide a text prompt and receive a generated image. This API uses stable-diffusion.cpp as the backend.
Note: Image generation uses Stable Diffusion models. Available models include
SD-Turbo(fast, ~4 steps),SDXL-Turbo,SD-1.5, andSDXL-Base-1.0.Performance: CPU inference takes ~4-5 minutes per image. GPU (Vulkan) is faster but may have compatibility issues with some hardware.
=== "Bash"
```bash
curl -X POST http://localhost:13305/v1/images/generations \
-H "Content-Type: application/json" \
-d '{
"model": "SD-Turbo",
"prompt": "A serene mountain landscape at sunset",
"size": "512x512",
"steps": 4,
"response_format": "b64_json"
}'
```
Image Editing API. You provide a source image and a text prompt describing the desired change, and receive an edited image. This API uses stable-diffusion.cpp as the backend.
Note: This endpoint accepts
multipart/form-datarequests (not JSON). Use editing-capable models such asFlux-2-Klein-4BorSD-Turbo.Performance: CPU inference takes several minutes per image. GPU (ROCm) is significantly faster.
=== "Bash"
```bash
curl -X POST http://localhost:13305/v1/images/edits \
-F "model=Flux-2-Klein-4B" \
-F "prompt=Add a red barn and mountains in the background, photorealistic" \
-F "size=512x512" \
-F "n=1" \
-F "response_format=b64_json" \
-F "image=@/path/to/source_image.png"
```
=== "Python (OpenAI client)"
```python
from openai import OpenAI
client = OpenAI(base_url="http://localhost:13305/api/v1", api_key="not-needed")
with open("source_image.png", "rb") as image_file:
response = client.images.edit(
model="Flux-2-Klein-4B",
image=image_file,
prompt="Add a red barn and mountains in the background, photorealistic",
size="512x512",
)
import base64
image_data = base64.b64decode(response.data[0].b64_json)
open("edited_image.png", "wb").write(image_data)
```
Image Variations API. You provide a source image and receive a variation of it. This API uses stable-diffusion.cpp as the backend.
Note: This endpoint accepts
multipart/form-datarequests (not JSON). Unlike/images/edits, apromptparameter is not supported and will be ignored — the model generates a variation based solely on the input image.Performance: CPU inference takes several minutes per image. GPU (ROCm) is significantly faster.
=== "Bash"
```bash
curl -X POST http://localhost:13305/v1/images/variations \
-F "model=Flux-2-Klein-4B" \
-F "size=512x512" \
-F "n=1" \
-F "response_format=b64_json" \
-F "image=@/path/to/source_image.png"
```
=== "Python (OpenAI client)"
```python
from openai import OpenAI
client = OpenAI(base_url="http://localhost:13305/api/v1", api_key="not-needed")
with open("source_image.png", "rb") as image_file:
response = client.images.create_variation(
model="Flux-2-Klein-4B",
image=image_file,
size="512x512",
n=1,
)
import base64
image_data = base64.b64decode(response.data[0].b64_json)
open("variation.png", "wb").write(image_data)
```
Image Upscaling API. You provide a base64-encoded image and a Real-ESRGAN model name, and receive a 4x upscaled image. This API uses the sd-cli binary from stable-diffusion.cpp to perform super-resolution.
Note: Available upscale models are
RealESRGAN-x4plus(general-purpose, 64 MB) andRealESRGAN-x4plus-anime(optimized for anime-style art, 17 MB). Both produce a 4x resolution increase (e.g., 256x256 → 1024x1024).Note: Unlike
/images/editsand/images/variations, this endpoint accepts a JSON body (not multipart/form-data). The image must be provided as a base64-encoded string.
| Parameter | Required | Description | Status |
|---|---|---|---|
image |
Yes | Base64-encoded PNG image to upscale. | |
model |
Yes | The ESRGAN model to use (e.g., RealESRGAN-x4plus, RealESRGAN-x4plus-anime). |
A typical workflow is to generate an image first, then upscale it:
=== "Bash"
```bash
# Step 1: Generate an image and save the base64 response
RESPONSE=$(curl -s -X POST http://localhost:13305/v1/images/generations \
-H "Content-Type: application/json" \
-d '{
"model": "SD-Turbo",
"prompt": "A serene mountain landscape at sunset",
"size": "512x512",
"steps": 4,
"response_format": "b64_json"
}')
# Step 2: Build the upscale JSON payload and pipe it to curl via stdin
# (base64 images are too large for command-line interpolation)
echo "$RESPONSE" | python3 -c "
import sys, json
b64 = json.load(sys.stdin)['data'][0]['b64_json']
print(json.dumps({'image': b64, 'model': 'RealESRGAN-x4plus'}))
" | curl -X POST http://localhost:13305/v1/images/upscale \
-H "Content-Type: application/json" \
-d @-
```
=== "PowerShell"
```powershell
# Step 1: Generate an image
$genResponse = Invoke-WebRequest `
-Uri "http://localhost:13305/v1/images/generations" `
-Method POST `
-Headers @{ "Content-Type" = "application/json" } `
-Body '{
"model": "SD-Turbo",
"prompt": "A serene mountain landscape at sunset",
"size": "512x512",
"steps": 4,
"response_format": "b64_json"
}'
# Step 2: Extract the base64 image
$imageB64 = ($genResponse.Content | ConvertFrom-Json).data[0].b64_json
# Step 3: Upscale the image with Real-ESRGAN
$body = @{ image = $imageB64; model = "RealESRGAN-x4plus" } | ConvertTo-Json
Invoke-WebRequest `
-Uri "http://localhost:13305/v1/images/upscale" `
-Method POST `
-Headers @{ "Content-Type" = "application/json" } `
-Body $body
```
=== "Python (requests)"
```python
import requests
import base64
BASE_URL = "http://localhost:13305/api/v1"
# Step 1: Generate an image
gen_response = requests.post(f"{BASE_URL}/images/generations", json={
"model": "SD-Turbo",
"prompt": "A serene mountain landscape at sunset",
"size": "512x512",
"steps": 4,
"response_format": "b64_json",
})
image_b64 = gen_response.json()["data"][0]["b64_json"]
# Step 2: Upscale the image with Real-ESRGAN (512x512 -> 2048x2048)
upscale_response = requests.post(f"{BASE_URL}/images/upscale", json={
"image": image_b64,
"model": "RealESRGAN-x4plus",
})
# Step 3: Save the upscaled image to a file
upscaled_b64 = upscale_response.json()["data"][0]["b64_json"]
with open("upscaled.png", "wb") as f:
f.write(base64.b64decode(upscaled_b64))
```
{
"created": 1742927481,
"data": [
{
"b64_json": "<base64-encoded upscaled PNG>"
}
]
}Field Descriptions:
created- Unix timestamp of when the upscaled image was generateddata- Array containing the upscaled imageb64_json- Base64-encoded PNG of the upscaled image
| Status Code | Condition | Example |
|---|---|---|
| 400 | Missing image field |
{"error": {"message": "Missing 'image' field (base64 encoded)", "type": "invalid_request_error"}} |
| 400 | Missing model field |
{"error": {"message": "Missing 'model' field", "type": "invalid_request_error"}} |
| 404 | Unknown model name | {"error": {"message": "Upscale model not found: bad-model", "type": "invalid_request_error"}} |
| 500 | Upscale failed | {"error": {"message": "ESRGAN upscale failed", "type": "server_error"}} |
Speech Generation API. You provide a text input and receive an audio file. This API uses Kokoros as the backend.
Note: Supported models are
kokoro-v1(fixed voices, Kokoros backend) and the OpenMOSS family —OpenMOSS-TTS(voice cloning from a reference WAV) andMOSS-VoiceGen(voice design from a text description).Limitations:
kokoro-v1supportsmp3,wav,opus, andpcm; OpenMOSS models natively producewavonly, and other formats are rejected with400 Bad Request. Streaming is supported inaudio(pcm) mode onkokoro-v1.
=== "Bash"
```bash
curl -X POST http://localhost:13305/v1/audio/speech \
-H "Content-Type: application/json" \
-d '{
"model": "kokoro-v1",
"input": "Lemonade can speak!",
"speed": 1.0,
"steps": 4,
"response_format": "mp3"
}'
```
The generated audio file is returned as-is.
Returns a list of models available on the server in an OpenAI-compatible format. Each model object includes extended fields like checkpoint, recipe, size, downloaded, labels, and, when known, max_context_window.
By default, only models available locally (downloaded) are shown, matching OpenAI API behavior.
When lemond is configured with cloud providers, cloud-routed models appear here alongside local ones with recipe: "cloud" and a cloud_provider field. They are dot-namespaced by provider (e.g. fireworks.kimi-k2p5) and accept the standard chat-completions / completions requests below — see Cloud Offload.
| Parameter | Required | Description |
|---|---|---|
show_all |
No | If set to true, returns all models from the catalog including those not yet downloaded. Defaults to false. |
# Show only downloaded models (OpenAI-compatible)
curl http://localhost:13305/v1/models
# Show all models including not-yet-downloaded (extended usage)
curl http://localhost:13305/v1/models?show_all=true{
"object": "list",
"data": [
{
"id": "Qwen3-0.6B-GGUF",
"created": 1744173590,
"object": "model",
"owned_by": "lemonade",
"checkpoint": "unsloth/Qwen3-0.6B-GGUF:Q4_0",
"recipe": "llamacpp",
"size": 0.38,
"max_context_window": 40960,
"downloaded": true,
"suggested": true,
"update_available": false,
"labels": ["reasoning"]
},
{
"id": "Gemma-3-4b-it-GGUF",
"created": 1744173590,
"object": "model",
"owned_by": "lemonade",
"checkpoint": "ggml-org/gemma-3-4b-it-GGUF:Q4_K_M",
"recipe": "llamacpp",
"size": 3.61,
"downloaded": true,
"suggested": true,
"labels": ["hot", "vision"]
},
{
"id": "SD-Turbo",
"created": 1744173590,
"object": "model",
"owned_by": "lemonade",
"checkpoint": "stabilityai/sd-turbo:sd_turbo.safetensors",
"recipe": "sd-cpp",
"size": 5.2,
"downloaded": true,
"suggested": true,
"labels": ["image"],
"image_defaults": {
"steps": 4,
"cfg_scale": 1.0,
"width": 512,
"height": 512
}
}
]
}Field Descriptions:
object- Type of response object, always"list"data- Array of model objects with the following fields:id- Model identifier (used for loading and inference requests)created- Unix timestamp of when the model entry was createdobject- Type of object, always"model"owned_by- Owner of the model, always"lemonade"checkpoint- Full checkpoint identifier on Hugging Facerecipe- Backend/device recipe used to load the model (e.g.,"ryzenai-llm","llamacpp","flm")size- Model size in GB (omitted for models without size information)max_context_window- Optional integer indicating the maximum model-supported text context discovered from local static metadata. Currently populated for downloaded GGUF/llama.cpp models and installed FLM text-context models.downloaded- Boolean indicating if the model is downloaded and available locallyupdate_available- Boolean indicating a newer commit exists on HuggingFace for this model. Only set for downloaded HF-backed models.falseotherwise.suggested- Boolean indicating if the model is recommended for general uselabels- Array of tags describing the model's capabilities and characteristics. See Model Labels for the full list.image_defaults- (Image models only) Default generation parameters for the model:steps- Number of inference steps (e.g., 4 for turbo models, 20 for standard models)cfg_scale- Classifier-free guidance scale (e.g., 1.0 for turbo models, 7.5 for standard models)width- Default image width in pixelsheight- Default image height in pixels
components- (Omni collections only,recipe: "collection.omni") Ordered array of the component model names that make up the collectionmodels- (Omni collections only) Ordered array embedding each component's full model object (same shape as the entries in this list), parallel tocomponents. This makes a collection's/v1/models/{model_id}response self-contained — exporting it produces a file that can be imported elsewhere via/v1/pull
Labels describe what a model can do. A model may carry multiple labels.
Deployment labels — determine which backend endpoint the model is routed to:
| Label | Endpoint | Description |
|---|---|---|
transcription |
/audio/transcriptions |
Speech-to-text transcription model (e.g. Whisper). Mutually exclusive with LLM deployment. |
embeddings |
/embeddings |
Produces text embedding vectors. |
reranking |
/reranking |
Scores and reranks a list of passages given a query. |
image |
/images/generations |
Text-to-image generation model. |
edit |
Image editing model; supports the /images/edits endpoint. |
|
tts |
/audio/speech |
Text-to-speech synthesis model. |
Input-modality labels — the model is deployed as an LLM but accepts additional input types in /chat/completions:
| Label | Description |
|---|---|
vision |
Accepts image attachments in chat messages. |
chat-transcription |
Accepts audio attachments in chat messages (e.g. Qwen2.5-Omni). |
Streaming labels — capability flags for real-time features:
| Label | Description |
|---|---|
realtime-transcription |
Supports the WebSocket /realtime endpoint for live microphone transcription. |
Runtime labels — affect backend launch defaults:
| Label | Description |
|---|---|
mtp |
Enables llama.cpp MTP draft decoding defaults (--spec-type draft-mtp --spec-draft-n-max 3 --spec-draft-p-min 0.75); users can override these with llamacpp_args. |
Characteristic labels — informational, do not affect routing:
| Label | Description |
|---|---|
hot |
Featured or popular model, highlighted in the UI. |
reasoning |
Uses extended chain-of-thought reasoning (e.g. DeepSeek, Qwen3). |
tool-calling |
Supports function/tool calling in chat completions. |
coding |
Tuned for code generation and software tasks. |
upscaling |
Image upscaling model (e.g. Real-ESRGAN). Used as a component in image pipelines. |
experimental |
Not yet validated for production use. |
Retrieve a specific model by its ID. Returns the same model object format as the list endpoint above.
| Parameter | Required | Description |
|---|---|---|
model_id |
Yes | The ID of the model to retrieve. Must match one of the model IDs from the models list. |
curl http://localhost:13305/v1/models/Qwen3-0.6B-GGUFReturns a single model object with the same fields as described in the models list endpoint above. For Omni collections (recipe: "collection.omni"), the object additionally carries components (ordered component names) and models (each component's full model object) — see the collection file documentation.
{
"id": "Qwen3-0.6B-GGUF",
"created": 1744173590,
"object": "model",
"owned_by": "lemonade",
"checkpoint": "unsloth/Qwen3-0.6B-GGUF:Q4_0",
"recipe": "llamacpp",
"size": 0.38,
"max_context_window": 40960,
"downloaded": true,
"suggested": true,
"labels": ["reasoning"],
"recipe_options": {
"ctx_size": 8192,
"llamacpp_args": "--no-mmap",
"llamacpp_backend": "rocm"
}
}If the model is not found, the endpoint returns a 404 error:
{
"error": {
"message": "Model Qwen3-0.6B-GGUF has not been found",
"type": "not_found"
}
}