{"record":{"id":"3590bbd1810a5fdd","repo":"deepseek-ai/deepseek-harness","slug":"llm-pi-ai-provider-provider-defaultinput-mus","errorCode":null,"errorMessage":"llm-pi-ai: provider \"${provider}\" defaultInput must name at least one modality","messagePattern":"llm-pi-ai: provider \"(.+?)\" defaultInput must name at least one modality","errorType":"validation","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"packages/llm/llm-pi-ai/src/config.ts","lineNumber":423,"sourceCode":"    if (!Number.isInteger(maxRequestImageBytes) || maxRequestImageBytes <= 0) {\n      throw new Error(`llm-pi-ai: provider \"${provider}\" maxRequestImageBytes must be a positive integer`)\n    }\n    const requestImagePixelBudget = source.requestImagePixelBudget ?? DEFAULT_REQUEST_IMAGE_PIXEL_BUDGET\n    if (!Number.isSafeInteger(requestImagePixelBudget) || requestImagePixelBudget <= 0) {\n      throw new Error(`llm-pi-ai: provider \"${provider}\" requestImagePixelBudget must be a positive safe integer`)\n    }\n    const requestImageMaxBytes = source.requestImageMaxBytes ?? DEFAULT_REQUEST_IMAGE_MAX_BYTES\n    if (!Number.isSafeInteger(requestImageMaxBytes) || requestImageMaxBytes <= 0) {\n      throw new Error(`llm-pi-ai: provider \"${provider}\" requestImageMaxBytes must be a positive safe integer`)\n    }\n    // Detached from the configuration object because pi-ai types `Model.input`\n    // mutable. The schema's explicit default covers an absent key, so an empty\n    // list here is always one someone typed — and unlike an entry's, nothing\n    // below it can answer instead — so it is refused rather than read as \"no\n    // answer\".\n    const defaultInput = [...source.defaultInput ?? DEFAULT_INPUT]\n    if (defaultInput.length === 0) {\n      throw new Error(`llm-pi-ai: provider \"${provider}\" defaultInput must name at least one modality`)\n    }\n    // The route key, not the installed provider's own name: the directory has\n    // always shown route keys, and a catalog route must not silently rename\n    // itself on every configuration surface just because it gained a profile.\n    const displayName = source.displayName ?? provider\n    const catalog = resolveRouteModels({\n      provider,\n      ...source.api === undefined ? {} : { api: source.api },\n      ...source.baseURL === undefined ? {} : { baseURL: source.baseURL },\n      ...source.models === undefined ? {} : { models: source.models },\n      ...source.modelOverrides === undefined ? {} : { modelOverrides: source.modelOverrides },\n      ...source.compat === undefined ? {} : { compat: source.compat },\n      defaultInput,\n      defaultContextWindow: source.defaultContextWindow ?? DEFAULT_CONTEXT_WINDOW,\n      defaultMaxTokens: source.defaultMaxTokens ?? DEFAULT_MAX_TOKENS,\n    })\n    const { apiKeyEnv, retryPolicy, models: _models, displayName: _displayName, ...rest } = source\n    resolved.set(provider, {","sourceCodeStart":405,"sourceCodeEnd":441,"githubUrl":"https://github.com/deepseek-ai/deepseek-harness/blob/b150a551b8d465e31e418e1b2eaf5e79bbb7d28e/packages/llm/llm-pi-ai/src/config.ts#L405-L441","documentation":"Error \"llm-pi-ai: provider \"${provider}\" defaultInput must name at least one modality\" thrown in deepseek-ai/deepseek-harness.","triggerScenarios":"Thrown at packages/llm/llm-pi-ai/src/config.ts:423 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":["Set defaultInput to at least one modality."],"exampleFix":null,"handlingStrategy":null,"validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":[],"tags":[],"backgroundTag":null,"analyzedSha":"b150a551b8d465e31e418e1b2eaf5e79bbb7d28e","analyzedAt":"2026-08-24T18:12:29.105Z","schemaVersion":2},"datasetVersion":"2026-08-24T22:17:12.610Z"}