HeyPuter/puter · warning · HttpError

bad_request

bad_request

Error message

Streaming transcription is not yet supported

What it means

The OpenAI STT provider checks args.stream and rejects with 400 / bad_request — neither transcriptions nor translations are wired for streaming in this driver yet. The check sits before the API-key and file guards so a streaming request fails fast. Streaming transcription may arrive later; until then the flag is unsupported.

Solutions

  1. Drop stream (or set it false) for STT calls.
  2. If progressive results are needed, design around request/response polling until streaming ships.

Example fix

// before
driver.transcribe({ file, stream: true })
// after
driver.transcribe({ file })
Defensive patterns

Strategy: validation

Validate before calling

// STT does not stream; strip the flag before sending
const { stream: _stream, ...rest } = args;
await driver.transcribe(rest);

Prevention

When it happens

Trigger: Calling transcribe({ file, stream: true }) or translate({ file, stream: true }) against the openai provider; forwarding generic AI args that default stream to true.

Common situations: Reusing an args object from a chat-completion call that legitimately streams; an SDK helper defaulting stream to true across all AI methods.

Understand the failure class

Background: BAD_REQUEST error code: request rejected as invalid (HTTP 400) - causes and fixes across libraries — this error's family across 8 libraries.

Related errors


AI-assisted analysis of HeyPuter/puter@908ec23eda (2026-08-12). Data as JSON: /api/errors/dbe69ad4186543d8. Report an issue: GitHub.

Appendix: source

Thrown at src/backend/drivers/ai-speech2txt/providers/openai/OpenAISpeechToTextProvider.ts:151

    }

    async translate(args: ITranscribeArgs) {
        return this.#handleTranscription(args, true);
    }

    async #handleTranscription(args: ITranscribeArgs, translate: boolean) {
        if (args.test_mode) {
            return {
                ...SAMPLE_TRANSCRIPT,
                model:
                    args.model ||
                    (translate
                        ? DEFAULT_TRANSLATE_MODEL
                        : DEFAULT_TRANSCRIBE_MODEL),
            };
        }
        if (args.stream) {
            throw new HttpError(
                400,
                'Streaming transcription is not yet supported',
                { legacyCode: 'bad_request' },
            );
        }
        if (!this.#openai)
            throw new HttpError(500, 'OpenAI API key not configured', {
                legacyCode: 'internal_error',
            });
        this.requireFile(args);

        const actor = this.requireActor();

        const loaded = await loadFileInput(
            this.deps.stores,
            this.deps.fs,
            actor,
            args.file,

View on GitHub (pinned to 908ec23eda)