From f592ee18749ab91118819f5377e73661d47889ab Mon Sep 17 00:00:00 2001 From: LawyZheng Date: Fri, 19 Dec 2025 02:16:44 +0800 Subject: [PATCH] bulk post action artifacts (#4327) --- skyvern/forge/agent.py | 30 +++++++++++++++++++++--------- 1 file changed, 21 insertions(+), 9 deletions(-) diff --git a/skyvern/forge/agent.py b/skyvern/forge/agent.py index 1ee8040e..fff5a6d4 100644 --- a/skyvern/forge/agent.py +++ b/skyvern/forge/agent.py @@ -79,6 +79,7 @@ from skyvern.forge.sdk.api.llm.config_registry import LLMConfigRegistry from skyvern.forge.sdk.api.llm.exceptions import LLM_PROVIDER_ERROR_RETRYABLE_TASK_TYPE, LLM_PROVIDER_ERROR_TYPE from skyvern.forge.sdk.api.llm.ui_tars_llm_caller import UITarsLLMCaller from skyvern.forge.sdk.api.llm.vertex_cache_manager import get_cache_manager +from skyvern.forge.sdk.artifact.manager import BulkArtifactCreationRequest from skyvern.forge.sdk.artifact.models import ArtifactType from skyvern.forge.sdk.core import skyvern_context from skyvern.forge.sdk.core.security import generate_skyvern_webhook_signature @@ -2211,6 +2212,7 @@ class ForgeAgent: if engine in CUA_ENGINES: scrolling_number = 0 + artifacts: list[BulkArtifactCreationRequest | None] = [] try: # get current x, y position of the page x: int | None = None @@ -2228,11 +2230,13 @@ class ForgeAgent: if skyvern_frame and x is not None and y is not None: await skyvern_frame.safe_scroll_to_x_y(x, y) LOG.debug("Scrolled back to the original x, y position of the page after taking screenshot", x=x, y=y) - await app.ARTIFACT_MANAGER.create_artifact( - step=step, - artifact_type=ArtifactType.SCREENSHOT_ACTION, - data=screenshot, - ) + artifacts.append( + await app.ARTIFACT_MANAGER.prepare_llm_artifact( + data=screenshot, + artifact_type=ArtifactType.SCREENSHOT_ACTION, + step=step, + ) + ) except Exception: LOG.error( "Failed to record screenshot after action", @@ -2242,14 +2246,22 @@ class ForgeAgent: try: skyvern_frame = await SkyvernFrame.create_instance(frame=working_page) html = await skyvern_frame.get_content() - await app.ARTIFACT_MANAGER.create_artifact( - step=step, - artifact_type=ArtifactType.HTML_ACTION, - data=html.encode(), + artifacts.append( + await app.ARTIFACT_MANAGER.prepare_llm_artifact( + data=html.encode(), + artifact_type=ArtifactType.HTML_ACTION, + step=step, + ) ) except Exception: LOG.exception("Failed to record html after action") + if artifacts: + try: + await app.ARTIFACT_MANAGER.bulk_create_artifacts(artifacts) + except Exception: + LOG.warning("Failed to bulk create artifacts after action", exc_info=True) + try: video_artifacts = await app.BROWSER_MANAGER.get_video_artifacts( task_id=task.task_id, browser_state=browser_state