{"record":{"id":"ffe5a6f4e2b0789d","repo":"ComposioHQ/composio","slug":"invalid-tool-router-session-delete-response","errorCode":null,"errorMessage":"Invalid tool router session delete response","messagePattern":"Invalid tool router session delete response","errorType":"validation","errorClass":"ValidationError","httpStatus":null,"severity":"error","filePath":"python/composio/core/models/tool_router_session_delete.py","lineNumber":34,"sourceCode":"\n    session_id: str\n    deleted: t.Literal[True]\n\n\ndef delete_tool_router_session(\n    client: HttpClient,\n    session_id: str,\n) -> ToolRouterSessionDeleteResponse:\n    \"\"\"Delete a tool router session by ID.\"\"\"\n    response = client.delete(\n        f\"/api/v3.1/tool_router/session/{quote(session_id, safe='')}\",\n        cast_to=t.Dict[str, t.Any],\n    )\n\n    response_session_id = response.get(\"session_id\")\n    deleted = response.get(\"deleted\")\n    if not isinstance(response_session_id, str) or deleted is not True:\n        raise ValidationError(\"Invalid tool router session delete response\")\n\n    return {\n        \"session_id\": response_session_id,\n        \"deleted\": True,\n    }\n","sourceCodeStart":16,"sourceCodeEnd":40,"githubUrl":"https://github.com/ComposioHQ/composio/blob/64b1b85502b1beeb2379e6c9e8bf1104504fa637/python/composio/core/models/tool_router_session_delete.py#L16-L40","documentation":"After a successful HTTP delete of a tool-router session, the SDK validates the JSON response: it must contain a string session_id and deleted is exactly True. If either check fails (unexpected response shape, backend returning an error object with 200, or deleted=False), this ValidationError is raised.","triggerScenarios":"Deleting a session whose ID is already gone but the backend returns 200 with a non-conforming body; or backend/SDK response-schema drift after an API change.","commonSituations":"Version skew between composio SDK and backend, idempotent delete endpoints that return a different payload for missing sessions.","solutions":["Check e.__cause__/logs to see the raw response body","Upgrade composio to align with the current backend delete response","Treat already-deleted sessions as success in your wrapper if idempotency matters"],"exampleFix":"# before\nrouter.sessions.delete(sid)\n\n# after\ntry:\n    router.sessions.delete(sid)\nexcept ValidationError:\n    logger.warning('session %s may already be deleted', sid)","handlingStrategy":"try-catch","validationCode":null,"typeGuard":null,"tryCatchPattern":"try:\n    deleted = sessions.delete(sid)\nexcept ValidationError:\n    logger.warning('session %s delete response invalid; treating as gone', sid)\n    deleted = {'session_id': sid, 'deleted': False}","preventionTips":["Make deletes idempotent in your wrapper","Keep SDK/backend versions aligned"],"tags":["python","tool-router","session","delete","response-validation"],"backgroundTag":"response-schema-mismatch","analyzedSha":"64b1b85502b1beeb2379e6c9e8bf1104504fa637","analyzedAt":"2026-08-28T15:39:33.623Z","schemaVersion":2},"datasetVersion":"2026-08-28T16:17:29.566Z"}