moeru-ai/airi · error · Error

No compatible input provided for streaming transcription.

Error message

No compatible input provided for streaming transcription.

What it means

In the hearing (STT) module, when the selected provider advertises streaming output, one of three stream branches must match the input: (supportsStreamInput + inputAudioStream), (!supportsStreamInput + file), or (supportsStreamInput + file with no audio stream). If none matched and the provider cannot fall back to generate (or there is still no file), this error is thrown — the input shape and provider feature flags are incompatible.

Source

Thrown at packages/stage-ui/src/stores/modules/hearing.ts:494

            mode: 'stream',
            ...streamResult,
          }
        }

        if (features.supportsStreamInput && !normalizedInput.inputAudioStream && normalizedInput.file) {
          const streamResult = streamExecutor({
            ...request,
            file: normalizedInput.file,
          } as Parameters<typeof streamExecutor>[0])
          emitSucceeded(0, true)
          return {
            mode: 'stream',
            ...streamResult,
          }
        }

        if (!features.supportsGenerate || !normalizedInput.file) {
          throw new Error('No compatible input provided for streaming transcription.')
        }
      }

      if (!normalizedInput.file) {
        throw new Error('File input is required for transcription.')
      }

      const useVerboseJson = !format && confidenceThreshold.value > CONFIDENCE_THRESHOLD_DISABLED
      const response = await generateTranscription({
        ...provider.transcription(model, options?.providerOptions),
        file: normalizedInput.file,
        fileName: resolveTranscriptionFileName(normalizedInput.file, normalizedInput.fileName),
        responseFormat: useVerboseJson ? 'verbose_json' : format,
      })

      if (useVerboseJson) {
        if (response.segments) {
          verboseJsonNotSupported.value = false

View on GitHub (pinned to f679616c34)

Solutions

  1. Pass a file (Blob/File) or a live inputAudioStream matching the provider's declared capabilities.
  2. Check the provider's features (supportsStreamInput, supportsGenerate, supportsStreamOutput) before choosing the input shape.
  3. Fix upstream audio capture so normalization always yields a file or stream.
  4. Switch to a provider with generate support for file-based transcription.

Example fix

// before
const result = await hearing.transcribe(model, {})

// after - match input shape to provider features
const features = sttProvider.features
const input = features.supportsStreamInput && audioStream
  ? { inputAudioStream: audioStream }
  : { file: recordedBlob }
if (!input.inputAudioStream && !input.file)
  throw new Error('Nothing to transcribe: provide a file or an audio stream')
const result = await hearing.transcribe(model, input)
Defensive patterns

Strategy: validation

Validate before calling

const features = provider.features
const hasStreamInput = features.supportsStreamInput && Boolean(input.inputAudioStream)
const hasFile = Boolean(input.file)
if (features.supportsStreamOutput && !hasStreamInput && !hasFile)
  throw new Error('Provide a file or an audio stream for streaming transcription')
if (!features.supportsStreamOutput && !features.supportsGenerate)
  throw new Error('Provider supports neither streaming nor generate transcription')
await hearing.transcribe(model, input)

Type guard

function isCompatibleTranscriptionInput(features: SttFeatures, input: NormalizedInput): boolean {
  if (features.supportsStreamOutput) {
    if (features.supportsStreamInput && input.inputAudioStream) return true
    if (input.file) return true
    return features.supportsGenerate && Boolean(input.file)
  }
  return Boolean(input.file)
}

Try / catch

try {
  const result = await hearing.transcribe(model, input)
}
catch (error) {
  if (errorMessageFrom(error) === 'No compatible input provided for streaming transcription.') {
    toast.info('Start the microphone or select an audio file before transcribing')
    return
  }
  throw error
}

Prevention

When it happens

Trigger: Calling transcription with a provider whose features include stream output+input but passing neither inputAudioStream nor file; using a stream-output-only provider (no generate support) with an empty/failed normalization step so no file was produced; passing only a fileName or options while the audio capture layer produced nothing.

Common situations: Microphone capture failing silently so normalizedInput ends up empty; feature flags of a custom STT provider misdeclared (supportsStreamOutput without generate); calling the hearing store programmatically without wiring an input source.

Related errors


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