Models
Configure which models appear in the UI and set your defaults.
Models
The models your agent can use are defined in ~/.jean2/models.json. This file controls what appears in the client's model picker.
The server filters the list based on your configured API keys — if you don't have a key set up for a provider, its models won't appear in the picker regardless of what's in this file.
File structure
{
"providers": [
{
"id": "provider-id",
"name": "Display Name",
"models": [
{
"id": "model-id",
"name": "Model Display Name",
"contextWindow": 128000,
"maxOutputTokens": 16384,
"tier": "standard",
"capabilities": {
"input": {
"text": true,
"image": true,
"video": false,
"file": ["application/pdf"]
}
}
}
]
}
],
"defaultModel": "model-id",
"defaultProvider": "provider-id"
}
Top-level fields
| Field | Description |
|---|---|
providers |
Array of provider objects |
defaultModel |
Model used when a preconfig doesn't define its own model, and as a fallback for compaction |
defaultProvider |
Provider used when a preconfig doesn't define its own model, and as a fallback for compaction |
Provider fields
| Field | Description |
|---|---|
id |
The provider ID registered with AI SDK (e.g. openai, anthropic, codex) |
name |
Display name shown in the UI |
models |
Array of model objects available under this provider |
Model fields
| Field | Description |
|---|---|
id |
The model ID as expected by the provider. Sent directly to the LLM API via AI SDK. |
name |
Display name shown in the model picker |
contextWindow |
Maximum context length in tokens |
maxOutputTokens |
(optional) Maximum output tokens the model can produce |
tier |
budget, standard, or premium — for your own organization |
variants |
(optional) Named presets that override provider options |
capabilities |
(optional) Declares what input types the model supports |
Variants
Some models support variants — presets that adjust provider-specific settings. Each variant key is a name, and its value is an object with providerOptions that get merged into the request.
{
"id": "my-model",
"name": "My Model",
"variants": {
"low": { "providerOptions": { "reasoningEffort": "low" } },
"high": { "providerOptions": { "reasoningEffort": "high" } }
}
}
Variants appear as sub-options in the model picker.
Capabilities
The capabilities field declares what input types a model supports. This is informational — it doesn't enforce anything, but it powers the client's UI to show or hide features like image upload.
{
"id": "my-model",
"name": "My Model",
"capabilities": {
"input": {
"text": true,
"image": true,
"video": true,
"file": ["application/pdf"]
}
}
}
| Field | Description |
|---|---|
input.text |
Whether the model supports text input |
input.image |
Whether the model supports image input |
input.video |
Whether the model supports video input |
input.file |
Array of MIME types the model can process (e.g. ["application/pdf", "text/csv"]) |
If capabilities is omitted, the model is assumed to support text input only.
Default config
The default models.json created by jean2 init includes MiniMax, Zhipu Coding, and Codex (ChatGPT subscription). This is just a starting point — edit it to match what you actually use.
Keeping the list clean
The model picker in the client shows exactly what's in this file. If you only use two models from a provider, remove the rest. The file is your UI — shape it the way you want.
Applying changes
Restart the server after editing models.json:
jean2 restart