Skip to main content
Upload PEFT-trained LoRAs for supported base models. After upload, give the LoRA a name and pass that name or ID in request metadata. If you train LoRAs with Tinker, you can also sample directly from Tinker checkpoints without uploading — see Tinker.

Supported base models

LoRA serving is available for: If a LoRA is incompatible with the base model or exceeds the rank limit, validation or inference fails.

Adapter requirements

Train with PEFT and export the two standard files:
  • adapter_config.json
  • adapter_model.safetensors
Use adapter config values compatible with the base model:
  • base_model_name_or_path should identify the base model you register in supported_models (e.g. moonshotai/Kimi-K2.6).
  • peft_type should be "LORA".
  • task_type should be "CAUSAL_LM".
  • r (rank) must be no more than the base model’s max rank.
  • target_modules can include any modules supported by the base model and runtime. Sail does not restrict Kimi K2.6 LoRAs to a fixed target-module allowlist.
Other adapter-config fields (lora_alpha, lora_dropout, bias settings, etc.) are preserved as-is. The adapter_config.json and adapter_model.safetensors files can each be up to 100 GiB.

Add a LoRA

Create a LoRA in three steps: upload the config file, upload the weights file, then call POST /v1/loras. The response includes validation records for each requested model.

1. Upload the two adapter files

Use POST /v1/files (multipart):

2. Create the LoRA

Each supported_models entry must be a known Sail model ID. Naming rules for the name field:
  • 2–64 characters
  • lowercase alphanumeric or dashes ([a-z0-9-])
  • must start and end with an alphanumeric character
  • unique within your organization (duplicate → 409)
The file IDs you pass must belong to the same organization as your API key.

Validation flow

POST /v1/loras creates one validation record per supported_models entry. Each record appears in the response under validations:
Sail validates the LoRA on each model in supported_models. Poll GET /v1/loras/{name} until validation finishes for the model you want to use. Read validations for model-specific status. Requests using a LoRA are rejected only when the latest validation for that model is failed; pending, running, and unverified records remain usable. If you later add a model with PATCH /v1/loras/{name}, Sail creates validation records for newly added models that have not already succeeded validation.

3. Fetch LoRAs

Use a LoRA

Pass the LoRA’s name (or its UUID) as metadata.lora on any Responses, Chat Completions, or Messages request. model must be one of the LoRA’s supported_models:
Chat Completions:

Constraints on LoRA requests

  • completion_window cannot be asap. Use priority, standard, or flex — see Completion Windows for what each means.
  • model must be in the LoRA’s supported_models list. Requesting a different base model returns 400.
  • A failed model validation blocks that model. GET /v1/loras/{name} includes validations[].result_message when validation fails.
  • The LoRA must belong to your organization. Names are scoped per-org; two orgs can independently own a LoRA called funnier-v1.
  • You can use either the LoRA’s name or its UUID in metadata.lora.