Skip to content

d3

POST /v1/systemone model: d3

d3 is the 27B model of Decision 3.0, the decision models of vLLM Semantic Router, trained from Qwen3.8-27B. It reads text, JSON, images and videos. d3-flash is its 9B sibling with the same API: faster, and a little less accurate.

EndpointPOST /v1/systemone
Inputa state (text or any JSON), plus optional images and videos
Outputone answer per question, with a probability for every option
Question typeschoice, noul, score
Input limit32,768 tokens per question; longer requests are refused, not truncated
Streaming❌
Billingper input token, reported as usage.input_tokens; output_tokens is always 0
Stabilityexperimental
LicenseApache-2.0
Field
modelrequiredd3
staterequiredthe situation to decide about: a string, or any JSON value
questionsrequiredan object mapping your own question names to questions, at least one
imagesoptionalan array of images as data: URL strings (PNG, JPEG or WebP)
videosoptionalan array of videos as data: URL strings (MP4, WebM, QuickTime or Matroska)

Every question sees all the images and videos of the request. The model card gives the budgets it reads them with: each image at up to 1.6 megapixels, and each video at 2 frames per second, at most 32 frames of up to 0.2 megapixels. The whole request body must stay under 5 MB.

The prompt around your input is fixed, so a top-level instructions field is refused with a 400.

typecriteriaAnswer
choicean object of options, {"name": "what this option means", …}choice, probabilities per option, and confidence, the chosen option’s probability
noulnone; put the question in instructionsnoul, the probability of yes; probabilities for yes and no; confidence
scorean ordered array of levels, lowest firstscore (the expected level, counting from 0), legend, probabilities per level, and confidence, the most likely level’s probability

Every question carries instructions, the question itself in plain words.

{
"id": "decision-aa4a76300e0af8f5",
"object": "structured_decision",
"created": 1792166448,
"model": "d3",
"answers": {
"team": {
"type": "choice",
"choice": "auth",
"probabilities": { "auth": 0.9993, "billing": 0.0000, "other": 0.0006 },
"confidence": 0.9993
},
"urgent": {
"type": "noul",
"noul": 0.9967,
"probabilities": { "yes": 0.9967, "no": 0.0033 },
"confidence": 0.9967
},
"severity": {
"type": "score",
"score": 1.8641,
"legend": { "0": "Low", "1": "Medium", "2": "High" },
"probabilities": { "0": 0.0034, "1": 0.1292, "2": 0.8674 },
"confidence": 0.8674
}
},
"usage": { "input_tokens": 352, "output_tokens": 0 },
"diagnostics": {
"team": { "label_mass": 1.0, "argmax_is_label": true },
"urgent": { "label_mass": 1.0, "argmax_is_label": true },
"severity": { "label_mass": 1.0, "argmax_is_label": true }
}
}

diagnostics reports, per question, the share of probability that fell on the question’s answer labels (label_mass) and whether the single most likely code was one of them (argmax_is_label).

Use the probabilities rather than only the top answer: a noul of 0.55 and one of 0.99 are both “yes”, but only one of them is safe to act on automatically.

Errors use the usual {"error": { … }} shape:

StatusExample message
400unknown question type 'bogus'; supported: ['choice', 'noul', 'score']
400question 'q': the prompt has 33356 tokens, more than max_model_len=32768; nothing is truncated
400this model reads a fixed prompt, so it takes no instructions
401the API key is missing or wrong
Terminal window
curl https://developer.amd.com.cn/radeon/api/v1/systemone \
-H "Authorization: Bearer $RADEON_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "d3",
"state": {"ticket": "Customer cannot log in after resetting the password; error 403 on every attempt."},
"questions": {
"team": {"type": "choice", "instructions": "Which team should handle this?",
"criteria": {"auth": "Identity and login", "billing": "Payments and invoices", "other": "Anything else"}},
"urgent": {"type": "noul", "instructions": "Is the customer blocked from using the product?"},
"severity": {"type": "score", "instructions": "How severe is this?", "criteria": ["Low", "Medium", "High"]}
}
}'

With a video:

import base64, requests
clip = base64.b64encode(open("clip.mp4", "rb").read()).decode()
r = requests.post(
"https://developer.amd.com.cn/radeon/api/v1/systemone",
headers={"Authorization": f"Bearer {API_KEY}"},
json={
"model": "d3",
"state": "Watch the clip.",
"videos": [f"data:video/mp4;base64,{clip}"],
"questions": {
"direction": {"type": "choice", "instructions": "Which way does the ball move?",
"criteria": {"left_to_right": "Left to right", "right_to_left": "Right to left"}},
},
},
timeout=120,
)
print(r.json()["answers"]["direction"])