Model capabilities
Model capabilities
The catalogue is the source of truth. This page explains how to read it, not what the
current values are: those change as models are added, and a table copied into a page is a
table that is already wrong.
curl -s https://hisoka.ai/api/v1/models \
| jq '.data[] | {id, is_free, ctx: .context_window, out: .max_output, mod: .capabilities.modalities, tools: .capabilities.tools}'
The fields
| Field | Meaning |
|---|---|
context_window |
The whole window, shared by input and output. |
max_input_tokens |
The prompt budget. Equal to the window, deliberately. |
max_output |
The completion ceiling for that model. |
capabilities.modalities |
What you may send: text, image, video, audio. |
capabilities.tools |
Whether a tool schema may be sent at all. |
capabilities.reasoning |
Whether the model reasons, and accepts reasoning_effort. |
capabilities.prompt_cache |
Whether cached input is discounted. |
Why max_input_tokens equals the window
Input and output share one window, so a completion cap is a ceiling and not a reservation.
Subtracting the cap from the window would publish a prompt budget far smaller than reality:
on a 1M-context model with a 1.04M completion ceiling, that subtraction reports about 8192
tokens. A coding agent reads that field to size its own budget, compacts almost
immediately, and refuses ordinary work.
Both numbers are the window because either can use the whole of it. The only real
constraint is that prompt plus completion must fit inside it.
Modalities
Sending an image or video to a model that does not list it is refused at the gateway with
400 modality_not_supported, before any provider is reached. That is deliberate: a
forwarded unknown part used to reach the provider and come back as an HTTP 500, which
read as our outage rather than your request.
A modality the model does list has a working path to the provider. A model advertising
video that silently drops the clip would bill you for a reply that never saw it, so the
two directions are both checked.
Reasoning models
A reasoning model may spend its whole completion budget thinking and return empty content
with finish_reason: "stop".
That is a finished turn, not an outage. The gateway keeps content empty, records
reasoning_only in the reply metadata, and only retries when finish_reason is length.
Retrying a thinking-only turn pays twice for an answer already delivered.
Practical floors observed on this gateway:
| Model family | Smallest cap that answers |
|---|---|
| deepseek | 64 tokens |
| glm | 256 tokens at reasoning_effort: max |
The gateway raises a cap below 256 for a reasoning model and reports it as
cap_raised_from in the response, so a raised cap is visible rather than silent.
reasoning_effort values are clipped to what the model implements. A model that does not
support none receives the nearest level it does support, because some families paste
their inner monologue into content when handed an effort they treat as invalid.
Choosing a model for an agent
Three checks, in order:
capabilities.toolsistrue, or the agent cannot do anything.context_windowis large enough for the repository or document you are working in.capabilities.reasoningmatches the work: on for planning and multi-step repair, off
for fast mechanical edits.
Speed varies by an order of magnitude between models on the same prompt, so measure a tool
heavy turn before blaming the gateway for a timeout.
Prompt caching
Where capabilities.prompt_cache is true, cached input is billed at a discounted rate and
the catalogue publishes the cached rate in pricing for that model. A long session reusing
a large prefix benefits most; a one-shot request does not.