Refactor: consolidate page and page_size (#17597)

This commit is contained in:
Wang Qi
2026-07-31 14:08:44 +08:00
committed by GitHub
parent 67f027c306
commit 4b619f699b
18 changed files with 104 additions and 99 deletions

View File

@@ -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)

View File

@@ -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):

View File

@@ -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}")

View File

@@ -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 = {

View File

@@ -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"

View File

@@ -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})

View File

@@ -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")

View File

@@ -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"):

View File

@@ -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 ""

View File

@@ -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

View File

@@ -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)

View File

@@ -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")