Models
GET /v1/models lists the models a key may use, with the metadata a client needs to configure itself. The list is per key: a key limited to some models lists only those.
The models#
| Model id | Context | Max output | Vision | Tools | Reasoning efforts | Input modalities |
|---|---|---|---|---|---|---|
glm-5.3 | 1,048,576 | 131,072 | no | yes | low, high, max | text |
deepseek-v4.1-flash | 1,048,576 | 393,216 | yes | yes | low, high, max | text, image |
deepseek-dgx | 1,048,576 | 393,216 | yes | yes | low, high, max | text, image |
glm-5.3-flash | 1,048,576 | 131,072 | yes | yes | no effort values published | text, image, video, file |
deepseek-v4.1-flash-abliterated | 1,048,576 | 131,072 | yes | yes | low, high, max | text, image |
glm-5.3-abliterated | 1,048,576 | 131,072 | no | yes | low, high, max | text |
glm-5.3-flash-abliterated | 1,048,576 | 131,072 | no | yes | low, high, max | text |
An embedding model is listed with output_modalities: ["embedding"] and its dimensions; Embeddings is its endpoint. GET /v1/models is the current list for any key.
A prompt plus the output it may ask for must fit the context window. A request over it is refused with the context length error, context_length_exceeded in the OpenAI format, so an agent that compacts on it keeps doing so.
deepseek-dgx is DeepSeek V4.1 Flash served on our own DGX Spark, and it is the only model the Sparks serve.
One id per model#
A model has one id: what GET /v1/models lists and what a request sends. There is no suffix to select, because every route is zero-retention and there is no region to choose. An id that still carries one, such as glm-5.3:zdr, is refused with 404 not_found_model; drop the suffix. Zero retention has the rule.
Pricing#
Prices are in EUR per 1M tokens, in three buckets: input, cached input and output. A cached input token is the cheapest, and a cache write is free because it is included in the input price. Reasoning tokens are output tokens, never a fourth price.
Prices are published and fixed per model. The price of a bucket does not depend on how a request is served, so a request is charged the price shown when it ran. The published price is the promise. This page prints no figure because the list changes; GET /v1/models returns the current prices for the key that asks, and the dashboard shows the same numbers.
Ask for the list#
The fields#
| Field | Meaning |
|---|---|
id | The string to send as model |
object | Always model |
created | When the model was added, Unix seconds |
owned_by | Always zdr.sh |
name | The display name, for example GLM 5.3 |
context_window, context_length | The context window under both names |
max_output_tokens | The largest output the model accepts |
input_modalities | text, image, video, file |
output_modalities | text on a chat model, embedding on an embedding model |
embedding_dimensions | The vector size on an embedding model, 0 on a chat model |
reasoning | Whether the model can think before answering |
supported_reasoning_efforts | The values reasoning_effort may take, [] when the model has no effort control |
supports_tools | Whether the model can call tools |
input_eur_per_1m, cached_eur_per_1m, output_eur_per_1m | The price of each bucket, in EUR per million tokens |
Anthropic shape#
Send an anthropic-version header and the answer is the Anthropic list shape. The ids are the same; the metadata is the minimum the shape carries.
A claude- id is never listed, even when the key maps one. Messages has the mapping.
Discovery in practice#
- opencode does not call this endpoint for a custom provider: list the models in
opencode.json - Hermes Agent probes it, so a model added to the list shows up without a config change
- Claude Code keeps only ids containing
claudeoranthropic, so add zdr.sh ids by hand as in the Claude Code page