moeru-ai/airi · warning

No Live2D model source provided.

Error message

No Live2D model source provided.

What it means

Live2D Model.vue runs loadModel() immediately via watch(modelSrcRef, ..., { immediate: true }). When the optional modelSrc prop is empty there is nothing to load; the component logs this warning, clears modelLoading, sets componentState to 'mounted' and returns instead of throwing. It is a controlled no-op for an unconfigured scene.

Source

Thrown at packages/stage-ui-live2d/src/components/scenes/live2d/Model.vue:240

  }

  // REVIEW: here as await until(...) guarded the pixiApp and stage to be valid.
  if (model.value && pixiApp.value?.stage) {
    // Dispose expression controller before destroying the old model
    expressionController.dispose()
    internalModelRef.value = undefined

    try {
      pixiApp.value.stage.removeChild(model.value)
      model.value.destroy()
    }
    catch (error) {
      console.warn('Error removing old model:', error)
    }
    model.value = undefined
  }
  if (!modelSrcRef.value) {
    console.warn('No Live2D model source provided.')
    modelLoading.value = false
    componentState.value = 'mounted'
    return
  }

  try {
    if (isUnmounted) {
      modelLoading.value = false
      componentState.value = 'mounted'
      return
    }

    const live2DModel = new Live2DModel<PixiLive2DInternalModel>()
    await Live2DFactory.setupLive2DModel(live2DModel, { url: modelSrcRef.value, id: props.modelId }, { autoInteract: false })
    availableMotions.value.forEach((motion) => {
      if (motion.motionName in Emotion) {
        motionMap.value[motion.fileName] = motion.motionName
      }

View on GitHub (pinned to 677329427f)

Solutions

  1. Bind a real source once available: <Model :model-src="live2dStore.modelSrc" :model-id="modelId" />
  2. Guard rendering with v-if="modelSrc" so the component only mounts when a source exists, showing a placeholder otherwise
  3. If the src loads asynchronously, delay mounting until it resolves instead of relying on the watcher to re-run

Example fix

// before
<Model :model-id="modelId" />

// after
<Model v-if="modelSrc" :model-src="modelSrc" :model-id="modelId" />
Defensive patterns

Strategy: validation

Validate before calling

// Before rendering the Live2D model component
const ready = computed(() => typeof modelSrc.value === 'string' && modelSrc.value.length > 0)
// template: <Model v-if="ready" :model-src="modelSrc" />

Type guard

function isModelSource(value: unknown): value is string {
  return typeof value === 'string' && value.trim().length > 0
}

Prevention

When it happens

Trigger: Rendering <Model /> from stage-ui-live2d without the modelSrc prop, or binding modelSrc to a reactive value that is still undefined/'' at mount time (settings store not hydrated yet, wrong store path, model deleted).

Common situations: First-run/onboarding state where no Live2D model has been imported or selected yet; passing only modelId and expecting the component to resolve the source itself; the source arriving asynchronously after mount.

Understand the failure class

Background: "missing required argument" and "the following required arguments were not provided": what required-argument errors mean and how to fix them — this error's family across 20 libraries.

Related errors


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