moeru-ai/airi · warning

[Model.vue] Expression controller initialization failed:

Error message

[Model.vue] Expression controller initialization failed:

What it means

In loadModel's finally, the expression controller initializes fire-and-forget: it reads expression definitions from model3.json and parses each referenced exp3.json. A failure (missing files, CORS-blocked fetch, malformed JSON) only logs this warning — by design, expression problems never block model rendering. Expressions stay unavailable until the feature is toggled or the model reloads.

Source

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

      // without idle-motion blink curves.
      if (internalModel.eyeBlink) {
        ;(internalModel as any).eyeBlink = null
      }

      internalModelRef.value = internalModel
    }

    emits('modelLoaded')
  }
  catch (error) {
    console.error('[Live2D] Failed to load model:', error)
    emits('error', error instanceof Error ? error : new Error(String(error)))
  }
  finally {
    modelLoading.value = false
    componentState.value = 'mounted'
    await initExpressionController(internalModelRef.value).catch((err) => {
      console.warn('[Model.vue] Expression controller initialization failed:', err)
    })
    modelLoadMutex.release()
  }
}

/**
 * Initialise the expression controller by reading expression definitions from
 * the model settings (model3.json) and parsing each referenced exp3.json file.
 *
 * This is intentionally fire-and-forget from loadModel so that a failure in
 * expression loading does not prevent the model itself from rendering.
 */
async function initExpressionController(internalModel?: PixiLive2DInternalModel) {
  // Dispose any previous state (handles model reloads)
  expressionController.dispose()

  const settings = internalModel?.settings as any
  if (!settings)

View on GitHub (pinned to 677329427f)

Solutions

  1. Verify the model archive contains every exp3.json referenced by model3.json
  2. Re-import the complete model archive (partial extraction is a common cause)
  3. Serve remote models with CORS headers so expression fetches succeed
  4. Retry by toggling the expression feature or reloading the model
Defensive patterns

Strategy: fallback

Validate before calling

const expressions = internalModel?.settings?.expressions ?? []
if (expressions.length === 0) return // no expression refs to parse

Try / catch

await initExpressionController(internalModelRef.value).catch((err) => {
  console.warn('[Model.vue] Expression controller initialization failed:', err)
}) // fire-and-forget by design: model rendering must not depend on expressions

Prevention

When it happens

Trigger: model3.json referencing exp3.json files missing from the archive; malformed exp3.json content; remote hosting without CORS blocking the expression file fetches.

Common situations: Community models with broken expression references; partially extracted model folders; models hosted on buckets without CORS headers.

Related errors


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