{"record":{"id":"7e70b205ecbb47da","repo":"jackwener/OpenCLI","slug":"notebooklm-createaudiooverview-rpc-returned-no-aud","errorCode":null,"errorMessage":"NotebookLM CreateAudioOverview RPC returned no audio id; server may have rejected the request.","messagePattern":"NotebookLM CreateAudioOverview RPC returned no audio id; server may have rejected the request\\.","errorType":"exception","errorClass":"CommandExecutionError","httpStatus":null,"severity":"error","filePath":"clis/notebooklm/generate-audio.js","lineNumber":79,"sourceCode":"        const notebookId = parseNotebooklmNotebookTarget(String(kwargs.notebook ?? ''));\n        requireNotebooklmExecute(kwargs.execute, 'generate NotebookLM audio');\n        try {\n            await page.goto(buildNotebooklmNotebookUrl(notebookId));\n            await page.wait(2);\n        }\n        catch (error) {\n            throw new CommandExecutionError(`Failed to open NotebookLM notebook ${notebookId}: ${error?.message || error}`);\n        }\n        await requireNotebooklmSession(page);\n        const sources = await listNotebooklmSourcesViaRpc(page);\n        const sourceIds = sources.map((s) => s.id).filter((id) => typeof id === 'string' && id);\n        if (sourceIds.length === 0) {\n            throw new EmptyResultError('notebooklm generate-audio', 'The notebook has no sources; add a source before generating an audio overview.');\n        }\n        const rpc = await callNotebooklmRpc(page, NOTEBOOKLM_CREATE_AUDIO_RPC_ID, buildCreateAudioArgs(notebookId, sourceIds));\n        const audioId = parseAudioIdFromResult(rpc.result, [notebookId, ...sourceIds]);\n        if (!audioId) {\n            throw new CommandExecutionError('NotebookLM CreateAudioOverview RPC returned no audio id; server may have rejected the request.');\n        }\n        return [{\n            notebook_id: notebookId,\n            audio_id: audioId,\n            source_count: sourceIds.length,\n            status: 'pending',\n            notebook_url: buildNotebooklmNotebookUrl(notebookId),\n        }];\n    },\n});\n\nexport const __test__ = { AUDIO_OVERVIEW_CONFIG_BLOCK, buildCreateAudioArgs, parseAudioIdFromResult };\n","sourceCodeStart":61,"sourceCodeEnd":92,"githubUrl":"https://github.com/jackwener/OpenCLI/blob/49907e53dc3ade5c223ff0c4c2c2785687cec4e6/clis/notebooklm/generate-audio.js#L61-L92","documentation":"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.","triggerScenarios":"`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.","commonSituations":"Daily audio-overview quota reached; sources too large or unsupported language; NotebookLM silently returning an error body instead of a job id.","solutions":["Retry later — server-side rejections (quota/capacity) are often transient.","Reduce or replace problematic sources, then re-run generate-audio.","Update opencli to a version whose parseAudioIdFromResult matches the current NotebookLM RPC response format, and inspect the RPC result for an embedded error message."],"exampleFix":"// before\nconst audioId = parseAudioIdFromResult(rpc.result, ids) // null -> throw\n// after\nif (!rpc.result || rpc.result.error) throw new Error('NotebookLM rejected: ' + JSON.stringify(rpc.result))\nconst audioId = parseAudioIdFromResult(rpc.result, ids)","handlingStrategy":"retry","validationCode":"const sources = await listSources(notebookId);\nif (!sources.length) throw new Error('no sources');\nif (!supportedLanguages.includes(language)) throw new Error('unsupported language');","typeGuard":"const hasAudioId = (result) => typeof result?.audioId === 'string' && result.audioId.length > 0;","tryCatchPattern":"try {\n  return await generateAudio({ notebookId });\n} catch (e) {\n  if (String(e.message).includes('returned no audio id')) {\n    await sleep(60000);\n    return await generateAudio({ notebookId });\n  }\n  throw e;\n}","preventionTips":["Respect NotebookLM audio-overview quotas; space out requests.","Keep opencli current so the RPC response parser matches NotebookLM.","Log the raw rpc.result on failure to capture server-side error messages."],"tags":["notebooklm","rpc","audio","parse-failure","server-rejection"],"backgroundTag":"rpc-returned-no-id","analyzedSha":"49907e53dc3ade5c223ff0c4c2c2785687cec4e6","analyzedAt":"2026-08-29T08:14:47.543Z","schemaVersion":2},"datasetVersion":"2026-08-29T12:17:43.993Z"}