{"record":{"id":"bd011b274491e2aa","repo":"github/copilot-sdk","slug":"invalid-user-input-request-payload-bd011b","errorCode":null,"errorMessage":"invalid user input request payload","messagePattern":"invalid user input request payload","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"python/copilot/client.py","lineNumber":4945,"sourceCode":"\n    async def _handle_user_input_request(self, params: dict) -> dict:\n        \"\"\"\n        Handle a user input request from the CLI server.\n\n        Args:\n            params: The user input request parameters from the server.\n\n        Returns:\n            A dict containing the user's response.\n\n        Raises:\n            ValueError: If the request payload is invalid.\n        \"\"\"\n        session_id = params.get(\"sessionId\")\n        question = params.get(\"question\")\n\n        if not session_id or not question:\n            raise ValueError(\"invalid user input request payload\")\n\n        with self._sessions_lock:\n            session = self._sessions.get(session_id)\n        if not session:\n            raise ValueError(f\"unknown session {session_id}\")\n\n        result = await session._handle_user_input_request(params)\n        return {\"answer\": result[\"answer\"], \"wasFreeform\": result[\"wasFreeform\"]}\n\n    async def _handle_exit_plan_mode_request(self, params: dict) -> dict:\n        \"\"\"Handle an exitPlanMode.request callback from the CLI server.\"\"\"\n        session_id = params.get(\"sessionId\")\n        summary = params.get(\"summary\")\n        actions = params.get(\"actions\")\n        recommended_action = params.get(\"recommendedAction\")\n\n        if not session_id or not isinstance(summary, str):\n            raise ValueError(\"invalid exit plan mode request payload\")","sourceCodeStart":4927,"sourceCodeEnd":4963,"githubUrl":"https://github.com/github/copilot-sdk/blob/cd8cf15dc3f9e762615790aaed0a771a0f392755/python/copilot/client.py#L4927-L4963","documentation":"ValueError raised by CopilotClient._handle_user_input_request when a server-initiated user-input request lacks a non-empty sessionId or question. It is a generic guard against malformed payloads coming from the CLI server; the faulting input is the params dict from the wire, not user-supplied arguments.","triggerScenarios":"The CLI server sends a userInput.request callback whose params are missing sessionId or question, or they are empty/None.","commonSituations":"Protocol/version mismatch where a newer CLI omits fields the SDK requires; corrupted or hand-crafted RPC payloads; middleware mutating params before dispatch; tool interception code forwarding incomplete params.","solutions":["Align the CLI and SDK versions so request payloads include both sessionId and question","Inspect the incoming RPC params (debug logging) to find which field is missing or empty","Check custom middleware/interceptors aren't stripping fields from params","Reject or skip malformed requests defensively in a custom handler wrapper"],"exampleFix":null,"handlingStrategy":"validation","validationCode":"def is_valid_user_input_params(params: dict) -> bool:\n    return bool(params.get(\"sessionId\")) and bool(params.get(\"question\"))","typeGuard":"def valid_user_input(params) -> bool:\n    return isinstance(params, dict) and isinstance(params.get(\"sessionId\"), str) and params.get(\"sessionId\") and isinstance(params.get(\"question\"), str) and params.get(\"question\")","tryCatchPattern":"try:\n    result = await client._handle_user_input_request(params)\nexcept ValueError as e:\n    if \"invalid user input request payload\" in str(e):\n        log.error(\"malformed userInput.request: %r\", params)\n    else:\n        raise","preventionTips":["Keep CLI and SDK versions aligned","Log full RPC params at debug level to catch payload drift","Avoid middleware that strips or renames param fields","Add contract tests for the user-input callback schema"],"tags":["validation","payload","rpc"],"backgroundTag":"schema-validation-failed","analyzedSha":"cd8cf15dc3f9e762615790aaed0a771a0f392755","analyzedAt":"2026-09-09T18:32:31.973Z","contentChangedAt":"2026-09-09T18:32:31.973Z","schemaVersion":2},"datasetVersion":"2026-09-15T23:17:13.987Z"}