can1357/oh-my-pi · error
Provider ${providerName}, model ${modelDef.id}: invalid maxT
Error message
Provider ${providerName}, model ${modelDef.id}: invalid maxTokens What it means
Thrown by validateProviderConfiguration in models-config mode when a model declares maxTokens (max output tokens) that is zero or negative. Max output tokens cap response generation; a non-positive value is nonsensical and rejected. Like the contextWindow check, it only runs when parsing models-config files, not during runtime registerProvider.
Source
Thrown at packages/coding-agent/src/config/models-config.ts:101
}
for (const modelDef of models) {
if (!hasProviderApi && !modelDef.api) {
throw new Error(
mode === "runtime-register"
? `Provider ${providerName}, model ${modelDef.id}: no "api" specified.`
: `Provider ${providerName}, model ${modelDef.id}: no "api" specified. Set at provider or model level.`,
);
}
if (!modelDef.id) {
throw new Error(`Provider ${providerName}: model missing "id"`);
}
if (mode === "models-config") {
if (modelDef.contextWindow !== undefined && modelDef.contextWindow <= 0) {
throw new Error(`Provider ${providerName}, model ${modelDef.id}: invalid contextWindow`);
}
if (modelDef.maxTokens !== undefined && modelDef.maxTokens <= 0) {
throw new Error(`Provider ${providerName}, model ${modelDef.id}: invalid maxTokens`);
}
}
}
}
export const ModelsConfigFile = new ConfigFile<ModelsConfig>("models", {
kind: "deferred",
resolve: getModelsConfigSchema,
}).withValidation("models", config => {
const providers = config.providers ?? {};
for (const providerName in providers) {
const providerConfig = providers[providerName];
validateProviderConfiguration(
providerName,
{
baseUrl: providerConfig.baseUrl,
headers: providerConfig.headers,
apiKey: providerConfig.apiKey,View on GitHub (pinned to 9690622007)
Solutions
- Set maxTokens to the model's actual positive output-token limit
- Remove the maxTokens field if you want the default instead of 0
- Fix the generating script/template so it emits a positive integer
Example fix
// before
{ "id": "my-model", "maxTokens": 0 }
// after
{ "id": "my-model", "maxTokens": 8192 } Defensive patterns
Strategy: validation
Validate before calling
function assertMaxTokens(cfg) {
(cfg.models ?? []).forEach(m => {
if (m.maxTokens !== undefined && m.maxTokens <= 0) throw new Error(`${m.id}: maxTokens must be > 0`);
});
} Type guard
function hasPositiveMaxTokens(m) { return m.maxTokens === undefined || (Number.isFinite(m.maxTokens) && m.maxTokens > 0); } Try / catch
try { registerProvider(cfg); } catch (e) { if (String(e).includes('invalid maxTokens')) { logger.error('Fix non-positive maxTokens', { provider: cfg.name }); } else throw e; } Prevention
- Encode 'default/unlimited' by omitting the field, never with 0
- Validate numeric config fields are positive integers after any script generates them
- Keep maxTokens <= contextWindow in your own sanity checks
When it happens
Trigger: Loading a models-config file where a model entry has maxTokens <= 0 while the value is present (undefined is allowed).
Common situations: Placeholder 0 left in a config; a script computing maxTokens from another field that returned 0; confusion between 'unlimited' encoded as 0 (unsupported — omit the field instead).
Understand the failure class
Background: "Invalid value" and "allowed values are" config errors: what your library rejected and how to fix it — this error's family across 41 libraries.
Related errors
- Provider ${providerName}, model ${modelDef.id}: invalid cont
- Failed to load tree-sitter language: {err}
- Destination option ${key} must be a string
- Destination option ${key} must be a finite number
- Destination option ${key} must be a boolean
AI-assisted analysis of can1357/oh-my-pi@9690622007 (2026-08-31).
Data as JSON: /api/errors/1524b23b341778ec.
Report an issue: GitHub.