Drex Max
Call Drex Max, the most accurate Drex model, with text or images, and the limits that differ from the other models.
Drex Max is a multimodal decision model and the most accurate Drex: it reads text and images. It takes the same request as every other model on POST /v1/systemone and returns the same answers. This page covers what differs: how to select it, its limits, and image inputs. For the request itself, see Questions and State.
Select Drex Max
Send drex-max as model. It is a pinned id: drex-latest does not point to it, and a request that omits model is answered by drex-v2.0. Authentication, rate limits and billing are the same as for every model. Drex Max costs $0.06 per million input tokens; output tokens are not billed.
curl https://console.nace.ai/v1/systemone \
-H "Authorization: Bearer $NACE_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "drex-max",
"state": "My parcel arrived with the box crushed and the lamp inside cracked. I want a new one.",
"questions": {
"damaged": { "type": "noul", "instructions": "Did the item arrive damaged?" },
"intent": {
"type": "choice",
"instructions": "What does the customer want?",
"criteria": { "refund": "Money back", "replace": "A new item", "info": "Information only" }
}
}
}'The response has the usual shape: model is drex-max, answers has one entry per question in request order, and usage, evaluation_time_ms and request_id are present. See Reading answers.
Limits
| Limit | Text only | With images |
|---|---|---|
| Questions per request | 16 | 16 |
Options per choice or levels per score question | 255 | 255 |
| Tokens per question (the state plus that question) | 262,144 | 262,144, image tokens included |
| Questions whose tokens (as above) are over 131,072, added together | 1,048,576 | 1,048,576, image tokens included |
| Serialized body | 4 MiB | 4 MiB, including inline images |
| Images per request | None | 8 |
Each question is evaluated against the same state, selected once for the request. Drex Max may shorten a long state before inference, and refuses a state beyond its selector's input limit; it never hands the request to another model. The token limits apply to the state the model reads plus each question in turn. Questions of 131,072 tokens or fewer never count toward the 1,048,576 total; longer ones share it. That total only decides whether the request is admitted: it does not guarantee an answer within Drex's evaluate timeout, so send fewer questions with very long states. Over a limit, the response is 422 invalid_request_error with a message that names it. When the model does not answer within the evaluate timeout, the response is 529 overloaded. The Limits page has the body limit, rate limits and timeouts every model shares.
Images
Drex Max is the only model that reads images. Add an images array to the request. Every question sees the same images, in array order, before the state and the questions. Refer to them as "Image 1", "Image 2" and so on in the state or the instructions. Those words stay plain text: Drex inserts nothing where they appear, and the model matches them to the images by their order in the array. A URL in the request is text too; Drex never fetches it.
Each images entry is either an uploaded file or the image's bytes inline. You can mix the two in one request. Keep images out of state and questions: media placed there returns 422.
Uploaded files
Upload the image with the direct upload flow, leaving out workspace_id so it goes to your account's Perception workspace. Wait for the upload job to succeed, then name the file with the workspace_id and file_id it returns:
{
"model": "drex-max",
"state": "Inspect Image 1.",
"images": [
{ "type": "workspace_file", "workspace_id": "YOUR_WORKSPACE_ID", "file_id": "YOUR_FILE_ID" }
],
"questions": {
"receipt": { "type": "noul", "instructions": "Is Image 1 a purchase receipt?" }
}
}The file must be in the Perception workspace of the account that owns your API key. A file in one of your Workspaces, or in another account's workspace, returns 422. Uploaded files keep the request small, so use them for anything but small images. Uploads are free, and the file stays in the workspace under its retention policy after the request.
Inline images
An entry can instead be a standard base64 string or a data URL such as data:image/jpeg;base64,...:
{
"model": "drex-max",
"state": "Inspect Image 1.",
"images": ["data:image/jpeg;base64,/9j/4AAQSkZJRgABAQ..."],
"questions": {
"receipt": { "type": "noul", "instructions": "Is Image 1 a purchase receipt?" }
}
}Inline images count toward the 4 MiB body limit, base64 expansion included, so a request holds about 3 MiB of inline image bytes in all. Upload larger images, or downscale them before you send them.
Image limits
| Limit | Value |
|---|---|
| Formats | Still PNG, JPEG or WebP |
| Images per request | 8 |
| Bytes per image | 16 MiB |
| Bytes for all images in a request | 32 MiB |
| Input pixels per image | 40 million |
| Request body, inline images included | 4 MiB |
Drex fetches and checks uploaded files before it calls the model, within 20 seconds per request.
Drex Max resizes each image to at most 1,638,400 pixels (the area of 1,280 × 1,280), so detail past that is not kept. Each image counts up to 1,602 tokens in every question, on top of the state and that question, and those tokens count toward the token limits above. A long state with several images and many questions can therefore be refused with a 422 even when each question fits on its own; send fewer questions per request.
An image that is invalid, corrupt, too large, in another format, or a file you can't use returns 422 with path images.<index>. Images sent to any other model return 422 with path images and the message images require drex-max. When image storage or image inference is briefly unavailable, or fetching the images takes longer than 20 seconds, the response is 529 overloaded; retry it. A request that fails is not billed. Errors lists every image message.
Image usage
Responses to image requests can include usage.image_tokens, the tokens the images took. They are already included in usage.input_tokens, which is what you are billed for.