{"record":{"id":"514c699fbc2fbd47","repo":"deepseek-ai/deepseek-harness","slug":"llm-pi-ai-provider-provider-sets-provider","errorCode":null,"errorMessage":"llm-pi-ai: provider \"${provider}\" sets \"provider\", which moved to the providers dict key","messagePattern":"llm-pi-ai: provider \"(.+?)\" sets \"provider\", which moved to the providers dict key","errorType":"validation","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"packages/llm/llm-pi-ai/src/config.ts","lineNumber":361,"sourceCode":" * transform because the schema is also the shape a configuration surface\n * renders and the value an absent section resolves to; wrapping it would break\n * both.\n * @param config - the resolved section to check.\n * @throws Error naming the route and model that cannot be served.\n */\nexport function assertServiceable(config: Config): void {\n  resolveProfiles(config.providers)\n}\n\n/** Reject removed pre-release profile fields and name their replacements. */\nfunction rejectRemovedFields(provider: string, source: PiAiProviderProfile): void {\n  const legacy = source as PiAiProviderProfile & {\n    provider?: unknown\n    maxRetries?: unknown\n    maxRetryDelayMs?: unknown\n  }\n  if ('provider' in legacy) {\n    throw new Error(`llm-pi-ai: provider \"${provider}\" sets \"provider\", which moved to the providers dict key`)\n  }\n  if ('maxRetries' in legacy || 'maxRetryDelayMs' in legacy) {\n    throw new Error(\n      `llm-pi-ai: provider \"${provider}\" sets maxRetries or maxRetryDelayMs, which were removed;`\n      + ' compose agent recovery with dsh-llm-retry',\n    )\n  }\n}\n\n/**\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(","sourceCodeStart":343,"sourceCodeEnd":379,"githubUrl":"https://github.com/deepseek-ai/deepseek-harness/blob/b150a551b8d465e31e418e1b2eaf5e79bbb7d28e/packages/llm/llm-pi-ai/src/config.ts#L343-L379","documentation":"Error \"llm-pi-ai: provider \"${provider}\" sets \"provider\", which moved to the providers dict key\" thrown in deepseek-ai/deepseek-harness.","triggerScenarios":"Thrown at packages/llm/llm-pi-ai/src/config.ts:361 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":["Remove the inline \"provider\" field; the provider name now lives in the providers dict key."],"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"}