Перейти к основному содержимому
Главы руководства по обучению Вся документация

Справочник Training API

Зарегистрированные конечные точки, тела запросов, ответы, границы владения ресурсами и обработка ошибок.

Команды и код во всех языковых версиях остаются на английском. Заменяйте ЗАГЛАВНЫЕ заполнители значениями своей учетной записи и оплаченного задания. Не вставляйте реальные ключи в общие ноутбуки или журналы.

Жизненный цикл ресурсов API

Предложение, оплаченное задание и сеанс обучения — разные ресурсы.
  1. Предложение Проверить конфигурацию и текущую цену
  2. Задание Создать и завершить одобренную оплату
  3. Сеанс Выбрать среду и включенную эталонную модель
  4. Подготовка Создать проверенные манифесты наборов данных
  5. Отчет Зафиксировать реальные сведения об обучении и артефакте

Предложение: Проверить конфигурацию и текущую цену. Задание: Создать и завершить одобренную оплату. Сеанс: Выбрать среду и включенную эталонную модель. Подготовка: Создать проверенные манифесты наборов данных. Отчет: Зафиксировать реальные сведения об обучении и артефакте

Аутентификация и правила запросов

Используйте HTTPS с Authorization: Bearer и ключом API учетной записи с областью ai:training. Передавайте Accept: application/json; для тел запросов JSON дополнительно указывайте Content-Type: application/json. Все ресурсы принадлежат учетным записям. Для группы маршрутов действует ограничение 30 запросов в минуту, а при соответствующей настройке применяются дополнительные ограничения. Идентификаторы в примерах — заполнители, а не общие ресурсы.

  • Идентификаторы предложений, UUID заданий, идентификаторы сеансов, моделей и артефактов — разные значения.
  • После сетевого сбоя проверьте текущее состояние перед повтором запроса на изменение.
  • Не используйте в запросах API текст публичных страниц или параметры запроса цен.
Пример · bash
export TRAINING_API='https://fusionpointai.com/api/v1/training'
# Set the key securely as shown in Quickstart.
export JOB_UUID='REPLACE_WITH_YOUR_JOB_UUID'
export SESSION_ID='REPLACE_WITH_YOUR_SESSION_ID'
curl --fail-with-body --silent --show-error "$TRAINING_API/jobs" \
  -H "Authorization: Bearer $FUSIONPOINTAI_API_KEY" -H 'Accept: application/json'

Запросы, ответы и состояния

Создайте предложение для подходящей конфигурации, затем штатное задание по предложению и завершите одобренную оплату до открытия сеанса. При создании сеанса возвращается 201, при повторном использовании — 200. Ответ содержит конфигурацию, выбранную референсную модель, манифесты данных, последний переданный шаг и объект отчета. Подготовка и отправка отчета — разные запросы; состояние задания не совпадает с состоянием сеанса.

  • Значения среды сеанса: fusionpointai_hosting, customer_datacenter, colab.
  • Разделы данных: train, validation; ответы представлены в JSONL, а не в массиве JSON.
  • Отчеты о завершении описывают реально созданный локальный артефакт и проходят проверки целостности и оценки.
Пример · text
POST /api/v1/training/quotes
reference_model_id     required eligible integer model ID
training_plan_id       required public provider-plan integer ID
mode                   automatic | advanced
objective              required string, 10..4000 characters
language               required string, at most 120 characters
performance_criteria   required string, 10..2000 characters
student_release_slug   optional eligible slug, at most 190 characters
method                 optional eligible method, at most 80 characters
dataset_megabytes      optional integer, 1..1000000
gpu_count              optional integer, 1..128
delivery               optional: artifact | hosted
execution_target       optional: fusionpointai_hosting | customer_datacenter | colab

Availability and approved plan policies can impose narrower constraints.
Do not submit price, fixed_total, currency, price_version_id or model_training.
Пример · json
{
  "reference_model_id": 123,
  "training_plan_id": "<INTEGER_FROM_YOUR_PROVIDER_PLAN>",
  "mode": "advanced",
  "objective": "Train a German support-message classifier.",
  "language": "German",
  "performance_criteria": "Evaluate per-class precision and recall on held-out data.",
  "student_release_slug": "<ELIGIBLE_STUDENT_RELEASE_SLUG>",
  "method": "LoRA",
  "dataset_megabytes": 8,
  "gpu_count": 1,
  "delivery": "artifact"
}
Пример · bash
# Save the body as quote.json; replace ID placeholders with integers.
# Automatic mode omits student_release_slug and method.
curl --fail-with-body --silent --show-error "$TRAINING_API/quotes" \
  -H "Authorization: Bearer $FUSIONPOINTAI_API_KEY" \
  -H 'Accept: application/json' -H 'Content-Type: application/json' \
  --data-binary @quote.json
