{"record":{"id":"eb48ed731722833a","repo":"moeru-ai/airi","slug":"provider-definition-with-id-definitionid-not","errorCode":null,"errorMessage":"Provider definition with id \"${definitionId}\" not found.","messagePattern":"Provider definition with id \"(.+?)\" not found\\.","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"packages/stage-ui/src/services/inference-service-providers.ts","lineNumber":103,"sourceCode":" * Use when:\n * - Wiring controller stores to provider domain operations.\n * - Tests need to replace the whole service surface with one mock object.\n *\n * Expects:\n * - No runtime dependencies are required yet.\n *\n * Returns:\n * - A stable object containing provider domain operations.\n */\nexport function createInferenceServiceProvidersService(): InferenceServiceProvidersService {\n  function requestOptions(options?: InferenceServiceProviderServiceOptions): RequestOptions | undefined {\n    return options?.abortSignal ? { init: { signal: options.abortSignal } } : undefined\n  }\n\n  function buildLocal(definitionId: string, initialConfig: Record<string, unknown> = {}): InferenceServiceProvider {\n    const definition = getDefinedProvider(definitionId)\n    if (!definition)\n      throw new Error(`Provider definition with id \"${definitionId}\" not found.`)\n\n    return {\n      id: nanoid(),\n      definitionId,\n      config: initialConfig,\n      status: 'unconfigured',\n      configuredBy: definition.configuredBy ?? 'user',\n    }\n  }\n\n  function normalize(value: unknown): InferenceServiceProvider {\n    const item = value as InferenceServiceProvider & {\n      validated: boolean\n      validationBypassed: boolean\n    }\n    let status: ProviderValidationStatus = 'unconfigured'\n    if (item.validated)\n      status = 'configured'","sourceCodeStart":85,"sourceCodeEnd":121,"githubUrl":"https://github.com/moeru-ai/airi/blob/0616eabd5ba89c7bcef0eb1da84694b9c285c573/packages/stage-ui/src/services/inference-service-providers.ts#L85-L121","documentation":"createInferenceServiceProvidersService().buildLocal looks up definitionId via getDefinedProvider (from ../libs/providers/providers) in the static, client-side registry of provider definitions. If no registered definition matches the exact id string, it throws this error before any object is built. This is a pure local lookup failure — no network or server is involved.","triggerScenarios":"Passing a typo'd or wrongly-cased id ('OpenAI' vs 'openai'); restoring a persisted provider whose definitionId references a definition renamed or removed in a newer stage-ui version; constructing providers from data exported by another instance or hand-writing ids in scripts/tests.","commonSituations":"Version upgrades where provider definitions moved or were renamed under packages/stage-ui (registry from libs/providers/providers); stale persisted provider lists in localStorage/IndexedDB referencing retired definition ids; importing provider config from a different AIRI deployment.","solutions":["Log or inspect the ids available in the provider definitions registry and pass the exact registered definitionId.","If the id comes from persisted data, migrate or drop records whose definitionId no longer resolves after an upgrade.","Guard call sites by resolving the definition first and surfacing a provider picker instead of crashing.","When adding a custom provider, register its definition before buildLocal is called with its id."],"exampleFix":"// before\nconst provider = providersService.buildLocal('open-ai')\n\n// after\nimport { getDefinedProvider } from '../libs/providers/providers'\n\nconst definition = getDefinedProvider('open-ai')\nif (!definition) {\n  // surface a picker or fail with the list of valid ids\n  throw new Error(`Unknown provider definition \"open-ai\". Known: ${knownDefinitionIds.join(', ')}`)\n}\nconst provider = providersService.buildLocal('open-ai')","handlingStrategy":"type-guard","validationCode":"import { getDefinedProvider } from '../libs/providers/providers'\n\nif (!getDefinedProvider(definitionId)) {\n  // pick from registered definitions instead of proceeding\n  throw new Error(`Unknown provider definition \"${definitionId}\"`)\n}\nconst provider = providersService.buildLocal(definitionId, config)","typeGuard":"import { getDefinedProvider } from '../libs/providers/providers'\n\nfunction isKnownDefinitionId(id: string): boolean {\n  return getDefinedProvider(id) !== undefined\n}","tryCatchPattern":"try {\n  const provider = providersService.buildLocal(definitionId, config)\n}\ncatch (error) {\n  // definition registry miss: offer the registered definition list\n  toast.error(errorMessageFrom(error) ?? 'Unknown provider definition')\n  openProviderPicker()\n}","preventionTips":["Never hand-write definition ids; source them from the definitions registry or a picker.","Validate persisted provider records on load and drop/migrate entries with unresolvable definitionIds.","After upgrading stage-ui, re-check that custom definition ids still exist before restoring backups.","Keep definition ids as constants instead of string literals scattered in code."],"tags":["provider","validation","configuration","local-state"],"backgroundTag":"provider-definition-not-found","analyzedSha":"0616eabd5ba89c7bcef0eb1da84694b9c285c573","analyzedAt":"2026-08-18T17:29:58.153Z","contentChangedAt":"2026-08-18T17:29:58.153Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}