{"record":{"id":"977b72871efcfcad","repo":"langchain-ai/deepagents","slug":"invalid-sort-by-sort-by-r-expected-updated-or","errorCode":null,"errorMessage":"Invalid sort_by {sort_by!r}; expected 'updated' or 'created'","messagePattern":"Invalid sort_by (.+?); expected 'updated' or 'created'","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"warning","filePath":"libs/code/deepagents_code/sessions.py","lineNumber":479,"sourceCode":"        List of `ThreadInfo` dicts with `thread_id`, `agent_name`,\n            `updated_at`, `created_at`, `latest_checkpoint_id`, `git_branch`,\n            `cwd`, and optionally `message_count`.\n\n    Raises:\n        ValueError: If `sort_by` is not `\"updated\"` or `\"created\"`.\n    \"\"\"\n    async with _connect() as conn:\n        if not await _table_exists(conn, \"checkpoints\"):\n            return []\n\n        # Ensure the covering index exists before the GROUP BY below, so the\n        # query is an index-only scan instead of a full scan over the (large,\n        # blob-bearing) checkpoints table.\n        await _ensure_threads_list_index(conn)\n\n        if sort_by not in {\"updated\", \"created\"}:\n            msg = f\"Invalid sort_by {sort_by!r}; expected 'updated' or 'created'\"\n            raise ValueError(msg)\n        order_col = \"created_at\" if sort_by == \"created\" else \"updated_at\"\n\n        where_clauses: list[str] = []\n        params_list: list[str | int] = []\n\n        if agent_name:\n            where_clauses.append(\"json_extract(metadata, '$.agent_name') = ?\")\n            params_list.append(agent_name)\n        if branch:\n            where_clauses.append(\"json_extract(metadata, '$.git_branch') = ?\")\n            params_list.append(branch)\n        if cwd:\n            where_clauses.append(\"json_extract(metadata, '$.cwd') = ?\")\n            params_list.append(cwd)\n\n        where_sql = f\"WHERE {' AND '.join(where_clauses)}\" if where_clauses else \"\"\n\n        query = f\"\"\"","sourceCodeStart":461,"sourceCodeEnd":497,"githubUrl":"https://github.com/langchain-ai/deepagents/blob/a1af029e6e73cb17c36bff823d227747b28e91e1/libs/code/deepagents_code/sessions.py#L461-L497","documentation":"ValueError raised by list_threads when the sort_by argument is not exactly \"updated\" or \"created\". The SQL ordering column is chosen from this whitelist to prevent injection and keep the index-only scan valid.","triggerScenarios":"Calling list_threads(sort_by=...) with any other value (e.g. \"name\", \"date\", None, uppercase \"Updated\") via list_threads_command, _load_threads, or prewarm_thread_message_counts.","commonSituations":"Passing a user-supplied sort option straight through from a UI/config; typos; case-sensitivity mistakes; assuming other sort keys are supported.","solutions":["Pass only \"updated\" (default) or \"created\"","Normalize/validate user input before forwarding: sort_by = raw if raw in {\"updated\",\"created\"} else \"updated\"","Lowercase and strip the input first if it comes from a CLI flag"],"exampleFix":"// before\nthreads = await list_threads(sort_by=\"Created\")\n\n// after\nthreads = await list_threads(sort_by=\"created\")","handlingStrategy":"validation","validationCode":"VALID_SORTS = {\"updated\", \"created\"}\nif sort_by not in VALID_SORTS:\n    sort_by = \"updated\"","typeGuard":null,"tryCatchPattern":"try:\n    threads = await list_threads(sort_by=sort_by)\nexcept ValueError:\n    threads = await list_threads(sort_by=\"updated\")","preventionTips":["Whitelist and normalize CLI/UI sort inputs before passing them down","Remember only \"updated\" and \"created\" are supported — no \"name\" or \"date\"","Lowercase user-supplied flags first","Constrain choices in CLI argument parsers (literal type / choices=)"],"tags":["validation","sessions","arguments"],"backgroundTag":"invalid-argument-value","analyzedSha":"a1af029e6e73cb17c36bff823d227747b28e91e1","analyzedAt":"2026-08-29T11:43:24.718Z","schemaVersion":2},"datasetVersion":"2026-08-29T12:17:43.993Z"}