# Save {"quote":"YOUR_QUOTE_UUID"} as job.json.
# Creates a native job/invoice; this is not payment confirmation.
curl --fail-with-body --silent --show-error "$TRAINING_API/jobs" \
  -H "Authorization: Bearer $FUSIONPOINTAI_API_KEY" \
  -H 'Accept: application/json' -H 'Content-Type: application/json' \
  --data-binary @job.json
curl --fail-with-body --silent --show-error "$TRAINING_API/jobs/$JOB_UUID" \
  -H "Authorization: Bearer $FUSIONPOINTAI_API_KEY" -H 'Accept: application/json'
Пример · text
POST /api/v1/training/quotes: 201
{quote: UUID, currency: ISO_CODE, fixed_total: DECIMAL_STRING, expires_at: ISO_8601}

POST /api/v1/training/jobs: {"quote":"OWNED_QUOTE_UUID"}
201 for a newly created job; 200 when an accepted quote reuses its job.
Job fields:
id                job UUID
status            native job state, such as awaiting_payment
progress_percent  recorded progress, not an independent quality score
invoice_id        owned native invoice ID or null
created_at        ISO 8601 timestamp
completed_at      ISO 8601 timestamp or null
training_session  null or {id, status, step, delivery, verification}

GET /api/v1/training/jobs:
{data: JOB_ARRAY, current_page: INTEGER, last_page: INTEGER, per_page: 50, total: INTEGER}

This is a response-shape reference, not a fabricated live response.
Пример · bash
# Save as session.json, using your paid job UUID and optional reference ID:
# {"job":"YOUR_PAID_JOB_UUID","runtime":"customer_datacenter","reference_model_id":123}
curl --fail-with-body --silent --show-error "$TRAINING_API/sessions" \
  -H "Authorization: Bearer $FUSIONPOINTAI_API_KEY" \
  -H 'Accept: application/json' -H 'Content-Type: application/json' \
  --data-binary @session.json
curl --fail-with-body --silent --show-error "$TRAINING_API/sessions/$SESSION_ID" \
  -H "Authorization: Bearer $FUSIONPOINTAI_API_KEY" -H 'Accept: application/json'
# One preparation batch; inspect progress before another request.
curl --fail-with-body --silent --show-error "$TRAINING_API/sessions/$SESSION_ID/prepare" \
  -H "Authorization: Bearer $FUSIONPOINTAI_API_KEY" \
  -H 'Accept: application/json' -H 'Content-Type: application/json' --data '{}'
Пример · text
Session response fields (shape reference, not a fabricated live result):
id                  session UUID
job                 owned job UUID
status              preparing | ready | running | evaluating | completed | failed | cancelled
configuration       approved method, student_checkpoint, sdk_training and selected reference
reference_model_id  selected integer reference ID
expires_at          ISO 8601 access expiry
step                last reported integer step
datasets[]          {split, rows, bytes, sha256}
report              current report object; event metrics live under report.last_event.metrics
delivery            runtime_local
verification        runtime_reported
Пример · bash
curl --fail-with-body --silent --show-error \
  "$TRAINING_API/sessions/$SESSION_ID/datasets/train" \
  -H "Authorization: Bearer $FUSIONPOINTAI_API_KEY" \
  -H 'Accept: application/x-ndjson' --output train.jsonl
# Use /datasets/validation for the other supported split.
sha256sum train.jsonl
# Compare bytes, rows and SHA-256 with the session manifest.
# For published server-side artifacts only, not the local SDK ZIP:
# GET /api/v1/training/jobs/{job}/artifacts/{file}
Пример · text
POST /api/v1/training/sessions/{session}/events
Content-Type: application/json

state         required: running | evaluating | failed
step          required integer: 0..2000
total_steps   required integer: 1..2000
metrics       optional; only loss and eval_loss, each 0..1000000
error_code    optional: training_failed | evaluation_failed | runtime_unavailable |
              dataset_invalid | report_failed

Send actual trainer observations, never sample or invented metrics.
Пример · bash
# Build the body from a REAL SDK report; requires jq.
jq '{artifact_name:"model-package.zip",report:.completion_report}' \
  customer-model-run-001/training-report.json > completion.json
curl --fail-with-body --silent --show-error "$TRAINING_API/sessions/$SESSION_ID/complete" \
  -H "Authorization: Bearer $FUSIONPOINTAI_API_KEY" \
  -H 'Accept: application/json' -H 'Content-Type: application/json' \
  --data-binary @completion.json
