Drex
Ask questions
nace decide --state "I was charged twice for my March invoice." \
--noul "wants_refund=Is the customer asking for a refund?" \
--choice "topic=billing,shipping,other: Which topic is it?" \
--score "urgency=low,medium,high: How urgent is it?"Stdout gets one line per answer, and stderr gets the model, the input tokens, the model's time and the request_id:
wants_refund noul 0.930
topic choice billing (confidence 0.880)
urgency score 1.400 on low < medium < high (confidence 0.500)drex-v1.5 · 61 input tokens · 143 ms · req_...| Flag | What it does |
|---|---|
--state STATE | The state: text, @FILE, or - for stdin. Text that starts with { or [ and parses as JSON is sent as JSON; anything else as a string. Required unless --body has one. |
--noul NAME=INSTRUCTIONS | A yes/no question. Repeatable. |
--choice NAME=A,B,C[: INSTRUCTIONS] | A pick-one question: labels before the first colon, separated by commas, then instructions. Repeatable. |
--score NAME=LOW,...,HIGH[: INSTRUCTIONS] | An ordered-levels question, levels from low to high. Repeatable. |
--questions JSON | A questions object, name to question: inline JSON, @FILE, a path, or -. |
--body JSON | A whole request body: inline JSON, @FILE, a path, or -. |
--image IMAGE | An image for Drex Max: a local PNG, JPEG or WebP file, or ws:<workspace_id>/<file_id> for a file you already uploaded (ids, not a path). Repeatable, up to 8. See Images. |
-m, --model MODEL | The model id. Default: --body's model, else drex-max with --image, else $NACE_DEFAULT_DECISION_MODEL, else drex-latest. See nace models. |
--json | Print the response body as Drex sent it, request_id included, instead of the lines above. |
At least one question is required. Questions merge by name: --body's questions first, then --questions, then each shorthand flag, so a later question replaces an earlier one with the same name. --state and -m replace --body's state and model, and --image replaces its images; its other fields are sent as given.
The shorthand labels can't contain , or : and carry no descriptions. For label descriptions or noul criteria, use --questions:
{
"wants_refund": {
"type": "noul",
"instructions": "Is the customer asking for a refund?",
"criteria": { "true": "The customer asks for money back", "false": "Anything else" }
},
"topic": {
"type": "choice",
"instructions": "Which topic is it?",
"criteria": { "billing": "Payments, invoices or charges", "shipping": "Delivery and tracking", "other": null }
}
}nace decide --state @ticket.txt --questions questions.json --jsonSee Questions for what each type accepts and Reading answers for the response.
Images
Drex Max is the only model that reads images. Pass each with --image, in the order the state and questions refer to them as "Image 1", "Image 2" and so on:
nace decide --image receipt.jpg --image logo.png \
--state "Image 1 is a scanned receipt. Image 2 is the shop's logo." \
--noul "same_shop=Was the receipt in Image 1 issued by the shop whose logo is Image 2?"A local file of 256 KiB or less is sent inline, base64 in the request body. A larger one is first uploaded under drex-max-images/, named by its content so the same image isn't stored twice, and sent as a file reference; stderr says uploaded ws:<workspace_id>/<file_id>, which you can pass to --image next time. ws:<workspace_id>/<file_id> names a file you already uploaded by its ids, such as the source nace upload prints (without --workspace); a file in one of your Workspaces returns 422. Anything that isn't a PNG, JPEG or WebP file, or more than 8 images, is refused before anything is uploaded or sent.
With --image and no model named, nace decide uses drex-max; any other model returns 422. Images are at most 16 MiB each and 32 MiB in all. Their tokens are already in the input tokens, and stderr shows them too:
drex-max · 1873 input tokens (1536 image) · 2210 ms · req_...