---
title: "Supported models"
description: "Which base models the Arkor backend accepts today, why the list is short, and where it's headed."
---

Today Studio's Playground (base-model mode) and Arkor's hosted inference serve exactly one base model, Gemma 4 E4B. The identifier you pass to `createTrainer` is the fully qualified `unsloth/gemma-4-E4B-it` — the sole `SupportedModel` value, as in the example below — checked by the compiler and re-checked when the trainer is constructed. The training backend can accept identifiers this SDK has not listed yet. Reaching one means bypassing `createTrainer` and submitting the job through the raw cloud API client, whose `createJob` keeps `config.model` a plain `string` — an escape hatch these docs do not otherwise cover, and the same one the "Unsupported model" error points at. Below: what that value gets you and what's next.

## What you can pick today

`gemma-4-E4B-it` is the Gemma 4 instruction-tuned build, packaged by Unsloth for fast LoRA / QLoRA fine-tuning. Every starter template (`triage`, `translate`, `redaction`) targets it by default.

```ts
import { createTrainer } from "arkor";

export const trainer = createTrainer({
  name: "support-bot-v1",
  model: "unsloth/gemma-4-E4B-it",
  dataset: { type: "huggingface", name: "arkorlab/triage-demo" },
});
```

## The list is enforced by the compiler

`model` is typed as `SupportedModel`, a union derived from the supported list rather than a plain `string`. A typo does not compile:

```ts
createTrainer({
  name: "support-bot-v1",
  // Type '"unsloth/gema-4-E4B-it"' is not assignable to type 'SupportedModel'.
  model: "unsloth/gema-4-E4B-it",
  dataset: { type: "huggingface", name: "arkorlab/triage-demo" },
});
```

The same list is enforced when the trainer is constructed: `createTrainer` throws on a model outside it. Flows that never run a typechecker (plain JavaScript, or `arkor build` / `arkor start`, which bundle with esbuild) fail fast locally instead of surfacing a 4xx from the backend.

Both the type and the list itself are exported, so you can iterate the list at run time (to render a picker, for example):

```ts
import { SUPPORTED_MODELS, type SupportedModel } from "arkor";
```

Note that this narrowing applies to what you *send*. A job read back from the backend (`TrainingJob.config.model`) stays a `string`, because the backend can run a model your installed version of the SDK predates.

## What's coming

<CardGroup cols={2}>
  <Card title="Gemma 4 family" icon="layer-group" href="/docs/framework/roadmap#gemma-4-family">
    Open the `model` field to the full Gemma 4 family so you can pick the variant that matches your use case (size, capability, latency, quality).
  </Card>

  <Card title="Other open-weight families" icon="cubes" href="/docs/framework/roadmap#more-base-models">
    Expanding to additional open-weight families is on the Roadmap backlog.
  </Card>
</CardGroup>

## See also

- [Trainer concept](/docs/framework/concepts/trainer) for what the `model` field is and where it sits among the other fields.
- [`createTrainer` reference](/docs/framework/sdk/create-trainer) for the full `TrainerInput` type.
- [Roadmap](/docs/framework/roadmap) for the broader picture of what's next.


---

This page is licensed under the MIT License (Copyright (c) 2026 Arkor). Include the copyright notice and the permission notice in all copies or substantial portions.

Full text: https://github.com/arkorlab/arkor/blob/main/LICENSE.md

Scope and exceptions: https://www.arkor.ai/license
