From 7e73a55046da0dcfbe50051af8cbe4f8d64ff9be Mon Sep 17 00:00:00 2001 From: LawyZheng Date: Mon, 22 Sep 2025 14:41:59 +0800 Subject: [PATCH] sort pbs downloaded files (#3496) --- skyvern/forge/sdk/artifact/storage/s3.py | 10 +++++++++- skyvern/forge/sdk/schemas/files.py | 3 +++ skyvern/webeye/schemas.py | 3 +++ 3 files changed, 15 insertions(+), 1 deletion(-) diff --git a/skyvern/forge/sdk/artifact/storage/s3.py b/skyvern/forge/sdk/artifact/storage/s3.py index 8c705000..2ee9b39d 100644 --- a/skyvern/forge/sdk/artifact/storage/s3.py +++ b/skyvern/forge/sdk/artifact/storage/s3.py @@ -212,8 +212,15 @@ class S3Storage(BaseStorage): file_infos: list[FileInfo] = [] for key in object_keys: + metadata = {} + modified_at: datetime | None = None # Get metadata (including checksum) - metadata = await self.async_client.get_file_metadata(key, log_exception=False) + try: + object_info = await self.async_client.get_object_info(key) + metadata = object_info.get("Metadata", {}) + modified_at = object_info.get("LastModified") + except Exception: + LOG.exception("Object info retrieval failed", uri=key) # Create FileInfo object filename = os.path.basename(key) @@ -228,6 +235,7 @@ class S3Storage(BaseStorage): url=presigned_urls[0], checksum=checksum, filename=metadata.get("original_filename", filename) if metadata else filename, + modified_at=modified_at, ) file_infos.append(file_info) diff --git a/skyvern/forge/sdk/schemas/files.py b/skyvern/forge/sdk/schemas/files.py index 03ccae79..eaf96946 100644 --- a/skyvern/forge/sdk/schemas/files.py +++ b/skyvern/forge/sdk/schemas/files.py @@ -1,3 +1,5 @@ +from datetime import datetime + from pydantic import BaseModel, Field @@ -7,3 +9,4 @@ class FileInfo(BaseModel): url: str = Field(..., description="URL to access the file") checksum: str | None = Field(None, description="SHA-256 checksum of the file") filename: str | None = Field(None, description="Original filename") + modified_at: datetime | None = Field(None, description="Modified time of the file") diff --git a/skyvern/webeye/schemas.py b/skyvern/webeye/schemas.py index d4a1449c..faec6a4c 100644 --- a/skyvern/webeye/schemas.py +++ b/skyvern/webeye/schemas.py @@ -91,6 +91,9 @@ class BrowserSessionResponse(BaseModel): "Timeout getting downloaded files", browser_session_id=browser_session.persistent_browser_session_id ) + # Sort downloaded files by modified_at in descending order (newest first) + downloaded_files.sort(key=lambda x: x.modified_at or datetime.min, reverse=True) + return cls( browser_session_id=browser_session.persistent_browser_session_id, organization_id=browser_session.organization_id,