---
title: "Start Training Run"
method: POST
path: "/risk-assessment/factor-assessments/{factor_assessment_id}/training-runs"
tags: ["risk-assessment"]
---

# Start Training Run

`POST /risk-assessment/factor-assessments/{factor_assessment_id}/training-runs`

## Request

- Base URL: `https://api.kobaltlabs.com` (the document declares no server; this is the origin it was published from)
- URL: `https://api.kobaltlabs.com/risk-assessment/factor-assessments/{factor_assessment_id}/training-runs`
- Auth: none declared

Start a "Teach Kobalt" run from feedback on a rating the reviewer disagrees with.

When the suggested rating differs from the factor's current effective level,
it is applied as a manual override here — not by the agent — so it stands
whether the agent succeeds, gives up, or crashes. Otherwise the run records
feedback only and leaves the displayed rating unchanged.

## Path parameters

- `factor_assessment_id` string, uuid, required

## Request body

- StartTrainingRunRequest: A reviewer teaching Kobalt what a factor's guidance should have said. At least one of `guidance_text`, a reference, or a rating must be supplied — an empty correction gives the agent nothing to work from. The check lives in the route rather than a validator so the message can name all three.
  - `guidance_text` string, nullable
  - `suggested_inherent_risk_label` string, uuid, nullable
  - `force_rating` boolean
  - `reference_upload_ids` string[]
  - `reference_urls` string[]

## Response `202`

Successful Response

- TrainingRunSummary
  - `training_run_id` string, uuid, required
  - `factor_assessment_id` string, uuid, required
  - `status` 'pending' | 'running' | 'completed' | 'failed', required
  - `outcome` 'promoted' | 'gave_up', required: How a `RiskFactorTrainingAgentRun` ended. Both are terminal tool calls, not failures: an agent that cannot justify a rewrite is expected to GIVE_UP with questions rather than promote one.
  - `proposal_status` 'active' | 'proposed' | 'hidden' | 'inactive', required: Where one `risk_factor_versions` row stands. A factor's name and slug are permanent; its description, assessment guidance, rating rubric and applicability logic are versioned, so a rewrite never destroys the text that produced historical ratings. ACTIVE is what the next assessment run uses, and a partial unique index (`uq_risk_factor_versions_one_active`) enforces at most one per factor. HIDDEN is a training agent's working draft — created mid-run and never shown to a reviewer. PROPOSED is a draft the agent promoted and the reviewer has not yet accepted or rejected. INACTIVE covers both "superseded" and "rejected"; the two are distinguishable from the training run's outcome.
  - `created` string, date-time, required
  - `started_at` string, date-time, nullable, required
  - `finished_at` string, date-time, nullable, required
  - `experiment_count` integer, required
  - `error` string, nullable, required

## Other responses

- `422`: Validation Error

---

[API](https://skmtc.dev/kobaltlabs/apis/fastapi.md) - [All operations](https://skmtc.dev/kobaltlabs/apis/fastapi/llms.txt) - [OpenAPI document](https://skmtc.dev/kobaltlabs/apis/fastapi/revisions/8587332d5e43?raw)
