jackwener/OpenCLI · error · CommandExecutionError

NotebookLM CreateAudioOverview RPC returned no audio id; ser

Error message

NotebookLM CreateAudioOverview RPC returned no audio id; server may have rejected the request.

What it means

This CommandExecutionError is thrown when the CreateAudioOverview RPC executed but `parseAudioIdFromResult` could not find an audio id in the response, meaning NotebookLM likely rejected or failed the audio-generation request server-side.

Source

Thrown at clis/notebooklm/generate-audio.js:79

        const notebookId = parseNotebooklmNotebookTarget(String(kwargs.notebook ?? ''));
        requireNotebooklmExecute(kwargs.execute, 'generate NotebookLM audio');
        try {
            await page.goto(buildNotebooklmNotebookUrl(notebookId));
            await page.wait(2);
        }
        catch (error) {
            throw new CommandExecutionError(`Failed to open NotebookLM notebook ${notebookId}: ${error?.message || error}`);
        }
        await requireNotebooklmSession(page);
        const sources = await listNotebooklmSourcesViaRpc(page);
        const sourceIds = sources.map((s) => s.id).filter((id) => typeof id === 'string' && id);
        if (sourceIds.length === 0) {
            throw new EmptyResultError('notebooklm generate-audio', 'The notebook has no sources; add a source before generating an audio overview.');
        }
        const rpc = await callNotebooklmRpc(page, NOTEBOOKLM_CREATE_AUDIO_RPC_ID, buildCreateAudioArgs(notebookId, sourceIds));
        const audioId = parseAudioIdFromResult(rpc.result, [notebookId, ...sourceIds]);
        if (!audioId) {
            throw new CommandExecutionError('NotebookLM CreateAudioOverview RPC returned no audio id; server may have rejected the request.');
        }
        return [{
            notebook_id: notebookId,
            audio_id: audioId,
            source_count: sourceIds.length,
            status: 'pending',
            notebook_url: buildNotebooklmNotebookUrl(notebookId),
        }];
    },
});

export const __test__ = { AUDIO_OVERVIEW_CONFIG_BLOCK, buildCreateAudioArgs, parseAudioIdFromResult };

View on GitHub (pinned to 49907e53dc)

Solutions

  1. Retry later — server-side rejections (quota/capacity) are often transient.
  2. Reduce or replace problematic sources, then re-run generate-audio.
  3. Update opencli to a version whose parseAudioIdFromResult matches the current NotebookLM RPC response format, and inspect the RPC result for an embedded error message.

Example fix

// before
const audioId = parseAudioIdFromResult(rpc.result, ids) // null -> throw
// after
if (!rpc.result || rpc.result.error) throw new Error('NotebookLM rejected: ' + JSON.stringify(rpc.result))
const audioId = parseAudioIdFromResult(rpc.result, ids)
Defensive patterns

Strategy: retry

Validate before calling

const sources = await listSources(notebookId);
if (!sources.length) throw new Error('no sources');
if (!supportedLanguages.includes(language)) throw new Error('unsupported language');

Type guard

const hasAudioId = (result) => typeof result?.audioId === 'string' && result.audioId.length > 0;

Try / catch

try {
  return await generateAudio({ notebookId });
} catch (e) {
  if (String(e.message).includes('returned no audio id')) {
    await sleep(60000);
    return await generateAudio({ notebookId });
  }
  throw e;
}

Prevention

When it happens

Trigger: `callNotebooklmRpc` with NOTEBOOKLM_CREATE_AUDIO_RPC_ID returns a payload from which no audio id can be extracted given the notebookId and sourceIds as context — e.g. quota exceeded, unsupported source types, or NotebookLM RPC format change.

Common situations: Daily audio-overview quota reached; sources too large or unsupported language; NotebookLM silently returning an error body instead of a job id.

Related errors


AI-assisted analysis of jackwener/OpenCLI@49907e53dc (2026-08-29). Data as JSON: /api/errors/7e70b205ecbb47da. Report an issue: GitHub.