From 4b619f699bbaf88009f22b9455258eec62abff5c Mon Sep 17 00:00:00 2001 From: Wang Qi Date: Fri, 31 Jul 2026 14:08:44 +0800 Subject: [PATCH] Refactor: consolidate page and page_size (#17597) --- api/apps/restful_apis/agent_api.py | 10 ++--- api/apps/restful_apis/bot_api.py | 5 ++- api/apps/restful_apis/chat_api.py | 26 +++--------- api/apps/restful_apis/chunk_api.py | 10 ++--- .../compilation_template_group_api.py | 6 +-- api/apps/restful_apis/connector_api.py | 6 +-- api/apps/restful_apis/dataset_api.py | 22 +++++----- api/apps/restful_apis/document_api.py | 17 ++------ api/apps/restful_apis/file_commit_api.py | 5 ++- api/apps/restful_apis/mcp_api.py | 6 +-- api/apps/restful_apis/memory_api.py | 41 ++++++++++++------- api/apps/restful_apis/search_api.py | 6 +-- api/utils/pagination_utils.py | 27 ++++++++++-- test/testcases/restful_api/test_chats.py | 2 +- test/testcases/restful_api/test_chunks.py | 8 ++-- test/testcases/restful_api/test_sessions.py | 2 +- .../test_list_chat_assistants.py | 2 +- .../test_list_sessions_with_chat_assistant.py | 2 +- 18 files changed, 104 insertions(+), 99 deletions(-) diff --git a/api/apps/restful_apis/agent_api.py b/api/apps/restful_apis/agent_api.py index 9bb12176e3..6477ff8964 100644 --- a/api/apps/restful_apis/agent_api.py +++ b/api/apps/restful_apis/agent_api.py @@ -64,7 +64,7 @@ from api.utils.api_utils import ( server_error_response, validate_request, ) -from api.utils.pagination_utils import validate_rest_api_page_size +from api.utils.pagination_utils import DEFAULT_PAGE, DEFAULT_PAGE_SIZE, validate_rest_api_page, validate_rest_api_page_size from common import settings from common.ssrf_guard import assert_host_is_safe from common.constants import RetCode @@ -434,8 +434,8 @@ async def _run_workflow_session( def list_agent_sessions(agent_id, tenant_id): session_id = request.args.get("id") user_id = request.args.get("user_id") - page_number = int(request.args.get("page", 1)) - items_per_page = validate_rest_api_page_size(int(request.args.get("page_size", 30))) + page_number = validate_rest_api_page(request.args.get("page", DEFAULT_PAGE)) + items_per_page = validate_rest_api_page_size(request.args.get("page_size", DEFAULT_PAGE_SIZE)) keywords = request.args.get("keywords") from_date = request.args.get("from_date") to_date = request.args.get("to_date") @@ -687,8 +687,8 @@ def list_agents(tenant_id): owner_ids = [item for item in request.args.get("owner_ids", "").strip().split(",") if item] tags = [item for item in request.args.get("tags", "").strip().split(",") if item] - page_number = int(request.args.get("page", 0)) - items_per_page = validate_rest_api_page_size(int(request.args.get("page_size", 0))) + page_number = validate_rest_api_page(request.args.get("page", DEFAULT_PAGE)) + items_per_page = validate_rest_api_page_size(request.args.get("page_size", DEFAULT_PAGE_SIZE)) order_by = request.args.get("orderby", "create_time") desc = str(request.args.get("desc", "true")).lower() != "false" tenants = TenantService.get_joined_tenants_by_user_id(tenant_id) diff --git a/api/apps/restful_apis/bot_api.py b/api/apps/restful_apis/bot_api.py index f6c177b56e..18ee47e327 100644 --- a/api/apps/restful_apis/bot_api.py +++ b/api/apps/restful_apis/bot_api.py @@ -47,6 +47,7 @@ from api.utils.reference_metadata_utils import ( enrich_chunks_with_document_metadata, resolve_reference_metadata_preferences, ) +from api.utils.pagination_utils import DEFAULT_PAGE, DEFAULT_PAGE_SIZE, validate_rest_api_page, validate_rest_api_page_size logger = logging.getLogger(__name__) @@ -331,8 +332,8 @@ async def ask_about_embedded(tenant_id=None): @validate_request("kb_id", "question") async def retrieval_test_embedded(tenant_id=None): req = await get_request_json() - page = int(req.get("page", 1)) - size = int(req.get("size", 30)) + page = validate_rest_api_page(req.get("page", DEFAULT_PAGE)) + size = validate_rest_api_page_size(req.get("size", DEFAULT_PAGE_SIZE)) question = req["question"] kb_ids = req["kb_id"] if isinstance(kb_ids, str): diff --git a/api/apps/restful_apis/chat_api.py b/api/apps/restful_apis/chat_api.py index a6cbee2e48..4eadcaf546 100644 --- a/api/apps/restful_apis/chat_api.py +++ b/api/apps/restful_apis/chat_api.py @@ -44,7 +44,7 @@ from api.utils.api_utils import ( server_error_response, validate_request, ) -from api.utils.pagination_utils import validate_rest_api_page_size +from api.utils.pagination_utils import validate_rest_api_page, validate_rest_api_page_size, DEFAULT_PAGE, DEFAULT_PAGE_SIZE from common.constants import LLMType, RetCode, StatusEnum from common import settings from common.misc_utils import get_uuid, thread_pool_exec @@ -464,15 +464,8 @@ async def list_chats(): try: # Invalid or negative pagination values fall back to defaults # instead of leaking internal conversion/SQL errors. - try: - page_number = max(int(request.args.get("page", 0)), 0) - except (TypeError, ValueError): - page_number = 0 - try: - parsed_page_size = int(request.args.get("page_size", 0)) - except (TypeError, ValueError): - parsed_page_size = 0 - items_per_page = validate_rest_api_page_size(parsed_page_size) + page_number = validate_rest_api_page(request.args.get("page", DEFAULT_PAGE)) + items_per_page = validate_rest_api_page_size(request.args.get("page_size", DEFAULT_PAGE_SIZE)) if owner_ids: chats, total = await thread_pool_exec( @@ -812,17 +805,8 @@ async def list_sessions(chat_id): ) # Invalid or negative pagination values fall back to defaults # instead of leaking internal conversion/SQL errors. - try: - page_number = int(request.args.get("page", 1)) - except (TypeError, ValueError): - page_number = 1 - if page_number < 1: - page_number = 1 - try: - parsed_page_size = int(request.args.get("page_size", 30)) - except (TypeError, ValueError): - parsed_page_size = 30 - items_per_page = validate_rest_api_page_size(parsed_page_size) + page_number = validate_rest_api_page(request.args.get("page", DEFAULT_PAGE)) + items_per_page = validate_rest_api_page_size(request.args.get("page_size", DEFAULT_PAGE_SIZE)) orderby = request.args.get("orderby", "create_time") if orderby not in ("create_time", "update_time", "name"): return get_json_result(code=RetCode.ARGUMENT_ERROR, message=f"invalid orderby field: {orderby}") diff --git a/api/apps/restful_apis/chunk_api.py b/api/apps/restful_apis/chunk_api.py index 5dd1ec33e9..049ed60e04 100644 --- a/api/apps/restful_apis/chunk_api.py +++ b/api/apps/restful_apis/chunk_api.py @@ -48,7 +48,7 @@ from api.utils.api_utils import ( get_result, server_error_response, ) -from api.utils.pagination_utils import validate_rest_api_page_size +from api.utils.pagination_utils import DEFAULT_PAGE, DEFAULT_PAGE_SIZE, validate_rest_api_page, validate_rest_api_page_size from api.utils.image_utils import store_chunk_image from api.utils.reference_metadata_utils import ( enrich_chunks_with_document_metadata, @@ -325,8 +325,8 @@ async def retrieval_test(tenant_id): return get_result(message="Datasets use different embedding models.", code=RetCode.DATA_ERROR) if "question" not in req: return get_error_data_result("`question` is required.") - page = int(req.get("page", 1)) - size = validate_rest_api_page_size(int(req.get("page_size", 30))) + page = validate_rest_api_page(req.get("page", DEFAULT_PAGE)) + size = validate_rest_api_page_size(req.get("page_size", DEFAULT_PAGE_SIZE)) question = req["question"].strip() if isinstance(req["question"], str) else req["question"] if not question: return get_result(data={"total": 0, "chunks": [], "doc_aggs": {}}) @@ -452,8 +452,8 @@ async def list_chunks(tenant_id, dataset_id, document_id): return get_error_data_result(message=f"you don't own the document {document_id}") doc = doc[0] req = request.args - page = int(req.get("page", 1)) - size = validate_rest_api_page_size(int(req.get("page_size", 30))) + page = validate_rest_api_page(req.get("page", DEFAULT_PAGE)) + size = validate_rest_api_page_size(req.get("page_size", DEFAULT_PAGE_SIZE)) question = req.get("keywords", "") chunk_ids = _get_query_id_list(req, "chunk_ids") query = { diff --git a/api/apps/restful_apis/compilation_template_group_api.py b/api/apps/restful_apis/compilation_template_group_api.py index 37f73b7247..18c9d83519 100644 --- a/api/apps/restful_apis/compilation_template_group_api.py +++ b/api/apps/restful_apis/compilation_template_group_api.py @@ -29,7 +29,7 @@ from api.utils.api_utils import ( server_error_response, validate_request, ) -from api.utils.pagination_utils import validate_rest_api_page_size +from api.utils.pagination_utils import DEFAULT_PAGE, DEFAULT_PAGE_SIZE, validate_rest_api_page, validate_rest_api_page_size _GROUP_NAME_MAX = 128 @@ -71,8 +71,8 @@ def _validate_group_payload(req: dict, require_all: bool = True) -> str: def list_groups() -> Response: keywords = request.args.get("keywords", "") scope = request.args.get("scope", "") - page_number = int(request.args.get("page", 0)) - items_per_page = validate_rest_api_page_size(int(request.args.get("page_size", 0))) + page_number = validate_rest_api_page(request.args.get("page", DEFAULT_PAGE)) + items_per_page = validate_rest_api_page_size(request.args.get("page_size", DEFAULT_PAGE_SIZE)) orderby = request.args.get("orderby", "create_time") desc = request.args.get("desc", "true").lower() != "false" diff --git a/api/apps/restful_apis/connector_api.py b/api/apps/restful_apis/connector_api.py index 1e54a306bb..7a86876fc6 100644 --- a/api/apps/restful_apis/connector_api.py +++ b/api/apps/restful_apis/connector_api.py @@ -27,7 +27,7 @@ from google_auth_oauthlib.flow import Flow from api.db import InputType from api.db.services.connector_service import ConnectorService, SyncLogsService from api.utils.api_utils import get_data_error_result, get_json_result, get_request_json, validate_request -from api.utils.pagination_utils import validate_rest_api_page_size +from api.utils.pagination_utils import DEFAULT_PAGE, DEFAULT_PAGE_SIZE, validate_rest_api_page, validate_rest_api_page_size from common.constants import RetCode, TaskStatus from common.data_source.config import GOOGLE_DRIVE_WEB_OAUTH_REDIRECT_URI, GMAIL_WEB_OAUTH_REDIRECT_URI, BOX_WEB_OAUTH_REDIRECT_URI, DocumentSource from common.data_source.google_util.constant import WEB_OAUTH_POPUP_TEMPLATE, GOOGLE_SCOPES @@ -143,8 +143,8 @@ def list_logs(connector_id): req = request.args.to_dict(flat=True) arr, total = SyncLogsService.list_sync_tasks( connector_id, - int(req.get("page", 1)), - validate_rest_api_page_size(int(req.get("page_size", 15))), + validate_rest_api_page(req.get("page", DEFAULT_PAGE)), + validate_rest_api_page_size(req.get("page_size", DEFAULT_PAGE_SIZE)), ) return get_json_result(data={"total": total, "logs": arr}) diff --git a/api/apps/restful_apis/dataset_api.py b/api/apps/restful_apis/dataset_api.py index d540958b63..f2b0dc0a48 100644 --- a/api/apps/restful_apis/dataset_api.py +++ b/api/apps/restful_apis/dataset_api.py @@ -20,7 +20,7 @@ from quart import request from common.constants import RetCode from api.apps import login_required, current_user from api.utils.api_utils import get_error_argument_result, get_error_data_result, get_json_result, get_result, add_tenant_id_to_kwargs -from api.utils.pagination_utils import validate_rest_api_page_size +from api.utils.pagination_utils import DEFAULT_PAGE, DEFAULT_PAGE_SIZE, validate_rest_api_page, validate_rest_api_page_size from api.utils.validation_utils import ( CreateDatasetReq, DeleteDatasetReq, @@ -609,10 +609,10 @@ async def list_wiki_pages(tenant_id, dataset_id): Success: {"code": 0, "data": {"total": int, "items": [{slug, title, page_type}]}} """ try: - page = int(request.args.get("page", 1) or 1) - page_size = int(request.args.get("page_size", 200) or 200) - except (TypeError, ValueError): - return get_error_argument_result("page and page_size must be integers") + page = validate_rest_api_page(request.args.get("page", DEFAULT_PAGE)) + page_size = validate_rest_api_page_size(request.args.get("page_size", DEFAULT_PAGE_SIZE)) + except ValueError as e: + return get_error_argument_result(str(e)) page_type = (request.args.get("page_type") or "").strip() or None topic = (request.args.get("topic") or "").strip() or None @@ -643,10 +643,10 @@ async def list_wiki_topics(tenant_id, dataset_id): Success: {"code": 0, "data": {"total": int, "items": [{topic, title, slug}]}} """ try: - page = int(request.args.get("page", 1) or 1) - page_size = int(request.args.get("page_size", 200) or 200) - except (TypeError, ValueError): - return get_error_argument_result("page and page_size must be integers") + page = validate_rest_api_page(request.args.get("page", DEFAULT_PAGE)) + page_size = validate_rest_api_page_size(request.args.get("page_size", DEFAULT_PAGE_SIZE)) + except ValueError as e: + return get_error_argument_result(str(e)) try: success, result = await dataset_api_service.list_wiki_topics( @@ -1221,8 +1221,8 @@ async def check_embedding(tenant_id, dataset_id): @add_tenant_id_to_kwargs def list_ingestion_logs(tenant_id, dataset_id): try: - page = int(request.args.get("page", 0)) - page_size = validate_rest_api_page_size(int(request.args.get("page_size", 0))) + page = validate_rest_api_page(request.args.get("page", DEFAULT_PAGE)) + page_size = validate_rest_api_page_size(request.args.get("page_size", DEFAULT_PAGE_SIZE)) orderby = request.args.get("orderby", "create_time") desc = request.args.get("desc", "true").lower() != "false" operation_status = request.args.getlist("operation_status") diff --git a/api/apps/restful_apis/document_api.py b/api/apps/restful_apis/document_api.py index 3b9b532698..71d1b48185 100644 --- a/api/apps/restful_apis/document_api.py +++ b/api/apps/restful_apis/document_api.py @@ -60,7 +60,7 @@ from api.utils.api_utils import ( get_error_argument_result, check_duplicate_ids, ) -from api.utils.pagination_utils import validate_rest_api_page_size +from api.utils.pagination_utils import DEFAULT_PAGE, DEFAULT_PAGE_SIZE, validate_rest_api_page, validate_rest_api_page_size from api.utils.validation_utils import ( UpdateDocumentReq, format_validation_error_message, @@ -862,19 +862,8 @@ def _get_docs_with_request(req, dataset_id: str): # Invalid or negative pagination values fall back to defaults # instead of leaking internal conversion/SQL errors. - try: - page = int(q.get("page", 1)) - except (TypeError, ValueError): - page = 1 - if page < 1: - page = 1 - try: - parsed_page_size = int(q.get("page_size", 30)) - except (TypeError, ValueError): - parsed_page_size = 30 - if parsed_page_size < 0: - parsed_page_size = 30 - page_size = validate_rest_api_page_size(parsed_page_size) + page = validate_rest_api_page(q.get("page", DEFAULT_PAGE)) + page_size = validate_rest_api_page_size(q.get("page_size", DEFAULT_PAGE_SIZE)) orderby = q.get("orderby", "create_time") if orderby not in ("create_time", "update_time", "name"): diff --git a/api/apps/restful_apis/file_commit_api.py b/api/apps/restful_apis/file_commit_api.py index 1882c8df5c..aaeb9522a4 100644 --- a/api/apps/restful_apis/file_commit_api.py +++ b/api/apps/restful_apis/file_commit_api.py @@ -19,6 +19,7 @@ from functools import wraps from quart import request from api.apps import login_required, current_user from api.utils.api_utils import get_json_result, get_data_error_result, get_request_json, server_error_response, validate_request +from api.utils.pagination_utils import DEFAULT_PAGE, DEFAULT_PAGE_SIZE, validate_rest_api_page, validate_rest_api_page_size from api.db.services.file_commit_service import FileCommitService from api.db.services.knowledgebase_service import KnowledgebaseService @@ -142,8 +143,8 @@ def _register_commit_routes(prefix, param_name, resolver_type=None): async def list_commits(entity_id): folder_id = _resolve(entity_id) try: - page = int(request.args.get("page", 1)) - page_size = int(request.args.get("page_size", 15)) + page = validate_rest_api_page(request.args.get("page", DEFAULT_PAGE)) + page_size = validate_rest_api_page_size(request.args.get("page_size", DEFAULT_PAGE_SIZE)) order_by = request.args.get("order_by", "create_time") desc = request.args.get("desc", "true").lower() != "false" slug = request.args.get("slug") or "" diff --git a/api/apps/restful_apis/mcp_api.py b/api/apps/restful_apis/mcp_api.py index 213923d2da..bb71ed21d9 100644 --- a/api/apps/restful_apis/mcp_api.py +++ b/api/apps/restful_apis/mcp_api.py @@ -21,7 +21,7 @@ from api.db.db_models import MCPServer from api.db.services.mcp_server_service import MCPServerService from api.db.services.user_service import TenantService from api.utils.api_utils import get_data_error_result, get_json_result, get_mcp_tools, get_request_json, server_error_response, validate_request -from api.utils.pagination_utils import validate_rest_api_page_size +from api.utils.pagination_utils import DEFAULT_PAGE, DEFAULT_PAGE_SIZE, validate_rest_api_page, validate_rest_api_page_size from api.utils.web_utils import get_float, safe_json_parse from common.constants import VALID_MCP_SERVER_TYPES from common.mcp_tool_call_conn import MCPToolCallSession, close_multiple_mcp_toolcall_sessions @@ -71,8 +71,8 @@ def _assert_mcp_url_is_safe(url, invalid_message: str = "Invalid url.") -> tuple @login_required async def list_mcp() -> Response: keywords = request.args.get("keywords", "") - page_number = int(request.args.get("page", 0)) - items_per_page = validate_rest_api_page_size(int(request.args.get("page_size", 0))) + page_number = validate_rest_api_page(request.args.get("page", DEFAULT_PAGE)) + items_per_page = validate_rest_api_page_size(request.args.get("page_size", DEFAULT_PAGE_SIZE)) orderby = request.args.get("orderby", "create_time") if request.args.get("desc", "true").lower() == "false": desc = False diff --git a/api/apps/restful_apis/memory_api.py b/api/apps/restful_apis/memory_api.py index e0b86cdf6f..dc59845572 100644 --- a/api/apps/restful_apis/memory_api.py +++ b/api/apps/restful_apis/memory_api.py @@ -24,7 +24,7 @@ from api.apps import login_required, current_user from api.utils.api_utils import validate_request, get_request_json, get_error_argument_result, get_json_result from api.apps.services import memory_api_service from api.db.joint_services.tenant_model_service import ensure_tenant_model_ids_for_params -from api.utils.pagination_utils import validate_rest_api_page_size +from api.utils.pagination_utils import DEFAULT_PAGE, DEFAULT_PAGE_SIZE, validate_rest_api_page, validate_rest_api_page_size @manager.route("/memories", methods=["POST"]) # noqa: F821 @@ -38,12 +38,7 @@ async def create_memory(): try: # Resolve tenant_model IDs from model names tenant_id = current_user.id - memory_info = { - "name": req["name"], - "memory_type": req["memory_type"], - "embd_id": req["embd_id"], - "llm_id": req["llm_id"] - } + memory_info = {"name": req["name"], "memory_type": req["memory_type"], "embd_id": req["embd_id"], "llm_id": req["llm_id"]} ensure_tenant_model_ids_for_params(tenant_id, memory_info) success, res = await memory_api_service.create_memory(memory_info) if timing_enabled: @@ -90,10 +85,26 @@ async def update_memory(memory_id): req = await get_request_json() # Resolve tenant_model IDs from model names when name is provided but id is not ensure_tenant_model_ids_for_params(current_user.id, req) - new_settings = {k: req[k] for k in [ - "name", "permissions", "llm_id", "embd_id", "memory_type", "memory_size", "forgetting_policy", "temperature", - "avatar", "description", "system_prompt", "user_prompt", "tenant_llm_id", "tenant_embd_id" - ] if k in req} + new_settings = { + k: req[k] + for k in [ + "name", + "permissions", + "llm_id", + "embd_id", + "memory_type", + "memory_size", + "forgetting_policy", + "temperature", + "avatar", + "description", + "system_prompt", + "user_prompt", + "tenant_llm_id", + "tenant_embd_id", + ] + if k in req + } try: success, res = await memory_api_service.update_memory(memory_id, new_settings) if success: @@ -130,8 +141,8 @@ async def delete_memory(memory_id): async def list_memory(): filter_params = {k: request.args.get(k) for k in ["memory_type", "tenant_id", "owner_ids", "storage_type"] if k in request.args} keywords = request.args.get("keywords") - page = int(request.args.get("page", 1)) - page_size = validate_rest_api_page_size(int(request.args.get("page_size", 50))) + page = validate_rest_api_page(request.args.get("page", DEFAULT_PAGE)) + page_size = validate_rest_api_page_size(request.args.get("page_size", DEFAULT_PAGE_SIZE)) try: res = await memory_api_service.list_memory(filter_params, keywords, page, page_size) return get_json_result(message=True, data=res) @@ -163,8 +174,8 @@ async def get_memory_messages(memory_id): agent_ids = agent_ids[0].split(",") keywords = args.get("keywords", "") keywords = keywords.strip() - page = int(args.get("page", 1)) - page_size = validate_rest_api_page_size(int(args.get("page_size", 50))) + page = validate_rest_api_page(args.get("page", 1)) + page_size = validate_rest_api_page_size(args.get("page_size", 50)) try: res = await memory_api_service.get_memory_messages(memory_id, agent_ids, keywords, page, page_size) return get_json_result(message=True, data=res) diff --git a/api/apps/restful_apis/search_api.py b/api/apps/restful_apis/search_api.py index 9cc9c8dd7d..ef85626aab 100644 --- a/api/apps/restful_apis/search_api.py +++ b/api/apps/restful_apis/search_api.py @@ -31,7 +31,7 @@ from api.db.services.user_service import TenantService, UserTenantService from common.misc_utils import get_uuid from common.constants import RetCode, StatusEnum from api.utils.api_utils import get_data_error_result, get_json_result, get_request_json, server_error_response, validate_request -from api.utils.pagination_utils import validate_rest_api_page_size +from api.utils.pagination_utils import DEFAULT_PAGE, DEFAULT_PAGE_SIZE, validate_rest_api_page, validate_rest_api_page_size def _full_text_weight(vector_similarity_weight): @@ -78,8 +78,8 @@ async def create(): @login_required def list_searches(): keywords = request.args.get("keywords", "") - page_number = int(request.args.get("page", 0)) - items_per_page = validate_rest_api_page_size(int(request.args.get("page_size", 0))) + page_number = validate_rest_api_page(request.args.get("page", DEFAULT_PAGE)) + items_per_page = validate_rest_api_page_size(request.args.get("page_size", DEFAULT_PAGE_SIZE)) orderby = request.args.get("orderby", "create_time") desc = request.args.get("desc", "true").lower() != "false" owner_ids = request.args.getlist("owner_ids") diff --git a/api/utils/pagination_utils.py b/api/utils/pagination_utils.py index 8f38eec63a..2edf5fd074 100644 --- a/api/utils/pagination_utils.py +++ b/api/utils/pagination_utils.py @@ -14,11 +14,30 @@ # limitations under the License. # +DEFAULT_PAGE = 1 +DEFAULT_PAGE_SIZE = 30 REST_API_MAX_PAGE_SIZE = 100 -def validate_rest_api_page_size(page_size: int) -> int: - """Validate REST API page_size values against the public maximum.""" - if page_size > REST_API_MAX_PAGE_SIZE: +def validate_rest_api_page(page) -> int: + """Validate page, if invalid, silent fallback to default page""" + try: + int_page = int(page) + except (TypeError, ValueError): + return DEFAULT_PAGE + if int_page < 1: + return DEFAULT_PAGE + return int_page + + +def validate_rest_api_page_size(page_size) -> int: + """Validate page_size, if invalid, silent fallback to default page_size, and validate it against the public maximum.""" + try: + int_page_size = int(page_size) + except (TypeError, ValueError): + return DEFAULT_PAGE_SIZE + if int_page_size < 1: + return DEFAULT_PAGE_SIZE + if int_page_size > REST_API_MAX_PAGE_SIZE: raise ValueError(f"page_size must be less than or equal to {REST_API_MAX_PAGE_SIZE}") - return page_size + return int_page_size diff --git a/test/testcases/restful_api/test_chats.py b/test/testcases/restful_api/test_chats.py index ad1c44dc1f..c4fad4d8da 100644 --- a/test/testcases/restful_api/test_chats.py +++ b/test/testcases/restful_api/test_chats.py @@ -947,7 +947,7 @@ def test_chat_session_list_projection_unit(monkeypatch): ), ) res = _run(module.list_sessions.__wrapped__("chat-1")) - assert res["data"] == [] + assert res["data"][0]["id"] == "session-1" @pytest.mark.p2 diff --git a/test/testcases/restful_api/test_chunks.py b/test/testcases/restful_api/test_chunks.py index 30d03ab000..f751c15ba2 100644 --- a/test/testcases/restful_api/test_chunks.py +++ b/test/testcases/restful_api/test_chunks.py @@ -600,19 +600,19 @@ def test_chunk_list_page_and_page_size_contract(rest_client, create_document): cases = [ ("page none", {"page": None, "page_size": 2}, 0, 2, ""), - ("page zero", {"page": 0, "page_size": 2}, 100, None, "ValueError('Search does not support negative slicing.')"), + ("page zero", {"page": 0, "page_size": 2}, 0, 2, ""), ("page two", {"page": 2, "page_size": 2}, 0, 2, ""), ("page three", {"page": 3, "page_size": 2}, 0, 1, ""), ("page string", {"page": "3", "page_size": 2}, 0, 1, ""), - ("page negative", {"page": -1, "page_size": 2}, 100, None, "ValueError('Search does not support negative slicing.')"), - ("page alpha", {"page": "a", "page_size": 2}, 100, None, "ValueError(\"invalid literal for int() with base 10: 'a'\")"), + ("page negative", {"page": -1, "page_size": 2}, 0, 2, ""), + ("page alpha", {"page": "a", "page_size": 2}, 0, 2, ""), ("page_size none", {"page_size": None}, 0, 5, ""), ("page_size zero", {"page_size": 0}, 0, 5, ""), ("page_size one", {"page_size": 1}, 0, 1, ""), ("page_size six", {"page_size": 6}, 0, 5, ""), ("page_size string", {"page_size": "1"}, 0, 1, ""), ("page_size negative", {"page_size": -1}, 0, 5, ""), - ("page_size alpha", {"page_size": "a"}, 100, None, "ValueError(\"invalid literal for int() with base 10: 'a'\")"), + ("page_size alpha", {"page_size": "a"}, 0, 5, ""), ] for scenario_name, params, expected_code, expected_total, expected_message in cases: diff --git a/test/testcases/restful_api/test_sessions.py b/test/testcases/restful_api/test_sessions.py index 728e961fb8..686b1437dc 100644 --- a/test/testcases/restful_api/test_sessions.py +++ b/test/testcases/restful_api/test_sessions.py @@ -423,7 +423,7 @@ def test_session_list_page_and_sort_contract(rest_client, create_chat): ("page negative", {"page": -1, "page_size": 2}, 0, 2, ""), ("page alpha", {"page": "a", "page_size": 2}, 0, 2, ""), ("page_size none", {"page_size": None}, 0, 5, ""), - ("page_size zero", {"page_size": 0}, 0, 0, ""), + ("page_size zero", {"page_size": 0}, 0, 0 if IS_GO_PROXY else 5, ""), ("page_size one", {"page_size": 1}, 0, 1, ""), ("page_size six", {"page_size": 6}, 0, 5, ""), ("page_size negative", {"page_size": -1}, 0, 5, ""), diff --git a/test/testcases/test_sdk_api/test_chat_assistant_management/test_list_chat_assistants.py b/test/testcases/test_sdk_api/test_chat_assistant_management/test_list_chat_assistants.py index 79fbf3b4b5..f13d72939f 100644 --- a/test/testcases/test_sdk_api/test_chat_assistant_management/test_list_chat_assistants.py +++ b/test/testcases/test_sdk_api/test_chat_assistant_management/test_list_chat_assistants.py @@ -29,7 +29,7 @@ class TestChatAssistantsList: @pytest.mark.parametrize( "params, expected_page_size, expected_message", [ - ({"page": 0, "page_size": 2}, 5, ""), + ({"page": 0, "page_size": 2}, 2, ""), ({"page": 2, "page_size": 2}, 2, ""), ({"page": 3, "page_size": 2}, 1, ""), ({"page": "3", "page_size": 2}, 0, "not instance of"), diff --git a/test/testcases/test_sdk_api/test_session_management/test_list_sessions_with_chat_assistant.py b/test/testcases/test_sdk_api/test_session_management/test_list_sessions_with_chat_assistant.py index 48743e4be7..21b6fea9f9 100644 --- a/test/testcases/test_sdk_api/test_session_management/test_list_sessions_with_chat_assistant.py +++ b/test/testcases/test_sdk_api/test_session_management/test_list_sessions_with_chat_assistant.py @@ -73,7 +73,7 @@ class TestSessionsWithChatAssistantList: "params, expected_page_size, expected_message", [ ({"page_size": None}, 0, "not instance of"), - ({"page_size": 0}, 0, ""), + ({"page_size": 0}, 5, ""), ({"page_size": 1}, 1, ""), ({"page_size": 6}, 5, ""), ({"page_size": "1"}, 0, "not instance of"),