moeru-ai/airi · warning

[Speech Pipeline] OpenAI Compatible: No model in provider co

Error message

[Speech Pipeline] OpenAI Compatible: No model in provider config, using default

What it means

For the openai-compatible-audio-speech provider, Stage.vue prefers the model stored in the provider config over the globally selected speech model. If providerConfig.model is unset, it falls back to 'tts-1' and warns. On endpoints that do not serve tts-1 the subsequent synthesis call will fail with an API error.

Source

Thrown at packages/stage-ui/src/components/scenes/Stage.vue:475

    if (!request.text && !request.special)
      return null

    const providerConfig = providerStore.getProviderConfig(activeSpeechProvider.value)

    // For OpenAI Compatible providers, always use provider config for model and voice
    // since these are manually configured in provider settings
    let model = activeSpeechModel.value
    let voice = activeSpeechVoice.value

    if (activeSpeechProvider.value === 'openai-compatible-audio-speech') {
      // Always prefer provider config for OpenAI Compatible (user configured it there)
      if (providerConfig?.model) {
        model = providerConfig.model as string
      }
      else {
        // Fallback to default if not in provider config
        model = 'tts-1'
        console.warn('[Speech Pipeline] OpenAI Compatible: No model in provider config, using default', { providerConfig })
      }

      if (providerConfig?.voice) {
        voice = {
          id: providerConfig.voice as string,
          name: providerConfig.voice as string,
          description: providerConfig.voice as string,
          previewURL: '',
          languages: [{ code: 'en', title: 'English' }],
          provider: activeSpeechProvider.value,
          gender: 'neutral',
        }
      }
      else {
        // Fallback to default if not in provider config
        voice = {
          id: 'alloy',
          name: 'alloy',

View on GitHub (pinned to 677329427f)

Solutions

  1. Open Settings > Providers > openai-compatible-audio-speech, set the model field (e.g. tts-1 or your endpoint's equivalent) and save
  2. With API key and base URL set, load models for the provider and pick one from the fetched list
  3. If the default is intended, verify the endpoint actually serves tts-1 by calling it directly
Defensive patterns

Strategy: validation

Validate before calling

// Before enabling TTS for openai-compatible-audio-speech
const config = providers.value['openai-compatible-audio-speech']
if (!config?.model) {
  // mark provider incomplete in settings UI instead of relying on the tts-1 default
  console.warn('[Speech Pipeline] OpenAI Compatible: No model in provider config, using default')
}

Type guard

function hasProviderModel(config: unknown): config is { model: string } {
  return Boolean(config) && typeof config === 'object' && typeof (config as any).model === 'string' && (config as any).model.length > 0
}

Prevention

When it happens

Trigger: The openai-compatible-audio-speech provider was saved without a model field in its provider settings while TTS is requested during a conversation.

Common situations: Fresh provider setup where only API key, base URL and voice were entered; config written by an older version that did not persist model; non-OpenAI compatible endpoints whose TTS models have different names.

Related errors


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