{"record":{"id":"1524b23b341778ec","repo":"can1357/oh-my-pi","slug":"provider-providername-model-modeldef-id-in-1524b2","errorCode":null,"errorMessage":"Provider ${providerName}, model ${modelDef.id}: invalid maxTokens","messagePattern":"Provider (.+?), model (.+?): invalid maxTokens","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"packages/coding-agent/src/config/models-config.ts","lineNumber":101,"sourceCode":"\t}\n\n\tfor (const modelDef of models) {\n\t\tif (!hasProviderApi && !modelDef.api) {\n\t\t\tthrow new Error(\n\t\t\t\tmode === \"runtime-register\"\n\t\t\t\t\t? `Provider ${providerName}, model ${modelDef.id}: no \"api\" specified.`\n\t\t\t\t\t: `Provider ${providerName}, model ${modelDef.id}: no \"api\" specified. Set at provider or model level.`,\n\t\t\t);\n\t\t}\n\t\tif (!modelDef.id) {\n\t\t\tthrow new Error(`Provider ${providerName}: model missing \"id\"`);\n\t\t}\n\t\tif (mode === \"models-config\") {\n\t\t\tif (modelDef.contextWindow !== undefined && modelDef.contextWindow <= 0) {\n\t\t\t\tthrow new Error(`Provider ${providerName}, model ${modelDef.id}: invalid contextWindow`);\n\t\t\t}\n\t\t\tif (modelDef.maxTokens !== undefined && modelDef.maxTokens <= 0) {\n\t\t\t\tthrow new Error(`Provider ${providerName}, model ${modelDef.id}: invalid maxTokens`);\n\t\t\t}\n\t\t}\n\t}\n}\n\nexport const ModelsConfigFile = new ConfigFile<ModelsConfig>(\"models\", {\n\tkind: \"deferred\",\n\tresolve: getModelsConfigSchema,\n}).withValidation(\"models\", config => {\n\tconst providers = config.providers ?? {};\n\tfor (const providerName in providers) {\n\t\tconst providerConfig = providers[providerName];\n\t\tvalidateProviderConfiguration(\n\t\t\tproviderName,\n\t\t\t{\n\t\t\t\tbaseUrl: providerConfig.baseUrl,\n\t\t\t\theaders: providerConfig.headers,\n\t\t\t\tapiKey: providerConfig.apiKey,","sourceCodeStart":83,"sourceCodeEnd":119,"githubUrl":"https://github.com/can1357/oh-my-pi/blob/969062200754ea02cfac922e5ebb8c608c079e15/packages/coding-agent/src/config/models-config.ts#L83-L119","documentation":"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.","triggerScenarios":"Loading a models-config file where a model entry has maxTokens <= 0 while the value is present (undefined is allowed).","commonSituations":"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).","solutions":["Set maxTokens to the model's actual positive output-token limit","Remove the maxTokens field if you want the default instead of 0","Fix the generating script/template so it emits a positive integer"],"exampleFix":"// before\n{ \"id\": \"my-model\", \"maxTokens\": 0 }\n// after\n{ \"id\": \"my-model\", \"maxTokens\": 8192 }","handlingStrategy":"validation","validationCode":"function assertMaxTokens(cfg) {\n  (cfg.models ?? []).forEach(m => {\n    if (m.maxTokens !== undefined && m.maxTokens <= 0) throw new Error(`${m.id}: maxTokens must be > 0`);\n  });\n}","typeGuard":"function hasPositiveMaxTokens(m) { return m.maxTokens === undefined || (Number.isFinite(m.maxTokens) && m.maxTokens > 0); }","tryCatchPattern":"try { registerProvider(cfg); } catch (e) { if (String(e).includes('invalid maxTokens')) { logger.error('Fix non-positive maxTokens', { provider: cfg.name }); } else throw e; }","preventionTips":["Encode 'default/unlimited' by omitting the field, never with 0","Validate numeric config fields are positive integers after any script generates them","Keep maxTokens <= contextWindow in your own sanity checks"],"tags":["config","validation","models"],"backgroundTag":"invalid-config-value","analyzedSha":"969062200754ea02cfac922e5ebb8c608c079e15","analyzedAt":"2026-08-31T10:29:35.737Z","schemaVersion":2},"datasetVersion":"2026-08-31T14:17:45.589Z"}