Model Sizes
Updated August 15, 2026
A hero asks for a model size, not a model id: small, standard, or large. Sizes are what makes one hero catalog work for everybody. “Seeker runs large” means something whether you run Claude Code, Codex, or an agent that shipped last week; “Seeker runs opus” only means something to half of them.
crystl ships no size-to-model table
There is no built-in list of which model is large for which agent, and that is deliberate. Model ids churn constantly, there are more agent CLIs every month, and a table compiled into the app is stale the moment a provider renames something. Serving the table from crystl.dev would only move the staleness somewhere else, and either way it could only ever cover the agents we thought to list.
So the map is learned. Your agent knows its own models, ships that knowledge with its own releases, and is already running on your machine. You fill the map in once, or your agent fills in its own.
A size is a launch command
What a size holds is the complete command you would type in a terminal: claude --model opus --effort high, codex -m gpt-5.6-terra, /opt/bin/my-agent --fast. Paths, leading environment assignments, and every argument are preserved exactly. A command needs no convention to interpret, and it says which agent it is for, so it works the same whichever agent asks.
A bare model id still works. crystl composes it into a command through the agent’s known convention, and rewrites it as the full command the next time you edit that profile. Shell pipelines, redirects, substitutions, and command lists belong in a wrapper script.
The two places a size is decided
Both live under Settings → agents.
defaults holds exactly three raw launch commands, one per size. That is the fallback for whenever nothing names an agent: an unassigned hero, a quest member, a fan-out worker.
agents holds one record per callable agent, and small, standard, and large are properties of that agent. This is what answers the question when something does name an agent.
An explicitly chosen model or a hero’s own command pin still wins over both.
Filling it in
Two ways, both writing the same map.
In the app: Settings → agents → agents. Each native profile or configured exact command has a row with small, standard, and large fields. Each field accepts the complete start command you want for that size, or the bare model id you would pass to that agent. Custom commands and exact full-command rows also show MODEL VIA, which tells crystl how to deliver a bare model id. The three generic fallbacks live one tab over, under defaults.
From an agent: crystl agent profile shows what has been learned so far, crystl agent list shows the callable agents, and crystl agent profile set teaches one.
crystl agent profile # what crystl knows
crystl agent profile show --agent codex # one agent
crystl agent profile set --agent codex \
--small gpt-5.6-luna --standard gpt-5.6-sol --large gpt-5.6-terra
crystl agent profile set --agent claude \
--small 'claude --model haiku --effort low' \
--standard 'claude --model sonnet --effort high' \
--large 'claude --model opus --effort max'
crystl agent profile set --agent 'npx my-agent --fast' \
--small model-mini --standard model-pro --large model-max \
--model-via '--model {model}'
Pick the agent’s cheapest and fastest setup for --small, its everyday default for --standard, and its most capable for --large. Each size accepts a bare model-id shorthand or a complete exact start command. Only the sizes you pass are changed, so you can fill one in now and the rest later, and passing an empty string clears one. Both the read and the write are free on every tier: it is local machine config with no abuse surface, and a free account’s heroes should not be stuck on the wrong model with no way to say otherwise.
Profiles are keyed by the normalized launch command, not only the binary name. A bare seeded command resolves to its native profile, so recognized aliases such as agy and antigravity share one row. A path such as /opt/bin/codex, a command with arguments, a leading environment assignment, a wrapper such as npx my-agent, or any other full custom command gets its own exact profile. When crystl recognizes the executable, that exact profile can inherit untouched native size mappings and delivery settings without sharing its overrides with another command. Profiles are stored at ~/.config/crystl/agent-profiles.json.
crystl already knows the model convention for its native integrations. A custom command using bare model ids needs a MODEL VIA template with exactly one {model}: '-m {model}', '--model {model}', or 'MODEL={model}'. Argument templates are appended to the full command; the environment form is prefixed. A complete command in the size field needs no MODEL VIA template because it already says exactly what to run. crystl never guesses an unknown CLI’s convention.
Pointing a size at an endpoint
Anywhere you can write a model you can write model@endpoint, naming one of your open-model connections: glm-4.6@glm. That includes inside a command’s own --model flag, so claude --model glm-4.6@glm is a size value like any other.
A connection can also be bound to a CLI. Give the endpoint a start command and the pairing becomes a callable agent spelled command@endpoint, such as claude@glm, with its own small, standard, and large. It shows up in crystl agent list and in the agents tab like any other agent. Typing that spelling into a size field instead is caught with a hint showing the accepted forms, since an agent name is not a model. A size on that agent’s own row holds a model id the connection serves, such as glm-4.6, or a complete start command. The connection’s label is not a model id.
Nothing breaks without a profile
A size is a hint that is allowed to evaporate. If the command has no profile, or the requested size has no mapping, crystl passes no model selection at all and the agent launches on whatever it is configured to run. If a custom command has a selected model but no MODEL VIA convention, crystl does not invent one; the launch surface warns or refuses instead of aiming at an unknown model syntax.
That is also how heroes and quest members behave generally now: they inherit your agent’s own model unless something more deliberate says otherwise. Ordinary shard create has always worked that way, and heroes match it.
Which model actually launches
Three steps, most deliberate first:
- An explicit model. The hero’s own pin, or
--modelon the summon. A deliberate choice always wins. A pin that is a complete command replaces the whole launch, so it runs the agent it names. - The size. Through the named agent’s own three if something named an agent, otherwise through the three default launch commands.
- Nothing. No model selection at all, and the agent runs its own configured model.
Related
- quest heroes for the catalog and what else a hero carries.
- hero shards for summoning one specialist on its own.
- Starting a quest for the model size control, which launches a whole party at one size.
- CLI reference for every flag on
crystl agent profile.