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
- 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.
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
- 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.
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
- Aliyun NLS credentials are incomplete.
- Failed to initialize speech provider
- Failed to initialize speech provider
- Failed to resolve chat provider
- Missing LLM configuration
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)