{"record":{"id":"60c71a1bb0d63dd4","repo":"jackwener/OpenCLI","slug":"notebooklm-createartifact-slides-rpc-returned-no","errorCode":null,"errorMessage":"NotebookLM CreateArtifact (slides) RPC returned no slide-deck id; the server may have rejected the request.","messagePattern":"NotebookLM CreateArtifact \\(slides\\) RPC returned no slide-deck id; the server may have rejected the request\\.","errorType":"exception","errorClass":"CommandExecutionError","httpStatus":null,"severity":"error","filePath":"clis/notebooklm/generate-slides.js","lineNumber":94,"sourceCode":"        const language = String(kwargs.language ?? 'en').trim() || 'en';\n        requireNotebooklmExecute(kwargs.execute, 'generate NotebookLM slides');\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-slides', 'The notebook has no sources; add a source before generating a slide deck.');\n        }\n        const rpc = await callNotebooklmRpc(page, NOTEBOOKLM_CREATE_ARTIFACT_RPC_ID, buildCreateSlidesArgs(notebookId, sourceIds, { length, language }));\n        const slidesId = parseSlidesIdFromResult(rpc.result, [notebookId, ...sourceIds]);\n        if (!slidesId) {\n            throw new CommandExecutionError('NotebookLM CreateArtifact (slides) RPC returned no slide-deck id; the server may have rejected the request.');\n        }\n        return [{\n            notebook_id: notebookId,\n            slides_id: slidesId,\n            source_count: sourceIds.length,\n            status: 'pending',\n            notebook_url: buildNotebooklmNotebookUrl(notebookId),\n        }];\n    },\n});\n\nexport const __test__ = { SLIDE_DECK_CONFIG_BLOCK, buildCreateSlidesArgs, parseSlideDeckLength, parseSlidesIdFromResult };\n","sourceCodeStart":76,"sourceCodeEnd":107,"githubUrl":"https://github.com/jackwener/OpenCLI/blob/49907e53dc3ade5c223ff0c4c2c2785687cec4e6/clis/notebooklm/generate-slides.js#L76-L107","documentation":"This CommandExecutionError is thrown when the CreateArtifact (slides) RPC ran but `parseSlidesIdFromResult` could not extract a slide-deck id from the response, indicating NotebookLM likely rejected the slide-generation request server-side.","triggerScenarios":"`callNotebooklmRpc` with NOTEBOOKLM_CREATE_ARTIFACT_RPC_ID returns a payload without a parseable slides id — quota limits, unsupported sources/language, invalid --length for the server, or an RPC response format change.","commonSituations":"Daily generation quota exhausted; requested deck length/language unsupported; NotebookLM returning an error payload the parser cannot read.","solutions":["Retry after a delay (quota/capacity rejections are transient).","Adjust options (fewer sources, supported language, standard --length) and re-run.","Update opencli so parseSlidesIdFromResult matches the current NotebookLM response shape; inspect the raw rpc.result for an error message."],"exampleFix":"// before\nconst slidesId = parseSlidesIdFromResult(rpc.result, ids) // null -> throw\n// after\nif (!rpc.result || rpc.result.error) throw new Error('NotebookLM rejected: ' + JSON.stringify(rpc.result))\nconst slidesId = parseSlidesIdFromResult(rpc.result, ids)","handlingStrategy":"retry","validationCode":"const sources = await listSources(notebookId);\nif (!sources.length) throw new Error('no sources');\nif (!Number.isInteger(length) || length <= 0) throw new Error('bad --length');","typeGuard":"const hasSlidesId = (result) => typeof result?.slidesId === 'string' && result.slidesId.length > 0;","tryCatchPattern":"try {\n  return await generateSlides({ notebookId, length });\n} catch (e) {\n  if (String(e.message).includes('returned no slide-deck id')) {\n    await sleep(60000);\n    return await generateSlides({ notebookId, length });\n  }\n  throw e;\n}","preventionTips":["Respect NotebookLM generation quotas; throttle requests.","Use supported languages and standard lengths.","Update opencli so the slides-id parser tracks the current RPC response format."],"tags":["notebooklm","rpc","slides","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"}