From 8b0541af9faba66c0ba986597627d69f12947942 Mon Sep 17 00:00:00 2001 From: Suchintan Date: Thu, 2 Oct 2025 14:32:41 -0400 Subject: [PATCH] Fix bug with downloaded file getting their file path added, fix bug with azure blob path (#3592) Co-authored-by: Suchintan Singh --- skyvern/forge/agent.py | 3 ++- skyvern/forge/sdk/workflow/models/block.py | 22 +++++++++++++++++----- 2 files changed, 19 insertions(+), 6 deletions(-) diff --git a/skyvern/forge/agent.py b/skyvern/forge/agent.py index 1a5e9061..0a14268d 100644 --- a/skyvern/forge/agent.py +++ b/skyvern/forge/agent.py @@ -547,6 +547,7 @@ class ForgeAgent: final_file_name = f"download-{datetime.now().strftime('%Y%m%d%H%M%S%f')}-{random_file_id}" # Check if file with this name already exists + final_file_name = final_file_name target_path = os.path.join(workflow_download_directory, final_file_name + file_extension) counter = 1 while os.path.exists(target_path): @@ -555,7 +556,7 @@ class ForgeAgent: target_path = os.path.join(workflow_download_directory, final_file_name + file_extension) counter += 1 - rename_file(os.path.join(workflow_download_directory, file), target_path) + rename_file(os.path.join(workflow_download_directory, file), final_file_name + file_extension) LOG.info( "Task marked as completed due to download", diff --git a/skyvern/forge/sdk/workflow/models/block.py b/skyvern/forge/sdk/workflow/models/block.py index 8508af3f..d5927973 100644 --- a/skyvern/forge/sdk/workflow/models/block.py +++ b/skyvern/forge/sdk/workflow/models/block.py @@ -1983,13 +1983,24 @@ class FileUploadBlock(Block): def _get_s3_uri(self, workflow_run_id: str, path: str) -> str: folder_path = self.path or f"{workflow_run_id}" + # Remove trailing slash from folder_path to avoid double slashes + folder_path = folder_path.rstrip("/") + # Remove any empty path segments to avoid double slashes + folder_path = "/".join(segment for segment in folder_path.split("/") if segment) s3_suffix = f"{uuid.uuid4()}_{Path(path).name}" return f"s3://{self.s3_bucket}/{folder_path}/{s3_suffix}" - def _get_azure_blob_uri(self, workflow_run_id: str, file_path: str) -> str: - blob_name = Path(file_path).name + def _get_azure_blob_name(self, workflow_run_id: str, file_path: str) -> str: + blob_name = f"{uuid.uuid4()}_{Path(file_path).name}" folder_path = self.path or workflow_run_id - return f"https://{self.azure_storage_account_name}.blob.core.windows.net/{self.azure_blob_container_name}/{folder_path}/{uuid.uuid4()}_{blob_name}" + # Remove trailing slash from folder_path to avoid double slashes + folder_path = folder_path.rstrip("/") + # Remove any empty path segments to avoid double slashes + folder_path = "/".join(segment for segment in folder_path.split("/") if segment) + return folder_path + "/" + blob_name + + def _get_azure_blob_uri(self, workflow_run_id: str, blob_name: str) -> str: + return f"https://{self.azure_storage_account_name}.blob.core.windows.net/{self.azure_blob_container_name}/{blob_name}" async def execute( self, @@ -2115,8 +2126,9 @@ class FileUploadBlock(Block): storage_account_key=actual_azure_storage_account_key, ) for file_path in files_to_upload: - blob_name = Path(file_path).name - azure_uri = self._get_azure_blob_uri(workflow_run_id, file_path) + LOG.info("FileUploadBlock: Uploading file to Azure Blob Storage", file_path=file_path) + blob_name = self._get_azure_blob_name(workflow_run_id, file_path) + azure_uri = self._get_azure_blob_uri(workflow_run_id, blob_name) uploaded_uris.append(azure_uri) await azure_client.upload_file_from_path( container_name=self.azure_blob_container_name or "", blob_name=blob_name, file_path=file_path