---
title: "Grouped training-job + evals + base-model-eval for a project"
method: GET
path: "/projects/{project_id}/improvement-timeseries"
tags: ["projects"]
---

# Grouped training-job + evals + base-model-eval for a project

`GET /projects/{project_id}/improvement-timeseries`

Return training jobs grouped with their evaluations for the quality chart.

Includes the latest completed base-model evaluation so the frontend
can pin it as the leftmost point on the improvement curve.

Args:
    project_id: Project UUID.
    auth: Authentication result.

Returns:
    ImprovementTimeseriesResponse with adapters ordered newest first.

Raises:
    HTTPException 403: User lacks access to the project.
    HTTPException 404: Project not found or deleted.

## Path parameters

- `project_id` string, uuid, required

## Response `200`

Successful Response

- ImprovementTimeseriesResponse — Grouped training-job + evals + base-model-eval for a project. The ``adapters`` list is ordered by training-job creation date descending (newest first). Re-sorting for display (e.g. ascending by score) is handled on the frontend. Attributes: base_model_id: The shared base-model string used by adapters in this project (e.g. ``"base:Qwen/Qwen3-8B"``). None when the project has no training jobs yet. base_model_eval: Latest completed evaluation against the base model. None when no base-model evaluation exists. adapters: Training jobs with their evaluations, newest first.
  - `base_model_id` string, nullable
  - `base_model_eval` EvaluationResponse — Response for a single evaluation
    - `id` string, required
    - `user_id` string, required
    - `project_id` string, nullable
    - `model_id` string, required
    - `dataset_name` string, required
    - `dataset_version` string, required
    - `model_name` string, nullable
    - `f1_score` number, nullable
    - `precision_score` number, nullable
    - `recall_score` number, nullable
    - `accuracy` number, nullable
    - `validation_loss` number, nullable
    - `subset_accuracy` number, nullable
    - `hamming_loss` number, nullable
    - `bleu_score` number, nullable
    - `rouge_l_score` number, nullable
    - `total_tokens` integer, nullable
    - `total_cost_usd` number, nullable
    - `total_latency_ms` integer, nullable
    - `max_examples` integer, nullable
    - `max_tokens` integer, nullable
    - `seed` integer, nullable
    - `config` object, nullable
    - `status` string, required
    - `job_reference` string, nullable
    - `error_message` string, nullable
    - `error_count` integer, nullable
    - `error_sample` string, nullable
    - `sample_count` integer, nullable
    - `evaluation_time_ms` integer, nullable
    - `created_at` string, date-time, required
    - `completed_at` string, date-time, nullable
    - `failed_examples` object[], nullable
    - `predictions` object[], nullable
  - `adapters` AdapterTimeseriesEntry[], required
    - `training_job` TrainingJobResponse, required — Training job response model
      - `id` string, required
      - `user_id` string, required
      - `project_id` string, nullable — Project ID this training job is associated with
      - `model_name` string, nullable
      - `datasets` DatasetReference[], required
        - `name` string, required — Dataset name
        - `version` string, nullable — Version (latest if omitted)
      - `base_model` string, required
      - `validation_data_percentage` number, required
      - `nr_epochs` integer, required
      - `learning_rate` number, required
      - `batch_size` integer, required
      - `trained_model_path` string, nullable
      - `job_reference` string, nullable
      - `instance_type` string, nullable
      - `status` string, required
      - `normalized_status` string, nullable — Canonical status alias for compatibility handling (requested, running, complete, deployed, failed, cancelled)
      - `is_terminal_status` boolean, nullable — Whether this status is terminal for polling loops
      - `error_message` string, nullable
      - `created_at` string, required
      - `updated_at` string, required
      - `started_at` string, nullable
      - `completed_at` string, nullable
      - `model_auto_selected` boolean, nullable
      - `model_selection_reason` string, nullable
      - `task_type` string, nullable — Task type derived from training datasets: 'ner', 'classification', 'custom', or 'decoder'
      - `labels` string[], nullable — Merged labels from training datasets (entity types for NER, class labels for classification)
      - `example` string, nullable — Sample text to pre-load into inference input
      - `metrics` object, 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_number` string, nullable — Version number for this training job (e.g., '1', '2', '3')
      - `root_job_id` string, nullable — ID of the original/root training job this version derives from
      - `provider_deployments` object, nullable — Provider-specific deployment metadata written by the training monitor. For Fireworks: {"fireworks": {"deployment_name": ...}}.
      - `provider_name` string, nullable — Training provider that handled this job (e.g. 'fireworks', 'modal').
      - `progress_percent` integer, nullable — Overall training completion percentage (0-100). Updated live during training.
      - `current_epoch` integer, nullable — Epoch currently in progress (1-indexed). Updated live during training.
      - `deployment_status` string, nullable, required — Deprecated. Always returns None -- deployment_status no longer exists. Kept for backward compat with clients that read this field.
    - `latest_eval` EvaluationResponse — Response for a single evaluation
      - `id` string, required
      - `user_id` string, required
      - `project_id` string, nullable
      - `model_id` string, required
      - `dataset_name` string, required
      - `dataset_version` string, required
      - `model_name` string, nullable
      - `f1_score` number, nullable
      - `precision_score` number, nullable
      - `recall_score` number, nullable
      - `accuracy` number, nullable
      - `validation_loss` number, nullable
      - `subset_accuracy` number, nullable
      - `hamming_loss` number, nullable
      - `bleu_score` number, nullable
      - `rouge_l_score` number, nullable
      - `total_tokens` integer, nullable
      - `total_cost_usd` number, nullable
      - `total_latency_ms` integer, nullable
      - `max_examples` integer, nullable
      - `max_tokens` integer, nullable
      - `seed` integer, nullable
      - `config` object, nullable
      - `status` string, required
      - `job_reference` string, nullable
      - `error_message` string, nullable
      - `error_count` integer, nullable
      - `error_sample` string, nullable
      - `sample_count` integer, nullable
      - `evaluation_time_ms` integer, nullable
      - `created_at` string, date-time, required
      - `completed_at` string, date-time, nullable
      - `failed_examples` object[], nullable
      - `predictions` object[], nullable
    - `all_evals` EvaluationResponse[], required
      - `id` string, required
      - `user_id` string, required
      - `project_id` string, nullable
      - `model_id` string, required
      - `dataset_name` string, required
      - `dataset_version` string, required
      - `model_name` string, nullable
      - `f1_score` number, nullable
      - `precision_score` number, nullable
      - `recall_score` number, nullable
      - `accuracy` number, nullable
      - `validation_loss` number, nullable
      - `subset_accuracy` number, nullable
      - `hamming_loss` number, nullable
      - `bleu_score` number, nullable
      - `rouge_l_score` number, nullable
      - `total_tokens` integer, nullable
      - `total_cost_usd` number, nullable
      - `total_latency_ms` integer, nullable
      - `max_examples` integer, nullable
      - `max_tokens` integer, nullable
      - `seed` integer, nullable
      - `config` object, nullable
      - `status` string, required
      - `job_reference` string, nullable
      - `error_message` string, nullable
      - `error_count` integer, nullable
      - `error_sample` string, nullable
      - `sample_count` integer, nullable
      - `evaluation_time_ms` integer, nullable
      - `created_at` string, date-time, required
      - `completed_at` string, date-time, nullable
      - `failed_examples` object[], nullable
      - `predictions` object[], nullable

## Other responses

- `422` — Validation Error

---

[API](https://skmtc.net/pioneer/apis/brain-api.md) · [All operations](https://skmtc.net/pioneer/apis/brain-api/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/pioneer/brain-api/versions/31dfe831e079/schema)
