> ## Documentation Index
> Fetch the complete documentation index at: https://docs.anonalabs.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Model selection

> Choose which LLM answers your reason and chat calls, and pay that model's rate.

export const ModelPicker = () => <div style={box}>
    <label htmlFor="anona-model-picker" style={{
  display: "block",
  fontWeight: 600,
  marginBottom: "0.5rem"
}}>
      Choose a model
    </label>

    <select id="anona-model-picker" defaultValue={DEFAULT_MODEL} style={{
  width: "100%",
  padding: "0.5rem",
  borderRadius: "0.5rem",
  border: "1px solid var(--gray-300, #d1d5db)",
  background: "transparent",
  color: "inherit",
  fontFamily: "inherit",
  fontSize: "0.875rem"
}} onChange={e => {
  const id = e.target.value;
  const spec = MODELS.find(m => m.id === id);
  document.querySelectorAll("[data-anona-model]").forEach(el => {
    el.textContent = spec ? spec.short : id;
  });
  document.querySelectorAll("[data-anona-rate]").forEach(el => {
    el.textContent = spec ? spec.cin + " in / " + spec.cout + " out credits per 1K · " + spec.rpm + " req/min" : "";
  });
}}>
      {MODELS.map(m => <option key={m.id} value={m.id}>
          {m.display + "  ·  " + (m.rel === 1 ? "1x, the default" : m.rel + "x cost")}
        </option>)}
    </select>

    <p style={{
  margin: "0.5rem 0 1rem",
  fontSize: "0.8125rem",
  opacity: 0.75
}}>
      <span data-anona-rate="">{DEFAULT_RATE}</span>
    </p>

    <pre style={pre}>
      <code>
        {"curl https://api.anonalabs.com/v1/reason \\\n"}
        {'  -H "Authorization: Bearer $ANONA_API_KEY" \\\n'}
        {'  -H "Content-Type: application/json" \\\n'}
        {"  -d '{\n"}
        {'    "space_id": "support",\n'}
        {'    "query": "what does this customer keep asking for?",\n'}
        {'    "model": "'}
        <span data-anona-model="" style={{
  color: "#7dd3fc"
}}>
          {DEFAULT_SHORT}
        </span>
        {'"\n'}
        {"  }'"}
      </code>
    </pre>

    <p style={{
  margin: "0.75rem 0 0",
  fontSize: "0.8125rem",
  opacity: 0.75
}}>
      {"Same field on the chat proxy, and on "}
      <code>PUT /v1/spaces/{"{id}"}/reason-settings</code>
      {" to make it the space default."}
    </p>
  </div>;

By default every call runs on the model Anona serves as standard. You can name a
different one (per request, in the dashboard, or as a default for a space), and
credits are charged at that model's own rate rather than a flat tier.

<Note>
  Not to be confused with [memory models](/api-reference/models), which are standing
  answers a space keeps current. This page is about the **LLM** that does the work.
</Note>

## Every model is available on every plan

There is no plan gate. A Developer account can select the most expensive model in
the catalog, and a Scale account pays the same rate for it.

That works because credits are derived from each model's real per-token cost. A
credit balance is therefore a **spend cap**, and the choice of model cannot move it.
It only changes how fast the balance goes down. The same 5,000 credits buy
roughly 58M tokens of `nova-micro` or 2.5M tokens of `nova-pro`, and cost us the
same either way.

The practical limit is throughput, not entitlement: request-per-minute quotas are
per model, and the premium models carry the least headroom. See `requests_per_minute`
in the table below.

## The default

Omit `model` and you get **`us.amazon.nova-pro-v1:0`**, also reachable as the tier
name `balanced`. It is what every call ran on before model selection existed, and
its credit rate is unchanged, so leaving the field alone changes nothing about
either your results or your bill.

## Pick one, and copy the call

<ModelPicker />

## Three ways to name a model

**A short name**, like `nova-pro`, `deepseek` or `glm`, is what you will use most. One per
model, and pinned to that model permanently: a short name is never re-pointed at
something else.

