Every plan can build and export. Hosted fine-tuning starts on Core, so on Free you export and train elsewhere. Pricing has the monthly row and launch limits.
What a row is made of
A row is assembled from a trace’s LLM calls: the messages sent to the model and what came back. A trace with no LLM call adds nothing, however many spans it recorded. A framework integration captures those calls for you. If you log by hand:
A
tool message appears only when the LLM call itself reports tool calls. Framework integrations record that, and a manual log_llm_call can’t.
Building Datasets
From the Dashboard
1
Open the form
On Datasets, click + New Dataset.
2
Name it and choose a type
Give it a Dataset Name and a Dataset Type: Fine-tuning (SFT), Evaluation, Preference or Evergreen. The type says what the dataset is for. A build writes the same chat rows for all four.
3
Choose the agent and manifest
Choose the Target Agent. Target Manifest then appears, set to the active version, with each version’s trace count. A bar shows how many traces are keep, repair, replay and drop. If it’s empty, Compute compatibility fills it in.
4
Build
Click Create & Build. Version 1 is built and the dataset opens. With no manifest selected the button reads Create & Configure, and you get an empty dataset to build later.
keep or repair, and only the LLM calls made by that manifest’s agent. There is no quality filter in this dialog.
keep goes in as recorded. repair goes in with its repaired tool calls if a repair toward this manifest has run, and as recorded if not. replay and drop stay out.
Build another version
The dataset’s page has a Build new version form. Each build adds a numbered version.- Agent appears only when the dataset has no target agent.
- Version is a manifest, or All versions, which builds from every version.
- Min Eval Score keeps traces scoring at least this, from 0 to 1. A trace with no score is left out.
From selected traces
On an agent’s Traces page, tick the traces you want and click New Dataset in the bar that appears. It creates a dataset and builds it from exactly those traces.From the API
Filtering
The build body takes:
An empty body uses the dataset’s own manifest, then its target agent. With neither, it reads every LLM call in your organization and ignores the two quality filters.
decimalai datasets build --verdict sends a key this route doesn’t read, so it builds unfiltered. Use allowed_verdicts instead.
If a build comes back empty
A build with no rows still returns HTTP 200, with"status": "failed" and "row_count": 0. It leaves a failed version as a record, and the current version stays where it was. Check these in order:
- The traces have no LLM calls. Open one and look at LLM calls in the strip at the top. If it’s 0, the integration never captured a model call: see the silent no-ops.
- The agent name doesn’t match.
support-agent,Support Agentand[Demo] support-agentare three different agents. - A quality filter reads a score nothing wrote. See the warning above.
- The target is a handoff target on the OpenAI Agents SDK. Those calls are filed under the root agent. See What Gets Captured.
SFT Format
SFT (supervised fine-tuning) teaches the model to produce the assistant turns. By default one trace becomes one row, a whole conversation in the chat format fine-tuning APIs expect:systemandusercome from the trace’s first LLM call. Each call then adds anassistantturn.tooltakes its content from the matching tool span, or(no result captured)if there is none.toolscomes from the manifest, on versions built with one. A manifest that knows only a tool’s name gives an incomplete definition, so drop this key if your trainer validates it.
train, val or test at 80/10/10, which Quality reports. The JSONL has no split field and a hosted job trains on every row, so make your own split if you need a held-out set.
A row holding calls from more than one agent carries handoff markers.
DPO Format
DPO (direct preference optimization) trains on pairs: a preferred answer and a worse one for the same prompt. Pairs come from a completed replay batch, not from a build:chosen, at 0.4 or below the original is, and in between the pair is skipped. score_threshold (default 0.1) sets that gap. metadata also names both traces and the batch.
Download them with Export DPO Pairs on a completed batch, or from GET /api/v1/replay/batches/{batch_id}/export-dpo.
Dataset Versioning
Pick a version on the dataset’s page, and its rows open under SFT rows preview. Each row expands to its messages, with View raw JSON. Beside the version:- Quality shows rows, messages per row, tool calls, and the eval score, split and verdict breakdowns.
- ↓ JSONL downloads it.
- Fine-Tune opens the training panel.
Export
Download from the dashboard, or with the SDK:version= takes "latest" (the default: the newest build with rows), "v3" or a full UUID.
The REST route is GET /api/v1/datasets/{id}/versions/{version_id}/export?format=jsonl. Commands are on the CLI page, and parameters on the SDK page.
HuggingFace Hub Integration
A pushed dataset works with Axolotl, Unsloth, TRL and anything else that readsload_dataset(). It needs pip install huggingface_hub datasets.
private=False, and the token comes from token= or HF_TOKEN. Load it with load_dataset("my-org/support-agent-sft"), or point Axolotl at it:
decimalai.load_hf_dataset("ds_abc123") returns a datasets.Dataset in memory.
Fine-Tuning
A hosted job uploads a version’s rows to your provider, under your own account, and starts a fine-tune there.Supported Providers
Add a key under Settings → Provider keys (BYOK): Configure, then Save Credentials. An organization owner or admin can do this.Launching a Job
1
Open the panel
On the dataset’s page, select a version, click Fine-Tune, then + Launch Job.
2
Fill in the dialog
Choose the Provider, type the Base Model and set Epochs (default 3). The model field is free text and starts on an OpenAI model, so retype it when you switch provider.
3
Launch
Click Launch.
uploading and training to succeeded, failed or cancelled. The panel refreshes every 15 seconds while it’s open, and a slower background check covers the rest. A finished job shows the model’s ID with Copy, a failed one the provider’s error, and a running one Cancel, along with any metrics your provider reports.
From the API, POST /api/v1/training/jobs takes dataset_id, dataset_version_id, provider, base_model and optional hyperparameters, such as {"n_epochs": 3}. GET /api/v1/training/jobs/{id} reads a job, and POST to /poll or /cancel on that path checks or stops it.
A launch counts against your plan once it succeeds, and over the limit you get a 429. An organization can run five jobs at once.
Deploy and iterate
Point your agent at the fine-tuned model. The model is part of the manifest, so the next run registers a new manifest version. Compute compatibility on that version to see which older traces still fit, then build the next dataset against it. Replay regenerates the ones that don’t.Next Steps
Evaluations
Set up the evaluators that quality filters read.
SDK reference
pull_dataset, push_to_hub and load_hf_dataset.