# Cancel eligible service state, not the operating-system process:
curl --fail-with-body --silent --show-error "$TRAINING_API/sessions/$SESSION_ID/cancel" \
  -H "Authorization: Bearer $FUSIONPOINTAI_API_KEY" \
  -H 'Accept: application/json' -H 'Content-Type: application/json' --data '{}'
Пример · bash
curl --fail-with-body --silent --show-error \
  'https://fusionpointai.com/api/v1/training/projects/authorize' \
  -H "Authorization: Bearer $FUSIONPOINTAI_API_KEY" \
  -H 'Accept: application/json' -H 'Content-Type: application/json' \
  --data '{"provider":"openai","reference_model_id":123}'
# The response identifies the owned paid job/grant and access expiry.
Пример · bash
curl --fail-with-body --silent --show-error \
  'https://fusionpointai.com/api/v1/training/projects/teacher' \
  -H "Authorization: Bearer $FUSIONPOINTAI_API_KEY" \
  -H 'Accept: application/json' -H 'Content-Type: application/json' \
  --data '{"provider":"openai","reference_model_id":123,"action":"lessons","objective":"Classify support messages into agreed categories.","topic":"ambiguous_requests","count":2,"approved_examples":["A reviewed support training example."]}'
# Send only explicitly approved training examples. Never send held-out rows.
# Curriculum action returns topics; lessons action returns text/topic examples.
Пример · python
import os
from fusionpointai_training import TrainingClient

client = TrainingClient(api_key=os.environ["FUSIONPOINTAI_API_KEY"])
session = client.get_session(os.environ["FUSIONPOINTAI_SESSION_ID"])
print("Session:", session["id"])
print("Status:", session["status"])
print("Last reported step:", session["step"])
# Inspection is read-only; status and step are server-reported state.
Пример · python
import os
from fusionpointai_training import TrainingClient

client = TrainingClient(api_key=os.environ["FUSIONPOINTAI_API_KEY"])
session = client.get_session(os.environ["FUSIONPOINTAI_SESSION_ID"])
for manifest in session["datasets"]:
    print(
        manifest["split"],
        "rows:", manifest["rows"],
        "bytes:", manifest["bytes"],
        "sha256:", manifest["sha256"],
    )
# These are server-provided manifest values, not a local integrity pass.
Пример · python
import os
from fusionpointai_training import TrainingClient

client = TrainingClient(api_key=os.environ["FUSIONPOINTAI_API_KEY"])
session = client.get_session(os.environ["FUSIONPOINTAI_SESSION_ID"])
server_report = session.get("report")
runtime_report = server_report.get("runtime") if isinstance(server_report, dict) else None
if (
    session.get("status") == "completed"
    and isinstance(runtime_report, dict)
    and runtime_report.get("artifact_sha256") == os.environ["LOCAL_ARTIFACT_SHA256"]
    and server_report.get("delivery") == "runtime_local"
    and server_report.get("verification") == "runtime_reported"
):
    print("Server report matches the local artifact digest.")
else:
    print("Completion is not confirmed for this local artifact.")
# Reconcile by reading state; do not repeat training or invent a result.

Ошибки и безопасная интеграция

Ориентируйтесь на HTTP-статус и возвращенные сведения о проверке, не считая любую ошибку временной. Возможны 401 для запросов без аутентификации, 403 при отказе в доступе, 404 для отсутствующих или чужих ресурсов, 409 при несовместимом состоянии, 422 для неверного ввода и 429 при ограничении частоты запросов. Сбои провайдера или среды выполнения могут возвращать другие ошибки. SDK предоставляет APIError и не возвращает исходный ответ вышестоящей системы, который может содержать секреты.

  • Допустимые состояния события: running, evaluating или failed; ключи метрик: loss и eval_loss.
  • Значения step и total_steps ограничены числом 2000; total_steps должно быть положительным.
  • В полном теле запроса требуется artifact_name и каждое поле отчета, указанное в примере.
Пример · text
401  Authentication missing or invalid
403  Account/key scope or access denied
404  Resource missing, non-owned or intentionally hidden
409  Invalid session transition, runtime, paid-access or model configuration
410  Writable session expired
422  Invalid request fields or completion criteria not met
429  Request rate limited
502  Upstream reference data malformed or preparation failed

Do not retry a write blindly. Read session state and inspect the response.
Keep error_code distinct from the HTTP status. Never log authorization.
Пример · text
POST /api/v1/training/sessions/{session}/complete
artifact_name                 safe filename ending in .zip, max 160 characters
report.training_steps         integer 1..2000
report.weights_before_sha256  lowercase SHA-256 of actual pre-training weights
report.weights_after_sha256   lowercase SHA-256 of actual changed weights
report.artifact_sha256        lowercase SHA-256 of the real local ZIP
report.artifact_bytes         integer 1..107374182400
report.eval_loss_before       finite number >0 and <=1000000
report.eval_loss_after        finite number >=0 and <=1000000
report.base_repository        pinned student repository, max 255 characters
report.base_revision          lowercase immutable 40-character revision
report.method                 SFT | LoRA | QLoRA

