felix

Get Training Job

Get a training job by ID if it is visible to the caller's team.

Read visibility matches the other training-jobs/{job_id} read routes that already use _get_visible_job (logs, checkpoints, download): a job on a team-visible project, or a project-less shared job, is returned even when the caller is not the creator. Mutating routes keep their own owner-scoped service calls.

get/felix/training-jobs/{job_id}

Path parameters

job_idstring required

Response

Successful Response

idstring required
user_idstring required
project_idstring nullable

Project ID this training job is associated with

experiment_idstring nullable

Experiment whose agent trained this adapter, when one did. A composite foreign key pins it to the same project as project_id, so it is never an Experiment from elsewhere. Null for a job dispatched outside an Experiment -- a direct API call, or a job predating the column -- which means the owning Experiment is unknown, not that there is none. Adapter-scoped UI hand-offs read this to open the thread that produced the adapter instead of whichever of the project's Experiments happens to be the most recently active (ENG-7287).

model_namestring nullable
base_modelstring required
validation_data_percentagenumber required
nr_epochsinteger required
learning_ratenumber required
batch_sizeinteger required
seedinteger nullable

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 (ENG-6970): its seed is unknown, not reconstructed from the default the migration backfilled. 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. It does not make runs bit-identical: GPU reduction order stays non-deterministic (cuBLAS GEMM split-k and, unless the embedding-backward scatter/index_add path below applies), 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) and enables torch.use_deterministic_algorithms in warn-only mode -- 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. The deterministic-algorithms half is not a no-op: it makes embedding-backward scatter/index_add deterministic on CUDA, narrowing -- but, since CUBLAS_WORKSPACE_CONFIG is not set, not closing -- the GPU-reduction-order gap above. It never raises instead of running (warn-only), so it is safe to always leave on, but for the same reason it does not guarantee bit-identical runs.

resolved_recipeobject nullable

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.

trained_model_pathstring nullable
hub_model_idstring nullable

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.

hub_model_privateboolean nullable

Whether the pushed Hub repo is private, as recorded at push time. Null for a job that has never been pushed, and for a push recorded before this field existed (ENG-6761) -- this means the visibility was not recorded, not that either visibility applies. The request schema (HuggingFacePushModelRequest.private) defaults to True, but the only real caller (the CLI) always sends it explicitly, so that default is unreachable in practice -- null here means the visibility was never recorded, not that a caller omitted it. Render null as a neutral 'pushed, visibility unknown' state rather than assuming either PUBLISHED or PRIVATE.

job_referencestring nullable
instance_typestring nullable
statusstring required
normalized_statusstring nullable

Canonical status alias for compatibility handling (requested, running, complete, deployed, failed, cancelled)

is_terminal_statusboolean nullable

Whether this status is terminal for polling loops

error_messagestring nullable
created_atstring required
updated_atstring required
started_atstring nullable
completed_atstring nullable
model_auto_selectedboolean nullable
model_selection_reasonstring nullable
task_typestring nullable

Task type derived from training datasets: 'ner', 'classification', 'custom', or 'decoder'

training_typestring nullable

Raw training method as persisted: 'lora', 'qlora', or 'full'.

model_kind'lora' | 'full' nullable

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.

artifact_readyboolean nullable

Whether an artifact location is recorded, so there is something to serve.

provider_readyboolean nullable

Whether a provider is already serving this artifact. False is not a deployment blocker: promotion provisions or re-warms a provider.

is_deployableboolean nullable

Whether this job passes server-side deployability validation for its own project. Authoritative -- the same check the deployment endpoints enforce.

deployability_reasonstring nullable

Why the job is not deployable (e.g. 'job_incomplete', 'missing_artifact', 'provider_incompatible'). Null when deployable.

labelsstring[] nullable

Merged labels from training datasets (entity types for NER, class labels for classification)

examplestring nullable

Sample text to pre-load into inference input

metricsobject nullable

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.

version_numberstring nullable

Version number for this training job (e.g., '1', '2', '3')

root_job_idstring nullable

ID of the original/root training job this version derives from

provider_deploymentsobject nullable

Provider-specific deployment metadata written by the training monitor, keyed by provider: {"modal": {...}}.

provider_namestring nullable

Training provider that handled this job (e.g. 'modal'). Jobs predating a provider removal carry an 'archived_<provider>' label.

progress_percentinteger nullable

Overall training completion percentage (0-100). Updated live during training.

current_epochinteger nullable

Epoch currently in progress (1-indexed). Updated live during training.

deployment_statusstring nullable required

Deprecated. Always returns None -- deployment_status no longer exists.

Kept for backward compat with clients that read this field.

Changes