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

# Model credentials

> How the Vendo Cloud model gateway fills every model seat, which model names it serves, how to pin one, and what a keyless turn does.

Your Cloud key is the model credential. Leave the `models` slot unset and every
turn rides the console's gateway.

## How the gateway is wired

Managed inference is not a bespoke client. It is the stock `@ai-sdk/anthropic`
provider, pointed at the console instead of at Anthropic.

<Frame caption="One provider, one base URL swap. VENDO_API_KEY is the bearer token.">
  <svg viewBox="0 0 720 132" width="100%" role="img" aria-label="createVendo calls the stock Anthropic provider, which calls the console gateway at /api/v1">
    <g fill="none" stroke="currentColor" strokeOpacity="0.28" strokeWidth="1.25">
      <rect x="1" y="34" width="196" height="64" rx="12" />

      <rect x="262" y="34" width="196" height="64" rx="12" />

      <rect x="523" y="34" width="196" height="64" rx="12" />
    </g>

    <g fill="currentColor" fontFamily="ui-monospace, monospace" fontSize="12.5">
      <text x="20" y="62">createVendo()</text>
      <text x="281" y="62">@ai-sdk/anthropic</text>
      <text x="542" y="62">console.vendo.run</text>
    </g>

    <g fill="currentColor" fillOpacity="0.6" fontSize="11.5">
      <text x="20" y="82">your composition</text>
      <text x="281" y="82">stock provider, no fork</text>
      <text x="542" y="82">/api/v1 · Messages wire</text>
    </g>

    <g stroke="currentColor" strokeOpacity="0.45" strokeWidth="1.25" fill="none">
      <path d="M205 66 h48" />

      <path d="M243 61 l10 5 l-10 5" />

      <path d="M466 66 h48" />

      <path d="M504 61 l10 5 l-10 5" />
    </g>

    <g fill="currentColor" fillOpacity="0.6" fontSize="10.5" fontFamily="ui-monospace, monospace" textAnchor="middle">
      <text x="229" y="28">baseURL</text>
      <text x="490" y="28">VENDO\_API\_KEY</text>
    </g>
  </svg>
</Frame>

The console speaks the Anthropic Messages wire, which is the whole reason the
Anthropic provider serves it. Point the same provider at
`https://console.vendo.run/api/v1` and it works.

<Note>
  Gateway traffic does not carry Vendo's deployment-identity headers, so
  inference does not appear in the console's deployment inventory. Usage still
  meters.
</Note>

***

## Which model you get

The gateway serves the `vendo` model family as literal model ids. The console
maps each name to a concrete model server-side, so a Cloud-keyed app can be
retuned without a client release.

| Name            | Seat it serves                                            |
| --------------- | --------------------------------------------------------- |
| `vendo`         | The `default` seat, and the default when no name is given |
| `vendo-apps`    | The `apps` seat, which writes the generated apps          |
| `vendo-review`  | The `review` seat, which grades the finished ones         |
| `vendo-judge`   | The `judge` seat, the guard's run/ask/block               |
| `vendo-extract` | Tool extraction, in the CLI                               |

Names pass through verbatim. There is no client-side translation, so an unknown
name surfaces the gateway's own error rather than a Vendo one.

Leave a seat unset and it takes its own family id here, so an empty `models`
block still puts each job on the name tuned for it.

The `default` seat is also published in three billed tiers, `vendo-fast`,
`vendo`, and `vendo-strong`. Their rates are on the
[Vendo Cloud](/production/vendo-cloud#pricing) page.

***

## Pinning a model

Two ways, and an explicit model object always wins over both.

```ts app/api/vendo/[...vendo]/route.ts highlight={2} theme={null}
const vendo = createVendo({
  models: { default: "vendo-strong" },
  auth: authJs(),
});
```

```bash .env.local highlight={1} theme={null}
VENDO_MODEL=vendo-strong
```

Precedence runs top to bottom: an explicit model object, then the environment
pin, then the configured string, then that seat's own family name.

***

## When there is no key

Every seat resolves through `vendoModel()`, lazily, on the first call that needs
a model. With no credential that call fails, and the message names
`VENDO_API_KEY` and `vendo login` as the way out.

Nothing else in the environment fills a seat. A provider key sitting in your
shell is a credential, not a selection, and Vendo never picks a provider on
your behalf.

If your product already runs its own agent loop, Vendo's internal turns still
need models of their own and will not borrow yours. Leaving the seats unset is
what hands them the gateway.

***

## Verifying the model

`vendo doctor` names the credential the runtime will resolve. It reads your
environment and makes no model call.

```bash Terminal highlight={1} theme={null}
$ npx vendo doctor

ok: model credential: VENDO_API_KEY (Vendo Cloud)
```

A key that is set but malformed reports
[`E-CLOUD-001`](/production/troubleshooting/e-cloud-001).

***

## Where to go next

<CardGroup cols={3}>
  <Card title="Vendo Cloud" href="/production/vendo-cloud">
    What the key covers, what it costs, and where the rates are published.

    `vendo login`
  </Card>

  <Card title="Edge runtimes" href="/production/edge-runtimes">
    The gateway spelled out by hand, for runtimes without Node.

    `createAnthropic({ baseURL })`
  </Card>

  <Card title="Environment variables" href="/reference/environment-variables">
    Every `VENDO_*` variable the runtime reads.

    `VENDO_MODEL · VENDO_CLOUD_URL`
  </Card>
</CardGroup>
