eyaltoledano/claude-task-master · error · Error

maxTokens must be a finite number greater than 0

Error message

maxTokens must be a finite number greater than 0

What it means

validateOptionalParams() checks maxTokens: it must be a finite number greater than 0. The value is coerced with Number(), so non-numeric strings, NaN, Infinity, zero, and negatives are all rejected before the API call.

Source

Thrown at src/ai-providers/base-provider.js:227

		// Validate optional parameters
		this.validateOptionalParams(params);
	}

	/**
	 * Validates optional parameters like temperature and maxTokens
	 * @param {object} params - Parameters to validate
	 */
	validateOptionalParams(params) {
		if (
			params.temperature !== undefined &&
			(params.temperature < 0 || params.temperature > 1)
		) {
			throw new Error('Temperature must be between 0 and 1');
		}
		if (params.maxTokens !== undefined) {
			const maxTokens = Number(params.maxTokens);
			if (!Number.isFinite(maxTokens) || maxTokens <= 0) {
				throw new Error('maxTokens must be a finite number greater than 0');
			}
		}
	}

	/**
	 * Validates message array structure
	 */
	validateMessages(messages) {
		if (!messages || !Array.isArray(messages) || messages.length === 0) {
			throw new Error('Invalid or empty messages array provided');
		}

		for (const msg of messages) {
			if (!msg.role || !msg.content) {
				throw new Error(
					'Invalid message format. Each message must have role and content'
				);
			}

View on GitHub (pinned to c0c98d367c)

Solutions

  1. Pass a positive finite integer, e.g., maxTokens: 4096
  2. Parse and validate: Number.isFinite(Number(v)) && Number(v) > 0 before calling
  3. If read from config/CLI, coerce with parseInt/parseFloat and clamp to a sane minimum

Example fix

// before
await provider.generateText({ ..., maxTokens: 'unlimited' });
// after
await provider.generateText({ ..., maxTokens: 4096 });
Defensive patterns

Strategy: validation

Validate before calling

const mt = Number(params.maxTokens);
if (params.maxTokens !== undefined && (!Number.isFinite(mt) || mt <= 0)) throw new Error('maxTokens must be a finite number > 0');

Type guard

function isValidMaxTokens(v) { return v === undefined || (Number.isFinite(Number(v)) && Number(v) > 0); }

Try / catch

try {
  await provider.generateText(params);
} catch (err) {
  if (err.message.startsWith('maxTokens must be')) {
    params.maxTokens = 4096; // sensible default
  } else throw err;
}

Prevention

When it happens

Trigger: Passing maxTokens as 0, a negative number, 'many' (non-numeric string), NaN, or Infinity in params to any generation method.

Common situations: Reading maxTokens from CLI args or config as a string that fails Number(); computing a token budget that underflows to 0 or negative; JSON config with a null/invalid value.

Related errors


AI-assisted analysis of eyaltoledano/claude-task-master@c0c98d367c (2026-08-29). Data as JSON: /api/errors/74ee773053dd8ecb. Report an issue: GitHub.