Reviewer Blueprints¶
Aligning your reviewers is the single biggest lever for review throughput and accuracy. This page is a set of practical recipes for shaping model_input and model_output so that the Tuor review workspace renders intuitively — even for non-technical reviewers.
Most of these recipes are about putting your data in the keys the review workspace expects. Get the keys right and the rendering is automatic.
Reviewer context mapping¶
Reviewers need to see what your model saw alongside what your model produced. The Tuor review workspace layout is driven by the project's input_type.
Text input (input_type: "text")¶
Use a free-form text input field for any prompt-only model. The review workspace renders these keys, if present:
Key in model_input |
What it does |
|---|---|
content |
Rendered as the prominent, full-width text block — the main reading panel. |
system_prompt |
Rendered in a collapsible panel above the content, styled to indicate "instructions to the model". |
// POST /v1/traces/ — model_input
{
"system_prompt": "You are a financial assistant. Always return JSON.",
"content": "Extract the net income from the attached statement..."
}
Any additional keys are still shown (as a structured tree below the main panel) but are not given the prominent layout.
Document input (input_type: "pdf")¶
Reviewers compare the extraction form against the original document side-by-side. Configure the project's input_type to pdf and provide:
Key in model_input |
What it does |
|---|---|
pdf_base64 |
Base64-encoded PDF bytes. Rendered in a scrollable PDF viewer. |
filename |
Optional. Displayed in the viewer chrome. |
// POST /v1/traces/ — model_input
{
"pdf_base64": "JVBERi0xLjQKJ...",
"filename": "acme-invoice-2026-05-15.pdf"
}
Note the 5 MB per-field cap — for very large PDFs, downsample or paginate before ingest.
Image input (input_type: "image")¶
For image-grounded tasks (receipts, screenshots, ID documents, charts):
Key in model_input |
What it does |
|---|---|
image_base64 |
Base64-encoded image bytes. Rendered in an image viewer. |
media_type |
MIME type (e.g. image/png). Used as the data: URI type. |
filename |
Optional. Displayed in the viewer chrome. |
// POST /v1/traces/ — model_input
{
"image_base64": "iVBORw0KGgoAAAANS...",
"media_type": "image/png",
"filename": "receipt-2026-05-15.png"
}
Task-specific schema blueprints¶
The shape of model_output determines which editor reviewers get. Match your output payload to the project's output_type and the editor is automatic.
Structured extraction (output_type: "key_value")¶
Best for contracts, invoices, receipts, forms — anything where the model produces a flat dictionary of fields. The reviewer sees a clean spreadsheet-style table where they can edit values, add missing keys, or remove spurious ones.
// POST /v1/traces/ — model_output
{
"vendor_name": "Acme Corp",
"invoice_date": "2026-05-15",
"total_amount": 1250.45,
"tax_id": "12-345678"
}
Keep it flat. Nested objects render as nested tables, which slow reviewers down. If your model produces nested data (e.g. line items), put the per-line-item details in a separate trace, or in
trace_configas reference metadata.
Multi-class classification (output_type: "classification")¶
Best for routing, triage, and labeling tasks. The reviewer sees the model's selected label prominently, plus the valid alternatives for quick correction.
Key in model_output |
What it does |
|---|---|
label |
The model's predicted label. Pre-selected in the dropdown. |
alternatives |
The full set of valid labels (including label itself). |
// POST /v1/traces/ — model_output
{
"label": "billing_dispute",
"alternatives": [
"billing_dispute",
"cancellation_request",
"technical_support",
"account_settings"
]
}
alternatives must be a flat array of strings. If you don't have a closed set of labels, leave alternatives empty and reviewers can type a freeform value.
Generative copy / summarization (output_type: "text")¶
Best for long-form text outputs: summaries, copywriting, translations, rewrites. The reviewer sees an editable text panel with live word and character counts and diff highlighting against the original.
Key in model_output |
What it does |
|---|---|
content |
The long-form text. Rendered in a wide, vertically-scrolling editor. |
// POST /v1/traces/ — model_output
{
"content": "The customer requested a refund due to a defective software module. The refund was processed successfully under policy guideline A-12."
}
Reviewer ergonomics¶
A few patterns that keep reviewers fast:
- Always provide
model_input.contentfor text-heavy tasks. Avoid burying the prompt in a deeply-nested object. - Stamp
modelandprompt_version_idintrace_config. They're displayed inline in the reviewer's trace metadata strip and are echoed in webhooks for traceback. - Keep
model_outputshapes stable per project. Reviewers build muscle memory for where each field is. Shape drift across traces in the same project slows them down significantly. - Use tags to specialize trace lists. If you have heterogeneous traffic (e.g. PDFs for finance reviewers, contracts for legal), tag accordingly and have each reviewer filter to their domain.
Putting it all together: a worked example¶
Suppose you're building an invoice extraction pipeline. Each model call ingests a PDF, runs gpt-4o, and emits a flat dictionary of extracted fields.
Project config
| Setting | Value |
|---|---|
input_type |
pdf |
output_type |
key_value |
webhook_url |
https://hooks.example.com/tuor/invoices |
webhook_active |
true |
Ingest call
curl -X POST "https://api.tuor.dev/v1/traces/" \
-H "X-API-Key: $TUOR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"project_id": "proj_invoices",
"model_input": {
"pdf_base64": "JVBERi0xLjQK...",
"filename": "acme-invoice-2026-05-15.pdf"
},
"model_output": {
"vendor_name": "Acme Corp",
"invoice_date": "2026-05-15",
"total_amount": 1250.45,
"tax_id": "12-345678"
},
"trace_config": {
"model": "gpt-4o",
"prompt_version_id": "prm_abc123",
"internal_run_id": "run_01j2abcde"
}
}'
Reviewer experience
- Left pane: the original PDF, scrollable.
- Right pane: a four-row spreadsheet they can edit field-by-field.
- Metadata:
gpt-4o, prompt versionprm_abc123, run IDrun_01j2abcde. - Actions: approve, reject, or edit the output and submit the correction.
Webhook on correction
Your /tuor/invoices endpoint receives a signed review.corrected event; you read trace.trace_config.internal_run_id and update the corresponding row in your database with the corrected fields.
That's the full loop.