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

  1. Set maxTokens to the model's actual positive output-token limit
  2. Remove the maxTokens field if you want the default instead of 0
  3. 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

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


AI-assisted analysis of can1357/oh-my-pi@9690622007 (2026-08-31). Data as JSON: /api/errors/1524b23b341778ec. Report an issue: GitHub.