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
- Pass a positive finite integer, e.g., maxTokens: 4096
- Parse and validate: Number.isFinite(Number(v)) && Number(v) > 0 before calling
- 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
- Parse numeric config/CLI values with parseInt/parseFloat before use
- Reject 0/negatives/NaN at config-load time
- Use a shared options-validation helper before any provider call
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
- Parameter validation failed: ${errors.join('; ')}
- Temperature must be between 0 and 1
- Invalid or empty messages array provided
- Object name is required for object generation
- MFA_VERIFICATION_FAILED
AI-assisted analysis of eyaltoledano/claude-task-master@c0c98d367c (2026-08-29).
Data as JSON: /api/errors/74ee773053dd8ecb.
Report an issue: GitHub.