{"record":{"id":"bd626171e0cee77d","repo":"eyaltoledano/claude-task-master","slug":"validation-error","errorCode":"VALIDATION_ERROR","errorMessage":"validation.error || 'Invalid input'","messagePattern":"validation\\.error \\|\\| 'Invalid input'","errorType":"error_code","errorClass":"TaskMasterError","httpStatus":null,"severity":"error","filePath":"packages/tm-core/src/modules/ai/providers/base-provider.ts","lineNumber":100,"sourceCode":"\t\t\t\tERROR_CODES.AUTHENTICATION_ERROR\n\t\t\t);\n\t\t}\n\t\tthis.apiKey = config.apiKey;\n\t\tthis.model = config.model || this.getDefaultModel();\n\t}\n\n\t/**\n\t * Template method for generating completions\n\t * Handles validation, retries, and error handling\n\t */\n\tasync generateCompletion(\n\t\tprompt: string,\n\t\toptions?: AIOptions\n\t): Promise<AIResponse> {\n\t\t// Validate input\n\t\tconst validation = this.validateInput(prompt, options);\n\t\tif (!validation.valid) {\n\t\t\tthrow new TaskMasterError(\n\t\t\t\tvalidation.error || 'Invalid input',\n\t\t\t\tERROR_CODES.VALIDATION_ERROR\n\t\t\t);\n\t\t}\n\n\t\t// Prepare request\n\t\tconst prepared = this.prepareRequest(prompt, options);\n\n\t\t// Execute with retry logic\n\t\tlet lastError: Error | undefined;\n\t\tconst maxRetries = this.getMaxRetries();\n\n\t\tfor (let attempt = 1; attempt <= maxRetries; attempt++) {\n\t\t\ttry {\n\t\t\t\tconst startTime = Date.now();\n\t\t\t\tconst result = await this.generateCompletionInternal(\n\t\t\t\t\tprepared.prompt,\n\t\t\t\t\tprepared.options","sourceCodeStart":82,"sourceCodeEnd":118,"githubUrl":"https://github.com/eyaltoledano/claude-task-master/blob/c0c98d367c55296bfe69e65680625b6db437af02/packages/tm-core/src/modules/ai/providers/base-provider.ts#L82-L118","documentation":"generateCompletion() runs validateInput(prompt, options) before any network call; if validation fails it converts the validation message (or the generic 'Invalid input') into a TaskMasterError with code VALIDATION_ERROR. This aggregates prompt problems (missing/empty/too long) and options problems (bad temperature/maxTokens).","triggerScenarios":"generateCompletion with an empty or oversized prompt (> MAX_PROMPT_LENGTH chars); options.temperature outside [MIN_TEMPERATURE, MAX_TEMPERATURE] (e.g. 1.5); negative or huge maxTokens; any invalid options object shape.","commonSituations":"Passing a raw model output back as a prompt (accumulating past token limits); temperature tuned outside the provider's allowed 0–1 range; maxTokens set to 0 by a caller computing a budget that came out empty.","solutions":["Fix the reported validation.error field on the thrown TaskMasterError (it names the exact problem)","Clamp options: temperature between 0 and 1 (MIN/MAX_TEMPERATURE), maxTokens within the provider's allowed range","Check prompt length and trim it below MAX_PROMPT_LENGTH before calling"],"exampleFix":"// before\nawait provider.generateCompletion(prompt, { temperature: 1.5 });\n// after\nawait provider.generateCompletion(prompt, {\n  temperature: Math.min(1, Math.max(0, temperature)),\n  maxTokens: Math.max(1, Math.min(MAX_MAX_TOKENS, maxTokens))\n});","handlingStrategy":"validation","validationCode":"function prevalidate(prompt: string, options?: AIOptions): boolean {\n  if (!prompt || !prompt.trim()) return false;\n  if (options) {\n    if (options.temperature !== undefined && (options.temperature < 0 || options.temperature > 1)) return false;\n    if (options.maxTokens !== undefined && options.maxTokens <= 0) return false;\n  }\n  return true;\n}","typeGuard":null,"tryCatchPattern":"try {\n  return await provider.generateCompletion(prompt, options);\n} catch (err) {\n  if (err instanceof TaskMasterError && err.code === ERROR_CODES.VALIDATION_ERROR) {\n    console.error('Input rejected:', err.message);\n    return generateWithDefaults(); // retry with clamped/default options\n  }\n  throw err;\n}","preventionTips":["Clamp temperature/maxTokens to documented ranges before sending","Truncate prompts that exceed MAX_PROMPT_LENGTH","Inspect err.message on VALIDATION_ERROR — it names the exact failing field","Centralize AI options construction in one validated factory"],"tags":["ai-provider","validation","options","request-input"],"backgroundTag":"request-validation-failed","analyzedSha":"c0c98d367c55296bfe69e65680625b6db437af02","analyzedAt":"2026-08-29T02:56:26.071Z","schemaVersion":2},"datasetVersion":"2026-08-29T07:17:48.351Z"}