moeru-ai/airi · error · Error

Provider definition with id

Error message

Provider definition with id "${definitionId}" not found.

What it means

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.

Solutions

  1. Log or inspect the ids available in the provider definitions registry and pass the exact registered definitionId.
  2. If the id comes from persisted data, migrate or drop records whose definitionId no longer resolves after an upgrade.
  3. Guard call sites by resolving the definition first and surfacing a provider picker instead of crashing.
  4. When adding a custom provider, register its definition before buildLocal is called with its id.

Example fix

// before
const provider = providersService.buildLocal('open-ai')

// after
import { getDefinedProvider } from '../libs/providers/providers'

const definition = getDefinedProvider('open-ai')
if (!definition) {
  // surface a picker or fail with the list of valid ids
  throw new Error(`Unknown provider definition "open-ai". Known: ${knownDefinitionIds.join(', ')}`)
}
const provider = providersService.buildLocal('open-ai')
Defensive patterns

Strategy: type-guard

Validate before calling

import { getDefinedProvider } from '../libs/providers/providers'

if (!getDefinedProvider(definitionId)) {
  // pick from registered definitions instead of proceeding
  throw new Error(`Unknown provider definition "${definitionId}"`)
}
const provider = providersService.buildLocal(definitionId, config)

Type guard

import { getDefinedProvider } from '../libs/providers/providers'

function isKnownDefinitionId(id: string): boolean {
  return getDefinedProvider(id) !== undefined
}

Try / catch

try {
  const provider = providersService.buildLocal(definitionId, config)
}
catch (error) {
  // definition registry miss: offer the registered definition list
  toast.error(errorMessageFrom(error) ?? 'Unknown provider definition')
  openProviderPicker()
}

Prevention

When it happens

Trigger: 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.

Common situations: 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.

Related errors


AI-assisted analysis of moeru-ai/airi@0616eabd5b (2026-08-18). Data as JSON: /api/errors/eb48ed731722833a. Report an issue: GitHub.

Appendix: source

Thrown at packages/stage-ui/src/services/inference-service-providers.ts:103

 * Use when:
 * - Wiring controller stores to provider domain operations.
 * - Tests need to replace the whole service surface with one mock object.
 *
 * Expects:
 * - No runtime dependencies are required yet.
 *
 * Returns:
 * - A stable object containing provider domain operations.
 */
export function createInferenceServiceProvidersService(): InferenceServiceProvidersService {
  function requestOptions(options?: InferenceServiceProviderServiceOptions): RequestOptions | undefined {
    return options?.abortSignal ? { init: { signal: options.abortSignal } } : undefined
  }

  function buildLocal(definitionId: string, initialConfig: Record<string, unknown> = {}): InferenceServiceProvider {
    const definition = getDefinedProvider(definitionId)
    if (!definition)
      throw new Error(`Provider definition with id "${definitionId}" not found.`)

    return {
      id: nanoid(),
      definitionId,
      config: initialConfig,
      status: 'unconfigured',
      configuredBy: definition.configuredBy ?? 'user',
    }
  }

  function normalize(value: unknown): InferenceServiceProvider {
    const item = value as InferenceServiceProvider & {
      validated: boolean
      validationBypassed: boolean
    }
    let status: ProviderValidationStatus = 'unconfigured'
    if (item.validated)
      status = 'configured'

View on GitHub (pinned to 0616eabd5b)