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 --dry-run and an SFT --cost, authenticate with it. A GRPO or OPD --cost quotes offline from the catalog. These checks do not start paid training or allocate a training GPU.

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: Create a project

Every run and environment belongs to a project. Create one and keep its UUID; the next steps need it.
This prints the project UUID. flash projects list shows them all later.

Step 4: Scaffold an environment

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 6.
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 5: 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/<your-project>/starter.

Step 6: Configure and validate your run

flash env setup already wrote project into each generated config. Open configs/sft.toml and set the one thing that’s yours, the environment id from the previous step:
configs/sft.toml
Validate it first. --dry-run applies the real submit-time checks, including unrecognized [train] keys, without starting paid training or allocating a training GPU:
For SFT, --cost returns the estimate directly without starting paid training or allocating a training GPU. Review the cost details before submitting:
--cost prints the pre-flight USD estimate and returns.

Step 7: Train

This is the first flow command that starts paid training. Flash checks your org balance before submission and bills successful runs at the accepted quote.
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 8: Deploy

Serve the trained adapter on Freesolo’s managed serving service. Serving is billed per token for requests you send:
Keep --wait so the chat step starts only after the deployment is ready. You can also deploy and tear down from the dashboard.

Step 9: 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.