Values must match the approved session and actual local training.
Additional report keys are rejected. This body does not upload the ZIP.
Пример · python
import os
from fusionpointai_training import TrainingClient
from fusionpointai_training.errors import APIError

client = TrainingClient(
    api_key=os.environ["FUSIONPOINTAI_API_KEY"],
    timeout=30.0,
    max_get_retries=2,
)
try:
    session = client.get_session(os.environ["FUSIONPOINTAI_SESSION_ID"])
except APIError:
    # GET retries are bounded. Do not blindly retry a write after an error.
    print("Session inspection failed; check access and current server state.")
else:
    print("Status:", session["status"])
# Never print the API key, authorization headers, or response secrets.

Справка по API

Конечная точкаНазначение и поведение
POST /api/v1/training/quotes Authorization: Bearer ai:training Проверить подходящую эталонную модель, план и конфигурацию; вернуть UUID предложения, валюту, fixed_total и expires_at. Используйте одобренный план и допустимые настройки модели-ученика, а не произвольные цены клиента.
GET /api/v1/training/jobs Authorization: Bearer ai:training Получить список заданий аутентифицированного клиента. Проверяйте возвращенную коллекцию и идентификаторы ресурсов, а не угадывайте числовые идентификаторы.
POST /api/v1/training/jobs Authorization: Bearer ai:training Создать принадлежащее учетной записи задание по действительному UUID предложения. В ответе указаны ID задания, статус, ID счета и временные метки; создание задания не подтверждает оплату.
GET /api/v1/training/jobs/{job} Authorization: Bearer ai:training Прочитать свое задание по UUID, включая ход выполнения и статус поставки.
GET /api/v1/training/jobs/{job}/artifacts/{file} Authorization: Bearer ai:training Скачать опубликованный файл, принадлежащий этому заданию. ZIP-файл локального SDK автоматически не загружается и может быть недоступен через этот маршрут.
POST /api/v1/training/sessions Authorization: Bearer ai:training Тело запроса: UUID задания, среда выполнения и необязательная положительная reference_model_id. Вернуть новый или повторно используемый сеанс; менять эталонную модель можно только до начала подготовки.
GET /api/v1/training/sessions/{session} Authorization: Bearer ai:training Прочитать принадлежащий клиенту сеанс, его конфигурацию, наборы данных, отчет и состояние. Чтение состояния не запускает обучение.
POST /api/v1/training/sessions/{session}/prepare Authorization: Bearer ai:training Отправить пустой объект JSON, чтобы запросить ограниченную порцию подготовки. При наличии прогресса повторять запрос до готовности с учетом бюджета запросов.
GET /api/v1/training/sessions/{session}/datasets/{split} Authorization: Bearer ai:training Скачать train или validation в формате application/x-ndjson. Сверить байты, SHA-256 и строки с манифестом соответствующего сеанса.
POST /api/v1/training/sessions/{session}/events Authorization: Bearer ai:training Сообщить фактическое состояние, step, total_steps и необязательные метрики loss/eval_loss. Использовать только поддерживаемые значения состояния и кода ошибки.
POST /api/v1/training/sessions/{session}/complete Authorization: Bearer ai:training Отправить artifact_name и полный достоверный отчет об обучении. Сервис проверяет метод, базовую ревизию, изменения весов, дайджест артефакта и критерии оценки.
POST /api/v1/training/sessions/{session}/cancel Authorization: Bearer ai:training Отправить пустой объект JSON для отмены состояния сервиса, если это допускается. При необходимости самостоятельно остановить отдельный процесс GPU; это не пауза и не возобновление.
POST /api/v1/training/projects/authorize Authorization: Bearer ai:training Отправьте POST /api/v1/training/projects/authorize с параметрами provider и положительным reference_model_id. Сервис повторно проверит оплаченный доступ учетной записи к референсной модели и вернет принадлежащие ей задание и разрешение, провайдера, референсную модель и срок действия. Счет не создается, платеж не меняется.
POST /api/v1/training/projects/teacher Authorization: Bearer ai:training Отправьте POST /api/v1/training/projects/teacher с параметрами provider, reference_model_id, action (curriculum или lessons), objective, необязательным topic, count (1–4) и не более чем восемью approved_examples (до 2 000 символов каждый). В ответе будут темы или строки с текстом урока и темой. Отправляйте только одобренные учебные данные, никогда не передавайте данные валидации или итогового теста.