Sync Training Job Status
Changed onSync training job status from the provider to the database.
Request
- Base URLhttps://api.fastino.ai
- Auth
- API key in header X-API-Key
- or HTTP bearer
- TypeScriptA function with typed inputs. Its response is checked against the schema.
Path parameters
Response
Successful Response
Whether an artifact location is recorded, so there is something to serve.
The catalog base model the adapter was trained on (for an interactive_checkpoint model, the base of the interactive job it came from).
Training batch size. Null for an interactive_checkpoint model.
Epoch currently in progress (1-indexed). Updated live during training.
Why the job is not deployable (e.g. 'job_incomplete', 'missing_artifact', 'provider_incompatible', 'adapter_inference_unavailable'). Null when deployable.
Deprecated. Always returns None -- deployment_status no longer exists.
Kept for backward compat with clients that read this field.
Sample text to pre-load into inference input
Experiment associated with this training job, when available. Null means no associated experiment was recorded.
HuggingFace repo id (e.g. 'username/model-name') set only after a successful push_training_job_to_hub call. This is the sole source of truth for whether a checkpoint has been pushed to the Hub -- it does not mean the repo is reachable by anyone other than the pusher: see hub_model_private for that. trained_model_path is an internal storage key and must never be parsed to infer a Hub repo id.
Whether the pushed Hub repository is private, as recorded at push time. Null means the job was not pushed or its repository visibility was not recorded.
Whether this job passes server-side deployability validation for its own project. Authoritative -- the same check the deployment endpoints enforce.
Whether this status is terminal for polling loops
Merged labels from training datasets (entity types for NER, class labels for classification)
Learning rate. Null for an interactive_checkpoint model.
Training and evaluation metrics dictionary. Contains final_training_loss, final_validation_loss, best_validation_loss from training logs, and optional evaluation metrics (f1_score, precision_score, recall_score, accuracy) if an evaluation has been run.
Normalized fine-tune kind: 'lora' for adapters (lora/qlora) or 'full' for merged weights. Null when the persisted training type is unrecognised -- clients must not claim a kind in that case.
Canonical status alias for compatibility handling (requested, running, complete, deployed, failed, cancelled)
Training epochs. Null for an interactive_checkpoint model.
Overall training completion percentage (0-100). Updated live during training.
Project ID this training job is associated with
Provider-specific deployment metadata written by the training monitor, keyed by provider: {"modal": {...}}.
Training provider that handled this job (e.g. 'modal'). Jobs predating a provider removal carry an 'archived_<provider>' label.
Whether a provider is already serving this artifact. False is not a deployment blocker: promotion provisions or re-warms a provider.
Immutable snapshot of what this job actually trained with, taken at dispatch: LoRA rank/alpha/dropout, learning rate, warmup ratio, gradient accumulation, packing, precision, attention backend, reasoning parser, container image, runtime profile, max sequence length, and seed, for every seed-capable provider/model. Null for jobs dispatched before the snapshot existed, and for providers that resolve no catalog recipe -- except Modal encoder and Modal RL strategies, which have no dense-LoRA catalog recipe but still return a non-null (seed) snapshot, since seed has no other persisted column. Read this rather than re-deriving from the catalog: the catalog reports what a job dispatched today would get, which is a different question.
ID of the original/root training job this version derives from
Effective reproducibility seed for Modal decoder or GLiNER2 (encoder) training. Null for Fireworks, unknown, and other providers/architectures that cannot honor this contract, and also null for a legacy Modal decoder/encoder job created before seed provenance was recorded, because its seed is unknown, and for an interactive_checkpoint model, which this job did not train. A non-null value is always a genuinely recorded seed. Decoder contract: A pinned seed governs LoRA initialisation and the trainer's own RNG (dataloader shuffle order and dropout). It does not select the train/validation split: that partition uses a dedicated split seed so two runs that differ only in seed are scored on the same held-out rows. It does not make runs bit-identical: GPU reduction order stays non-deterministic, so metrics can differ between otherwise identical runs. Across six observed same-config decoder pairs, final validation loss agreed to within 6.8% relative and two pairs agreed exactly. Treat that as an observed envelope from production history, not a guaranteed bound. Encoder contract: A pinned seed governs dataset shuffle and auto-sizing downsample order, and the trainer's own weight-initialisation and dropout RNG. It does not select the train/validation split on a Brain-dispatched run: that partition is a fixed left-to-right split derived from validation_data_percentage (validation is the tail), independent of seed, so two runs that differ only in seed are scored on the same held-out rows. Runs are seeded but not bit-identical: GPU reduction order stays non-deterministic (cuBLAS GEMM split-k, and the embedding-backward scatter_add/index_add path, which is not forced deterministic), so metrics can still differ between identically-configured runs. Before encoder seed control existed, three identically-configured launches measured classification macro-F1 ranging 0.38–0.63 — treat pinning a seed as removing one real, measured source of that noise, not as a guaranteed bound on the rest. Every GLiNER2 job unconditionally pins cuDNN's own algorithm selection (the same flags GLiNER2's bundled Trainer sets) -- this is a fixed container default, not a per-request knob. The cuDNN pin currently costs nothing and changes nothing on this backbone: cuDNN governs convolution/pooling/RNN kernels, and this encoder's DeBERTa-v2 backbone has none, so pinning it has nothing to pin there; the throughput trade-off only materializes if a future backbone adds conv/pooling/RNN layers. torch deterministic algorithms are not enabled: they would roughly halve training throughput without making runs bit-identical.
How the model came to exist: config_training for a job Fastino trained from data and a config, interactive_checkpoint for a sampler checkpoint of an interactive job served as a model (POST /v1/training/jobs/{job_id}/checkpoints/sampler_weights/{name}/deploy). An interactive_checkpoint model ran no training of its own, so it lists no datasets and its training settings are null.
Task type derived from training datasets: 'ner', 'classification', 'custom', or 'decoder'
Raw training method as persisted: 'lora', 'qlora', or 'full'.
A config training job (you give data and a config, Fastino runs the loop). /v1/trained-models also lists interactive jobs (type: interactive).
Share of the data held out for validation (0-1). Null for an interactive_checkpoint model.
Version number for this training job (e.g., '1', '2', '3')
Changes
- breaking
response property
batch_sizelist-of-types was widened by adding typesnullto media typeapplication/jsonof response200 - breaking
response property
learning_ratelist-of-types was widened by adding typesnullto media typeapplication/jsonof response200 - breaking
response property
nr_epochslist-of-types was widened by adding typesnullto media typeapplication/jsonof response200 - breaking
response property
validation_data_percentagelist-of-types was widened by adding typesnullto media typeapplication/jsonof response200 - info
added the optional property
to the response with the status
- breaking
- info
endpoint added
- info