llm

Simon Willison's CLI, which takes an OpenAI-compatible model with no plugin at all.

Setup

Point llm at Tium

You need the base URL https://api.tium.ai/v1 and an API key from your dashboard. Keys are shown once at creation.

  1. 1.Find your llm config directory

    Run dirname "$(llm logs path)". On macOS and Linux it is under ~/.config/io.datasette.llm, on Windows under AppData/Roaming/io.datasette.llm. Save the file above there as extra-openai-models.yaml, creating it if it does not exist.

    extra-openai-models.yaml
    - model_id: tium/glm-5.3-flash
      model_name: glm-5.3-flash
      api_base: https://api.tium.ai/v1
      api_key_name: tium
      supports_tools: true
      supports_schema: true
      vision: true
  2. 2.Store your key under the name the file references

    Run llm keys set tium and paste the key when prompted. api_key_name points at that stored name, so the key never goes in the YAML.

  3. 3.Use it

    Run llm -m tium/glm-5.3-flash "your prompt". Confirm it registered first with llm models list, which should show it as an OpenAI Chat model.

Verify

Check that it worked

Registration and a live completion are separate things worth checking separately. The first confirms the YAML parsed; the second confirms the key and base URL.

llm models list | grep tium
llm -m tium/glm-5.3-flash "Say hello"

Every response also carries its own cost and your remaining balance in the X-Tium-* headers. See the header reference.

Worth knowing

What llm gets wrong

Tool-specific behaviour that surprises people, and what to do about it.

model_id and model_name do different jobs

model_name is what we receive and must be the slug exactly as /v1/models publishes it. model_id is only what you type locally, so the tium/ prefix above is a convenience for telling models list entries apart. It is not sent anywhere and does not need to match anything.

The capability flags are declarations, not detection

llm has no catalogue entry for these models, so nothing is inferred. supports_tools is what makes tool calling available; drop vision on the three models that do not take images, and drop supports_schema on the DeepSeek pair.

A daily-cap 429 can look like a hang

Our 429 for the daily burst cap carries Retry-After, and it is measured in an hour rather than seconds because that is genuinely when the cap lifts. A client that honours it waits rather than failing, which from a terminal looks like nothing happening. If llm sits silent, check your balance on the dashboard before assuming the config is wrong.

Elsewhere

Other tools

The same base URL and key work anywhere that takes an OpenAI-compatible endpoint.