{"record":{"id":"74ee773053dd8ecb","repo":"eyaltoledano/claude-task-master","slug":"maxtokens-must-be-a-finite-number-greater-than-0","errorCode":null,"errorMessage":"maxTokens must be a finite number greater than 0","messagePattern":"maxTokens must be a finite number greater than 0","errorType":"validation","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"src/ai-providers/base-provider.js","lineNumber":227,"sourceCode":"\t\t// Validate optional parameters\n\t\tthis.validateOptionalParams(params);\n\t}\n\n\t/**\n\t * Validates optional parameters like temperature and maxTokens\n\t * @param {object} params - Parameters to validate\n\t */\n\tvalidateOptionalParams(params) {\n\t\tif (\n\t\t\tparams.temperature !== undefined &&\n\t\t\t(params.temperature < 0 || params.temperature > 1)\n\t\t) {\n\t\t\tthrow new Error('Temperature must be between 0 and 1');\n\t\t}\n\t\tif (params.maxTokens !== undefined) {\n\t\t\tconst maxTokens = Number(params.maxTokens);\n\t\t\tif (!Number.isFinite(maxTokens) || maxTokens <= 0) {\n\t\t\t\tthrow new Error('maxTokens must be a finite number greater than 0');\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Validates message array structure\n\t */\n\tvalidateMessages(messages) {\n\t\tif (!messages || !Array.isArray(messages) || messages.length === 0) {\n\t\t\tthrow new Error('Invalid or empty messages array provided');\n\t\t}\n\n\t\tfor (const msg of messages) {\n\t\t\tif (!msg.role || !msg.content) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t'Invalid message format. Each message must have role and content'\n\t\t\t\t);\n\t\t\t}","sourceCodeStart":209,"sourceCodeEnd":245,"githubUrl":"https://github.com/eyaltoledano/claude-task-master/blob/c0c98d367c55296bfe69e65680625b6db437af02/src/ai-providers/base-provider.js#L209-L245","documentation":"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.","triggerScenarios":"Passing maxTokens as 0, a negative number, 'many' (non-numeric string), NaN, or Infinity in params to any generation method.","commonSituations":"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.","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"],"exampleFix":"// before\nawait provider.generateText({ ..., maxTokens: 'unlimited' });\n// after\nawait provider.generateText({ ..., maxTokens: 4096 });","handlingStrategy":"validation","validationCode":"const mt = Number(params.maxTokens);\nif (params.maxTokens !== undefined && (!Number.isFinite(mt) || mt <= 0)) throw new Error('maxTokens must be a finite number > 0');","typeGuard":"function isValidMaxTokens(v) { return v === undefined || (Number.isFinite(Number(v)) && Number(v) > 0); }","tryCatchPattern":"try {\n  await provider.generateText(params);\n} catch (err) {\n  if (err.message.startsWith('maxTokens must be')) {\n    params.maxTokens = 4096; // sensible default\n  } else throw err;\n}","preventionTips":["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"],"tags":["validation","parameters","maxtokens","type-check"],"backgroundTag":"parameter-validation-failed","analyzedSha":"c0c98d367c55296bfe69e65680625b6db437af02","analyzedAt":"2026-08-29T02:56:26.071Z","schemaVersion":2},"datasetVersion":"2026-08-29T07:17:48.351Z"}