Try FLUX.2 [pro] in the Workbench
Run this model interactively, tune parameters, and compare outputs.
flux-2-pro
FLUX.2 [pro] is an image generation model designed for high-fidelity, production-grade visual content and image editing. It excels in producing highly detailed, photorealistic images up to 4 megapixel resolution, with strong prompt adherence, reliable consistency across batch generations, advanced text rendering (including complex typography and multilingual content), and robust multi-reference support for maintaining character, product, or style consistency across images.
Some other noteworthy features of FLUX.2 [pro] include precise control over pose, color (including exact HEX codes), and compositional logic; support for structured (JSON-like) prompts; and efficient, reproducible results suitable for API-driven production workflows.
| Metric | Value |
|---|---|
| Parameter Count | 32 billion |
| Mixture of Experts | No |
| Context Length | Unknown |
| Multilingual | Yes |
| Quantized* | Yes |
| Precision* | FP8 |
Example request
Use the Workbench as a request builder: configure parameters for this model in the UI, then open the API tab to copy the exact cURL or Python call.
- Sync
- Async
- Async with SSE
See the image editing reference for more details.
- Minimal
- Basic parameters
- All parameters
curl -X POST https://hub.oxen.ai/api/ai/images/edit \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $OXEN_API_KEY" \
-d '{
"model": "flux-2-pro",
"prompt": "Wanderer above the Sea of Fog by Caspar David Friedrich, as the wanderer facing out towards the expanse. The character should be shown from behind, standing on the rocky peak, facing away from the viewer and looking out towards the vast landscape. The background should be in the style of Caspar David Friedrich."
}'
import os
import requests
response = requests.post(
"https://hub.oxen.ai/api/ai/images/edit",
headers={
"Content-Type": "application/json",
"Authorization": f"Bearer {os.environ['OXEN_API_KEY']}",
},
json={
"model": "flux-2-pro",
"prompt": "Wanderer above the Sea of Fog by Caspar David Friedrich, as the wanderer facing out towards the expanse. The character should be shown from behind, standing on the rocky peak, facing away from the viewer and looking out towards the vast landscape. The background should be in the style of Caspar David Friedrich."
},
)
response.raise_for_status()
print(response.json())
curl -X POST https://hub.oxen.ai/api/ai/images/edit \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $OXEN_API_KEY" \
-d '{
"model": "flux-2-pro",
"prompt": "Wanderer above the Sea of Fog by Caspar David Friedrich, as the wanderer facing out towards the expanse. The character should be shown from behind, standing on the rocky peak, facing away from the viewer and looking out towards the vast landscape. The background should be in the style of Caspar David Friedrich.",
"input_image": [
"https://hub.oxen.ai/api/repos/elau/assets/file/main/bloxy/bloxy_cropped_512x512.png"
]
}'
import os
import requests
response = requests.post(
"https://hub.oxen.ai/api/ai/images/edit",
headers={
"Content-Type": "application/json",
"Authorization": f"Bearer {os.environ['OXEN_API_KEY']}",
},
json={
"model": "flux-2-pro",
"prompt": "Wanderer above the Sea of Fog by Caspar David Friedrich, as the wanderer facing out towards the expanse. The character should be shown from behind, standing on the rocky peak, facing away from the viewer and looking out towards the vast landscape. The background should be in the style of Caspar David Friedrich.",
"input_image": [
"https://hub.oxen.ai/api/repos/elau/assets/file/main/bloxy/bloxy_cropped_512x512.png"
]
},
)
response.raise_for_status()
print(response.json())
curl -X POST https://hub.oxen.ai/api/ai/images/edit \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $OXEN_API_KEY" \
-d '{
"model": "flux-2-pro",
"prompt": "Wanderer above the Sea of Fog by Caspar David Friedrich, as the wanderer facing out towards the expanse. The character should be shown from behind, standing on the rocky peak, facing away from the viewer and looking out towards the vast landscape. The background should be in the style of Caspar David Friedrich.",
"input_image": [
"https://hub.oxen.ai/api/repos/elau/assets/file/main/bloxy/bloxy_cropped_512x512.png"
],
"aspect_ratio": "1:1",
"resolution": "1 MP",
"num_inference_steps": 30,
"guidance": 2,
"output_format": "webp",
"output_quality": 80,
"disable_safety_checker": false
}'
import os
import requests
response = requests.post(
"https://hub.oxen.ai/api/ai/images/edit",
headers={
"Content-Type": "application/json",
"Authorization": f"Bearer {os.environ['OXEN_API_KEY']}",
},
json={
"model": "flux-2-pro",
"prompt": "Wanderer above the Sea of Fog by Caspar David Friedrich, as the wanderer facing out towards the expanse. The character should be shown from behind, standing on the rocky peak, facing away from the viewer and looking out towards the vast landscape. The background should be in the style of Caspar David Friedrich.",
"input_image": [
"https://hub.oxen.ai/api/repos/elau/assets/file/main/bloxy/bloxy_cropped_512x512.png"
],
"aspect_ratio": "1:1",
"resolution": "1 MP",
"num_inference_steps": 30,
"guidance": 2,
"output_format": "webp",
"output_quality": 80,
"disable_safety_checker": false
},
)
response.raise_for_status()
print(response.json())
See the async queue reference for more details.
- Minimal
- Basic parameters
- All parameters
# Enqueue, capture the generation id.
GEN_ID=$(curl -s -X POST https://hub.oxen.ai/api/ai/queue \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $OXEN_API_KEY" \
-d '{
"model": "flux-2-pro",
"prompt": "Wanderer above the Sea of Fog by Caspar David Friedrich, as the wanderer facing out towards the expanse. The character should be shown from behind, standing on the rocky peak, facing away from the viewer and looking out towards the vast landscape. The background should be in the style of Caspar David Friedrich."
}' | jq -r '.generations[0].generation_id')
# Poll the single generation until it 404s (terminal state).
while curl -s -o /dev/null -w "%{http_code}" \
-H "Authorization: Bearer $OXEN_API_KEY" \
"https://hub.oxen.ai/api/ai/queue/$GEN_ID" | grep -q "^200$"; do
sleep 5
done
echo "Done. See the 'Async with SSE' tab to receive the result URL."
import os
import time
import requests
HEADERS = {
"Content-Type": "application/json",
"Authorization": f"Bearer {os.environ['OXEN_API_KEY']}",
}
enqueue = requests.post(
"https://hub.oxen.ai/api/ai/queue",
headers=HEADERS,
json={
"model": "flux-2-pro",
"prompt": "Wanderer above the Sea of Fog by Caspar David Friedrich, as the wanderer facing out towards the expanse. The character should be shown from behind, standing on the rocky peak, facing away from the viewer and looking out towards the vast landscape. The background should be in the style of Caspar David Friedrich."
},
)
enqueue.raise_for_status()
generation_id = enqueue.json()["generations"][0]["generation_id"]
while True:
resp = requests.get(
f"https://hub.oxen.ai/api/ai/queue/{generation_id}",
headers=HEADERS,
)
if resp.status_code == 404:
break
time.sleep(5)
print("Done. See the 'Async with SSE' tab to receive the result URL.")
# Enqueue, capture the generation id.
GEN_ID=$(curl -s -X POST https://hub.oxen.ai/api/ai/queue \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $OXEN_API_KEY" \
-d '{
"model": "flux-2-pro",
"prompt": "Wanderer above the Sea of Fog by Caspar David Friedrich, as the wanderer facing out towards the expanse. The character should be shown from behind, standing on the rocky peak, facing away from the viewer and looking out towards the vast landscape. The background should be in the style of Caspar David Friedrich.",
"input_image": [
"https://hub.oxen.ai/api/repos/elau/assets/file/main/bloxy/bloxy_cropped_512x512.png"
]
}' | jq -r '.generations[0].generation_id')
# Poll the single generation until it 404s (terminal state).
while curl -s -o /dev/null -w "%{http_code}" \
-H "Authorization: Bearer $OXEN_API_KEY" \
"https://hub.oxen.ai/api/ai/queue/$GEN_ID" | grep -q "^200$"; do
sleep 5
done
echo "Done. See the 'Async with SSE' tab to receive the result URL."
import os
import time
import requests
HEADERS = {
"Content-Type": "application/json",
"Authorization": f"Bearer {os.environ['OXEN_API_KEY']}",
}
enqueue = requests.post(
"https://hub.oxen.ai/api/ai/queue",
headers=HEADERS,
json={
"model": "flux-2-pro",
"prompt": "Wanderer above the Sea of Fog by Caspar David Friedrich, as the wanderer facing out towards the expanse. The character should be shown from behind, standing on the rocky peak, facing away from the viewer and looking out towards the vast landscape. The background should be in the style of Caspar David Friedrich.",
"input_image": [
"https://hub.oxen.ai/api/repos/elau/assets/file/main/bloxy/bloxy_cropped_512x512.png"
]
},
)
enqueue.raise_for_status()
generation_id = enqueue.json()["generations"][0]["generation_id"]
while True:
resp = requests.get(
f"https://hub.oxen.ai/api/ai/queue/{generation_id}",
headers=HEADERS,
)
if resp.status_code == 404:
break
time.sleep(5)
print("Done. See the 'Async with SSE' tab to receive the result URL.")
# Enqueue, capture the generation id.
GEN_ID=$(curl -s -X POST https://hub.oxen.ai/api/ai/queue \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $OXEN_API_KEY" \
-d '{
"model": "flux-2-pro",
"prompt": "Wanderer above the Sea of Fog by Caspar David Friedrich, as the wanderer facing out towards the expanse. The character should be shown from behind, standing on the rocky peak, facing away from the viewer and looking out towards the vast landscape. The background should be in the style of Caspar David Friedrich.",
"input_image": [
"https://hub.oxen.ai/api/repos/elau/assets/file/main/bloxy/bloxy_cropped_512x512.png"
],
"aspect_ratio": "1:1",
"resolution": "1 MP",
"num_inference_steps": 30,
"guidance": 2,
"output_format": "webp",
"output_quality": 80,
"disable_safety_checker": false
}' | jq -r '.generations[0].generation_id')
# Poll the single generation until it 404s (terminal state).
while curl -s -o /dev/null -w "%{http_code}" \
-H "Authorization: Bearer $OXEN_API_KEY" \
"https://hub.oxen.ai/api/ai/queue/$GEN_ID" | grep -q "^200$"; do
sleep 5
done
echo "Done. See the 'Async with SSE' tab to receive the result URL."
import os
import time
import requests
HEADERS = {
"Content-Type": "application/json",
"Authorization": f"Bearer {os.environ['OXEN_API_KEY']}",
}
enqueue = requests.post(
"https://hub.oxen.ai/api/ai/queue",
headers=HEADERS,
json={
"model": "flux-2-pro",
"prompt": "Wanderer above the Sea of Fog by Caspar David Friedrich, as the wanderer facing out towards the expanse. The character should be shown from behind, standing on the rocky peak, facing away from the viewer and looking out towards the vast landscape. The background should be in the style of Caspar David Friedrich.",
"input_image": [
"https://hub.oxen.ai/api/repos/elau/assets/file/main/bloxy/bloxy_cropped_512x512.png"
],
"aspect_ratio": "1:1",
"resolution": "1 MP",
"num_inference_steps": 30,
"guidance": 2,
"output_format": "webp",
"output_quality": 80,
"disable_safety_checker": false
},
)
enqueue.raise_for_status()
generation_id = enqueue.json()["generations"][0]["generation_id"]
while True:
resp = requests.get(
f"https://hub.oxen.ai/api/ai/queue/{generation_id}",
headers=HEADERS,
)
if resp.status_code == 404:
break
time.sleep(5)
print("Done. See the 'Async with SSE' tab to receive the result URL.")
See the async queue reference for more details.
- Minimal
- Basic parameters
- All parameters
# Enqueue, capture the generation id.
GEN_ID=$(curl -s -X POST https://hub.oxen.ai/api/ai/queue \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $OXEN_API_KEY" \
-d '{
"model": "flux-2-pro",
"prompt": "Wanderer above the Sea of Fog by Caspar David Friedrich, as the wanderer facing out towards the expanse. The character should be shown from behind, standing on the rocky peak, facing away from the viewer and looking out towards the vast landscape. The background should be in the style of Caspar David Friedrich."
}' | jq -r '.generations[0].generation_id')
# Stream the SSE channel, grab the data line that follows a
# media_generation_completed event for our id, and pretty-print it.
curl -sN -H "Authorization: Bearer $OXEN_API_KEY" https://hub.oxen.ai/api/events \
| awk -v id="$GEN_ID" '
/^event: media_generation_completed$/ { expect=1; next }
/^data: / && expect {
payload = substr($0, 7)
if (index(payload, "\"generation_id\":\"" id "\"")) { print payload; exit }
expect = 0
}
' | jq .
import json
import os
import requests
API_KEY = os.environ["OXEN_API_KEY"]
AUTH = {"Authorization": f"Bearer {API_KEY}"}
enqueue = requests.post(
"https://hub.oxen.ai/api/ai/queue",
headers={**AUTH, "Content-Type": "application/json"},
json={
"model": "flux-2-pro",
"prompt": "Wanderer above the Sea of Fog by Caspar David Friedrich, as the wanderer facing out towards the expanse. The character should be shown from behind, standing on the rocky peak, facing away from the viewer and looking out towards the vast landscape. The background should be in the style of Caspar David Friedrich."
},
)
enqueue.raise_for_status()
generation_id = enqueue.json()["generations"][0]["generation_id"]
with requests.get(
"https://hub.oxen.ai/api/events",
headers=AUTH,
stream=True,
) as stream:
event_name = None
for line in stream.iter_lines(decode_unicode=True):
if line.startswith("event: "):
event_name = line.removeprefix("event: ")
elif line.startswith("data: ") and event_name == "media_generation_completed":
payload = json.loads(line.removeprefix("data: "))
if payload.get("generation_id") == generation_id:
print(payload)
break
# Enqueue, capture the generation id.
GEN_ID=$(curl -s -X POST https://hub.oxen.ai/api/ai/queue \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $OXEN_API_KEY" \
-d '{
"model": "flux-2-pro",
"prompt": "Wanderer above the Sea of Fog by Caspar David Friedrich, as the wanderer facing out towards the expanse. The character should be shown from behind, standing on the rocky peak, facing away from the viewer and looking out towards the vast landscape. The background should be in the style of Caspar David Friedrich.",
"input_image": [
"https://hub.oxen.ai/api/repos/elau/assets/file/main/bloxy/bloxy_cropped_512x512.png"
]
}' | jq -r '.generations[0].generation_id')
# Stream the SSE channel, grab the data line that follows a
# media_generation_completed event for our id, and pretty-print it.
curl -sN -H "Authorization: Bearer $OXEN_API_KEY" https://hub.oxen.ai/api/events \
| awk -v id="$GEN_ID" '
/^event: media_generation_completed$/ { expect=1; next }
/^data: / && expect {
payload = substr($0, 7)
if (index(payload, "\"generation_id\":\"" id "\"")) { print payload; exit }
expect = 0
}
' | jq .
import json
import os
import requests
API_KEY = os.environ["OXEN_API_KEY"]
AUTH = {"Authorization": f"Bearer {API_KEY}"}
enqueue = requests.post(
"https://hub.oxen.ai/api/ai/queue",
headers={**AUTH, "Content-Type": "application/json"},
json={
"model": "flux-2-pro",
"prompt": "Wanderer above the Sea of Fog by Caspar David Friedrich, as the wanderer facing out towards the expanse. The character should be shown from behind, standing on the rocky peak, facing away from the viewer and looking out towards the vast landscape. The background should be in the style of Caspar David Friedrich.",
"input_image": [
"https://hub.oxen.ai/api/repos/elau/assets/file/main/bloxy/bloxy_cropped_512x512.png"
]
},
)
enqueue.raise_for_status()
generation_id = enqueue.json()["generations"][0]["generation_id"]
with requests.get(
"https://hub.oxen.ai/api/events",
headers=AUTH,
stream=True,
) as stream:
event_name = None
for line in stream.iter_lines(decode_unicode=True):
if line.startswith("event: "):
event_name = line.removeprefix("event: ")
elif line.startswith("data: ") and event_name == "media_generation_completed":
payload = json.loads(line.removeprefix("data: "))
if payload.get("generation_id") == generation_id:
print(payload)
break
# Enqueue, capture the generation id.
GEN_ID=$(curl -s -X POST https://hub.oxen.ai/api/ai/queue \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $OXEN_API_KEY" \
-d '{
"model": "flux-2-pro",
"prompt": "Wanderer above the Sea of Fog by Caspar David Friedrich, as the wanderer facing out towards the expanse. The character should be shown from behind, standing on the rocky peak, facing away from the viewer and looking out towards the vast landscape. The background should be in the style of Caspar David Friedrich.",
"input_image": [
"https://hub.oxen.ai/api/repos/elau/assets/file/main/bloxy/bloxy_cropped_512x512.png"
],
"aspect_ratio": "1:1",
"resolution": "1 MP",
"num_inference_steps": 30,
"guidance": 2,
"output_format": "webp",
"output_quality": 80,
"disable_safety_checker": false
}' | jq -r '.generations[0].generation_id')
# Stream the SSE channel, grab the data line that follows a
# media_generation_completed event for our id, and pretty-print it.
curl -sN -H "Authorization: Bearer $OXEN_API_KEY" https://hub.oxen.ai/api/events \
| awk -v id="$GEN_ID" '
/^event: media_generation_completed$/ { expect=1; next }
/^data: / && expect {
payload = substr($0, 7)
if (index(payload, "\"generation_id\":\"" id "\"")) { print payload; exit }
expect = 0
}
' | jq .
import json
import os
import requests
API_KEY = os.environ["OXEN_API_KEY"]
AUTH = {"Authorization": f"Bearer {API_KEY}"}
enqueue = requests.post(
"https://hub.oxen.ai/api/ai/queue",
headers={**AUTH, "Content-Type": "application/json"},
json={
"model": "flux-2-pro",
"prompt": "Wanderer above the Sea of Fog by Caspar David Friedrich, as the wanderer facing out towards the expanse. The character should be shown from behind, standing on the rocky peak, facing away from the viewer and looking out towards the vast landscape. The background should be in the style of Caspar David Friedrich.",
"input_image": [
"https://hub.oxen.ai/api/repos/elau/assets/file/main/bloxy/bloxy_cropped_512x512.png"
],
"aspect_ratio": "1:1",
"resolution": "1 MP",
"num_inference_steps": 30,
"guidance": 2,
"output_format": "webp",
"output_quality": 80,
"disable_safety_checker": false
},
)
enqueue.raise_for_status()
generation_id = enqueue.json()["generations"][0]["generation_id"]
with requests.get(
"https://hub.oxen.ai/api/events",
headers=AUTH,
stream=True,
) as stream:
event_name = None
for line in stream.iter_lines(decode_unicode=True):
if line.startswith("event: "):
event_name = line.removeprefix("event: ")
elif line.startswith("data: ") and event_name == "media_generation_completed":
payload = json.loads(line.removeprefix("data: "))
if payload.get("generation_id") == generation_id:
print(payload)
break
Fetch model details
The models endpoint returns the full model object, including itsjson_request_schema.
curl -H "Authorization: Bearer $OXEN_API_KEY" https://hub.oxen.ai/api/ai/models/flux-2-pro
Request parameters
Required parameters
| Field | Type | Default | Description |
|---|---|---|---|
prompt | string | "Wanderer above the Sea of Fog by Caspar David Friedrich, as the wanderer facing out towards the expanse. The character should be shown from behind, standing on the rocky peak, facing away from the viewer and looking out towards the vast landscape. The background should be in the style of Caspar David Friedrich." | Prompt for generated image |
Optional parameters
| Field | Type | Default | Description |
|---|---|---|---|
input_image | array<string> | — | Input images to transform or use as reference (supports multiple image urls) |
aspect_ratio | string | "1:1" | Aspect ratio for the generated image One of: 1:1, 16:9, 9:16, 4:3, 3:4, 3:2, 2:3, match_input_image. |
resolution | string | "1 MP" | Resolution for the generated image One of: 1 MP, 2 MP, 0.5 MP. |
num_inference_steps | integer | 30 | Number of denoising steps. Recommended range is 28-50, and lower number of steps produce lower quality outputs, faster. Range: 1 – 50. |
guidance | number | 2 | Guidance for generated image. Lower values can give more realistic images. Good values to try are 2, 2.5, 3 and 3.5 Range: 0 – 10. |
seed | integer | — | Random seed. Set for reproducible generation |
output_format | string | "webp" | Format of the output images One of: webp, jpg, png. |
output_quality | integer | 80 | Quality when saving the output images, from 0 to 100. 100 is best quality, 0 is lowest quality. Not relevant for .png outputs Range: 0 – 100. |
disable_safety_checker | boolean | false | Disable safety checker for generated images. |