{"record":{"id":"b74c69cf7f83e8da","repo":"deepseek-ai/deepseek-harness","slug":"llm-pi-ai-provider-names-must-be-non-empty","errorCode":null,"errorMessage":"llm-pi-ai: provider names must be non-empty","messagePattern":"llm-pi-ai: provider names must be non-empty","errorType":"validation","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"packages/llm/llm-pi-ai/src/config.ts","lineNumber":389,"sourceCode":"/**\n * Validate profiles and return a detached route-keyed map suitable for\n * per-request reads. This is the one explicit resolve step, so an omitted dict\n * resolves to the empty (dormant) route set here rather than through a hidden\n * fallback, and each route's models and pi-ai provider are materialized once.\n * @param providers - configured provider profiles keyed by route.\n * @returns validated profiles in configuration order.\n */\nexport function resolveProfiles(\n  providers: Readonly<Record<string, PiAiProviderProfile>> | undefined,\n): Map<string, ResolvedPiAiProviderProfile> {\n  if (Array.isArray(providers)) {\n    throw new Error('llm-pi-ai: providers is now a dict keyed by provider route, not an array of profiles')\n  }\n  const entries = Object.entries(providers ?? {})\n  const resolved = new Map<string, ResolvedPiAiProviderProfile>()\n  for (const [provider, source] of entries) {\n    rejectRemovedFields(provider, source)\n    if (provider.length === 0) throw new Error('llm-pi-ai: provider names must be non-empty')\n    if (source.baseURL !== undefined && source.baseURL.length === 0) {\n      throw new Error(`llm-pi-ai: provider \"${provider}\" has an empty baseURL`)\n    }\n    if (source.displayName !== undefined && source.displayName.length === 0) {\n      throw new Error(`llm-pi-ai: provider \"${provider}\" has an empty displayName`)\n    }\n    const streamIdleTimeoutMs = source.streamIdleTimeoutMs ?? DEFAULT_STREAM_IDLE_TIMEOUT_MS\n    if (!Number.isFinite(streamIdleTimeoutMs)\n      || streamIdleTimeoutMs <= 0\n      || streamIdleTimeoutMs > MAX_TIMER_DELAY_MS) {\n      throw new Error(\n        `llm-pi-ai: provider \"${provider}\" streamIdleTimeoutMs must be a positive finite number no greater than ${MAX_TIMER_DELAY_MS}`,\n      )\n    }\n    const maxRequestImageBytes = source.maxRequestImageBytes ?? DEFAULT_MAX_REQUEST_IMAGE_BYTES\n    if (!Number.isInteger(maxRequestImageBytes) || maxRequestImageBytes <= 0) {\n      throw new Error(`llm-pi-ai: provider \"${provider}\" maxRequestImageBytes must be a positive integer`)\n    }","sourceCodeStart":371,"sourceCodeEnd":407,"githubUrl":"https://github.com/deepseek-ai/deepseek-harness/blob/b150a551b8d465e31e418e1b2eaf5e79bbb7d28e/packages/llm/llm-pi-ai/src/config.ts#L371-L407","documentation":"Error \"llm-pi-ai: provider names must be non-empty\" thrown in deepseek-ai/deepseek-harness.","triggerScenarios":"Thrown at packages/llm/llm-pi-ai/src/config.ts:389 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":["Give every provider a non-empty name."],"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"}