Skip to main content
Go from an empty directory to a deployed model. Train a LoRA adapter on managed infrastructure, serve it, and chat with it from the CLI.

Prerequisites

  • Python 3.11 or 3.12, with uv, pipx, or pip to install the CLI.
  • A Freesolo API key, created in your dashboard at freesolo.co. Commands that contact Freesolo, including server-side --dry-run, authenticate with it. Local --cost does not submit.

Step 1: Install the CLI

Step 2: Log in

Flash verifies the key against Freesolo and stores it locally, so you only do this once. You can also set FREESOLO_API_KEY instead of passing --api-key.

Step 3: Scaffold a project

Already have a published environment id, yours or one shared with you? Set it as [environment] id in your config and skip ahead to step 5.
This writes a ready-to-edit starter into the current directory:
Rerunning is safe: flash env setup leaves any file that already exists untouched.
Skip the hand-editing. Point your coding agent (Claude Code, Cursor, etc.) at the environment guide and have it find and port your existing reward and dataset into environment.py. A prompt to start from:

Step 4: Publish your environment

An environment is the task and reward your model trains on. Publish the scaffolded one to the managed Environments Hub to get an id:
This prints an environment id of the form your-org/starter.

Step 5: Configure and validate your run

Open configs/sft.toml and set the one thing that’s yours, the environment id from the previous step:
configs/sft.toml
Run an authenticated server-side validation first. --dry-run runs server-side submit-time preflights, creates a run with state=dry_run, reports client/server [train] schema mismatches, allocates no GPU, and incurs no charge:
See what the run will cost before committing. --cost remains local: it prints the pre-flight USD cost and exits without submitting:

Step 6: Train

This is the first step that can spend money. At submit time Flash checks your org balance against the pre-flight estimate, then bills successful runs at the quoted Flash cost. Setup and cold start time are reported separately for observability and are not billed.
Flash then follows the logs live. Press Ctrl-C to detach. The run keeps going on the server, and you can follow it again any time:
The run reaches done when training finishes. Start small: finish one short run end to end before you scale up. When you do, raise train.epochs or train.max_examples and change little else.

Step 7: Deploy

Serve the trained adapter on Freesolo’s managed serving service. Serving is billed per token for requests you send:
Every real deploy resolves an immutable adapter revision and runs a bounded serving smoke before the stable run-id alias is activated.

Step 8: Chat

That completes the loop. When you’re done, tear the endpoint down:

Essential commands

The commands you used above, plus the ones you’ll reach for next. Run flash <command> --help for the full set of flags, or see the CLI reference.

Next steps

How Flash works

The loop behind a run, and the concepts each command refers to.

Training in depth

SFT, GRPO, and OPD, config options, monitoring, and cost.

Build an environment

Replace the starter task with your own data and reward.

Deploy & chat

Serving billing and the OpenAI-compatible API.