Custom Models, Providers, and Model Packs
You can extend Plandex with custom models, providers, and model packs using a JSON file.
plandex models custom # edit the custom models file
\models custom # REPL
The first time you run this command, a template file with examples will be created and opened in your preferred editor.
The template file uses a JSON schema, allowing most editors to provide autocomplete, validation, and inline documentation.
Support Levels
The level of custom model support depends on how you use Plandex.
Self-hosted: Everything - custom models, providers, and model packs are fully supported.
Cloud with BYO API Keys: Custom models and model packs. Models can only use built-in providers.
Cloud with Integrated Models: Custom model packs. Model packs can only use built-in models.
Basic Example
Here's a minimal example that adds a model from Together.ai:
{
"$schema": "https://plandex.ai/schemas/models-input.schema.json",
"providers": [
{
"name": "togetherai",
"baseUrl": "https://api.together.xyz/v1",
"apiKeyEnvVar": "TOGETHER_API_KEY"
}
],
"models": [
{
"modelId": "meta-llama/llama-4-maverick",
"publisher": "meta-llama",
"description": "Meta Llama 4 Maverick",
"defaultMaxConvoTokens": 75000,
"maxTokens": 1048576,
"maxOutputTokens": 16000,
"reservedOutputTokens": 16000,
"preferredOutputFormat": "xml",
"providers": [
{
"provider": "custom",
"customProvider": "togetherai",
"modelName": "meta-llama/Llama-4-Maverick-17B-128E-Instruct-FP8"
}
]
}
]
}
Custom Providers
Define providers that use OpenAI-compatible APIs:
{
"providers": [
{
"name": "local-llm",
"baseUrl": "http://localhost:8080/v1",
"skipAuth": true
},
{
"name": "my-provider",
"baseUrl": "https://api.myprovider.com/v1",
"apiKeyEnvVar": "MY_PROVIDER_API_KEY"
}
]
}
Provider Settings
name
- Unique identifier for the providerbaseUrl
- API endpoint (must be OpenAI-compatible)apiKeyEnvVar
- Environment variable containing the API keyskipAuth
- Set totrue
for local models that don't need authenticationextraAuthVars
- Additional authentication variables if needed
Custom Models
Define models with their capabilities and provider mappings:
{
"$schema": "https://plandex.ai/schemas/models-input.schema.json",
"models": [
{
"modelId": "my-model",
"publisher": "My Company",
"description": "My Custom Model",
"defaultMaxConvoTokens": 50000,
"maxTokens": 128000,
"maxOutputTokens": 8192,
"reservedOutputTokens": 8192,
"preferredOutputFormat": "xml",
"providers": [
{
"provider": "custom",
"customProvider": "my-provider",
"modelName": "exact-model-name-on-provider"
},
{
"provider": "openrouter",
"modelName": "my-company/my-model"
}
]
}
]
}
Model Settings
modelId
- Unique identifier used in model packsmaxTokens
- Total token limit (input + output)maxOutputTokens
- Maximum output tokens the model can generatereservedOutputTokens
- Tokens reserved for output (affects effective input limit)preferredOutputFormat
- Either"xml"
or"tool-call-json"
providers
- List of providers that can serve this model
Custom Model Packs
Create your own combinations of models for different roles:
{
"$schema": "https://plandex.ai/schemas/models-input.schema.json",
"modelPacks": [
{
"name": "custom-pack",
"description": "Custom model pack for my use case",
"planner": "custom-model-publisher/model-name",
"coder": "anthropic/claude-sonnet-4",
"architect": "custom-model-publisher/model-name",
"summarizer": "openai/gpt-4.1",
"builder": {
"modelId": "anthropic/claude-sonnet-4",
"strongModel": "openai/o3-medium"
},
"wholeFileBuilder": {
"modelId": "anthropic/claude-sonnet-4",
"largeContextFallback": {
"modelId": "google/gemini-2.5-pro",
"largeOutputFallback": "openai/o4-mini-low"
},
"errorFallback": "openai/gpt-4.1"
},
"names": "openai/gpt-4.1-mini",
"commitMessages": "openai/gpt-4.1-mini",
"autoContinue": "openai/o4-mini-medium"
}
]
}
Model Pack Settings
name
- The name of the model packdescription
- A description of the model packlocalProvider
- The local provider to default to for the model pack. Currently onlyollama
is supported. This must be set for the model pack to use local models via ollama.
Custom model packs can be configured with the same roles as built-in model packs:
planner
(required)architect
(optional, defaults toplanner
)coder
(optional, defaults toplanner
)summarizer
(required)builder
(required)wholeFileBuilder
(optional, defaults tobuilder
)names
(optional)commitMessages
(optional)autoContinue
(optional)
Role Config
For each role set in the model pack, you can either use a simple string (the model ID) or a config object with these settings:
modelId
- The model to use (required when using object form)temperature
- Controls randomness (0-2, role-specific defaults)topP
- Alternative randomness control (0-1)largeContextFallback
- Model to use when context is largelargeOutputFallback
- Model to use when output needs to be largeerrorFallback
- Model to use if the primary model failsstrongModel
- Stronger model for complex tasks
When using a config object, all settings except modelId
are optional.
Complete Example
Here's a full example combining providers
, models
, and modelPacks
:
{
"$schema": "https://plandex.ai/schemas/models-input.schema.json",
"providers": [
{
"name": "replicate",
"baseUrl": "https://api.replicate.com/v1",
"apiKeyEnvVar": "REPLICATE_API_KEY"
}
],
"models": [
{
"modelId": "llama-4-maverick-70b",
"publisher": "meta",
"description": "Llama 4 Maverick 70B",
"defaultMaxConvoTokens": 50000,
"maxTokens": 128000,
"maxOutputTokens": 8192,
"reservedOutputTokens": 8192,
"preferredOutputFormat": "xml",
"providers": [
{
"provider": "custom",
"customProvider": "replicate",
"modelName": "meta/llama-4-maverick-70b"
}
]
}
],
"modelPacks": [
{
"name": "hybrid-local-cloud",
"description": "Local models for simple tasks, cloud for complex",
"planner": "anthropic/claude-opus-4",
"coder": "anthropic/claude-sonnet-4",
"architect": "anthropic/claude-sonnet-4",
"summarizer": "llama-4-maverick-70b",
"builder": "anthropic/claude-sonnet-4",
"names": "llama-4-maverick-70b",
"commitMessages": "llama-4-maverick-70b",
"autoContinue": "llama-4-maverick-70b"
}
]
}
Notes
- All custom providers must be OpenAI-compatible.
- Model IDs must be unique across built-in and custom models.
- Provider names must be unique across built-in and custom providers.