**A tier name**, like `fast` or `balanced`, names an *intent* rather than a model, and Anona
keeps it pointed at a sensible choice as the landscape changes. That re-pointing is the
value: ask for `fast` and you keep getting whatever "fast" should mean.

**A full model id**, like `us.amazon.nova-pro-v1:0`, also works, and always has. Nothing
that already sends one needs to change. `GET /v1/models` returns the full id for every
model, along with its exact credit rates.

<Warning>
  The difference between the first two matters. A **short name is stable**; a **tier name
  may move**. If you have measured a model and want that exact behaviour to stay put, name it:
  `nova-pro`, not `balanced`.
</Warning>

```json theme={null}
{ "space_id": "support", "query": "what does this customer keep asking for?", "model": "nova-lite" }
```

These all name the same model, and any of them is accepted anywhere `model` is:

```json theme={null}
{ "model": "nova-pro" }
{ "model": "balanced" }
{ "model": "us.amazon.nova-pro-v1:0" }
```

The first two agree **today**. `balanced` is an intent that may be re-pointed later;
`nova-pro` is that model permanently.

## Using it from the API

Resolution runs **request → space default → platform default**, so a request always
wins over a stored setting.

<CodeGroup>
  ```http Per request (reason) theme={null}
  POST /v1/reason
  Authorization: Bearer anona_live_xxx

  { "space_id": "support", "query": "...", "model": "balanced" }
  ```

  ```http Per request (chat proxy) theme={null}
  POST /v1/chat/completions
  Authorization: Bearer anona_live_xxx

  { "space_id": "support", "model": "fast", "messages": [{ "role": "user", "content": "..." }] }
  ```

  ```http Space default (reason) theme={null}
  PUT /v1/spaces/support/reason-settings
  { "model": "fast" }
  ```

  ```http Space default (proxy) theme={null}
  PUT /v1/spaces/support/chat-settings
  { "chat_model": "fast" }
  ```
</CodeGroup>

Because the proxy is drop-in, a stock OpenAI SDK can set it once and forget it:

```python theme={null}
from openai import OpenAI

client = OpenAI(
    api_key="anona_live_xxx",
    base_url="https://api.anonalabs.com/v1",
    default_headers={"X-Anona-Space-Id": "support"},
)

resp = client.chat.completions.create(
    model="fast",                      # a tier name or a model id
    messages=[{"role": "user", "content": "What did we decide about pricing?"}],
)
```

A space default is stored as a **resolved model id**, even when you send a tier
name. If `fast` is later re-pointed at a different model, spaces that already chose
it stay where they are. You picked a behaviour, not a subscription to ours.

`GET /v1/spaces/{space_id}/reason-settings` reads the current value; sending
`{"model": null}`, or `DELETE`, returns the space to the platform default.

<Warning>
  `PUT /v1/spaces/{id}/chat-settings` replaces the whole record, so a field you omit is
  cleared, not kept. The reason model is a **separate** resource for exactly this
  reason, so saving chat defaults never disturbs it.
</Warning>

## Using it from the dashboard

Open a space, then the **chat defaults** tab. Two rows set the model:

| Row              | What it changes                                                                                                   |
| ---------------- | ----------------------------------------------------------------------------------------------------------------- |
| **Chat model**   | The LLM that answers proxied chat calls (`/v1/chat/completions`, `/v1/responses`, `/v1/messages`) for this space. |
| **Reason model** | The LLM that answers `/v1/reason` for this space.                                                                 |

Each row has an **override** toggle. Left off, the row is inherited: the space
follows the platform default, and it keeps following it if that default ever moves.
Turn the toggle on and the picker appears, listing every model with its credit rate
per 1K tokens so the cost of the choice is visible at the moment you make it.

These write the same `reason-settings` and `chat-settings` resources the API uses,
so a value set here is the value a request sees, and vice versa.

## List what you can use

```http theme={null}
GET /v1/models
Authorization: Bearer anona_live_xxx
```

```json theme={null}
{
  "object": "list",
  "data": [
    {
      "id": "us.amazon.nova-lite-v1:0",
      "object": "model",
      "created": 0,
      "owned_by": "anona",
      "short_name": "nova-lite",
      "display_name": "Nova Lite",
      "alias": "fast",
      "default": false,
      "credits_per_1k_input": 0.147,
      "credits_per_1k_output": 0.588,
      "requests_per_minute": 400,
      "relative_cost": 0.07
    }
  ]
}
```

The envelope is the standard OpenAI list shape, so `client.models.list()` works
unchanged against the [proxy](/api-reference/chat). Entries come back **cheapest
first**, ordered by `relative_cost`. The names, `alias`, `default`, the credit
rates, `requests_per_minute`, and `relative_cost` are Anona's additions; an SDK
that does not know about them ignores them. `short_name` always names this exact
model and never moves; `alias` names a tier and may be re-pointed.

`default` marks the model you get by omitting the `model` field. At most one
entry carries it, and sometimes none, when this deployment serves a model
outside the catalog.

## What it costs

Credit rates are derived from each model's real per-token price, so a model that
costs five times more charges roughly five times the credits, with no rounding
into tiers.

**Cost vs default** compares against `nova-pro`, blended 10:1 input:output. It is a
shopping aid, not a billing figure: a model's in/out ratio is its own. Llama 70B
charges the same for both, Nova Pro charges 4x more for output, so cost a real
workload from the exact credit rates on `GET /v1/models`, not from the multiplier.

| Model        | Use in `model` | Tier           | Cost vs default     |
| ------------ | -------------- | -------------- | ------------------- |
| Nova Micro   | `nova-micro`   | -              | 0.04x               |
| Nova Lite    | `nova-lite`    | `fast`         | 0.07x               |
| GPT-OSS 120B | `gpt-oss`      | -              | 0.19x               |
| Llama 70B    | `llama-70b`    | -              | 0.71x               |
| DeepSeek     | `deepseek`     | -              | 0.72x               |
| GLM          | `glm`          | -              | 0.73x               |
| **Nova Pro** | **`nova-pro`** | **`balanced`** | **1x, the default** |

`GET /v1/models` is the authoritative list; this table is a snapshot.

Reason also carries a flat base of 5 credits, so a short answer on a cheap model
costs 5 rather than fractions of one.

<Note>
  A worked example. A reason call reading 4,000 tokens of context and writing 400 on
  the default costs `5 + (4 × 1.96) + (0.4 × 7.84)` ≈ **16 credits**. The same call on
  `nova-micro` costs `5 + (4 × 0.09) + (0.4 × 0.34)` ≈ **5.5 credits**, and at that end of
  the catalog the flat base is most of the bill, not the tokens.
</Note>

## Which model answered

Reason echoes it back, so you can reconcile an answer and its cost against the model
that actually produced them rather than the one you asked for:

```json theme={null}
{
  "insights": "...",
  "model": "us.amazon.nova-lite-v1:0",
  "usage": { "input_tokens": 4120, "output_tokens": 380 }
}
```

## Errors

Anona never quietly substitutes a different model. If the one you named cannot serve
the request, the request fails and says so.

| Code                | Status | Meaning                                                                                                |
| ------------------- | ------ | ------------------------------------------------------------------------------------------------------ |
| `unsupported_model` | 400    | Not a model this deployment serves. The message lists what is.                                         |
| `model_throttled`   | 429    | That model is at capacity right now. Retry, or use one with more headroom (see `requests_per_minute`). |
| `model_unavailable` | 503    | The model is listed but this deployment cannot reach it. Ours to fix.                                  |

Request limits are **per model**, which is also a reason to choose one: the
high-throughput models carry twenty times the headroom of the premium ones.

## Choosing well

* **Leave it alone** unless you have a reason. The default is the balanced option.
* **`fast`** for high-volume, low-stakes work: classification, short recall
  summaries, anything where you would rather have ten answers than one better one.
* **A premium model** for reason over a large space, where the synthesis is the
  product and a better one is worth several times the credits.
* **Watch the credit burn, not the plan.** Nothing stops a Developer account
  running any model in the catalog; the dearest simply exhausts the month's credits
  about 22 times sooner than `nova-micro` would.
* **Measure before pinning an id.** Reason is a multi-step agent loop, so a slower
  model costs more wall time than its per-call latency suggests.
